]> granicus.if.org Git - git/commitdiff
sequencer (rebase -i): learn about the 'verbose' mode
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Mon, 2 Jan 2017 15:26:53 +0000 (16:26 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 9 Jan 2017 22:57:29 +0000 (14:57 -0800)
When calling `git rebase -i -v`, the user wants to see some statistics
after the commits were rebased. Let's show some.

The strbuf we use to perform that task will be used for other things
in subsequent commits, hence it is declared and initialized in a wider
scope than strictly needed here.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sequencer.c
sequencer.h

index e9c10d7fe55057d6f1791ac3e7595a8192954ee1..ddc4d144d7d58d46101a9e84e52c9a4b1b07e6c2 100644 (file)
@@ -65,6 +65,8 @@ static GIT_PATH_FUNC(rebase_path_stopped_sha, "rebase-merge/stopped-sha")
  * command-line (and are only consumed, not modified, by the sequencer).
  */
 static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt")
+static GIT_PATH_FUNC(rebase_path_orig_head, "rebase-merge/orig-head")
+static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
 
 static inline int is_rebase_i(const struct replay_opts *opts)
 {
@@ -1088,6 +1090,9 @@ static int read_populate_opts(struct replay_opts *opts)
                }
                strbuf_release(&buf);
 
+               if (file_exists(rebase_path_verbose()))
+                       opts->verbose = 1;
+
                return 0;
        }
 
@@ -1491,9 +1496,32 @@ static int pick_commits(struct todo_list *todo_list, struct replay_opts *opts)
        }
 
        if (is_rebase_i(opts)) {
+               struct strbuf buf = STRBUF_INIT;
+
                /* Stopped in the middle, as planned? */
                if (todo_list->current < todo_list->nr)
                        return 0;
+
+               if (opts->verbose) {
+                       struct rev_info log_tree_opt;
+                       struct object_id orig, head;
+
+                       memset(&log_tree_opt, 0, sizeof(log_tree_opt));
+                       init_revisions(&log_tree_opt, NULL);
+                       log_tree_opt.diff = 1;
+                       log_tree_opt.diffopt.output_format =
+                               DIFF_FORMAT_DIFFSTAT;
+                       log_tree_opt.disable_stdin = 1;
+
+                       if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
+                           !get_sha1(buf.buf, orig.hash) &&
+                           !get_sha1("HEAD", head.hash)) {
+                               diff_tree_sha1(orig.hash, head.hash,
+                                              "", &log_tree_opt.diffopt);
+                               log_tree_diff_flush(&log_tree_opt);
+                       }
+               }
+               strbuf_release(&buf);
        }
 
        /*
index cb21cfddeec5db9cf74b37d179ea0b1f8c9b147f..f885b68395f4bff1ded96c0ab84ed87d164f0c7d 100644 (file)
@@ -24,6 +24,7 @@ struct replay_opts {
        int allow_empty;
        int allow_empty_message;
        int keep_redundant_commits;
+       int verbose;
 
        int mainline;