Skip to content
  • James Coglan's avatar
    graph: fix coloring of octopus dashes · bbb13e81
    James Coglan authored and Junio C Hamano's avatar Junio C Hamano committed
    In 04005834
    
     ("log: fix coloring of certain octopus merge shapes",
    2018-09-01) there is a fix for the coloring of dashes following an
    octopus merge. It makes a distinction between the case where all parents
    introduce a new column, versus the case where the first parent collapses
    into an existing column:
    
            | *-.           | *-.
            | |\ \          | |\ \
            | | | |         |/ / /
    
    The latter case means that the columns for the merge parents begin one
    place to the left in the `new_columns` array compared to the former
    case.
    
    However, the implementation only works if the commit's parents are kept
    in order as they map onto the visual columns, as we get the colors by
    iterating over `new_columns` as we print the dashes. In general, the
    commit's parents can arbitrarily merge with existing columns, and change
    their ordering in the process.
    
    For example, in the following diagram, the number of each column
    indicates which commit parent appears in each column.
    
            | | *---.
            | | |\ \ \
            | | |/ / /
            | |/| | /
            | |_|_|/
            |/| | |
            3 1 0 2
    
    If the columns are colored (red, green, yellow, blue), then the dashes
    will currently be colored yellow and blue, whereas they should be blue
    and red.
    
    To fix this, we need to look up each column in the `mapping` array,
    which before the `GRAPH_COLLAPSING` state indicates which logical column
    is displayed in each visual column. This implementation is simpler as it
    doesn't have any edge cases, and it also handles how left-skewed first
    parents are now displayed:
    
            | *-.
            |/|\ \
            | | | |
            0 1 2 3
    
    The color of the first dashes is always the color found in `mapping` two
    columns to the right of the commit symbol. Because commits are displayed
    after all edges have been collapsed together and the visual columns
    match the logical ones, we can find the visual offset of the commit
    symbol using `commit_index`.
    
    Signed-off-by: default avatarJames Coglan <jcoglan@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    bbb13e81