From: Karthik Nayak <karthik.188@gmail.com>
To: git@vger.kernel.org
Cc: christian.couder@gmail.com, Matthieu.Moy@grenoble-inp.fr,
gitster@pobox.com, Karthik Nayak <karthik.188@gmail.com>
Subject: [PATCH v4 01/10] ref-filter: add option to align atoms to the left
Date: Sat, 25 Jul 2015 00:34:36 +0530 [thread overview]
Message-ID: <1437764685-8633-2-git-send-email-Karthik.188@gmail.com> (raw)
In-Reply-To: <1437764685-8633-1-git-send-email-Karthik.188@gmail.com>
From: Karthik Nayak <karthik.188@gmail.com>
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@gmail.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
ref-filter.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++--------------
ref-filter.h | 6 ++++
2 files changed, 77 insertions(+), 22 deletions(-)
diff --git a/ref-filter.c b/ref-filter.c
index 7561727..3c90ffc 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" },
};
/*
@@ -597,7 +600,8 @@ static inline char *copy_advance(char *dst, const char *src)
/*
* Parse the object referred by ref, and grab needed value.
*/
-static void populate_value(struct ref_array_item *ref)
+static void populate_value(struct ref_formatting_state *state,
+ struct ref_array_item *ref)
{
void *buf;
struct object *obj;
@@ -620,7 +624,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 +691,18 @@ 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:'"));
+ if (strtoul_ui(valp, 10, &state->pad_to_right))
+ die(_("positive integer expected after ':' in align:%u\n"),
+ state->pad_to_right);
+ v->pseudo_atom = 1;
+ v->s = "";
+ continue;
} else
continue;
@@ -809,10 +825,15 @@ static void populate_value(struct ref_array_item *ref)
* Given a ref, return the value for the atom. This lazily gets value
* out of the object by calling populate value.
*/
-static void get_ref_atom_value(struct ref_array_item *ref, int atom, struct atom_value **v)
+static void get_ref_atom_value(struct ref_formatting_state *state,
+ struct ref_array_item *ref, int atom, struct atom_value **v)
{
- if (!ref->value) {
- populate_value(ref);
+ /*
+ * If the atom is a pseudo_atom then we re-populate the value
+ * into the ref_formatting_state stucture.
+ */
+ if (!ref->value || ref->value[atom].pseudo_atom) {
+ populate_value(state, ref);
fill_missing_values(ref->value);
}
*v = &ref->value[atom];
@@ -1150,9 +1171,12 @@ static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, stru
struct atom_value *va, *vb;
int cmp;
cmp_type cmp_type = used_atom_type[s->atom];
+ struct ref_formatting_state state;
- get_ref_atom_value(a, s->atom, &va);
- get_ref_atom_value(b, s->atom, &vb);
+ memset(&state, 0, sizeof(state));
+
+ get_ref_atom_value(&state, a, s->atom, &va);
+ get_ref_atom_value(&state, b, s->atom, &vb);
switch (cmp_type) {
case FIELD_STR:
cmp = strcmp(va->s, vb->s);
@@ -1190,30 +1214,50 @@ void ref_array_sort(struct ref_sorting *sorting, struct ref_array *array)
qsort(array->items, array->nr, sizeof(struct ref_array_item *), compare_refs);
}
-static void print_value(struct atom_value *v, int quote_style)
+static void ref_formatting(struct ref_formatting_state *state, struct atom_value *v,
+ struct strbuf *value)
{
- struct strbuf sb = STRBUF_INIT;
- switch (quote_style) {
+ if (state->pad_to_right) {
+ if (!is_utf8(v->s))
+ strbuf_addf(value, "%-*s", state->pad_to_right, v->s);
+ else {
+ int len = strlen(v->s) - utf8_strwidth(v->s);
+ strbuf_addf(value, "%-*s", state->pad_to_right + len, v->s);
+ }
+ } else
+ strbuf_addf(value, "%s", v->s);
+}
+
+static void print_value(struct ref_formatting_state *state, struct atom_value *v)
+{
+ struct strbuf value = STRBUF_INIT;
+ struct strbuf formatted = STRBUF_INIT;
+
+ if (v->pseudo_atom)
+ return;
+ ref_formatting(state, v, &value);
+
+ switch (state->quote_style) {
case QUOTE_NONE:
- fputs(v->s, stdout);
+ fputs(value.buf, stdout);
break;
case QUOTE_SHELL:
- sq_quote_buf(&sb, v->s);
+ sq_quote_buf(&formatted, value.buf);
break;
case QUOTE_PERL:
- perl_quote_buf(&sb, v->s);
+ perl_quote_buf(&formatted, value.buf);
break;
case QUOTE_PYTHON:
- python_quote_buf(&sb, v->s);
+ python_quote_buf(&formatted, value.buf);
break;
case QUOTE_TCL:
- tcl_quote_buf(&sb, v->s);
+ tcl_quote_buf(&formatted, value.buf);
break;
}
- if (quote_style != QUOTE_NONE) {
- fputs(sb.buf, stdout);
- strbuf_release(&sb);
- }
+ if (state->quote_style != QUOTE_NONE)
+ fputs(formatted.buf, stdout);
+ strbuf_release(&formatted);
+ strbuf_release(&value);
}
static int hex1(char ch)
@@ -1257,6 +1301,10 @@ static void emit(const char *cp, const char *ep)
void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style)
{
const char *cp, *sp, *ep;
+ struct ref_formatting_state state;
+
+ memset(&state, 0, sizeof(state));
+ state.quote_style = quote_style;
for (cp = format; *cp && (sp = find_next(cp)); cp = ep + 1) {
struct atom_value *atomv;
@@ -1264,8 +1312,9 @@ void show_ref_array_item(struct ref_array_item *info, const char *format, int qu
ep = strchr(sp, ')');
if (cp < sp)
emit(cp, sp);
- get_ref_atom_value(info, parse_ref_filter_atom(sp + 2, ep), &atomv);
- print_value(atomv, quote_style);
+ get_ref_atom_value(&state, info,
+ parse_ref_filter_atom(sp + 2, ep), &atomv);
+ print_value(&state, atomv);
}
if (*cp) {
sp = cp + strlen(cp);
@@ -1278,7 +1327,7 @@ void show_ref_array_item(struct ref_array_item *info, const char *format, int qu
if (color_parse("reset", color) < 0)
die("BUG: couldn't parse 'reset' as a color");
resetv.s = color;
- print_value(&resetv, quote_style);
+ print_value(&state, &resetv);
}
putchar('\n');
}
diff --git a/ref-filter.h b/ref-filter.h
index 6bf27d8..ea2d0e6 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -19,6 +19,7 @@
struct atom_value {
const char *s;
unsigned long ul; /* used for sorting when not FIELD_STR */
+ unsigned int pseudo_atom : 1; /* atoms which aren't placeholders for ref attributes */
};
struct ref_sorting {
@@ -27,6 +28,11 @@ struct ref_sorting {
unsigned reverse : 1;
};
+struct ref_formatting_state {
+ unsigned int pad_to_right; /*pad atoms to the right*/
+ int quote_style;
+};
+
struct ref_array_item {
unsigned char objectname[20];
int flag;
--
2.4.6
next prev parent reply other threads:[~2015-07-24 19:05 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-24 19:04 [PATCH v4 0/10] port tag.c to use ref-filter APIs Karthik Nayak
2015-07-24 19:04 ` Karthik Nayak [this message]
2015-07-24 21:54 ` [PATCH v4 01/10] ref-filter: add option to align atoms to the left Junio C Hamano
2015-07-24 23:00 ` Junio C Hamano
2015-07-25 4:14 ` Karthik Nayak
2015-07-26 4:08 ` Eric Sunshine
2015-07-26 4:36 ` Karthik Nayak
2015-07-26 5:58 ` Eric Sunshine
2015-07-26 6:03 ` Karthik Nayak
2015-07-27 12:01 ` Matthieu Moy
2015-07-27 0:39 ` Duy Nguyen
2015-07-27 7:39 ` Jacob Keller
2015-07-27 10:18 ` Duy Nguyen
2015-07-28 10:35 ` Duy Nguyen
2015-07-24 19:04 ` [PATCH v4 02/10] ref-filter: make the 'color' use ref_formatting_state Karthik Nayak
2015-07-24 21:46 ` Junio C Hamano
2015-07-25 4:15 ` Karthik Nayak
2015-07-26 4:28 ` Eric Sunshine
2015-07-26 4:12 ` Eric Sunshine
2015-07-26 5:40 ` Karthik Nayak
2015-07-24 19:04 ` [PATCH v4 03/10] ref-filter: add option to filter only tags Karthik Nayak
2015-07-24 19:04 ` [PATCH v4 04/10] ref-filter: support printing N lines from tag annotation Karthik Nayak
2015-07-26 4:46 ` Eric Sunshine
2015-07-26 5:15 ` Karthik Nayak
2015-07-24 19:04 ` [PATCH v4 05/10] ref-filter: add support to sort by version Karthik Nayak
2015-07-25 22:40 ` Junio C Hamano
2015-07-26 5:07 ` Karthik Nayak
2015-07-27 15:24 ` Junio C Hamano
2015-07-27 17:03 ` Karthik Nayak
2015-07-24 19:04 ` [PATCH v4 06/10] ref-filter: add option to match literal pattern Karthik Nayak
2015-07-26 5:15 ` Eric Sunshine
2015-07-26 18:21 ` Karthik Nayak
2015-07-24 19:04 ` [PATCH v4 07/10] tag.c: use 'ref-filter' data structures Karthik Nayak
2015-07-24 19:19 ` [PATCH v4 08/10] tag.c: use 'ref-filter' APIs Karthik Nayak
2015-07-24 19:19 ` [PATCH v4 09/10] tag.c: implement '--format' option Karthik Nayak
2015-07-24 19:19 ` [PATCH v4 10/10] tag.c: implement '--merged' and '--no-merged' options Karthik Nayak
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1437764685-8633-2-git-send-email-Karthik.188@gmail.com \
--to=karthik.188@gmail.com \
--cc=Matthieu.Moy@grenoble-inp.fr \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).