pretty: add abbrev option to %(describe)

The %(describe) placeholder by default, like `git describe`, uses a
seven-character abbreviated commit object name. This may not be
sufficient to fully describe all commits in a given repository,
resulting in a placeholder replacement changing its length because the
repository grew in size.  This could cause the output of git-archive to
change.

Add the --abbrev option to `git describe` to the placeholder interface
in order to provide tools to the user for fine-tuning project defaults
and ensure reproducible archives.

One alternative would be to just always specify --abbrev=40 but this may
be a bit too biased...

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Eli Schwartz
2021-10-31 13:15:10 -04:00
committed by Junio C Hamano
parent 1d517ceab9
commit eccd97d0b0
3 changed files with 27 additions and 0 deletions

View File

@ -1220,10 +1220,12 @@ static size_t parse_describe_args(const char *start, struct strvec *args)
char *name;
enum {
DESCRIBE_ARG_BOOL,
DESCRIBE_ARG_INTEGER,
DESCRIBE_ARG_STRING,
} type;
} option[] = {
{ "tags", DESCRIBE_ARG_BOOL},
{ "abbrev", DESCRIBE_ARG_INTEGER },
{ "exclude", DESCRIBE_ARG_STRING },
{ "match", DESCRIBE_ARG_STRING },
};
@ -1247,6 +1249,19 @@ static size_t parse_describe_args(const char *start, struct strvec *args)
found = 1;
}
break;
case DESCRIBE_ARG_INTEGER:
if (match_placeholder_arg_value(arg, option[i].name, &arg,
&argval, &arglen)) {
char *endptr;
if (!arglen)
return 0;
strtol(argval, &endptr, 10);
if (endptr - argval != arglen)
return 0;
strvec_pushf(args, "--%s=%.*s", option[i].name, (int)arglen, argval);
found = 1;
}
break;
case DESCRIBE_ARG_STRING:
if (match_placeholder_arg_value(arg, option[i].name, &arg,
&argval, &arglen)) {