]> git.ipfire.org Git - thirdparty/git.git/commitdiff
parse-options-cb: only abbreviate hashes when hash algo is known
authorPatrick Steinhardt <ps@pks.im>
Tue, 7 May 2024 04:52:56 +0000 (06:52 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 7 May 2024 05:50:48 +0000 (22:50 -0700)
The `OPT__ABBREV()` option can be used to add an option that abbreviates
object IDs. When given a length longer than `the_hash_algo->hexsz`, then
it will instead set the length to that maximum length.

It may not always be guaranteed that we have `the_hash_algo` initialized
properly as the hash algorithm can only be set up after we have set up
`the_repository`. In that case, the hash would always be truncated to
the hex length of SHA1, which may not be what the user desires.

In practice it's not a problem as all commands that use `OPT__ABBREV()`
also have `RUN_SETUP` set and thus cannot work without a repository.
Consequently, both `the_repository` and `the_hash_algo` would be
properly set up.

Regardless of that, harden the code to not truncate the length when we
didn't set up a repository.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
parse-options-cb.c
t/t0040-parse-options.sh

index bdc7fae49719dfef060739854ae7491045afb6f2..d99d688d3ce25b2f1fd2837ad0f3d337aec15313 100644 (file)
@@ -7,6 +7,7 @@
 #include "environment.h"
 #include "gettext.h"
 #include "object-name.h"
+#include "setup.h"
 #include "string-list.h"
 #include "strvec.h"
 #include "oid-array.h"
@@ -29,7 +30,7 @@ int parse_opt_abbrev_cb(const struct option *opt, const char *arg, int unset)
                                     opt->long_name);
                if (v && v < MINIMUM_ABBREV)
                        v = MINIMUM_ABBREV;
-               else if (v > the_hash_algo->hexsz)
+               else if (startup_info->have_repository && v > the_hash_algo->hexsz)
                        v = the_hash_algo->hexsz;
        }
        *(int *)(opt->value) = v;
index 8bb2a8b453ce0bd6ce1960542e21d3bcd74567e0..45a773642fd167e9190b9b693a08001bb5939883 100755 (executable)
@@ -176,6 +176,23 @@ test_expect_success 'long options' '
        test_cmp expect output
 '
 
+test_expect_success 'abbreviate to something longer than SHA1 length' '
+       cat >expect <<-EOF &&
+       boolean: 0
+       integer: 0
+       magnitude: 0
+       timestamp: 0
+       string: (not set)
+       abbrev: 100
+       verbose: -1
+       quiet: 0
+       dry run: no
+       file: (not set)
+       EOF
+       test-tool parse-options --abbrev=100 >output &&
+       test_cmp expect output
+'
+
 test_expect_success 'missing required value' '
        cat >expect <<-\EOF &&
        error: switch `s'\'' requires a value