List directory or file

        :param rev: The revision to use.
        :param path: The path to list. May start with a '/' or not. Directories
                     may end with a '/' or not.
        :param recursive: Recursively list files in subdirectories.
        :param recursive_dirs: Used when recursive=True, also list directories.
        :param directory: If path is a directory, list path itself instead of
                          its contents.
        :param report: A list or tuple of extra attributes to return that may
                       require extra processing. Recognized values are 'size',
                       'target', 'executable', and 'commit'.

        Returns a list of dictionaries with the following keys:

        **type**
            The type of the file: 'f' for file, 'd' for directory, 'l' for
            symlink.
        **name**
            The name of the file. Not present if directory=True.
        **size**
            The size of the file. Only present for files when 'size' is in
            report.
        **target**
            The target of the symlink. Only present for symlinks when
            'target' is in report.
        **executable**
            True if the file is executable, False otherwise.    Only present
            for files when 'executable' is in report.

        Raises PathDoesNotExist if the path does not exist.

def ls(
        self, rev, path, recursive=False, recursive_dirs=False,
        directory=False, report=()
    ):
        """List directory or file

        :param rev: The revision to use.
        :param path: The path to list. May start with a '/' or not. Directories
                     may end with a '/' or not.
        :param recursive: Recursively list files in subdirectories.
        :param recursive_dirs: Used when recursive=True, also list directories.
        :param directory: If path is a directory, list path itself instead of
                          its contents.
        :param report: A list or tuple of extra attributes to return that may
                       require extra processing. Recognized values are 'size',
                       'target', 'executable', and 'commit'.

        Returns a list of dictionaries with the following keys:

        **type**
            The type of the file: 'f' for file, 'd' for directory, 'l' for
            symlink.
        **name**
            The name of the file. Not present if directory=True.
        **size**
            The size of the file. Only present for files when 'size' is in
            report.
        **target**
            The target of the symlink. Only present for symlinks when
            'target' is in report.
        **executable**
            True if the file is executable, False otherwise.    Only present
            for files when 'executable' is in report.

        Raises PathDoesNotExist if the path does not exist.

        """
        raise NotImplementedError