git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v8 03/11] ref-filter: implement '--points-at' option

From
Karthik Nayak <karthik.188@gmail.com>
Date
Jul 7, 2015, 16:06 UTC
Message-ID
<1436285177-12279-3-git-send-email-karthik.188@gmail.com>
In-Reply-To
<1436285177-12279-1-git-send-email-karthik.188@gmail.com>

In 'tag -l' we have '--points-at' option which lets users list only tags of a given object. 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  | 35 +++++++++++++++++++++++++++++++++++
 ref-filter.h  |  1 +
 3 files changed, 40 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 c4004db..58e532c 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -842,6 +842,38 @@ static int match_name_as_path(const char **pattern, const char *refname)
 	return 0;
 }
 
+/*
+ * Given a ref (sha1, refname), check if the ref belongs to the array
+ * of sha1s. If the given ref is a tag, check if the given tag points
+ * at one of the sha1s in the given sha1 array.
+ * the given sha1_array.
+ * NEEDSWORK:
+ * 1. Only a single level of inderection is obtained, we might want to
+ * change this to account for multiple levels (e.g. annotated tags
+ * pointing to annotated tags pointing to a commit.)
+ * 2. As the refs are cached we might know what refname peels to without
+ * the need to parse the object via parse_object(). peel_ref() might be a
+ * more efficient alternative to obtain the pointee.
+ */
+static const unsigned char *match_points_at(struct sha1_array *points_at,
+					    const unsigned char *sha1,
+					    const char *refname)
+{
+	const unsigned char *tagged_sha1 = NULL;
+	struct object *obj;
+
+	if (sha1_array_lookup(points_at, sha1) >= 0)
+		return sha1;
+	obj = parse_object(sha1);
+	if (!obj)
+		die(_("malformed object at '%s'"), refname);
+	if (obj->type == OBJ_TAG)
+		tagged_sha1 = ((struct tag *)obj)->tagged->sha1;
+	if (tagged_sha1 && sha1_array_lookup(points_at, tagged_sha1) >= 0)
+		return tagged_sha1;
+	return NULL;
+}
+
 /* 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,
@@ -880,6 +912,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 (filter->points_at.nr && !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.5
Previous: Karthik NayakNext: Karthik Nayak
Message 4 of 18 in “add options to for-each-ref”
  1. 00/11 add options to for-each-refKarthik Nayak, Jul 7, 2015
  2. 01/11 t6302: for-each-ref tests for ref-filter APIsKarthik Nayak, Jul 7, 2015
  3. 02/11 tag: libify parse_opt_points_at()Karthik Nayak, Jul 7, 2015
  4. 03/11 ref-filter: implement '--points-at' optionKarthik Nayak, Jul 7, 2015
  5. 04/11 for-each-ref: add '--points-at' optionKarthik Nayak, Jul 7, 2015
  6. 05/11 ref-filter: add parse_opt_merge_filter()Karthik Nayak, Jul 7, 2015
  7. 06/11 ref-filter: implement '--merged' and '--no-merged' optionsKarthik Nayak, Jul 7, 2015
  8. 07/11 for-each-ref: add '--merged' and '--no-merged' optionsKarthik Nayak, Jul 7, 2015
  9. 08/11 parse-option: rename parse_opt_with_commit()Karthik Nayak, Jul 7, 2015
  10. 09/11 parse-options.h: add macros for '--contains' optionKarthik Nayak, Jul 7, 2015
  11. 10/11 ref-filter: implement '--contains' optionKarthik Nayak, Jul 7, 2015
  12. 11/11 for-each-ref: add '--contains' optionKarthik Nayak, Jul 7, 2015
  13. Torsten BögershausenJul 8, 2015
  14. Matthieu MoyJul 8, 2015
  15. Karthik NayakJul 8, 2015
  16. Matthieu MoyJul 8, 2015
  17. Karthik NayakJul 9, 2015
  18. 01/11 t6302: for-each-ref tests for ref-filter APIsKarthik Nayak, Jul 9, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.