On Sat, May 30, 2015 at 1:53 PM, Karthik Nayak <karthik.188@xxxxxxxxx> wrote: > 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@xxxxxxxxx> > Mentored-by: Christian Couder <christian.couder@xxxxxxxxx> > Mentored-by: Matthieu Moy <matthieu.moy@xxxxxxxxxxxxxxx> > Signed-off-by: Karthik Nayak <karthik.188@xxxxxxxxx> > --- > 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? > - 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; > } -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html