Repository navigation
Description
Six small defects in setup-project.py's printed text and its step checks, in one change.
From the v1.1.0 triage of the v1.0.0 known limits on #459. One pull request covers the lines below.
Lines
- setup prints
cd <clone>and the step-(7) backstop's paths unquoted; a space in--intosplits them. Where: setup-project.pyhand_over(:2169), backstop (:2022-2029). Effort S; all, mostly Windows. On main3121945:say(" cd %s" % clone)and the backstop'sdie(...)are still unquoted; the reach is ordinary, but the bar puts a NEXT-only harm in P2. (source) - Inside setup, the scaffold's "NEXT STEPS: git clone / cd / make bootstrap" prints before setup runs them. Where: scaffold-project.py :1519-1533; setup-project.py
scaffold(:1936). Effort S; all. On main3121945: Nothing silences the block under setup; any ordinary run reaches it, and the only harm is a NEXT line. (source) - A FILE at
<into>/<Family>passes step (3); three remotes are created, then aFileExistsErrortraceback. Where: setup-project.pyrefuse_a_taken_clone_path(:1793),os.makedirs(:1995). Effort S; all. On main3121945:lexists(<into>/<Family>/<Project>)is False under a file, andos.makedirs(parent)runs only after the scaffold. (source) - With
-- --dry-runpassed through, step (7) says "The three repositories WERE created" when none were. Where: setup-project.py step (7) (:2063-2067). Effort S; all. On main3121945: setup still never checks its passthrough for--dry-run(the only--dry-runis its own plan call, :1885). (source) - setup step (4) asks the naming check without a
--pinpassed after--: "no referent pin declared". Where: setup-project.pycheck_names(:1806-1823). Effort S; all. On main3121945:check_namesstill runs--explainon the three names only; the run continues correctly. (source) - auS1-12: upstream-org guard compares exactly, so
--org OpenSoftscaffolds into opensoft's namespace. Where: setup-project.py :1248, :1285. Effort S; all. On main3121945:UPSTREAM_ORGis compared with==at :1248 and :1285; this reaches only opensoft members, and one casefold fixes it. (source)
Rides along (backlog; tick it here if the same change covers it)
- The step-(7) backstop under
--local-remote-dirprints a recursive clone withoutprotocol.file.allow(source) - Under
--local-remote-dir, the scaffold's own NEXT STEPS clone lacks-c protocol.file.allow=always(source)
Note: A duplicate line about step (7)'s unquoted paths (#459, comment 6147244779) is closed into the first line here.
Each line above is marked → this issue on its tracking issue. Tick it there too when this closes.
The lines as written on the tracking issues
setup-project.pyprints paths unquoted in two of its own paste lines.
hand_overprintscd <clone>(setup-project.py:2169).<clone>is the absolute clone path under--into, or under the folder the run stands in.- Step (7)'s backstop (setup-project.py (behind setup.sh and
openRepoShape <Project>) checks the clone path<into>/<Project>only after all three repositories exist, so a person who follows README's "Rehearse first" and then runs for real in the same folder, where the rehearsal left./Atlas, gets three new GitHub repositories, a refusal, a printed hand clone that fails on the same./Atlas, and a re-run that is refusedscaffold-remote-exists#498,:2023-2029) prints "finish by hand in<parent>:", thengit clone --recurse-submodules <assembly>andcd <Project> && python3 scripts/bootstrap.py. Under--local-remote-dir,<assembly>is a filesystem path.- A folder with a space anywhere on those paths, such as
--into "/home/a b"or a Windows profile folder, gives acdorgit cloneline that the shell splits.- The project name itself is safe: by step (4) it has passed the naming policy (
contracts/repository-naming.yaml:376,^[A-Za-z][A-Za-z0-9]*$).- family.py:
initrefuses to land in the standard's checkout and names a runnablescripts/family.py, printed commands quote paths, andadd,bumpandremoverefuse the tracking branch and print their branch's push (#488, #486, #487) #507 (family.py and siblings.py print commands with unquoted paths, so under a folder with a space themember-git-dir-cachedremedy'srm -rfwould delete the wrong directory, andadd's push line fails #486) quotes only the family lines, with theshell_wordit adds tosetup-project.py. The two lines above predate both family.py:initrefuses to land in the standard's checkout and names a runnablescripts/family.py, printed commands quote paths, andadd,bumpandremoverefuse the tracking branch and print their branch's push (#488, #486, #487) #507 and setup-project.py: the clone path<into>/<Project>is refused in step (3), before anything is created, when anything at all stands there, naming the path and telling a rehearsal's leftover clone apart as one to move or delete, and the plan names the clone path before the yes, so rehearsing and then running for real in the same folder - README's own order - no longer creates three repositories and then refuses with a hand clone that fails on the same directory (#498) #509; the barecd %swas inhand_overbefore either.- Possible fix: pass
clone,parentand a path-valued<assembly>throughshell_word. Add a test that runs setup with a space in--intoand runs the printed lines.
AT-scaffold N6: inside setup, the scaffold's own "NEXT STEPS: git clone / cd / make bootstrap" block (scaffold-project.py:1524-1536) prints before setup does those very steps itself.
— #459, body
A FILE standing where the clone's parent folder should be (
<into>/<Family>with--family) passes step (3). All three remotes are then created, and the run dies with aFileExistsErrortraceback atsetup-project.py:1974instead of aREFUSED:line.
— #459, comment
With
-- --dry-runpassed through, step (7)'s refusal says "The three repositories WERE created" when none were.
— #459, comment
AT-scaffold N2: setup's step (4) never asks the naming validator about a
--pinpassed through after--(check_names, setup-project.py:1523-1545 runs--explain <Project> <Project>-spec <Project>-codeand nothing else), so the report says "no referent pin declared" and step (5)'s plan then says domain-descendant.
— #459, body
auS1-12: the upstream-org guard compares exactly:
org == "opensoft"(setup-project.py:1280), and the origin check at:1243does the same. So--org OpenSoftpasses with no refusal, and since GitHub resolves an organisation login case-insensitively, a person with create rights scaffolds into opensoft's namespace. AGENTS.md:30-32 and README.md:336-338 say it refuses--org opensoft. The fix is to casefold the comparison.
— #459, comment
The step (7) recovery in
--local-remote-dirmode prints a hand recursive clone without-c protocol.file.allow=always, which a clone of local legs needs.
— #459, comment
AT-scaffold N1: under
--local-remote-dirthe scaffold's own NEXT STEPS clone (scaffold-project.py:1524-1529) fails withtransport 'file' not allowed, because setup adds-c protocol.file.allow=alwaysfor its own clone (setup-project.py:1692) and the printed line does not. Test path only.
— #459, body
Activity
brettheap commentedon Oct 14, 2026
CLAIMED — lane openRepoShape-2, session 81650e29-c906-4fe8-96c9-55580bfe0c44@Eagle, 2026-10-14T22:31:21Z, for #538
Logged in
lanes/log/openRepoShape-2.mdata5c248c163711a4a37b223d61fbf6852e63a50a8.The three reads (lane-collision-protocol Rule 1):
setup-project.py: the paste lines it adds or changes are spelled for …
tests/test_setup_by_hand_commands.py: `what_setup_runs` asserts the r…
tests/conftest.py, tests/test_setup_project_py.py, tests/test_setup_s…
Merge main 526cd2c (#582, #523) into fix/522-adopt-nondefault-leg-paths
Merge main 66267f0 (#589, #582, #576 and eleven more) into fix/540-pi…
merge main 396c0ff (#570) so the PR's CI merge ref and this fix round…