From patchwork Sun Dec 6 00:24:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 11953539 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 313CCC197BF for ; Sun, 6 Dec 2020 00:26:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0A39A2313E for ; Sun, 6 Dec 2020 00:26:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726198AbgLFAZs (ORCPT ); Sat, 5 Dec 2020 19:25:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40222 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726023AbgLFAZr (ORCPT ); Sat, 5 Dec 2020 19:25:47 -0500 Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DB8EAC0613D1 for ; Sat, 5 Dec 2020 16:25:06 -0800 (PST) Received: by mail-wr1-x436.google.com with SMTP id 91so5065832wrj.7 for ; Sat, 05 Dec 2020 16:25:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=j2ZTSvWySxS2pIoV3RsjQzL7KBtb1JQBiJDaBIgVfGA=; b=js+9bLCJKxCXe21FGeYfncx4D15eifNQHXztvjrWIt6EdsCrAzqOC21U5vC+8EeRj7 0vB1U2Q8P9LFMMvo0x9dCOMpG+J5YKMfqy6uvcoAXD/M+DekBr8C86RRj1rmMdUCmHF4 RAP4CJCEqiy0hfVtDn3mzXPyy60FJO2QMhjgSFMW8QBO/brtJslacmbndAlGxaMSHkTK FdPtwDUT+Q/XGihLL5chy5XgyhflnDOTIT6qWfOzYoAWFP+rIZ1ZeM5AlTUjYY3dFaJI lkJAagf0GhZmyzx+C3ANi5X8WxvqjJbdJSYlz/wJmE3+wpUvlIRqkAYA2tOFH3Ci1vLn Uu7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=j2ZTSvWySxS2pIoV3RsjQzL7KBtb1JQBiJDaBIgVfGA=; b=eFcDXdt9Wg8Bfr+PkNWbOZWVyWPsDoM4HrBjv1RciAU6mVeSMUlPAK6jTFe0LWqRdR k/1HSKekBaG0da+/lHfiQIzk4EGCdwP5CQhWotwCjtXjU9CZ34vJyHSOtBLobGwryKdW +ythz3um16UnP3ebWs7aQh6crWUTxQ3tkGeNP8ecQPG0rJjqxRDjyiE1rD44wftdkDO2 S4r0DSnmlgMmeoKKryfKjEu2jHX0CJ99XtuTNjIDfkIu+EqtZ1ngNgvd/xh4WzK5HtrL fEOeBmwq25Ufp0yxdvqEb535k3gs+i4viY460zr4Q3cGXTm7WG56th86GBnQdM8LC1ZX +MqA== X-Gm-Message-State: AOAM532VGG6zMmLH5dXWwzwvupMMw84NXiY8OMOpdV2fJqekwNBbiMHZ JICeeu4Q9MB8ZkpFfxSdDok76nakyGdLTQ== X-Google-Smtp-Source: ABdhPJx6JBIfpeVH377pOCzJvH2SwxlTqFtGtOLxW3jm4IPjB6xH3nUdrA1m5+7bLT4dppcyRxNIoA== X-Received: by 2002:adf:f94b:: with SMTP id q11mr12503103wrr.351.1607214305234; Sat, 05 Dec 2020 16:25:05 -0800 (PST) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 34sm9144338wrh.78.2020.12.05.16.25.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 05 Dec 2020 16:25:04 -0800 (PST) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Anders Waldenborg , christian.couder@gmail.com, peff@peff.net, jonathantanmy@google.com, Hariom Verma , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBC?= =?utf-8?b?amFybWFzb24=?= Subject: [PATCH v2 1/5] pretty format %(trailers) test: split a long line Date: Sun, 6 Dec 2020 01:24:45 +0100 Message-Id: <20201206002449.31452-2-avarab@gmail.com> X-Mailer: git-send-email 2.29.2.222.g5d2a92d10f8 In-Reply-To: <20201205013918.18981-1-avarab@gmail.com> References: <20201205013918.18981-1-avarab@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Split a very long line in a test introduced in 0b691d86851 (pretty: add support for separator option in %(trailers), 2019-01-28). This makes it easier to read, especially as follow-up commits will copy this test as a template. Signed-off-by: Ævar Arnfjörð Bjarmason --- t/t4205-log-pretty-formats.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index 204c149d5a4..5e5452212d2 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -717,7 +717,12 @@ test_expect_success '%(trailers:key=foo,valueonly) shows only value' ' 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 && + ( + printf "XSigned-off-by: A U Thor \0" && + printf "Acked-by: A U Thor \0" && + printf "[ v2 updated patch description ]\0" && + printf "Signed-off-by: A U Thor X" + ) >expect && test_cmp expect actual ' From patchwork Sun Dec 6 00:24:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 11953535 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E5F84C4361B for ; Sun, 6 Dec 2020 00:26:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9F68E23108 for ; Sun, 6 Dec 2020 00:26:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727415AbgLFAZs (ORCPT ); Sat, 5 Dec 2020 19:25:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40226 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726023AbgLFAZs (ORCPT ); Sat, 5 Dec 2020 19:25:48 -0500 Received: from mail-wm1-x343.google.com (mail-wm1-x343.google.com [IPv6:2a00:1450:4864:20::343]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EB5FFC0613D4 for ; Sat, 5 Dec 2020 16:25:07 -0800 (PST) Received: by mail-wm1-x343.google.com with SMTP id c198so8472101wmd.0 for ; Sat, 05 Dec 2020 16:25:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=J2yZx6KjPdhFK98zKb0H1YK1K5NNadMnSnDIfNqMxpc=; b=Wrrz+fE+vDZopvZXIsfT6p2c1DnmdooCFE9A1VGejKb0fuAH/CFBfEexdSJq8DZsWr tI/3du2XIebk72+JnYIpDAQczXyFytcof12FkN1Y/stiL7/bpNZqaT857WmLQhJmLm/e GqeqBwVuH0mNaqBfTLrDE9eKfXMGOU8kDZjzNoyZj4faZT5wk/4wedyWHIiW16Qk9TxC bbatcKUbWd+ZgbSAGuUD4/G0qn14nUUSwMyYfMdsxN0xUxxPaHusjsBVleeItSuqqcif 7P5VcsOur6rV7f+3rLaLAgBFk6bXYHepl11J9dnfBO6o/aMOyB7MxCSoaUlLeJNI7rUy PCwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=J2yZx6KjPdhFK98zKb0H1YK1K5NNadMnSnDIfNqMxpc=; b=rW/8awTxDMB36SNay2NIexipjPkJZtG2h3UT6IHkQjHWb+7QEmA4tYjqEOYfC2oo85 JWDjfH4n8D8ELv1PaJSSwNtWuwzC4/YwUHNF4406eUj58z+1fdv9yzJ1O6ifhejP+pjE YbT8/vPQ4sPS42LbZS/wPU5dmtVMJeTxcCs7fQgYm4Naq/wnytFzNdnhYwtwlya14cko +nTWwIgkoHbiuIsk/EWqGQyaRb+GOcX/lvMx6VhGr3lc+lAv+hLaCGHq/gl/KGAgnY/5 /BgDRICiJ950nsjDix5M2miU+yetCHJ4Rwj8Z6S3w4perFyk5npygLgnQnIp/umrZW9F 86KA== X-Gm-Message-State: AOAM533Bl+PqJKpBKbuuk8ELmXOG+HdceJasR1oSK9E+EU0EdDKx9F0n uAnggVKlL+g6bAJwfQq0NAmMBXtvi+X70Q== X-Google-Smtp-Source: ABdhPJx+/BsjCg+a7XxQe34NBE+Zs1tqbc9OShAWwwONzvCOmYZX6kWXJNTnOAtPq0sopx8t0uYW4w== X-Received: by 2002:a1c:5ad6:: with SMTP id o205mr11151881wmb.161.1607214306287; Sat, 05 Dec 2020 16:25:06 -0800 (PST) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 34sm9144338wrh.78.2020.12.05.16.25.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 05 Dec 2020 16:25:05 -0800 (PST) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Anders Waldenborg , christian.couder@gmail.com, peff@peff.net, jonathantanmy@google.com, Hariom Verma , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBC?= =?utf-8?b?amFybWFzb24=?= Subject: [PATCH v2 2/5] pretty format %(trailers) doc: avoid repetition Date: Sun, 6 Dec 2020 01:24:46 +0100 Message-Id: <20201206002449.31452-3-avarab@gmail.com> X-Mailer: git-send-email 2.29.2.222.g5d2a92d10f8 In-Reply-To: <20201205013918.18981-1-avarab@gmail.com> References: <20201205013918.18981-1-avarab@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Change the documentation for the various %(trailers) options so it isn't repeating part of the documentation for "only" about how boolean values are handled. Instead, let's split the description of that into general documentation at the top. It then suffices to refer to it by listing the options as "opt[=]". I'm also changing it to upper-case "[=]" from "[=val]" for consistency with "" It took me a couple of readings to realize that these options were referring back to the "only" option's treatment of boolean values. Let's try to make this more explicit, and upper-case "BOOL" for consistency with the existing "" and "". Signed-off-by: Ævar Arnfjörð Bjarmason --- Documentation/pretty-formats.txt | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index 84bbc7439a6..66dfa122361 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -252,7 +252,15 @@ endif::git-rev-list[] interpreted by linkgit:git-interpret-trailers[1]. The `trailers` string may be followed by a colon - and zero or more comma-separated options: + and zero or more comma-separated options. + If any option is provided multiple times the + last occurance wins. ++ +The boolean options accept an optional value `[=]`. The values +`true`, `false`, `on`, `off` etc. are all accepted. See the "boolean" +sub-section in "EXAMPLES" in linkgit:git-config[1]. If a boolean +option is given with no value, it's enabled. ++ ** 'key=': only show trailers with specified key. Matching is done case-insensitively and trailing colon is optional. If option is given multiple times trailer lines matching any of the keys are @@ -261,27 +269,21 @@ endif::git-rev-list[] desired it can be disabled with `only=false`. E.g., `%(trailers:key=Reviewed-by)` shows trailer lines with key `Reviewed-by`. -** 'only[=val]': select whether non-trailer lines from the trailer - block should be included. The `only` keyword may optionally be - followed by an equal sign and one of `true`, `on`, `yes` to omit or - `false`, `off`, `no` to show the non-trailer lines. If option is - given without value it is enabled. If given multiple times the last - value is used. +** 'only[=BOOL]': select whether non-trailer lines from the trailer + block should be included. ** 'separator=': specify a separator inserted between trailer lines. When this option is not given each trailer line is terminated with a line feed character. The string SEP may contain the literal formatting codes described above. To use comma as separator one must use `%x2C` as it would otherwise be parsed as - next option. If separator option is given multiple times only the - last one is used. E.g., `%(trailers:key=Ticket,separator=%x2C )` + next option. E.g., `%(trailers:key=Ticket,separator=%x2C )` shows all trailer lines whose key is "Ticket" separated by a comma and a space. -** 'unfold[=val]': make it behave as if interpret-trailer's `--unfold` - option was given. In same way as to for `only` it can be followed - by an equal sign and explicit value. E.g., +** 'unfold[=BOOL]': make it behave as if interpret-trailer's `--unfold` + option was given. E.g., `%(trailers:only,unfold=true)` unfolds and shows all trailer lines. -** 'valueonly[=val]': skip over the key part of the trailer line and only - show the value part. Also this optionally allows explicit value. +** 'valueonly[=BOOL]': skip over the key part of the trailer line and only + show the value part. NOTE: Some placeholders may depend on other options given to the revision traversal engine. For example, the `%g*` reflog options will From patchwork Sun Dec 6 00:24:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 11953541 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0A639C193FE for ; Sun, 6 Dec 2020 00:26:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CF33B2313F for ; Sun, 6 Dec 2020 00:26:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727457AbgLFAZ4 (ORCPT ); Sat, 5 Dec 2020 19:25:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40232 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726023AbgLFAZz (ORCPT ); Sat, 5 Dec 2020 19:25:55 -0500 Received: from mail-wm1-x344.google.com (mail-wm1-x344.google.com [IPv6:2a00:1450:4864:20::344]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ED6BAC061A4F for ; Sat, 5 Dec 2020 16:25:08 -0800 (PST) Received: by mail-wm1-x344.google.com with SMTP id g185so10302014wmf.3 for ; Sat, 05 Dec 2020 16:25:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=U4qj8uKOjVNvuGI4EuAJXJRGBvpZoYBsOgGr/HA52zs=; b=OPGXlr87lBhAHxLoA7V3fzLcJSstbRv/Ym5avE1D3NR/3QdZZoQt9KCFgGEBT0HWoM 43FpvuJ8raH6d3cNZnNbNeZD9yT10GGDzWc06Wu/bHeIzWFNGN6d/wV+l+yCoO8SeNSj u0O2zWLS0Qjkh3iCByT4M8T0XDCt45fCavhsR6j+D4HXC8xdLwYWEXy0uvUYsmTLiuRg wwt2mmAxWrefGoz6XTH+N1Ulnq88z0daZ1VhIDrH62xQQGTgvcZrHobpqBIG6yBTAqrF GmoaBd3KjiGBtu3rtavVzWYdl2+hveTa7gCgjXdqF2nFIXwFoiNXF77Ufk3bKMJMDk0p 4c9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=U4qj8uKOjVNvuGI4EuAJXJRGBvpZoYBsOgGr/HA52zs=; b=n7wr3Hx9LXfk9cdPpAfE5SPN50JxOT/WzKFL8gX13DNO1B3d2gATjMHsODeatyaG24 ER3w+f+FiV88UNA/+u5mUElc5+IugSxpnUyAOxAU6aggg+L+OdDTtoXtdWrqQXvJ4yG2 tyDapQAvtdy+9I5IfZou3yDW89X+wDJGoRKAGU+jIz4SSIsMuS+8ejqZ6Sn/bad83iZS yxsIznegCZ9xEdxfDFSckDT32PUgjq+UBux8nKZRtyNOQuik5OdNHIK8z280ekfhit+p B+oGEulAyix7/6bKFo/hSyTDnYhejLTCQiIb1a90xkeze/KQoMyDTuqQOGme4N34CnUV tqEQ== X-Gm-Message-State: AOAM530i4OlcS2qvEm2nr1jiPtK633YA4PI33uoEImO4D5LqGfU3Tknr 213utDIZdG6B1+oyVxrZZ5mFO98MPU4lCg== X-Google-Smtp-Source: ABdhPJwAy2xuPiQOHmekbMSffVn8MQnTvThRiHy0octfaX2Tzuiy7z1bCRknGMJuuKzk+n8psD6uRg== X-Received: by 2002:a7b:c385:: with SMTP id s5mr11204633wmj.170.1607214307419; Sat, 05 Dec 2020 16:25:07 -0800 (PST) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 34sm9144338wrh.78.2020.12.05.16.25.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 05 Dec 2020 16:25:06 -0800 (PST) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Anders Waldenborg , christian.couder@gmail.com, peff@peff.net, jonathantanmy@google.com, Hariom Verma , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBC?= =?utf-8?b?amFybWFzb24=?= Subject: [PATCH v2 3/5] pretty-format %(trailers): fix broken standalone "valueonly" Date: Sun, 6 Dec 2020 01:24:47 +0100 Message-Id: <20201206002449.31452-4-avarab@gmail.com> X-Mailer: git-send-email 2.29.2.222.g5d2a92d10f8 In-Reply-To: <20201205013918.18981-1-avarab@gmail.com> References: <20201205013918.18981-1-avarab@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Fix %(trailers:valueonly) being a noop due to on overly eager optimization in format_trailer_info() which skips custom formatting if no custom options are given. When "valueonly" was added in d9b936db522 (pretty: add support for "valueonly" option in %(trailers), 2019-01-28) we forgot to add it to the list of options that optimization checks for. See e.g. the addition of "key" in 250bea0c165 (pretty: allow showing specific trailers, 2019-01-28) for a similar change where this wasn't missed. Thus the "valueonly" option in "%(trailers:valueonly)" was a noop and the output was equivalent to that of a plain "%(trailers)". This wasn't caught because the tests for it always combined it with other options. Fix the bug by adding !opts->value_only to the list. I initially attempted to make this more future-proof by setting a flag if we got to ":" in "%(trailers:" in format_commit_one() in pretty.c. However, "%(trailers:" is also parsed in trailers_atom_parser() in ref-filter.c. There is an outstanding patch[1] unify those two, and such a fix, or other future-proofing, such as changing "process_trailer_options" flags into a bitfield, would conflict with that effort. Let's instead do the bare minimum here as this aspect of trailers is being actively worked on by another series. Let's also test for a plain "valueonly" without any other options, as well as "separator". All the other existing options on the pretty.c path had tests where they were the only option provided. I'm also keeping a sanity test for "%(trailers:)" being the same as "%(trailers)". There's no reason to suspect it wouldn't be in the current implementation, but let's keep it in the interest of black box testing. 1. https://lore.kernel.org/git/pull.726.git.1599335291.gitgitgadget@gmail.com/ Signed-off-by: Ævar Arnfjörð Bjarmason --- t/t4205-log-pretty-formats.sh | 28 ++++++++++++++++++++++++++++ trailer.c | 3 ++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index 5e5452212d2..cb09a13249e 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -605,6 +605,12 @@ test_expect_success 'pretty format %(trailers) shows trailers' ' test_cmp expect actual ' +test_expect_success 'pretty format %(trailers:) enables no options' ' + git log --no-walk --pretty="%(trailers:)" >actual && + # "expect" the same as the test above + test_cmp expect actual +' + test_expect_success '%(trailers:only) shows only "key: value" trailers' ' git log --no-walk --pretty="%(trailers:only)" >actual && { @@ -715,7 +721,29 @@ test_expect_success '%(trailers:key=foo,valueonly) shows only value' ' test_cmp expect actual ' +test_expect_success '%(trailers:valueonly) shows only values' ' + git log --no-walk --pretty="format:%(trailers:valueonly)" >actual && + test_write_lines \ + "A U Thor " \ + "A U Thor " \ + "[ v2 updated patch description ]" \ + "A U Thor" \ + " " >expect && + test_cmp expect actual +' + test_expect_success 'pretty format %(trailers:separator) changes separator' ' + git log --no-walk --pretty=format:"X%(trailers:separator=%x00)X" >actual && + ( + printf "XSigned-off-by: A U Thor \0" && + printf "Acked-by: A U Thor \0" && + printf "[ v2 updated patch description ]\0" && + printf "Signed-off-by: A U Thor\n X" + ) >expect && + test_cmp expect actual +' + +test_expect_success 'pretty format %(trailers:separator=X,unfold) changes separator' ' git log --no-walk --pretty=format:"X%(trailers:separator=%x00,unfold)X" >actual && ( printf "XSigned-off-by: A U Thor \0" && diff --git a/trailer.c b/trailer.c index 3f7391d793c..d2d01015b1d 100644 --- a/trailer.c +++ b/trailer.c @@ -1131,7 +1131,8 @@ static void format_trailer_info(struct strbuf *out, size_t i; /* If we want the whole block untouched, we can take the fast path. */ - if (!opts->only_trailers && !opts->unfold && !opts->filter && !opts->separator) { + if (!opts->only_trailers && !opts->unfold && !opts->filter && + !opts->separator && !opts->value_only) { strbuf_add(out, info->trailer_start, info->trailer_end - info->trailer_start); return; From patchwork Sun Dec 6 00:24:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 11953537 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 056F7C433FE for ; Sun, 6 Dec 2020 00:26:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BA1C62313C for ; Sun, 6 Dec 2020 00:26:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727432AbgLFAZy (ORCPT ); Sat, 5 Dec 2020 19:25:54 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40238 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726023AbgLFAZu (ORCPT ); Sat, 5 Dec 2020 19:25:50 -0500 Received: from mail-wr1-x441.google.com (mail-wr1-x441.google.com [IPv6:2a00:1450:4864:20::441]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 354DFC061A51 for ; Sat, 5 Dec 2020 16:25:10 -0800 (PST) Received: by mail-wr1-x441.google.com with SMTP id p8so9034155wrx.5 for ; Sat, 05 Dec 2020 16:25:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+RtIeatToMtXt/27bBURfZ5xM6JhFYERZvpCQHGHN6Q=; b=aniUROHp+a6f6WW7nFxyVKcaF/J4mD+Zj38dMi1JGmkundk3865QvGKJrvGqo3XU5d h/7b11ZgtDETbXr9fxzawUzCIy3gC6i6qYxEVGJtw+t0zM1IB/FRSSfpXIgORhkct1KA I21cSCVGXwpmc2R3+wJF9qahxRmVUXORRpR1qWN4i33TcyA7IjwjoYgyBORf+dTjRl0N G0EbsX+eAMP2A0uGY4rMpKFbbPxBMsio8RiI4O2ZDMqYkS49LL6nyfXRJVWjlUnnCuuz Js/9Mjvrr520608WDqyXZ5MGhnKharFCsaKsNzUXvLlebhpx2WcfZUlEYiQ2Javm9wZF vrJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+RtIeatToMtXt/27bBURfZ5xM6JhFYERZvpCQHGHN6Q=; b=gyJ/vaI7mhsMWlkvAqqwsMhQREql2xvKSReGG2jiS7OJX8jSm6Rh3VDkCmXsLXUHdJ h6dA6qwuU90H0WSMzfSUgYyVZNDJY+QmSd+OhaochgCqW1hgzQFS0qiOzOXTF1uAedYH meYNndDa4E71AOdrHdjW5JdSra2eow3ogqMGR3L4q682Rj7SUxf5H45FWo73Vjo+/0fE mJoBR2sjUaM4AjI+by9KuR1QjnW+lLoYZKRLVVKEP4/FP6O+MqOPnpJZgOSVqw7VY4ME TFGgXhi3xHP4g9LbmTzH1i6rJnqcSQHw0ThXBePmyYZ/Q/Jb+MyaTbAwMWB9n58IKnHi 5/3g== X-Gm-Message-State: AOAM5319gy+h2J7DIOkvI55g4+1e2s9qtLUg7qCed8PupsQz315ibEmQ CM/0klIYoIbJZG4rn21LAPsSUSLOxsH1LQ== X-Google-Smtp-Source: ABdhPJyBYZkxqf0+nKnmVeFTd37pnbyIboGTPwrgKZpPbv6WPV6qnH3ufM2KimYxWFOePIAJuTKVyw== X-Received: by 2002:adf:e481:: with SMTP id i1mr12063794wrm.282.1607214308541; Sat, 05 Dec 2020 16:25:08 -0800 (PST) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 34sm9144338wrh.78.2020.12.05.16.25.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 05 Dec 2020 16:25:07 -0800 (PST) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Anders Waldenborg , christian.couder@gmail.com, peff@peff.net, jonathantanmy@google.com, Hariom Verma , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBC?= =?utf-8?b?amFybWFzb24=?= Subject: [PATCH v2 4/5] pretty format %(trailers): add a "keyonly" Date: Sun, 6 Dec 2020 01:24:48 +0100 Message-Id: <20201206002449.31452-5-avarab@gmail.com> X-Mailer: git-send-email 2.29.2.222.g5d2a92d10f8 In-Reply-To: <20201205013918.18981-1-avarab@gmail.com> References: <20201205013918.18981-1-avarab@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Add support for a "keyonly". This allows for easier parsing out of the key and value. Before if you didn't want to make assumptions about how the key was formatted. You'd need to parse it out as e.g.: --pretty=format:'%H%x00%(trailers:separator=%x00%x00)' \ '%x00%(trailers:separator=%x00%x00,valueonly)' And then proceed to deduce keys by looking at those two and subtracting the value plus the hardcoded ": " separator from the non-valueonly %(trailers) line. Now it's possible to simply do: --pretty=format:'%H%x00%(trailers:separator=%x00%x00,keyonly)' \ '%x00%(trailers:separator=%x00%x00,valueonly)' Which at least reduces it to a state machine where you get N keys and correlate them with N values. Even better would be to have a way to change the ": " delimiter to something easily machine-readable (a key might contain ": " too). A follow-up change will add support for that. I don't really have a use-case for just "keyonly" myself. I suppose it would be useful in some cases as "key=*" matches case-insensitively, so a plain "keyonly" will give you the variants of the keys you matched. I'm mainly adding it to fix the inconsistency with "valueonly". Signed-off-by: Ævar Arnfjörð Bjarmason --- Documentation/pretty-formats.txt | 4 ++-- pretty.c | 1 + t/t4205-log-pretty-formats.sh | 31 ++++++++++++++++++++++++++++++- trailer.c | 9 ++++++--- trailer.h | 1 + 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index 66dfa122361..bf35f7cf219 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -282,8 +282,8 @@ option is given with no value, it's enabled. ** 'unfold[=BOOL]': make it behave as if interpret-trailer's `--unfold` option was given. E.g., `%(trailers:only,unfold=true)` unfolds and shows all trailer lines. -** 'valueonly[=BOOL]': skip over the key part of the trailer line and only - show the value part. +** 'keyonly[=BOOL]': only show the key part of the trailer. +** 'valueonly[=BOOL]': only show the value part of the trailer. 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 7a7708a0ea7..1237ee0e45d 100644 --- a/pretty.c +++ b/pretty.c @@ -1451,6 +1451,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ opts.separator = &sepbuf; } else if (!match_placeholder_bool_arg(arg, "only", &arg, &opts.only_trailers) && !match_placeholder_bool_arg(arg, "unfold", &arg, &opts.unfold) && + !match_placeholder_bool_arg(arg, "keyonly", &arg, &opts.key_only) && !match_placeholder_bool_arg(arg, "valueonly", &arg, &opts.value_only)) break; } diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index cb09a13249e..4c9f6eb7946 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -715,6 +715,22 @@ test_expect_success '%(trailers:key) without value is error' ' test_cmp expect actual ' +test_expect_success '%(trailers:keyonly) shows only keys' ' + git log --no-walk --pretty="format:%(trailers:keyonly)" >actual && + test_write_lines \ + "Signed-off-by" \ + "Acked-by" \ + "[ v2 updated patch description ]" \ + "Signed-off-by" >expect && + test_cmp expect actual +' + +test_expect_success '%(trailers:key=foo,keyonly) shows only key' ' + git log --no-walk --pretty="format:%(trailers:key=Acked-by,keyonly)" >actual && + echo "Acked-by" >expect && + test_cmp expect actual +' + test_expect_success '%(trailers:key=foo,valueonly) shows only value' ' git log --no-walk --pretty="format:%(trailers:key=Acked-by,valueonly)" >actual && echo "A U Thor " >expect && @@ -732,6 +748,12 @@ test_expect_success '%(trailers:valueonly) shows only values' ' test_cmp expect actual ' +test_expect_success '%(trailers:key=foo,keyonly,valueonly) shows nothing' ' + git log --no-walk --pretty="format:%(trailers:key=Acked-by,keyonly,valueonly)" >actual && + echo >expect && + test_cmp expect actual +' + test_expect_success 'pretty format %(trailers:separator) changes separator' ' git log --no-walk --pretty=format:"X%(trailers:separator=%x00)X" >actual && ( @@ -754,7 +776,7 @@ test_expect_success 'pretty format %(trailers:separator=X,unfold) changes separa test_cmp expect actual ' -test_expect_success 'pretty format %(trailers) combining separator/key/valueonly' ' +test_expect_success 'pretty format %(trailers) combining separator/key/keyonly/valueonly' ' git commit --allow-empty -F - <<-\EOF && Important fix @@ -781,6 +803,13 @@ test_expect_success 'pretty format %(trailers) combining separator/key/valueonly "Does not close any tickets" \ "Another fix #567, #890" \ "Important fix #1234" >expect && + test_cmp expect actual && + + git log --pretty="%s% (trailers:separator=%x2c%x20,key=Closes,keyonly)" HEAD~3.. >actual && + test_write_lines \ + "Does not close any tickets" \ + "Another fix Closes, Closes" \ + "Important fix Closes" >expect && test_cmp expect actual ' diff --git a/trailer.c b/trailer.c index d2d01015b1d..889b419a4f6 100644 --- a/trailer.c +++ b/trailer.c @@ -1132,7 +1132,7 @@ static void format_trailer_info(struct strbuf *out, /* If we want the whole block untouched, we can take the fast path. */ if (!opts->only_trailers && !opts->unfold && !opts->filter && - !opts->separator && !opts->value_only) { + !opts->separator && !opts->key_only && !opts->value_only) { strbuf_add(out, info->trailer_start, info->trailer_end - info->trailer_start); return; @@ -1154,8 +1154,11 @@ static void format_trailer_info(struct strbuf *out, if (opts->separator && out->len != origlen) strbuf_addbuf(out, opts->separator); if (!opts->value_only) - strbuf_addf(out, "%s: ", tok.buf); - strbuf_addbuf(out, &val); + strbuf_addbuf(out, &tok); + if (!opts->key_only && !opts->value_only) + strbuf_addstr(out, ": "); + if (!opts->key_only) + strbuf_addbuf(out, &val); if (!opts->separator) strbuf_addch(out, '\n'); } diff --git a/trailer.h b/trailer.h index cd93e7ddea7..d2f28776be6 100644 --- a/trailer.h +++ b/trailer.h @@ -71,6 +71,7 @@ struct process_trailer_options { int only_input; int unfold; int no_divider; + int key_only; int value_only; const struct strbuf *separator; int (*filter)(const struct strbuf *, void *); From patchwork Sun Dec 6 00:24:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 11953545 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 00EEDC433FE for ; Sun, 6 Dec 2020 00:26:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BFFB92313C for ; Sun, 6 Dec 2020 00:26:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726955AbgLFA0e (ORCPT ); Sat, 5 Dec 2020 19:26:34 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40330 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726023AbgLFA0d (ORCPT ); Sat, 5 Dec 2020 19:26:33 -0500 Received: from mail-wm1-x344.google.com (mail-wm1-x344.google.com [IPv6:2a00:1450:4864:20::344]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 677ADC061A52 for ; Sat, 5 Dec 2020 16:25:11 -0800 (PST) Received: by mail-wm1-x344.google.com with SMTP id a3so10281914wmb.5 for ; Sat, 05 Dec 2020 16:25:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=DTHFbVhDUv8EEB8HBCWBSFcFYN0XzA830DgCaKJ54LU=; b=fghb5tmFVQbSkCBPkvghbdv7+1W3BUHDQxw1wDywWFLBEKUq/JB7XSRamKpjUBrVUF 8tCT3qRxq3lv0JKn9WdId7csamUlFCr4Z4uP5pgGHZ0m0DI3A5jxudyE9ZrDPaep5SGq cJ5H3SSs5PkPwlq41KZ8M5tmqMeAxGzEVSa0M7jsN9puJdgKBt/2TNTipOm/3/R+MZjE mYZVJ7yay5q01D3OkYnNP7bu43beUwI1jmIR3pQKx3k/kItq9SQAIEE2wBzBksxxOWPS vJMWXclrZZ0qxU2n5LikaweHHD4mAzvXETIuQYkex2kOyHWsOeOKiJdIJEgNOOuK2O5j 5ZCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=DTHFbVhDUv8EEB8HBCWBSFcFYN0XzA830DgCaKJ54LU=; b=djdHjBvh8NitTF39fvSNhzMVtdlaEktsfbsp19blg1657VwXN7JOxIFbR5qwBicBUG WCrGjgWTP0r+pqS72e0IlewOLdSW2U4BwaUR2iX080v9fjtAieOwiW92beDBqAt4GgeS wMnYMjtkxHJA7o0cQ3LPEUedju14ey94/Ey9t6qdJjsEE57aXVDLJK6r0+Qmrc8JO2us 4jS85HkZFlCtu0r81zX4SIq/wvAhOvvsbe1ZM0RNkOCiAeZUqLSQKS7RmTkDxCSBn847 PRp1mdVXWvf+y/RPpJyTk02mwLvhGSqzzbKcF09PgnvCqHto1z3bNcEThietS8eLzQob dWaQ== X-Gm-Message-State: AOAM5333jGdWT2iqc2xquZoV+88j87hVAy0Znnn44mhwC2MdxSnPpZ7v sErI+HsyAeY9wpp3mbl/yQgDWktlGxK5Yg== X-Google-Smtp-Source: ABdhPJzmx9K0jYrBAvoxX2b1IL8KmHQJ9gVjNP+fOrjsrDIP5zbTqCixqvtBQIHAoLl98iyV3KnGsA== X-Received: by 2002:a1c:b7d4:: with SMTP id h203mr11406250wmf.59.1607214309802; Sat, 05 Dec 2020 16:25:09 -0800 (PST) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 34sm9144338wrh.78.2020.12.05.16.25.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 05 Dec 2020 16:25:08 -0800 (PST) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Anders Waldenborg , christian.couder@gmail.com, peff@peff.net, jonathantanmy@google.com, Hariom Verma , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBC?= =?utf-8?b?amFybWFzb24=?= Subject: [PATCH v2 5/5] pretty format %(trailers): add a "key_value_separator" Date: Sun, 6 Dec 2020 01:24:49 +0100 Message-Id: <20201206002449.31452-6-avarab@gmail.com> X-Mailer: git-send-email 2.29.2.222.g5d2a92d10f8 In-Reply-To: <20201205013918.18981-1-avarab@gmail.com> References: <20201205013918.18981-1-avarab@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Add a "key_value_separator" option to the "%(trailers)" pretty format, to go along with the existing "separator" argument. In combination these two options make it trivial to produce machine-readable (e.g. \0 and \0\0-delimited) format output. As elaborated on in a previous commit which added "keyonly" it was needlessly tedious to extract structured data from "%(trailers)" before the addition of this "key_value_separator" option. As seen by the test being added here extracting this data now becomes trivial. Signed-off-by: Ævar Arnfjörð Bjarmason --- Documentation/pretty-formats.txt | 4 ++++ pretty.c | 9 +++++++++ t/t4205-log-pretty-formats.sh | 33 ++++++++++++++++++++++++++++++++ trailer.c | 11 ++++++++--- trailer.h | 1 + 5 files changed, 55 insertions(+), 3 deletions(-) diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index bf35f7cf219..17050a78245 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -284,6 +284,10 @@ option is given with no value, it's enabled. `%(trailers:only,unfold=true)` unfolds and shows all trailer lines. ** 'keyonly[=BOOL]': only show the key part of the trailer. ** 'valueonly[=BOOL]': only show the value part of the trailer. +** 'key_value_separator=': specify a separator inserted between + trailer lines. When this option is not given each trailer key-value + pair is separated by ": ". Otherwise it shares the same semantics + as 'separator=' above. 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 1237ee0e45d..05eef7fda0b 100644 --- a/pretty.c +++ b/pretty.c @@ -1418,6 +1418,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ struct process_trailer_options opts = PROCESS_TRAILER_OPTIONS_INIT; struct string_list filter_list = STRING_LIST_INIT_NODUP; struct strbuf sepbuf = STRBUF_INIT; + struct strbuf kvsepbuf = STRBUF_INIT; size_t ret = 0; opts.no_divider = 1; @@ -1449,6 +1450,14 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ strbuf_expand(&sepbuf, fmt, strbuf_expand_literal_cb, NULL); free(fmt); opts.separator = &sepbuf; + } else if (match_placeholder_arg_value(arg, "key_value_separator", &arg, &argval, &arglen)) { + char *fmt; + + strbuf_reset(&kvsepbuf); + fmt = xstrndup(argval, arglen); + strbuf_expand(&kvsepbuf, fmt, strbuf_expand_literal_cb, NULL); + free(fmt); + opts.key_value_separator = &kvsepbuf; } else if (!match_placeholder_bool_arg(arg, "only", &arg, &opts.only_trailers) && !match_placeholder_bool_arg(arg, "unfold", &arg, &opts.unfold) && !match_placeholder_bool_arg(arg, "keyonly", &arg, &opts.key_only) && diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index 4c9f6eb7946..749bc1431ac 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -776,6 +776,39 @@ test_expect_success 'pretty format %(trailers:separator=X,unfold) changes separa test_cmp expect actual ' +test_expect_success 'pretty format %(trailers:key_value_separator) changes key-value separator' ' + git log --no-walk --pretty=format:"X%(trailers:key_value_separator=%x00)X" >actual && + ( + printf "XSigned-off-by\0A U Thor \n" && + printf "Acked-by\0A U Thor \n" && + printf "[ v2 updated patch description ]\n" && + printf "Signed-off-by\0A U Thor\n \nX" + ) >expect && + test_cmp expect actual +' + +test_expect_success 'pretty format %(trailers:key_value_separator,unfold) changes key-value separator' ' + git log --no-walk --pretty=format:"X%(trailers:key_value_separator=%x00,unfold)X" >actual && + ( + printf "XSigned-off-by\0A U Thor \n" && + printf "Acked-by\0A U Thor \n" && + printf "[ v2 updated patch description ]\n" && + printf "Signed-off-by\0A U Thor \nX" + ) >expect && + test_cmp expect actual +' + +test_expect_success 'pretty format %(trailers:separator,key_value_separator) changes both separators' ' + git log --no-walk --pretty=format:"%(trailers:separator=%x00,key_value_separator=%x00%x00,unfold)" >actual && + ( + printf "Signed-off-by\0\0A U Thor \0" && + printf "Acked-by\0\0A U Thor \0" && + printf "[ v2 updated patch description ]\0" && + printf "Signed-off-by\0\0A U Thor " + ) >expect && + test_cmp expect actual +' + test_expect_success 'pretty format %(trailers) combining separator/key/keyonly/valueonly' ' git commit --allow-empty -F - <<-\EOF && Important fix diff --git a/trailer.c b/trailer.c index 889b419a4f6..249ed618ed8 100644 --- a/trailer.c +++ b/trailer.c @@ -1132,7 +1132,8 @@ static void format_trailer_info(struct strbuf *out, /* If we want the whole block untouched, we can take the fast path. */ if (!opts->only_trailers && !opts->unfold && !opts->filter && - !opts->separator && !opts->key_only && !opts->value_only) { + !opts->separator && !opts->key_only && !opts->value_only && + !opts->key_value_separator) { strbuf_add(out, info->trailer_start, info->trailer_end - info->trailer_start); return; @@ -1155,8 +1156,12 @@ static void format_trailer_info(struct strbuf *out, strbuf_addbuf(out, opts->separator); if (!opts->value_only) strbuf_addbuf(out, &tok); - if (!opts->key_only && !opts->value_only) - strbuf_addstr(out, ": "); + if (!opts->key_only && !opts->value_only) { + if (opts->key_value_separator) + strbuf_addbuf(out, opts->key_value_separator); + else + strbuf_addstr(out, ": "); + } if (!opts->key_only) strbuf_addbuf(out, &val); if (!opts->separator) diff --git a/trailer.h b/trailer.h index d2f28776be6..795d2fccfd9 100644 --- a/trailer.h +++ b/trailer.h @@ -74,6 +74,7 @@ struct process_trailer_options { int key_only; int value_only; const struct strbuf *separator; + const struct strbuf *key_value_separator; int (*filter)(const struct strbuf *, void *); void *filter_data; };