From: Junio C Hamano <gitster@pobox.com>
To: Tom Grennan <tmgrennan@gmail.com>
Cc: git@vger.kernel.org, peff@peff.net, jasampler@gmail.com,
pclouds@gmail.com
Subject: Re: [PATCHv3 1/5] refs: add match_pattern()
Date: Tue, 21 Feb 2012 22:33:05 -0800 [thread overview]
Message-ID: <7vobsrbcny.fsf@alter.siamese.dyndns.org> (raw)
In-Reply-To: 1329874130-16818-2-git-send-email-tmgrennan@gmail.com
Tom Grennan <tmgrennan@gmail.com> writes:
> +static int match_path(const char *name, const char *pattern, int nlen)
> +{
> + int plen = strlen(pattern);
> +
> + return ((plen <= nlen) &&
> + !strncmp(name, pattern, plen) &&
> + (name[plen] == '\0' ||
> + name[plen] == '/' ||
> + pattern[plen-1] == '/'));
> +}
This is a counterpart to the tail match found in ls-remote, so we would
want to call it with a name that makes it clear this is a leading path
match not just "path" match. Perhaps match_leading_path() or something.
> +int match_pattern(const char *name, const char **match,
> + struct string_list *exclude, int flags)
> +{
> + int nlen = strlen(name);
> +
> + if (exclude) {
> + struct string_list_item *x;
> + for_each_string_list_item(x, exclude) {
> + if (!fnmatch(x->string, name, 0))
> + return 0;
> + }
> + }
> + if (!match || !*match)
> + return 1;
> + for (; *match; match++) {
> + if (flags == FNM_PATHNAME)
> + if (match_path(name, *match, nlen))
> + return 1;
> + if (!fnmatch(*match, name, flags))
> + return 1;
> + }
> + return 0;
> +}
As an API for a consolidated and generic function, the design needs a bit
more improving, I would think.
- The name match_pattern() was OK for a static function inside a single
file, but it is way too vague for a global function. This is to match
refnames, so I suspect there should at least be a string "ref_"
somewhere in its name.
- You pass "flags" argument, so that later we _could_ enhance the
implementation to cover needs for new callers, but alas, it uses its
full bits to express only one "do we do FNM_PATHNAME or not?" bit of
information, so essentially "flags" does not give us any expandability.
- Is it a sane assumption that a caller that asks FNM_PATHNAME will
always want match_path() semantics, too? Aren't these two logically
independent?
- Is it a sane assumption that a caller that gives an exclude list will
want neither FNM_PATHNAME semantics nor match_path() semantics?
- Positive patterns are passed in "const char **match", and negative ones
are in "struct string_list *". Doesn't the inconsistency strike you as
strange?
Perhaps like...
#define REF_MATCH_LEADING 01
#define REF_MATCH_TRAILING 02
#define REF_MATCH_FNM_PATH 04
static int match_one(const char *name, size_t namelen, const char *pattern,
unsigned flags)
{
if ((flags & REF_MATCH_LEADING) &&
match_leading_path(name, pattern, namelen))
return 1;
if ((flags & REF_MATCH_TRAILING) &&
match_trailing_path(name, pattern, namelen))
return 1;
if (!fnmatch(pattern, name,
(flags & REF_MATCH_FNM_PATH) ? FNM_PATHNAME : 0))
return 1;
return 0;
}
int ref_match_pattern(const char *name,
const char **pattern, const char **exclude, unsigned flags)
{
size_t namelen = strlen(name);
if (exclude) {
while (*exclude) {
if (match_one(name, namelen, *exclude, flags))
return 0;
exclude++;
}
}
if (!pattern || !*pattern)
return 1;
while (*pattern) {
if (match_one(name, namelen, *pattern, flags))
return 1;
pattern++;
}
return 0;
}
and then the caller could do something like
ref_match_pattern("refs/heads/master",
["maste?", NULL],
["refs/heads/", NULL],
(REF_MATCH_FNM_PATH|REF_MATCH_LEADING));
Note that the above "ref_match_pattern()" gives the same "flags" for the
call to match_one() for elements in both positive and negative array and
it is very deliberate. See review comment to [3/5] for the reasoning.
Thanks.
next prev parent reply other threads:[~2012-02-22 6:33 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-09 19:43 [RFC/PATCH] tag: make list exclude !<pattern> Tom Grennan
2012-02-09 19:43 ` Tom Grennan
2012-02-10 0:00 ` Tom Grennan
2012-02-10 6:34 ` Nguyen Thai Ngoc Duy
2012-02-10 18:55 ` Tom Grennan
2012-02-11 2:16 ` Tom Grennan
2012-02-11 3:06 ` Junio C Hamano
2012-02-11 7:50 ` Junio C Hamano
2012-02-11 10:13 ` Jakub Narebski
2012-02-11 14:06 ` Nguyen Thai Ngoc Duy
2012-02-11 18:31 ` Junio C Hamano
2012-02-11 19:47 ` Tom Grennan
2012-02-11 7:50 ` Michael Haggerty
2012-02-11 8:13 ` Junio C Hamano
2012-02-13 5:29 ` Michael Haggerty
2012-02-13 6:37 ` Junio C Hamano
2012-02-13 9:37 ` Michael Haggerty
2012-02-13 10:23 ` Junio C Hamano
2012-02-13 14:34 ` Michael Haggerty
2012-02-13 20:29 ` Junio C Hamano
2012-02-11 19:08 ` Tom Grennan
2012-02-22 1:28 ` [PATCHv3 0/5] " Tom Grennan
2012-02-22 1:28 ` [PATCHv3 1/5] refs: add match_pattern() Tom Grennan
2012-02-22 6:33 ` Junio C Hamano [this message]
2012-02-22 23:47 ` Tom Grennan
2012-02-23 0:17 ` Junio C Hamano
2012-02-23 0:59 ` Tom Grennan
2012-02-22 1:28 ` [PATCHv3 2/5] tag --points-at option wrapper Tom Grennan
2012-02-22 1:28 ` [PATCHv3 3/5] tag --exclude option Tom Grennan
2012-02-22 6:33 ` Junio C Hamano
2012-02-23 0:22 ` Tom Grennan
2012-02-23 1:00 ` Junio C Hamano
2012-03-01 1:45 ` [PATCH 0/5] modernize test style Tom Grennan
2012-03-03 2:15 ` [PATCHv2 " Tom Grennan
2012-03-03 8:04 ` Junio C Hamano
2012-03-03 17:42 ` Tom Grennan
2012-03-03 2:15 ` [PATCHv2 1/5] t7004 (tag): modernize style Tom Grennan
2012-03-03 21:31 ` Johannes Sixt
2012-03-03 2:15 ` [PATCHv2 2/5] t5512 (ls-remote): " Tom Grennan
2012-03-03 8:05 ` Junio C Hamano
2012-03-03 17:33 ` Tom Grennan
2012-03-03 2:15 ` [PATCHv2 3/5] t3200 (branch): " Tom Grennan
2012-03-03 2:15 ` [PATCHv2 4/5] t0040 (parse-options): " Tom Grennan
2012-03-03 2:15 ` [PATCHv2 5/5] t6300 (for-each-ref): " Tom Grennan
2012-03-03 2:15 ` [PATCHv2-w 101/105] t7004 (tag): " Tom Grennan
2012-03-03 2:15 ` [PATCHv2-w 102/105] t5512 (ls-remote): " Tom Grennan
2012-03-03 2:15 ` [PATCHv2-w 103/105] t3200 (branch): " Tom Grennan
2012-03-03 2:15 ` [PATCHv2-w 104/105] t0040 (parse-options): " Tom Grennan
2012-03-03 2:15 ` [PATCHv2-w 105/105] t6300 (for-each-ref): " Tom Grennan
2012-03-01 1:45 ` [PATCH 1/5] " Tom Grennan
2012-03-01 6:53 ` Johannes Sixt
2012-03-01 15:58 ` Tom Grennan
2012-03-01 1:45 ` [PATCH 2/5] t5512 (ls-remote): " Tom Grennan
2012-03-01 8:36 ` Thomas Rast
2012-03-01 1:45 ` [PATCH 3/5] t3200 (branch): " Tom Grennan
2012-03-01 1:45 ` [PATCH 4/5] t0040 (parse-options): " Tom Grennan
2012-03-01 1:45 ` [PATCH 5/5] t7004 (tag): " Tom Grennan
2012-03-01 1:45 ` [PATCH-w 101/105] t6300 (for-each-ref): " Tom Grennan
2012-03-01 2:13 ` Junio C Hamano
2012-03-01 3:20 ` Tom Grennan
2012-03-01 3:26 ` Junio C Hamano
2012-03-01 5:10 ` Tom Grennan
2012-03-01 5:57 ` Tom Grennan
2012-03-01 8:42 ` Thomas Rast
2012-03-01 15:48 ` Tom Grennan
2012-03-01 1:45 ` [PATCH-w 102/105] t5512 (ls-remote): " Tom Grennan
2012-03-01 1:45 ` [PATCH-w 103/105] t3200 (branch): " Tom Grennan
2012-03-01 1:45 ` [PATCH-w 104/105] t0040 (parse-options): " Tom Grennan
2012-03-01 1:45 ` [PATCH-w 105/105] t7004 (tag): " Tom Grennan
2012-02-22 1:28 ` [PATCHv3 4/5] branch --exclude option Tom Grennan
2012-02-22 1:28 ` [PATCHv3 5/5] for-each-ref " Tom Grennan
2012-02-11 2:16 ` [PATCHv2 1/4] refs: add common refname_match_patterns() Tom Grennan
2012-02-11 7:12 ` Michael Haggerty
2012-02-11 19:17 ` Tom Grennan
2012-02-13 5:00 ` Michael Haggerty
2012-02-13 17:27 ` Tom Grennan
2012-02-11 8:06 ` Junio C Hamano
2012-02-11 19:37 ` Tom Grennan
2012-02-11 23:43 ` Junio C Hamano
2012-02-13 16:29 ` Tom Grennan
2012-02-11 2:16 ` [PATCHv2 2/4] tag: use refs.c:refname_match_patterns() Tom Grennan
2012-02-11 2:16 ` [PATCHv2 3/4] branch: " Tom Grennan
2012-02-11 2:16 ` [PATCHv2 4/4] for-each-ref: " Tom Grennan
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=7vobsrbcny.fsf@alter.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=jasampler@gmail.com \
--cc=pclouds@gmail.com \
--cc=peff@peff.net \
--cc=tmgrennan@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.