Merge branch 'jk/reflog-walk-maint' into jk/reflog-walk
authorJunio C Hamano <gitster@pobox.com>
Fri, 7 Jul 2017 17:02:42 +0000 (10:02 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 7 Jul 2017 17:02:42 +0000 (10:02 -0700)
* 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

1  2 
reflog-walk.c
diff --combined reflog-walk.c
index ed99437ad2068a75d14e739354e1bc17932fd839,ba72020fc349d4ea9f9366ced9af43372980e988..081f89b70d643514f148aaff9121263361fdb956
@@@ -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;
        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;
                        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;
                }
        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) {