summaryrefslogtreecommitdiff
path: root/reflog-walk.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2017-07-07 17:02:42 (GMT)
committerJunio C Hamano <gitster@pobox.com>2017-07-07 17:02:42 (GMT)
commitbe5982a7945f661c89447feb56a27fbeb6028791 (patch)
tree66bf43f68593bed527713cedf57ddf02ae568951 /reflog-walk.c
parent8b2efe2a0fd93b8721879f796d848a9ce785647f (diff)
parente30d463d450286ffafb442ecc7686df4004c06ff (diff)
downloadgit-be5982a7945f661c89447feb56a27fbeb6028791.zip
git-be5982a7945f661c89447feb56a27fbeb6028791.tar.gz
git-be5982a7945f661c89447feb56a27fbeb6028791.tar.bz2
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.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/reflog-walk.c b/reflog-walk.c
index ed99437..081f89b 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) {