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

Re: [PATCH 11/12] pretty: support truncating in %>, %< and %><

From
Paul Campbell <pcampbell@kemitix.net>
Date
Mar 16, 2013, 09:04 UTC
Message-ID
<CALeLG_=eWXzi0aUje7J2BCx-_f58Jgn_YWxvRhuVZBk3GvFD-A@mail.gmail.com>
In-Reply-To
<1363400683-14813-12-git-send-email-pclouds@gmail.com>
On Sat, Mar 16, 2013 at 2:24 AM, Nguyễn Thái Ngọc Duy <pclouds@gmail.com> wrote:
Show 6 quoted lines
> %>(N,trunc) truncates the righ part after N columns and replace the
> last two letters with "..". ltrunc does the same on the left. mtrunc
> cuts the middle out.
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> ---
s/righ/right/
Show 191 quoted lines
>  Documentation/pretty-formats.txt |  6 +++--
>  pretty.c                         | 51 +++++++++++++++++++++++++++++++++++++---
>  utf8.c                           | 46 ++++++++++++++++++++++++++++++++++++
>  utf8.h                           |  2 ++
>  4 files changed, 100 insertions(+), 5 deletions(-)
>
> diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
> index 87ca2c4..17f82f4 100644
> --- a/Documentation/pretty-formats.txt
> +++ b/Documentation/pretty-formats.txt
> @@ -162,8 +162,10 @@ The placeholders are:
>  - '%x00': print a byte from a hex code
>  - '%w([<w>[,<i1>[,<i2>]]])': switch line wrapping, like the -w option of
>    linkgit:git-shortlog[1].
> -- '%<(<N>)': make the next placeholder take at least N columns,
> -  padding spaces on the right if necessary
> +- '%<(<N>[,trunc|ltrunc|mtrunc])': make the next placeholder take at
> +  least N columns, padding spaces on the right if necessary.
> +  Optionally truncate at the beginning (ltrunc), the middle (mtrunc)
> +  or the end (trunc) if the output is longer than N columns.
>  - '%<|(<N>)': make the next placeholder take at least until Nth
>    columns, padding spaces on the right if necessary
>  - '%>(<N>)', '%>|(<N>)': similar to '%<(<N<)', '%<|(<N<)'
> diff --git a/pretty.c b/pretty.c
> index 233d69c..29384b5 100644
> --- a/pretty.c
> +++ b/pretty.c
> @@ -767,6 +767,13 @@ enum flush_type {
>         flush_both
>  };
>
> +enum trunc_type {
> +       trunc_none,
> +       trunc_left,
> +       trunc_middle,
> +       trunc_right
> +};
> +
>  struct format_commit_context {
>         const struct commit *commit;
>         const struct pretty_print_context *pretty_ctx;
> @@ -774,6 +781,7 @@ struct format_commit_context {
>         unsigned commit_message_parsed:1;
>         unsigned commit_signature_parsed:1;
>         enum flush_type flush_type;
> +       enum trunc_type truncate;
>         struct {
>                 char *gpg_output;
>                 char good_bad;
> @@ -1044,7 +1052,7 @@ static size_t parse_padding_placeholder(struct strbuf *sb,
>
>         if (*ch == '(') {
>                 const char *start = ch + 1;
> -               const char *end = strchr(start, ')');
> +               const char *end = start + strcspn(start, ",)");
>                 char *next;
>                 int width;
>                 if (!end || end == start)
> @@ -1054,6 +1062,23 @@ static size_t parse_padding_placeholder(struct strbuf *sb,
>                         return 0;
>                 c->padding = to_column ? -width : width;
>                 c->flush_type = flush_type;
> +
> +               if (*end == ',') {
> +                       start = end + 1;
> +                       end = strchr(start, ')');
> +                       if (!end || end == start)
> +                               return 0;
> +                       if (!prefixcmp(start, "trunc)"))
> +                               c->truncate = trunc_right;
> +                       else if (!prefixcmp(start, "ltrunc)"))
> +                               c->truncate = trunc_left;
> +                       else if (!prefixcmp(start, "mtrunc)"))
> +                               c->truncate = trunc_middle;
> +                       else
> +                               return 0;
> +               } else
> +                       c->truncate = trunc_none;
> +
>                 return end - placeholder + 1;
>         }
>         return 0;
> @@ -1335,9 +1360,29 @@ static size_t format_and_pad_commit(struct strbuf *sb, /* in UTF-8 */
>                 total_consumed++;
>         }
>         len = utf8_strnwidth(local_sb.buf, -1, 1);
> -       if (len > padding)
> +       if (len > padding) {
> +               switch (c->truncate) {
> +               case trunc_left:
> +                       strbuf_utf8_replace(&local_sb,
> +                                           0, len - (padding - 2),
> +                                           "..");
> +                       break;
> +               case trunc_middle:
> +                       strbuf_utf8_replace(&local_sb,
> +                                           padding / 2 - 1,
> +                                           len - (padding - 2),
> +                                           "..");
> +                       break;
> +               case trunc_right:
> +                       strbuf_utf8_replace(&local_sb,
> +                                           padding - 2, len - (padding - 2),
> +                                           "..");
> +                       break;
> +               case trunc_none:
> +                       break;
> +               }
>                 strbuf_addstr(sb, local_sb.buf);
> -       else {
> +       } else {
>                 int sb_len = sb->len, offset = 0;
>                 if (c->flush_type == flush_left)
>                         offset = padding - len;
> diff --git a/utf8.c b/utf8.c
> index 9d98043..766df80 100644
> --- a/utf8.c
> +++ b/utf8.c
> @@ -421,6 +421,52 @@ void strbuf_add_wrapped_bytes(struct strbuf *buf, const char *data, int len,
>         free(tmp);
>  }
>
> +void strbuf_utf8_replace(struct strbuf *sb_src, int pos, int width,
> +                        const char *subst)
> +{
> +       struct strbuf sb_dst = STRBUF_INIT;
> +       char *src = sb_src->buf;
> +       char *end = src + sb_src->len;
> +       char *dst;
> +       int w = 0, subst_len = 0;
> +
> +       if (subst)
> +               subst_len = strlen(subst);
> +       strbuf_grow(&sb_dst, sb_src->len + subst_len);
> +       dst = sb_dst.buf;
> +
> +       while (src < end) {
> +               char *old;
> +               size_t n;
> +
> +               while ((n = display_mode_esc_sequence_len(src))) {
> +                       memcpy(dst, src, n);
> +                       src += n;
> +                       dst += n;
> +               }
> +
> +               old = src;
> +               n = utf8_width((const char**)&src, NULL);
> +               if (!src)       /* broken utf-8, do nothing */
> +                       return;
> +               if (n && w >= pos && w < pos + width) {
> +                       if (subst) {
> +                               memcpy(dst, subst, subst_len);
> +                               dst += subst_len;
> +                               subst = NULL;
> +                       }
> +                       w += n;
> +                       continue;
> +               }
> +               memcpy(dst, old, src - old);
> +               dst += src - old;
> +               w += n;
> +       }
> +       strbuf_setlen(&sb_dst, dst - sb_dst.buf);
> +       strbuf_attach(sb_src, strbuf_detach(&sb_dst, NULL),
> +                     sb_dst.len, sb_dst.alloc);
> +}
> +
>  int is_encoding_utf8(const char *name)
>  {
>         if (!name)
> diff --git a/utf8.h b/utf8.h
> index 99db3e0..faf2f91 100644
> --- a/utf8.h
> +++ b/utf8.h
> @@ -15,6 +15,8 @@ void strbuf_add_wrapped_text(struct strbuf *buf,
>                 const char *text, int indent, int indent2, int width);
>  void strbuf_add_wrapped_bytes(struct strbuf *buf, const char *data, int len,
>                              int indent, int indent2, int width);
> +void strbuf_utf8_replace(struct strbuf *sb, int pos, int width,
> +                        const char *subst);
>
>  #ifndef NO_ICONV
>  char *reencode_string_iconv(const char *in, size_t insz,
> --
> 1.8.2.83.gc99314b
>
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
-- 
Paul [W] Campbell
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 16 of 83 in “Layout control placeholders for pretty format”
  1. 00/12 Layout control placeholders for pretty formatNguyễn Thái Ngọc Duy, Mar 16, 2013
  2. 01/12 pretty-formats.txt: wrap long linesNguyễn Thái Ngọc Duy, Mar 16, 2013
  3. 02/12 pretty: share code between format_decoration and show_decorationsNguyễn Thái Ngọc Duy, Mar 16, 2013
  4. 03/12 utf8.c: move display_mode_esc_sequence_len() for use by other functionsNguyễn Thái Ngọc Duy, Mar 16, 2013
  5. 04/12 utf8.c: add utf8_strnwidth() with the ability to skip ansi sequencesNguyễn Thái Ngọc Duy, Mar 16, 2013
  6. 05/12 pretty: save commit encoding from logmsg_reencode if the caller needs itNguyễn Thái Ngọc Duy, Mar 16, 2013
  7. Eric SunshineMar 17, 2013
  8. 06/12 pretty: get the correct encoding for --pretty:format=%eNguyễn Thái Ngọc Duy, Mar 16, 2013
  9. 07/12 utf8: keep NULs in reencode_string()Nguyễn Thái Ngọc Duy, Mar 16, 2013
  10. 08/12 pretty: two phase conversion for non utf-8 commitsNguyễn Thái Ngọc Duy, Mar 16, 2013
  11. 09/12 pretty: add %C(auto) for auto-coloring on the next placeholderNguyễn Thái Ngọc Duy, Mar 16, 2013
  12. Eric SunshineMar 17, 2013
  13. 10/12 pretty: support padding placeholders, %< %> and %><Nguyễn Thái Ngọc Duy, Mar 16, 2013
  14. Eric SunshineMar 17, 2013
  15. 11/12 pretty: support truncating in %>, %< and %><Nguyễn Thái Ngọc Duy, Mar 16, 2013
  16. Paul CampbellMar 16, 2013
  17. 12/12 pretty: support %>> that steal trailing spacesNguyễn Thái Ngọc Duy, Mar 16, 2013
  18. Eric SunshineMar 17, 2013
  19. Duy NguyenMar 30, 2013
  20. 00/12 Layout control placeholders for pretty formatNguyễn Thái Ngọc Duy, Mar 30, 2013
  21. 01/12 pretty-formats.txt: wrap long linesNguyễn Thái Ngọc Duy, Mar 30, 2013
  22. 02/12 pretty: share code between format_decoration and show_decorationsNguyễn Thái Ngọc Duy, Mar 30, 2013
  23. Junio C HamanoApr 1, 2013
  24. Jakub NarębskiApr 5, 2013
  25. Duy NguyenApr 12, 2013
  26. Duy NguyenApr 12, 2013
  27. 03/12 utf8.c: move display_mode_esc_sequence_len() for use by other functionsNguyễn Thái Ngọc Duy, Mar 30, 2013
  28. 04/12 utf8.c: add utf8_strnwidth() with the ability to skip ansi sequencesNguyễn Thái Ngọc Duy, Mar 30, 2013
  29. Junio C HamanoApr 1, 2013
  30. 05/12 pretty: save commit encoding from logmsg_reencode if the caller needs itNguyễn Thái Ngọc Duy, Mar 30, 2013
  31. Junio C HamanoApr 1, 2013
  32. 06/12 pretty: get the correct encoding for --pretty:format=%eNguyễn Thái Ngọc Duy, Mar 30, 2013
  33. 07/12 utf8: keep NULs in reencode_string()Nguyễn Thái Ngọc Duy, Mar 30, 2013
  34. Torsten BögershausenMar 30, 2013
  35. Duy NguyenMar 31, 2013
  36. 08/12 pretty: two phase conversion for non utf-8 commitsNguyễn Thái Ngọc Duy, Mar 30, 2013
  37. 09/12 pretty: add %C(auto) for auto-coloring on the next placeholderNguyễn Thái Ngọc Duy, Mar 30, 2013
  38. Junio C HamanoApr 1, 2013
  39. Duy NguyenApr 5, 2013
  40. Junio C HamanoApr 5, 2013
  41. Duy NguyenApr 15, 2013
  42. 10/12 pretty: support padding placeholders, %< %> and %><Nguyễn Thái Ngọc Duy, Mar 30, 2013
  43. 11/12 pretty: support truncating in %>, %< and %><Nguyễn Thái Ngọc Duy, Mar 30, 2013
  44. 12/12 pretty: support %>> that steal trailing spacesNguyễn Thái Ngọc Duy, Mar 30, 2013
  45. Junio C HamanoApr 1, 2013
  46. 00/13 nd/pretty-formatsNguyễn Thái Ngọc Duy, Apr 16, 2013
  47. 01/13 pretty: save commit encoding from logmsg_reencode if the caller needs itNguyễn Thái Ngọc Duy, Apr 16, 2013
  48. 02/13 pretty: get the correct encoding for --pretty:format=%eNguyễn Thái Ngọc Duy, Apr 16, 2013
  49. 03/13 pretty-formats.txt: wrap long linesNguyễn Thái Ngọc Duy, Apr 16, 2013
  50. 04/13 pretty: share code between format_decoration and show_decorationsNguyễn Thái Ngọc Duy, Apr 16, 2013
  51. 05/13 utf8.c: move display_mode_esc_sequence_len() for use by other functionsNguyễn Thái Ngọc Duy, Apr 16, 2013
  52. 06/13 utf8.c: add utf8_strnwidth() with the ability to skip ansi sequencesNguyễn Thái Ngọc Duy, Apr 16, 2013
  53. 07/13 utf8.c: add reencode_string_len() that can handle NULs in stringNguyễn Thái Ngọc Duy, Apr 16, 2013
  54. Duy NguyenApr 16, 2013
  55. Junio C HamanoApr 18, 2013
  56. 08/13 pretty: two phase conversion for non utf-8 commitsNguyễn Thái Ngọc Duy, Apr 16, 2013
  57. 09/13 pretty: split color parsing into a separate functionNguyễn Thái Ngọc Duy, Apr 16, 2013
  58. 10/13 pretty: add %C(auto) for auto-coloringNguyễn Thái Ngọc Duy, Apr 16, 2013
  59. Junio C HamanoApr 16, 2013
  60. Duy NguyenApr 17, 2013
  61. Junio C HamanoApr 17, 2013
  62. Junio C HamanoApr 16, 2013
  63. 11/13 pretty: support padding placeholders, %< %> and %><Nguyễn Thái Ngọc Duy, Apr 16, 2013
  64. Junio C HamanoApr 16, 2013
  65. Junio C HamanoApr 16, 2013
  66. Duy NguyenApr 17, 2013
  67. 12/13 pretty: support truncating in %>, %< and %><Nguyễn Thái Ngọc Duy, Apr 16, 2013
  68. 13/13 pretty: support %>> that steal trailing spacesNguyễn Thái Ngọc Duy, Apr 16, 2013
  69. 00/13 nd/pretty-formatsNguyễn Thái Ngọc Duy, Apr 18, 2013
  70. 01/13 pretty: save commit encoding from logmsg_reencode if the caller needs itNguyễn Thái Ngọc Duy, Apr 18, 2013
  71. 02/13 pretty: get the correct encoding for --pretty:format=%eNguyễn Thái Ngọc Duy, Apr 18, 2013
  72. 03/13 pretty-formats.txt: wrap long linesNguyễn Thái Ngọc Duy, Apr 18, 2013
  73. 04/13 pretty: share code between format_decoration and show_decorationsNguyễn Thái Ngọc Duy, Apr 18, 2013
  74. 05/13 utf8.c: move display_mode_esc_sequence_len() for use by other functionsNguyễn Thái Ngọc Duy, Apr 18, 2013
  75. 06/13 utf8.c: add utf8_strnwidth() with the ability to skip ansi sequencesNguyễn Thái Ngọc Duy, Apr 18, 2013
  76. 07/13 utf8.c: add reencode_string_len() that can handle NULs in stringNguyễn Thái Ngọc Duy, Apr 18, 2013
  77. 08/13 pretty: two phase conversion for non utf-8 commitsNguyễn Thái Ngọc Duy, Apr 18, 2013
  78. 09/13 pretty: split color parsing into a separate functionNguyễn Thái Ngọc Duy, Apr 18, 2013
  79. 10/13 pretty: add %C(auto) for auto-coloringNguyễn Thái Ngọc Duy, Apr 18, 2013
  80. 11/13 pretty: support padding placeholders, %< %> and %><Nguyễn Thái Ngọc Duy, Apr 18, 2013
  81. 12/13 pretty: support truncating in %>, %< and %><Nguyễn Thái Ngọc Duy, Apr 18, 2013
  82. 13/13 pretty: support %>> that steal trailing spacesNguyễn Thái Ngọc Duy, Apr 18, 2013
  83. Torsten BögershausenApr 16, 2013

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.