aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2024-08-14 14:54:49 -0700
committerJunio C Hamano <gitster@pobox.com>2024-08-14 14:54:49 -0700
commit760348212b16379d2646751c2cd18a028cbdd02d (patch)
tree0d9928c87157a79e284223c706dca7943dcc9a9f
parentMerge branch 'jc/transport-leakfix' (diff)
parentbuiltin/ls-remote: fall back to SHA1 outside of a repo (diff)
downloadgit-760348212b16379d2646751c2cd18a028cbdd02d.tar.gz
git-760348212b16379d2646751c2cd18a028cbdd02d.zip
Merge branch 'ps/ls-remote-out-of-repo-fix'
A recent update broke "git ls-remote" used outside a repository, which has been corrected. * ps/ls-remote-out-of-repo-fix: builtin/ls-remote: fall back to SHA1 outside of a repo
Diffstat (limited to '')
-rw-r--r--builtin/ls-remote.c15
-rwxr-xr-xt/t5512-ls-remote.sh13
2 files changed, 28 insertions, 0 deletions
diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c
index 5b61af5d78..0a491595ca 100644
--- a/builtin/ls-remote.c
+++ b/builtin/ls-remote.c
@@ -90,6 +90,21 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
PARSE_OPT_STOP_AT_NON_OPTION);
dest = argv[0];
+ /*
+ * TODO: This is buggy, but required for transport helpers. When a
+ * transport helper advertises a "refspec", then we'd add that to a
+ * list of refspecs via `refspec_append()`, which transitively depends
+ * on `the_hash_algo`. Thus, when the hash algorithm isn't properly set
+ * up, this would lead to a segfault.
+ *
+ * We really should fix this in the transport helper logic such that we
+ * lazily parse refspec capabilities _after_ we have learned about the
+ * remote's object format. Otherwise, we may end up misparsing refspecs
+ * depending on what object hash the remote uses.
+ */
+ if (!the_repository->hash_algo)
+ repo_set_hash_algo(the_repository, GIT_HASH_SHA1);
+
packet_trace_identity("ls-remote");
for (int i = 1; i < argc; i++)
diff --git a/t/t5512-ls-remote.sh b/t/t5512-ls-remote.sh
index d687d824d1..d64b40e408 100755
--- a/t/t5512-ls-remote.sh
+++ b/t/t5512-ls-remote.sh
@@ -403,4 +403,17 @@ test_expect_success 'v0 clients can handle multiple symrefs' '
test_cmp expect actual
'
+test_expect_success 'helper with refspec capability fails gracefully' '
+ mkdir test-bin &&
+ write_script test-bin/git-remote-foo <<-EOF &&
+ echo import
+ echo refspec ${SQ}*:*${SQ}
+ EOF
+ (
+ PATH="$PWD/test-bin:$PATH" &&
+ export PATH &&
+ test_must_fail nongit git ls-remote foo::bar
+ )
+'
+
test_done