Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
cc51d12
feat!: use guarded Git commands for repository storage
codex Oct 1, 2026
427dc41
ci: build supported Git for Cygwin tests
codex Oct 1, 2026
c935506
test: handle symlinked Git directories in refresh checks
codex Oct 1, 2026
2df22e8
fix: preserve repository and object paths across platforms
codex Oct 1, 2026
ea767d5
test: cover Cygwin index filename restrictions
codex Oct 1, 2026
f954793
test: preserve hidden gitfiles when preparing submodule aliases
codex Oct 1, 2026
7453896
test: clean up read-only submodule object files on Windows
codex Oct 1, 2026
7ff0a87
fix(submodule): close repositories owned by update operations
codex Oct 1, 2026
889f213
ci: install supported Git in the normal Cygwin layout
codex Oct 1, 2026
bf27f8b
test(downstream): run released Bandit baseline tests against this che…
codex Oct 1, 2026
24c3ca4
test(downstream): validate the latest MLflow Git integration
codex Oct 1, 2026
25cefa9
test(downstream): exercise released LangChain GitLoader integration
codex Oct 1, 2026
e0171d8
test(downstream): cover SWE-bench cloning across Git storage formats
codex Oct 1, 2026
bdd6be4
test(downstream): run DataHub Git integration for its latest release
codex Oct 1, 2026
6a9cb4f
feat(gix): select the released backend through an installation extra
codex Oct 1, 2026
22f2ca9
feat(gix): read object headers with native lookup
codex Oct 1, 2026
3b8015f
feat(gix): stream small objects from native storage
codex Oct 1, 2026
b60c3e7
feat(gix): resolve revisions and repository metadata natively
codex Oct 1, 2026
c43175a
feat(gix): enumerate tree entries natively
codex Oct 1, 2026
1af0f6f
feat(gix): resolve symbolic reference targets natively
codex Oct 1, 2026
36c9af1
feat(gix): enumerate reference names natively
codex Oct 1, 2026
2afb498
feat(gix): query merged repository configuration natively
codex Oct 1, 2026
5b60175
feat(gix): list worktree metadata natively
codex Oct 1, 2026
cb0c391
feat(gix): find merge bases and test ancestry natively
codex Oct 1, 2026
908183e
feat(gix): count reachable commits natively
codex Oct 1, 2026
2f44fc4
feat(gix): iterate first-parent commit history natively
codex Oct 1, 2026
d375802
feat(gix): read index entries natively
codex Oct 1, 2026
3aa19b5
feat(gix): query the index version natively
codex Oct 1, 2026
cfb7543
feat(gix): hash and store objects natively
codex Oct 1, 2026
e23e20a
feat(gix): write index trees with the native editor
codex Oct 1, 2026
9fbdb4f
feat(gix): serialize trees with native object storage
codex Oct 1, 2026
fbd48eb
feat(gix): initialize private indexes from trees natively
codex Oct 1, 2026
2444ec7
feat(gix): persist index edits through native snapshots
codex Oct 1, 2026
fb17ed1
feat(gix): create unsigned UTF-8 commits natively
codex Oct 1, 2026
bab4aaa
feat(gix): read reference logs natively
codex Oct 1, 2026
57a4c79
feat(gix): resolve committer identity natively
codex Oct 1, 2026
6c69dec
feat(gix): update supported reference targets natively
codex Oct 1, 2026
e53abf3
feat(gix): compute raw tree diffs natively
codex Oct 1, 2026
2ea09f8
feat(gix): compute commit statistics natively
codex Oct 1, 2026
8a4ba4f
feat(gix): discover untracked files natively
codex Oct 1, 2026
9d62798
feat(gix): check ignored paths natively
codex Oct 1, 2026
7357193
feat(gix): check repository dirtiness natively
codex Oct 1, 2026
d67b46c
build(gix): preserve the extra in local source distributions
codex Oct 1, 2026
dc3d65f
fix(gix): omit dangling symbolic references from enumeration
codex Oct 1, 2026
9b1dd6f
fix(gix): defer compatibility object formats to Git
codex Oct 1, 2026
6d7490d
docs(gix): document release setup and native conversion gaps
codex Oct 1, 2026
64e7256
test: avoid repository setup for actor and exception tests
codex Oct 6, 2026
968b883
test: prepare historical dependency sources once on demand
codex Oct 6, 2026
d72ffb3
test: copy prepared submodule baselines for each case
codex Oct 6, 2026
a467e99
test: reuse prepared submodule rejection layouts
codex Oct 6, 2026
75ba2c3
test: reuse a prepared revision graph with isolated copies
codex Oct 6, 2026
f0ee0d3
test: read historical trees without cloning a checkout
codex Oct 6, 2026
14e0c11
test: copy prepared no-fetch source and submodule repositories
codex Oct 6, 2026
2da7cd1
docs: record fixture optimization validation and suite timings
codex Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
test(downstream): run DataHub Git integration for its latest release
Complete the five-current-user compatibility matrix with `acryl-datahub`.
Resolve the latest PyPI release and retrieve its tag from `acryldata/datahub`,
which publishes patch tags missing from the repository named by package
metadata. Run the unchanged Git integration file against the installed
release and this editable GitPython checkout.

Exclude unrelated SQL/docker conftests, disable telemetry, and clear the
private SSH test credential variable. The selected tests still exercise a
real public GitLab clone and fixed-commit checkout, a localhost SSH timeout,
GitCommandError handling, password redaction, and source configuration.
The upstream private-clone test retains its credential-dependent skip.

Document all five current users and their September 2026 download ranking,
including optional runtime integrations, distribution deduplication, and
projects whose latest releases dropped GitPython. Add an all-project local
command and the fifth CI matrix entry.

The shared runner passes 7 tests with 1 upstream skip for DataHub 1.7.0.14
on Python 3.12 and Git 2.54. All five profiles have now passed locally,
with 68 upstream passes plus 4 SWE-bench supplemental cases. Ruff, Python
syntax, workflow YAML/matrix consistency, Bash syntax, ShellCheck, and
whitespace checks pass. No GitPython compatibility fixes were required.

Also clear inherited pytest options and plugins: a caller's `-k` filter
could otherwise leave only unrelated contract tests and yield a misleading
pass. All four SWE-bench cases still pass with a deliberately nonmatching
inherited filter and a nonexistent plugin, verifying their removal.
  • Loading branch information
codex authored and Byron committed Oct 6, 2026
commit bdd6be46186803e8b97a9a1fbc733e407cca553e
2 changes: 1 addition & 1 deletion .github/workflows/downstream.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
strategy:
fail-fast: false
matrix:
project: [langchain, mlflow, bandit, swebench]
project: [langchain, mlflow, bandit, swebench, datahub]
steps:
- uses: actions/checkout@v7
with:
Expand Down
24 changes: 21 additions & 3 deletions test/downstream/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ Run released projects' GitPython-related tests against this checkout with
```sh
uv run test/downstream/run.py bandit
uv run test/downstream/run.py bandit --version 1.9.4
for project in langchain mlflow bandit swebench datahub; do
uv run test/downstream/run.py "$project"
done
```

The default resolves the latest release from PyPI each time. `--version` reproduces
Expand All @@ -19,8 +22,9 @@ elsewhere. Delete retained directories when no longer needed. PyPI source archiv
are verified against their published SHA-256 digest and extracted with Python's
safe data filter. Each run uses a private Git configuration, including an identity
and the `master` initial branch expected by upstream fixtures. Inherited Git
settings and Python import paths are cleared before setup and testing. Select a
different Git executable by putting its directory first on `PATH`.
settings, pytest options/plugins, and Python import paths are cleared before
setup and testing. Select a different Git executable by putting its directory
first on `PATH`.

## Selection and coverage

Expand All @@ -34,12 +38,16 @@ and test-only dependencies are excluded. Downloads are not unique installations.
| MLflow (`mlflow-skinny`) | 25,850,354 | 3.16.1 | 47 upstream tests: 31 repository/project/model-versioning cases plus 16 Git context and credential-redaction contract cases |
| Bandit | 24,935,372 | 1.9.4 | 12 upstream baseline CLI tests: real repository creation, commits, branches, resets, discovery, and dirty state |
| SWE-bench | 22,942,741 | 5.0.2 | 4 supplemental integration cases for `AutoContextManager`; no upstream tests cover its GitPython callers |
| DataHub (`acryl-datahub`) | 5,019,402 | 1.7.0.14 | 7 upstream tests passed, 1 credential-dependent skip: public clone/checkout, SSH timeout, exception/redaction contracts, and configuration |

Source: [top-pypi-packages](https://hugovk.github.io/top-pypi-packages/top-pypi-packages.min.json),
snapshot updated **2026-10-01 12:40:51 UTC**. Its
[ClickHouse query](https://github.com/hugovk/top-pypi-packages/blob/main/top-pypi-clickhouse.py)
[ClickHouse query](https://github.com/hugovk/top-pypi-packages/blob/main/clickhouse.py)
covers the previous calendar month. Current metadata for the top 5,000
distributions was checked, together with known runtime integrations.
Streamlit and W&B are excluded because their latest releases removed GitPython.
The next eligible declared consumer is `dlt` (5,002,981 downloads); LangChain's
current runtime integration places it in the selected five instead.

LangChain Community's published `GitLoader` integration uses GitPython at runtime
and asks users to install it manually. It qualifies as a current user even though
Expand Down Expand Up @@ -76,6 +84,16 @@ The supplemental filename is intentionally excluded from GitPython's normal test
collection; the runner selects it explicitly with importlib mode to avoid
shadowing the upstream `swebench` package.

DataHub uses GitPython in its `looker`, `lookml`, and `odcs` runtime extras.
Patch-release tags come from `acryldata/datahub`, although its package metadata
links to a different repository. The Git integration file runs without unrelated
SQL/docker conftests; telemetry is disabled explicitly. It clones a public GitLab
fixture and checks out a fixed commit, exercises a real localhost SSH timeout,
and checks exception handling, password redaction, and URL/branch configuration.
The private SSH-clone test retains its upstream skip: the runner removes its
credential variable and needs no private credentials. `ssh`, public GitLab
access, and local TCP sockets are needed for the selected tests.

CI runs the same command against the latest release and fails when no test passes,
including when all selected tests are skipped. Test dependency ranges only supply
the upstream test harness; they do not pin the dependent's release.
12 changes: 12 additions & 0 deletions test/downstream/projects.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,17 @@
"no_deps": ["{source}"],
"pytest_args": ["--confcutdir={checks}", "--import-mode=importlib"],
"tests": ["{checks}/swebench.py"]
},
"datahub": {
"distribution": "acryl-datahub",
"source": "git",
"repository": "https://github.com/acryldata/datahub.git",
"tag": "v{version}",
"cwd": "metadata-ingestion",
"install": ["acryl-datahub=={version}", "pytest"],
"unset_env": ["DATAHUB_LOOKML_GIT_TEST_SSH_KEY"],
"env": {"DATAHUB_TELEMETRY_ENABLED": "false"},
"pytest_args": ["--confcutdir=tests/integration/git"],
"tests": ["tests/integration/git/test_git_clone.py"]
}
}
3 changes: 2 additions & 1 deletion test/downstream/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,8 @@ def main():
)
# Do not let inherited Git settings redirect upstream resets or commits into
# the caller's repository, index, object database, configuration, or hooks.
env = {key: value for key, value in os.environ.items() if not key.startswith("GIT_")}
# Inherited pytest options/plugins must not replace the selected coverage.
env = {key: value for key, value in os.environ.items() if not key.startswith(("GIT_", "PYTEST_"))}
env.pop("PYTHONPATH", None)
env.pop("PYTHONHOME", None)
env.update(GIT_CONFIG_GLOBAL=str(config), GIT_CONFIG_NOSYSTEM="1", GIT_TERMINAL_PROMPT="0")
Expand Down