提交 4603ec0f 编写于 作者: A Adam Simpkins 提交者: Junio C Hamano

get_revision(): honor the topo_order flag for boundary commits

Now get_revision() sorts the boundary commits when topo_order is set.
Since sort_in_topological_order() takes a struct commit_list, it first
places the boundary commits into revs->commits.
Signed-off-by: NAdam Simpkins <adam@adamsimpkins.net>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 3c68d67b
...@@ -195,16 +195,9 @@ static int graph_is_interesting(struct git_graph *graph, struct commit *commit) ...@@ -195,16 +195,9 @@ static int graph_is_interesting(struct git_graph *graph, struct commit *commit)
* If revs->boundary is set, commits whose children have * If revs->boundary is set, commits whose children have
* been shown are always interesting, even if they have the * been shown are always interesting, even if they have the
* UNINTERESTING or TREESAME flags set. * UNINTERESTING or TREESAME flags set.
*
* However, ignore the commit if SHOWN is set. If SHOWN is set,
* the commit is interesting, but it has already been printed.
* This can happen because get_revision() doesn't return the
* boundary commits in topological order, even when
* revs->topo_order is set.
*/ */
if (graph->revs && graph->revs->boundary) { if (graph->revs && graph->revs->boundary) {
if ((commit->object.flags & (SHOWN | CHILD_SHOWN)) == if (commit->object.flags & CHILD_SHOWN)
CHILD_SHOWN)
return 1; return 1;
} }
......
...@@ -1612,28 +1612,62 @@ static void gc_boundary(struct object_array *array) ...@@ -1612,28 +1612,62 @@ static void gc_boundary(struct object_array *array)
} }
} }
static void create_boundary_commit_list(struct rev_info *revs)
{
unsigned i;
struct commit *c;
struct object_array *array = &revs->boundary_commits;
struct object_array_entry *objects = array->objects;
/*
* If revs->commits is non-NULL at this point, an error occurred in
* get_revision_1(). Ignore the error and continue printing the
* boundary commits anyway. (This is what the code has always
* done.)
*/
if (revs->commits) {
free_commit_list(revs->commits);
revs->commits = NULL;
}
/*
* Put all of the actual boundary commits from revs->boundary_commits
* into revs->commits
*/
for (i = 0; i < array->nr; i++) {
c = (struct commit *)(objects[i].item);
if (!c)
continue;
if (!(c->object.flags & CHILD_SHOWN))
continue;
if (c->object.flags & (SHOWN | BOUNDARY))
continue;
c->object.flags |= BOUNDARY;
commit_list_insert(c, &revs->commits);
}
/*
* If revs->topo_order is set, sort the boundary commits
* in topological order
*/
sort_in_topological_order(&revs->commits, revs->lifo);
}
static struct commit *get_revision_internal(struct rev_info *revs) static struct commit *get_revision_internal(struct rev_info *revs)
{ {
struct commit *c = NULL; struct commit *c = NULL;
struct commit_list *l; struct commit_list *l;
if (revs->boundary == 2) { if (revs->boundary == 2) {
unsigned i; /*
struct object_array *array = &revs->boundary_commits; * All of the normal commits have already been returned,
struct object_array_entry *objects = array->objects; * and we are now returning boundary commits.
for (i = 0; i < array->nr; i++) { * create_boundary_commit_list() has populated
c = (struct commit *)(objects[i].item); * revs->commits with the remaining commits to return.
if (!c) */
continue; c = pop_commit(&revs->commits);
if (!(c->object.flags & CHILD_SHOWN)) if (c)
continue; c->object.flags |= SHOWN;
if (!(c->object.flags & SHOWN))
break;
}
if (array->nr <= i)
return NULL;
c->object.flags |= SHOWN | BOUNDARY;
return c; return c;
} }
...@@ -1697,6 +1731,13 @@ static struct commit *get_revision_internal(struct rev_info *revs) ...@@ -1697,6 +1731,13 @@ static struct commit *get_revision_internal(struct rev_info *revs)
* switch to boundary commits output mode. * switch to boundary commits output mode.
*/ */
revs->boundary = 2; revs->boundary = 2;
/*
* Update revs->commits to contain the list of
* boundary commits.
*/
create_boundary_commit_list(revs);
return get_revision_internal(revs); return get_revision_internal(revs);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册