Note that git-branch will not automatically checkout the new branch
[gitweb.git] / reflog-walk.c
index 653ec956f08141b3e15f52665cef7a260f8ed6a4..ee1456b45a2e1bfe08564400c12015889e57cf12 100644 (file)
@@ -136,7 +136,7 @@ void init_reflog_walk(struct reflog_walk_info** info)
        *info = xcalloc(sizeof(struct reflog_walk_info), 1);
 }
 
-void add_reflog_for_walk(struct reflog_walk_info *info,
+int add_reflog_for_walk(struct reflog_walk_info *info,
                struct commit *commit, const char *name)
 {
        unsigned long timestamp = 0;
@@ -174,8 +174,21 @@ void add_reflog_for_walk(struct reflog_walk_info *info,
                        branch = xstrdup(head);
                }
                reflogs = read_complete_reflog(branch);
+               if (!reflogs || reflogs->nr == 0) {
+                       unsigned char sha1[20];
+                       char *b;
+                       if (dwim_log(branch, strlen(branch), sha1, &b) == 1) {
+                               if (reflogs) {
+                                       free(reflogs->ref);
+                                       free(reflogs);
+                               }
+                               free(branch);
+                               branch = b;
+                               reflogs = read_complete_reflog(branch);
+                       }
+               }
                if (!reflogs || reflogs->nr == 0)
-                       die("No reflogs found for '%s'", branch);
+                       return -1;
                path_list_insert(branch, &info->complete_reflogs)->util
                        = reflogs;
        }
@@ -187,13 +200,14 @@ void add_reflog_for_walk(struct reflog_walk_info *info,
                if (commit_reflog->recno < 0) {
                        free(branch);
                        free(commit_reflog);
-                       return;
+                       return -1;
                }
        } else
                commit_reflog->recno = reflogs->nr - recno - 1;
        commit_reflog->reflogs = reflogs;
 
        add_commit_info(commit, commit_reflog, &info->reflogs);
+       return 0;
 }
 
 void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit)
@@ -227,7 +241,8 @@ void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit)
        commit->object.flags &= ~(ADDED | SEEN | SHOWN);
 }
 
-void show_reflog_message(struct reflog_walk_info* info, int oneline)
+void show_reflog_message(struct reflog_walk_info* info, int oneline,
+       int relative_date)
 {
        if (info && info->last_commit_reflog) {
                struct commit_reflog *commit_reflog = info->last_commit_reflog;
@@ -236,7 +251,7 @@ void show_reflog_message(struct reflog_walk_info* info, int oneline)
                info = &commit_reflog->reflogs->items[commit_reflog->recno+1];
                if (oneline) {
                        printf("%s@{", commit_reflog->reflogs->ref);
-                       if (commit_reflog->flag)
+                       if (commit_reflog->flag || relative_date)
                                printf("%s", show_date(info->timestamp, 0, 1));
                        else
                                printf("%d", commit_reflog->reflogs->nr
@@ -245,9 +260,10 @@ void show_reflog_message(struct reflog_walk_info* info, int oneline)
                }
                else {
                        printf("Reflog: %s@{", commit_reflog->reflogs->ref);
-                       if (commit_reflog->flag)
-                               printf("%s", show_rfc2822_date(info->timestamp,
-                                                              info->tz));
+                       if (commit_reflog->flag || relative_date)
+                               printf("%s", show_date(info->timestamp,
+                                                       info->tz,
+                                                       relative_date));
                        else
                                printf("%d", commit_reflog->reflogs->nr
                                       - 2 - commit_reflog->recno);