Skip to content

Commit

Permalink
sort_in_topological_order(): avoid setting a commit flag
Browse files Browse the repository at this point in the history
We used to set the TOPOSORT flag of commits during the topological
sorting, but we can just as well use the member "indegree" for it:
indegree is now incremented by 1 in the cases where the commit used
to have the TOPOSORT flag.

This is the same behavior as before, since indegree could not be
non-zero when TOPOSORT was unset.

Incidentally, this fixes the bug in show-branch where the 8th column
was not shown: show-branch sorts the commits in topological order,
assuming that all the commit flags are available for show-branch's
private matters.

But this was not true: TOPOSORT was identical to the flag corresponding
to the 8th ref.  So the flags for the 8th column were unset by the
topological sorting.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Johannes Schindelin authored and Junio C Hamano committed Aug 2, 2008
1 parent b1264da commit 11ee57b
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 8 deletions.
13 changes: 6 additions & 7 deletions commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -428,8 +428,7 @@ void sort_in_topological_order(struct commit_list ** list, int lifo)
/* Mark them and clear the indegree */
for (next = orig; next; next = next->next) {
struct commit *commit = next->item;
commit->object.flags |= TOPOSORT;
commit->indegree = 0;
commit->indegree = 1;
}

/* update the indegree */
Expand All @@ -438,7 +437,7 @@ void sort_in_topological_order(struct commit_list ** list, int lifo)
while (parents) {
struct commit *parent = parents->item;

if (parent->object.flags & TOPOSORT)
if (parent->indegree)
parent->indegree++;
parents = parents->next;
}
Expand All @@ -456,7 +455,7 @@ void sort_in_topological_order(struct commit_list ** list, int lifo)
for (next = orig; next; next = next->next) {
struct commit *commit = next->item;

if (!commit->indegree)
if (commit->indegree == 1)
insert = &commit_list_insert(commit, insert)->next;
}

Expand All @@ -478,15 +477,15 @@ void sort_in_topological_order(struct commit_list ** list, int lifo)
for (parents = commit->parents; parents ; parents = parents->next) {
struct commit *parent=parents->item;

if (!(parent->object.flags & TOPOSORT))
if (!parent->indegree)
continue;

/*
* parents are only enqueued for emission
* when all their children have been emitted thereby
* guaranteeing topological order.
*/
if (!--parent->indegree) {
if (--parent->indegree == 1) {
if (!lifo)
insert_by_date(parent, &work);
else
Expand All @@ -497,7 +496,7 @@ void sort_in_topological_order(struct commit_list ** list, int lifo)
* work_item is a commit all of whose children
* have already been emitted. we can emit it now.
*/
commit->object.flags &= ~TOPOSORT;
commit->indegree = 0;
*pptr = work_item;
pptr = &work_item->next;
}
Expand Down
1 change: 0 additions & 1 deletion revision.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
#define CHILD_SHOWN (1u<<6)
#define ADDED (1u<<7) /* Parents already parsed and added? */
#define SYMMETRIC_LEFT (1u<<8)
#define TOPOSORT (1u<<9) /* In the active toposort list.. */

struct rev_info;
struct log_info;
Expand Down
59 changes: 59 additions & 0 deletions t/t3202-show-branch-octopus.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#!/bin/sh

test_description='test show-branch with more than 8 heads'

. ./test-lib.sh

numbers="1 2 3 4 5 6 7 8 9 10"

test_expect_success 'setup' '
> file &&
git add file &&
test_tick &&
git commit -m initial &&
for i in $numbers
do
git checkout -b branch$i master &&
> file$i &&
git add file$i &&
test_tick &&
git commit -m branch$i || break
done
'

cat > expect << EOF
! [branch1] branch1
! [branch2] branch2
! [branch3] branch3
! [branch4] branch4
! [branch5] branch5
! [branch6] branch6
! [branch7] branch7
! [branch8] branch8
! [branch9] branch9
* [branch10] branch10
----------
* [branch10] branch10
+ [branch9] branch9
+ [branch8] branch8
+ [branch7] branch7
+ [branch6] branch6
+ [branch5] branch5
+ [branch4] branch4
+ [branch3] branch3
+ [branch2] branch2
+ [branch1] branch1
+++++++++* [branch10^] initial
EOF

test_expect_success 'show-branch with more than 8 branches' '
git show-branch $(for i in $numbers; do echo branch$i; done) > out &&
test_cmp expect out
'

test_done

0 comments on commit 11ee57b

Please sign in to comment.