revision: do not include sibling history in --ancestry-path output
authorJunio C Hamano <gitster@pobox.com>
Fri, 26 Aug 2011 00:51:50 +0000 (17:51 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 26 Aug 2011 02:40:51 +0000 (19:40 -0700)
If the commit specified as the bottom of the commit range has a direct
parent that has another child commit that contributed to the resulting
history, "rev-list --ancestry-path" was confused and listed that side
history as well, due to the command line parser subtlety corrected by the
previous commit.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
revision.c
t/t6019-rev-list-ancestry-path.sh

index 3e87c8677e0c8b926f0ff54cf7e782d07b41b5df..48a2db439f193271aa757d5afcec0496cbcb1442 100644 (file)
@@ -724,12 +724,16 @@ static void limit_to_ancestry(struct commit_list *bottom, struct commit_list *li
  * to filter the result of "A..B" further to the ones that can actually
  * reach A.
  */
-static struct commit_list *collect_bottom_commits(struct commit_list *list)
+static struct commit_list *collect_bottom_commits(struct rev_info *revs)
 {
-       struct commit_list *elem, *bottom = NULL;
-       for (elem = list; elem; elem = elem->next)
-               if (elem->item->object.flags & UNINTERESTING)
-                       commit_list_insert(elem->item, &bottom);
+       struct commit_list *bottom = NULL;
+       int i;
+       for (i = 0; i < revs->cmdline.nr; i++) {
+               struct rev_cmdline_entry *elem = &revs->cmdline.rev[i];
+               if ((elem->flags & UNINTERESTING) &&
+                   elem->item->type == OBJ_COMMIT)
+                       commit_list_insert((struct commit *)elem->item, &bottom);
+       }
        return bottom;
 }
 
@@ -743,7 +747,7 @@ static int limit_list(struct rev_info *revs)
        struct commit_list *bottom = NULL;
 
        if (revs->ancestry_path) {
-               bottom = collect_bottom_commits(list);
+               bottom = collect_bottom_commits(revs);
                if (!bottom)
                        die("--ancestry-path given but there are no bottom commits");
        }
index aa4674f1df3793b4e5521e2a2b9a7d6e7d414896..738af73393a073c42718ed61ca7be09d47bdc316 100755 (executable)
@@ -99,7 +99,7 @@ test_expect_success 'criss-cross: rev-list --ancestry-path cb..bc' '
 '
 
 # no commits in repository descend from cb
-test_expect_failure 'criss-cross: rev-list --ancestry-path --all ^cb' '
+test_expect_success 'criss-cross: rev-list --ancestry-path --all ^cb' '
        (cd criss-cross &&
         git rev-list --ancestry-path --all ^cb > actual &&
         test -z "$(cat actual)")