Merge branch 'rs/pack-objects-pbase-cleanup'
[gitweb.git] / reflog-walk.c
index ed99437ad2068a75d14e739354e1bc17932fd839..81bca2ed23387b4be64c581f35f238a6ffd12a69 100644 (file)
@@ -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 =
@@ -95,10 +111,9 @@ static struct commit_info *get_commit_info(struct commit *commit,
                        struct commit_info *result = &lifo->items[i];
                        if (pop) {
                                if (i + 1 < lifo->nr)
-                                       memmove(lifo->items + i,
-                                               lifo->items + i + 1,
-                                               (lifo->nr - i) *
-                                               sizeof(struct commit_info));
+                                       MOVE_ARRAY(lifo->items + i,
+                                                  lifo->items + i + 1,
+                                                  lifo->nr - i);
                                lifo->nr--;
                        }
                        return result;
@@ -136,6 +151,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 +204,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 +224,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 +265,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) {