[PATCH 3/9] ref-filter: add support for %(path) atom
- From
Karthik Nayak <karthik.188@gmail.com>
- Date
- Oct 2, 2015, 17:39 UTC
- Message-ID
- <1443807546-5985-4-git-send-email-Karthik.188@gmail.com>
- In-Reply-To
- <1443807546-5985-1-git-send-email-Karthik.188@gmail.com>
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