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 v7 03/11] ref-filter: implement '--points-at' option
Date: Thu, 2 Jul 2015 20:51:02 +0530 [thread overview]
Message-ID: <1435850470-5175-3-git-send-email-karthik.188@gmail.com> (raw)
In-Reply-To: <1435850470-5175-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 | 34 ++++++++++++++++++++++++++++++++++
ref-filter.h | 1 +
3 files changed, 39 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..f1f425e 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -842,6 +842,37 @@ 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 it tags one of the sha1s
+ * 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 +911,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.4
next prev parent reply other threads:[~2015-07-02 15:22 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-02 15:20 [PATCH v7 00/11] add options to for-each-ref Karthik Nayak
2015-07-02 15:21 ` [PATCH v7 01/11] t6302: for-each-ref tests for ref-filter APIs Karthik Nayak
2015-07-02 15:21 ` [PATCH v7 02/11] tag: libify parse_opt_points_at() Karthik Nayak
2015-07-02 15:21 ` Karthik Nayak [this message]
2015-07-02 15:21 ` [PATCH v7 04/11] for-each-ref: add '--points-at' option Karthik Nayak
2015-07-02 17:05 ` Matthieu Moy
2015-07-05 16:01 ` Karthik Nayak
2015-07-02 15:21 ` [PATCH v7 05/11] ref-filter: add parse_opt_merge_filter() Karthik Nayak
2015-07-02 17:06 ` Matthieu Moy
2015-07-02 17:21 ` Karthik Nayak
2015-07-02 15:21 ` [PATCH v7 06/11] ref-filter: implement '--merged' and '--no-merged' options Karthik Nayak
2015-07-02 15:21 ` [PATCH v7 07/11] for-each-ref: add " Karthik Nayak
2015-07-02 15:21 ` [PATCH v7 08/11] parse-option: rename parse_opt_with_commit() Karthik Nayak
2015-07-02 15:21 ` [PATCH v7 09/11] parse-options.h: add macros for '--contains' option Karthik Nayak
2015-07-02 17:08 ` Matthieu Moy
2015-07-02 17:22 ` Karthik Nayak
2015-07-02 15:21 ` [PATCH v7 10/11] ref-filter: implement " Karthik Nayak
2015-07-02 17:12 ` Matthieu Moy
2015-07-02 17:24 ` Karthik Nayak
2015-07-02 15:21 ` [PATCH v7 11/11] for-each-ref: add " 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=1435850470-5175-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.