From: Kenneth Cochran <kenneth.cochran101@gmail.com>
To: Kenneth Cochran <kenneth.cochran101@gmail.com>
Cc: git@vger.kernel.org, Sahil Dua <sahildua2305@gmail.com>,
Duy Nguyen <pclouds@gmail.com>, Jeff King <peff@peff.net>
Subject: Re: [RFC PATCH 2/4] Add alias option to git branch
Date: Mon, 4 Mar 2019 09:48:25 -0600 [thread overview]
Message-ID: <D9CFD250-26D4-4D1F-B0CD-01E24E8606D9@gmail.com> (raw)
In-Reply-To: <7D21A788-5E38-466F-B3CC-F6A5CBEB2E2E@gmail.com>
From 5aa6f037642df3b358ab659d17b5fb5bc7936f0f Mon Sep 17 00:00:00 2001
From: Kenneth Cochran <kenneth.cochran101@gmail.com>
Date: Sun, 3 Mar 2019 15:05:11 -0600
Subject: [RFC PATCH 2/4] refs: add function to iteratively dereference symref
chain
Cc: Sahil Dua <sahildua2305@gmail.com>,
Duy Nguyen <pclouds@gmail.com>,
Jeff King <peff@peff.net>
As far as I can tell, currently, there's not really any way
to run something once per symref in a symref chain. This adds that
ability.
This will be useful for instance to improve how `git branch -d`
handles a checked out symref.
Signed-off-by: Kenneth Cochran <kenneth.cochran101@gmail.com>
---
refs.c | 28 ++++++++++++++++++++++++++++
refs.h | 13 +++++++++++++
2 files changed, 41 insertions(+)
diff --git a/refs.c b/refs.c
index 142888a40a..18a222d76a 100644
--- a/refs.c
+++ b/refs.c
@@ -1466,6 +1466,34 @@ static int do_for_each_ref(struct ref_store *refs, const char *prefix,
do_for_each_ref_helper, &hp);
}
+int refs_for_each_ref_in_chain(struct ref_store *refs, each_ref_fn fn,
+ void *cb_data, const char *starting_ref)
+{
+ int symref_count;
+ struct object_id oid;
+ int flags;
+ const char *ref_name = xstrdup(starting_ref);
+ int res;
+
+ for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
+ res = fn(ref_name, &oid, flags, cb_data);
+ ref_name = refs_resolve_ref_unsafe(refs, ref_name, RESOLVE_REF_NO_RECURSE,
+ &oid, &flags);
+
+ if (res)
+ return res;
+ if (!(flags & REF_ISSYMREF))
+ break;
+ }
+ return 0;
+}
+
+int for_each_ref_in_chain(each_ref_fn fn, void *cb_data, const char *starting_ref)
+{
+ return refs_for_each_ref_in_chain(get_main_ref_store(the_repository), fn,
+ cb_data, starting_ref);
+}
+
int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
{
return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
diff --git a/refs.h b/refs.h
index 308fa1f03b..66ccb85e8d 100644
--- a/refs.h
+++ b/refs.h
@@ -327,6 +327,19 @@ int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
int head_ref_namespaced(each_ref_fn fn, void *cb_data);
int for_each_namespaced_ref(each_ref_fn fn, void *cb_data);
+/*
+ * Iteratively calls fn with each reference in a symref chain.
+ * Iteration will continue until one of the following occurs:
+ * - SYMREF_MAXDEPTH is reached
+ * - A non-symbolic ref is reached (fn will be called with this before returning)
+ * - fn returns a non 0 value
+ *
+ * Will always return 0 unless fn returns a non-zero value.
+ */
+int refs_for_each_ref_in_chain(struct ref_store *refs, each_ref_fn fn,
+ void *cb_data, const char *starting_ref);
+int for_each_ref_in_chain(each_ref_fn fn, void *cb_data, const char *starting_ref);
+
/* can be used to learn about broken ref and symref */
int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data);
int for_each_rawref(each_ref_fn fn, void *cb_data);
--
2.17.1
next prev parent reply other threads:[~2019-03-04 15:50 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-04 15:45 [RFC PATCH 0/4] Add alias option to git branch Kenneth Cochran
2019-03-04 15:47 ` [RFC PATCH 1/4] " Kenneth Cochran
2019-03-04 15:48 ` Kenneth Cochran [this message]
2019-03-04 15:49 ` [RFC PATCH 3/4] " Kenneth Cochran
2019-03-04 15:49 ` [RFC PATCH 4/4] " Kenneth Cochran
2019-03-04 16:38 ` Kenneth Cochran
[not found] ` <CAJ145vUChd7+5QkmJsOK3bzZsudWfzZYp5wHZDzoq8SKSv0g0A@mail.gmail.com>
2019-03-04 19:33 ` Phil Sainty
2019-03-04 19:52 ` Kenneth Cochran
2019-03-05 13:21 ` [RFC PATCH 0/4] " Junio C Hamano
2019-03-05 17:36 ` Kenneth Cochran
2019-03-06 10:13 ` Phil Sainty
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=D9CFD250-26D4-4D1F-B0CD-01E24E8606D9@gmail.com \
--to=kenneth.cochran101@gmail.com \
--cc=git@vger.kernel.org \
--cc=pclouds@gmail.com \
--cc=peff@peff.net \
--cc=sahildua2305@gmail.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).