All of lore.kernel.org
 help / color / mirror / Atom feed
From: Karthik Nayak <karthik.188@gmail.com>
To: git@vger.kernel.org
Cc: christian.couder@gmail.com, Matthieu.Moy@grenoble-inp.fr,
	Karthik Nayak <karthik.188@gmail.com>
Subject: [PATCH v4 03/19] ref-filter: implement '--points-at' option
Date: Mon, 22 Jun 2015 02:18:17 +0530	[thread overview]
Message-ID: <1434919705-4884-3-git-send-email-karthik.188@gmail.com> (raw)
In-Reply-To: <1434919705-4884-1-git-send-email-karthik.188@gmail.com>

In 'tag -l' we have '--points-at' option which lets users
list only tags which point to a particular commit. Implement
this option in 'ref-filter.{c,h}' so that other commands can
benefit from this.

This is duplicated from tag.c, we will eventually remove that
when we port tag.c to use ref-filter APIs.

Based-on-patch-by: Jeff King <peff@peff.net>
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>
---
 builtin/tag.c |  4 ++++
 ref-filter.c  | 26 ++++++++++++++++++++++++++
 ref-filter.h  |  1 +
 3 files changed, 31 insertions(+)

diff --git a/builtin/tag.c b/builtin/tag.c
index e36c43e..280981f 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -56,6 +56,10 @@ static int match_pattern(const char **patterns, const char *ref)
 	return 0;
 }
 
+/*
+ * This is currently duplicated in ref-filter.c, and will eventually be
+ * removed as we port tag.c to use the ref-filter APIs.
+ */
 static const unsigned char *match_points_at(const char *refname,
 					    const unsigned char *sha1)
 {
diff --git a/ref-filter.c b/ref-filter.c
index 43502a4..591e281 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -842,6 +842,29 @@ static int match_name_as_path(const char **pattern, const char *refname)
 	return 0;
 }
 
+/*
+ * Given a ref (sha1, refname) see if it points to a one of the sha1s
+ * in a sha1_array.
+ */
+static int match_points_at(struct sha1_array *points_at, const unsigned char *sha1,
+			   const char *refname)
+{
+	struct object *obj;
+
+	if (!points_at || !points_at->nr)
+		return 1;
+
+	if (sha1_array_lookup(points_at, sha1) >= 0)
+		return 1;
+
+	obj = parse_object_or_die(sha1, refname);
+	if (obj->type == OBJ_TAG &&
+	    sha1_array_lookup(points_at, ((struct tag *)obj)->tagged->sha1) >= 0)
+		return 1;
+
+	return 0;
+}
+
 /* Allocate space for a new ref_array_item and copy the objectname and flag to it */
 static struct ref_array_item *new_ref_array_item(const char *refname,
 						 const unsigned char *objectname,
@@ -875,6 +898,9 @@ static int ref_filter_handler(const char *refname, const struct object_id *oid,
 	if (*filter->name_patterns && !match_name_as_path(filter->name_patterns, refname))
 		return 0;
 
+	if (!match_points_at(&filter->points_at, oid->hash, 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
diff --git a/ref-filter.h b/ref-filter.h
index 6997984..c2856b8 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -42,6 +42,7 @@ struct ref_array {
 
 struct ref_filter {
 	const char **name_patterns;
+	struct sha1_array points_at;
 };
 
 struct ref_filter_cbdata {
-- 
2.4.3.439.gfea0c2a.dirty

  parent reply	other threads:[~2015-06-21 20:48 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-21 20:45 [PATCH v4 00/11] add options to for-each-ref Karthik Nayak
2015-06-21 20:48 ` [PATCH v4 01/19] t6301: for-each-ref tests for ref-filter APIs Karthik Nayak
2015-06-21 20:48   ` [PATCH v4 02/19] tag: libify parse_opt_points_at() Karthik Nayak
2015-06-21 20:48   ` Karthik Nayak [this message]
2015-06-22 22:36     ` [PATCH v4 03/19] ref-filter: implement '--points-at' option Eric Sunshine
2015-06-23 10:49       ` Karthik Nayak
2015-06-21 20:48   ` [PATCH v4 04/19] for-each-ref: add " Karthik Nayak
2015-06-22  0:45     ` Junio C Hamano
2015-06-22 19:03       ` Karthik Nayak
2015-06-22 19:21         ` Matthieu Moy
2015-06-22 19:24           ` Junio C Hamano
2015-06-22 19:27             ` Karthik Nayak
2015-06-22 19:51             ` Junio C Hamano
2015-06-22 22:38     ` Eric Sunshine
2015-06-23 10:52       ` Karthik Nayak
2015-06-21 20:48   ` [PATCH v4 05/19] ref-filter: add parse_opt_merge_filter() Karthik Nayak
2015-06-22  0:55     ` Junio C Hamano
2015-06-22 11:13       ` Matthieu Moy
2015-06-22 16:15         ` Junio C Hamano
2015-06-22 19:00       ` Karthik Nayak
2015-06-21 20:48   ` [PATCH v4 06/19] ref-filter: implement '--merged' and '--no-merged' options Karthik Nayak
2015-06-22  1:00     ` Junio C Hamano
2015-06-22 15:11       ` Karthik Nayak
2015-06-21 20:48   ` [PATCH v4 07/19] for-each-ref: add " Karthik Nayak
2015-06-22 22:41     ` Eric Sunshine
2015-06-23 11:05       ` Karthik Nayak
2015-06-21 20:48   ` [PATCH v4 08/19] parse-option: rename parse_opt_with_commit() Karthik Nayak
2015-06-22  1:04     ` Junio C Hamano
2015-06-22 15:38       ` Karthik Nayak
2015-06-22 16:27         ` Junio C Hamano
2015-06-22 16:37           ` Karthik Nayak
2015-06-21 20:48   ` [PATCH v4 09/19] parse-options.h: add macros for '--contains' option Karthik Nayak
2015-06-21 20:48   ` [PATCH v4 10/19] ref-filter: implement " Karthik Nayak
2015-06-21 20:48   ` [PATCH v4 11/19] for-each-ref: add " Karthik Nayak
2015-06-21 20:51 ` [PATCH v4 00/11] add options to for-each-ref Karthik Nayak
2015-06-22  0:41   ` Junio C Hamano
2015-06-22 14:48     ` 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=1434919705-4884-3-git-send-email-karthik.188@gmail.com \
    --to=karthik.188@gmail.com \
    --cc=Matthieu.Moy@grenoble-inp.fr \
    --cc=christian.couder@gmail.com \
    --cc=git@vger.kernel.org \
    /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.