]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/shortlog: explicitly set hash algo when there is no repo
authorWolfgang Müller <wolf@oriole.systems>
Thu, 17 Oct 2024 09:35:28 +0000 (11:35 +0200)
committerTaylor Blau <me@ttaylorr.com>
Thu, 17 Oct 2024 20:10:54 +0000 (16:10 -0400)
Whilst git-shortlog(1) does not explicitly need any repository
information when run without reference to one, it still parses some of
its arguments with parse_revision_opt() which assumes that the hash
algorithm is set. However, in c8aed5e8da (repository: stop setting SHA1
as the default object hash, 2024-05-07) we stopped setting up a default
hash algorithm and instead require commands to set it up explicitly.

This was done for most other commands like in ab274909d4 (builtin/diff:
explicitly set hash algo when there is no repo, 2024-05-07) but was
missed for builtin/shortlog, making git-shortlog(1) segfault outside of
a repository when given arguments like --author that trigger a call to
parse_revision_opt().

Fix this for now by explicitly setting the hash algorithm to SHA1. Also
add a regression test for the segfault.

Thanks-to: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Wolfgang Müller <wolf@oriole.systems>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
builtin/shortlog.c
t/t4201-shortlog.sh

index 3ed5c460786dfcb8d4e4edc899d57e870cd1a178..c86b75d9813ad9207a773e95ce897b65929e86b9 100644 (file)
@@ -407,6 +407,18 @@ int cmd_shortlog(int argc,
 
        struct parse_opt_ctx_t ctx;
 
+       /*
+        * NEEDSWORK: Later on we'll call parse_revision_opt which relies on
+        * the hash algorithm being set but since we are operating outside of a
+        * Git repository we cannot determine one. This is only needed because
+        * parse_revision_opt expects hexsz for --abbrev which is irrelevant
+        * for shortlog outside of a git repository. For now explicitly set
+        * SHA1, but ideally the parsing machinery would be split between
+        * git/nongit so that we do not have to do this.
+        */
+       if (nongit && !the_hash_algo)
+               repo_set_hash_algo(the_repository, GIT_HASH_SHA1);
+
        git_config(git_default_config, NULL);
        shortlog_init(&log);
        repo_init_revisions(the_repository, &rev, prefix);
index c20c88572445dcc835218509aa280e66dc5b5cf4..5b5d3b637c60f6c1c57e5a6f73336b2ccd4a4abd 100755 (executable)
@@ -143,6 +143,10 @@ test_expect_success 'shortlog from non-git directory refuses extra arguments' '
        test_grep "too many arguments" out
 '
 
+test_expect_success 'shortlog --author from non-git directory does not segfault' '
+       nongit git shortlog --author=author </dev/null
+'
+
 test_expect_success 'shortlog should add newline when input line matches wraplen' '
        cat >expect <<\EOF &&
 A U Thor (2):