All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Sunshine <sunshine@sunshineco.com>
To: Karthik Nayak <karthik.188@gmail.com>
Cc: git@vger.kernel.org, gitster@pobox.com
Subject: Re: [PATCH v4 10/12] ref-filter: introduce remote_ref_atom_parser()
Date: Mon, 1 Feb 2016 19:59:02 -0500	[thread overview]
Message-ID: <20160202005902.GA1132@flurp.local> (raw)
In-Reply-To: <1454262176-6594-11-git-send-email-Karthik.188@gmail.com>

This is a re-send of patch 10/12 on Karthik's behalf to give other
reviewers a chance at it. The original did not make it to the mailing
list since it contained a rather large binary resource Karthik
accidentally included in the commit (which has been stripped from
this re-send).

On Sun, Jan 31, 2016 at 11:12:54PM +0530, Karthik Nayak wrote:
> Introduce remote_ref_atom_parser() which will parse the '%(upstream)'
> and '%(push)' atoms and store information into the 'used_atom'
> structure based on the modifiers used along with the corresponding
> atom.
> 
> Helped-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
> Helped-by: Eric Sunshine <sunshine@sunshineco.com>
> Signed-off-by: Karthik Nayak <Karthik.188@gmail.com>
> ---
>  ref-filter.c  | 103 ++++++++++++++++++++++++++++++++++------------------------
>  test-fake-ssh | Bin 0 -> 4668264 bytes
>  2 files changed, 61 insertions(+), 42 deletions(-)
>  create mode 100755 test-fake-ssh
> 
> diff --git a/ref-filter.c b/ref-filter.c
> index 58d433f..99c152d 100644
> --- a/ref-filter.c
> +++ b/ref-filter.c
> @@ -37,6 +37,8 @@ static struct used_atom {
>  	union {
>  		char color[COLOR_MAXLEN];
>  		struct align align;
> +		enum { RR_NORMAL, RR_SHORTEN, RR_TRACK, RR_TRACKSHORT }
> +			remote_ref;
>  	} u;
>  } *used_atom;
>  static int used_atom_cnt, need_tagged, need_symref;
> @@ -50,6 +52,20 @@ static void color_atom_parser(struct used_atom *atom, const char *color_value)
>  		die(_("invalid color value: %s"), atom->u.color);
>  }
>  
> +static void remote_ref_atom_parser(struct used_atom *atom, const char *arg)
> +{
> +	if (!arg) {
> +		atom->u.remote_ref = RR_NORMAL;
> +	} else if (!strcmp(arg, "short"))
> +		atom->u.remote_ref = RR_SHORTEN;
> +	else if (!strcmp(arg, "track"))
> +		atom->u.remote_ref = RR_TRACK;
> +	else if (!strcmp(arg, "trackshort"))
> +		atom->u.remote_ref = RR_TRACKSHORT;
> +	else
> +		die(_("unrecognized format: %%(%s)"), atom->name);
> +}
> +
>  static align_type parse_align_position(const char *s)
>  {
>  	if (!strcmp(s, "right"))
> @@ -132,8 +148,8 @@ static struct {
>  	{ "subject" },
>  	{ "body" },
>  	{ "contents" },
> -	{ "upstream" },
> -	{ "push" },
> +	{ "upstream", FIELD_STR, remote_ref_atom_parser },
> +	{ "push", FIELD_STR, remote_ref_atom_parser },
>  	{ "symref" },
>  	{ "flag" },
>  	{ "HEAD" },
> @@ -839,6 +855,43 @@ static const char *strip_ref_components(const char *refname, const char *nr_arg)
>  	return start;
>  }
>  
> +static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
> +				    struct branch *branch, const char **s)
> +{
> +	int num_ours, num_theirs;
> +	if (atom->u.remote_ref == RR_SHORTEN)
> +		*s = shorten_unambiguous_ref(refname, warn_ambiguous_refs);
> +	else if (atom->u.remote_ref == RR_TRACK) {
> +		if (stat_tracking_info(branch, &num_ours,
> +				       &num_theirs, NULL))
> +			return;
> +
> +		if (!num_ours && !num_theirs)
> +			*s = "";
> +		else if (!num_ours)
> +			*s = xstrfmt("[behind %d]", num_theirs);
> +		else if (!num_theirs)
> +			*s = xstrfmt("[ahead %d]", num_ours);
> +		else
> +			*s = xstrfmt("[ahead %d, behind %d]",
> +				     num_ours, num_theirs);
> +	} else if (atom->u.remote_ref == RR_TRACKSHORT) {
> +		if (stat_tracking_info(branch, &num_ours,
> +				       &num_theirs, NULL))
> +			return;
> +
> +		if (!num_ours && !num_theirs)
> +			*s = "=";
> +		else if (!num_ours)
> +			*s = "<";
> +		else if (!num_theirs)
> +			*s = ">";
> +		else
> +			*s = "<>";
> +	} else /* RR_NORMAL */
> +		*s = refname;
> +}
> +
>  /*
>   * Parse the object referred by ref, and grab needed value.
>   */
> @@ -890,8 +943,9 @@ static void populate_value(struct ref_array_item *ref)
>  			branch = branch_get(branch_name);
>  
>  			refname = branch_get_upstream(branch, NULL);
> -			if (!refname)
> -				continue;
> +			if (refname)
> +				fill_remote_ref_details(atom, refname, branch, &v->s);
> +			continue;
>  		} else if (starts_with(name, "push")) {
>  			const char *branch_name;
>  			if (!skip_prefix(ref->refname, "refs/heads/",
> @@ -902,6 +956,8 @@ static void populate_value(struct ref_array_item *ref)
>  			refname = branch_get_push(branch, NULL);
>  			if (!refname)
>  				continue;
> +			fill_remote_ref_details(atom, refname, branch, &v->s);
> +			continue;
>  		} else if (starts_with(name, "color:")) {
>  			v->s = atom->u.color;
>  			continue;
> @@ -943,7 +999,6 @@ static void populate_value(struct ref_array_item *ref)
>  
>  		formatp = strchr(name, ':');
>  		if (formatp) {
> -			int num_ours, num_theirs;
>  			const char *arg;
>  
>  			formatp++;
> @@ -952,43 +1007,7 @@ static void populate_value(struct ref_array_item *ref)
>  						      warn_ambiguous_refs);
>  			else if (skip_prefix(formatp, "strip=", &arg))
>  				refname = strip_ref_components(refname, arg);
> -			else if (!strcmp(formatp, "track") &&
> -				 (starts_with(name, "upstream") ||
> -				  starts_with(name, "push"))) {
> -
> -				if (stat_tracking_info(branch, &num_ours,
> -						       &num_theirs, NULL))
> -					continue;
> -
> -				if (!num_ours && !num_theirs)
> -					v->s = "";
> -				else if (!num_ours)
> -					v->s = xstrfmt("[behind %d]", num_theirs);
> -				else if (!num_theirs)
> -					v->s = xstrfmt("[ahead %d]", num_ours);
> -				else
> -					v->s = xstrfmt("[ahead %d, behind %d]",
> -						       num_ours, num_theirs);
> -				continue;
> -			} else if (!strcmp(formatp, "trackshort") &&
> -				   (starts_with(name, "upstream") ||
> -				    starts_with(name, "push"))) {
> -				assert(branch);
> -
> -				if (stat_tracking_info(branch, &num_ours,
> -							&num_theirs, NULL))
> -					continue;
> -
> -				if (!num_ours && !num_theirs)
> -					v->s = "=";
> -				else if (!num_ours)
> -					v->s = "<";
> -				else if (!num_theirs)
> -					v->s = ">";
> -				else
> -					v->s = "<>";
> -				continue;
> -			} else
> +			else
>  				die("unknown %.*s format %s",
>  				    (int)(formatp - name), name, formatp);
>  		}

  parent reply	other threads:[~2016-02-02  0:59 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-31 17:42 [PATCH v4 00/12] ref-filter: use parsing functions Karthik Nayak
2016-01-31 17:42 ` [PATCH v4 01/12] strbuf: introduce strbuf_split_str_omit_term() Karthik Nayak
2016-01-31 17:42 ` [PATCH v4 02/12] ref-filter: use strbuf_split_str_omit_term() Karthik Nayak
2016-01-31 17:42 ` [PATCH v4 03/12] ref-filter: bump 'used_atom' and related code to the top Karthik Nayak
2016-02-01 22:22   ` Junio C Hamano
2016-02-02 18:50     ` Karthik Nayak
2016-02-02 18:56     ` Karthik Nayak
2016-01-31 17:42 ` [PATCH v4 04/12] ref-filter: introduce struct used_atom Karthik Nayak
2016-01-31 17:42 ` [PATCH v4 05/12] ref-filter: introduce parsing functions for each valid atom Karthik Nayak
2016-02-03 22:19   ` Eric Sunshine
2016-02-04  1:17     ` Junio C Hamano
2016-02-06 14:36     ` Karthik Nayak
2016-02-07  7:03       ` Eric Sunshine
2016-02-07  9:03         ` Karthik Nayak
2016-02-06 15:15   ` Karthik Nayak
2016-02-07  6:33     ` Eric Sunshine
2016-02-07  9:01       ` Karthik Nayak
2016-02-07  9:12         ` Eric Sunshine
2016-02-07 13:47         ` Andreas Schwab
2016-02-09 17:00           ` Karthik Nayak
2016-01-31 17:42 ` [PATCH v4 06/12] ref-filter: introduce color_atom_parser() Karthik Nayak
2016-02-04 22:25   ` Eric Sunshine
2016-02-06 15:20     ` Karthik Nayak
2016-02-06 15:51       ` Christian Couder
2016-02-07  7:53         ` Eric Sunshine
2016-02-07  7:43       ` Eric Sunshine
2016-02-07  9:04         ` Karthik Nayak
2016-01-31 17:42 ` [PATCH v4 07/12] ref-filter: introduce parse_align_position() Karthik Nayak
2016-01-31 17:42 ` [PATCH v4 08/12] ref-filter: introduce align_atom_parser() Karthik Nayak
2016-02-04 23:48   ` Eric Sunshine
2016-02-06 15:26     ` Karthik Nayak
2016-01-31 17:42 ` [PATCH v4 09/12] ref-filter: align: introduce long-form syntax Karthik Nayak
2016-02-05  0:00   ` Eric Sunshine
2016-02-06 18:37     ` Karthik Nayak
2016-01-31 17:42 ` [PATCH v4 11/12] ref-filter: introduce contents_atom_parser() Karthik Nayak
2016-02-05  0:22   ` Eric Sunshine
2016-02-07  4:58     ` Karthik Nayak
2016-01-31 17:42 ` [PATCH v4 12/12] ref-filter: introduce objectname_atom_parser() Karthik Nayak
2016-02-01 22:25 ` [PATCH v4 00/12] ref-filter: use parsing functions Junio C Hamano
2016-02-02  0:37   ` Eric Sunshine
2016-02-02  4:35     ` Karthik Nayak
2016-02-05  0:34   ` Eric Sunshine
     [not found] ` <1454262176-6594-11-git-send-email-Karthik.188@gmail.com>
2016-02-02  0:59   ` Eric Sunshine [this message]
2016-02-02  2:59     ` [PATCH v4 10/12] ref-filter: introduce remote_ref_atom_parser() Karthik Nayak
2016-02-05  0:05   ` Eric Sunshine
2016-02-06 18:44     ` 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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160202005902.GA1132@flurp.local \
    --to=sunshine@sunshineco.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=karthik.188@gmail.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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.