зеркало из https://github.com/microsoft/git.git
sha1_to_hex() usage cleanup
Somebody on the #git channel complained that the sha1_to_hex() thing uses a static buffer which caused an error message to show the same hex output twice instead of showing two different ones. That's pretty easily rectified by making it uses a simple LRU of a few buffers, which also allows some other users (that were aware of the buffer re-use) to be written in a more straightforward manner. Signed-off-by: Linus Torvalds <torvalds@osdl.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Родитель
935e714204
Коммит
dcb3450fd8
6
diff.c
6
diff.c
|
@ -1018,14 +1018,12 @@ static void run_diff(struct diff_filepair *p, struct diff_options *o)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (memcmp(one->sha1, two->sha1, 20)) {
|
if (memcmp(one->sha1, two->sha1, 20)) {
|
||||||
char one_sha1[41];
|
|
||||||
int abbrev = o->full_index ? 40 : DEFAULT_ABBREV;
|
int abbrev = o->full_index ? 40 : DEFAULT_ABBREV;
|
||||||
memcpy(one_sha1, sha1_to_hex(one->sha1), 41);
|
|
||||||
|
|
||||||
len += snprintf(msg + len, sizeof(msg) - len,
|
len += snprintf(msg + len, sizeof(msg) - len,
|
||||||
"index %.*s..%.*s",
|
"index %.*s..%.*s",
|
||||||
abbrev, one_sha1, abbrev,
|
abbrev, sha1_to_hex(one->sha1),
|
||||||
sha1_to_hex(two->sha1));
|
abbrev, sha1_to_hex(two->sha1));
|
||||||
if (one->mode == two->mode)
|
if (one->mode == two->mode)
|
||||||
len += snprintf(msg + len, sizeof(msg) - len,
|
len += snprintf(msg + len, sizeof(msg) - len,
|
||||||
" %06o", one->mode);
|
" %06o", one->mode);
|
||||||
|
|
|
@ -24,16 +24,14 @@ static const char *sha1_to_hex_zero(const unsigned char *sha1)
|
||||||
|
|
||||||
static void resolve(const char *base, struct name_entry *branch1, struct name_entry *result)
|
static void resolve(const char *base, struct name_entry *branch1, struct name_entry *result)
|
||||||
{
|
{
|
||||||
char branch1_sha1[50];
|
|
||||||
|
|
||||||
/* If it's already branch1, don't bother showing it */
|
/* If it's already branch1, don't bother showing it */
|
||||||
if (!branch1)
|
if (!branch1)
|
||||||
return;
|
return;
|
||||||
memcpy(branch1_sha1, sha1_to_hex_zero(branch1->sha1), 41);
|
|
||||||
|
|
||||||
printf("0 %06o->%06o %s->%s %s%s\n",
|
printf("0 %06o->%06o %s->%s %s%s\n",
|
||||||
branch1->mode, result->mode,
|
branch1->mode, result->mode,
|
||||||
branch1_sha1, sha1_to_hex_zero(result->sha1),
|
sha1_to_hex_zero(branch1->sha1),
|
||||||
|
sha1_to_hex_zero(result->sha1),
|
||||||
base, result->path);
|
base, result->path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -108,9 +108,10 @@ int safe_create_leading_directories(char *path)
|
||||||
|
|
||||||
char * sha1_to_hex(const unsigned char *sha1)
|
char * sha1_to_hex(const unsigned char *sha1)
|
||||||
{
|
{
|
||||||
static char buffer[50];
|
static int bufno;
|
||||||
|
static char hexbuffer[4][50];
|
||||||
static const char hex[] = "0123456789abcdef";
|
static const char hex[] = "0123456789abcdef";
|
||||||
char *buf = buffer;
|
char *buffer = hexbuffer[3 & ++bufno], *buf = buffer;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < 20; i++) {
|
for (i = 0; i < 20; i++) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче