for-each-ref: add '--contains' option
authorKarthik Nayak <karthik.188@gmail.com>
Tue, 7 Jul 2015 16:06:17 +0000 (21:36 +0530)
committerJunio C Hamano <gitster@pobox.com>
Mon, 3 Aug 2015 17:25:28 +0000 (10:25 -0700)
Add the '--contains' option provided by 'ref-filter'. The '--contains'
option lists only refs which contain the mentioned commit (HEAD if no
commit is explicitly given).

Add documentation and tests for the same.

Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-for-each-ref.txt
builtin/for-each-ref.c
t/t6302-for-each-ref-filter.sh
index 2842195d110568d9a8cc53aaaf6c2524796cc797..e49d5782fc6f82289d0b71c720110b11e38cb8b0 100644 (file)
@@ -11,6 +11,7 @@ SYNOPSIS
 'git for-each-ref' [--count=<count>] [--shell|--perl|--python|--tcl]
                   [(--sort=<key>)...] [--format=<format>] [<pattern>...]
                   [--points-at <object>] [(--merged | --no-merged) [<object>]]
 'git for-each-ref' [--count=<count>] [--shell|--perl|--python|--tcl]
                   [(--sort=<key>)...] [--format=<format>] [<pattern>...]
                   [--points-at <object>] [(--merged | --no-merged) [<object>]]
+                  [--contains [<object>]]
 
 DESCRIPTION
 -----------
 
 DESCRIPTION
 -----------
@@ -74,6 +75,10 @@ OPTIONS
        Only list refs whose tips are not reachable from the
        specified commit (HEAD if not specified).
 
        Only list refs whose tips are not reachable from the
        specified commit (HEAD if not specified).
 
+--contains [<object>]::
+       Only list tags which contain the specified commit (HEAD if not
+       specified).
+
 FIELD NAMES
 -----------
 
 FIELD NAMES
 -----------
 
index 75218506e40d919fc790f194ddfeb0c4772cc7aa..40f343b6a36fc76271e53d842b92f8ab4c161d38 100644 (file)
@@ -9,6 +9,7 @@ static char const * const for_each_ref_usage[] = {
        N_("git for-each-ref [<options>] [<pattern>]"),
        N_("git for-each-ref [--points-at <object>]"),
        N_("git for-each-ref [(--merged | --no-merged) [<object>]]"),
        N_("git for-each-ref [<options>] [<pattern>]"),
        N_("git for-each-ref [--points-at <object>]"),
        N_("git for-each-ref [(--merged | --no-merged) [<object>]]"),
+       N_("git for-each-ref [--contains [<object>]]"),
        NULL
 };
 
        NULL
 };
 
@@ -41,6 +42,7 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
                             parse_opt_object_name),
                OPT_MERGED(&filter, N_("print only refs that are merged")),
                OPT_NO_MERGED(&filter, N_("print only refs that are not merged")),
                             parse_opt_object_name),
                OPT_MERGED(&filter, N_("print only refs that are merged")),
                OPT_NO_MERGED(&filter, N_("print only refs that are not merged")),
+               OPT_CONTAINS(&filter.with_commit, N_("print only refs which contain the commit")),
                OPT_END(),
        };
 
                OPT_END(),
        };
 
index 0e68dcea6597eed5921bb532b7ade383152db233..505a3601610be4a18a74cd427b0ae11866aa70c6 100755 (executable)
@@ -66,4 +66,19 @@ test_expect_success 'filtering with --no-merged' '
        test_cmp expect actual
 '
 
        test_cmp expect actual
 '
 
+test_expect_success 'filtering with --contains' '
+       cat >expect <<-\EOF &&
+       refs/heads/master
+       refs/heads/side
+       refs/odd/spot
+       refs/tags/double-tag
+       refs/tags/four
+       refs/tags/signed-tag
+       refs/tags/three
+       refs/tags/two
+       EOF
+       git for-each-ref --format="%(refname)" --contains=two >actual &&
+       test_cmp expect actual
+'
+
 test_done
 test_done