List files

        :param files: Perforce file spec
        :type files: list
        :param silent: Will not raise error for invalid files or files not under the client
        :type silent: bool
        :param exclude_deleted: Exclude deleted files from the query
        :type exclude_deleted: bool
        :raises: :class:`.errors.RevisionError`
        :returns: list<:class:`.Revision`>

def ls(self, files, silent=True, exclude_deleted=False):
        """List files

        :param files: Perforce file spec
        :type files: list
        :param silent: Will not raise error for invalid files or files not under the client
        :type silent: bool
        :param exclude_deleted: Exclude deleted files from the query
        :type exclude_deleted: bool
        :raises: :class:`.errors.RevisionError`
        :returns: list<:class:`.Revision`>
        """
        try:
            cmd = ['fstat']
            if exclude_deleted:
                cmd += ['-F', '^headAction=delete ^headAction=move/delete']

            cmd += files

            results = self.run(cmd)
        except errors.CommandError as err:
            if silent:
                results = []
            elif "is not under client's root" in str(err):
                raise errors.RevisionError(err.args[0])
            else:
                raise

        return [Revision(r, self) for r in results if r.get('code') != 'error']