From: Junio C Hamano Date: Fri, 7 Jul 2017 17:02:42 +0000 (-0700) Subject: Merge branch 'jk/reflog-walk-maint' into jk/reflog-walk X-Git-Tag: v2.14.2~59^2~8 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/be5982a7945f661c89447feb56a27fbeb6028791?hp=-c 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 --- be5982a7945f661c89447feb56a27fbeb6028791 diff --combined reflog-walk.c index ed99437ad2,ba72020fc3..081f89b70d --- a/reflog-walk.c +++ b/reflog-walk.c @@@ -12,7 -12,7 +12,7 @@@ struct complete_reflogs struct reflog_info { struct object_id ooid, noid; char *email; - unsigned long timestamp; + timestamp_t timestamp; int tz; char *message; } *items; @@@ -20,7 -20,7 +20,7 @@@ }; static int read_one_reflog(struct object_id *ooid, struct object_id *noid, - const char *email, unsigned long timestamp, int tz, + const char *email, timestamp_t timestamp, int tz, const char *message, void *cb_data) { struct complete_reflogs *array = cb_data; @@@ -38,6 -38,22 +38,22 @@@ 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 = @@@ -69,7 -85,7 +85,7 @@@ } static int get_reflog_recno_by_time(struct complete_reflogs *array, - unsigned long timestamp) + timestamp_t timestamp) { int i; for (i = array->nr - 1; i >= 0; i--) @@@ -136,12 -152,13 +152,13 @@@ 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, struct commit *commit, const char *name) { - unsigned long timestamp = 0; + timestamp_t timestamp = 0; int recno = -1; struct string_list_item *item; struct complete_reflogs *reflogs; @@@ -188,20 -205,14 +205,14 @@@ 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 +225,6 @@@ 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; } @@@ -252,13 -259,15 +259,15 @@@ void fake_reflog_parent(struct reflog_w do { reflog = &commit_reflog->reflogs->items[commit_reflog->recno]; commit_reflog->recno--; - logobj = parse_object(reflog->ooid.hash); + logobj = parse_object(&reflog->ooid); } while (commit_reflog->recno && (logobj && logobj->type != OBJ_COMMIT)); - if (!logobj && commit_reflog->recno >= 0 && is_null_sha1(reflog->ooid.hash)) { + if (!logobj && commit_reflog->recno >= 0 && is_null_oid(&reflog->ooid)) { /* a root commit, but there are still more entries to show */ reflog = &commit_reflog->reflogs->items[commit_reflog->recno]; - logobj = parse_object(reflog->noid.hash); + logobj = parse_object(&reflog->noid); + if (!logobj) - logobj = parse_object(reflog->ooid.hash); ++ logobj = parse_object(&reflog->ooid); } if (!logobj || logobj->type != OBJ_COMMIT) {