Repository navigation
fix: read reference arguments by exact name in revision APIs - #2336
Open
Keerthana-64 wants to merge 1 commit into
Open
Keerthana-64 wants to merge 1 commit into
Keerthana-64 wants to merge 1 commit into
Conversation
<!-- agent --> `Reference.__str__` returns the short name, so `refs/heads/main` becomes `main` and `refs/remotes/origin/main` becomes `origin/main`. The revision APIs turned reference objects into revisions with `str(ref)` or `Git._check_operand(ref, "revision")`, and Git's revision lookup (gitrevisions(7)) tries `refs/tags/<name>` before `refs/heads/<name>` and `refs/remotes/<name>`, only warning about the ambiguity on stderr. A tag that shares a branch's short name therefore took the branch's place. Whoever controls a remote can supply such tags: `git fetch` auto-follows tags that point into fetched history, and a clone brings in every tag. With a branch `main` and fetched tags `main` and `origin/main` on another commit, `repo.heads.main.commit` still reported the branch, but these APIs used the tag's commit on both backends: - `Repo.commit()`, `Repo.tree()`, `Object.new()`, `Repo.iter_commits()` - `Repo.merge_base()`, `Repo.is_ancestor()`, `Diffable.diff()` - `Repo.blame()`, `Repo.blame_incremental()`, `Repo.archive()` - `IndexFile.from_tree()`, `IndexFile.merge_tree()`, `IndexFile.reset()` - `HEAD.reset()`, `Repo.create_head()`, `Repo.create_tag()` In the documented merge workflow, `merge_base(new_branch, original_branch)` followed by `index.merge_tree(original_branch, base=...)`, the merge commit received the tag's tree while its parents named the branch commits. `repo.head.reset(repo.heads.main, working_tree=True)` and `repo.index.reset(ref, head=True)` moved the current branch to the tag's commit and wrote its files into the working tree. Add `Git._check_revision()`. For a `SymbolicReference` it reads the exact reference through `dereference_recursive()`, the `show-ref`/Gix read behind `ref.object`, and passes on the object ID, which is how `SymbolicReference.set_object()` already resolves reference arguments. Strings keep Git's name guessing, as the changelog already documents. `merge_base()` resolves its top-level arguments before `_unpack_args()` flattens them. A reference that does not exist now raises `ValueError`, as `ref.object` does, instead of resolving to whatever Git guesses for its short name. On the CLI backend each reference argument costs one or two extra short Git calls; the Gix backend reads references natively, and `doc/gix-backend.md` is unchanged. Validation: the new `shadowed` case in `tests/fixtures/exact-refs.sh` backs `test_reference_arguments_do_not_resolve_same_named_tags` in `test/test_refs.py`, which checks the APIs above for a branch and a remote-tracking branch. It fails before the change and passes after it with `GIT_PYTHON_BACKEND=cli` and `GIT_PYTHON_BACKEND=gix` for SHA-1/SHA-256 and files/reftable (Git 2.52.0, GixPython 0.3.0, Python 3.11, macOS). Full suites with the change: CLI 1,915 passed and Gix 2,018 passed. Each run also had 116 failures, and the same 116 tests fail on the unpatched tree; they need history and tags such as `0.1.5`, which this shallow clone lacks. `ruff check`, `ruff format --check`, ShellCheck, `mypy --python-version=3.11` and `basedpyright --warnings` pass. Agent-Model: claude-opus-5-5
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description:
Revision APIs mein reference objects ka short name use hone ki wajah se Git galat reference resolve kar sakta tha. Agar same naam ka tag aur branch exist karte the, toh Git branch ki jagah tag ko select kar leta tha. Isse merge_base, merge_tree aur reset jaise operations galat commit ya files use kar sakte the.
Fix: Ab reference objects ko unke exact reference name se resolve kiya jaata hai. Revision strings ke liye existing name resolution behaviour unchanged hai. Missing references par ValueError raise hota hai.
Security: Yeh issue security review ke dauraan identify hua, especially un merge bots aur CI jobs ke liye jo contributor forks fetch karke Head ya RemoteReference objects use karte hain.
Testing: test_reference_arguments_do_not_resolve_same_named_tags fix se pehle fail aur fix ke baad dono backends par successfully pass hota hai.