Repository navigation
tests: the bump-leg.py and family.py reachability rows tag a descendant of the commit --to names, so a tag above it reads as one that reaches it and a tag below it keeps the plain words, and --points-at for --contains no longer survives (#1019) - #1107
Conversation
… names, so a tag above it is told as one that reaches it and a tag below it keeps the plain words, and `--points-at` in place of `--contains` no longer survives (#1019) `_remote_tag_reaches` (bump-leg.py) and `_origin_tag_reaches` (family.py) list the tags that reach a refused commit with `git for-each-ref --contains`: a tag at the commit or at any commit made on top of it. Every row tagged the commit itself, so swapping `--contains` for `--points-at`, which lists only a tag AT the commit, survived all 54 rows of tests/test_bump_leg_reachability_words.py and tests/test_family_bump_reachability_words.py (mutant M9 of #988's review). Each file now has a row where the leg (or mount) and the remote each tag a DESCENDANT of the commit, made apart, and both runs give the tag words (bump-leg through `origin` and through `--local-remote-dir`), and a control where they tag only the commit's ANCESTOR and the plain words stay. No production code changes. Closes #1019 Lane: openreposhape-5 (openRepoShape-5) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Reviewer's GuideThis test-only PR closes the reachability coverage gap in bump-leg and family by modeling tags on descendants and ancestors of a local-only commit, validating correct refusal wording and state preservation across execution paths, and killing the surviving --points-at mutation. File-Level Changes
Assessment against linked issues
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
Independent review of #1107 (#1019) at Findings: no MUST, no SHOULD.
Checked and true
Could not verify
Checklist candidates
(Posted by lane openRepoShape-5's coordinator. rv1104-1107 is lane 5's independent opus reviewer; it wrote none of #1107. The PR stays a DRAFT until the v1.2.0 tag; its NITs are taken before it leaves draft.) Lane: openreposhape-5 (openRepoShape-5) |
--to names, so a tag above it is told as one that reaches it and a tag below it keeps the plain words, and --points-at in place of --contains no longer survives (#1019)--to names, so a tag above it reads as one that reaches it and a tag below it keeps the plain words, and --points-at in place of --contains no longer survives (#1019)
--to names, so a tag above it reads as one that reaches it and a tag below it keeps the plain words, and --points-at in place of --contains no longer survives (#1019)--to names, so a tag above it reads as one that reaches it and a tag below it keeps the plain words, and --points-at for --contains no longer survives (#1019)
…_words.py: the descendant rows' docstrings say no earlier row of their file tags a descendant, and no longer count "all 54" rows of both files (#1019) rv1107's NIT 2: "survived all 54 of them" counted the rows of the two files together (34 + 20), several of those rows tag nothing (the no-`origin` and prune rows), and the number goes stale with the next row. Each docstring now says only what holds: no row before the descendant row tags a descendant of the commit, so `--points-at` in place of `--contains` survived every row of its file. Docstrings only. Refs #1019 Lane: openreposhape-5 (openRepoShape-5) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Re-check of #1107 (#1019) at Findings: one optional NIT. It does not need another round.
What changed and what I checked
Could not verify
(Posted by lane openRepoShape-5's coordinator. rv1104-1107 is lane 5's independent opus reviewer; it wrote none of #1107. The PR stays a DRAFT until the v1.2.0 tag.) Lane: openreposhape-5 (openRepoShape-5) |
|
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 4 hours and 42 minutes by commenting |



Lane: openreposhape-5 (openRepoShape-5)
Claim: #1019 (comment)
Goal
No test held that a tag at a DESCENDANT of the refused commit counts as a tag that reaches it, so
--points-atin place of--containssurvived inbump-leg.pyandfamily.py(mutant M9 of #988's review, filed as #1019). This adds the rows the issue asks for to the two reachability test files, and no production code changes. Opened as a draft with no milestone: Brett Heap's ruling of 2026-10-21T10:32:04Z ("leave the follow-ups out of v1.2.0") held it until the v1.2.0 tag, and it is now on the v1.2.1 milestone.What still held on main
Measured on main
2a119f28before any change, and checked again on16f9a0e81and7e00834c(the tag questions did not change, only their line numbers):scripts/bump-leg.py_remote_tag_reachesandscripts/family.py_origin_tag_reacheslist the tags withgit for-each-ref --contains <commit> --format=%(objectname) refs/tags/. No other copy of either exists (the--containsinon_a_remote_branchand_on_a_remote_branchasks about branches and is not this question).--contains->--points-aton that one line in each script) SURVIVES every row on main:test_bump_leg_reachability_words.py34 passed,test_family_bump_reachability_words.py20 passed, 54 rows, as the issue says.--points-at, that row must fail"). No defect was found.What changed (two test files, 197 insertions, 4 deletions, after round 2)
tests/test_bump_leg_reachability_words.py:made_in_the_leg(project, name, on="HEAD")takes an optionalon, the commit the new commit is made on top of. Every existing call is unchanged.test_a_tag_at_a_descendant_of_the_commit_reaches_it: a commitmadeand a childaboveon top of it, on no branch of the leg's remote. The leg and the remote each tagabove(v1-w1019), made apart, in three kinds: both annotated (the reviewer's case J), leg lightweight and remote annotated, and the reverse. Both runs (dry run and real) refusemadebump-leg-commit-local-onlyin the TAG words, throughoriginand through--local-remote-dir(3 kinds x 2 routes = 6 rows), with nothing moved and the leg's own tag as it was. The premises say the tag names the child, that no tag is ATmade(for-each-ref --points-at), and, through shape_materialize.py: the fetch for a branch's answer leaves out every refspec of the repository's own onto the branches' names, whatever its source, and every one that puts a branch under a name not its own, sofamily.py bumpandbump-leg.pyno longer fail where the remote hasxandrelease/xand the repository's owngit fetch originworks (#1066) #1087'sonly_a_tag_reaches, that a tag of the remote reaches it, no branch does and no remote-tracking ref of the leg does.test_a_tag_at_an_ancestor_of_the_commit_alone_keeps_the_plain_words: the control (x 2 routes). The commit named is the child, and the leg and the remote tag only its parent. The plain words stay, "a pin the rest of the world cannot fetch" included.tests/test_family_bump_reachability_words.py:made_on(holder, env, parent, name): a commit never pushed, made in the mount on top ofparent, throughcommit_in_mount(which checksparentout first), so the holder stays clean.test_a_tag_at_a_descendant_of_the_commit_reaches_it: the same three kinds (3 rows), bothbump --dry-runand the realbumprefusemember-to-local-onlyin the tag words, with nothing moved and the mount's own tag as it was.test_a_tag_at_an_ancestor_of_the_commit_alone_keeps_the_plain_words: the control (1 row).No assert joins conditions with
andoror; each premise is its own assert. No README, docs, AGENTS.md or handbook text names these tests or their row counts (grep), so none changes.The mutants (rebased tree,
7e00834c's line numbers:bump-leg.py1205,family.py8869; each mutant restored, sha256 checked equal to HEAD)--points-atinbump-leg.py--points-atinfamily.py--mergedinbump-leg.py(extra: a check read the other way round)--mergedinfamily.py(extra)The failure is the one the issue names: the plain words ("is reachable from no branch of ...") where the tag words ("and a tag of ... reaches it, but no branch ... does") are expected. Logs:
r-mut-points-at-bump.log,r-mut-points-at-family.log,r-mut-merged-bump.log,r-mut-merged-family.log(andmut-main-*.logfor the 34 and 20 on2a119f28).Runs (through
run9.sh,EMAIL=service@opensoft.dev,GIT_SSH_COMMAND=false,GIT_CONFIG_GLOBAL=/dev/null, gh stubbed, at most two at once, never the full suite)On the pushed head
01fcb259:/usr/bin/git): the two test files, 66 passed (42 + 24; 34 + 20 before).tests/test_repo_hygiene.py,tests/test_agents_md_codes.py,tests/test_cli_reference.pyandtests/test_update_shape_kept_helper.py, 329 passed.On
1201680f(the same two files on top of16f9a0e8, before7e00834c, whose three files no row of mine touches or runs):test_bump_leg_fetch_refspecs.py,test_family_bump_fetch_refspecs.py), 102 passed; the two test files, 42 and 24 passed.$Q/v115/w764/git247/bin/gitfirst on PATH,git --versionprintedgit version 2.47.1): the two test files, 66 passed.No script changed, so no other test runs a changed script.
Merge-trees
git merge-tree --write-tree HEAD origin/mainagainst a re-fetchedorigin/main(7e00834c, which is also the merge base): exit 0, tree3a852e87fcfda41766ece8c1771e47689c622ad6, equal to this head's tree. Against16f9a0e8before the last rebase: exit 0 too.gh pr list --repo opensoft/openRepoShape --state open --json number,headRefName,isDraft,files: 8 (templates/assembly-root/project.yaml and templates/family-root/family.yaml: the comment abovevisibility:says it is the visibility the run asked for, and that a repository the run reuses keeps its own, where it said "this is all three repositories' visibility" (#913) #1102, scaffold-project.py: the--reuse-empty-repohelp, its docs and each remedy that sends a person into that re-run say ssh, a credential helper or askpass can still make it wait, and how to keep it from waiting (#915) #1101, family.py: a failed remove's by-hand lines spell a leg mounted at a path that is not UTF-8 as a printf word of octal escapes ending in a slash, sogit -C <member>/<leg>andsubmodule update -- <leg>typed in any POSIX shell name that leg (#1086) #1098, tests.yml: the full suite keeps its temporary files underrunner.temp, not/tmp, so it runs on Ubuntu 26.04 and thetestsjob goes back toubuntu-latest(#1096) #1097, adopt-project.py:checknames what the clone's.githolds as git keeps refs, and asks a pin's file through the links the root keeps, so a link into.gitor onto a pin's file is refused before any leg or adopted with the copy beside it (#904) #1091, shape_materialize.py, adopt-project.py and bump-leg.py: a tag a clone holds without its commit is one it cannot answer for,checksays a commit it cannot ask was not asked, and a pinned product YAML 1.1 or 1.2 reads as no text is quoted (#912) #1090, the family root's bootstrap.py:credential_adviceandended_onsay a member's failed clone ends git's update with 1 before any checkout but a leg's lets it go on, andkilled_saidsays git's update was itself killed, not that it went on (#1085) #1088, the family root's siblings.py: with a token in use, the clone and the fetch that carry it run in bootstrap.py'suntraced()environment, somake siblingsandfamily.py siblingswrite the token to no trace the caller asks git for (#1055) #1075). None touchestests/test_bump_leg_reachability_words.pyortests/test_family_bump_reachability_words.py, so there is no merge-tree to run against any of them.Round 2 (rv1107, NIT 2; NIT 1, the title, was the coordinator's)
originand prune rows), and a count goes stale with the next row.--points-atin place of--contains, the mutant M9 of bump-leg.py and family.py: the tag check compares the commits tags point to, so a lightweight or another annotated tag at the same commit reaches it (#982) #988's review, survived every row of this file." No row, assert or helper changed. The 54 in "What still held on main" above is the two files together, as it says.01fcb259, a fast-forward push, no rebase: headee48b5fe9693ebda099d1c0aadaca7bdc16b91c1, read back withgit ls-remote. Its tree is615e571bb62fd1cf481e4152278b0e3628bab059.run9.sh,EMAIL=service@opensoft.dev):tests/test_bump_leg_reachability_words.py42 passed,tests/test_family_bump_reachability_words.py24 passed. They ran on7186f3cf, the same tree as the pushed head; only the commit message was shortened after.origin/main(6da757cb, merge base7e00834c): exit 0, tree453566df33c886cf7fc2b1c39af02acbbff365dc. Main moved by nine files, none of mine; itsscripts/bump-leg.pychange (9 lines added) leaves_remote_tag_reachesand its--containsline alone (now line 1214).Closes #1019
🤖 Generated with Claude Code
Summary by Sourcery
Strengthen reachability tests for bump-leg and family so descendant-tag handling is validated and incorrect points-at or reverse-reachability implementations are caught.
Enhancements:
Tests: