]> git.ipfire.org Git - thirdparty/git.git/commitdiff
graph: smooth appearance of collapsing edges on commit lines
authorJames Coglan <jcoglan@gmail.com>
Tue, 15 Oct 2019 23:47:57 +0000 (23:47 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 16 Oct 2019 02:11:25 +0000 (11:11 +0900)
When a graph contains edges that are in the process of collapsing to the
left, but those edges cross a commit line, the effect is that the edges
have a jagged appearance:

        *
        |\
        | *
        |  \
        *-. \
        |\ \ \
        | | * |
        | * | |
        | |/ /
        * | |
        |/ /
        * |
        |/
        *

We already takes steps to smooth edges like this when they're expanding;
when an edge appears to the right of a merge commit marker on a
GRAPH_COMMIT line immediately following a GRAPH_POST_MERGE line, we
render it as a `\`:

        * \
        |\ \
        | * \
        | |\ \

We can make a similar improvement to collapsing edges, making them
easier to follow and giving the overall graph a feeling of increased
symmetry:

        *
        |\
        | *
        |  \
        *-. \
        |\ \ \
        | | * |
        | * | |
        | |/ /
        * / /
        |/ /
        * /
        |/
        *

To do this, we introduce a new special case for edges on GRAPH_COMMIT
lines that immediately follow a GRAPH_COLLAPSING line. By retaining a
copy of the `mapping` array used to render the GRAPH_COLLAPSING line in
the `old_mapping` array, we can determine that an edge is collapsing
through the GRAPH_COMMIT line and should be smoothed.

Signed-off-by: James Coglan <jcoglan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
graph.c
t/t3430-rebase-merges.sh
t/t4202-log.sh
t/t4214-log-graph-octopus.sh
t/t4215-log-skewed-merges.sh
t/t6016-rev-list-graph-simplify-history.sh

diff --git a/graph.c b/graph.c
index 2315f3604d9a220a8d2b22b89b3cb61e28ce08f1..63f8d18baa7d7a27d87a12312e18c94de673dae3 100644 (file)
--- a/graph.c
+++ b/graph.c
@@ -297,10 +297,10 @@ struct git_graph {
         */
        int *mapping;
        /*
-        * A temporary array for computing the next mapping state
-        * while we are outputting a mapping line.  This is stored as part
-        * of the git_graph simply so we don't have to allocate a new
-        * temporary array each time we have to output a collapsing line.
+        * A copy of the contents of the mapping array from the last commit,
+        * which we use to improve the display of columns that are tracking
+        * from right to left through a commit line.  We also use this to
+        * avoid allocating a fresh array when we compute the next mapping.
         */
        int *old_mapping;
        /*
@@ -1015,6 +1015,10 @@ static void graph_output_commit_line(struct git_graph *graph, struct graph_line
                                graph_line_write_column(line, col, '\\');
                        else
                                graph_line_write_column(line, col, '|');
+               } else if (graph->prev_state == GRAPH_COLLAPSING &&
+                          graph->old_mapping[2 * i + 1] == i &&
+                          graph->mapping[2 * i] < i) {
+                       graph_line_write_column(line, col, '/');
                } else {
                        graph_line_write_column(line, col, '|');
                }
@@ -1211,6 +1215,11 @@ static void graph_output_collapsing_line(struct git_graph *graph, struct graph_l
                }
        }
 
+       /*
+        * Copy the current mapping array into old_mapping
+        */
+       COPY_ARRAY(graph->old_mapping, graph->mapping, graph->mapping_size);
+
        /*
         * The new mapping may be 1 smaller than the old mapping
         */
index 9efcf4808ac92f13272e279fe4d7b660fccf8da3..a30d27e9f366853f6ddca1817088f4aa68ed9291 100755 (executable)
@@ -408,7 +408,7 @@ test_expect_success 'octopus merges' '
        | | * three
        | * | two
        | |/
-       * | one
+       * / one
        |/
        o before-octopus
        EOF
index e803ba402e9e2251b53f5b0acfc15f052722e1e9..ab0d0213650a8b36e60188d2b398db0d24b08a19 100755 (executable)
@@ -667,7 +667,7 @@ cat > expect <<\EOF
 * | | fifth
 * | | fourth
 |/ /
-* | third
+* / third
 |/
 * second
 * initial
index 1b96276894ab5179ebda00d6f8a5e11afcfa1a69..21bc600a82d442eeef8420ea506cd795ed8beb8d 100755 (executable)
@@ -31,9 +31,9 @@ test_expect_success 'log --graph with tricky octopus merge, no color' '
        | | | * 4
        | | * | 3
        | | |/
-       | * | 2
+       | * / 2
        | |/
-       * | 1
+       * / 1
        |/
        * initial
        EOF
@@ -51,9 +51,9 @@ test_expect_success 'log --graph with tricky octopus merge with colors' '
        <RED>|<RESET> <YELLOW>|<RESET> <BLUE>|<RESET> * 4
        <RED>|<RESET> <YELLOW>|<RESET> * <MAGENTA>|<RESET> 3
        <RED>|<RESET> <YELLOW>|<RESET> <MAGENTA>|<RESET><MAGENTA>/<RESET>
-       <RED>|<RESET> * <MAGENTA>|<RESET> 2
+       <RED>|<RESET> * <MAGENTA>/<RESET> 2
        <RED>|<RESET> <MAGENTA>|<RESET><MAGENTA>/<RESET>
-       * <MAGENTA>|<RESET> 1
+       * <MAGENTA>/<RESET> 1
        <MAGENTA>|<RESET><MAGENTA>/<RESET>
        * initial
        EOF
@@ -72,9 +72,9 @@ test_expect_success 'log --graph with normal octopus merge, no color' '
        | | | * 4
        | | * | 3
        | | |/
-       | * | 2
+       | * / 2
        | |/
-       * | 1
+       * / 1
        |/
        * initial
        EOF
@@ -90,9 +90,9 @@ test_expect_success 'log --graph with normal octopus merge with colors' '
        <RED>|<RESET> <GREEN>|<RESET> <YELLOW>|<RESET> * 4
        <RED>|<RESET> <GREEN>|<RESET> * <BLUE>|<RESET> 3
        <RED>|<RESET> <GREEN>|<RESET> <BLUE>|<RESET><BLUE>/<RESET>
-       <RED>|<RESET> * <BLUE>|<RESET> 2
+       <RED>|<RESET> * <BLUE>/<RESET> 2
        <RED>|<RESET> <BLUE>|<RESET><BLUE>/<RESET>
-       * <BLUE>|<RESET> 1
+       * <BLUE>/<RESET> 1
        <BLUE>|<RESET><BLUE>/<RESET>
        * initial
        EOF
@@ -110,9 +110,9 @@ test_expect_success 'log --graph with normal octopus merge and child, no color'
        | | | * 4
        | | * | 3
        | | |/
-       | * | 2
+       | * / 2
        | |/
-       * | 1
+       * / 1
        |/
        * initial
        EOF
@@ -129,9 +129,9 @@ test_expect_failure 'log --graph with normal octopus and child merge with colors
        <GREEN>|<RESET> <YELLOW>|<RESET> <BLUE>|<RESET> * 4
        <GREEN>|<RESET> <YELLOW>|<RESET> * <MAGENTA>|<RESET> 3
        <GREEN>|<RESET> <YELLOW>|<RESET> <MAGENTA>|<RESET><MAGENTA>/<RESET>
-       <GREEN>|<RESET> * <MAGENTA>|<RESET> 2
+       <GREEN>|<RESET> * <MAGENTA>/<RESET> 2
        <GREEN>|<RESET> <MAGENTA>|<RESET><MAGENTA>/<RESET>
-       * <MAGENTA>|<RESET> 1
+       * <MAGENTA>/<RESET> 1
        <MAGENTA>|<RESET><MAGENTA>/<RESET>
        * initial
        EOF
@@ -150,9 +150,9 @@ test_expect_success 'log --graph with tricky octopus merge and its child, no col
        | | | * 4
        | | * | 3
        | | |/
-       | * | 2
+       | * / 2
        | |/
-       * | 1
+       * / 1
        |/
        * initial
        EOF
@@ -171,9 +171,9 @@ test_expect_failure 'log --graph with tricky octopus merge and its child with co
        <RED>|<RESET> <BLUE>|<RESET> <MAGENTA>|<RESET> * 4
        <RED>|<RESET> <BLUE>|<RESET> * <CYAN>|<RESET> 3
        <RED>|<RESET> <BLUE>|<RESET> <CYAN>|<RESET><CYAN>/<RESET>
-       <RED>|<RESET> * <CYAN>|<RESET> 2
+       <RED>|<RESET> * <CYAN>/<RESET> 2
        <RED>|<RESET> <CYAN>|<RESET><CYAN>/<RESET>
-       * <CYAN>|<RESET> 1
+       * <CYAN>/<RESET> 1
        <CYAN>|<RESET><CYAN>/<RESET>
        * initial
        EOF
index e673cdb6f7078f383d6569ede635d62e99f57e16..1745b3b64c4071f799eb80592b03a260bfa168e6 100755 (executable)
@@ -17,7 +17,7 @@ test_expect_success 'log --graph with merge fusing with its left and right neigh
        | | * D
        | * | C
        | |/
-       * | B
+       * / B
        |/
        * A
        EOF
@@ -85,7 +85,7 @@ test_expect_success 'log --graph with nested left-skewed merge' '
        | * | 1_D
        * | | 1_C
        |/ /
-       * | 1_B
+       * / 1_B
        |/
        * 1_A
        EOF
index f7181d1d6a143c60a5c4b26960bd42aa2c88035d..ca1682f29b4a56b37fccdae7e9c5995cfeee62f5 100755 (executable)
@@ -154,7 +154,7 @@ test_expect_success '--graph --full-history -- bar.txt' '
        echo "* |   $A4" >> expected &&
        echo "|\\ \\  " >> expected &&
        echo "| |/  " >> expected &&
-       echo "* | $A3" >> expected &&
+       echo "* / $A3" >> expected &&
        echo "|/  " >> expected &&
        echo "* $A2" >> expected &&
        git rev-list --graph --full-history --all -- bar.txt > actual &&
@@ -255,7 +255,7 @@ test_expect_success '--graph --boundary ^C3' '
        echo "* | | | $A3" >> expected &&
        echo "o | | | $A2" >> expected &&
        echo "|/ / /  " >> expected &&
-       echo "o | | $A1" >> expected &&
+       echo "o / / $A1" >> expected &&
        echo " / /  " >> expected &&
        echo "| o $C3" >> expected &&
        echo "|/  " >> expected &&