diff options
author | Johannes Schindelin <Johannes.Schindelin@gmx.de> | 2007-12-03 21:42:39 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-12-04 10:43:07 +0300 |
commit | 364d3e65a5da76ac51217e68b55504cd2cd154aa (patch) | |
tree | c9f3b53c99c517a2e7cae7b5cf9dae442e8734cc | |
parent | 311db37e707601ef2107d2938c0e0e0ade6e39b5 (diff) |
Allow ':/<oneline-prefix>' syntax to work with save_commit_buffer == 0
Earlier, ':/<oneline-prefix>' would not work (i.e. die) with commands that
set save_commit_buffer = 0, such as blame, describe, pack-objects, reflog
and bundle.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | sha1_name.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/sha1_name.c b/sha1_name.c index 2d727d54dc..bd8fc05c4b 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -610,24 +610,35 @@ static int get_sha1_oneline(const char *prefix, unsigned char *sha1) { struct commit_list *list = NULL, *backup = NULL, *l; int retval = -1; + char *temp_commit_buffer = NULL; if (prefix[0] == '!') { if (prefix[1] != '!') die ("Invalid search pattern: %s", prefix); prefix++; } - if (!save_commit_buffer) - return error("Could not expand oneline-name."); for_each_ref(handle_one_ref, &list); for (l = list; l; l = l->next) commit_list_insert(l->item, &backup); while (list) { char *p; struct commit *commit; + enum object_type type; + unsigned long size; commit = pop_most_recent_commit(&list, ONELINE_SEEN); parse_object(commit->object.sha1); - if (!commit->buffer || !(p = strstr(commit->buffer, "\n\n"))) + if (temp_commit_buffer) + free(temp_commit_buffer); + if (commit->buffer) + p = commit->buffer; + else { + p = read_sha1_file(commit->object.sha1, &type, &size); + if (!p) + continue; + temp_commit_buffer = p; + } + if (!(p = strstr(p, "\n\n"))) continue; if (!prefixcmp(p + 2, prefix)) { hashcpy(sha1, commit->object.sha1); @@ -635,6 +646,8 @@ static int get_sha1_oneline(const char *prefix, unsigned char *sha1) break; } } + if (temp_commit_buffer) + free(temp_commit_buffer); free_commit_list(list); for (l = backup; l; l = l->next) clear_commit_marks(l->item, ONELINE_SEEN); |