From 549f462a8ddf56d920dbad63636a5fcea53980c1 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Sun, 29 Nov 2020 22:32:37 +0100 Subject: [PATCH] fix #352: add a envvar to ignore scm roots --- CHANGELOG.rst | 1 + README.rst | 5 +++++ src/setuptools_scm/file_finder.py | 14 ++++++++++++++ src/setuptools_scm/file_finder_git.py | 3 ++- src/setuptools_scm/file_finder_hg.py | 3 ++- testing/test_file_finder.py | 6 ++++++ 6 files changed, 30 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c376a551..34f923e9 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,7 @@ v4.2.0 ====== +* fix #352: add support for generally ignoring specific vcs roots * fix #471: better error for version bump failing on complex but accepted tag * fix #479: raise indicative error when tags carry non-parsable information * Add `no-guess-dev` which does no next version guessing, just adds `.post1.devN` in diff --git a/README.rst b/README.rst index a3183327..d4b2453e 100644 --- a/README.rst +++ b/README.rst @@ -446,6 +446,11 @@ Environment variables derived, otherwise the current time is used (https://reproducible-builds.org/docs/source-date-epoch/) + +:SETUPTOOLS_SCM_IGNORE_VCS_ROOTS: + when defined, a ``os.pathsep`` separated list + of directory names to ignore for root finding + Extending setuptools_scm ------------------------ diff --git a/src/setuptools_scm/file_finder.py b/src/setuptools_scm/file_finder.py index 77ec1463..5b851179 100644 --- a/src/setuptools_scm/file_finder.py +++ b/src/setuptools_scm/file_finder.py @@ -1,4 +1,5 @@ import os +from .utils import trace def scm_find_files(path, scm_files, scm_dirs): @@ -53,3 +54,16 @@ def _link_not_in_scm(n): res.append(os.path.join(path, os.path.relpath(fullfilename, realpath))) seen.add(realdirpath) return res + + +def is_toplevel_acceptable(toplevel): + "" + if toplevel is None: + return False + + ignored = os.environ.get("SETUPTOOLS_SCM_IGNORE_VCS_ROOTS", "").split(os.pathsep) + ignored = [os.path.normcase(p) for p in ignored] + + trace(toplevel, ignored) + + return toplevel not in ignored diff --git a/src/setuptools_scm/file_finder_git.py b/src/setuptools_scm/file_finder_git.py index 9aa6245d..1d3e69be 100644 --- a/src/setuptools_scm/file_finder_git.py +++ b/src/setuptools_scm/file_finder_git.py @@ -3,6 +3,7 @@ import tarfile import logging from .file_finder import scm_find_files +from .file_finder import is_toplevel_acceptable from .utils import trace log = logging.getLogger(__name__) @@ -60,7 +61,7 @@ def _git_ls_files_and_dirs(toplevel): def git_find_files(path=""): toplevel = _git_toplevel(path) - if not toplevel: + if not is_toplevel_acceptable(toplevel): return [] fullpath = os.path.abspath(os.path.normpath(path)) if not fullpath.startswith(toplevel): diff --git a/src/setuptools_scm/file_finder_hg.py b/src/setuptools_scm/file_finder_hg.py index 2aa1e162..816560dc 100644 --- a/src/setuptools_scm/file_finder_hg.py +++ b/src/setuptools_scm/file_finder_hg.py @@ -2,6 +2,7 @@ import subprocess from .file_finder import scm_find_files +from .file_finder import is_toplevel_acceptable def _hg_toplevel(path): @@ -41,7 +42,7 @@ def _hg_ls_files_and_dirs(toplevel): def hg_find_files(path=""): toplevel = _hg_toplevel(path) - if not toplevel: + if not is_toplevel_acceptable(toplevel): return [] hg_files, hg_dirs = _hg_ls_files_and_dirs(toplevel) return scm_find_files(path, hg_files, hg_dirs) diff --git a/testing/test_file_finder.py b/testing/test_file_finder.py index 463d3d4f..55b9cea7 100644 --- a/testing/test_file_finder.py +++ b/testing/test_file_finder.py @@ -126,6 +126,12 @@ def test_symlink_file_out_of_git(inwd): assert set(find_files("adir")) == _sep({"adir/filea"}) +@pytest.mark.parametrize("path_add", ["{cwd}", "{cwd}" + os.pathsep + "broken"]) +def test_ignore_root(inwd, monkeypatch, path_add): + monkeypatch.setenv("SETUPTOOLS_SCM_IGNORE_VCS_ROOTS", path_add.format(cwd=inwd.cwd)) + assert find_files() == [] + + def test_empty_root(inwd): subdir = inwd.cwd / "cdir" / "subdir" subdir.mkdir(parents=True)