struct git_graph *graph = data;
        static struct strbuf msgbuf = STRBUF_INIT;
 
+       assert(opt);
        assert(graph);
 
+       opt->output_prefix_length = graph->width;
        strbuf_reset(&msgbuf);
        graph_padding_line(graph, &msgbuf);
        return &msgbuf;
         */
        opt->diffopt.output_prefix = diff_output_prefix_callback;
        opt->diffopt.output_prefix_data = graph;
+       opt->diffopt.output_prefix_length = 0;
 
        return graph;
 }
                graph->column_capacity *= 2;
        } while (graph->column_capacity < num_columns);
 
-       graph->columns = xrealloc(graph->columns,
-                                 sizeof(struct column) *
-                                 graph->column_capacity);
-       graph->new_columns = xrealloc(graph->new_columns,
-                                     sizeof(struct column) *
-                                     graph->column_capacity);
-       graph->mapping = xrealloc(graph->mapping,
-                                 sizeof(int) * 2 * graph->column_capacity);
-       graph->new_mapping = xrealloc(graph->new_mapping,
-                                     sizeof(int) * 2 * graph->column_capacity);
+       REALLOC_ARRAY(graph->columns, graph->column_capacity);
+       REALLOC_ARRAY(graph->new_columns, graph->column_capacity);
+       REALLOC_ARRAY(graph->mapping, graph->column_capacity * 2);
+       REALLOC_ARRAY(graph->new_mapping, graph->column_capacity * 2);
 }
 
 /*
        int num_dashes =
                ((graph->num_parents - dashless_commits) * 2) - 1;
        for (i = 0; i < num_dashes; i++) {
-               col_num = (i / 2) + dashless_commits;
+               col_num = (i / 2) + dashless_commits + graph->commit_index;
                strbuf_write_column(sb, &graph->new_columns[col_num], '-');
        }
-       col_num = (i / 2) + dashless_commits;
+       col_num = (i / 2) + dashless_commits + graph->commit_index;
        strbuf_write_column(sb, &graph->new_columns[col_num], '.');
        return num_dashes + 1;
 }
 
 static void graph_padding_line(struct git_graph *graph, struct strbuf *sb)
 {
-       int i, j;
+       int i;
 
        if (graph->state != GRAPH_COMMIT) {
                graph_next_line(graph, sb);
         */
        for (i = 0; i < graph->num_columns; i++) {
                struct column *col = &graph->columns[i];
-               struct commit *col_commit = col->commit;
-               if (col_commit == graph->commit) {
-                       strbuf_write_column(sb, col, '|');
-
-                       if (graph->num_parents < 3)
-                               strbuf_addch(sb, ' ');
-                       else {
-                               int num_spaces = ((graph->num_parents - 2) * 2);
-                               for (j = 0; j < num_spaces; j++)
-                                       strbuf_addch(sb, ' ');
-                       }
-               } else {
-                       strbuf_write_column(sb, col, '|');
+               strbuf_write_column(sb, col, '|');
+               if (col->commit == graph->commit && graph->num_parents > 2)
+                       strbuf_addchars(sb, ' ', (graph->num_parents - 2) * 2);
+               else
                        strbuf_addch(sb, ' ');
-               }
        }
 
        graph_pad_horizontally(graph, sb, graph->num_columns);
        if (!graph)
                return;
 
-       while (!shown_commit_line) {
+       /*
+        * When showing a diff of a merge against each of its parents, we
+        * are called once for each parent without graph_update having been
+        * called.  In this case, simply output a single padding line.
+        */
+       if (graph_is_commit_finished(graph)) {
+               graph_show_padding(graph);
+               shown_commit_line = 1;
+       }
+
+       while (!shown_commit_line && !graph_is_commit_finished(graph)) {
                shown_commit_line = graph_next_line(graph, &msgbuf);
                fwrite(msgbuf.buf, sizeof(char), msgbuf.len, stdout);
                if (!shown_commit_line)