From: Karthik Nayak <karthik.188@gmail.com>
To: git@vger.kernel.org
Cc: matthieu.moy@grenoble-inp.fr, gitster@pobox.com,
Karthik Nayak <Karthik.188@gmail.com>
Subject: [PATCH/RFC 07/10] ref-filter: introduce align_atom_parser()
Date: Thu, 12 Nov 2015 01:14:33 +0530 [thread overview]
Message-ID: <1447271075-15364-8-git-send-email-Karthik.188@gmail.com> (raw)
In-Reply-To: <1447271075-15364-1-git-send-email-Karthik.188@gmail.com>
Introduce align_atom_parser() which will parse 'align' atoms and store
the required width and position into the 'used_atom' structure. While
we're here, add support for the usage of 'width=' and 'position=' when
using the 'align' atom (e.g. %(align:position=middle,width=30)).
Add documentation and modify the existing tests in t6302 to reflect
the same.
Signed-off-by: Karthik Nayak <Karthik.188@gmail.com>
---
Documentation/git-for-each-ref.txt | 18 ++++---
ref-filter.c | 102 +++++++++++++++++++++++--------------
t/t6302-for-each-ref-filter.sh | 4 +-
3 files changed, 75 insertions(+), 49 deletions(-)
diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
index c6f073c..56ffdc1 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -129,14 +129,16 @@ color::
align::
Left-, middle-, or right-align the content between
- %(align:...) and %(end). The "align:" is followed by `<width>`
- and `<position>` in any order separated by a comma, where the
- `<position>` is either left, right or middle, default being
- left and `<width>` is the total length of the content with
- alignment. If the contents length is more than the width then
- no alignment is performed. If used with '--quote' everything
- in between %(align:...) and %(end) is quoted, but if nested
- then only the topmost level performs quoting.
+ %(align:...) and %(end). The "align:" is followed by
+ `width=<width>` and `position=<position>` in any order
+ separated by a comma, where the `<position>` is either left,
+ right or middle, default being left and `<width>` is the total
+ length of the content with alignment. The prefix for the
+ arguments is not mandatory. If the contents length is more
+ than the width then no alignment is performed. If used with
+ '--quote' everything in between %(align:...) and %(end) is
+ quoted, but if nested then only the topmost level performs
+ quoting.
In addition to the above, for commit and tag objects, the header
field names (`tree`, `parent`, `object`, `type`, and `tag`) can
diff --git a/ref-filter.c b/ref-filter.c
index 4e8b3c9..049e6b9 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -16,6 +16,11 @@
typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME } cmp_type;
+struct align {
+ align_type position;
+ unsigned int width;
+};
+
/*
* An atom is a valid field atom listed below, possibly prefixed with
* a "*" to denote deref_tag().
@@ -31,6 +36,7 @@ static struct used_atom {
cmp_type type;
union {
const char *color;
+ struct align align;
} u;
} *used_atom;
static int used_atom_cnt, need_tagged, need_symref;
@@ -63,6 +69,61 @@ void color_atom_parser(struct used_atom *atom)
die(_("expected format: %%(color:<color>)"));
}
+static align_type get_align_position(const char *type)
+{
+ if (!strcmp(type, "right"))
+ return ALIGN_RIGHT;
+ else if (!strcmp(type, "middle"))
+ return ALIGN_MIDDLE;
+ else if (!strcmp(type, "left"))
+ return ALIGN_LEFT;
+ return -1;
+}
+
+void align_atom_parser(struct used_atom *atom)
+{
+ struct align *align = &atom->u.align;
+ const char *buf = NULL;
+ struct strbuf **s, **to_free;
+ int width = -1;
+
+ match_atom_name(atom->str, "align", &buf);
+ if (!buf)
+ die(_("expected format: %%(align:<width>,<position>)"));
+ s = to_free = strbuf_split_str_without_term(buf, ',', 0);
+
+ /* By default align to ALGIN_LEFT */
+ align->position = ALIGN_LEFT;
+
+ while (*s) {
+ int position;
+ buf = s[0]->buf;
+
+ position = get_align_position(buf);
+
+ if (skip_prefix(buf, "position=", &buf)) {
+ position = get_align_position(buf);
+ if (position == -1)
+ die(_("improper format entered align:%s"), s[0]->buf);
+ align->position = position;
+ } else if (skip_prefix(buf, "width=", &buf)) {
+ if (strtoul_ui(buf, 10, (unsigned int *)&width))
+ die(_("improper format entered align:%s"), s[0]->buf);
+ } else if (!strtoul_ui(buf, 10, (unsigned int *)&width))
+ ;
+ else if (position != -1)
+ align->position = position;
+ else
+ die(_("improper format entered align:%s"), s[0]->buf);
+ s++;
+ }
+
+ if (width < 0)
+ die(_("positive width expected with the %%(align) atom"));
+ align->width = width;
+ strbuf_list_free(to_free);
+}
+
static struct {
const char *name;
cmp_type cmp_type;
@@ -101,17 +162,12 @@ static struct {
{ "flag", FIELD_STR },
{ "HEAD", FIELD_STR },
{ "color", FIELD_STR, color_atom_parser },
- { "align", FIELD_STR },
+ { "align", FIELD_STR, align_atom_parser },
{ "end", FIELD_STR },
};
#define REF_FORMATTING_STATE_INIT { 0, NULL }
-struct align {
- align_type position;
- unsigned int width;
-};
-
struct contents {
unsigned int lines;
struct object_id oid;
@@ -881,39 +937,7 @@ static void populate_value(struct ref_array_item *ref)
v->s = " ";
continue;
} else if (match_atom_name(name, "align", &valp)) {
- struct align *align = &v->u.align;
- struct strbuf **s, **to_free;
- int width = -1;
-
- if (!valp)
- die(_("expected format: %%(align:<width>,<position>)"));
-
- /*
- * TODO: Implement a function similar to strbuf_split_str()
- * which would omit the separator from the end of each value.
- */
- s = to_free = strbuf_split_str_without_term(valp, ',', 0);
-
- align->position = ALIGN_LEFT;
-
- while (*s) {
- if (!strtoul_ui(s[0]->buf, 10, (unsigned int *)&width))
- ;
- else if (!strcmp(s[0]->buf, "left"))
- align->position = ALIGN_LEFT;
- else if (!strcmp(s[0]->buf, "right"))
- align->position = ALIGN_RIGHT;
- else if (!strcmp(s[0]->buf, "middle"))
- align->position = ALIGN_MIDDLE;
- else
- die(_("improper format entered align:%s"), s[0]->buf);
- s++;
- }
-
- if (width < 0)
- die(_("positive width expected with the %%(align) atom"));
- align->width = width;
- strbuf_list_free(to_free);
+ v->u.align = atom->u.align;
v->handler = align_atom_handler;
continue;
} else if (!strcmp(name, "end")) {
diff --git a/t/t6302-for-each-ref-filter.sh b/t/t6302-for-each-ref-filter.sh
index fe4796c..688751e 100755
--- a/t/t6302-for-each-ref-filter.sh
+++ b/t/t6302-for-each-ref-filter.sh
@@ -97,7 +97,7 @@ test_expect_success 'left alignment is default' '
refname is refs/tags/three |refs/tags/three
refname is refs/tags/two |refs/tags/two
EOF
- git for-each-ref --format="%(align:30)refname is %(refname)%(end)|%(refname)" >actual &&
+ git for-each-ref --format="%(align:width=30)refname is %(refname)%(end)|%(refname)" >actual &&
test_cmp expect actual
'
@@ -113,7 +113,7 @@ test_expect_success 'middle alignment' '
| refname is refs/tags/three |refs/tags/three
| refname is refs/tags/two |refs/tags/two
EOF
- git for-each-ref --format="|%(align:middle,30)refname is %(refname)%(end)|%(refname)" >actual &&
+ git for-each-ref --format="|%(align:position=middle,30)refname is %(refname)%(end)|%(refname)" >actual &&
test_cmp expect actual
'
--
2.6.2
next prev parent reply other threads:[~2015-11-11 19:44 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-11 19:44 [PATCH/RFC 00/10] ref-filter: use parsing functions Karthik Nayak
2015-11-11 19:44 ` [PATCH/RFC 01/10] ref-filter: introduce a parsing function for each atom in valid_atom Karthik Nayak
2015-11-23 23:44 ` Eric Sunshine
2015-11-25 12:10 ` Karthik Nayak
2015-11-25 19:41 ` Eric Sunshine
2015-11-26 18:01 ` Karthik Nayak
2015-12-11 22:18 ` Junio C Hamano
2015-12-12 16:05 ` Karthik Nayak
2015-11-11 19:44 ` [PATCH/RFC 02/10] ref-filter: introduce struct used_atom Karthik Nayak
2015-12-01 23:00 ` Eric Sunshine
2015-11-11 19:44 ` [PATCH/RFC 03/10] ref-fitler: bump match_atom() name to the top Karthik Nayak
2015-11-11 19:44 ` [PATCH/RFC 04/10] ref-filter: skip deref specifier in match_atom_name() Karthik Nayak
2015-12-01 23:11 ` Eric Sunshine
2015-12-03 6:34 ` Karthik Nayak
2015-11-11 19:44 ` [PATCH/RFC 05/10] ref-filter: introduce color_atom_parser() Karthik Nayak
2015-12-01 23:27 ` Eric Sunshine
2015-12-03 13:35 ` Karthik Nayak
2015-12-13 6:05 ` Eric Sunshine
2015-12-13 18:46 ` Karthik Nayak
2015-11-11 19:44 ` [PATCH/RFC 06/10] strbuf: introduce strbuf_split_str_without_term() Karthik Nayak
2015-12-02 8:04 ` Eric Sunshine
2015-12-03 18:12 ` Karthik Nayak
2015-12-11 22:31 ` Junio C Hamano
2015-12-12 16:04 ` Karthik Nayak
2015-11-11 19:44 ` Karthik Nayak [this message]
2015-12-02 21:23 ` [PATCH/RFC 07/10] ref-filter: introduce align_atom_parser() Eric Sunshine
2015-12-07 17:00 ` Karthik Nayak
2015-11-11 19:44 ` [PATCH/RFC 08/10] ref-filter: introduce remote_ref_atom_parser() Karthik Nayak
2015-12-13 0:53 ` Eric Sunshine
2015-12-13 6:02 ` Karthik Nayak
2015-12-13 6:15 ` Eric Sunshine
2015-12-13 8:32 ` Karthik Nayak
2015-12-13 8:45 ` Eric Sunshine
2015-12-13 8:53 ` Karthik Nayak
2015-11-11 19:44 ` [PATCH/RFC 09/10] ref-filter: introduce contents_atom_parser() Karthik Nayak
2015-12-13 3:10 ` Eric Sunshine
2015-12-13 4:41 ` Eric Sunshine
2015-12-13 19:36 ` Karthik Nayak
2015-12-13 19:33 ` Karthik Nayak
2015-11-24 21:48 ` [PATCH/RFC 00/10] ref-filter: use parsing functions Jeff King
2015-11-25 12:07 ` Karthik Nayak
2015-11-25 13:44 ` [PATCH/RFC 10/10] ref-filter: introduce objectname_atom_parser() Karthik Nayak
2015-12-13 4:49 ` Eric Sunshine
2015-12-13 19:40 ` Karthik Nayak
2015-12-11 22:49 ` [PATCH/RFC 00/10] ref-filter: use parsing functions Junio C Hamano
2015-12-13 5:40 ` Eric Sunshine
2015-12-13 9:31 ` Karthik Nayak
2015-12-13 21:55 ` Eric Sunshine
2015-12-16 14:45 ` Karthik Nayak
2015-12-14 19:06 ` Junio C Hamano
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=1447271075-15364-8-git-send-email-Karthik.188@gmail.com \
--to=karthik.188@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=matthieu.moy@grenoble-inp.fr \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).