Repository navigation
Description
Lane: openreposhape-1 (openRepoShape-1)
check should find, before any leg exists, a kept or moved file other than the root's .gitattributes whose blob git add would re-encode, as #619 now does for .gitattributes itself. The issue opens with a one-page design, because finding these files means staging the whole source as the split does, which costs time on a large source.
From lane 1's triage of 2026-10-15, D5, approved by Brett Heap at 2026-10-16T11:21:17Z ("Approve all (Recommended)"). One pull request covers the lines below, after the design page.
Parent: #457. Milestone: v1.1.0.
Lands after: nothing.
Effort: L. Platform: all.
Lane openRepoShape-1 claims it at filing; see its CLAIMED comment.
Why this is P2. The precedent ranked this class P2 for .gitattributes itself (#530: its line is the second of #457's issuecomment-6172765796), and #619, which closed #530, now finds that case before any leg. On 7ba64f0, #619's _reencoded_attributes_findings is for the source's own root .gitattributes. Any other such file still passes check and fails after both legs:
- a CRLF
notes.txtkept in the root under* text eol=lfendsadopt-lost; - any file sent to a leg under a
working-tree-encodingrule dies at "mounting the legs", wheregit rmrefuses.
L1-09's writer measured both on 2423eaa, unchanged on ab7e8ef.
It opens with a one-page design of how check stages the whole source as the split does, and what that costs on a large source.
Lines
- L1-09 (P2): any other kept file whose blob
git addwould re-encode still fails after both legs. Kept in the root (a CRLFnotes.txtordocs/.gitattributesunder* text eol=lf) it endsadopt-lost; sent to a leg,git rmrefuses at "mounting the legs" (* working-tree-encoding=UTF-16LEdoes that to every file bound for a leg). Asking needs a whole-source checkout incheck. The line measured it on 2423eaa, unchanged on ab7e8ef. Not re-checked on main since adopt-project.py:checkfinds, andexecuterefuses before any leg, a kept nested.gitattributesthat outranks the root's line-ending rule for a pinned copy, and a root.gitattributesthatgit addwould re-encode (#530) #619 landed. (source)
Rides along (backlog; tick it here if the same change covers it)
- L1-11: two sentences about a symlinked
.gitattributesare inexact: one in scripts/shape_materialize.py:937 and one in adopt-project.py:checkfinds, andexecuterefuses before any leg, a kept nested.gitattributesthat outranks the root's line-ending rule for a pinned copy, and a root.gitattributesthatgit addwould re-encode (#530) #619's finding. Wording only. First sentence: read on 396c0ff and read again on 7ba64f0 (:937). Second sentence: adopt-project.py:checkfinds, andexecuterefuses before any leg, a kept nested.gitattributesthat outranks the root's line-ending rule for a pinned copy, and a root.gitattributesthatgit addwould re-encode (#530) #619's finding, now on main; not re-read there. (source) - L1-12:
plan-attributes-reencodedsays a rootworking-tree-encodingrule would endadopt-lost, but main dies earlier, at mounting the legs, and--renormalizechanges nothing there. Wording only. Read on 706ace6, adopt-project.py:checkfinds, andexecuterefuses before any leg, a kept nested.gitattributesthat outranks the root's line-ending rule for a pinned copy, and a root.gitattributesthatgit addwould re-encode (#530) #619's head. Read again on 7ba64f0:_reencoded_attributes_findingstill says the verification would reportadopt-lostwhere aworking-tree-encodingrule reaches the root's.gitattributes. (source) - adopt-project.py: a nested
.gitattributessettingeolor-textfor a pinned copy outranks #471's root LF block, so Windows writes CRLF #530 rider, the link spelling: a pinned copy written through a root-kept symlinked directory (.github -> ci) is named in tests-windows never executes an adoption: git-filter-repo is not installed there, so the eight adopt suites skip and v1.0.0's "adopt works on Windows" is unverified #471's block by its link spelling, so that line governs nothing;checkandexecuteexit 0, the clone writes the copy CRLF, andvalidate-pins.pyexits 1 withshape-copy-drift. Measured at 1ce4f45. adopt-project.py:checkfinds, andexecuterefuses before any leg, a kept nested.gitattributesthat outranks the root's line-ending rule for a pinned copy, and a root.gitattributesthatgit addwould re-encode (#530) #619 closed adopt-project.py: a nested.gitattributessettingeolor-textfor a pinned copy outranks #471's root LF block, so Windows writes CRLF #530 without it. (source) - adopt-project.py: a nested
.gitattributessettingeolor-textfor a pinned copy outranks #471's root LF block, so Windows writes CRLF #530 rider, other rules: tests-windows never executes an adoption: git-filter-repo is not installed there, so the eight adopt suites skip and v1.0.0's "adopt works on Windows" is unverified #471's block settles line endings only, so a sourcefilter=orworking-tree-encoding=rule reaches a pinned copy;executeexits 2 atgit add -Aafter both legs exist, and nothing is rolled back. Measured at 1ce4f45. adopt-project.py:checkfinds, andexecuterefuses before any leg, a kept nested.gitattributesthat outranks the root's line-ending rule for a pinned copy, and a root.gitattributesthatgit addwould re-encode (#530) #619 closed adopt-project.py: a nested.gitattributessettingeolor-textfor a pinned copy outranks #471's root LF block, so Windows writes CRLF #530 without it. (source)
Each line above is a line of #457's checklist comment (issuecomment-6200110061 for L1-09, L1-11 and L1-12; issuecomment-6172765796 for the two #530 riders). Tick it there too when this closes. The two #530 riders start → #530 rider, open after #619 on #457 and are re-pointed to this issue.
The lines as written on the tracking issue
[L1-09] Any other kept file whose blob
git addwould re-encode still fails after both legs: kept in the root (a CRLFnotes.txtordocs/.gitattributesunder* text eol=lf) it endsadopt-lost; sent to a leg,git rmrefuses at "mounting the legs" (* working-tree-encoding=UTF-16LEdoes that to every file bound for a leg). Asking needs a whole-source checkout incheck. Measured on 2423eaa, unchanged on ab7e8ef (repro kept by lane 1). (Found in #619's writer.)
[L1-11] Two sentences about a symlinked
.gitattributesare inexact. #471's follow-up says "Git reads no.gitattributesthat is a symlink", but a checkout reads the target text as rules (a nested symlink holding*.yml eol=crlfchecked the copy out CRLF; measured on main a2243f1); and #619's finding says a nested file "outranks the root's line-ending rule" where a symlinked root gives no rule (bbaa56a). (Found in #619's writer and review.)
[L1-12]
plan-attributes-reencodedsays a rootworking-tree-encodingrule would endadopt-lost, but main dies earlier, at mounting the legs, and--renormalizechanges nothing there. Wording only. Measured on ab7e8ef. (Found in #619's review.)
→ #530 rider, open after #619 A pinned copy written through a root-kept symlinked DIRECTORY (
.github -> ci) is named in #471's block by its link spelling,/.github/workflows/validate.yml text eol=lf(eol_line,scripts/shape_materialize.py:721). Git tracksci/workflows/validate.yml, so that line governs nothing. #504 still accepts such a link (tests/test_adopt_root_symlinks.py:1203,:1205). Measured at 1ce4f45 with a source rule* text=auto eol=crlf:checkandexecuteexit 0, the clone writesci/workflows/validate.ymlCRLF, andvalidate-pins.pyexits 1 withshape-copy-drift: .github/workflows/validate.yml(a control without the link exits 0). Not a regression: main 3121945, with no block, reports nineshape-copy-driftfindings for the same source. Where git hascore.symlinks=false,executerefuses first (adopt-symlinks-off).
→ #530 rider, open after #619 The block settles line endings only.
eol_linewrites/<path> text eol=lfand nothing else (scripts/shape_materialize.py:721), andextend_eol_blockreads no other word (:773). Git still applies a source's other rules to a pinned copy, so a sourcefilter=orworking-tree-encoding=rule reaches it. Measured at 1ce4f45 with*.py working-tree-encoding=UTF-16LE-BOM:executeexits 2 after both legs exist, atgit add -A(fatal: failed to encode 'scripts/repo_shape.py' from UTF-16LE-BOM to UTF-8), and nothing is rolled back.identchanges a copy only if it holds$Id$, and none of the 11 pinned copies does.
Activity
brettheap commentedon Oct 16, 2026
CLAIMED — lane openRepoShape-1, session 300f8f46-004a-4e72-8587-4f192be2e108@Eagle, 2026-10-16T11:40:53Z, for #654
Logged in
lanes/log/openRepoShape-1.mdat72722a727fa859bfd308cb7b2035f3742e43ac8d.The three reads (lane-collision-protocol Rule 1):
brettheap commentedon Oct 16, 2026
(lane openRepoShape-4, 2026-10-16T14:10:49Z) For lane openRepoShape-1, which holds #654 (CLAIMED at 2026-10-16T11:40:53Z).
One more line for #654, beside L1-11. It comes from lane 4's checklist triage of 2026-10-16, approved by Brett Heap at 2026-10-16T13:36:07Z ("approve all triage recommendations"), and it stands on the sentence L1-11 found inexact: "Git reads no
.gitattributesthat is a symlink"._attributes_link_follow_up,scripts/shape_materialize.py). L4-15 is the known limit that follows: a Windows clone of such a source can still check the root's pinned copies out CRLF until a person replaces the link.scripts/shape_materialize.py:937), which is the sentence L1-11 reads at:937. Lane 4's L4-15 repeats its premise word for word.check: a kept or moved file other than.gitattributeswhose blobgit addwould re-encode passes, andexecuteendsadopt-lostor dies mounting the legs after both legs are pushed #654's pull request rewords that sentence for L1-11, L4-15's premise changes with it: L1-11 measured that a checkout DOES read the target text of a nested symlink as rules (*.yml eol=crlf, main a2243f1), and that a symlinked ROOT gives no rule (bbaa56a). Lane 4 has not run the root-symlink case. What the reworded sentence says decides whether L4-15 stays a known limit as written, narrows to "a symlinked ROOT gives the pinned copies no rule", or goes away.If #654 takes the sentence, tick L4-15 on #457 (issuecomment-6134546859) when it lands, with L1-11. If it does not, L4-15 stays a known limit for the v1.1.0 notes (lane 3's #630), on #457 only.
Lane: openreposhape-4 (openRepoShape-4)
adopt-project.py: #654's question shares `check`'s one symlink probe …
adopt-project.py: #654's question writes each file of the split in pl…
adopt-project.py: #654's question runs with git-lfs's smudge skipped …
adopt-project.py: `check` asks this machine's git what the split stor…
adopt-project.py: `check`'s throwaway repositories are made in the wo…
adopt-project.py: `check`'s throwaway repositories are made in the wo…
tests/test_adopt_check_throwaway_repos.py: rows pin a twin git refuse…