On Sat, Aug 15, 2015 at 2:00 PM, Karthik Nayak <karthik....@gmail.com> wrote: > Add a function called 'for_each_reftype_fullpath()' to refs.{c,h} > which iterates through each ref for the given path without trimming > the path and also accounting for broken refs, if mentioned. > > Add 'filter_ref_kind()' in ref-filter.c to check the kind of ref being > handled and return the kind to 'ref_filter_handler()', where we > discard refs which we do not need and assign the kind to needed refs. > > Signed-off-by: Karthik Nayak <karthik....@gmail.com> > --- > diff --git a/ref-filter.c b/ref-filter.c > index eac99d0..abcd235 100644 > --- a/ref-filter.c > +++ b/ref-filter.c > @@ -1226,16 +1262,29 @@ int filter_refs(struct ref_array *array, struct > ref_filter *filter, unsigned int > { > struct ref_filter_cbdata ref_cbdata; > int ret = 0; > + unsigned int broken = 0; > > ref_cbdata.array = array; > ref_cbdata.filter = filter; > > /* Simple per-ref filtering */ > - if (type & (FILTER_REFS_ALL | FILTER_REFS_INCLUDE_BROKEN)) > - ret = for_each_rawref(ref_filter_handler, &ref_cbdata); > - else if (type & FILTER_REFS_ALL) > - ret = for_each_ref(ref_filter_handler, &ref_cbdata); > - else if (type) > + if (type & FILTER_REFS_INCLUDE_BROKEN) { > + type -= FILTER_REFS_INCLUDE_BROKEN;
The above is a somewhat unusual way to say the more idiomatic: type &= ~FILTER_REFS_INCLUDE_BROKEN; when dealing with bit flags. Is there precedence elsewhere in the project for choosing '-' over '~'? > + broken = 1; > + } > + > + filter->kind = type; > + if (type == FILTER_REFS_BRANCHES) > + ret = for_each_reftype_fullpath(ref_filter_handler, > "refs/heads/", broken, &ref_cbdata); > + else if (type == FILTER_REFS_REMOTES) > + ret = for_each_reftype_fullpath(ref_filter_handler, > "refs/remotes/", broken, &ref_cbdata); > + else if (type == FILTER_REFS_TAGS) > + ret = for_each_reftype_fullpath(ref_filter_handler, > "refs/tags/", broken, &ref_cbdata); > + else if (type & FILTER_REFS_ALL) { > + ret = for_each_reftype_fullpath(ref_filter_handler, "", > broken, &ref_cbdata); These cases are all the same except for the (string) second argument, aren't they? This might be less noisy and easier to follow if you assign the appropriate string to a variable first, and then invoke for_each_reftype_fullpath() once with the string variable as an argument. > + if (type & FILTER_REFS_DETACHED_HEAD) > + head_ref(ref_filter_handler, &ref_cbdata); > + } else > die("filter_refs: invalid type"); > > /* Filters that need revision walking */ > diff --git a/ref-filter.h b/ref-filter.h > index 144a633..64fedd3 100644 > --- a/ref-filter.h > +++ b/ref-filter.h > @@ -14,8 +14,14 @@ > -#define FILTER_REFS_INCLUDE_BROKEN 0x1 > -#define FILTER_REFS_ALL 0x2 > +#define FILTER_REFS_INCLUDE_BROKEN 0x0001 > +#define FILTER_REFS_TAGS 0x0002 > +#define FILTER_REFS_BRANCHES 0x0004 > +#define FILTER_REFS_REMOTES 0x0008 > +#define FILTER_REFS_OTHERS 0x0010 > +#define FILTER_REFS_ALL (FILTER_REFS_TAGS | FILTER_REFS_BRANCHES > | \ > + FILTER_REFS_REMOTES | FILTER_REFS_OTHERS) > +#define FILTER_REFS_DETACHED_HEAD 0x0020 I suppose there's some good reason that FILTER_REFS_DETACHED_HEAD is not a member of FILTER_REFS_ALL? Perhaps add a comment explaining it? > diff --git a/refs.c b/refs.c > index 2db2975..0f18c34 100644 > --- a/refs.c > +++ b/refs.c > @@ -2145,6 +2145,13 @@ int for_each_replace_ref(each_ref_fn fn, void *cb_data) > strlen(git_replace_ref_base), 0, cb_data); > } > > +int for_each_reftype_fullpath(each_ref_fn fn, char *type, unsigned int > broken, void *cb_data) > +{ > + if (broken) > + broken = DO_FOR_EACH_INCLUDE_BROKEN; It's a bit ugly and confusing to have the same variable, 'broken', act as both a boolean input argument and as a bit flag argument to the called function. > + return do_for_each_ref(&ref_cache, type, fn, 0, broken, cb_data); > +} > + > int head_ref_namespaced(each_ref_fn fn, void *cb_data) > { > struct strbuf buf = STRBUF_INIT; -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html