[PATCH] for-each-ref: new 'refshort' format
- Date: Fri, 29 Aug 2008 23:41:56 +0200
- From: Bert Wesarg <bert.wesarg@xxxxxxxxxxxxxx>
- Subject: [PATCH] for-each-ref: new 'refshort' format
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@xxxxxxxxxxxxxx>
---
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
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html