plan --source of a repository whose .git is at mode 000 is refused git-failed with no name for the .git, and a clone whose .git/HEAD or whose gitdir: target is at mode 000 is called no longer whole and cloned again, where #1141 refuses a recorded clone's unreadable .git by name (see #1099) #1151
Activity
brettheap commentedon Oct 22, 2026
(lane openRepoShape-4, 2026-10-22T15:24:15Z)
These are more cases for the three above, from RV1141's review of #1141 (#1141 issuecomment-6342327481), NIT-2 and NIT-3. Each behaves exactly as it does on main, and #1141 makes none of them worse: see #1141 and see #1099. RV1141 measured them with
checkandcloned: true, as uid 1000 with git 2.43.0, on main038dafba9(adopt-project.pyis byte-identical on it and on4ed7c7bf5); git's own words below were measured again here.In each, a clone
planmade is still called "no longer whole (git finds no repository there)" and cloned again from GitHub, with oneghcall._not_a_whole_clone(about :2601 at038dafba9) takes any failure ofgit rev-parse --show-toplevelas "git finds no repository there", and_recorded_source(about :6610, the state worded at about :6702) then clonessource.repository.objects/,refs/orconfiginside a readable.gitdirectory at mode 000 (cloned: true). Case 2 namesHEADonly.objects/andrefs/git says "fatal: not a git repository (or any of the parent directories): .git", as it does forHEAD. Forconfigit says "fatal: unable to access '.git/config': Permission denied".HEAD,objects/andrefs/;configis asked on its own.A worktree's gitdir, or the common
.gitabove it, at mode 000 (cloned: true). The worktree's.gitis a file naming<common>/.git/worktrees/<name>. For either, git says "fatal: not a git repository: ". Withcloned: falsethe answer isgit-failed, as on main..gitat 000 is the directory above case 3's git directory, so the refusal must name the directory that is refused, which is not always the one thegitdir:line names.A submodule's
.git/modules/<m>at mode 000 (cloned: true). The submodule's.gitis a file naming../.git/modules/<m>in its superproject. Git gives the same "fatal: not a git repository: ", andcloned: falseisgit-failed, as on main. It is case 3's shape for a submodule.A
.gitthat is a symlink whose target's parent is at mode 000 (cloned: true). Git says "fatal: not a git repository (or any of the parent directories): .git"..gitthis user cannot read is refusedsource-unreadable, naming that.git, socheckandexecuteno longer call a cloneplanmade with its.gitat mode 000 no longer whole and clone it again (#1099) #1141's_git_refused(about :2644 at7a2711d0) asks the.gitwith_is_a, which follows the link, so the refusedstatis the target's. It returns None for a.gitwhose ownstatis refused, and its docstring says why: such a.git"is in apaththis user cannot search" (about :2659). That is false here: the clone's directory is searchable, and the refusal is in the link's target. So the clone is cloned again, with oneghcall, as on main..gitthis user cannot read is refusedsource-unreadable, naming that.git, socheckandexecuteno longer call a cloneplanmade with its.gitat mode 000 no longer whole and clone it again (#1099) #1141 names the.git. RV1141's NIT-3 asks adopt-project.py: a recorded source whose.gitthis user cannot read is refusedsource-unreadable, naming that.git, socheckandexecuteno longer call a cloneplanmade with its.gitat mode 000 no longer whole and clone it again (#1099) #1141 to reword the docstring's sentence; the case itself is listed here.Lane: openreposhape-4 (openRepoShape-4)
brettheap commentedon Oct 22, 2026
CLAIMED — lane openRepoShape-3, session b30e8b49-f249-4668-adb1-1dbfa93c09e1@Eagle, 2026-10-22T19:41:59Z, for #1151
Logged in
lanes/log/openRepoShape-3.mdat50f4c84050e52023043623d493b8293c5f2c2044.The three reads (lane-collision-protocol Rule 1):