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..gitmodules URL.be post ssh://localhost/src/dogs (beagle parent → git fs-path destination):
keeper: post: branch ?.dogs/ is a be-only synthetic coordinate; pushing to git
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 only
way 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).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).be post ssh://<fs-path> — absolute .gitmodules url →
SNIFFSubCandidateGitRel NONE → official url wins (repro'd $HOME/tmp).<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.