diff options
author | Junio C Hamano <gitster@pobox.com> | 2017-07-07 10:02:42 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-07-07 10:02:42 -0700 |
commit | be5982a7945f661c89447feb56a27fbeb6028791 (patch) | |
tree | 66bf43f68593bed527713cedf57ddf02ae568951 /reflog-walk.c | |
parent | 8b2efe2a0fd93b8721879f796d848a9ce785647f (diff) | |
parent | e30d463d450286ffafb442ecc7686df4004c06ff (diff) | |
download | git-be5982a7945f661c89447feb56a27fbeb6028791.tar.gz |
Merge branch 'jk/reflog-walk-maint' into jk/reflog-walk
* jk/reflog-walk-maint:
reflog-walk: include all fields when freeing complete_reflogs
reflog-walk: don't free reflogs added to cache
reflog-walk: duplicate strings in complete_reflogs list
reflog-walk: skip over double-null oid due to HEAD rename
Diffstat (limited to 'reflog-walk.c')
-rw-r--r-- | reflog-walk.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/reflog-walk.c b/reflog-walk.c index ed99437ad2..081f89b70d 100644 --- a/reflog-walk.c +++ b/reflog-walk.c @@ -38,6 +38,22 @@ static int read_one_reflog(struct object_id *ooid, struct object_id *noid, return 0; } +static void free_complete_reflog(struct complete_reflogs *array) +{ + int i; + + if (!array) + return; + + for (i = 0; i < array->nr; i++) { + free(array->items[i].email); + free(array->items[i].message); + } + free(array->items); + free(array->ref); + free(array); +} + static struct complete_reflogs *read_complete_reflog(const char *ref) { struct complete_reflogs *reflogs = @@ -136,6 +152,7 @@ struct reflog_walk_info { void init_reflog_walk(struct reflog_walk_info **info) { *info = xcalloc(1, sizeof(struct reflog_walk_info)); + (*info)->complete_reflogs.strdup_strings = 1; } int add_reflog_for_walk(struct reflog_walk_info *info, @@ -188,20 +205,14 @@ int add_reflog_for_walk(struct reflog_walk_info *info, if (ret > 1) free(b); else if (ret == 1) { - if (reflogs) { - free(reflogs->ref); - free(reflogs); - } + free_complete_reflog(reflogs); free(branch); branch = b; reflogs = read_complete_reflog(branch); } } if (!reflogs || reflogs->nr == 0) { - if (reflogs) { - free(reflogs->ref); - free(reflogs); - } + free_complete_reflog(reflogs); free(branch); return -1; } @@ -214,10 +225,6 @@ int add_reflog_for_walk(struct reflog_walk_info *info, if (recno < 0) { commit_reflog->recno = get_reflog_recno_by_time(reflogs, timestamp); if (commit_reflog->recno < 0) { - if (reflogs) { - free(reflogs->ref); - free(reflogs); - } free(commit_reflog); return -1; } @@ -259,6 +266,8 @@ void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit) /* a root commit, but there are still more entries to show */ reflog = &commit_reflog->reflogs->items[commit_reflog->recno]; logobj = parse_object(&reflog->noid); + if (!logobj) + logobj = parse_object(&reflog->ooid); } if (!logobj || logobj->type != OBJ_COMMIT) { |