diff options
author | Stephen R. van den Berg <srb@cuci.nl> | 2008-04-27 19:32:46 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-04-29 17:47:37 -0700 |
commit | d9c292e8bbd51c84cb9ecd86cb89b8a1b35a2a82 (patch) | |
tree | 43b2a394017dba66ca78ad2d8ead7e94cde9a4c5 /revision.c | |
parent | f0ec47b8e7f46e17e6b6fe1cead728fa24477e43 (diff) | |
download | git-d9c292e8bbd51c84cb9ecd86cb89b8a1b35a2a82.tar.gz git-d9c292e8bbd51c84cb9ecd86cb89b8a1b35a2a82.tar.xz |
Simplify and fix --first-parent implementation
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>
Diffstat (limited to 'revision.c')
-rw-r--r-- | revision.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/revision.c b/revision.c index 4231ea2cc..bcfcd2a82 100644 --- a/revision.c +++ b/revision.c @@ -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; @@ -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; } |