Re: [WIP/PATCH v4 1/8] for-each-ref: extract helper functions out of grab_single_ref()
- From
Eric Sunshine <sunshine@sunshineco.com>
- Date
- May 31, 2015, 02:58 UTC
- Message-ID
- <CAPig+cSBaKwRqEEBB62LX0OyYGNddLHNU-zMEx2478kV8=+pDQ@mail.gmail.com>
- In-Reply-To
- <1433008411-8550-1-git-send-email-karthik.188@gmail.com>
On Sat, May 30, 2015 at 1:53 PM, Karthik Nayak <karthik.188@gmail.com> wrote:
Show 96 quoted lines
> Extract two helper functions out of grab_single_ref(). Firstly,
> new_refinfo() which is used to allocate memory for a new refinfo
> structure and copy the objectname, refname and flag to it.
> Secondly, match_name_as_path() which when given an array of patterns
> and the refname checks if the refname matches any of the patterns
> given while the pattern is a pathname, also while supporting wild
> characters.
>
> This is a preperatory patch for restructuring 'for-each-ref' and
> eventually moving most of it to 'ref-filter' to provide the
> functionality to similar commands via public API's.
>
> Helped-by: Junio C Hamano <gitster@pobox.com>
> Mentored-by: Christian Couder <christian.couder@gmail.com>
> Mentored-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr>
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
> ---
> diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
> index 83f9cf9..b33e2de 100644
> --- a/builtin/for-each-ref.c
> +++ b/builtin/for-each-ref.c
> @@ -837,6 +837,43 @@ struct grab_ref_cbdata {
> };
>
> /*
> + * Given a refname, return 1 if the refname matches with one of the patterns
> + * while the pattern is a pathname like 'refs/tags' or 'refs/heads/master'
> + * and so on, else return 0. Supports use of wild characters.
> + */
> +static int match_name_as_path(const char **pattern, const char *refname)
> +{
> + int namelen = strlen(refname);
> + for (; *pattern; pattern++) {
> + const char *p = *pattern;
> + int plen = strlen(p);
> +
> + if ((plen <= namelen) &&
> + !strncmp(refname, p, plen) &&
> + (refname[plen] == '\0' ||
> + refname[plen] == '/' ||
> + p[plen-1] == '/'))
> + return 1;
> + if (!wildmatch(p, refname, WM_PATHNAME, NULL))
> + return 1;
> + }
> + return 0;
> +}
> +
> +/* Allocate space for a new refinfo and copy the objectname and flag to it */
> +static struct refinfo *new_refinfo(const char *refname,
> + const unsigned char *objectname,
> + int flag)
> +{
> + struct refinfo *ref = xcalloc(1, sizeof(struct refinfo));
> + ref->refname = xstrdup(refname);
> + hashcpy(ref->objectname, objectname);
> + ref->flag = flag;
> +
> + return ref;
> +}
> +
> +/*
> * A call-back given to for_each_ref(). Filter refs and keep them for
> * later object processing.
> */
> @@ -851,40 +888,16 @@ static int grab_single_ref(const char *refname, const unsigned char *sha1, int f
> return 0;
> }
>
> - if (*cb->grab_pattern) {
> - const char **pattern;
> - int namelen = strlen(refname);
> - for (pattern = cb->grab_pattern; *pattern; pattern++) {
> - const char *p = *pattern;
> - int plen = strlen(p);
> -
> - if ((plen <= namelen) &&
> - !strncmp(refname, p, plen) &&
> - (refname[plen] == '\0' ||
> - refname[plen] == '/' ||
> - p[plen-1] == '/'))
> - break;
> - if (!wildmatch(p, refname, WM_PATHNAME, NULL))
> - break;
> - }
> - if (!*pattern)
> - return 0;
> - }
> + if (*cb->grab_pattern && !match_name_as_path(cb->grab_pattern, refname))
> + return 0;
>
> - /*
> - * We do not open the object yet; sort may only need refname
> - * to do its job and the resulting list may yet to be pruned
> - * by maxcount logic.
> - */Why did this comment get removed? Isn't it still meaningful to the overall logic of this function?
Show 11 quoted lines
> - ref = xcalloc(1, sizeof(*ref)); > - ref->refname = xstrdup(refname); > - hashcpy(ref->objectname, sha1); > - ref->flag = flag; > + ref = new_refinfo(refname, sha1, flag); > > cnt = cb->grab_cnt; > REALLOC_ARRAY(cb->grab_array, cnt + 1); > cb->grab_array[cnt++] = ref; > cb->grab_cnt = cnt; > +
Sneaking in whitespace change?
> return 0; > }