diff --git a/ref-filter.c b/ref-filter.c
index 7561727..b81a08d 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"));
+ v->s = "";
+ continue;
} else
continue;
@@ -1254,17 +1268,38 @@ 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 (v->s[0] && ref->align_value) {
+ unsigned int len = 0;
+
+ len = utf8_strwidth(v->s);
+ if (ref->align_value > len) {
+ struct strbuf buf = STRBUF_INIT;
+ strbuf_addstr(&buf, v->s);
+ if (!v->s[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