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. */
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))
}
}
-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 = '`';
}
}
}
+}
+
+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. */
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: