From: Taylor Blau <me@ttaylorr.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, peff@peff.net, Taylor Blau <me@ttaylorr.com>
Subject: [PATCH] ref-filter.c: pass empty-string as NULL to atom parsers
Date: Sun, 1 Oct 2017 22:53:11 -0700 [thread overview]
Message-ID: <20171002055311.29681-1-me@ttaylorr.com> (raw)
In-Reply-To: <20171002055052.GB10729@D-10-157-251-166.dhcp4.washington.edu>
Peff points out that different atom parsers handle the empty
"sub-argument" list differently. An example of this is the format
"%(refname:)".
Since callers often use `string_list_split` (which splits the empty
string with any delimiter as a 1-ary string_list containing the empty
string), this makes handling empty sub-argument strings non-ergonomic.
Let's fix this by assuming that atom parser implementations don't care
about distinguishing between the empty string "%(refname:)" and no
sub-arguments "%(refname)".
Signed-off-by: Taylor Blau <me@ttaylorr.com>
---
ref-filter.c | 17 ++++++++++++++++-
t/t6300-for-each-ref.sh | 1 +
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/ref-filter.c b/ref-filter.c
index bc591f4f3..22be4097a 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -415,8 +415,23 @@ static int parse_ref_filter_atom(const struct ref_format *format,
REALLOC_ARRAY(used_atom, used_atom_cnt);
used_atom[at].name = xmemdupz(atom, ep - atom);
used_atom[at].type = valid_atom[i].cmp_type;
- if (arg)
+ if (arg) {
arg = used_atom[at].name + (arg - atom) + 1;
+ if (!*arg) {
+ /*
+ * string_list_split is often use by atom parsers to
+ * split multiple sub-arguments for inspection.
+ *
+ * Given a string that does not contain a delimiter
+ * (example: ""), string_list_split returns a 1-ary
+ * string_list that requires adding special cases to
+ * atom parsers.
+ *
+ * Thus, treat the empty argument string as NULL.
+ */
+ arg = NULL;
+ }
+ }
memset(&used_atom[at].u, 0, sizeof(used_atom[at].u));
if (valid_atom[i].parser)
valid_atom[i].parser(format, &used_atom[at], arg);
diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh
index 2274a4b73..edc1bd8ea 100755
--- a/t/t6300-for-each-ref.sh
+++ b/t/t6300-for-each-ref.sh
@@ -51,6 +51,7 @@ test_atom() {
}
test_atom head refname refs/heads/master
+test_atom head refname: refs/heads/master
test_atom head refname:short master
test_atom head refname:lstrip=1 heads/master
test_atom head refname:lstrip=2 master
--
2.14.1.145.gb3622a4ee
next prev parent reply other threads:[~2017-10-02 5:53 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-02 5:50 [PATCH 0/1] ref-filter.c: pass empty-string as NULL to atom parsers Taylor Blau
2017-10-02 5:53 ` Taylor Blau [this message]
2017-10-02 6:43 ` [PATCH] " Jeff King
2017-10-02 16:12 ` Taylor Blau
2017-10-02 19:42 ` Jeff King
2017-10-02 16:10 ` [PATCH v2] " Taylor Blau
2017-10-02 19:42 ` Jeff King
2017-10-02 22:40 ` Jonathan Nieder
2017-10-02 23:55 ` Junio C Hamano
2017-10-03 3:37 ` Taylor Blau
2017-10-05 1:49 ` Junio C Hamano
2017-10-05 2:11 ` Jonathan Nieder
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=20171002055311.29681-1-me@ttaylorr.com \
--to=me@ttaylorr.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
/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.