Merge branch 'np/log-graph-octopus-fix'
authorJunio C Hamano <gitster@pobox.com>
Fri, 26 Oct 2018 05:22:11 +0000 (14:22 +0900)
committerJunio C Hamano <gitster@pobox.com>
Fri, 26 Oct 2018 05:22:11 +0000 (14:22 +0900)
"git log --graph" showing an octopus merge sometimes miscounted the
number of display columns it is consuming to show the merge and its
parent commits, which has been corrected.

* np/log-graph-octopus-fix:
log: fix coloring of certain octopus merge shapes

1  2 
graph.c
diff --combined graph.c
index e1f6d3bddb38aadd4e439aea30f542d286ecb98e,61e046ec31ddd8324d1f2863d2692b239626fa25..f53135485f565baf7a0de1a5e4cffe2a4b2b55bd
+++ b/graph.c
@@@ -696,8 -696,12 +696,8 @@@ static void graph_pad_horizontally(stru
         * This way, fields printed to the right of the graph will remain
         * aligned for the entire commit.
         */
 -      int extra;
 -      if (chars_written >= graph->width)
 -              return;
 -
 -      extra = graph->width - chars_written;
 -      strbuf_addf(sb, "%*s", (int) extra, "");
 +      if (chars_written < graph->width)
 +              strbuf_addchars(sb, ' ', graph->width - chars_written);
  }
  
  static void graph_output_padding_line(struct git_graph *graph,
@@@ -783,7 -787,7 +783,7 @@@ static void graph_output_pre_commit_lin
                if (col->commit == graph->commit) {
                        seen_this = 1;
                        strbuf_write_column(sb, col, '|');
 -                      strbuf_addf(sb, "%*s", graph->expansion_row, "");
 +                      strbuf_addchars(sb, ' ', graph->expansion_row);
                        chars_written += 1 + graph->expansion_row;
                } else if (seen_this && (graph->expansion_row == 0)) {
                        /*
@@@ -842,27 -846,55 +842,55 @@@ static void graph_output_commit_char(st
  }
  
  /*
-  * Draw an octopus merge and return the number of characters written.
+  * Draw the horizontal dashes of an octopus merge and return the number of
+  * characters written.
   */
  static int graph_draw_octopus_merge(struct git_graph *graph,
                                    struct strbuf *sb)
  {
        /*
-        * Here dashless_commits represents the number of parents
-        * which don't need to have dashes (because their edges fit
-        * neatly under the commit).
-        */
-       const int dashless_commits = 2;
-       int col_num, i;
-       int num_dashes =
-               ((graph->num_parents - dashless_commits) * 2) - 1;
-       for (i = 0; i < num_dashes; i++) {
-               col_num = (i / 2) + dashless_commits + graph->commit_index;
-               strbuf_write_column(sb, &graph->new_columns[col_num], '-');
+        * Here dashless_parents represents the number of parents which don't
+        * need to have dashes (the edges labeled "0" and "1").  And
+        * dashful_parents are the remaining ones.
+        *
+        * | *---.
+        * | |\ \ \
+        * | | | | |
+        * x 0 1 2 3
+        *
+        */
+       const int dashless_parents = 2;
+       int dashful_parents = graph->num_parents - dashless_parents;
+       /*
+        * Usually, we add one new column for each parent (like the diagram
+        * above) but sometimes the first parent goes into an existing column,
+        * like this:
+        *
+        * | *---.
+        * | |\ \ \
+        * |/ / / /
+        * x 0 1 2
+        *
+        * In which case the number of parents will be one greater than the
+        * number of added columns.
+        */
+       int added_cols = (graph->num_new_columns - graph->num_columns);
+       int parent_in_old_cols = graph->num_parents - added_cols;
+       /*
+        * In both cases, commit_index corresponds to the edge labeled "0".
+        */
+       int first_col = graph->commit_index + dashless_parents
+           - parent_in_old_cols;
+       int i;
+       for (i = 0; i < dashful_parents; i++) {
+               strbuf_write_column(sb, &graph->new_columns[i+first_col], '-');
+               strbuf_write_column(sb, &graph->new_columns[i+first_col],
+                                   i == dashful_parents-1 ? '.' : '-');
        }
-       col_num = (i / 2) + dashless_commits + graph->commit_index;
-       strbuf_write_column(sb, &graph->new_columns[col_num], '.');
-       return num_dashes + 1;
+       return 2 * dashful_parents;
  }
  
  static void graph_output_commit_line(struct git_graph *graph, struct strbuf *sb)