Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
9c3d676
feat!: use guarded Git commands for repository storage
codex Oct 1, 2026
e574871
ci: build supported Git for Cygwin tests
codex Oct 1, 2026
ff147e1
test: handle symlinked Git directories in refresh checks
codex Oct 1, 2026
f868c17
fix: preserve repository and object paths across platforms
codex Oct 1, 2026
491fabf
test: cover Cygwin index filename restrictions
codex Oct 1, 2026
ef697f4
test: preserve hidden gitfiles when preparing submodule aliases
codex Oct 1, 2026
0e62436
test: clean up read-only submodule object files on Windows
codex Oct 1, 2026
bde49c0
fix(submodule): close repositories owned by update operations
codex Oct 1, 2026
30d469c
ci: install supported Git in the normal Cygwin layout
codex Oct 1, 2026
a549077
test(downstream): run released Bandit baseline tests against this che…
codex Oct 1, 2026
fb06e81
test(downstream): validate the latest MLflow Git integration
codex Oct 1, 2026
638a03d
test(downstream): exercise released LangChain GitLoader integration
codex Oct 1, 2026
6e80fcc
test(downstream): cover SWE-bench cloning across Git storage formats
codex Oct 1, 2026
cd896a8
test(downstream): run DataHub Git integration for its latest release
codex Oct 1, 2026
b46fbcf
feat(gix): select the released backend independently of fixture tooling
codex Oct 1, 2026
a26c5bb
feat(gix): read object headers with native lookup
codex Oct 1, 2026
3962522
feat(gix): stream small objects from native storage
codex Oct 1, 2026
9669742
feat(gix): resolve revisions and repository metadata natively
codex Oct 1, 2026
9010ac9
feat(gix): enumerate tree entries natively
codex Oct 1, 2026
334cf9e
feat(gix): resolve symbolic reference targets natively
codex Oct 1, 2026
7a1af24
feat(gix): enumerate reference names natively
codex Oct 1, 2026
a7d813e
feat(gix): query merged repository configuration natively
codex Oct 1, 2026
95cf3e5
feat(gix): list worktree metadata natively
codex Oct 1, 2026
8303e03
feat(gix): find merge bases and test ancestry natively
codex Oct 1, 2026
79be491
feat(gix): count reachable commits natively
codex Oct 1, 2026
21b54a7
feat(gix): iterate first-parent commit history natively
codex Oct 1, 2026
788f059
feat(gix): read index entries natively
codex Oct 1, 2026
3bb7fab
feat(gix): query the index version natively
codex Oct 1, 2026
8385ecc
feat(gix): hash and store objects natively
codex Oct 1, 2026
c1a5677
feat(gix): write index trees with the native editor
codex Oct 1, 2026
849bf59
feat(gix): serialize trees with native object storage
codex Oct 1, 2026
e96aece
feat(gix): initialize private indexes from trees natively
codex Oct 1, 2026
bb2b59a
feat(gix): persist index edits through native snapshots
codex Oct 1, 2026
e2201f9
feat(gix): create unsigned UTF-8 commits natively
codex Oct 1, 2026
ffea84b
feat(gix): read reference logs natively
codex Oct 1, 2026
d281b78
feat(gix): resolve supported committer identities through Gix
codex Oct 1, 2026
64d089a
feat(gix): update supported reference targets natively
codex Oct 1, 2026
a544299
feat(gix): compute raw tree diffs natively
codex Oct 1, 2026
bfb24b8
feat(gix): compute commit statistics natively
codex Oct 1, 2026
389acfc
feat(gix): discover untracked files natively
codex Oct 1, 2026
db73ee2
feat(gix): check ignored paths natively
codex Oct 1, 2026
c0fdf75
feat(gix): check repository dirtiness natively
codex Oct 1, 2026
86e7017
build(gix): preserve the extra in local source distributions
codex Oct 1, 2026
162e2b8
fix(gix): omit dangling symbolic references from enumeration
codex Oct 1, 2026
4d6ae91
fix(gix): defer compatibility object formats to Git
codex Oct 1, 2026
a20afa2
docs(gix): document release setup and native conversion gaps
codex Oct 1, 2026
04dfdc0
test: avoid repository setup for actor and exception tests
codex Oct 6, 2026
2f4fc08
test: prepare historical dependency sources once on demand
codex Oct 6, 2026
72b7f23
test: copy prepared submodule baselines for each case
codex Oct 6, 2026
5512878
test: reuse prepared submodule rejection layouts
codex Oct 6, 2026
2c6a796
test: reuse a prepared revision graph with isolated copies
codex Oct 6, 2026
4b22980
test: read historical trees without cloning a checkout
codex Oct 6, 2026
bc544f4
test: copy prepared no-fetch source and submodule repositories
codex Oct 6, 2026
ce53306
docs: record fixture optimization validation and suite timings
codex Oct 6, 2026
1a108b5
test(perf): benchmark repository journeys across CLI and GixPython
codex Oct 7, 2026
6d3fec3
ci: compare CLI and GixPython repository benchmarks
codex Oct 7, 2026
51f5c88
docs(perf): record measured CLI and GixPython repository journeys
codex Oct 7, 2026
2992d9a
test(gix): count CLI process launches and enforce benchmark ceilings
codex Oct 7, 2026
9d283af
perf(gix): retain native repository handles on `Repo`
codex Oct 7, 2026
f437d84
perf(gix): open repositories with supported native metadata
codex Oct 7, 2026
a371116
docs(perf): preserve pre-audit retained-handle measurements
codex Oct 7, 2026
a8af8ab
refactor(gix): centralize retained repository access on `Repo`
codex Oct 7, 2026
6835bb2
perf(gix): resolve fixed metadata paths from the native Git directory
codex Oct 7, 2026
726df13
perf(gix): reuse object streams for serialization readback
codex Oct 7, 2026
721eed1
perf(gix): read absent references without CLI fallbacks
codex Oct 7, 2026
9cbdb56
perf(gix): validate reference names without opening Git
codex Oct 7, 2026
9fbab72
perf(gix): discover gitfiles through canonical native repositories
codex Oct 7, 2026
5919290
perf(gix): resolve revision path metadata without cat-file
codex Oct 7, 2026
db9a4ef
perf(gix): parse submodule inventory and cached fields natively
codex Oct 7, 2026
ef7ce4e
docs(gix): record remaining configuration binding requirements
codex Oct 7, 2026
2c33be7
perf(cmd): share minimum Git version checks across wrappers
codex Oct 7, 2026
95c6d9a
test(gix): keep hook lookup and execution on Git
codex Oct 7, 2026
e681f00
test(perf): track native repository reads and required fallbacks
codex Oct 7, 2026
35ac3c6
docs(gix): track strict Git compatibility and verified measurements
codex Oct 7, 2026
f5f4844
ci(downstream): test releases with CLI and Gix backends
codex Oct 7, 2026
63912db
perf(repo): batch repository metadata queries
codex Oct 7, 2026
1e92aac
fix(gix): preserve Git compatibility on Windows
codex Oct 7, 2026
4a3f1f6
ci: run fixture suites with GixPython on supported interpreters
codex Oct 8, 2026
80976aa
fix: stabilize Windows submodules and temporary test cleanup
codex Oct 8, 2026
0792f41
perf(tests): reduce Windows submodule process overhead
Byron Oct 8, 2026
9ef9ca6
refactor!: delegate index state and metadata decoding to Git and Gix
codex Oct 9, 2026
a6c7dba
test(submodule): close retained parent before checkout removal
codex Oct 9, 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
172 changes: 0 additions & 172 deletions .basedpyright/baseline.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,75 +8,9 @@
"endColumn": 45,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
"startColumn": 41,
"endColumn": 48,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
"startColumn": 32,
"endColumn": 39,
"lineCount": 1
}
},
{
"code": "reportCallIssue",
"range": {
"startColumn": 25,
"endColumn": 46,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
"startColumn": 30,
"endColumn": 39,
"lineCount": 1
}
}
],
"./git/db.py": [
{
"code": "reportIncompatibleMethodOverride",
"range": {
"startColumn": 8,
"endColumn": 12,
"lineCount": 1
}
},
{
"code": "reportIncompatibleMethodOverride",
"range": {
"startColumn": 8,
"endColumn": 14,
"lineCount": 1
}
}
],
"./git/index/base.py": [
{
"code": "reportArgumentType",
"range": {
"startColumn": 30,
"endColumn": 36,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
"startColumn": 28,
"endColumn": 34,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
Expand Down Expand Up @@ -186,14 +120,6 @@
"endColumn": 25,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
"startColumn": 52,
"endColumn": 84,
"lineCount": 1
}
}
],
"./git/objects/tag.py": [
Expand Down Expand Up @@ -274,32 +200,6 @@
}
}
],
"./git/refs/log.py": [
{
"code": "reportArgumentType",
"range": {
"startColumn": 30,
"endColumn": 34,
"lineCount": 1
}
},
{
"code": "reportAttributeAccessIssue",
"range": {
"startColumn": 17,
"endColumn": 22,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
"startColumn": 28,
"endColumn": 30,
"lineCount": 1
}
}
],
"./git/refs/reference.py": [
{
"code": "reportIncompatibleVariableOverride",
Expand All @@ -310,16 +210,6 @@
}
}
],
"./git/refs/symbolic.py": [
{
"code": "reportAttributeAccessIssue",
"range": {
"startColumn": 15,
"endColumn": 20,
"lineCount": 1
}
}
],
"./git/refs/tag.py": [
{
"code": "reportIncompatibleMethodOverride",
Expand All @@ -338,49 +228,7 @@
}
}
],
"./git/remote.py": [
{
"code": "reportAttributeAccessIssue",
"range": {
"startColumn": 26,
"endColumn": 38,
"lineCount": 1
}
},
{
"code": "reportAttributeAccessIssue",
"range": {
"startColumn": 26,
"endColumn": 38,
"lineCount": 1
}
},
{
"code": "reportAttributeAccessIssue",
"range": {
"startColumn": 26,
"endColumn": 38,
"lineCount": 1
}
},
{
"code": "reportAttributeAccessIssue",
"range": {
"startColumn": 26,
"endColumn": 38,
"lineCount": 1
}
}
],
"./git/repo/base.py": [
{
"code": "reportReturnType",
"range": {
"startColumn": 15,
"endColumn": 28,
"lineCount": 1
}
},
{
"code": "reportTypedDictNotRequiredAccess",
"range": {
Expand Down Expand Up @@ -445,26 +293,6 @@
"lineCount": 1
}
}
],
"./git/repo/fun.py": [
{
"code": "reportReturnType",
"range": {
"startColumn": 11,
"endColumn": 20,
"lineCount": 1
}
}
],
"./test/deprecation/test_basic.py": [
{
"code": "reportUnusedExpression",
"range": {
"startColumn": 12,
"endColumn": 62,
"lineCount": 1
}
}
]
}
}
7 changes: 5 additions & 2 deletions .github/workflows/alpine-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ permissions:
jobs:
test:
runs-on: ubuntu-latest
env:
GIT_PYTHON_BACKEND: cli

container:
image: alpine:latest
Expand All @@ -23,8 +25,8 @@ jobs:
steps:
- name: Prepare Alpine Linux
run: |
apk add sudo git git-daemon python3 py3-pip py3-virtualenv
echo 'Defaults env_keep += "CI GITHUB_* RUNNER_*"' >/etc/sudoers.d/ci_env
apk add sudo git git-daemon bash rust cargo build-base python3 python3-dev py3-pip py3-virtualenv
echo 'Defaults env_keep += "CI GITHUB_* RUNNER_* GIT_PYTHON_BACKEND"' >/etc/sudoers.d/ci_env
addgroup -g 127 docker
adduser -D -u 1001 runner # TODO: Check if this still works on GHA as intended.
adduser runner docker
Expand Down Expand Up @@ -64,6 +66,7 @@ jobs:
run: |
. .venv/bin/activate
pip install ./smmap ./gitdb '.[test]'
python -c 'from gix import testtools'

- name: Show POSIX file ownership
run: |
Expand Down
81 changes: 81 additions & 0 deletions .github/workflows/backend-benchmark.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
name: Backend benchmark

on:
push:
branches: [main]
pull_request:
workflow_dispatch:

permissions:
contents: read

jobs:
compare-backends:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
persist-credentials: false
- uses: actions/setup-python@v7
with:
python-version: "3.12"
- name: Ensure Git 2.52 or newer
run: |
if ! dpkg --compare-versions "$(git version | awk '{print $3}')" ge 2.52; then
sudo add-apt-repository --yes ppa:git-core/ppa
sudo apt-get update
sudo apt-get install --yes git
fi
- name: Prepare Rust for GixPython
run: |
rustup update stable
rustup default stable
echo "CARGO_TARGET_DIR=$RUNNER_TEMP/gix-target" >> "$GITHUB_ENV"
- name: Cache GixPython builds
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: |
~/.cargo/registry
~/.cargo/git
${{ runner.temp }}/gix-target
~/.cache/pip
key: benchmark-gix-${{ runner.os }}-${{ hashFiles('gix-requirements.txt') }}
- name: Install separate backends with the same interpreter
run: |
python -m venv .bench-cli
python -m venv .bench-gix
.bench-cli/bin/python -m pip install . -r test/performance/benchmark-requirements.txt
.bench-gix/bin/python -m pip install '.[gix]' -r test/performance/benchmark-requirements.txt
- name: Prepare the shared read-only benchmark fixture
run: |
.bench-cli/bin/python -c 'from pathlib import Path; from gix import testtools; print("BENCH_REPO=" + str((testtools.scripted_fixture_read_only_with_args("benchmark.sh", [str(Path.cwd())]) / "repo").resolve()))' >> "$GITHUB_ENV"
mkdir benchmark-results
- name: Measure GixPython operations, opening and discovery first
env:
GIT_PYTHON_BACKEND: gix
run: |
.bench-gix/bin/python -m test.performance.bench_repository \
--repo "$BENCH_REPO" --expect-backend gix -o benchmark-results/gix.json
- name: Measure CLI operations, opening and discovery
env:
GIT_PYTHON_BACKEND: cli
run: |
.bench-cli/bin/python -m test.performance.bench_repository \
--repo "$BENCH_REPO" --expect-backend cli -o benchmark-results/cli.json
- name: Check parity and publish comparison
run: |
.bench-gix/bin/python -m test.performance.compare_backends \
benchmark-results/cli.json benchmark-results/gix.json \
--cli-budget test/performance/cli-budget.json > benchmark-results/comparison.md
cat benchmark-results/comparison.md >> "$GITHUB_STEP_SUMMARY"
.bench-gix/bin/python -m pyperf compare_to \
benchmark-results/cli.json benchmark-results/gix.json --table --table-format md \
>> "$GITHUB_STEP_SUMMARY"
- name: Retain raw timings and comparison
if: always()
uses: actions/upload-artifact@v7
with:
name: backend-benchmark
path: benchmark-results/
Loading
Loading