Browse Source

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 <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jeff King 8 years ago committed by Junio C Hamano
parent
commit
ef2ed5013c
  1. 11
      builtin/merge.c
  2. 16
      builtin/receive-pack.c
  3. 4
      cache.h
  4. 4
      sha1_name.c

11
builtin/merge.c

@ -1374,12 +1374,11 @@ int cmd_merge(int argc, const char **argv, const char *prefix) @@ -1374,12 +1374,11 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
struct commit *commit;

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

16
builtin/receive-pack.c

@ -1163,10 +1163,6 @@ static void check_aliased_update(struct command *cmd, struct string_list *list) @@ -1163,10 +1163,6 @@ static void check_aliased_update(struct command *cmd, struct string_list *list)
struct string_list_item *item;
struct command *dst_cmd;
unsigned char sha1[GIT_SHA1_RAWSZ];
char cmd_oldh[GIT_SHA1_HEXSZ + 1],
cmd_newh[GIT_SHA1_HEXSZ + 1],
dst_oldh[GIT_SHA1_HEXSZ + 1],
dst_newh[GIT_SHA1_HEXSZ + 1];
int flag;

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) @@ -1197,14 +1193,14 @@ static void check_aliased_update(struct command *cmd, struct string_list *list)

dst_cmd->skip_update = 1;

find_unique_abbrev_r(cmd_oldh, cmd->old_sha1, DEFAULT_ABBREV);
find_unique_abbrev_r(cmd_newh, cmd->new_sha1, DEFAULT_ABBREV);
find_unique_abbrev_r(dst_oldh, dst_cmd->old_sha1, DEFAULT_ABBREV);
find_unique_abbrev_r(dst_newh, dst_cmd->new_sha1, DEFAULT_ABBREV);
rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
" its target '%s' (%s..%s)",
cmd->ref_name, cmd_oldh, cmd_newh,
dst_cmd->ref_name, dst_oldh, dst_newh);
cmd->ref_name,
find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV),
find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV),
dst_cmd->ref_name,
find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV),
find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));

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

4
cache.h

@ -903,8 +903,8 @@ extern char *sha1_pack_index_name(const unsigned char *sha1); @@ -903,8 +903,8 @@ extern char *sha1_pack_index_name(const unsigned char *sha1);
* The result will be at least `len` characters long, and will be NUL
* terminated.
*
* The non-`_r` version returns a static buffer which will be overwritten by
* subsequent calls.
* The non-`_r` version returns a static buffer which remains valid until 4
* more calls to find_unique_abbrev are made.
*
* The `_r` variant writes to a buffer supplied by the caller, which must be at
* least `GIT_SHA1_HEXSZ + 1` bytes. The return value is the number of bytes

4
sha1_name.c

@ -472,7 +472,9 @@ int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len) @@ -472,7 +472,9 @@ int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len)

const char *find_unique_abbrev(const unsigned char *sha1, int len)
{
static char hex[GIT_SHA1_HEXSZ + 1];
static int bufno;
static char hexbuffer[4][GIT_SHA1_HEXSZ + 1];
char *hex = hexbuffer[3 & ++bufno];
find_unique_abbrev_r(hex, sha1, len);
return hex;
}

Loading…
Cancel
Save