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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html