From patchwork Fri Oct 29 18:45: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: 12593339 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 E1FE0C433FE for ; Fri, 29 Oct 2021 18:45:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C897D60F4B for ; Fri, 29 Oct 2021 18:45:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231400AbhJ2SsP (ORCPT ); Fri, 29 Oct 2021 14:48:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47338 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231346AbhJ2Srz (ORCPT ); Fri, 29 Oct 2021 14:47:55 -0400 Received: from mail.archlinux.org (mail.archlinux.org [IPv6:2a01:4f9:c010:3052::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1706CC061766 for ; Fri, 29 Oct 2021 11:45:26 -0700 (PDT) From: Eli Schwartz DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-rsa; t=1635533123; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YThjquv3Yec1PDy2Xp0D8f+sRIjrEWH9sfj9grFHTH0=; b=RKJ1ymOmSbu5xvridPgXUcx53xyMjUhP7DX/OMh+/5CFFYF/iWTPPYfjsY/IBPSgMHUyW4 lD8d1qvzF/XBSUD7TAohoE0tMn6GXAtGI4OxDIKdgDCD2L3vdUCAHM+ohUsGoyyqZZSlqa wP+k+VAkKqvVqd8MhCTzPhPlp1dyMD+/nU4DD9rjJbj4onVSweoz/5Qq4gU6JQt9vxlX5Q TMX2Hv3fbkQhwgLknAhdhKLqgm657ryg50NRTq6qjxQfyNCDVYFef4Lqyml2j5+RHAHQor kTYHMdvclgn2nI96MFh4zMXcVUllDaGNcUabk7g1aCxRTdpsUv1lUx1Ejfpr1wYeKCL7ko WAI7Vb/dgI8es7nWfy+Cl9LWqZuPcqjYV8/dmWH3cQ/aDtbbimUGV2+jrjXZ+dQd+DEb1n GjS/IlbntbtTW9e8j+Of59Mj0HWcV13ozcn5dromEUU3mQkeIhsE+69i69kjWLST1KJ72J KelbYefVSqtM+5nZOEoFT0EPdbzde5NlZoSu6310Yko77g/kgg57DNpG6RpZ/VepHtAHC4 NuwS6Dg3a+Th0YPajB3nNPhI0bgNfNEgfCpp6UzR9eILXIGeEgxAu/+/OxHkVudaHJkE6f Y7BAPFAHbHzYBNfrFaOrKfBtVJZ0xw/9t48N7fHQj2Y03dByWvmNc= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-ed25519; t=1635533123; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YThjquv3Yec1PDy2Xp0D8f+sRIjrEWH9sfj9grFHTH0=; b=xEF6/N/FiSNINjVngXRE/5CRUHmZ+i7gokxZKcb5eBxSeoDoOl2IkpavB6ZtiFXXWc+RI4 3e31bMxu+KNe+kBw== To: git@vger.kernel.org Subject: [PATCH v3 1/3] pretty.c: rework describe options parsing for better extensibility Date: Fri, 29 Oct 2021 14:45:10 -0400 Message-Id: <20211029184512.1568017-2-eschwartz@archlinux.org> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211029184512.1568017-1-eschwartz@archlinux.org> References: <20211026013452.1372122-1-eschwartz@archlinux.org> <20211029184512.1568017-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 | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/pretty.c b/pretty.c index fe95107ae5..2ec023a0d0 100644 --- a/pretty.c +++ b/pretty.c @@ -1216,28 +1216,37 @@ 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 { OPT_STRING } type; + } option[] = { + { "exclude", OPT_STRING }, + { "match", OPT_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 OPT_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 Fri Oct 29 18:45:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Schwartz X-Patchwork-Id: 12593335 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 4A70CC433F5 for ; Fri, 29 Oct 2021 18:45:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 35AF3610A0 for ; Fri, 29 Oct 2021 18:45:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231318AbhJ2SsK (ORCPT ); Fri, 29 Oct 2021 14:48:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47340 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231147AbhJ2Srz (ORCPT ); Fri, 29 Oct 2021 14:47:55 -0400 Received: from mail.archlinux.org (mail.archlinux.org [IPv6:2a01:4f9:c010:3052::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1730AC061767 for ; Fri, 29 Oct 2021 11:45:26 -0700 (PDT) From: Eli Schwartz DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-rsa; t=1635533124; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PdqJ83aV+pbBmZHr/NZgKq4XPCpZ6hsBtSTp2JmpMKo=; b=Djf21ZTUcoO4Lm8yvbpfZGXohCMBhLJ8U+IHA8zzSrD6J6UniVPMyAlay5Z8XSQDvHL3m2 dVDIqTySCA9skDIXLQiU4bs+16yQAbWG2Tx0PNsMK61of7BdnHsKQDo8iMmufYyFyc874t RfksL4YvWaq1QkspTVKr1mBXZQ/sJDZmyYrqBSVO6Fdm2QLo2OgPuy79pKpTjmONg+lLBt chhXEhP4vVFCa0fMlv4dhpsDENcvzM401upmPwSDDd399FHjKJygWpyzBUyTAX5cYs5tWW CgDggOS9DbdFoYuKRGlJEUlGr0MhGwK19C782LqVBJsX5mRuAqRMk0IOtdrBG8aTA4S9g7 oZyKafQIHWL0k+/JaforIZ4+s+YwjA83ZBzkBxibbme+w7+NUsNlHyVZA4cZBrsiR60ZDt iyG9GGxL41o6zUuWhuu4U0WSa/N8jVVJvjdDmh1H5einn0LvgrZ4g6v4vGcJV4gspbzU9N GQlegQXtv6sOdDkwT7iGi/REJdgaCII6DKCxfh2mhyoyDe56+s/8g0+lSCRFpnW9RmScOG dlT4L1UszUGHffWd0wGBdimw1eWscX3f8BvB2vVWlFUkpLOy0VOxDR7oEVp7CexFOnREAa 10vqb2/Y5FyblY+nuW7Z4aC8tXu96V2u1XLVsIpqii835zKRCx2lg= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-ed25519; t=1635533124; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PdqJ83aV+pbBmZHr/NZgKq4XPCpZ6hsBtSTp2JmpMKo=; b=79i1DkXPgLxxE4ky0kJ5C/WLoRQf7blnMtK3wOXCu7+q4Q2ZKrHxILBcUukfsWlQ6u7AOD Buv1l4wJJrNWo5Cg== To: git@vger.kernel.org Subject: [PATCH v3 2/3] pretty: add tag option to %(describe) Date: Fri, 29 Oct 2021 14:45:11 -0400 Message-Id: <20211029184512.1568017-3-eschwartz@archlinux.org> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211029184512.1568017-1-eschwartz@archlinux.org> References: <20211026013452.1372122-1-eschwartz@archlinux.org> <20211029184512.1568017-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 --- Documentation/pretty-formats.txt | 12 +++++++----- pretty.c | 13 ++++++++++++- t/t4205-log-pretty-formats.sh | 8 ++++++++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index ef6bd420ae..86ed801aad 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 2ec023a0d0..a105ef2a15 100644 --- a/pretty.c +++ b/pretty.c @@ -1218,8 +1218,9 @@ static size_t parse_describe_args(const char *start, struct strvec *args) { struct { char *name; - enum { OPT_STRING } type; + enum { OPT_BOOL, OPT_STRING, } type; } option[] = { + { "tags", OPT_BOOL}, { "exclude", OPT_STRING }, { "match", OPT_STRING }, }; @@ -1229,10 +1230,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 OPT_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 OPT_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 Fri Oct 29 18:45:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Schwartz X-Patchwork-Id: 12593337 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 CD236C433F5 for ; Fri, 29 Oct 2021 18:45:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B865461056 for ; Fri, 29 Oct 2021 18:45:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231382AbhJ2SsN (ORCPT ); Fri, 29 Oct 2021 14:48:13 -0400 Received: from mail.archlinux.org ([95.216.189.61]:56302 "EHLO mail.archlinux.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231315AbhJ2Srz (ORCPT ); Fri, 29 Oct 2021 14:47:55 -0400 From: Eli Schwartz DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-rsa; t=1635533125; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9qzDmFAw+LyZhh61h8K/ihiciA+EUgudTl+H1yRGkLo=; b=wgVebFqNEBWr2bAurWHEhyuvrqEshJZ9df8uffajF05XtWoBuCpxdFQkmFqBQD1NCkFT/7 lWZtUd93R/ltCc3jLL36ndL7YY7CCAWARKBt0NwkzJz9mmH8x9o+kb2+LolVghcVCaFVec cFdOPWG6rAAdxh+kfICjlpYGLqmrbDfMaAKNNzeTAE8MuxbtIm2ckUuUNu5JEDM0t2R6+2 asWDXBo/CLUChYRqZp4J0AGhTgJ8j/Uxm2QmpVvALxcc9yd/oeSeogNPqdcfVBPxeX/+Cb UHYymdxOHkbqFe/kxMlQtjYR3t1X0Cc0DT7OlltwNTm+yyW/B55Y1+zQRVXjjm8iMbPzpq oDQUPVvRkENIhnodSR+KiNgkeLSvd5uhoYyQRZ9yokaEAOE6duQTxH6TxuJ+657NR/NHrY 22vKaH6tcWws9LXEwR9DccITDe8e4Ltwfgc5YzOFBth8yRwvejd/cJtcFEoG6ikPcJa2xk q3ILgg8lUxfD633ebxek5fqu72Wvfd14UXPNuYe5Gh/QXelEhPbihCQCMNaqYkZXVQRoJ1 DvFXgiG5hRiOSurTK98Bnx6V/zKESEyyXBBHXs9fV8DD8J8eZNETU92LUhW/z0sab/E2uy MhdYZa2JrNPL6MiXzsOsOa0o5zwFNBuXE4ag7oUYZVlQ8tYMMEtVs= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-ed25519; t=1635533125; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9qzDmFAw+LyZhh61h8K/ihiciA+EUgudTl+H1yRGkLo=; b=yTnVpZlNFH1bZ/BW4KAs7HrdPVxHk6Y1VA9JbimqZwCoPeaqGGTSmF0l+/B+poCBvqxeMw WAf+KRPnIg1RX8Ag== To: git@vger.kernel.org Subject: [PATCH v3 3/3] pretty: add abbrev option to %(describe) Date: Fri, 29 Oct 2021 14:45:12 -0400 Message-Id: <20211029184512.1568017-4-eschwartz@archlinux.org> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211029184512.1568017-1-eschwartz@archlinux.org> References: <20211026013452.1372122-1-eschwartz@archlinux.org> <20211029184512.1568017-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 | 16 +++++++++++++++- t/t4205-log-pretty-formats.sh | 8 ++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index 86ed801aad..57fd84f579 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 a105ef2a15..5662cb2943 100644 --- a/pretty.c +++ b/pretty.c @@ -1218,9 +1218,10 @@ static size_t parse_describe_args(const char *start, struct strvec *args) { struct { char *name; - enum { OPT_BOOL, OPT_STRING, } type; + enum { OPT_BOOL, OPT_INTEGER, OPT_STRING, } type; } option[] = { { "tags", OPT_BOOL}, + { "abbrev", OPT_INTEGER }, { "exclude", OPT_STRING }, { "match", OPT_STRING }, }; @@ -1244,6 +1245,19 @@ static size_t parse_describe_args(const char *start, struct strvec *args) found = 1; } break; + case OPT_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 OPT_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