From: Bert Wesarg <bert.wesarg@googlemail.com>
To: szeder@ira.uka.de
Cc: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>,
"Shawn O. Pearce" <spearce@spearce.org>,
Bert Wesarg <bert.wesarg@googlemail.com>
Subject: [PATCH] for-each-ref: new 'refshort' format
Date: Fri, 29 Aug 2008 23:41:56 +0200 [thread overview]
Message-ID: <1220046116-23703-1-git-send-email-bert.wesarg@googlemail.com> (raw)
In-Reply-To: <36ca99e90808291121j7b202917r2308719970668be3@mail.gmail.com>
Here is a first sketch for this idea.
This strips from the refname the common prefix with the matched pattern.
Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
---
I think we should use a ':short' modifier to 'reflog' and '*reflog'.
builtin-for-each-ref.c | 39 +++++++++++++++++++++++++++++++++++++--
1 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/builtin-for-each-ref.c b/builtin-for-each-ref.c
index 21e92bb..b80d753 100644
--- a/builtin-for-each-ref.c
+++ b/builtin-for-each-ref.c
@@ -31,6 +31,7 @@ struct ref_sort {
struct refinfo {
char *refname;
+ const char *pattern; /* the pattern which matched this ref */
unsigned char objectname[20];
struct atom_value *value;
};
@@ -66,6 +67,7 @@ static struct {
{ "subject" },
{ "body" },
{ "contents" },
+ { "refshort" },
};
/*
@@ -546,6 +548,36 @@ static void grab_values(struct atom_value *val, int deref, struct object *obj, v
}
/*
+ * Use the matched pattern from ref to shorten the refname
+ */
+static char *get_short_ref(struct refinfo *ref)
+{
+ int rlen, plen, len = 0;
+
+ if (!ref->pattern)
+ return ref->refname;
+
+ rlen = strlen(ref->refname);
+ plen = strlen(ref->pattern);
+
+ if ((plen <= rlen) &&
+ !strncmp(ref->refname, ref->pattern, plen) &&
+ (ref->refname[plen] == '\0' ||
+ ref->refname[plen] == '/' ||
+ ref->pattern[plen - 1] == '/')) {
+ len = plen + (ref->refname[plen] == '/');
+ } else {
+ len = strcspn(ref->pattern, "*?[");
+ while (len >= 0 && ref->pattern[len] != '/')
+ --len;
+ len++;
+ }
+
+ return ref->refname + len;
+}
+
+
+/*
* Parse the object referred by ref, and grab needed value.
*/
static void populate_value(struct refinfo *ref)
@@ -577,6 +609,8 @@ static void populate_value(struct refinfo *ref)
char *s = xmalloc(len + 4);
sprintf(s, "%s^{}", ref->refname);
v->s = s;
+ } else if (!strcmp(name, "refshort")) {
+ v->s = get_short_ref(ref);
}
}
@@ -641,9 +675,9 @@ static int grab_single_ref(const char *refname, const unsigned char *sha1, int f
struct grab_ref_cbdata *cb = cb_data;
struct refinfo *ref;
int cnt;
+ const char **pattern = cb->grab_pattern;
- if (*cb->grab_pattern) {
- const char **pattern;
+ if (*pattern) {
int namelen = strlen(refname);
for (pattern = cb->grab_pattern; *pattern; pattern++) {
const char *p = *pattern;
@@ -668,6 +702,7 @@ static int grab_single_ref(const char *refname, const unsigned char *sha1, int f
*/
ref = xcalloc(1, sizeof(*ref));
ref->refname = xstrdup(refname);
+ ref->pattern = *pattern;
hashcpy(ref->objectname, sha1);
cnt = cb->grab_cnt;
--
1.6.0
next prev parent reply other threads:[~2008-08-29 21:43 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-29 10:37 [RFC/PATCH 1/2] for-each-ref: add new format 'refbasename' SZEDER Gábor
2008-08-29 10:37 ` [RFC/PATCH 2/2] bash: use for-each-ref " SZEDER Gábor
2008-08-29 14:34 ` [RFC/PATCH 1/2] for-each-ref: add new " Shawn O. Pearce
2008-08-29 16:45 ` [RFC/PATCH 1/2 v2] " SZEDER Gábor
2008-08-29 18:21 ` [RFC/PATCH 1/2] " Bert Wesarg
2008-08-29 21:41 ` Bert Wesarg [this message]
2008-08-31 4:31 ` [PATCH] for-each-ref: new 'refshort' format Junio C Hamano
2008-08-31 7:11 ` Bert Wesarg
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=1220046116-23703-1-git-send-email-bert.wesarg@googlemail.com \
--to=bert.wesarg@googlemail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=spearce@spearce.org \
--cc=szeder@ira.uka.de \
/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).