You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
family.py: the NEXT push line is a forced refspec for a branch beginning with + and fails for a branch named like a tag, and a tracking branch of 251-255 characters passes --dry-run, dies at the first commit once every remote exists #689
Goal: the push line family.py prints names the branch by its full refname so it pushes what it says, and a tracking branch git cannot lock is refused before anything exists.
Filed by lane openRepoShape-5 on Brett Heap's word of 2026-10-16T12:17:02Z ("#459's family lines (~38)"), from lane 4's R421 lines on #459 (comment 6214566134, R421 O1, O2 and O4). Lane 4 judged each OPEN on 95780dd (clusters T6 and T17); re-read and probed on d4a7fab. #643 (landed, f1d71aa8) made init's own push use HEAD:refs/heads/<branch> (scripts/family.py:1920-1929); it left the NEXT line.
Lines (line numbers at d4a7fab)
R421 O1, family.py's NEXT push line is a forced refspec for a holder branch that begins with +._print_next (scripts/family.py:1180-1187, the push at :1184) prints git -C <holder> push -u origin <branch> with the bare branch. Probed on main: a holder on branch +x, a real add ends NEXT git -C <holder> push -u origin +x. R421 measured what pasting it does where an older local x exists and origin's x holds somebody's commit: + 77de599...261789e x -> x (forced update), overwriting origin's x and never pushing the add commit; without a local x it fails src refspec x does not match any (not re-run; the printed line is what was probed). Direction: print refs/heads/<b>:refs/heads/<b> (R421 measured that it pushes the named branch whatever is checked out, sets branch.<b>.merge and is immune to a same-name tag). The tests that read the line's last word move with it: tests/test_family_switch_branch_exists.py:195 and :504 (push[-1] == branch), tests/test_family_tracking_branch.py:158 and :308, tests/test_family_printed_quoting.py:167.
R421 O4, the NEXT push line, a bare git push -u origin <branch>, fails for a branch that shares its name with a TAG. Probed through the tool: a holder on branch v1 with a tag v1, remove ends NEXT git -C <holder> push -u origin v1, and pasted, error: src refspec v1 matches more than one, exit 1. Same fix as the line above; one change to _print_next. The update-shape.py and bump-leg.py halves (the same bare push) are lane 5's Tracking: update-shape.py and bump-leg.py, keeping a project's shape copies and leg pins current #458 lines.
R421 O2, a tracking branch of 251 to 255 characters passes checked_value (up to 255) and branch_problem, then the real run dies at the first commit with every remote already made. Probed on main with family.py init --tracking-branch <251 a's> --local-remote-dir ... --work-dir ...: --dry-run exits 0; the real run exits 2 with fatal: cannot lock ref 'HEAD': Unable to create '.../refs/heads/aaa….lock': File name too long, and r/Orbit.git and w/Orbit exist (R421: 250 characters works; the scaffold is the same). SAFE_ARG_RE allows 255 (scripts/repo_shape.py:106) and _branch_verdict / branch_problem (scripts/shape_materialize.py:1214-1275) ask git check-ref-format --branch, which has no length limit for this. Direction: have _branch_verdict refuse a branch with a /-separated component over 250 bytes (the name's file is <component>.lock, within the 255-byte file name limit NAME_MAX, :4392), so both tools refuse before anything exists through the one helper, refuse_bad_branch; a row with 250 (accepted) and 251 (refused) characters. This is the same class as scaffold-project.py and family.py init push the tracking branch as a bare refspec (git push -q -u origin <branch>), so --tracking-branch +x, a name git check-ref-format --branch accepts, passes --dry-run and then dies at git push -q -u origin +x (src refspec x does not match any, because a leading + in a refspec means force) after every remote exists #421's "after every remote exists".
Overlaps: none with an open PR. scripts/family.py and scripts/shape_materialize.py are not pinned copies. The bump-leg.py and update-shape.py NEXT lines are #458's.
Mark the three lines → this issue on #459, and tick them there when this closes.
CLAIMED — lane openRepoShape-4, session 11c6c0ef-495a-4a05-94cf-811b7b0a1012@Eagle, 2026-10-16T13:24:38Z, for #689
Logged in lanes/log/openRepoShape-4.md at 58d38ad49462e4edbbc6682e1d9b81f2ba17f7d8.
The three reads (lane-collision-protocol Rule 1):
1. existing `CLAIMED —` comments on opensoft/openRepoShape#689:
none
2. `gh pr list --repo opensoft/openRepoShape --state all --search "#689"`, kept where the row or its body names `#689`:
none
3. `git ls-remote --heads git@github.com:opensoft/openRepoShape` branches naming `689` as a whole token:
none
Activity
brettheap commentedon Oct 16, 2026
CLAIMED — lane openRepoShape-4, session 11c6c0ef-495a-4a05-94cf-811b7b0a1012@Eagle, 2026-10-16T13:24:38Z, for #689
Logged in
lanes/log/openRepoShape-4.mdat58d38ad49462e4edbbc6682e1d9b81f2ba17f7d8.The three reads (lane-collision-protocol Rule 1):
family.py: `_print_next`'s docstring says `init`'s own push names its…
render-cli-reference.py and tests/: the CLI reference's children writ…
shape_materialize.py: the length remedy says how git stores a branch …
update-shape.py: `apply`'s rollback line says to make a shut director…
family.py and shape_materialize.py: the NEXT push line names the bran…
Merge origin/main (bad05d2) into l3-563-docs
docs/release-notes/v1.1.0.md: entries for #748, #731, #810, #809, #816,