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: Adam Simpkins <adam@adamsimpkins.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
3c68d67b57
commit
4603ec0f96
9
graph.c
9
graph.c
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
73
revision.c
73
revision.c
@ -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)
|
|||||||
* 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user