зеркало из https://github.com/microsoft/git.git
use get_commit_buffer to avoid duplicate code
For both of these sites, we already do the "fallback to read_sha1_file" trick. But we can shorten the code by just using get_commit_buffer. Note that the error cases are slightly different when read_sha1_file fails. get_commit_buffer will die() if the object cannot be loaded, or is a non-commit. For get_sha1_oneline, this will almost certainly never happen, as we will have just called parse_object (and if it does, it's probably worth complaining about). For record_author_date, the new behavior is probably better; we notify the user of the error instead of silently ignoring it. And because it's used only for sorting by author-date, somebody examining a corrupt repo can fallback to the regular traversal order. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
a97934d820
Коммит
ba41c1c93f
16
commit.c
16
commit.c
|
@ -583,22 +583,12 @@ static void record_author_date(struct author_date_slab *author_date,
|
|||
struct commit *commit)
|
||||
{
|
||||
const char *buf, *line_end, *ident_line;
|
||||
char *buffer = NULL;
|
||||
const char *buffer = get_commit_buffer(commit);
|
||||
struct ident_split ident;
|
||||
char *date_end;
|
||||
unsigned long date;
|
||||
|
||||
if (!commit->buffer) {
|
||||
unsigned long size;
|
||||
enum object_type type;
|
||||
buffer = read_sha1_file(commit->object.sha1, &type, &size);
|
||||
if (!buffer)
|
||||
return;
|
||||
}
|
||||
|
||||
for (buf = commit->buffer ? commit->buffer : buffer;
|
||||
buf;
|
||||
buf = line_end + 1) {
|
||||
for (buf = buffer; buf; buf = line_end + 1) {
|
||||
line_end = strchrnul(buf, '\n');
|
||||
ident_line = skip_prefix(buf, "author ");
|
||||
if (!ident_line) {
|
||||
|
@ -619,7 +609,7 @@ static void record_author_date(struct author_date_slab *author_date,
|
|||
*(author_date_slab_at(author_date, commit)) = date;
|
||||
|
||||
fail_exit:
|
||||
free(buffer);
|
||||
unuse_commit_buffer(commit, buffer);
|
||||
}
|
||||
|
||||
static int compare_commits_by_author_date(const void *a_, const void *b_,
|
||||
|
|
18
sha1_name.c
18
sha1_name.c
|
@ -862,27 +862,17 @@ static int get_sha1_oneline(const char *prefix, unsigned char *sha1,
|
|||
commit_list_insert(l->item, &backup);
|
||||
}
|
||||
while (list) {
|
||||
char *p, *to_free = NULL;
|
||||
const char *p, *buf;
|
||||
struct commit *commit;
|
||||
enum object_type type;
|
||||
unsigned long size;
|
||||
int matches;
|
||||
|
||||
commit = pop_most_recent_commit(&list, ONELINE_SEEN);
|
||||
if (!parse_object(commit->object.sha1))
|
||||
continue;
|
||||
if (commit->buffer)
|
||||
p = commit->buffer;
|
||||
else {
|
||||
p = read_sha1_file(commit->object.sha1, &type, &size);
|
||||
if (!p)
|
||||
continue;
|
||||
to_free = p;
|
||||
}
|
||||
|
||||
p = strstr(p, "\n\n");
|
||||
buf = get_commit_buffer(commit);
|
||||
p = strstr(buf, "\n\n");
|
||||
matches = p && !regexec(®ex, p + 2, 0, NULL, 0);
|
||||
free(to_free);
|
||||
unuse_commit_buffer(commit, buf);
|
||||
|
||||
if (matches) {
|
||||
hashcpy(sha1, commit->object.sha1);
|
||||
|
|
Загрузка…
Ссылка в новой задаче