Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
aa136c6
feat!: delegate repository storage to Git and Gix
codex Oct 1, 2026
b3a4ba8
fix(index): restore read-only `entries` compatibility
codex Oct 22, 2026
2fd0d00
fix(cmd): honor global `-C` checkout selection
codex Oct 22, 2026
8ce71f5
fix(repo): retain checkout context for separate Git directories
codex Oct 22, 2026
97921e3
fix(odb): restore the legacy `GitDB` backend selector
codex Oct 22, 2026
8877d09
fix(refs): resolve locally tracked branches through Git
codex Oct 22, 2026
4440302
fix(repo): retain revision tree context and path errors
codex Oct 22, 2026
47a668c
fix(repo): accept the explicit literal-path constructor option
codex Oct 22, 2026
2d84a6a
fix: expose the release version in editable imports
codex Oct 22, 2026
617a058
fix: retain the typing Union compatibility import
codex Oct 22, 2026
a88e46a
fix(build): keep editable version fallback out of wheels
codex Oct 22, 2026
5749f6d
fix(config): restore nonempty section mapping assignment
codex Oct 22, 2026
3640db4
fix: retain the typing Optional compatibility import
codex Oct 22, 2026
46303c8
docs: record compatibility audits of 115 GitPython dependents
codex Oct 22, 2026
bd490c9
test(repo): cover Unicode and escaped untracked paths
codex Oct 24, 2026
b4bd52d
fix(stats): preserve Unicode line separators in filenames
codex Oct 24, 2026
ae03abd
test(config): port home include and inline header regressions
codex Oct 24, 2026
a7d45dc
test(commit): port whitespace header regression against Git
codex Oct 24, 2026
9b4fe22
fix(submodule): apply Git transport policy to recorded URLs
codex Oct 24, 2026
beadcb8
fix(submodule): check transport policy before replacing a remote
codex Oct 24, 2026
75a9276
fix(index): check repository ownership before commit hooks
codex Oct 24, 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