graph API: don't print branch lines for uninteresting merge parents

Previously, the graphing code printed lines coming out of a merge commit
for all of its parents, even if some of them were uninteresting.  Now it
only prints lines for interesting commits.

For example, for a merge commit where only the first parent is
interesting, the code now prints:

  *  merge commit
  *  interesting child

instead of:

  M  merge commit
  |\
  *  interesting child

Signed-off-by: Adam Simpkins <adam@adamsimpkins.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Adam Simpkins 2008-05-23 19:24:11 -07:00 коммит произвёл Junio C Hamano
Родитель 2ecbd0a0db
Коммит 37a75abc98
1 изменённых файлов: 44 добавлений и 13 удалений

57
graph.c
Просмотреть файл

@ -55,9 +55,11 @@ struct git_graph {
*/ */
struct commit *commit; struct commit *commit;
/* /*
* The number of parents this commit has. * The number of interesting parents that this commit has.
* (Stored so we don't have to walk over them each time we need *
* this number) * Note that this is not the same as the actual number of parents.
* This count excludes parents that won't be printed in the graph
* output, as determined by graph_is_interesting().
*/ */
int num_parents; int num_parents;
/* /*
@ -180,6 +182,18 @@ static void graph_ensure_capacity(struct git_graph *graph, int num_columns)
sizeof(int) * 2 * graph->column_capacity); sizeof(int) * 2 * graph->column_capacity);
} }
/*
* Returns 1 if the commit will be printed in the graph output,
* and 0 otherwise.
*/
static int graph_is_interesting(struct commit *commit)
{
/*
* Uninteresting and pruned commits won't be printed
*/
return (commit->object.flags & (UNINTERESTING | TREESAME)) ? 0 : 1;
}
static void graph_insert_into_new_columns(struct git_graph *graph, static void graph_insert_into_new_columns(struct git_graph *graph,
struct commit *commit, struct commit *commit,
int *mapping_index) int *mapping_index)
@ -187,13 +201,10 @@ static void graph_insert_into_new_columns(struct git_graph *graph,
int i; int i;
/* /*
* Ignore uinteresting and pruned commits * Ignore uinteresting commits
*/ */
if (commit->object.flags & (UNINTERESTING | TREESAME)) if (!graph_is_interesting(commit))
{
*mapping_index += 2;
return; return;
}
/* /*
* If the commit is already in the new_columns list, we don't need to * If the commit is already in the new_columns list, we don't need to
@ -231,8 +242,8 @@ static void graph_update_width(struct git_graph *graph,
int max_cols = graph->num_columns + graph->num_parents; int max_cols = graph->num_columns + graph->num_parents;
/* /*
* Even if the current commit has no parents, it still takes up a * Even if the current commit has no parents to be printed, it
* column for itself. * still takes up a column for itself.
*/ */
if (graph->num_parents < 1) if (graph->num_parents < 1)
max_cols++; max_cols++;
@ -316,6 +327,7 @@ static void graph_update_columns(struct git_graph *graph)
} }
if (col_commit == graph->commit) { if (col_commit == graph->commit) {
int old_mapping_idx = mapping_idx;
seen_this = 1; seen_this = 1;
for (parent = graph->commit->parents; for (parent = graph->commit->parents;
parent; parent;
@ -324,6 +336,14 @@ static void graph_update_columns(struct git_graph *graph)
parent->item, parent->item,
&mapping_idx); &mapping_idx);
} }
/*
* We always need to increment mapping_idx 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;
} else { } else {
graph_insert_into_new_columns(graph, col_commit, graph_insert_into_new_columns(graph, col_commit,
&mapping_idx); &mapping_idx);
@ -353,11 +373,13 @@ void graph_update(struct git_graph *graph, struct commit *commit)
graph->commit = commit; graph->commit = commit;
/* /*
* Count how many parents this commit has * Count how many interesting parents this commit has
*/ */
graph->num_parents = 0; graph->num_parents = 0;
for (parent = commit->parents; parent; parent = parent->next) for (parent = commit->parents; parent; parent = parent->next) {
graph->num_parents++; if (graph_is_interesting(parent->item))
graph->num_parents++;
}
/* /*
* Call graph_update_columns() to update * Call graph_update_columns() to update
@ -543,6 +565,15 @@ void graph_output_commit_line(struct git_graph *graph, struct strbuf *sb)
if (col_commit == graph->commit) { if (col_commit == graph->commit) {
seen_this = 1; seen_this = 1;
/*
* If the commit has more than 1 interesting
* parent, print 'M' to indicate that it is a
* merge. Otherwise, print '*'.
*
* Note that even if this is actually a merge
* commit, we still print '*' if less than 2 of its
* parents are interesting.
*/
if (graph->num_parents > 1) if (graph->num_parents > 1)
strbuf_addch(sb, 'M'); strbuf_addch(sb, 'M');
else else