Skip to content

Commit

Permalink
Simplify and fix --first-parent implementation
Browse files Browse the repository at this point in the history
The purpose of --first-parent is to view the tree without looking at
side branche.  This is accomplished by pretending there are no other
parents than the first parent when encountering a merge.

The current code marks the other parents as seen, which means that the tree
traversal will behave differently depending on the order merges are handled.

When a fast forward is artificially recorded as a merge,

       -----
      /     \
 D---E---F---G master

the current first-parent code considers E to be seen and stops the
traversal after showing G and F.

Signed-off-by: Stephen R. van den Berg <srb@cuci.nl>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Stephen R. van den Berg authored and Junio C Hamano committed Apr 30, 2008
1 parent f0ec47b commit d9c292e
Showing 1 changed file with 4 additions and 6 deletions.
10 changes: 4 additions & 6 deletions revision.c
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,6 @@ static int add_parents_to_list(struct rev_info *revs, struct commit *commit, str
{
struct commit_list *parent = commit->parents;
unsigned left_flag;
int add, rest;

if (commit->object.flags & ADDED)
return 0;
Expand Down Expand Up @@ -462,19 +461,18 @@ static int add_parents_to_list(struct rev_info *revs, struct commit *commit, str

left_flag = (commit->object.flags & SYMMETRIC_LEFT);

rest = !revs->first_parent_only;
for (parent = commit->parents, add = 1; parent; add = rest) {
for (parent = commit->parents; parent; parent = parent->next) {
struct commit *p = parent->item;

parent = parent->next;
if (parse_commit(p) < 0)
return -1;
p->object.flags |= left_flag;
if (p->object.flags & SEEN)
continue;
p->object.flags |= SEEN;
if (add)
insert_by_date(p, list);
insert_by_date(p, list);
if(revs->first_parent_only)
break;
}
return 0;
}
Expand Down

0 comments on commit d9c292e

Please sign in to comment.