X-Git-Url: https://git.distorted.org.uk/~mdw/tig/blobdiff_plain/c8d60a25206a885e9218f57323f40731841c8756..88757ebdbd32ba72232e22d4afe1fe882f719e3d:/tig.c diff --git a/tig.c b/tig.c index 663280a..4e0900a 100644 --- a/tig.c +++ b/tig.c @@ -2792,6 +2792,8 @@ main_draw(struct view *view, struct line *line, unsigned int lineno, bool select struct rev_stack { char rev[SIZEOF_REVITEMS][SIZEOF_REV]; size_t size; + struct commit *commit; + size_t pos; }; /* The current stack of revisions on the graph. */ @@ -2803,11 +2805,15 @@ static struct rev_stack graph_parents[2]; static size_t graph_last_rev; +static inline void +append_to_rev_graph(struct rev_stack *stack, chtype symbol) +{ + stack->commit->graph[stack->commit->graph_size++] = symbol; +} + static void push_rev_stack(struct rev_stack *stack, char *parent) { - fprintf(stderr, " (%s)", parent); - /* Combine duplicate parents lines. */ if (stack->size > 0 && !strncmp(stack->rev[stack->size - 1], parent, SIZEOF_REV)) @@ -2818,71 +2824,45 @@ push_rev_stack(struct rev_stack *stack, char *parent) } } -void -update_rev_graph(struct commit *commit) +static void +draw_rev_graph(struct rev_stack *stack, struct rev_stack *parents, + struct rev_stack *prev_parents) { - struct rev_stack *parents = &graph_parents[graph_stack_no & 1]; - struct rev_stack *stack = &graph_stacks[graph_stack_no++ & 1]; - struct rev_stack *prev_parents = &graph_parents[graph_stack_no & 1]; - struct rev_stack *graph = &graph_stacks[graph_stack_no & 1]; chtype symbol, separator, line; - size_t stackpos = 0; size_t i; - fprintf(stderr, "\n%p <%s> ", graph, commit->id); - - /* First traverse all lines of revisions up to the active one. */ - for (stackpos = 0; stackpos < stack->size; stackpos++) { - if (!strcmp(stack->rev[stackpos], commit->id)) { - break; - } - - push_rev_stack(graph, stack->rev[stackpos]); - } - - assert(commit->graph_size < ARRAY_SIZE(commit->graph)); - - for (i = 0; i < parents->size; i++) - push_rev_stack(graph, parents->rev[i]); - /* Place the symbol for this commit. */ if (parents->size == 0) symbol = REVGRAPH_INIT; else if (parents->size > 1) symbol = REVGRAPH_MERGE; - else if (stackpos >= stack->size) + else if (stack->pos >= stack->size) symbol = REVGRAPH_BRANCH; else symbol = REVGRAPH_COMMIT; - i = stackpos + 1; - - /* FIXME: Moving branches left and right when collapsing a branch. */ - while (i < stack->size) - push_rev_stack(graph, stack->rev[i++]); - separator = ' '; line = REVGRAPH_LINE; - for (i = 0; i < stackpos; i++) { - commit->graph[commit->graph_size++] = line; + for (i = 0; i < stack->pos; i++) { + append_to_rev_graph(stack, line); if (prev_parents->size > 1 && i == graph_last_rev) { separator = '`'; line = '.'; } - commit->graph[commit->graph_size++] = separator; + append_to_rev_graph(stack, separator); } - commit->graph[commit->graph_size++] = symbol; + append_to_rev_graph(stack, symbol); separator = ' '; line = REVGRAPH_LINE; i++; for (; i < stack->size; i++) { - commit->graph[commit->graph_size++] = separator; - commit->graph[commit->graph_size++] = line; + append_to_rev_graph(stack, separator); + append_to_rev_graph(stack, line); if (prev_parents->size > 1) { if (i < graph_last_rev + prev_parents->size) { separator = '`'; @@ -2890,9 +2870,41 @@ update_rev_graph(struct commit *commit) } } } +} + +void +update_rev_graph(struct commit *commit) +{ + struct rev_stack *parents = &graph_parents[graph_stack_no & 1]; + struct rev_stack *stack = &graph_stacks[graph_stack_no++ & 1]; + struct rev_stack *prev_parents = &graph_parents[graph_stack_no & 1]; + struct rev_stack *graph = &graph_stacks[graph_stack_no & 1]; + size_t i; + + stack->commit = commit; + + /* First traverse all lines of revisions up to the active one. */ + for (stack->pos = 0; stack->pos < stack->size; stack->pos++) { + if (!strcmp(stack->rev[stack->pos], commit->id)) + break; + + push_rev_stack(graph, stack->rev[stack->pos]); + } + + assert(commit->graph_size < ARRAY_SIZE(commit->graph)); + + for (i = 0; i < parents->size; i++) + push_rev_stack(graph, parents->rev[i]); + + /* FIXME: Moving branches left and right when collapsing a branch. */ + for (i = stack->pos + 1; i < stack->size; i++) + push_rev_stack(graph, stack->rev[i]); + + draw_rev_graph(stack, parents, prev_parents); - graph_last_rev = stackpos; - stack->size = prev_parents->size = 0; + graph_last_rev = stack->pos; + memset(stack, 0, sizeof(*stack)); + memset(prev_parents, 0, sizeof(*stack)); } /* Reads git log --pretty=raw output and parses it into the commit struct. */ @@ -2914,7 +2926,6 @@ main_read(struct view *view, char *line) view->line[view->lines++].data = commit; string_copy(commit->id, line); commit->refs = get_refs(commit->id); - fprintf(stderr, "\n%p [%s]", &graph_stacks[graph_stack_no & 1], commit->id); break; case LINE_PARENT: