This adds %(path) and %(path:short) atoms. The %(path) atom will print
the path of the given ref, while %(path:short) will only print the
subdirectory of the given ref.

Add tests and documentation for the same.
---
 Documentation/git-for-each-ref.txt |  5 +++++
 ref-filter.c                       | 17 +++++++++++++++++
 t/t6302-for-each-ref-filter.sh     | 39 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 61 insertions(+)

diff --git a/Documentation/git-for-each-ref.txt 
b/Documentation/git-for-each-ref.txt
index 5c12c2f..6a476ba 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -145,6 +145,11 @@ if::
        compare the value between the %(if:...) and %(then) atoms with the
        given string.
 
+path::
+       The path of the given ref. For a shortened version listing
+       only the name of the directory the ref is under append
+       `:short`.
+
 In addition to the above, for commit and tag objects, the header
 field names (`tree`, `parent`, `object`, `type`, and `tag`) can
 be used to specify the value in the header field.
diff --git a/ref-filter.c b/ref-filter.c
index da7723b..b0e86ae 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -58,6 +58,7 @@ static struct {
        { "if" },
        { "then" },
        { "else" },
+       { "path" },
 };
 
 #define REF_FORMATTING_STATE_INIT  { 0, NULL }
@@ -1042,6 +1043,22 @@ static void populate_value(struct ref_array_item *ref)
                } else if (!strcmp(name, "else")) {
                        v->handler = else_atom_handler;
                        continue;
+               } else if (match_atom_name(name, "path", &valp)) {
+                       const char *sp, *ep;
+
+                       if (ref->kind & FILTER_REFS_DETACHED_HEAD)
+                               continue;
+
+                       sp = strchr(ref->refname, '/');
+                       ep = strchr(++sp, '/');
+
+                       if (!valp)
+                               sp = ref->refname;
+                       else if (strcmp(valp, "short"))
+                               die(_("format: invalid value given path:%s"), 
valp);
+
+                       v->s = xstrndup(sp, ep - sp);
+                       continue;
                } else
                        continue;
 
diff --git a/t/t6302-for-each-ref-filter.sh b/t/t6302-for-each-ref-filter.sh
index d7f7a18..5557657 100755
--- a/t/t6302-for-each-ref-filter.sh
+++ b/t/t6302-for-each-ref-filter.sh
@@ -312,6 +312,7 @@ test_expect_success 'check %(if:equals=<string>)' '
        test_cmp expect actual
 '
 
+
 test_expect_success 'check %(if:notequals=<string>)' '
        git for-each-ref 
--format="%(if:notequals=master)%(refname:short)%(then)Not master%(else)Found 
master%(end)" refs/heads/ >actual &&
        cat >expect <<-\EOF &&
@@ -321,4 +322,42 @@ test_expect_success 'check %(if:notequals=<string>)' '
        test_cmp expect actual
 '
 
+test_expect_success 'check %(path)' '
+       git for-each-ref --format="%(path)" >actual &&
+       cat >expect <<-\EOF &&
+       refs/heads
+       refs/heads
+       refs/odd
+       refs/tags
+       refs/tags
+       refs/tags
+       refs/tags
+       refs/tags
+       refs/tags
+       refs/tags
+       refs/tags
+       refs/tags
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'check %(path:short)' '
+       git for-each-ref --format="%(path:short)" >actual &&
+       cat >expect <<-\EOF &&
+       heads
+       heads
+       odd
+       tags
+       tags
+       tags
+       tags
+       tags
+       tags
+       tags
+       tags
+       tags
+       EOF
+       test_cmp expect actual
+'
+
 test_done
-- 
2.6.0

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to