Repository navigation
adopt-project.py: check takes --local-remote-dir and resolves each relative submodule url the plan keeps in a leg from the bare repositories execute --local-remote-dir would create there, so under that test path check no longer refuses an adoption execute verifies, or passes one execute refuses, over such a url (#417) - #718
Merged
Merged
Conversation
…h relative submodule url the plan keeps in a leg from the bare repositories `execute --local-remote-dir` would create there, so under that test path `check` no longer refuses an adoption `execute` verifies, or passes one `execute` refuses (#417) Since #245, `check` resolved a kept submodule's relative url from the leg's GitHub remote, while `execute --local-remote-dir` resolved it from the bare repository it is about to create. `check` had no flag to ask the same question, so in #417's layout A (the source's `origin` and the dependency beside the local legs) it found `plan-submodule-relative-url` over an adoption that verifies and clones, and in layout B (an `origin` on GitHub) it said `plan ok` over a plan `execute` refuses. `check` now takes `--local-remote-dir` and passes it to `_entry_findings`, as `execute` does, so given the same directory the two give one verdict, line for line. It is read with `getattr`, as `work_dir` is. With it, `check` prints the topics line of the run it checks, and still names in #418's NOTE a url on a network it never asks. #190's and #245's resolution logic, and one finding per cause, are unchanged. The NOTE, both remediations, the refusal's first line and the docstrings that said `check` always resolves from GitHub's remotes now say where each run resolves from. docs/cli.md is regenerated. Lane: openreposhape-1 (openRepoShape-1) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reviewer's GuideThe PR makes Sequence diagram for matching check and execute local remote resolutionsequenceDiagram
participant User
participant Check as check
participant Findings as _entry_findings
participant Remotes as _remote_urls
participant Execute as execute
participant Disk as local_remote_dir
User->>Check: --local-remote-dir
Check->>Findings: _entry_findings(plan, source, local_remote_dir)
Findings->>Remotes: resolve relative submodule URL
Remotes->>Disk: read bare repository path
Disk-->>Remotes: leg remote URL
Remotes-->>Findings: resolved URL
Findings-->>Check: findings and topics
Check-->>User: plan ok or FINDING
User->>Execute: --local-remote-dir
Execute->>Findings: _refuse_what_check_finds(..., local_remote_dir)
Findings->>Remotes: resolve relative submodule URL
Remotes->>Disk: use remotes this run would create
Disk-->>Remotes: leg remote URL
Remotes-->>Findings: resolved URL
Findings-->>Execute: matching findings
Execute-->>User: verify or refuse before creating legs
Flow diagram for check local remote resolution modesflowchart TD
Start["check"] --> Flag{"--local-remote-dir given?"}
Flag -->|No| GitHub["Resolve relative submodule URLs from GitHub leg remotes"]
Flag -->|Yes| Local["Resolve relative submodule URLs from bare repositories in local_remote_dir"]
GitHub --> Findings["_entry_findings"]
Local --> Findings
Findings --> Output["Print findings, remediation, and WHAT WILL HAPPEN"]
Local --> Topics["Print topics skipped for local remotes"]
Output --> Verdict["check verdict"]
File-Level Changes
Assessment against linked issues
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
check takes --local-remote-dir and resolves each relative submodule url the plan keeps in a leg from the bare repositories execute --local-remote-dir would create there, so under that test path check no longer refuses an adoption execute verifies, or passes one execute refuses (#417)check takes --local-remote-dir and resolves each relative submodule url the plan keeps in a leg from the bare repositories execute --local-remote-dir would create there, so under that test path check no longer refuses an adoption execute verifies, or passes one execute refuses, over such a url (#417)
brettheap
marked this pull request as ready for review
October 16, 2026 17:18
|
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 33 minutes by commenting |
This was referenced Oct 16, 2026
|
brettheap
pushed a commit
that referenced
this pull request
Oct 16, 2026
Conflicts in adopt-project.py (check's `--source` help beside main's new `check --local-remote-dir`, #718/#417) and docs/cli.md: both arguments are kept, in the order --plan, --source, --local-remote-dir, --work-dir, and docs/cli.md is regenerated with scripts/render-cli-reference.py. check's `--work-dir` help is reworded so every code sits whole on one 80-column line in the narrower help column (r652's F3). Lane: openreposhape-1 (openRepoShape-1) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap
added a commit
that referenced
this pull request
Oct 16, 2026
…n any spelling is cloned by its name, the plan records `source.cloned`, and a clone no plan records is removed, so a recorded clone that is gone or emptied is refused or cloned again for what it is (#652) (#749) `adopt-project.py` had five failures with `--source` and the clones it makes: - `--source acme/Atlas` was read as the directory `./acme/Atlas` when one existed, and nothing was cloned. - `acme/Atlas/` was cloned into the work directory's `source-readonly/` itself. - A recorded clone that was gone was refused `source-unclonable`, with a `gh auth status` hint. One a cleaner had emptied was refused `git-failed`. - A moved clone from another host was cloned again from github.com. - The clones `plan` and `check` made were never removed. This is #652: #457's L1-22, L1-23, L1-24, L1-26 and L1-27, with L1-43. Now: - **`--source` is read by its spelling.** - An `org/repo` that is also a directory here is refused as `source-ambiguous`, which names both `./org/repo` and the github.com url. - A trailing `/`, `//` and one `.git` are dropped. - A github.com url, `github.com/o/r` or `git@github.com:o/r.git` names `o/r`. `gh` is handed exactly `o/r`, and the plan records it. - A url on another host is `source-unresolvable`. - **The plan records `source.cloned`.** - A plan written before this has no such key. It reads as `false` and is never cloned again. - A clone `plan` made that is gone, or no longer whole, is cloned again from GitHub. - Any other recorded path that is gone is `plan-source-gone`, whose remedy names `--source`. - **`plan` and `check` remove a clone they made that no plan records,** in `main`'s `finally`. - They remove only that clone's recorded real path under the work directory's own `source-readonly/`. - They never remove through a symlink, even one swapped in during the run. - They never remove a path the person passed, and never anything once the plan is written. - A removal that fails is named in a NOTE. - **`execute` keeps its clone.** A re-run into the same `--work-dir` is refused by name, as `adopt-work-dir-occupied`. Tests: tests/test_adopt_source_clone_record.py is new, with 50 cases. Of the first round's 45, 42 fail on the base. The 3 that pass guard what must never be removed. Each change reverted alone fails at least one test. The 24-row revert table is in the PR. Review: the adversarial review found six defects in the first head. Two of them were in what the run removes: - a work directory swapped for a symlink during the run; - a `plan` cut short after it had written its plan. The fix round fixed all six, each shown fixed by a probe or a test. The re-verification found it PR-READY. Its edge cases outside #652 go to #457's checklist. The branch merged main twice by hand and was never rebased: - first 2fac979; - then 66b230e, which met #718's `check --local-remote-dir` beside `check --source`. Both are kept, and docs/cli.md is regenerated. Its head cecc7e0 already holds main, so it lands as its own tree. That head is green on Linux, Git Bash and SonarCloud. The full suite passed on its tree in lane 1's gate: 200 test files, 11,570 passed and 33 skipped. Closes #652 Lane: openreposhape-1 (openRepoShape-1) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap
pushed a commit
that referenced
this pull request
Oct 17, 2026
main gained 25 pull requests since de92614: #634, #699, #671, #719, #701, #717, #700, #702, #722, #720, #725, #721, #728, #705, #727, #718, #744, #743, #749, #740, #737, #734, #742, #751 and #736. No conflict: AGENTS.md, adopt-project.py and docs/cli.md merged as text, and README.md and docs/handbook.html are unchanged by the merge. README.md is 1473 lines, its cap; AGENTS.md 494, its cap; every handbook marker is current; `render-cli-reference.py --check` is ok. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap
pushed a commit
that referenced
this pull request
Oct 17, 2026
…es every reason THIS checkout cannot answer, and the notes are current to main bf1f099 with the 25 pull requests since de92614 (#563, #683) - W683 and RV-f's N4 on #742: README's exit-3 list (Keeping a project's shape current, :1208-1220) and its handbook twin (`doctor`) named only a pin whose commit this checkout does not carry. They now say, as shape-doctor.py's EXIT CODES does: a pin's commit it lacks, a partial clone missing what is compared (#683), a read that fails (`update-upstream-unreadable`), a crashed validator of its own (#278, #410), or its own naming policy not loading (#678). +1 line, with tests/readme-cap.d/683.txt; README.md is 1474, its cap (1422 + 2 + 5 + 12 + 22 + 10 + 1). The two `Keeping a project's shape current` markers move: `doctor` text and marker, `current` marker only. - The notes, "What changed since v1.0.1", one entry per pull request from `git log --first-parent de92614..bf1f099`, each from its squash commit and the issues GitHub says it closes: - adopt-project.py: #699, #719, #749, #727, #717, #728 (with #621's hint), #743 + #720 + #718, #722, #721; - update-shape.py, bump-leg.py and a project's own scripts: #702 (with the pinned validators), #634; - scaffold, setup, family and the shared readers: #725, #671, #744; - shape-doctor.py: #742, #701, #737, #751, #736, #734, #700 + #705, #740; - install, CI and the docs: the exit-3 sentence above. - Counts (99 pull requests since bfed143; 109 of 135 milestone issues closed at 10:28Z), the "current to main" sha and the open list (26) are at main bf1f099, still placeholders for tag time. Left for round B: lane 5's eight lines (#630 issuecomment-6227129879), whose pull requests #726, #747, #682, #724, #746, #745 and #738 are open drafts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 17, 2026
brettheap
pushed a commit
that referenced
this pull request
Oct 17, 2026
…d A3 (three SHOULDs, four nits), and notes entries for the seven pull requests landed since bf1f099, current to main 2000488 (#563, #683) Round A4, from lane 2's review (#630 issuecomment-6233033833, READY): - SHOULD 1: the doctor's exit-3 list names "a validator of its own that crashed or could not be run", so the case of one that cannot be given its `PYTHONPATH` (shape-doctor.py's EXIT CODES, #278) is listed too: README.md:1208-1222, its handbook twin (`doctor`) and the notes' docs line. The paragraph re-wraps to one more line: tests/readme-cap.d/683.txt is +2, and its text now says which causes the EXIT CODES block names and that #742 added the partial clone and #701 the naming policy. README.md is 1475 lines, its cap (1422 + 2 + 5 + 12 + 22 + 10 + 2). Both `Keeping a project's shape current` markers move to c728c970: `doctor` text and marker, `current` marker only. - SHOULD 2: #727's entry names the leg description, whose em dash stopped every `execute` against GitHub at the first leg. - SHOULD 3: #749's entry names `source-ambiguous`, for an `org/repo` that is also a directory here. - Nits: the doctor section's three near-duplicate pairs are merged (#636 with #737, #632 with #700 and #705, #586 with #736); #718 has its own bullet; #634's entry names `git_out`'s spelling for every caller and #744's the gate's `--link-source-label` and `--link-remedy`; the header comment says 2026-10-17 at main 2000488. Wave B1, `git log --first-parent bf1f099..2000488`: #706 (#664), #703 (#696), #670 (#646), #682 (#648), #726 (#667), #730 (#666) and #724 (#665), each from its squash commit; #726's and #682's from lane 5's lines (#630 issuecomment-6227129879), #682's with the unmerged `.gitmodules` its last round added, and #724's with lane 5's note that v1.0.0's test-hygiene line on the generator's `.pyc` files closes. The counts (106 pull requests; 116 of 135 milestone issues closed at 11:53Z), "current to main" and the open list (19) are at main 2000488, still placeholders. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Lane: openreposhape-1 (openRepoShape-1)
Claim: #417 (comment)
What
adopt-project.py checktakes--local-remote-dir: the directoryexecute --local-remote-dirwill be given. With it,checkresolves each relative submodule url the plan keeps in a leg from the bare repositoryexecutewould create there, asexecutedoes. Given the same directory, the two commands now give one verdict, line for line, in both of the issue's layouts.cmd_checkreads it withgetattr(args, "local_remote_dir", None), as_work_rootreadswork_dir(tests/test_adopt_entry_paths.py callscmd_checkwith aNamespacethat has no such attribute), and passes it to_entry_findings. That is the one listcheckprints andexecute's_refuse_what_check_findsrefuses._relative_url_findingsalready took the directory, and already drops its NOTE when it is set. adopt-project.py keeps a source submodule's relativeurl = ../xunchanged in the leg, where git resolves it against the leg's remote, soexecutesaysadoption verifiedand the assembly's recursive clone fails unless the dependency happens to sit beside the leg #190's and adopt-project.py: a relative.gitmodulesurl the plan keeps in a leg is resolved from the source's remote and from the leg's, and where the two differcheckfinds it andexecuterefuses before any leg exists, so a recursive clone no longer fails afteradoption verified(#190) #245's resolution logic is unchanged, and so is one finding per cause.check'sWHAT WILL HAPPENblock prints the topics line of the run it checks,topics skipped for local remotes, through thelocalparameter_print_what_will_happenalready had.adoption verifiedwhen a submodule the plan keeps in a leg has a url that names no repository (a relative url that resolves alike from the source and the leg, or an absolute one), so the recursive clone itsNEXT:line prints fails; nothing asks whether the url answers #418's NOTE. Given the flag, the NOTE about urlscheckdoes not ask still names a url on a network._unanswered_url_findingsdropped that NOTE wheneverlocal_remote_dirwas set. Onlyexecuteever passed one, andexecuteprints no NOTEs, so the condition first mattered oncechecktook the flag. It is gone, with the parameter it used.checkresolves from GitHub's remotes as before. Its findings and exit codes are unchanged, and so is everything it prints, but for the reworded NOTE and the two reworded remediations below.check --local-remote-dirmakes no directory and no leg. It reads the disk there only for adopt-project.py saysadoption verifiedwhen a submodule the plan keeps in a leg has a url that names no repository (a relative url that resolves alike from the source and the leg, or an absolute one), so the recursive clone itsNEXT:line prints fails; nothing asks whether the url answers #418's question: whether each relative url, resolved from the bare repositoriesexecutewould create there, names a repositorygit ls-remotereaches.Wording. Each place that said
checkalways resolves from GitHub's remotes now says where each run resolves from:checkprints when every relative url names one repository from GitHub's legs now ends: "...a url that names another repository;check, given the same--local-remote-dir, resolves it there too."RELATIVE_URL_REMEDIATIONnow ends: "checkandexecuteresolve it from the leg remotesexecutewould create: the GitHub repositories the plan'sorg:names, or, under--local-remote-dir, the bare repositories there, whichcheckasks only when given the same--local-remote-dir.executeresolves it again before it creates any leg." It used to say thatcheck'splan ok"settles nothing" there.URL_ANSWERS_NOTHING_REMEDIATION(adopt-project.py saysadoption verifiedwhen a submodule the plan keeps in a leg has a url that names no repository (a relative url that resolves alike from the source and the leg, or an absolute one), so the recursive clone itsNEXT:line prints fails; nothing asks whether the url answers #418) now ends: "a relative one is resolved from the leg's remote, which is on GitHub, or, under--local-remote-dir, the bare repositoryexecutewould create there."execute --local-remote-dir's refusal (_as_resolved_here): "N finding(s) in , ascheckprints them given the same --local-remote-dir, with each relative submodule url resolved from the leg remotes this run would create there:"._FromTheLeg,_relative_url_findings,_unanswered_url_findings,_entry_findings,_remote_urls,_refuse_what_check_finds,_as_resolved_here, and the comments "WHEREcheckASKS" (split branch, adopt-project.py:plan,checkandexecutenever look for the plan's split branch (adopt/three-repo-shape) in the repository the split is pushed to, so a re-run after an earlier run left it passescheck, creates both legs, and dies at a non-fast-forward push of the split #320) and "THE CLONE URL ISexecute'S OWN". The first said thatcheckdoes not know whether--local-remote-dirwill be passed, and the second thatcheckhas no such flag; both now say thatcheck's own flag is not read there.docs/cli.mdis regenerated withscripts/render-cli-reference.py, socheck's usage and options list the flag.tests/test_cli_reference.pypasses.Why (repro on main)
The issue's script, with a
check --local-remote-dirline added and--project Thingin layout B (since #499,planrefuses--project Northwindthere asadopt-not-the-source, the source'soriginbeingtestorg/Thing), run on mainda48256c(the branch's base) and again on this branch's head. Main78fe3fffprints the same lines asda48256c, and this branch merged with it the same lines as the head. git 2.43.0, Python 3.12.3, local only, with a stubghfirst onPATH,GIT_CONFIG_GLOBAL=/dev/nullandGIT_ALLOW_PROTOCOL=file.<T>is the run's scratch directory.On main:
On this branch:
In layout B,
check --local-remote-dir's finding and the line underexecute's refusal are the same text:How
main():checkgains--local-remote-dir(type=Path, default None), asexecutehas it.cmd_check:local_remote_dir = getattr(args, "local_remote_dir", None), passed to_entry_findingsand, aslocal, to_print_what_will_happen._unanswered_url_findings: drops itslocal_remote_dirparameter and the condition that dropped the NOTE under one._submodule_findingscalls it without the parameter.docs/cli.md.Tests
New and changed tests, in tests/test_adopt_relative_submodule_url.py and tests/test_adopt_submodule_url_answers.py:
test_check_and_execute_given_one_local_remote_dir_agree[A-local-origin, B-github-origin]. These are the issue's two layouts end to end (they needgit filter-repo).checkwith no flag gives the opposite verdict in each. Given the directory,check's FINDING lines equalexecute's. In A,checkpasses,executeverifies and the recursive clone checks the dependency out. In B,checkexits 1,executeexits 2, and neither makes a leg.test_check_given_local_remotes_still_notes_a_url_on_a_network. Undercheck --local-remote-dir, adopt-project.py saysadoption verifiedwhen a submodule the plan keeps in a leg has a url that names no repository (a relative url that resolves alike from the source and the leg, or an absolute one), so the recursive clone itsNEXT:line prints fails; nothing asks whether the url answers #418's NOTE still names anhttps://urlcheckdid not ask.git filter-repo):test_execute_resolves_again_from_the_remotes_it_would_create(x4, layout B):check --local-remote-direxits 1 with the refusal's FINDING lines, makes nothing, and the refusal's new first line and remediation are asserted.test_a_relative_origin_resolves_from_the_source_working_tree(x2, layout A):check --local-remote-dirpasses for the directory beside the dependency and printstopics skipped for local remotes; for another directory it finds, line for line, whatexecuterefuses.test_execute_refuses_a_relative_url_that_names_nothing_from_either_side: asserts the newURL_ANSWERS_NOTHING_REMEDIATIONwording.alike()NOTE,FROM_THE_LOCAL_LEGSand three docstrings.Before the fix, 16 of these tests fail, with the new tests on main's
adopt-project.py. With it, the two files and tests/test_cli_reference.py give 78 passed.Revert table. Each change is reverted alone in a standalone clone, with the new tests in place and
git filter-repoonPATH, over the two test files and tests/test_cli_reference.py (78 tests):check's--local-remote-dirargumenttest_execute_resolves_again...x4,test_a_relative_origin...x2,test_check_and_execute_given_one_local_remote_dir_agreex2,test_check_given_local_remotes_still_notes_a_url_on_a_network, and 5 in test_cli_reference.py (docs/cli.md lists the flag)cmd_checkpasses the flag to_entry_findingstest_a_relative_origin...x2local_remote_dirtest_check_given_local_remotes_still_notes_a_url_on_a_networktest_check_keeps_a_relative_url_its_github_leg_resolves_alikex5,test_each_relative_url_is_resolved_on_its_owntest_execute_resolves_again...x4,test_execute_refuses_a_relative_url_that_names_nothing_from_either_sideRELATIVE_URL_REMEDIATIONtest_execute_resolves_again...x4URL_ANSWERS_NOTHING_REMEDIATIONtest_execute_refuses_a_relative_url_that_names_nothing_from_either_sideChained together, R1 to R8 leave only docstrings, comments and the now-unused
getattrline different from main.Targeted runs at head 9bd5585, dirty 0, with
/usr/bin/python3 -m pytest, a stubghfirst onPATH, a bogusGH_TOKENand an emptyGH_CONFIG_DIR. They cover 87 files: the 86 thatgrep -l -E 'adopt-project|adopt_project|\bADOPT\b' tests/*.pynames, which include tests/test_shape_doctor.py and tests/test_scaffold_leg_path_collisions.py, plus tests/test_cli_reference.py.git filter-repoonPATH: 6391 passed, 13 skipped, EXIT=0 (61 min).PATH=<stub>:/usr/local/bin:/usr/bin:/bin): 6045 passed, 359 skipped, EXIT=0 (45 min).Windows
CI is Linux only since #597, so this was not run on Windows. Even so:
tmp_pathname or a fixed ASCII name (remotes,Thing.git,dependency,elsewhere,clone), legal on NTFS.finding_linescompares lines fromsplitlines(), which takes\r\ntoo.str.removeprefixis Python 3.9, the oldest version this standard runs on.adoption verifiedwhen a submodule the plan keeps in a leg has a url that names no repository (a relative url that resolves alike from the source and the leg, or an absolute one), so the recursive clone itsNEXT:line prints fails; nothing asks whether the url answers #418 test is anhttps://url, which no platform asks.Not in this PR
check --local-remote-diruses the directory for each relative submodule url alone: where it is resolved, and whether it answers there (adopt-project.py saysadoption verifiedwhen a submodule the plan keeps in a leg has a url that names no repository (a relative url that resolves alike from the source and the leg, or an absolute one), so the recursive clone itsNEXT:line prints fails; nothing asks whether the url answers #418). It also prints the topics line of that run. It does not ask the other questions onlyexecute --local-remote-dirasks. Each was measured with one plan and one directory, on this branch merged with main78fe3fff:check --local-remote-dirsaysplan ok, andexecute --local-remote-dirrefusesleg-remote-existsfor a<dir>/Northwind-code.gitalready there (after it has madeNorthwind-spec.git, which it leaves behind),adopt-unwritable-valuefor a source directory whose name is not UTF-8 (the clone URL),adopt-name-too-longfor a--projectof 248 characters (<dir>/<name>-code.gitis 257 bytes), andplan-tracking-branch-missingfor atracking_branchthat only the source's remoteoriginhas (it asks the source itself). Where the directory is a file, or its parent cannot be written,executeends in a traceback (exit 1) before any leg exists. The other way round,check --local-remote-dirstill findsadopt-branch-existsorplan-split-branch-takenfor a branch the source'sorigin, the assembly repository on GitHub, held when it was last fetched. Onlyexecutewithout--local-remote-dirmeets that branch, andexecute --local-remote-dirverifies the plan. Each of theseexecutepaths is unchanged here and the same on main78fe3fff, and each is reported to Tracking: adopt-project.py, converting an existing repository in place #457's checklist.adoption verifiedwhen a submodule the plan keeps in a leg has a url that names no repository (a relative url that resolves alike from the source and the leg, or an absolute one), so the recursive clone itsNEXT:line prints fails; nothing asks whether the url answers #418 (PR adopt-project.py: a kept submodule url on this disk wheregit ls-remotereaches no repository is a findingexecuterefuses before any leg, so it no longer endsadoption verifiedover a recursive clone that fails (#418) #618) now finds one on this machine's disk. One on a network is still not asked, and the NOTE names it.Known limits
checkanswers forexecute --local-remote-dironly when it is given the same directory. A relative--local-remote-diris resolved from the directory each command runs in, asexecuteresolves it.checkmakes nothing in the directory, and asks the disk there only whether each relative url it resolves from it answers. Whether a leg is already there, and whether the directory can be made and written, areexecute's to find (see "Not in this PR").Closes #417
🤖 Generated with Claude Code
Summary by Sourcery
Make
check --local-remote-dirresolve relative submodule URLs likeexecuteso both commands consistently validate local-remote adoptions.New Features:
check --local-remote-dirso relative submodule URLs are evaluated against the same local bare repositories used byexecute.checkoutput and expose the option in the CLI reference.Bug Fixes:
checkandexecuteverdicts for relative submodule URLs when both commands use the same local remote directory.Enhancements:
Documentation:
check --local-remote-dir.Tests:
checkandexecuteagree line for line with shared local remotes.