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