# This module is part of GitPython and is released under the # 3-Clause BSD License: https://opensource.org/license/bsd-3-clause/ """Verify that the source repository is usable by git.""" import subprocess from pathlib import Path import pytest REPO_ROOT = Path(__file__).resolve().parent.parent FIXTURE_DIRS = [pytest.param(REPO_ROOT, id="repo_root")] def test_source_tree_has_no_gitlinks() -> None: """All formerly external dependencies are regular monorepo directories.""" if not (REPO_ROOT / ".git").exists(): pytest.skip(f"{REPO_ROOT} is not a git checkout") try: result = subprocess.run( ["git", "ls-files", "--stage"], cwd=REPO_ROOT, capture_output=True, text=True, check=True, ) except FileNotFoundError: pytest.skip("git is not installed or not on PATH") gitlinks = [line for line in result.stdout.splitlines() if line.startswith("160000 ")] assert not gitlinks, "Unexpected submodules:\n" + "\n".join(gitlinks) @pytest.mark.parametrize("fixture_dir", FIXTURE_DIRS) def test_fixture_dir_is_trusted_by_git(fixture_dir: Path) -> None: """git accepts ``fixture_dir`` as its own repository owned by a trusted user. Run ``git -C rev-parse --show-toplevel`` and assert it succeeds and reports ``fixture_dir`` itself as the toplevel. Failure typically means the directory's on-disk ownership doesn't match the running user and the CI workflow's ``safe.directory`` list is missing an entry that would override the check. """ if not (fixture_dir / ".git").exists(): pytest.skip(f"{fixture_dir} is not a git checkout") try: result = subprocess.run( ["git", "-C", str(fixture_dir), "rev-parse", "--show-toplevel"], capture_output=True, text=True, check=False, ) except FileNotFoundError: pytest.skip("git is not installed or not on PATH") assert result.returncode == 0, ( f"git refuses to operate in {fixture_dir}.\n" f"stderr: {result.stderr.strip()}\n" "The directory's owner doesn't match the running user and no " "`safe.directory` entry overrides the check. On CI, the " "workflow's `safe.directory` list typically needs an entry for " "this path. Locally, this is unexpected and usually indicates " "an ownership problem worth investigating." ) reported = Path(result.stdout.strip()) assert reported.samefile(fixture_dir), ( f"git reports the toplevel as {reported}, " f"not as {fixture_dir} itself. " "This usually means the directory is not an initialized git " "repository (its `.git` marker may be stale or pointing elsewhere)." )