From patchwork Sun Oct 31 17:15:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Schwartz X-Patchwork-Id: 12595399 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6B135C433EF for ; Sun, 31 Oct 2021 17:15:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 49AA460F4F for ; Sun, 31 Oct 2021 17:15:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230121AbhJaRSL (ORCPT ); Sun, 31 Oct 2021 13:18:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57874 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230075AbhJaRSK (ORCPT ); Sun, 31 Oct 2021 13:18:10 -0400 Received: from mail.archlinux.org (mail.archlinux.org [IPv6:2a01:4f9:c010:3052::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 15EA5C061714 for ; Sun, 31 Oct 2021 10:15:37 -0700 (PDT) From: Eli Schwartz DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-rsa; t=1635700535; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yansnfxaCmZi7VQJU6+3RuIe2AWssx9e9LGKZRy9vbU=; b=HeCXR0gtjmNMBCu+4tMj868TYrprlX6d2uRliGO88JPIlTnInFd7uWfD1AKponX89lLz+H AaBvNkWf0OlF1uC0l8zB9wNTu65GYc3Lan/uT4+tWuN0VcMmFDIK0TE49Up+4w6NYAqA2I v1/phyrTWng4mWDgOtw/Ou/ke+Dub2vuTdN4GyIAVebfgyuVPJGCKSxk10x77QoiOuWzZv risMJhl+eg99Ateh777s+sBxSrtZoHJBKoBpT7Rx9MyUUGLJ6/3AMpLiU409W/Xs9G+xiA UTtgcDGQz8bj5jAk3KBgHgD1+jEQHiBcE4Cr0QW/iNm4PA0k6Jqpht+3oE/VJzdav5dltT ks7i/GxZnS/XqdANN144xnmxGUh+Bh72UYyoDZQI7vJF2rSGQkLZQz1MK8DKbt1h54rv5I IzLqmxFHfiBcABw3RLdch11n8uBek0jzfnRG/a2U5/yCZnsCMZBvUfREya2ldXA7Mo0Kjn x0EWg1poTxTOYdrGH+XWUo6y9uvJrap4NtqOXaP0Pimae3e3Ox/UNEEDUMn/T2z1jj3ZbS p7mMRrQTuPtDm0fZKrNFMsBHfZxGoB0S4sylYGTw5sc++W/ct5A5qqWrAYIZCewWBOrwGF cfq83polcTfz/xSz5SuBJStR2Ne8vkS2DUOqXZHsJQkLXNAnFBoMs= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-ed25519; t=1635700535; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yansnfxaCmZi7VQJU6+3RuIe2AWssx9e9LGKZRy9vbU=; b=b7eZYIVqrP6KO3nj33hOaPTfOHcrsTZLm1Utbg4tANwDz3wTsxqBlickE75xsPZsZjwme6 2k6T5m0KyUmgfBDw== To: git@vger.kernel.org Cc: Junio C Hamano , Eric Sunshine Subject: [PATCH v4 1/3] pretty.c: rework describe options parsing for better extensibility Date: Sun, 31 Oct 2021 13:15:08 -0400 Message-Id: <20211031171510.1646396-2-eschwartz@archlinux.org> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211031171510.1646396-1-eschwartz@archlinux.org> References: <20211029184512.1568017-1-eschwartz@archlinux.org> <20211031171510.1646396-1-eschwartz@archlinux.org> MIME-Version: 1.0 Authentication-Results: mail.archlinux.org; auth=pass smtp.auth=eschwartz smtp.mailfrom=eschwartz@archlinux.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org It contains option arguments only, not options. We would like to add option support here too, but to do that we need to distinguish between different types of options. Lay out the groundwork for distinguishing between bools, strings, etc. and move the central logic (validating values and pushing new arguments to *args) into the successful match, because that will be fairly conditional on what type of argument is being parsed. Signed-off-by: Eli Schwartz --- pretty.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/pretty.c b/pretty.c index be477bd51f..c38acda8cb 100644 --- a/pretty.c +++ b/pretty.c @@ -1212,28 +1212,39 @@ int format_set_trailers_options(struct process_trailer_options *opts, static size_t parse_describe_args(const char *start, struct strvec *args) { - const char *options[] = { "match", "exclude" }; + struct { + char *name; + enum { + DESCRIBE_ARG_STRING, + } type; + } option[] = { + { "exclude", DESCRIBE_ARG_STRING }, + { "match", DESCRIBE_ARG_STRING }, + }; const char *arg = start; for (;;) { - const char *matched = NULL; + int found = 0; const char *argval; size_t arglen = 0; int i; - for (i = 0; i < ARRAY_SIZE(options); i++) { - if (match_placeholder_arg_value(arg, options[i], &arg, - &argval, &arglen)) { - matched = options[i]; + for (i = 0; !found && i < ARRAY_SIZE(option); i++) { + switch (option[i].type) { + case DESCRIBE_ARG_STRING: + if (match_placeholder_arg_value(arg, option[i].name, &arg, + &argval, &arglen)) { + if (!arglen) + return 0; + strvec_pushf(args, "--%s=%.*s", option[i].name, (int)arglen, argval); + found = 1; + } break; } } - if (!matched) + if (!found) break; - if (!arglen) - return 0; - strvec_pushf(args, "--%s=%.*s", matched, (int)arglen, argval); } return arg - start; } From patchwork Sun Oct 31 17:15:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Schwartz X-Patchwork-Id: 12595401 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 761B3C433F5 for ; Sun, 31 Oct 2021 17:15:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5CCF760F4C for ; Sun, 31 Oct 2021 17:15:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230149AbhJaRSM (ORCPT ); Sun, 31 Oct 2021 13:18:12 -0400 Received: from mail.archlinux.org ([95.216.189.61]:56368 "EHLO mail.archlinux.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229838AbhJaRSK (ORCPT ); Sun, 31 Oct 2021 13:18:10 -0400 From: Eli Schwartz DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-rsa; t=1635700537; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1ckWtLg/5cV01Im+qd6/g3sz7EhMh7YEFHLUwOtzy0k=; b=sUHXsrNF4I/AQPRImDEcrwLDwqAJfnT4KuWkmW12lVknMUuEzgyRicjhPk3YiLzvDd23mJ YQIfBmlfIoF428qIbhv9Fhh+QxmbM3OI913T6BiyfXKIRHLywcxZZntJCdhI6u/uekCPVA 0MrVNVIPspvtRudQzJ3PTSn9CcncXT/0vaV0oW34cqfB0aNGX6su8ml0pdu3QxQDBXRIQL aidXicuD7G8uaSNZ+o3ANBdyxbIyKJvFpevk4bzzelxkfo5hDhwugGlYO4X7xlY06bHglk ndmyfcl9hs+0mKh5Aw2bh3ItKmdTIVf3SbP3mBh44HVFVxJKBjkQs1PSFcnebrE4PUGPUJ ri+BYJj765lWKxV2UekKDn1UFVxnWLRlObwS2Sxytjt+GbB80mNpES1A3rguYuD466Egpn VrgKbNv1GHXobGTLO0zchVQHjGrSKKP1koisP7BTTxSBGd5NUVns9loNeeZ6rZRylge4bV WxATNK1g+ZuMfS8lODPBYT8ytw9NxxfXOm+OjDl/Y8HMll6otQexa2LV61TB82W5XJqRR7 m7rqZgzwyYFAPZUo4tH5V8ucSF1h+EUn+p5dC+9qbP5JOI/tk8nMZqK7iIgAmFUOCHuwLs VoVBpIIFMDaC7iOEClMQ5Q3a7+UJ0DXXNyZ16CGnZBfhAguWr/eN4= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-ed25519; t=1635700537; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1ckWtLg/5cV01Im+qd6/g3sz7EhMh7YEFHLUwOtzy0k=; b=acwwqvY8VsegbCrs4kKZmfKRVe1RxrzUNAcYFk6t0dO+HRidj4c/vLBxOAh59U1Q9o1SV1 hjEABcLPZUt44UDw== To: git@vger.kernel.org Cc: Junio C Hamano , Eric Sunshine Subject: [PATCH v4 2/3] pretty: add tag option to %(describe) Date: Sun, 31 Oct 2021 13:15:09 -0400 Message-Id: <20211031171510.1646396-3-eschwartz@archlinux.org> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211031171510.1646396-1-eschwartz@archlinux.org> References: <20211029184512.1568017-1-eschwartz@archlinux.org> <20211031171510.1646396-1-eschwartz@archlinux.org> MIME-Version: 1.0 Authentication-Results: mail.archlinux.org; auth=pass smtp.auth=eschwartz smtp.mailfrom=eschwartz@archlinux.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org The %(describe) placeholder by default, like `git describe`, only supports annotated tags. However, some people do use lightweight tags for releases, and would like to describe those anyway. The command line tool has an option to support this. Teach the placeholder to support this as well. Signed-off-by: Eli Schwartz --- I use lowercase "bool" here not "boolean-value" because I don't see utility in the word "value" here. Documentation/pretty-formats.txt | 12 +++++++----- pretty.c | 12 ++++++++++++ t/t4205-log-pretty-formats.sh | 8 ++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index ef6bd420ae..1ee47bd4a3 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -220,6 +220,8 @@ The placeholders are: inconsistent when tags are added or removed at the same time. + +** 'tags[=]': Instead of only considering annotated tags, + consider lightweight tags as well. ** 'match=': Only consider tags matching the given `glob(7)` pattern, excluding the "refs/tags/" prefix. ** 'exclude=': Do not consider tags matching the given @@ -273,11 +275,6 @@ endif::git-rev-list[] If any option is provided multiple times the last occurrence 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 @@ -313,6 +310,11 @@ insert an empty string unless we are traversing reflog entries (e.g., by decoration format if `--decorate` was not already provided on the command line. +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. + If you add a `+` (plus sign) after '%' of a placeholder, a line-feed is inserted immediately before the expansion if and only if the placeholder expands to a non-empty string. diff --git a/pretty.c b/pretty.c index c38acda8cb..403d89725a 100644 --- a/pretty.c +++ b/pretty.c @@ -1215,9 +1215,11 @@ static size_t parse_describe_args(const char *start, struct strvec *args) struct { char *name; enum { + DESCRIBE_ARG_BOOL, DESCRIBE_ARG_STRING, } type; } option[] = { + { "tags", DESCRIBE_ARG_BOOL}, { "exclude", DESCRIBE_ARG_STRING }, { "match", DESCRIBE_ARG_STRING }, }; @@ -1227,10 +1229,20 @@ static size_t parse_describe_args(const char *start, struct strvec *args) int found = 0; const char *argval; size_t arglen = 0; + int optval = 0; int i; for (i = 0; !found && i < ARRAY_SIZE(option); i++) { switch (option[i].type) { + case DESCRIBE_ARG_BOOL: + if (match_placeholder_bool_arg(arg, option[i].name, &arg, &optval)) { + if (optval) + strvec_pushf(args, "--%s", option[i].name); + else + strvec_pushf(args, "--no-%s", option[i].name); + found = 1; + } + break; case DESCRIBE_ARG_STRING: if (match_placeholder_arg_value(arg, option[i].name, &arg, &argval, &arglen)) { diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index 5865daa8f8..d4acf8882f 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -1002,4 +1002,12 @@ test_expect_success '%(describe:exclude=...) vs git describe --exclude ...' ' test_cmp expect actual ' +test_expect_success '%(describe:tags) vs git describe --tags' ' + test_when_finished "git tag -d tagname" && + git tag tagname && + git describe --tags >expect && + git log -1 --format="%(describe:tags)" >actual && + test_cmp expect actual +' + test_done From patchwork Sun Oct 31 17:15:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Schwartz X-Patchwork-Id: 12595403 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 94B35C433FE for ; Sun, 31 Oct 2021 17:15:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7596460F59 for ; Sun, 31 Oct 2021 17:15:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230169AbhJaRSN (ORCPT ); Sun, 31 Oct 2021 13:18:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57884 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230125AbhJaRSL (ORCPT ); Sun, 31 Oct 2021 13:18:11 -0400 Received: from mail.archlinux.org (mail.archlinux.org [IPv6:2a01:4f9:c010:3052::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B488AC061570 for ; Sun, 31 Oct 2021 10:15:39 -0700 (PDT) From: Eli Schwartz DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-ed25519; t=1635700538; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pIaURuEBsurzwcGCN8gKIjLp5vQiV+LE+ytGN/eif/w=; b=CdLM0aoYEeHfGZvu9T8nB2AGTwzsiddFh0G3vNT9duG2L9eyUoD6zKVxq7du3FdgOcxFWH txPMwA/iHaKQGDBA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-rsa; t=1635700538; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pIaURuEBsurzwcGCN8gKIjLp5vQiV+LE+ytGN/eif/w=; b=fXgABB5I38Rvd5JPMOC95a45RaEjTu+KdmctXw7gskTJmZ7U9neXPcQKBfDqwMR5Up8WK6 HyBZ870xDiFlTMHjE/FZvZmiWSMnHRDBz8zyHKar9wh9slNVlskTcnqCBdODaw+CZU4Ign puSEi//gq74I8PfhzJez4pr2MmfYlTWJxqVBKNqx71EOMRaAoOe/gfqF32ebPOcyEapzfI bMQX9N5/YOdFypTDtQ17yf2GDNYhfRstFGaynSTH8ifbJPeaDJciEGXxcSJnqOcQaPRYi2 MwWJXaSpnl/EzPwIl4XJr4WtCHugoXxhDgjTHrx0xeFnpnzU57x1iC80egtOEJfdpO7ngT 5CpBGrxqA/IaQ13T/NRpJEBfJMU5LqhL9Y4sCMIrJHsLlKfF1FELRAvpVknpbAKHcG2/XO BBIIRr5hv3AA5vQ8p12bmihhAy75Pv3zaGKNVhwNAE8hAsIco5g0xwjNIccHJOlP85OpTQ 3p8Ajliu/1hIhxz+kN8hSKaYmgvD/IsH6KmmR41TLSPZszqf0DYYMmBudf2euG5NdFc2S6 liOFyrm93DbtW0+qmZ2OQnueLMbkLpQrO6Pw6TAuXeEOksAOnoldXWzAyKj/a5nlr3xiag hhMDqyChM0kfqZNQTgYCuZiXWvB4C0ziINXTfwLCRW/CMngRcDsAI= To: git@vger.kernel.org Cc: Junio C Hamano , Eric Sunshine Subject: [PATCH v4 3/3] pretty: add abbrev option to %(describe) Date: Sun, 31 Oct 2021 13:15:10 -0400 Message-Id: <20211031171510.1646396-4-eschwartz@archlinux.org> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211031171510.1646396-1-eschwartz@archlinux.org> References: <20211029184512.1568017-1-eschwartz@archlinux.org> <20211031171510.1646396-1-eschwartz@archlinux.org> MIME-Version: 1.0 Authentication-Results: mail.archlinux.org; auth=pass smtp.auth=eschwartz smtp.mailfrom=eschwartz@archlinux.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org The %(describe) placeholder by default, like `git describe`, uses a seven-character abbreviated commit object name. This may not be sufficient to fully describe all commits in a given repository, resulting in a placeholder replacement changing its length because the repository grew in size. This could cause the output of git-archive to change. Add the --abbrev option to `git describe` to the placeholder interface in order to provide tools to the user for fine-tuning project defaults and ensure reproducible archives. One alternative would be to just always specify --abbrev=40 but this may be a bit too biased... Signed-off-by: Eli Schwartz --- Documentation/pretty-formats.txt | 4 ++++ pretty.c | 15 +++++++++++++++ t/t4205-log-pretty-formats.sh | 8 ++++++++ 3 files changed, 27 insertions(+) diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index 1ee47bd4a3..9e943fb74b 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -222,6 +222,10 @@ The placeholders are: + ** 'tags[=]': Instead of only considering annotated tags, consider lightweight tags as well. +** 'abbrev=': Instead of using the default number of hexadecimal digits + (which will vary according to the number of objects in the repository with a + default of 7) of the abbreviated object name, use digits, or as many + digits as needed to form a unique object name. ** 'match=': Only consider tags matching the given `glob(7)` pattern, excluding the "refs/tags/" prefix. ** 'exclude=': Do not consider tags matching the given diff --git a/pretty.c b/pretty.c index 403d89725a..fa9bfea273 100644 --- a/pretty.c +++ b/pretty.c @@ -1216,10 +1216,12 @@ static size_t parse_describe_args(const char *start, struct strvec *args) char *name; enum { DESCRIBE_ARG_BOOL, + DESCRIBE_ARG_INTEGER, DESCRIBE_ARG_STRING, } type; } option[] = { { "tags", DESCRIBE_ARG_BOOL}, + { "abbrev", DESCRIBE_ARG_INTEGER }, { "exclude", DESCRIBE_ARG_STRING }, { "match", DESCRIBE_ARG_STRING }, }; @@ -1243,6 +1245,19 @@ static size_t parse_describe_args(const char *start, struct strvec *args) found = 1; } break; + case DESCRIBE_ARG_INTEGER: + if (match_placeholder_arg_value(arg, option[i].name, &arg, + &argval, &arglen)) { + char *endptr; + if (!arglen) + return 0; + strtol(argval, &endptr, 10); + if (endptr - argval != arglen) + return 0; + strvec_pushf(args, "--%s=%.*s", option[i].name, (int)arglen, argval); + found = 1; + } + break; case DESCRIBE_ARG_STRING: if (match_placeholder_arg_value(arg, option[i].name, &arg, &argval, &arglen)) { diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index d4acf8882f..35eef4c865 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -1010,4 +1010,12 @@ test_expect_success '%(describe:tags) vs git describe --tags' ' test_cmp expect actual ' +test_expect_success '%(describe:abbrev=...) vs git describe --abbrev=...' ' + test_when_finished "git tag -d tagname" && + git tag -a -m tagged tagname && + git describe --abbrev=15 >expect && + git log -1 --format="%(describe:abbrev=15)" >actual && + test_cmp expect actual +' + test_done