summaryrefslogtreecommitdiff
path: root/src/setuptools_scm/file_finder_hg.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/setuptools_scm/file_finder_hg.py')
-rw-r--r--src/setuptools_scm/file_finder_hg.py23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/setuptools_scm/file_finder_hg.py b/src/setuptools_scm/file_finder_hg.py
index 4f5e3ec..2ce974f 100644
--- a/src/setuptools_scm/file_finder_hg.py
+++ b/src/setuptools_scm/file_finder_hg.py
@@ -2,10 +2,16 @@ from __future__ import annotations
import os
import subprocess
+from typing import TYPE_CHECKING
from .file_finder import is_toplevel_acceptable
from .file_finder import scm_find_files
+from .utils import data_from_mime
from .utils import do_ex
+from .utils import trace
+
+if TYPE_CHECKING:
+ from . import _types as _t
def _hg_toplevel(path: str) -> str | None:
@@ -49,3 +55,20 @@ def hg_find_files(path: str = "") -> list[str]:
assert toplevel is not None
hg_files, hg_dirs = _hg_ls_files_and_dirs(toplevel)
return scm_find_files(path, hg_files, hg_dirs)
+
+
+def hg_archive_find_files(path: _t.PathT = "") -> list[str]:
+ # This function assumes that ``path`` is obtained from a mercurial archive
+ # and therefore all the files that should be ignored were already removed.
+ archival = os.path.join(path, ".hg_archival.txt")
+ if not os.path.exists(archival):
+ return []
+
+ data = data_from_mime(archival)
+
+ if "node" not in data:
+ # Ensure file is valid
+ return []
+
+ trace("hg archive detected - fallback to listing all files")
+ return scm_find_files(path, set(), set(), force_all_files=True)