From: Karthik Nayak <karthik.188@gmail.com>
To: git@vger.kernel.org
Cc: jacob.keller@gmail.com, Karthik Nayak <karthik.188@gmail.com>,
Karthik Nayak <Karthik.188@gmail.com>
Subject: [PATCH v7 11/17] ref-filter: introduce symref_atom_parser() and refname_atom_parser()
Date: Wed, 9 Nov 2016 01:42:05 +0530 [thread overview]
Message-ID: <20161108201211.25213-12-Karthik.188@gmail.com> (raw)
In-Reply-To: <20161108201211.25213-1-Karthik.188@gmail.com>
From: Karthik Nayak <karthik.188@gmail.com>
Using refname_atom_parser_internal(), introduce symref_atom_parser() and
refname_atom_parser() which will parse the atoms %(symref) and
%(refname) respectively. Store the parsed information into the
'used_atom' structure based on the modifiers used along with the atoms.
Now the '%(symref)' atom supports the ':strip' atom modifier. Update the
Documentation and tests to reflect this.
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Karthik Nayak <Karthik.188@gmail.com>
---
Documentation/git-for-each-ref.txt | 5 +++
ref-filter.c | 78 ++++++++++++++++++++++----------------
t/t6300-for-each-ref.sh | 9 +++++
3 files changed, 59 insertions(+), 33 deletions(-)
diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
index 3953431..a669a32 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -166,6 +166,11 @@ if::
the value between the %(if:...) and %(then) atoms with the
given string.
+symref::
+ The ref which the given symbolic ref refers to. If not a
+ symbolic ref, nothing is printed. Respects the `:short` and
+ `:strip` options in the same way as `refname` above.
+
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 aad537d..f1d27b5 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -176,6 +176,16 @@ static void objectname_atom_parser(struct used_atom *atom, const char *arg)
die(_("unrecognized %%(objectname) argument: %s"), arg);
}
+static void symref_atom_parser(struct used_atom *atom, const char *arg)
+{
+ return refname_atom_parser_internal(&atom->u.refname, arg, atom->name);
+}
+
+static void refname_atom_parser(struct used_atom *atom, const char *arg)
+{
+ return refname_atom_parser_internal(&atom->u.refname, arg, atom->name);
+}
+
static align_type parse_align_position(const char *s)
{
if (!strcmp(s, "right"))
@@ -244,7 +254,7 @@ static struct {
cmp_type cmp_type;
void (*parser)(struct used_atom *atom, const char *arg);
} valid_atom[] = {
- { "refname" },
+ { "refname" , FIELD_STR, refname_atom_parser },
{ "objecttype" },
{ "objectsize", FIELD_ULONG },
{ "objectname", FIELD_STR, objectname_atom_parser },
@@ -273,7 +283,7 @@ static struct {
{ "contents", FIELD_STR, contents_atom_parser },
{ "upstream", FIELD_STR, remote_ref_atom_parser },
{ "push", FIELD_STR, remote_ref_atom_parser },
- { "symref" },
+ { "symref", FIELD_STR, symref_atom_parser },
{ "flag" },
{ "HEAD" },
{ "color", FIELD_STR, color_atom_parser },
@@ -1058,21 +1068,16 @@ static inline char *copy_advance(char *dst, const char *src)
return dst;
}
-static const char *strip_ref_components(const char *refname, const char *nr_arg)
+static const char *strip_ref_components(const char *refname, unsigned int len)
{
- char *end;
- long nr = strtol(nr_arg, &end, 10);
- long remaining = nr;
+ long remaining = len;
const char *start = refname;
- if (nr < 1 || *end != '\0')
- die(_(":strip= requires a positive integer argument"));
-
while (remaining) {
switch (*start++) {
case '\0':
- die(_("ref '%s' does not have %ld components to :strip"),
- refname, nr);
+ die(_("ref '%s' does not have %ud components to :strip"),
+ refname, len);
case '/':
remaining--;
break;
@@ -1081,6 +1086,16 @@ static const char *strip_ref_components(const char *refname, const char *nr_arg)
return start;
}
+static const char *show_ref(struct refname_atom *atom, const char *refname)
+{
+ if (atom->option == R_SHORT)
+ return shorten_unambiguous_ref(refname, warn_ambiguous_refs);
+ else if (atom->option == R_STRIP)
+ return strip_ref_components(refname, atom->strip);
+ else
+ return refname;
+}
+
static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
struct branch *branch, const char **s)
{
@@ -1153,6 +1168,21 @@ char *get_head_description(void)
return strbuf_detach(&desc, NULL);
}
+static const char *get_symref(struct used_atom *atom, struct ref_array_item *ref)
+{
+ if (!ref->symref)
+ return "";
+ else
+ return show_ref(&atom->u.refname, ref->symref);
+}
+
+static const char *get_refname(struct used_atom *atom, struct ref_array_item *ref)
+{
+ if (ref->kind & FILTER_REFS_DETACHED_HEAD)
+ return get_head_description();
+ return show_ref(&atom->u.refname, ref->refname);
+}
+
/*
* Parse the object referred by ref, and grab needed value.
*/
@@ -1181,7 +1211,6 @@ static void populate_value(struct ref_array_item *ref)
struct atom_value *v = &ref->value[i];
int deref = 0;
const char *refname;
- const char *formatp;
struct branch *branch = NULL;
v->handler = append_atom;
@@ -1192,12 +1221,10 @@ static void populate_value(struct ref_array_item *ref)
name++;
}
- if (starts_with(name, "refname")) {
- refname = ref->refname;
- if (ref->kind & FILTER_REFS_DETACHED_HEAD)
- refname = get_head_description();
- } else if (starts_with(name, "symref"))
- refname = ref->symref ? ref->symref : "";
+ if (starts_with(name, "refname"))
+ refname = get_refname(atom, ref);
+ else if (starts_with(name, "symref"))
+ refname = get_symref(atom, ref);
else if (starts_with(name, "upstream")) {
const char *branch_name;
/* only local branches may have an upstream */
@@ -1273,21 +1300,6 @@ static void populate_value(struct ref_array_item *ref)
} else
continue;
- formatp = strchr(name, ':');
- if (formatp) {
- const char *arg;
-
- formatp++;
- if (!strcmp(formatp, "short"))
- refname = shorten_unambiguous_ref(refname,
- warn_ambiguous_refs);
- else if (skip_prefix(formatp, "strip=", &arg))
- refname = strip_ref_components(refname, arg);
- else
- die(_("unknown %.*s format %s"),
- (int)(formatp - name), name, formatp);
- }
-
if (!deref)
v->s = refname;
else
diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh
index b06ea1c..3d28234 100755
--- a/t/t6300-for-each-ref.sh
+++ b/t/t6300-for-each-ref.sh
@@ -589,4 +589,13 @@ test_expect_success 'Verify usage of %(symref:short) atom' '
test_cmp expected actual
'
+cat >expected <<EOF
+master
+EOF
+
+test_expect_success 'Verify usage of %(symref:strip) atom' '
+ git for-each-ref --format="%(symref:strip=2)" refs/heads/sym > actual &&
+ test_cmp expected actual
+'
+
test_done
--
2.10.2
next prev parent reply other threads:[~2016-11-08 20:12 UTC|newest]
Thread overview: 94+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-08 20:11 [PATCH v7 00/17] port branch.c to use ref-filter's printing options Karthik Nayak
2016-11-08 20:11 ` [PATCH v7 01/17] ref-filter: implement %(if), %(then), and %(else) atoms Karthik Nayak
2016-11-08 23:13 ` Jacob Keller
2016-11-10 17:11 ` Karthik Nayak
2016-11-10 23:20 ` Junio C Hamano
2016-11-11 9:13 ` Karthik Nayak
2016-11-10 23:13 ` Junio C Hamano
2016-11-11 9:10 ` Karthik Nayak
2016-11-08 20:11 ` [PATCH v7 02/17] ref-filter: include reference to 'used_atom' within 'atom_value' Karthik Nayak
2016-11-08 23:16 ` Jacob Keller
2016-11-10 17:16 ` Karthik Nayak
2016-11-08 20:11 ` [PATCH v7 03/17] ref-filter: implement %(if:equals=<string>) and %(if:notequals=<string>) Karthik Nayak
2016-11-08 23:22 ` Jacob Keller
2016-11-10 17:31 ` Karthik Nayak
2016-11-11 5:27 ` Jacob Keller
2016-11-10 23:26 ` Junio C Hamano
2016-11-11 5:25 ` Jacob Keller
2016-11-12 9:19 ` Karthik Nayak
2016-11-18 19:58 ` Jakub Narębski
2016-11-20 7:23 ` Karthik Nayak
2016-11-08 20:11 ` [PATCH v7 04/17] ref-filter: modify "%(objectname:short)" to take length Karthik Nayak
2016-11-08 23:27 ` Jacob Keller
2016-11-10 17:36 ` Karthik Nayak
2016-11-11 5:29 ` Jacob Keller
2016-11-12 9:56 ` Karthik Nayak
2016-11-10 23:32 ` Junio C Hamano
2016-11-08 20:11 ` [PATCH v7 05/17] ref-filter: move get_head_description() from branch.c Karthik Nayak
2016-11-08 23:31 ` Jacob Keller
2016-11-10 19:01 ` Karthik Nayak
2016-11-08 20:12 ` [PATCH v7 06/17] ref-filter: introduce format_ref_array_item() Karthik Nayak
2016-11-08 23:32 ` Jacob Keller
2016-11-08 20:12 ` [PATCH v7 07/17] ref-filter: make %(upstream:track) prints "[gone]" for invalid upstreams Karthik Nayak
2016-11-08 23:37 ` Jacob Keller
2016-11-12 18:48 ` Karthik Nayak
2016-11-08 20:12 ` [PATCH v7 08/17] ref-filter: add support for %(upstream:track,nobracket) Karthik Nayak
2016-11-08 23:45 ` Jacob Keller
2016-11-12 20:01 ` Karthik Nayak
2016-11-08 20:12 ` [PATCH v7 09/17] ref-filter: make "%(symref)" atom work with the ':short' modifier Karthik Nayak
2016-11-08 23:46 ` Jacob Keller
2016-11-18 21:34 ` Jakub Narębski
2016-11-20 7:31 ` Karthik Nayak
2016-11-08 20:12 ` [PATCH v7 10/17] ref-filter: introduce refname_atom_parser_internal() Karthik Nayak
2016-11-18 21:36 ` Jakub Narębski
2016-11-20 7:34 ` Karthik Nayak
2016-11-08 20:12 ` Karthik Nayak [this message]
2016-11-08 23:52 ` [PATCH v7 11/17] ref-filter: introduce symref_atom_parser() and refname_atom_parser() Jacob Keller
2016-11-12 20:12 ` Karthik Nayak
2016-11-08 20:12 ` [PATCH v7 12/17] ref-filter: make remote_ref_atom_parser() use refname_atom_parser_internal() Karthik Nayak
2016-11-08 23:54 ` Jacob Keller
2016-11-08 20:12 ` [PATCH v7 13/17] ref-filter: add `:dir` and `:base` options for ref printing atoms Karthik Nayak
2016-11-08 23:58 ` Jacob Keller
2016-11-13 14:07 ` Karthik Nayak
2016-11-14 1:55 ` Junio C Hamano
2016-11-14 19:36 ` Karthik Nayak
2016-11-14 19:51 ` Junio C Hamano
2016-11-15 6:48 ` Karthik Nayak
2016-11-15 7:55 ` Jacob Keller
2016-11-15 7:56 ` Jacob Keller
2016-11-15 17:42 ` Junio C Hamano
2016-11-15 21:19 ` Jacob Keller
2016-11-16 7:58 ` Karthik Nayak
2016-11-17 18:35 ` Junio C Hamano
2016-11-18 7:33 ` Karthik Nayak
2016-11-18 8:19 ` Jacob Keller
2016-11-18 18:18 ` Junio C Hamano
2016-11-18 21:49 ` Jakub Narębski
2016-11-20 15:16 ` Karthik Nayak
2016-11-20 16:52 ` Karthik Nayak
2016-11-20 17:32 ` Junio C Hamano
2016-11-20 18:43 ` Jakub Narębski
2016-11-22 18:34 ` Karthik Nayak
2016-11-08 20:12 ` [PATCH v7 14/17] ref-filter: allow porcelain to translate messages in the output Karthik Nayak
2016-11-09 0:00 ` Jacob Keller
2016-11-18 22:46 ` Jakub Narębski
2016-11-20 15:33 ` Karthik Nayak
2016-11-21 8:41 ` Matthieu Moy
2016-11-22 18:33 ` Karthik Nayak
2016-11-08 20:12 ` [PATCH v7 15/17] branch, tag: use porcelain output Karthik Nayak
2016-11-09 0:01 ` Jacob Keller
2016-11-08 20:12 ` [PATCH v7 16/17] branch: use ref-filter printing APIs Karthik Nayak
2016-11-09 0:14 ` Jacob Keller
2016-11-14 19:23 ` Karthik Nayak
2016-11-15 1:36 ` Jacob Keller
2016-11-17 19:50 ` Junio C Hamano
2016-11-17 22:05 ` Junio C Hamano
2016-11-22 18:31 ` Karthik Nayak
2016-11-08 20:12 ` [PATCH v7 17/17] branch: implement '--format' option Karthik Nayak
2016-11-09 0:15 ` [PATCH v7 00/17] port branch.c to use ref-filter's printing options Jacob Keller
2016-11-14 19:24 ` Karthik Nayak
2016-11-15 20:43 ` Junio C Hamano
2016-11-15 20:57 ` Re* " Junio C Hamano
2016-11-16 15:31 ` Karthik Nayak
2016-11-18 23:31 ` Junio C Hamano
2016-11-20 7:08 ` Karthik Nayak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161108201211.25213-12-Karthik.188@gmail.com \
--to=karthik.188@gmail.com \
--cc=git@vger.kernel.org \
--cc=jacob.keller@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.