Skip to content

Commit ef2ed50

Browse files
peffgitster
authored andcommitted
find_unique_abbrev: use 4-buffer ring
Some code paths want to format multiple abbreviated sha1s in the same output line. Because we use a single static buffer for our return value, they have to either break their output into several calls or allocate their own arrays and use find_unique_abbrev_r(). Intead, let's mimic sha1_to_hex() and use a ring of several buffers, so that the return value stays valid through multiple calls. This shortens some of the callers, and makes it harder to for them to make a silly mistake. Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 4ce742f commit ef2ed50

File tree

4 files changed

+16
-19
lines changed

4 files changed

+16
-19
lines changed

builtin/merge.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1374,12 +1374,11 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
13741374
struct commit *commit;
13751375

13761376
if (verbosity >= 0) {
1377-
char from[GIT_SHA1_HEXSZ + 1], to[GIT_SHA1_HEXSZ + 1];
1378-
find_unique_abbrev_r(from, head_commit->object.oid.hash,
1379-
DEFAULT_ABBREV);
1380-
find_unique_abbrev_r(to, remoteheads->item->object.oid.hash,
1381-
DEFAULT_ABBREV);
1382-
printf(_("Updating %s..%s\n"), from, to);
1377+
printf(_("Updating %s..%s\n"),
1378+
find_unique_abbrev(head_commit->object.oid.hash,
1379+
DEFAULT_ABBREV),
1380+
find_unique_abbrev(remoteheads->item->object.oid.hash,
1381+
DEFAULT_ABBREV));
13831382
}
13841383
strbuf_addstr(&msg, "Fast-forward");
13851384
if (have_message)

builtin/receive-pack.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,10 +1163,6 @@ static void check_aliased_update(struct command *cmd, struct string_list *list)
11631163
struct string_list_item *item;
11641164
struct command *dst_cmd;
11651165
unsigned char sha1[GIT_SHA1_RAWSZ];
1166-
char cmd_oldh[GIT_SHA1_HEXSZ + 1],
1167-
cmd_newh[GIT_SHA1_HEXSZ + 1],
1168-
dst_oldh[GIT_SHA1_HEXSZ + 1],
1169-
dst_newh[GIT_SHA1_HEXSZ + 1];
11701166
int flag;
11711167

11721168
strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
@@ -1197,14 +1193,14 @@ static void check_aliased_update(struct command *cmd, struct string_list *list)
11971193

11981194
dst_cmd->skip_update = 1;
11991195

1200-
find_unique_abbrev_r(cmd_oldh, cmd->old_sha1, DEFAULT_ABBREV);
1201-
find_unique_abbrev_r(cmd_newh, cmd->new_sha1, DEFAULT_ABBREV);
1202-
find_unique_abbrev_r(dst_oldh, dst_cmd->old_sha1, DEFAULT_ABBREV);
1203-
find_unique_abbrev_r(dst_newh, dst_cmd->new_sha1, DEFAULT_ABBREV);
12041196
rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
12051197
" its target '%s' (%s..%s)",
1206-
cmd->ref_name, cmd_oldh, cmd_newh,
1207-
dst_cmd->ref_name, dst_oldh, dst_newh);
1198+
cmd->ref_name,
1199+
find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV),
1200+
find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV),
1201+
dst_cmd->ref_name,
1202+
find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV),
1203+
find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
12081204

12091205
cmd->error_string = dst_cmd->error_string =
12101206
"inconsistent aliased update";

cache.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -903,8 +903,8 @@ extern char *sha1_pack_index_name(const unsigned char *sha1);
903903
* The result will be at least `len` characters long, and will be NUL
904904
* terminated.
905905
*
906-
* The non-`_r` version returns a static buffer which will be overwritten by
907-
* subsequent calls.
906+
* The non-`_r` version returns a static buffer which remains valid until 4
907+
* more calls to find_unique_abbrev are made.
908908
*
909909
* The `_r` variant writes to a buffer supplied by the caller, which must be at
910910
* least `GIT_SHA1_HEXSZ + 1` bytes. The return value is the number of bytes

sha1_name.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,9 @@ int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len)
472472

473473
const char *find_unique_abbrev(const unsigned char *sha1, int len)
474474
{
475-
static char hex[GIT_SHA1_HEXSZ + 1];
475+
static int bufno;
476+
static char hexbuffer[4][GIT_SHA1_HEXSZ + 1];
477+
char *hex = hexbuffer[3 & ++bufno];
476478
find_unique_abbrev_r(hex, sha1, len);
477479
return hex;
478480
}

0 commit comments

Comments
 (0)