SUBS-020 landed a POST mirror meant to route each recursed sub commit to the SAME place GET would fetch it from — same peer (beagle), parent-relative (git non-.git), or official (git .git) — but a live be post to a git fs-path destination pushed the sub to its OFFICIAL url instead of the parent-relative path, so an unrelated unreachable upstream aborted the whole post. POST must apply the three-case resolution + fallback for real, the way GET already does. See SUBS-020, Submodules.
Three source cases (user's framing; identical to SUBS-020):
.git URI → no same-repo expectation; the sub's official URL.
path. In the beagle and fs cases, if the assumption fails, FALL BACK to the official .gitmodules URL.
be post ssh://localhost/src/dogs (beagle parent → git fs-path destination):
remote https://github.com/gritzko/libabc.git default branch — the abc sub went to its OFFICIAL github url (case 2), NOT parent-relative ssh://localhost/src/dogs/abc` (case 3).
--nosub was the onlyway through. GET resolves this correctly; POST does not.
POST routes each sub-push destination by the parent/destination kind, with fallback.
.git) destination → push the sub parent-relative
(<dest>/<subpath>); fall back to the official URL only if absent.
?/<project>; fall back to official..git destination → official URL (unchanged).parent-relative, not official.
SNIFFSubSrcEndsGit, SNIFFSubCandidateGitRel)
and the bepushgit_recurse_cb arm SUBS-020 added — find WHY it doesn't fire here (ssh fs-path dest / beagle-parent → git-dest path); do not re-roll.
?/<sub>/.<parent> synthetic-coordinate → git-default-branch mapping is involved.
Root cause (traced, repro'd): case 3 fed the .gitmodules url to SNIFFSubCandidateGitRel; an ABSOLUTE url resolves-to-self → NONE → the official url wins. Split case 3 by url FORM — four cases, keyed on the remote (dest for POST, src for GET), all reusing the SAME resolver:
?/<subproj> (unchanged)..git → declared official url as-is (unchanged).../sub) → resolve url vs remote URI(sibling); ref = url. Unchanged (post/44, get/50-3a).
<remote>/<subpath>; ref = subpath.NEW — bypasses the unreachable declared upstream (e.g. github).
bepushgit_recurse_cb) get case 4, for push/fetch symmetry.
be post ssh://<fs-path> — absolute .gitmodules url →SNIFFSubCandidateGitRel NONE → official url wins (repro'd $HOME/tmp).
subpath); keep relative-url arm + official fallback.
<src>/<subpath> candidate before official (SUBS.c).<remote>/<sub>,NOT official; ctest 394/394 WITH_SSH.
(none yet)
b09b09bf — case 4 in POST (BE.cli.c bepushgit_recurse_cb) and GET
(sniff/SUBS.c SNIFFSubMount); reuses SNIFFSubCandidateGitRel, no new symbols. post/45+get/53 added; full ctest 394/394 WITH_SSH.
git_parent gate that never fired over ssh (see follow-up below).
test/put/01-states/05.put.err.txt to match the
committed be put stderr-spam removal (3582cbe1) — straggler fixture.
subs_recover_locator flags ssh git
remotes as src_beagle, which is why GET case 3 never fired over ssh.