Skip to content

shape_materialize.py: the docstring of gives_a_branch_another_name says a full name that is no pattern takes the one ref git completes it to, which may be a branch, where it said any other source names no branch (#1238) - #1244

Merged
brettheap merged 4 commits into
mainfrom
fix/1238-source-names-no-branch
Nov 8, 2026

Conversation

@brettheap

@brettheap brettheap commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Goal

#1238 is a wording NIT that the review of #1235 (#1230) found in the code: NIT 4 of rv1235's first review, and NIT 2 of its re-check. The docstring of gives_a_branch_another_name in scripts/shape_materialize.py ended "ANY OTHER SOURCE NAMES NO BRANCH", but git completes a source that is a full name and no pattern, and completes refs/h to the branch refs/heads/refs/h where the remote has one. The sentence now says what git does with such a source, as an open list ("such as"), and where the clash is. A reader of the docstring is no longer told that a source outside refs/heads/ is never a branch.

Wording only, in one docstring of one file: 9 lines added, 3 removed. No code, no row, no other file. The file's syntax tree with every docstring dropped is the same as main's.

What held on main (50869f384)

The sentence is at scripts/shape_materialize.py:1720-1723, the end of the docstring of gives_a_branch_another_name (line 1671):

1720:     BRANCH REACHES). A shorter start, such as `refs/*` or `*`, can name a
1721:     tag, and that clause has left it out first. ANY OTHER SOURCE NAMES NO
1722:     BRANCH, though a refspec from one can still put a ref on a branch's
1723:     name: `origin_fetch_refspecs` says where (WHAT CAN STILL CLASH).

It is true of a source in another namespace such as refs/pull/7/head. It is not true of every other source. A source that is a full name and no pattern takes the one ref git completes the name to on the remote: for refs/h, refs/h itself, the branch refs/heads/refs/h, the tag refs/tags/refs/h, refs/refs/h or refs/remotes/refs/h, and where several exist git takes the exact ref over a tag over a branch. Where the remote has the branch, the source is a branch. The code is right: gives_a_branch_another_name("refs/h", ...) is False, because the source has no * and does not start with refs/heads/, so the refspec is carried. What fails afterwards is the clash the docstring's own next clause names. Only the words were untrue.

Measured on this branch's base, with git 2.43.0 (/usr/bin/git) and git 2.47.1, which gave the same answers on every row. Local bare remotes, GIT_CONFIG_GLOBAL=/dev/null, GIT_CONFIG_NOSYSTEM=1, GIT_SSH_COMMAND=false. rv1235's probe scripts were run again here (copied unchanged, new output folders), and their logs are identical to rv1235's. The fetch was +refs/heads/*:refs/remotes/origin/* plus the refspec of the row, and the remote had main and hy:

the remote has                    refspec                          result
branch refs/heads/refs/h          +refs/h:refs/remotes/origin/hy   128 Cannot fetch both refs/heads/hy and refs/heads/refs/h to refs/remotes/origin/hy
tag refs/tags/refs/h              +refs/h:refs/remotes/origin/hy   128 Cannot fetch both refs/heads/hy and refs/tags/refs/h to refs/remotes/origin/hy
exact ref refs/h (update-ref)     +refs/h:refs/remotes/origin/hy   128 Cannot fetch both refs/heads/hy and refs/h to refs/remotes/origin/hy
refs/refs/h or refs/remotes/refs/h  +refs/h:refs/remotes/origin/hy 128, the same message naming that ref
each of those five refs, alone    onto origin/not-a-branch         0, holds that ref's commit
branch refs/heads/refs/h          onto origin/refs/h               0 (the branch's own name: no clash)
refs/pull/7/head                  onto origin/main                 128 Cannot fetch both refs/heads/main and refs/pull/7/head to refs/remotes/origin/main
branch refs/heads/main            onto origin/main                 0

So a name with no * can be a branch that its spelling does not show, and the clash is a ref that is not that branch put on a branch's name, which is what the second half of the sentence has to say. "ANY OTHER" was wrong in a second way: a carried refspec from a source that IS the branch does not clash onto that branch's own name.

What changed

The docstring's last sentence, now lines 1721-1729:

    tag, and that clause has left it out first. ANY OTHER SOURCE TAKES NO
    BRANCH BY A PATTERN, and a full name that is no pattern, such as
    `refs/h`, takes the one ref git completes it to on the remote: that ref
    itself, or one such as the branch `refs/heads/refs/h` or the tag
    `refs/tags/refs/h` (measured, git 2.43 and 2.47.1). Such a name can
    stand for a branch its spelling does not show, so it is not left out
    here. A refspec from any such source can still put a ref on a branch's
    name, if the ref is not that branch itself: `origin_fetch_refspecs`
    says where (WHAT CAN STILL CLASH).
  • "Takes no branch by a pattern" holds for every source this sentence covers. Git matches a pattern against each ref's whole name, and a ref under refs/heads/ starts with the part before the * only where that part is a start of refs/heads/ or is under it, the two cases the function reads before this sentence.
  • The list is open ("one such as"): it names the exact ref, the branch and the tag, and the rows above show two more completions (refs/refs/h, refs/remotes/refs/h), so no reader takes the three as all.
  • "So it is not left out here" is what the code does: gives_a_branch_another_name is False for refs/h onto origin/hy, onto origin/refs/h, for refs/pull/7/head onto origin/main, and for the pattern refs/pull/*/head, and origin_fetch_refspecs(["+refs/h:refs/remotes/origin/hy"]) returns it carried. It is True for refs/heads/main onto origin/hy, as before.
  • "If the ref is not that branch itself" is the condition the rows show: the clash is two different refs on one name, a branch's.

The checks the issue's Verify lists:

  • The diff is only that docstring. The diff has one hunk, inside the docstring, which spans lines 1672-1724 on main and 1672-1730 here. The file's tree with every docstring dropped (module, class and function: 168 each side) is equal on main (50869f384) and at this head under python3 -I, ast.dump: 380120 characters of dump on both sides. A control that renames gives_a_branch_another_name on the head side gives 380121 and DIFFERENT, and the same trees with the docstrings kept differ (520956 against 521366), so the check can fail. Python 3.12.3. The check compares two dumps made by one interpreter and asserts no text that depends on the version.
  • git grep -n 'ANY OTHER SOURCE NAMES NO$' -- scripts/ finds nothing at this head. On main it finds shape_materialize.py:1721. With any case and no line end, git grep -n -i 'other source names no' also finds nothing here, and nothing but that line on main.
  • No added line is over 79 columns or holds a non-ASCII character. 9 lines are added, the longest is 75 columns, and none has a tab or trailing space. The file's own width is unchanged: 20 lines over 79 columns (longest 118) and 90 lines with a non-ASCII character, as on main, none of them mine.
  • No test, README.md, docs/ page or AGENTS.md line pins the sentence. The issue's grep holds at this head.

The two sentences left alone

The issue asks whether shape_materialize.py:1874 (now 1880, in the docstring of origin_fetch_refspecs) and bump-leg.py:1165 (in _leg_fetch_refspecs) want the same change. Both paragraphs were read, and both are left as they are:

shape_materialize.py:1880:     WHAT CAN STILL CLASH is a refspec carried whose source names no branch,
bump-leg.py:1165:     whose source names no branch, onto a name a branch of the remote has
  1. They define a shape by its examples and say nothing about what git completes a name to. Each goes on at once to the pull requests (origin/pr/ where a branch pr/7 is, and +refs/pull/7/head:refs/remotes/origin/main beside a branch main), and neither names refs/h. They were not the sentence that told a reader a source is never a branch.
  2. "Names no branch" is spelling there, as it is in the sentence the function's docstring opens with. "A SOURCE UNDER refs/heads/ NAMES BRANCHES" is true by spelling too: can_name_a_tag's docstring measures that +refs/heads/zz took the tag refs/tags/refs/heads/zz where the remote had no branch zz. The sentence changed here now says outright that the spelling of a name with no * does not show what it stands for, so the docstring that defines the class carries the caveat the two borrowers need.
  3. The mechanism they state is the one that fails refs/h: "wherever a name it writes is a branch's". The origin_fetch_refspecs paragraph ends with why such a refspec is carried at all: "Which names the remote's branches have is not known from its refspecs, and left out, what such a refspec keeps would be pruned on every run". That holds for refs/h word for word.
  4. The cost of leaving them is one reading: a reader who takes "names no branch" in git's sense meets the single case refs/h beside a remote branch refs/heads/refs/h. If the review wants a word there, it is a few words in each place, and no open PR touches either paragraph (merge-trees below), so it can be a fix round.

Rows failing on main, and mutants

None of either. No row is added or changed and no behaviour moved: the syntax tree outside the docstring is main's, so there is nothing for main to fail and nothing to mutate. gives_a_branch_another_name returns what it returned for every case in the table above (called in process at this head; the syntax tree outside the docstrings is main's).

Runs

All through the lane's runner run9.sh (stub gh first on PATH, GIT_SSH_COMMAND=false, GIT_CONFIG_GLOBAL=/dev/null), on the committed head 36ec589a6 with the tree clean (dirty=0), as one run of seven files at a time: tests/test_pinned_copy_text.py, tests/test_path_guard_hygiene.py, tests/test_repo_hygiene.py, tests/test_agents_md_codes.py, tests/test_cli_reference.py (the hygiene five), tests/test_family_bump_fetch_refspecs.py and tests/test_bump_leg_fetch_refspecs.py.

  • The seven files, git 2.43.0 (/usr/bin/git): 504 passed in 469.44s (47 test_agents_md_codes.py, 68 test_bump_leg_fetch_refspecs.py, 23 test_cli_reference.py, 57 test_family_bump_fetch_refspecs.py, 121 test_path_guard_hygiene.py, 87 test_pinned_copy_text.py, 101 test_repo_hygiene.py; the counts are from --collect-only -q on the same head and add up to 504). Log v131/n1238/gate-g243.log.
  • The seven files, git 2.47.1 (first on PATH, git --version printed into the log): 504 passed in 714.00s. Log v131/n1238/gate-g247.log.
  • -k carried-refs-h-not-a-pattern over tests/test_family_bump_fetch_refspecs.py and tests/test_bump_leg_fetch_refspecs.py: 2 passed, 123 deselected, on 2.43.0 and on 2.47.1 (run-k-g243.log, run-k-g247.log).
  • Both runs start with dirty=0. Python 3.12.3 (CI runs 3.14); nothing asserts text that depends on the version.

The measured git behaviour above comes from the probe scripts, not the test files. -k carried-refs-h-not-a-pattern over the two fetch-refspec files is part of those runs.

Merge-trees

git merge-tree --write-tree origin/main HEAD exits 0, with tree 9d874bcf2caf, equal to this head's tree, against main 50869f384 (the merge base). Against the head of each open PR that touches scripts/shape_materialize.py or scripts/bump-leg.py (read from gh pr list --state open --limit 100 --json number,headRefName,headRefOid,files, 52 open PRs at the last read, 7 of them touch one of the two files), git merge-tree --write-tree HEAD <head> exits 0 and the merged tree still holds the new sentence and not the old one:

#1223 f50b47232  exit 0   #1207 6fa1edd56  exit 0   #1160 0068f5af8  exit 0   #1131 55c30f20f  exit 0
#1118 2307036ab  exit 0   #1105 b28f40de0  exit 0   #1104 de89aa81b  exit 0

Main moved once while this was gated, to 4829418f0 (adopt-project.py, docs/cli.md and a new test file: none of the files this change or its runs touch), and git merge-tree --write-tree origin/main HEAD against it also exits 0.

None of their hunks is within 100 lines of the sentence changed here.

Closes #1238

Lane: openreposhape-5 (openRepoShape-5)

🤖 Generated with Claude Code

Summary by Sourcery

Enhancements:

  • Clarify the gives_a_branch_another_name docstring to accurately describe how Git resolves full, non-pattern ref names and when carried refspecs can clash with branch names.

…says a full name that is no pattern takes the one ref git completes it to, which may be a branch, where it said any other source names no branch (#1238)

The docstring ended "ANY OTHER SOURCE NAMES NO BRANCH, though a refspec from
one can still put a ref on a branch's name". That is true of a source in
another namespace, such as `refs/pull/7/head`, and untrue of a full name that
is no pattern, which git completes: the source `refs/h` is the exact ref, the
branch `refs/heads/refs/h`, the tag `refs/tags/refs/h`, `refs/refs/h` or
`refs/remotes/refs/h`. Where the remote has a branch of that name the source
is a branch, and beside a branch `hy` the carried refspec
`+refs/h:refs/remotes/origin/hy` exits 128 ("Cannot fetch both refs/heads/hy
and refs/heads/refs/h to refs/remotes/origin/hy"). The same source onto
`origin/refs/h`, the branch's own name, or onto a name no branch has, exits 0
(measured on git 2.43.0 and 2.47.1, local bare remotes: rv1235's probes, run
again here with the same answers).

The sentence now says that any other source takes no branch by a pattern; that
a full name that is no pattern takes the one ref git completes it to on the
remote, `refs/h` itself or one such as the branch `refs/heads/refs/h` or the
tag `refs/tags/refs/h`; that such a name can stand for a branch its spelling
does not show, so it is not left out here; and that a refspec from any such
source can still put a ref on a branch's name if the ref is not that branch
itself, the clash `origin_fetch_refspecs` describes (WHAT CAN STILL CLASH).

Wording only, in one docstring. `gives_a_branch_another_name("refs/h", ...)`
is False and the refspec is carried, as on main. The file's syntax tree with
every docstring dropped is as on main (`ast.dump`). The two sentences that say
"whose source names no branch" (`shape_materialize.py` WHAT CAN STILL CLASH,
`bump-leg.py` `_leg_fetch_refspecs`) are left: they define the clashing shape
by its examples, the pull requests, and make no claim about what git completes
a name to.

Closes #1238

Lane: openreposhape-5 (openRepoShape-5)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@sourcery-ai

sourcery-ai Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

Reviewer's Guide

Implementation

Update the function’s docstring to clarify how Git completes full non-pattern ref names and when a carried refspec can clash with a branch name.

  • scripts/shape_materialize.py L1789-1797

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@brettheap

Copy link
Copy Markdown
Contributor Author

(lane openRepoShape-5, 2026-11-08T15:21:27Z) Independent review of #1244 (#1238) for lane openRepoShape-5, by rv1244 and rv1244b (sonnet), at 36ec589: READY

I found no MUST and no SHOULD. There are four optional NITs. None of them blocks landing, and I would not hold the PR for them. rv1244 ran the first gates and rv1244b did the rest. I changed nothing on GitHub or in the PR. My folder is L/work/rv1244b/, where L is /workspace/projects/.lane-worktrees/openRepoShape-5, with notes in STATE.md.

What the PR is

The PR is one commit on base 50869f384, a 9-added, 3-removed hunk inside the docstring of gives_a_branch_another_name in scripts/shape_materialize.py. The commit has identity Brett Heap service@opensoft.dev, a 221-character subject, and one Closes #1238 line. The live PR is open and draft, has no milestone, and closingIssuesReferences is [1238]. CI on the head (tests, tests-git-bash, package, SonarCloud) is SUCCESS; those runs date from 2026-10-24, so the gates below on today's main matter more.

What I measured

Main moved (the point of R4b).

Gates on the merged tree.

  • For this I made the unreferenced commit 1014d666d (parents 53bd31718 and 36ec589a6, tree 700da73ce) and the detached worktree /workspace/projects/openRepoShape-worktrees/rv1244b-merged. It was clean, with dirty=0.
  • The 7 files are test_pinned_copy_text.py, test_path_guard_hygiene.py, test_repo_hygiene.py, test_agents_md_codes.py, test_cli_reference.py, test_family_bump_fetch_refspecs.py and test_bump_leg_fetch_refspecs.py.
  • They ran through run10.sh with filter-repo 2.47.0 (CI's pin):
    • git 2.43.0: 504 passed in 137.83s (L/work/rv1244b/gate-m243.log);
    • git 2.47.1: 504 passed in 137.00s (gate-m247.log).
  • rv1244 had earlier run the same files on the PR head 36ec589a6 with filter-repo 2.45.0: 504 passed on each git (L/work/rv1244/gate-g243.log, gate-g247.log).
  • No test pins the sentence. At the head, git grep -n 'ANY OTHER SOURCE NAMES NO$' -- scripts/ finds nothing (rc 1); on main it finds line 1723.

Syntax tree, docstrings dropped (/usr/bin/python3 -I, 3.12.3, astcmp.py):

Pair Result
bd3e9c148 against 36ec589a6 EQUAL, 380120 / 380120 characters, 168 / 168 docstrings dropped
53bd31718 against the merged tree EQUAL, 393401 / 393401, 174 / 174 dropped
Same pairs with docstrings kept DIFFERENT (520956 / 521366, and 538378 / 538788)
Control, a rename on the head side DIFFERENT
Mutant, and changed to or in the return of gives_a_branch_another_name DIFFERENT
Mutant, one docstring word changed EQUAL
  • As a byte check, deleting the docstring's own lines from each file leaves the same sha256 on both sides: d9e75f6c for 36ec589 against bd3e9c1, and 6ad7b320 for the merged tree against 53bd317.
  • The worktree file's blob 6526fac1d was never mutated.

Width and ASCII of the added lines.

  • There are 9 added lines. The longest is 75 columns, none is over 79, and there are no non-ASCII characters, tabs, trailing spaces or CRs. git diff --check is clean.
  • The file's width is the same on main and head: 16 lines over 79 characters, longest 118, 90 lines with a non-ASCII character. The PR body says 20; that is a byte count (the same 20 on both sides), so it is a body wording point only.

Git probes (L/work/rv1244b/probe.sh and probe2.sh). Local bare remotes with main and hy, each extra ref on its own commit. The fetch was +refs/heads/*:refs/remotes/origin/* plus the case's refspec.

  • All results are identical on git 2.43.0 and 2.47.1. They are identical again over file:// with protocol v0 and v2.
  • Logs are probe-g243.log, probe-g247.log, probe2-g243.log and probe2-g247.log.
Claim in the new sentence Measured
A name with no pattern, +refs/h:..., takes the one ref git completes it to The exact refs/h, the branch refs/heads/refs/h, the tag refs/tags/refs/h, refs/refs/h and refs/remotes/refs/h are each taken. Onto origin/not-a-branch each exits 0 and holds that ref's commit. With none of them present it exits 128 couldn't find remote ref refs/h.
The list is open ("one such as") refs/refs/h and refs/remotes/refs/h are completions too, so the list is rightly open.
The name can stand for a branch its spelling does not show +refs/h:refs/remotes/origin/hy exits 128 Cannot fetch both refs/heads/hy and refs/heads/refs/h (the tag, exact, refs/refs/h and refs/remotes/refs/h cases name their own ref). A second case: the full name +refs/pull/7/head:... took the branch refs/heads/refs/pull/7/head.
"If the ref is not that branch itself" The branch refs/heads/refs/h onto origin/refs/h, its own name, exits 0. With a branch and a tag both present, refs/h takes the tag, and onto origin/refs/h it exits 128 Cannot fetch both refs/heads/refs/h and refs/tags/refs/h. So the condition is exact.
Other refs can clash +refs/pull/7/head:refs/remotes/origin/main exits 128. +refs/pull/*/head:refs/remotes/origin/pr/* beside a branch pr/7 exits 128. +refs/heads/main:refs/remotes/origin/main and +refs/heads/pr/*:refs/remotes/origin/pr/* exit 0.
Any other source "takes no branch by a pattern" With branches named refs/pull/7/head and refs/refs/h, the patterns +refs/pull/*/head:... and +refs/refs/*:... took nothing, exit 0.
"So it is not left out here" Called in process on this tree: gives_a_branch_another_name is False for refs/h onto origin/hy, origin/refs/h and origin/not-a-branch, for refs/pull/7/head onto origin/main, and for refs/pull/*/head. It is True for refs/heads/main onto origin/hy and for refs/h*. origin_fetch_refspecs carries +refs/h:refs/remotes/origin/hy.

I did not rerun the push claims from the issue; they are not in the docstring. A plain git push to a bare remote made refs/heads/refs/h, refs/tags/refs/h, refs/refs/h and refs/remotes/refs/h on both gits. A push of the exact refs/h is refused. In my run the message was dst refspec refs/h matches more than one, not the funny ref message the issue quotes, because the other refs already existed.

Merge-trees.

Judgement on leaving shape_materialize.py:1880 and bump-leg.py:1165 alone

I accept it. Both sentences define the clashing shape by its examples (pull requests onto a branch's name) and neither names refs/h. The new sentence now says outright that a name's spelling can hide a branch, which gives them the caveat.

One residue, which is NIT 4 below: the case +refs/h (a branch refs/heads/refs/h) onto origin/hy really clashes (128, measured above), yet it is not "a source that names no branch" in the semantic sense. At bump-leg.py:1165, which says "Two ways remain", it falls under neither. It reads correctly if "names no branch" means "by its spelling". The PR body (point 4 of "The two sentences left alone") already says this can be a fix round.

Findings

MUST: none. SHOULD: none.

NIT 1 (wording, optional): the causal "so". "Such a name can stand for a branch its spelling does not show, so it is not left out here" can be read as "it can be a branch, therefore it is not left out", which inverts the cause. The cause is that this function reads spelling only and cannot see what the remote holds (origin_fetch_refspecs says why it is carried). A fix: "...a branch its spelling does not show, which this function cannot see, so it is not left out here".

NIT 2 (wording, optional): "any such source" and "that ref itself".

  • "A refspec from any such source" can be read as only a full name that is no pattern. The pattern case (pull requests onto pr/7) is also real, as probe B shows 128 for it. It is not wrong, because the sentence points to WHAT CAN STILL CLASH, which covers patterns.
  • "that ref itself" would read more easily as "refs/h itself".

NIT 3 (PR body, for the coordinator before any squash message).

NIT 4 (follow-up, not for this PR). If the coordinator wants the residue under "Judgement" closed, add "by its spelling" to shape_materialize.py:1880 and bump-leg.py:1165. That would be a separate wording PR; no open PR touches those paragraphs.

Not done, and one slip

  • I ran no mutants beyond the two syntax-tree mutants and the rename control, because no behaviour moved and no row was added or changed.
  • I ran no gate on the PR head alone with filter-repo 2.47.0; the merged-tree gate covers it, and rv1244's head-only runs (504 passed on each git) used 2.45.0.
  • I ran git rev-parse FETCH_HEAD once in the shared checkout, against the "never read FETCH_HEAD" rule. I used nothing from it; the main sha came from git rev-parse origin/main and a gh api read.
  • I made the unreferenced commit object 1014d666d in the shared object store and the clean detached worktree rv1244b-merged. Both are mine; I did not remove them.
  • No rm, no git config, no commits or pushes, and no GitHub writes (reads only).

Main at the last read: 53bd31718, 15:20Z. PR head: 36ec589a6. Probe, log and copy files are in L/work/rv1244b/; rv1244's files are in L/work/rv1244/.

Lane: openreposhape-5 (openRepoShape-5)

@brettheap brettheap added this to the v1.2.1 milestone Nov 8, 2026
@sonarqubecloud

sonarqubecloud Bot commented Nov 8, 2026

Copy link
Copy Markdown

@sourcery-ai

sourcery-ai Bot commented Nov 8, 2026

Copy link
Copy Markdown

Sorry @brettheap, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 5 days and 22 hours by commenting @sourcery-ai review. Upgrade to get a review now.

@brettheap
brettheap merged commit dff8fd4 into main Nov 8, 2026
5 checks passed
@brettheap
brettheap deleted the fix/1238-source-names-no-branch branch November 8, 2026 19:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant