rev-list --min-parents,--max-parents: doc, test and completion
authorMichael J Gruber <git@drmicha.warpmail.net>
Wed, 23 Mar 2011 09:38:51 +0000 (10:38 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 23 Mar 2011 17:20:24 +0000 (10:20 -0700)
This also adds test for "--merges" and "--no-merges" which we did not
have so far.

Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-rev-list.txt
Documentation/rev-list-options.txt
contrib/completion/git-completion.bash
t/t6009-rev-list-parent.sh

index 8a891ca68dc9ab3e0d547256166d41db81bf22f5..b2be2029dd7c3012475f34e4ce6b3f9e33e94671 100644 (file)
@@ -16,6 +16,10 @@ SYNOPSIS
             [ \--sparse ]
             [ \--merges ]
             [ \--no-merges ]
+            [ \--min-parents=<number> ]
+            [ \--no-min-parents ]
+            [ \--max-parents=<number> ]
+            [ \--no-max-parents ]
             [ \--first-parent ]
             [ \--remove-empty ]
             [ \--full-history ]
index 95d209c11da4ab829d0617894cad637f96da3f24..a02bb4ba5b77025fe8a72ec502cd4ace2a2b5d7e 100644 (file)
@@ -226,11 +226,26 @@ endif::git-rev-list[]
 
 --merges::
 
-       Print only merge commits.
+       Print only merge commits. This is exactly the same as `--min-parents=2`.
 
 --no-merges::
 
-       Do not print commits with more than one parent.
+       Do not print commits with more than one parent. This is
+       exactly the same as `--max-parents=1`.
+
+--min-parents=<number>::
+--max-parents=<number>::
+--no-min-parents::
+--no-max-parents::
+
+       Show only commits which have at least (or at most) that many
+       commits. In particular, `--max-parents=1` is the same as `--no-merges`,
+       `--min-parents=2` is the same as `--merges`.  `--max-parents=0`
+       gives all root commits and `--min-parents=3` all octopus merges.
++
+`--no-min-parents` and `--no-max-parents` reset these limits (to no limit)
+again.  Equivalent forms are `--min-parents=0` (any commit has 0 or more
+parents) and `--max-parents=-1` (negative numbers denote no upper limit).
 
 --first-parent::
        Follow only the first parent commit upon seeing a merge
index 893b7716cafa4811d237480a980140d308aa20dc..628970a8aee287d19c1ececa53002445175a64dd 100755 (executable)
@@ -1572,6 +1572,8 @@ __git_log_common_options="
        --max-count=
        --max-age= --since= --after=
        --min-age= --until= --before=
+       --min-parents= --max-parents=
+       --no-min-parents --no-max-parents
 "
 # Options that go well for log and gitk (not shortlog)
 __git_log_gitk_options="
index 0f0e45773095f713245092cd94e8e7042a939185..fc89d6d6b4521ebfab62ca33fc05058fe71e5911 100755 (executable)
@@ -1,9 +1,17 @@
 #!/bin/sh
 
-test_description='properly cull all ancestors'
+test_description='ancestor culling and limiting by parent number'
 
 . ./test-lib.sh
 
+check_revlist () {
+       rev_list_args="$1" &&
+       shift &&
+       git rev-parse "$@" >expect &&
+       git rev-list $rev_list_args --all >actual &&
+       test_cmp expect actual
+}
+
 test_expect_success setup '
 
        touch file &&
@@ -28,4 +36,101 @@ test_expect_success 'one is ancestor of others and should not be shown' '
 
 '
 
+test_expect_success 'setup roots, merges and octopuses' '
+
+       git checkout --orphan newroot &&
+       test_commit five &&
+       git checkout -b sidebranch two &&
+       test_commit six &&
+       git checkout -b anotherbranch three &&
+       test_commit seven &&
+       git checkout -b yetanotherbranch four &&
+       test_commit eight &&
+       git checkout master &&
+       test_merge normalmerge newroot &&
+       test_tick &&
+       git merge -m tripus sidebranch anotherbranch &&
+       git tag tripus &&
+       git checkout -b tetrabranch normalmerge &&
+       test_tick &&
+       git merge -m tetrapus sidebranch anotherbranch yetanotherbranch &&
+       git tag tetrapus &&
+       git checkout master
+'
+
+test_expect_success 'rev-list roots' '
+
+       check_revlist "--max-parents=0" one five
+'
+
+test_expect_success 'rev-list no merges' '
+
+       check_revlist "--max-parents=1" one eight seven six five four three two &&
+       check_revlist "--no-merges" one eight seven six five four three two
+'
+
+test_expect_success 'rev-list no octopuses' '
+
+       check_revlist "--max-parents=2" one normalmerge eight seven six five four three two
+'
+
+test_expect_success 'rev-list no roots' '
+
+       check_revlist "--min-parents=1" tetrapus tripus normalmerge eight seven six four three two
+'
+
+test_expect_success 'rev-list merges' '
+
+       check_revlist "--min-parents=2" tetrapus tripus normalmerge &&
+       check_revlist "--merges" tetrapus tripus normalmerge
+'
+
+test_expect_success 'rev-list octopus' '
+
+       check_revlist "--min-parents=3" tetrapus tripus
+'
+
+test_expect_success 'rev-list ordinary commits' '
+
+       check_revlist "--min-parents=1 --max-parents=1" eight seven six four three two
+'
+
+test_expect_success 'rev-list --merges --no-merges yields empty set' '
+
+       check_revlist "--min-parents=2 --no-merges" &&
+       check_revlist "--merges --no-merges" &&
+       check_revlist "--no-merges --merges"
+'
+
+test_expect_success 'rev-list override and infinities' '
+
+       check_revlist "--min-parents=2 --max-parents=1 --max-parents=3" tripus normalmerge &&
+       check_revlist "--min-parents=1 --min-parents=2 --max-parents=7" tetrapus tripus normalmerge &&
+       check_revlist "--min-parents=2 --max-parents=8" tetrapus tripus normalmerge &&
+       check_revlist "--min-parents=2 --max-parents=-1" tetrapus tripus normalmerge &&
+       check_revlist "--min-parents=2 --no-max-parents" tetrapus tripus normalmerge &&
+       check_revlist "--max-parents=0 --min-parents=1 --no-min-parents" one five
+'
+
+test_expect_success 'set up dodecapus' '
+
+       for i in 1 2 3 4 5 6 7 8 9 10 11
+       do
+               git checkout -b root$i five || return
+               test_commit $i || return
+       done &&
+       git checkout master &&
+       test_tick &&
+       git merge -m dodecapus root{1,2,3,4,5,6,7,8,9,10,11} &&
+       git tag dodecapus
+'
+
+test_expect_success 'test with dodecapus' '
+
+       check_revlist "--min-parents=4" dodecapus tetrapus &&
+       check_revlist "--min-parents=8" dodecapus &&
+       check_revlist "--min-parents=12" dodecapus &&
+       check_revlist "--min-parents=13" &&
+       check_revlist "--min-parents=4 --max-parents=11" tetrapus
+'
 test_done