From: Karthik Nayak <karthik.188@xxxxxxxxx> Add a new atom "align" and support %(align:X) where X is a number. This will align the preceeding atom value to the left followed by spaces for a total length of X characters. If X is less than the item size, the entire atom value is printed. Helped-by: Duy Nguyen <pclouds@xxxxxxxxx> Mentored-by: Christian Couder <christian.couder@xxxxxxxxx> Mentored-by: Matthieu Moy <matthieu.moy@xxxxxxxxxxxxxxx> Signed-off-by: Karthik Nayak <karthik.188@xxxxxxxxx> --- ref-filter.c | 41 +++++++++++++++++++++++++++++++++++++++-- ref-filter.h | 1 + 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/ref-filter.c b/ref-filter.c index 7561727..93f59aa 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -10,6 +10,8 @@ #include "quote.h" #include "ref-filter.h" #include "revision.h" +#include "utf8.h" +#include "git-compat-util.h" typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME } cmp_type; @@ -53,6 +55,7 @@ static struct { { "flag" }, { "HEAD" }, { "color" }, + { "align" }, }; /* @@ -620,7 +623,7 @@ static void populate_value(struct ref_array_item *ref) const char *name = used_atom[i]; struct atom_value *v = &ref->value[i]; int deref = 0; - const char *refname; + const char *refname = NULL; const char *formatp; struct branch *branch = NULL; @@ -687,6 +690,17 @@ static void populate_value(struct ref_array_item *ref) else v->s = " "; continue; + } else if (starts_with(name, "align:")) { + const char *valp = NULL; + + skip_prefix(name, "align:", &valp); + if (!valp[0]) + die(_("no value given with 'align:'")); + strtoul_ui(valp, 10, &ref->align_value); + if (ref->align_value < 1) + die(_("value should be greater than zero: align:%u"), ref->align_value); + v->s = ""; + continue; } else continue; @@ -1254,17 +1268,40 @@ static void emit(const char *cp, const char *ep) } } +static void assign_formating(struct ref_array_item *ref, int parsed_atom, struct atom_value *v) +{ + if (ref->align_value && !starts_with(used_atom[parsed_atom], "align")) { + unsigned int len = 0; + + if (*v->s) + len = utf8_strwidth(v->s); + if (ref->align_value > len) { + struct strbuf buf = STRBUF_INIT; + if (*v->s) + strbuf_addstr(&buf, v->s); + if (*v->s && v->s[0] == '\0') + free((char *)v->s); + strbuf_addchars(&buf, ' ', ref->align_value - len); + v->s = strbuf_detach(&buf, NULL); + } + ref->align_value = 0; + } +} + void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style) { const char *cp, *sp, *ep; for (cp = format; *cp && (sp = find_next(cp)); cp = ep + 1) { struct atom_value *atomv; + int parsed_atom; ep = strchr(sp, ')'); if (cp < sp) emit(cp, sp); - get_ref_atom_value(info, parse_ref_filter_atom(sp + 2, ep), &atomv); + parsed_atom = parse_ref_filter_atom(sp + 2, ep); + get_ref_atom_value(info, parsed_atom, &atomv); + assign_formating(info, parsed_atom, atomv); print_value(atomv, quote_style); } if (*cp) { diff --git a/ref-filter.h b/ref-filter.h index 6bf27d8..12ffbc5 100644 --- a/ref-filter.h +++ b/ref-filter.h @@ -30,6 +30,7 @@ struct ref_sorting { struct ref_array_item { unsigned char objectname[20]; int flag; + unsigned int align_value; const char *symref; struct commit *commit; struct atom_value *value; -- 2.4.6 -- 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