From: Junio C Hamano <gitster@pobox.com>
To: Michael Haggerty <mhagger@alum.mit.edu>
Cc: Karthik Nayak <karthik.188@gmail.com>,
git@vger.kernel.org, christian.couder@gmail.com,
Matthieu.Moy@grenoble-inp.fr
Subject: Re: [PATCH v13 05/12] ref-filter: add option to filter out tags, branches and remotes
Date: Mon, 24 Aug 2015 15:24:42 -0700 [thread overview]
Message-ID: <xmqqbndw2ul1.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <1440214788-1309-6-git-send-email-Karthik.188@gmail.com> (Karthik Nayak's message of "Sat, 22 Aug 2015 09:09:41 +0530")
Karthik Nayak <karthik.188@gmail.com> writes:
> From: Karthik Nayak <karthik.188@gmail.com>
>
> 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.
For this part, I think you would want to borrow an extra pair of
eyes from Michael.
>
> 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.
>
> 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>
> ---
> ref-filter.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
> ref-filter.h | 12 ++++++++++--
> refs.c | 9 +++++++++
> refs.h | 1 +
> 4 files changed, 74 insertions(+), 7 deletions(-)
>
> diff --git a/ref-filter.c b/ref-filter.c
> index ffec10a..d5fae1a 100644
> --- a/ref-filter.c
> +++ b/ref-filter.c
> @@ -1123,6 +1123,36 @@ static struct ref_array_item *new_ref_array_item(const char *refname,
> return ref;
> }
>
> +static int filter_ref_kind(struct ref_filter *filter, const char *refname)
> +{
> + unsigned int i;
> +
> + static struct {
> + const char *prefix;
> + unsigned int kind;
> + } ref_kind[] = {
> + { "refs/heads/" , FILTER_REFS_BRANCHES },
> + { "refs/remotes/" , FILTER_REFS_REMOTES },
> + { "refs/tags/", FILTER_REFS_TAGS}
> + };
> +
> + if (filter->kind == FILTER_REFS_BRANCHES)
> + return FILTER_REFS_BRANCHES;
> + else if (filter->kind == FILTER_REFS_REMOTES)
> + return FILTER_REFS_REMOTES;
> + else if (filter->kind == FILTER_REFS_TAGS)
> + return FILTER_REFS_TAGS;
> + else if (!strcmp(refname, "HEAD"))
> + return FILTER_REFS_DETACHED_HEAD;
> +
> + for (i = 0; i < ARRAY_SIZE(ref_kind); i++) {
> + if (starts_with(refname, ref_kind[i].prefix))
> + return ref_kind[i].kind;
> + }
> +
> + return FILTER_REFS_OTHERS;
> +}
> +
> /*
> * A call-back given to for_each_ref(). Filter refs and keep them for
> * later object processing.
> @@ -1133,6 +1163,7 @@ static int ref_filter_handler(const char *refname, const struct object_id *oid,
> struct ref_filter *filter = ref_cbdata->filter;
> struct ref_array_item *ref;
> struct commit *commit = NULL;
> + unsigned int kind;
>
> if (flag & REF_BAD_NAME) {
> warning("ignoring ref with broken name %s", refname);
> @@ -1144,6 +1175,10 @@ static int ref_filter_handler(const char *refname, const struct object_id *oid,
> return 0;
> }
>
> + kind = filter_ref_kind(filter, refname);
> + if (!(kind & filter->kind))
> + return 0;
> +
When filter->kind is set to some single-bit thing (e.g.
FILTER_REFS_BRANCHES) by the caller of ref_filter_handler(), then
this call of filter_ref_kind() will just parrot that without even
looking at refname. And then the if statement says "yes, they have
common bit(s)". Even when refname is "refs/tags/v1.0" or "HEAD".
And if this code knows that "refs/tags/v1.0" or "HEAD" will never
come when filter->kind is exactly FILTER_REFS_BRANCHES, then I do
not see the point of calling filter_ref_kind().
I am not sure what this is trying to do. Can you clarify the
thinking behind this as a comment to filter_ref_kind()?
> @@ -1175,6 +1210,7 @@ static int ref_filter_handler(const char *refname, const struct object_id *oid,
>
> REALLOC_ARRAY(ref_cbdata->array->items, ref_cbdata->array->nr + 1);
> ref_cbdata->array->items[ref_cbdata->array->nr++] = ref;
> + ref->kind = kind;
> return 0;
> }
>
> @@ -1251,16 +1287,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;
> + 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);
> + 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 45026d0..99f081b 100644
> --- a/ref-filter.h
> +++ b/ref-filter.h
> @@ -13,8 +13,14 @@
> #define QUOTE_PYTHON 4
> #define QUOTE_TCL 8
>
> -#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
>
> struct atom_value;
>
> @@ -27,6 +33,7 @@ struct ref_sorting {
> struct ref_array_item {
> unsigned char objectname[20];
> int flag;
> + unsigned int kind;
> const char *symref;
> struct commit *commit;
> struct atom_value *value;
> @@ -51,6 +58,7 @@ struct ref_filter {
> struct commit *merge_commit;
>
> unsigned int with_commit_tag_algo : 1;
> + unsigned int kind;
> };
>
> struct ref_filter_cbdata {
> diff --git a/refs.c b/refs.c
> index 4e15f60..3266617 100644
> --- a/refs.c
> +++ b/refs.c
> @@ -2150,6 +2150,15 @@ 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)
> +{
> + unsigned int flag = 0;
> +
> + if (broken)
> + flag = DO_FOR_EACH_INCLUDE_BROKEN;
> + return do_for_each_ref(&ref_cache, type, fn, 0, flag, cb_data);
> +}
> +
> int head_ref_namespaced(each_ref_fn fn, void *cb_data)
> {
> struct strbuf buf = STRBUF_INIT;
> diff --git a/refs.h b/refs.h
> index e9a5f32..6e913ee 100644
> --- a/refs.h
> +++ b/refs.h
> @@ -179,6 +179,7 @@ extern int for_each_remote_ref(each_ref_fn fn, void *cb_data);
> extern int for_each_replace_ref(each_ref_fn fn, void *cb_data);
> extern int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data);
> extern int for_each_glob_ref_in(each_ref_fn fn, const char *pattern, const char *prefix, void *cb_data);
> +extern int for_each_reftype_fullpath(each_ref_fn fn, char *type, unsigned int broken, void *cb_data);
>
> extern int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data);
> extern int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data);
next prev parent reply other threads:[~2015-08-24 22:24 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-22 3:39 [PATCH v13 00/12] port tag.c to use ref-filter APIs Karthik Nayak
2015-08-22 3:39 ` [PATCH v13 01/12] ref-filter: move `struct atom_value` to ref-filter.c Karthik Nayak
2015-08-22 3:39 ` [PATCH v13 02/12] ref-filter: introduce ref_formatting_state and ref_formatting_stack Karthik Nayak
2015-08-24 21:56 ` Junio C Hamano
2015-08-25 10:26 ` Karthik Nayak
2015-08-22 3:39 ` [PATCH v13 03/12] utf8: add function to align a string into given strbuf Karthik Nayak
2015-08-22 3:39 ` [PATCH v13 04/12] ref-filter: implement an `align` atom Karthik Nayak
2015-08-24 22:13 ` Junio C Hamano
2015-08-24 22:15 ` Junio C Hamano
2015-08-25 13:28 ` Karthik Nayak
2015-08-25 6:47 ` Matthieu Moy
2015-08-25 13:30 ` Karthik Nayak
2015-08-25 17:56 ` Junio C Hamano
2015-08-26 6:41 ` Karthik Nayak
2015-08-25 17:52 ` Junio C Hamano
2015-08-25 13:28 ` Karthik Nayak
2015-08-22 3:39 ` [PATCH v13 05/12] ref-filter: add option to filter out tags, branches and remotes Karthik Nayak
2015-08-24 22:24 ` Junio C Hamano [this message]
2015-08-25 13:07 ` Karthik Nayak
2015-08-26 16:10 ` Michael Haggerty
2015-08-27 12:42 ` Karthik Nayak
2015-08-27 15:24 ` Michael Haggerty
2015-08-27 15:35 ` Karthik Nayak
2015-08-22 3:39 ` [PATCH v13 06/12] ref-filter: support printing N lines from tag annotation Karthik Nayak
2015-08-22 3:39 ` [PATCH v13 07/12] ref-filter: add support to sort by version Karthik Nayak
2015-08-22 3:39 ` [PATCH v13 08/12] ref-filter: add option to match literal pattern Karthik Nayak
2015-08-22 3:39 ` [PATCH v13 09/12] tag.c: use 'ref-filter' data structures Karthik Nayak
2015-08-22 3:39 ` [PATCH v13 10/12] tag.c: use 'ref-filter' APIs Karthik Nayak
2015-08-22 3:39 ` [PATCH v13 11/12] tag.c: implement '--format' option Karthik Nayak
2015-08-23 19:56 ` Matthieu Moy
2015-08-24 15:07 ` Karthik Nayak
2015-08-24 15:14 ` Matthieu Moy
2015-08-24 15:21 ` Karthik Nayak
2015-08-22 3:39 ` [PATCH v13 12/12] tag.c: implement '--merged' and '--no-merged' options Karthik Nayak
2015-08-23 20:00 ` [PATCH v13 00/12] port tag.c to use ref-filter APIs Matthieu Moy
2015-08-24 15:09 ` Karthik Nayak
2015-08-24 15:16 ` Matthieu Moy
2015-08-24 15:22 ` Karthik Nayak
2015-08-24 22:34 ` Junio C Hamano
2015-08-24 22:58 ` Junio C Hamano
2015-08-25 13:26 ` Karthik Nayak
2015-08-25 19:16 ` Junio C Hamano
2015-08-25 19:43 ` Junio C Hamano
2015-08-26 5:56 ` Karthik Nayak
2015-08-26 14:37 ` Junio C Hamano
2015-08-26 19:14 ` Karthik Nayak
2015-08-26 20:19 ` Junio C Hamano
2015-08-27 18:00 ` Karthik Nayak
2015-08-25 13:23 ` Karthik Nayak
2015-08-24 17:27 ` Junio C Hamano
2015-08-24 18:09 ` Karthik Nayak
2015-08-24 18:53 ` Junio C Hamano
2015-08-24 22:35 ` Junio C Hamano
2015-08-26 10:07 ` Karthik Nayak
2015-08-26 11:54 ` Matthieu Moy
2015-08-26 15:44 ` Junio C Hamano
2015-08-26 15:46 ` Junio C Hamano
2015-08-26 15:48 ` Matthieu Moy
2015-08-26 19:11 ` Karthik Nayak
2015-08-25 13:25 ` Karthik Nayak
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=xmqqbndw2ul1.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=Matthieu.Moy@grenoble-inp.fr \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=karthik.188@gmail.com \
--cc=mhagger@alum.mit.edu \
/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.