git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 01/10] ref-filter: add %(refname:shortalign=X) option

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 10, 2015, 16:20 UTC
Message-ID
<xmqqk2u8kmre.fsf@gitster.dls.corp.google.com>
In-Reply-To
<1436437671-25600-1-git-send-email-karthik.188@gmail.com>
Karthik Nayak <karthik.188@gmail.com> writes:
Show 12 quoted lines
> Add support for %(refname:shortalign=X) where X is a number.
> This will print a shortened refname aligned to the left
> followed by spaces for a total length of X characters.
> If X is less than the shortened refname size, the entire
> shortened refname is printed.
>
> 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 | 19 ++++++++++++++++++-
>  1 file changed, 18 insertions(+), 1 deletion(-)

This may be enough to support the various existing formats that are offered by "git branch" and/or "git tag", but I do not think if this is the right approach in the longer term, or if we are painting ourselves in a corner we cannot cleanly get out of later [*1*]. Will the "refname" stay to be the only thing that may want alignment padding appended in the future? Will it stay true that we want to align only to the left? Etc., etc.

Cc'ed Duy as %< in the pretty-format was his invention at around a5752342 (pretty: support padding placeholders, %< %> and %><, 2013-04-19).

Show 18 quoted lines
> diff --git a/ref-filter.c b/ref-filter.c
> index dd0709d..3098497 100644
> --- a/ref-filter.c
> +++ b/ref-filter.c
> @@ -10,6 +10,7 @@
>  #include "quote.h"
>  #include "ref-filter.h"
>  #include "revision.h"
> +#include "utf8.h"
>  
>  typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME } cmp_type;
>  
> @@ -695,7 +696,23 @@ static void populate_value(struct ref_array_item *ref)
>  			int num_ours, num_theirs;
>  
>  			formatp++;
> -			if (!strcmp(formatp, "short"))
> +			if (starts_with(formatp, "shortalign=")) {

When adding a new thing to an existing list, we prefer to append it at the end of the list, if there is no other reason not to do so (e.g. "the existing list is sorted in this order, and the new location was chosen to fit the new item to honor the existing ordering rule" is a valid reason to put it at the beginning, if the existing sorting rule dictates that the new thing must come at the beginning).

Show 5 quoted lines
> +				const char *valp, *short_refname = NULL;
> +				int val, len;
> +
> +				skip_prefix(formatp, "shortalign=", &valp);
> +				val = atoi(valp);

In newer code, we would want to avoid atoi() so that "foo:shortalign=1z" that is a typo of "12" can be caught as an error. Either strtol_i() or strtoul_ui() may be better (we would need to adjust it further when Michael decides to resurrect his numparse thing that has been in the stalled bin for quite a while, though).

Show 10 quoted lines
> +				refname = short_refname = shorten_unambiguous_ref(refname,
> +										  warn_ambiguous_refs);
> +				len = utf8_strwidth(refname);
> +				if (val > len) {
> +					struct strbuf buf = STRBUF_INIT;
> +					strbuf_addstr(&buf, refname);
> +					strbuf_addchars(&buf, ' ', val - len);
> +					free((char *)short_refname);
> +					refname = strbuf_detach(&buf, NULL);
> +				}

What should happen when the display column width of the string is wider? If a user wants to align the refs that are usually usually short start the next thing at the 8th column, which should she use?

    "%(refname:shorta=7) %(next item)"
    "%(refname:shorta=8)%(next item)"
> +			} else if (!strcmp(formatp, "short"))
>  				refname = shorten_unambiguous_ref(refname,
>  						      warn_ambiguous_refs);
>  			else if (!strcmp(formatp, "track") &&
Previous: Matthieu MoyNext: Karthik Nayak
Message 42 of 48 in “Port tag.c to use ref-filter APIs”
  1. 00/10 Port tag.c to use ref-filter APIsKarthik Nayak, Jul 9, 2015
  2. 01/10 ref-filter: add %(refname:shortalign=X) optionKarthik Nayak, Jul 9, 2015
  3. 02/10 ref-filter: add option to filter only tagsKarthik Nayak, Jul 9, 2015
  4. 03/10 ref-filter: support printing N lines from tag annotationKarthik Nayak, Jul 9, 2015
  5. Matthieu MoyJul 9, 2015
  6. Karthik NayakJul 10, 2015
  7. 04/10 ref-filter: add support to sort by versionKarthik Nayak, Jul 9, 2015
  8. Matthieu MoyJul 9, 2015
  9. Karthik NayakJul 10, 2015
  10. Karthik NayakJul 10, 2015
  11. Matthieu MoyJul 10, 2015
  12. Karthik NayakJul 11, 2015
  13. 05/10 ref-filter: add option to match literal patternKarthik Nayak, Jul 9, 2015
  14. Matthieu MoyJul 9, 2015
  15. Karthik NayakJul 10, 2015
  16. Junio C HamanoJul 10, 2015
  17. Karthik NayakJul 11, 2015
  18. Matthieu MoyJul 11, 2015
  19. Karthik NayakJul 11, 2015
  20. 06/10 Documentation/tag: remove double occurance of "<pattern>"Karthik Nayak, Jul 9, 2015
  21. Christian CouderJul 9, 2015
  22. Karthik NayakJul 9, 2015
  23. Junio C HamanoJul 10, 2015
  24. Karthik NayakJul 12, 2015
  25. 07/10 tag.c: use 'ref-filter' data structuresKarthik Nayak, Jul 9, 2015
  26. 08/10 tag.c: use 'ref-filter' APIsKarthik Nayak, Jul 9, 2015
  27. Matthieu MoyJul 9, 2015
  28. Karthik NayakJul 9, 2015
  29. Matthieu MoyJul 9, 2015
  30. Karthik NayakJul 10, 2015
  31. Matthieu MoyJul 9, 2015
  32. 08/10 tag.c: use 'ref-filter' APIsKarthik Nayak, Jul 9, 2015
  33. Duy NguyenJul 12, 2015
  34. Karthik NayakJul 12, 2015
  35. Duy NguyenJul 13, 2015
  36. Karthik NayakJul 13, 2015
  37. 09/10 tag.c: implement '--format' optionKarthik Nayak, Jul 9, 2015
  38. 10/10 tag.c: implement '--merged' and '--no-merged' optionsKarthik Nayak, Jul 9, 2015
  39. Matthieu MoyJul 9, 2015
  40. Karthik NayakJul 11, 2015
  41. Matthieu MoyJul 11, 2015
  42. Junio C HamanoJul 10, 2015
  43. Karthik NayakJul 11, 2015
  44. Duy NguyenJul 12, 2015
  45. Duy NguyenJul 12, 2015
  46. Karthik NayakJul 12, 2015
  47. Duy NguyenJul 13, 2015
  48. Karthik NayakJul 13, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.