1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-20 13:26:08 +02:00

parse-options-cb: only abbreviate hashes when hash algo is known

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>
This commit is contained in:
Patrick Steinhardt 2024-05-07 06:52:56 +02:00 committed by Junio C Hamano
parent 0c6bd2b81d
commit b7afb46225
2 changed files with 19 additions and 1 deletions

View 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;

View File

@ -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