@@ -69,7 +69,7 @@ def base_rev(self) -> str:
6969
7070 @property
7171 @abstractmethod
72- def branch (self ) -> str | None :
72+ def branch (self ) -> Optional [ str ] :
7373 """Current branch or bookmark the checkout has active."""
7474
7575 @property
@@ -125,6 +125,15 @@ def get_url(self, remote: Optional[str]) -> str:
125125 def get_commit_message (self , revision : Optional [str ]) -> str :
126126 """Commit message of specified revision or current commit."""
127127
128+ @abstractmethod
129+ def get_tracked_files (self , * paths : str , rev : Optional [str ] = None ) -> List [str ]:
130+ """Return list of tracked files.
131+
132+ ``*paths`` are path specifiers to limit results to.
133+ ``rev`` is a revision specifier at which to retrieve the files.
134+ Defaults to the parent of the working copy if unspecified.
135+ """
136+
128137 @abstractmethod
129138 def get_changed_files (
130139 self ,
@@ -280,6 +289,10 @@ def _files_template(self, diff_filter):
280289 template += "{file_mods % '{file}\\ n'}"
281290 return template
282291
292+ def get_tracked_files (self , * paths , rev = None ):
293+ rev = rev or "."
294+ return self .run ("files" , "-r" , rev , * paths ).splitlines ()
295+
283296 def get_changed_files (self , diff_filter = None , mode = None , rev = None , base_rev = None ):
284297 diff_filter = diff_filter or "ADM"
285298 if rev is None :
@@ -462,6 +475,10 @@ def get_commit_message(self, revision=None):
462475 revision = revision or "HEAD"
463476 return self .run ("log" , "-n1" , "--format=%B" , revision )
464477
478+ def get_tracked_files (self , * paths , rev = None ):
479+ rev = rev or "HEAD"
480+ return self .run ("ls-tree" , "-r" , "--name-only" , rev , * paths ).splitlines ()
481+
465482 def get_changed_files (self , diff_filter = None , mode = None , rev = None , base_rev = None ):
466483 diff_filter = diff_filter or "ADM"
467484 mode = mode or "unstaged"
0 commit comments