From patchwork Sun Nov 4 15:22:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anders Waldenborg X-Patchwork-Id: 10666901 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CECE81751 for ; Sun, 4 Nov 2018 15:24:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BE85B28BFC for ; Sun, 4 Nov 2018 15:24:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B27D92998C; Sun, 4 Nov 2018 15:24:03 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 59F6529988 for ; Sun, 4 Nov 2018 15:24:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729993AbeKEAjN (ORCPT ); Sun, 4 Nov 2018 19:39:13 -0500 Received: from 0x63.nu ([109.74.10.199]:37204 "EHLO 0x63.nu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729786AbeKEAjN (ORCPT ); Sun, 4 Nov 2018 19:39:13 -0500 Received: from localhost ([127.0.0.1] helo=localhost.localdomain) by 0x63.nu with esmtp (Exim 4.89) (envelope-from ) id 1gJKFe-0005Wk-Kw; Sun, 04 Nov 2018 16:23:51 +0100 From: Anders Waldenborg To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , Olga Telezhnaya , Anders Waldenborg Subject: [PATCH v2 1/5] pretty: single return path in %(trailers) handling Date: Sun, 4 Nov 2018 16:22:28 +0100 Message-Id: <20181104152232.20671-2-anders@0x63.nu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181104152232.20671-1-anders@0x63.nu> References: <20181028125025.30952-1-anders@0x63.nu> <20181104152232.20671-1-anders@0x63.nu> X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: anders@0x63.nu X-SA-Exim-Scanned: No (on 0x63.nu); SAEximRunCond expanded to false Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP No functional change intended. This change may not seem useful on its own, but upcoming commits will do memory allocation in there, and a single return path makes deallocation easier. Signed-off-by: Anders Waldenborg --- pretty.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pretty.c b/pretty.c index b83a3ecd2..aa03d5b23 100644 --- a/pretty.c +++ b/pretty.c @@ -1312,6 +1312,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ if (skip_prefix(placeholder, "(trailers", &arg)) { struct process_trailer_options opts = PROCESS_TRAILER_OPTIONS_INIT; + size_t ret = 0; opts.no_divider = 1; @@ -1328,8 +1329,9 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ } if (*arg == ')') { format_trailers_from_commit(sb, msg + c->subject_off, &opts); - return arg - placeholder + 1; + ret = arg - placeholder + 1; } + return ret; } return 0; /* unknown placeholder */ From patchwork Sun Nov 4 15:22:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anders Waldenborg X-Patchwork-Id: 10666903 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4A057175A for ; Sun, 4 Nov 2018 15:24:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 39DD62999A for ; Sun, 4 Nov 2018 15:24:39 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2D7C02999D; Sun, 4 Nov 2018 15:24:39 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9669C29990 for ; Sun, 4 Nov 2018 15:24:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730046AbeKEAjx (ORCPT ); Sun, 4 Nov 2018 19:39:53 -0500 Received: from 0x63.nu ([109.74.10.199]:37224 "EHLO 0x63.nu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729786AbeKEAjx (ORCPT ); Sun, 4 Nov 2018 19:39:53 -0500 Received: from localhost ([127.0.0.1] helo=localhost.localdomain) by 0x63.nu with esmtp (Exim 4.89) (envelope-from ) id 1gJKGM-0005Wk-Eu; Sun, 04 Nov 2018 16:24:30 +0100 From: Anders Waldenborg To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , Olga Telezhnaya , Anders Waldenborg Subject: [PATCH v2 2/5] pretty: allow showing specific trailers Date: Sun, 4 Nov 2018 16:22:29 +0100 Message-Id: <20181104152232.20671-3-anders@0x63.nu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181104152232.20671-1-anders@0x63.nu> References: <20181028125025.30952-1-anders@0x63.nu> <20181104152232.20671-1-anders@0x63.nu> X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: anders@0x63.nu X-SA-Exim-Scanned: No (on 0x63.nu); SAEximRunCond expanded to false Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Adds a new "key=X" option to "%(trailers)" which will cause it to only print trailers lines which matches the specified key. Signed-off-by: Anders Waldenborg --- Documentation/pretty-formats.txt | 13 +++++---- pretty.c | 15 ++++++++++- t/t4205-log-pretty-formats.sh | 45 ++++++++++++++++++++++++++++++++ trailer.c | 8 +++--- trailer.h | 1 + 5 files changed, 73 insertions(+), 9 deletions(-) diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index 417b638cd..8326fc45e 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -209,11 +209,14 @@ endif::git-rev-list[] respectively, but padding both sides (i.e. the text is centered) - %(trailers[:options]): display the trailers of the body as interpreted by linkgit:git-interpret-trailers[1]. The `trailers` string may be - followed by a colon and zero or more comma-separated options. If the - `only` option is given, omit non-trailer lines from the trailer block. - If the `unfold` option is given, behave as if interpret-trailer's - `--unfold` option was given. E.g., `%(trailers:only,unfold)` to do - both. + followed by a colon and zero or more comma-separated options. The + allowed options are `only` which omits non-trailer lines from the + trailer block, `unfold` to make it behave as if interpret-trailer's + `--unfold` option was given, and `key=T` to only show trailers with + specified key (matching is done + case-insensitively). E.g. `%(trailers:only,unfold)` unfolds and + shows all trailer lines, `%(trailers:key=Reviewed-by,unfold)` + unfolds and shows trailer lines with key `Reviewed-by`. NOTE: Some placeholders may depend on other options given to the revision traversal engine. For example, the `%g*` reflog options will diff --git a/pretty.c b/pretty.c index aa03d5b23..cdca9dce2 100644 --- a/pretty.c +++ b/pretty.c @@ -1323,7 +1323,19 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ opts.only_trailers = 1; else if (match_placeholder_arg(arg, "unfold", &arg)) opts.unfold = 1; - else + else if (skip_prefix(arg, "key=", &arg)) { + const char *end = arg + strcspn(arg, ",)"); + + if (opts.filter_key) + free(opts.filter_key); + + opts.filter_key = xstrndup(arg, end - arg); + arg = end; + if (*arg == ',') + arg++; + + opts.only_trailers = 1; + } else break; } } @@ -1331,6 +1343,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ format_trailers_from_commit(sb, msg + c->subject_off, &opts); ret = arg - placeholder + 1; } + free(opts.filter_key); return ret; } diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index 978a8a66f..0f5207242 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -598,6 +598,51 @@ test_expect_success ':only and :unfold work together' ' test_cmp expect actual ' +test_expect_success 'pretty format %(trailers:key=foo) shows that trailer' ' + git log --no-walk --pretty="%(trailers:key=Acked-by)" >actual && + { + echo "Acked-by: A U Thor " && + echo + } >expect && + test_cmp expect actual +' + +test_expect_success 'pretty format %(trailers:key=foo) is case insensitive' ' + git log --no-walk --pretty="%(trailers:key=AcKed-bY)" >actual && + { + echo "Acked-by: A U Thor " && + echo + } >expect && + test_cmp expect actual +' + +test_expect_success '%(trailers:key=nonexistant) becomes empty' ' + git log --no-walk --pretty="x%(trailers:key=Nacked-by)x" >actual && + { + echo "xx" + } >expect && + test_cmp expect actual +' + +test_expect_success '%(trailers:key=foo) handles multiple lines even if folded' ' + git log --no-walk --pretty="%(trailers:key=Signed-Off-by)" >actual && + { + grep -v patch.description expect && + test_cmp expect actual +' + +test_expect_success '%(trailers:key=foo,unfold) properly unfolds' ' + git log --no-walk --pretty="%(trailers:key=Signed-Off-by,unfold)" >actual && + { + echo "Signed-off-by: A U Thor " && + echo "Signed-off-by: A U Thor " && + echo + } >expect && + test_cmp expect actual +' + test_expect_success 'trailer parsing not fooled by --- line' ' git commit --allow-empty -F - <<-\EOF && this is the subject diff --git a/trailer.c b/trailer.c index 0796f326b..cbbb553e4 100644 --- a/trailer.c +++ b/trailer.c @@ -1147,10 +1147,12 @@ static void format_trailer_info(struct strbuf *out, struct strbuf val = STRBUF_INIT; parse_trailer(&tok, &val, NULL, trailer, separator_pos); - if (opts->unfold) - unfold_value(&val); + if (!opts->filter_key || !strcasecmp (tok.buf, opts->filter_key)) { + if (opts->unfold) + unfold_value(&val); - strbuf_addf(out, "%s: %s\n", tok.buf, val.buf); + strbuf_addf(out, "%s: %s\n", tok.buf, val.buf); + } strbuf_release(&tok); strbuf_release(&val); diff --git a/trailer.h b/trailer.h index b99773964..d052d02ae 100644 --- a/trailer.h +++ b/trailer.h @@ -72,6 +72,7 @@ struct process_trailer_options { int only_input; int unfold; int no_divider; + char *filter_key; }; #define PROCESS_TRAILER_OPTIONS_INIT {0} From patchwork Sun Nov 4 15:22:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anders Waldenborg X-Patchwork-Id: 10666905 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 672B91591 for ; Sun, 4 Nov 2018 15:24:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 57E6D29990 for ; Sun, 4 Nov 2018 15:24:39 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4C8EF2999A; Sun, 4 Nov 2018 15:24:39 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C13A129992 for ; Sun, 4 Nov 2018 15:24:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730051AbeKEAjy (ORCPT ); Sun, 4 Nov 2018 19:39:54 -0500 Received: from 0x63.nu ([109.74.10.199]:37232 "EHLO 0x63.nu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729996AbeKEAjy (ORCPT ); Sun, 4 Nov 2018 19:39:54 -0500 Received: from localhost ([127.0.0.1] helo=localhost.localdomain) by 0x63.nu with esmtp (Exim 4.89) (envelope-from ) id 1gJKGN-0005Wk-TE; Sun, 04 Nov 2018 16:24:32 +0100 From: Anders Waldenborg To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , Olga Telezhnaya , Anders Waldenborg Subject: [PATCH v2 3/5] pretty: add support for "nokey" option in %(trailers) Date: Sun, 4 Nov 2018 16:22:30 +0100 Message-Id: <20181104152232.20671-4-anders@0x63.nu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181104152232.20671-1-anders@0x63.nu> References: <20181028125025.30952-1-anders@0x63.nu> <20181104152232.20671-1-anders@0x63.nu> X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: anders@0x63.nu X-SA-Exim-Scanned: No (on 0x63.nu); SAEximRunCond expanded to false Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP With the new "key=" option to %trailers it often makes little sense to show the key, as it by definition already is know which trailer is printed there. This new "nokey" option makes it omit key trailer key when printing trailers. E.g.: $ git show -s --pretty='%s%n%(trailers:key=Signed-off-by,nokey)' aaaa88182 will show: > upload-pack: fix broken if/else chain in config callback > Jeff King > Junio C Hamano Signed-off-by: Anders Waldenborg --- Documentation/pretty-formats.txt | 11 ++++++----- pretty.c | 2 ++ t/t4205-log-pretty-formats.sh | 9 +++++++++ trailer.c | 6 ++++-- trailer.h | 1 + 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index 8326fc45e..e115e355d 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -212,11 +212,12 @@ endif::git-rev-list[] followed by a colon and zero or more comma-separated options. The allowed options are `only` which omits non-trailer lines from the trailer block, `unfold` to make it behave as if interpret-trailer's - `--unfold` option was given, and `key=T` to only show trailers with - specified key (matching is done - case-insensitively). E.g. `%(trailers:only,unfold)` unfolds and - shows all trailer lines, `%(trailers:key=Reviewed-by,unfold)` - unfolds and shows trailer lines with key `Reviewed-by`. + `--unfold` option was given, `key=T` to only show trailers with + specified key (matching is done case-insensitively), and `nokey` + which makes it skip over the key part of the trailer and only show + value. E.g. `%(trailers:only,unfold)` unfolds and shows all trailer + lines, `%(trailers:key=Reviewed-by,unfold)` unfolds and shows + trailer lines with key `Reviewed-by`. NOTE: Some placeholders may depend on other options given to the revision traversal engine. For example, the `%g*` reflog options will diff --git a/pretty.c b/pretty.c index cdca9dce2..f87ba4f18 100644 --- a/pretty.c +++ b/pretty.c @@ -1323,6 +1323,8 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ opts.only_trailers = 1; else if (match_placeholder_arg(arg, "unfold", &arg)) opts.unfold = 1; + else if (match_placeholder_arg(arg, "nokey", &arg)) + opts.no_key = 1; else if (skip_prefix(arg, "key=", &arg)) { const char *end = arg + strcspn(arg, ",)"); diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index 0f5207242..e7de3b18a 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -643,6 +643,15 @@ test_expect_success '%(trailers:key=foo,unfold) properly unfolds' ' test_cmp expect actual ' +test_expect_success '%(trailers:key=foo,nokey) shows only value' ' + git log --no-walk --pretty="%(trailers:key=Acked-by,nokey)" >actual && + { + echo "A U Thor " && + echo + } >expect && + test_cmp expect actual +' + test_expect_success 'trailer parsing not fooled by --- line' ' git commit --allow-empty -F - <<-\EOF && this is the subject diff --git a/trailer.c b/trailer.c index cbbb553e4..4f19c34cb 100644 --- a/trailer.c +++ b/trailer.c @@ -1150,8 +1150,10 @@ static void format_trailer_info(struct strbuf *out, if (!opts->filter_key || !strcasecmp (tok.buf, opts->filter_key)) { if (opts->unfold) unfold_value(&val); - - strbuf_addf(out, "%s: %s\n", tok.buf, val.buf); + if (opts->no_key) + strbuf_addf(out, "%s\n", val.buf); + else + strbuf_addf(out, "%s: %s\n", tok.buf, val.buf); } strbuf_release(&tok); strbuf_release(&val); diff --git a/trailer.h b/trailer.h index d052d02ae..83de87ee9 100644 --- a/trailer.h +++ b/trailer.h @@ -72,6 +72,7 @@ struct process_trailer_options { int only_input; int unfold; int no_divider; + int no_key; char *filter_key; }; From patchwork Sun Nov 4 15:22:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anders Waldenborg X-Patchwork-Id: 10666907 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8699718BC for ; Sun, 4 Nov 2018 15:24:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7765F29992 for ; Sun, 4 Nov 2018 15:24:39 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6B8F129990; Sun, 4 Nov 2018 15:24:39 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E162329999 for ; Sun, 4 Nov 2018 15:24:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730150AbeKEAjz (ORCPT ); Sun, 4 Nov 2018 19:39:55 -0500 Received: from 0x63.nu ([109.74.10.199]:37242 "EHLO 0x63.nu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729996AbeKEAjz (ORCPT ); Sun, 4 Nov 2018 19:39:55 -0500 Received: from localhost ([127.0.0.1] helo=localhost.localdomain) by 0x63.nu with esmtp (Exim 4.89) (envelope-from ) id 1gJKGP-0005Wk-Ci; Sun, 04 Nov 2018 16:24:33 +0100 From: Anders Waldenborg To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , Olga Telezhnaya , Anders Waldenborg Subject: [PATCH v2 4/5] pretty: extract fundamental placeholders to separate function Date: Sun, 4 Nov 2018 16:22:31 +0100 Message-Id: <20181104152232.20671-5-anders@0x63.nu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181104152232.20671-1-anders@0x63.nu> References: <20181028125025.30952-1-anders@0x63.nu> <20181104152232.20671-1-anders@0x63.nu> X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: anders@0x63.nu X-SA-Exim-Scanned: No (on 0x63.nu); SAEximRunCond expanded to false Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP No functional change intended Signed-off-by: Anders Waldenborg --- pretty.c | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/pretty.c b/pretty.c index f87ba4f18..9fdddce9d 100644 --- a/pretty.c +++ b/pretty.c @@ -1074,6 +1074,27 @@ static int match_placeholder_arg(const char *to_parse, const char *candidate, return 0; } +static size_t format_fundamental(struct strbuf *sb, /* in UTF-8 */ + const char *placeholder, + void *context) +{ + int ch; + + switch (placeholder[0]) { + case 'n': /* newline */ + strbuf_addch(sb, '\n'); + return 1; + case 'x': + /* %x00 == NUL, %x0a == LF, etc. */ + ch = hex2chr(placeholder + 1); + if (ch < 0) + return 0; + strbuf_addch(sb, ch); + return 3; + } + return 0; +} + static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ const char *placeholder, void *context) @@ -1083,9 +1104,13 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ const char *msg = c->message; struct commit_list *p; const char *arg; - int ch; + size_t res; /* these are independent of the commit */ + res = format_fundamental(sb, placeholder, NULL); + if (res) + return res; + switch (placeholder[0]) { case 'C': if (starts_with(placeholder + 1, "(auto)")) { @@ -1104,16 +1129,6 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ */ return ret; } - case 'n': /* newline */ - strbuf_addch(sb, '\n'); - return 1; - case 'x': - /* %x00 == NUL, %x0a == LF, etc. */ - ch = hex2chr(placeholder + 1); - if (ch < 0) - return 0; - strbuf_addch(sb, ch); - return 3; case 'w': if (placeholder[1] == '(') { unsigned long width = 0, indent1 = 0, indent2 = 0; From patchwork Sun Nov 4 15:22:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anders Waldenborg X-Patchwork-Id: 10666909 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9CAD21591 for ; Sun, 4 Nov 2018 15:24:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8BE7F28BFC for ; Sun, 4 Nov 2018 15:24:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 807502998C; Sun, 4 Nov 2018 15:24:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E846828BFC for ; Sun, 4 Nov 2018 15:24:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730250AbeKEAj7 (ORCPT ); Sun, 4 Nov 2018 19:39:59 -0500 Received: from 0x63.nu ([109.74.10.199]:37254 "EHLO 0x63.nu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729996AbeKEAj7 (ORCPT ); Sun, 4 Nov 2018 19:39:59 -0500 Received: from localhost ([127.0.0.1] helo=localhost.localdomain) by 0x63.nu with esmtp (Exim 4.89) (envelope-from ) id 1gJKGQ-0005Wk-Mc; Sun, 04 Nov 2018 16:24:36 +0100 From: Anders Waldenborg To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , Olga Telezhnaya , Anders Waldenborg Subject: [PATCH v2 5/5] pretty: add support for separator option in %(trailers) Date: Sun, 4 Nov 2018 16:22:32 +0100 Message-Id: <20181104152232.20671-6-anders@0x63.nu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181104152232.20671-1-anders@0x63.nu> References: <20181028125025.30952-1-anders@0x63.nu> <20181104152232.20671-1-anders@0x63.nu> X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: anders@0x63.nu X-SA-Exim-Scanned: No (on 0x63.nu); SAEximRunCond expanded to false Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP By default trailer lines are terminated by linebreaks ('\n'). By specifying the new 'separator' option they will instead be separated by user provided string and have separator semantics rather than terminator semantics. The separator string can contain the fundamental formatting codes %n and %xNN allowing it to be things that are otherwise hard to type as %x00, or command and end-parenthesis which would break parsing. E.g: $ git log --pretty='%(trailers:key=Reviewed-by,nokey,separator=%x00)' Signed-off-by: Anders Waldenborg --- Documentation/pretty-formats.txt | 13 ++++++++----- pretty.c | 13 +++++++++++++ t/t4205-log-pretty-formats.sh | 6 ++++++ trailer.c | 20 +++++++++++++++++--- trailer.h | 1 + 5 files changed, 45 insertions(+), 8 deletions(-) diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index e115e355d..3312850e6 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -213,11 +213,14 @@ endif::git-rev-list[] allowed options are `only` which omits non-trailer lines from the trailer block, `unfold` to make it behave as if interpret-trailer's `--unfold` option was given, `key=T` to only show trailers with - specified key (matching is done case-insensitively), and `nokey` - which makes it skip over the key part of the trailer and only show - value. E.g. `%(trailers:only,unfold)` unfolds and shows all trailer - lines, `%(trailers:key=Reviewed-by,unfold)` unfolds and shows - trailer lines with key `Reviewed-by`. + specified key (matching is done case-insensitively), `nokey` which + makes it skip over the key part of the trailer and only show value + and `separator` which allows specifying an alternative separator + than the default line + break. E.g. `%(trailers:only,unfold,separator=%x00)` unfolds and + shows all trailer lines separated by NUL character, + `%(trailers:key=Reviewed-by,unfold)` unfolds and shows trailer lines + with key `Reviewed-by`. NOTE: Some placeholders may depend on other options given to the revision traversal engine. For example, the `%g*` reflog options will diff --git a/pretty.c b/pretty.c index 9fdddce9d..f73a2b0dc 100644 --- a/pretty.c +++ b/pretty.c @@ -1327,6 +1327,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ if (skip_prefix(placeholder, "(trailers", &arg)) { struct process_trailer_options opts = PROCESS_TRAILER_OPTIONS_INIT; + struct strbuf sepbuf = STRBUF_INIT; size_t ret = 0; opts.no_divider = 1; @@ -1352,6 +1353,17 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ arg++; opts.only_trailers = 1; + } else if (skip_prefix(arg, "separator=", &arg)) { + size_t seplen = strcspn(arg, ",)"); + strbuf_reset(&sepbuf); + char *fmt = xstrndup(arg, seplen); + strbuf_expand(&sepbuf, fmt, format_fundamental, NULL); + free(fmt); + opts.separator = &sepbuf; + + arg += seplen; + if (*arg == ',') + arg++; } else break; } @@ -1360,6 +1372,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ format_trailers_from_commit(sb, msg + c->subject_off, &opts); ret = arg - placeholder + 1; } + strbuf_release (&sepbuf); free(opts.filter_key); return ret; } diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index e7de3b18a..71218d22e 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -652,6 +652,12 @@ test_expect_success '%(trailers:key=foo,nokey) shows only value' ' test_cmp expect actual ' +test_expect_success 'pretty format %(trailers:separator) changes separator' ' + git log --no-walk --pretty=format:"X%(trailers:separator=%x00,unfold)X" >actual && + printf "XSigned-off-by: A U Thor \0Acked-by: A U Thor \0[ v2 updated patch description ]\0Signed-off-by: A U Thor X" >expect && + test_cmp expect actual +' + test_expect_success 'trailer parsing not fooled by --- line' ' git commit --allow-empty -F - <<-\EOF && this is the subject diff --git a/trailer.c b/trailer.c index 4f19c34cb..a79e4e36a 100644 --- a/trailer.c +++ b/trailer.c @@ -1129,10 +1129,11 @@ static void format_trailer_info(struct strbuf *out, const struct trailer_info *info, const struct process_trailer_options *opts) { + int first_printed = 0; size_t i; /* If we want the whole block untouched, we can take the fast path. */ - if (!opts->only_trailers && !opts->unfold) { + if (!opts->only_trailers && !opts->unfold && !opts->separator) { strbuf_add(out, info->trailer_start, info->trailer_end - info->trailer_start); return; @@ -1150,16 +1151,29 @@ static void format_trailer_info(struct strbuf *out, if (!opts->filter_key || !strcasecmp (tok.buf, opts->filter_key)) { if (opts->unfold) unfold_value(&val); + if (opts->separator && first_printed) + strbuf_addbuf(out, opts->separator); if (opts->no_key) - strbuf_addf(out, "%s\n", val.buf); + strbuf_addf(out, "%s", val.buf); else - strbuf_addf(out, "%s: %s\n", tok.buf, val.buf); + strbuf_addf(out, "%s: %s", tok.buf, val.buf); + if (!opts->separator) + strbuf_addch(out, '\n'); + + first_printed = 1; } strbuf_release(&tok); strbuf_release(&val); } else if (!opts->only_trailers) { + if (opts->separator && first_printed) { + strbuf_addbuf(out, opts->separator); + } strbuf_addstr(out, trailer); + if (opts->separator) { + strbuf_rtrim(out); + } + first_printed = 1; } } diff --git a/trailer.h b/trailer.h index 83de87ee9..0e9d89660 100644 --- a/trailer.h +++ b/trailer.h @@ -74,6 +74,7 @@ struct process_trailer_options { int no_divider; int no_key; char *filter_key; + const struct strbuf *separator; }; #define PROCESS_TRAILER_OPTIONS_INIT {0}