]> granicus.if.org Git - git/commitdiff
ref-filter: make combining --merged & --no-merged an error
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Tue, 21 Mar 2017 12:58:49 +0000 (12:58 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 21 Mar 2017 18:19:52 +0000 (11:19 -0700)
Change the behavior of specifying --merged & --no-merged to be an
error, instead of silently picking the option that was provided last.

Subsequent changes of mine add a --no-contains option in addition to
the existing --contains. Providing both of those isn't an error, and
has actual meaning.

Making its cousins have different behavior in this regard would be
confusing to the user, especially since we'd be silently disregarding
some of their command-line input.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-branch.txt
Documentation/git-for-each-ref.txt
Documentation/git-tag.txt
ref-filter.c
t/t3200-branch.sh
t/t6302-for-each-ref-filter.sh
t/t7004-tag.sh

index 092f1bcf9f89f124a2d3c80eadeab5b4a63db941..e465298571e32176341a4a154f2faa1af1d84950 100644 (file)
@@ -215,11 +215,13 @@ start-point is either a local or remote-tracking branch.
 
 --merged [<commit>]::
        Only list branches whose tips are reachable from the
-       specified commit (HEAD if not specified). Implies `--list`.
+       specified commit (HEAD if not specified). Implies `--list`,
+       incompatible with `--no-merged`.
 
 --no-merged [<commit>]::
        Only list branches whose tips are not reachable from the
-       specified commit (HEAD if not specified). Implies `--list`.
+       specified commit (HEAD if not specified). Implies `--list`,
+       incompatible with `--merged`.
 
 <branchname>::
        The name of the branch to create or delete.
index 111e1be6f54f73f25ef6715a17410e461724519a..4d558937125fc4f099b4ada1d37f98259b2d73ba 100644 (file)
@@ -69,11 +69,13 @@ OPTIONS
 
 --merged [<object>]::
        Only list refs whose tips are reachable from the
-       specified commit (HEAD if not specified).
+       specified commit (HEAD if not specified),
+       incompatible with `--no-merged`.
 
 --no-merged [<object>]::
        Only list refs whose tips are not reachable from the
-       specified commit (HEAD if not specified).
+       specified commit (HEAD if not specified),
+       incompatible with `--merged`.
 
 --contains [<object>]::
        Only list refs which contain the specified commit (HEAD if not
index 3abf91278284b0079fccb90568348cf99c4db40d..448fdf37432faa4407ac9acac53a0e3e7dc1e3fb 100644 (file)
@@ -126,11 +126,11 @@ This option is only applicable when listing tags without annotation lines.
 
 --merged [<commit>]::
        Only list tags whose commits are reachable from the specified
-       commit (`HEAD` if not specified).
+       commit (`HEAD` if not specified), incompatible with `--no-merged`.
 
 --no-merged [<commit>]::
        Only list tags whose commits are not reachable from the specified
-       commit (`HEAD` if not specified).
+       commit (`HEAD` if not specified), incompatible with `--merged`.
 
 --points-at <object>::
        Only list tags of the given object.
index 7eeecc608f58776d436fa0b6a85a91b5ac9d9386..81da37b5b9b31ce15f7a1e096b2a013933391880 100644 (file)
@@ -2084,8 +2084,17 @@ int parse_opt_merge_filter(const struct option *opt, const char *arg, int unset)
 {
        struct ref_filter *rf = opt->value;
        unsigned char sha1[20];
+       int no_merged = starts_with(opt->long_name, "no");
 
-       rf->merge = starts_with(opt->long_name, "no")
+       if (rf->merge) {
+               if (no_merged) {
+                       return opterror(opt, "is incompatible with --merged", 0);
+               } else {
+                       return opterror(opt, "is incompatible with --no-merged", 0);
+               }
+       }
+
+       rf->merge = no_merged
                ? REF_FILTER_MERGED_OMIT
                : REF_FILTER_MERGED_INCLUDE;
 
index e36ed3b4e18e22986233f72e016b491c801117db..f286f39b45995a047e3a5882feec390a9ec818cd 100755 (executable)
@@ -953,6 +953,10 @@ test_expect_success '--merged catches invalid object names' '
        test_must_fail git branch --merged 0000000000000000000000000000000000000000
 '
 
+test_expect_success '--merged is incompatible with --no-merged' '
+       test_must_fail git branch --merged HEAD --no-merged HEAD
+'
+
 test_expect_success 'tracking with unexpected .fetch refspec' '
        rm -rf a b c d &&
        git init a &&
index a09a1a46eff5357c3939f5715f4a623effcb6428..d36d5dc12407a8f00896898ee93a9ff0249442d1 100755 (executable)
@@ -421,4 +421,8 @@ test_expect_success 'check %(if:notequals=<string>)' '
        test_cmp expect actual
 '
 
+test_expect_success '--merged is incompatible with --no-merged' '
+       test_must_fail git for-each-ref --merged HEAD --no-merged HEAD
+'
+
 test_done
index b4698ab5f53c2ce92bd349fe4fa336e5fc5ca3e5..45790664c1b368a9cc332ea991cb9085de301351 100755 (executable)
@@ -1748,6 +1748,10 @@ test_expect_success '--merged cannot be used in non-list mode' '
        test_must_fail git tag --merged=mergetest-2 foo
 '
 
+test_expect_success '--merged is incompatible with --no-merged' '
+       test_must_fail git tag --merged HEAD --no-merged HEAD
+'
+
 test_expect_success '--merged shows merged tags' '
        cat >expect <<-\EOF &&
        mergetest-1