From: James Coglan <jcog...@gmail.com>

There's a duplication of logic between `graph_insert_into_new_columns()`
and `graph_update_width()`. `graph_insert_into_new_columns()` is called
repeatedly by `graph_update_columns()` with an `int *` that tracks the
offset into the `mapping` array where we should write the next value.
Each call to `graph_insert_into_new_columns()` effectively pushes one
column index and one "null" value (-1) onto the `mapping` array and
therefore increments `mapping_idx` by 2.

`graph_update_width()` duplicates this process: the `width` of the graph
is essentially the initial width of the `mapping` array before edges
begin collapsing. The `graph_update_width()` function's logic
effectively works out how many times `graph_insert_into_new_columns()`
was called based on the relationship of the current commit to the rest
of the graph.

I'm about to make some changes that make the assignment of values into
the `mapping` array more complicated. Rather than make
`graph_update_width()` more complicated at the same time, we can simply
remove this function and use `graph->width` to track the offset into the
`mapping` array as we're building it. This removes the duplication and
makes sure that `graph->width` is the same as the visual width of the
`mapping` array once `graph_update_columns()` is complete.

Signed-off-by: James Coglan <jcog...@gmail.com>
---
 graph.c | 65 +++++++++------------------------------------------------
 1 file changed, 10 insertions(+), 55 deletions(-)

diff --git a/graph.c b/graph.c
index 1cd30f80e6..a71ae5cd61 100644
--- a/graph.c
+++ b/graph.c
@@ -453,8 +453,7 @@ static int graph_find_new_column_by_commit(struct git_graph 
*graph,
 }
 
 static void graph_insert_into_new_columns(struct git_graph *graph,
-                                         struct commit *commit,
-                                         int *mapping_index)
+                                         struct commit *commit)
 {
        int i = graph_find_new_column_by_commit(graph, commit);
 
@@ -468,50 +467,14 @@ static void graph_insert_into_new_columns(struct 
git_graph *graph,
                graph->new_columns[i].color = graph_find_commit_color(graph, 
commit);
        }
 
-       graph->mapping[*mapping_index] = i;
-       *mapping_index += 2;
-}
-
-static void graph_update_width(struct git_graph *graph,
-                              int is_commit_in_existing_columns)
-{
-       /*
-        * Compute the width needed to display the graph for this commit.
-        * This is the maximum width needed for any row.  All other rows
-        * will be padded to this width.
-        *
-        * Compute the number of columns in the widest row:
-        * Count each existing column (graph->num_columns), and each new
-        * column added by this commit.
-        */
-       int max_cols = graph->num_columns + graph->num_parents;
-
-       /*
-        * Even if the current commit has no parents to be printed, it
-        * still takes up a column for itself.
-        */
-       if (graph->num_parents < 1)
-               max_cols++;
-
-       /*
-        * We added a column for the current commit as part of
-        * graph->num_parents.  If the current commit was already in
-        * graph->columns, then we have double counted it.
-        */
-       if (is_commit_in_existing_columns)
-               max_cols--;
-
-       /*
-        * Each column takes up 2 spaces
-        */
-       graph->width = max_cols * 2;
+       graph->mapping[graph->width] = i;
+       graph->width += 2;
 }
 
 static void graph_update_columns(struct git_graph *graph)
 {
        struct commit_list *parent;
        int max_new_columns;
-       int mapping_idx;
        int i, seen_this, is_commit_in_columns;
 
        /*
@@ -544,6 +507,8 @@ static void graph_update_columns(struct git_graph *graph)
        for (i = 0; i < graph->mapping_size; i++)
                graph->mapping[i] = -1;
 
+       graph->width = 0;
+
        /*
         * Populate graph->new_columns and graph->mapping
         *
@@ -554,7 +519,6 @@ static void graph_update_columns(struct git_graph *graph)
         * supposed to end up after the collapsing is performed.
         */
        seen_this = 0;
-       mapping_idx = 0;
        is_commit_in_columns = 1;
        for (i = 0; i <= graph->num_columns; i++) {
                struct commit *col_commit;
@@ -568,7 +532,6 @@ static void graph_update_columns(struct git_graph *graph)
                }
 
                if (col_commit == graph->commit) {
-                       int old_mapping_idx = mapping_idx;
                        seen_this = 1;
                        graph->commit_index = i;
                        for (parent = first_interesting_parent(graph);
@@ -583,21 +546,18 @@ static void graph_update_columns(struct git_graph *graph)
                                    !is_commit_in_columns) {
                                        graph_increment_column_color(graph);
                                }
-                               graph_insert_into_new_columns(graph,
-                                                             parent->item,
-                                                             &mapping_idx);
+                               graph_insert_into_new_columns(graph, 
parent->item);
                        }
                        /*
-                        * We always need to increment mapping_idx by at
+                        * We always need to increment graph->width by at
                         * least 2, even if it has no interesting parents.
                         * The current commit always takes up at least 2
                         * spaces.
                         */
-                       if (mapping_idx == old_mapping_idx)
-                               mapping_idx += 2;
+                       if (graph->num_parents == 0)
+                               graph->width += 2;
                } else {
-                       graph_insert_into_new_columns(graph, col_commit,
-                                                     &mapping_idx);
+                       graph_insert_into_new_columns(graph, col_commit);
                }
        }
 
@@ -607,11 +567,6 @@ static void graph_update_columns(struct git_graph *graph)
        while (graph->mapping_size > 1 &&
               graph->mapping[graph->mapping_size - 1] < 0)
                graph->mapping_size--;
-
-       /*
-        * Compute graph->width for this commit
-        */
-       graph_update_width(graph, is_commit_in_columns);
 }
 
 void graph_update(struct git_graph *graph, struct commit *commit)
-- 
gitgitgadget

Reply via email to