From patchwork Tue Oct 26 01:34:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Schwartz X-Patchwork-Id: 12583745 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 3D8C0C433FE for ; Tue, 26 Oct 2021 01:36:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 245FF610A0 for ; Tue, 26 Oct 2021 01:36:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234456AbhJZBif (ORCPT ); Mon, 25 Oct 2021 21:38:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51192 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233383AbhJZBie (ORCPT ); Mon, 25 Oct 2021 21:38:34 -0400 Received: from mail.archlinux.org (mail.archlinux.org [IPv6:2a01:4f9:c010:3052::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 79408C061767 for ; Mon, 25 Oct 2021 18:36:11 -0700 (PDT) From: Eli Schwartz DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-rsa; t=1635212169; 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=mRqCGXT694D6/tXnlk/aVyfUkIPx4w5q1p6v/I43Znc=; b=XhALJ8Br8y4uPqDYuSh0dOHR64N8aPQ3K2LSToYRnfZX3+HoGAXVE5NKsZcRKwPv9lRIMo ljHYdqhGh1XZMtxkWGrjMIbxnV4GDVggEnILuMoPEeoZTPf2/r5nG+pWUI2jVFCuQV5mel plt+hroFDsN+d0oh45LibPZ9ThRP4EnnSzT/bv2yYF8jz3FzSI2w2521pOVdd4z3/uHizs ZIIGOGVwTTHtpaRIC9RZ7Eh6GDUMITRDM4GEzp5HXhZoXr9Te32Gb7gzd2qE0Q+Qv//L8U CscG7okZVl17lMIP5yolQQkWxNzgjrAT76nd5293bUvPVNYa/6MEWvG/0Kf8jObkOIXOkF fedOoIRJFZtj54viMHOsHXVaybI/egBQ8pDs5Lxt1WJ4SGbkNWGxwOZzsg9KKHpxOIJAY7 m7f0Ug1Qyp22Ki4SKZpFhi983f5RxLQ4VvmInigU4c2Xn2nNrzd6zkzjtSWdrAldkShFbw O64Q3LLIflbOcJ1kYMbHprrPpRC/GGGInEYuXihFEaVg4NTywPO8u0eEFD3JMF11snI+tJ EF9EITvHrez+NRaMlGmXPx2cwfTm2Zwrwv3QB3TIHd0XnEWglbpe203vdrQeF8F1Wa9ylr btBbvkqfZQ8odvDPQAV/uEgijlcVqBfYrlSZvkxyqaw85nCh8dadE= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-ed25519; t=1635212169; 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=mRqCGXT694D6/tXnlk/aVyfUkIPx4w5q1p6v/I43Znc=; b=Yaj/U5O6bKHChojBqlB26B3N+r+OMDhWOeSu9heCFNEEktoLHOH0b7P+OwbVIjfeRVEEdW RdSGJcNZJzT0wuCA== To: git@vger.kernel.org Subject: [PATCH v2 1/3] pretty.c: rework describe options parsing for better extensibility Date: Mon, 25 Oct 2021 21:34:50 -0400 Message-Id: <20211026013452.1372122-2-eschwartz@archlinux.org> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211026013452.1372122-1-eschwartz@archlinux.org> References: <20211024014256.3569322-1-eschwartz@archlinux.org> <20211026013452.1372122-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 73b5ead509..f8b254d2ff 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) && 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 Tue Oct 26 01:34:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Schwartz X-Patchwork-Id: 12583749 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 563AFC4332F for ; Tue, 26 Oct 2021 01:36:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3CD0F61057 for ; Tue, 26 Oct 2021 01:36:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234697AbhJZBig (ORCPT ); Mon, 25 Oct 2021 21:38:36 -0400 Received: from mail.archlinux.org ([95.216.189.61]:56260 "EHLO mail.archlinux.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230183AbhJZBie (ORCPT ); Mon, 25 Oct 2021 21:38:34 -0400 From: Eli Schwartz DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-rsa; t=1635212170; 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=x9SgceT0wI88dfDWZ30KVwiUMHCsAn71fl8Qt1Wq0lM=; b=Q777PZIBUYB1CFwYuZ8arZ+rYrfTNS6zcO/lvS6BLWAv+zYxgMOdkXEzX9w1Zno0fU+skT ye8kNTIR4+If1brjc/F9Sgtj5HVW8jk7zySA1urG8xhj2UQvTypzWcxLEljasjYlBCyzic b/Qse/SbkBnx0j69VitIlFIJWT1y0aDx8uXWvNf+2Ald0TDxsgD93gVcJbWpi0TyeGMGD5 vYwdJoc5armqNuwpW63IkwgPlfGjhbngXAwyIPxHA7leOmqRU8EEMrGvxKUUCmHGWqtd0F BLanl52hlylT8AQCFfctq39hlWb1Q1Jk168a2V2yKpvWokfD/7KDFUWVSE9OQ13dO4oB9f lFuj/jCDsYpnNo1hAePg8uSfF40o0Xi8ipBRyRLaMPnN3Fs1qW971nrbRGmeAL8Giv2c0F SaNjrN1fFkq/aaNExsL3cD5NIC8UI9M9f9x+s4/3Tgtp9tjvc8abmLWcy6ykU/F9tnNCRv 4D8+Vu4DjhL1NNBZw6Ha3LTYhLihj9Zg5q7g7ti/y9Wf285utuuykqdKqmhrbbPWyX0lBS oRrOOIiW6wUXV1WrWJ6WUPCAQZ3dLznEAOEVQ72oISIpyOMXIVT43QNIvg1Re/4BuBAbmV SHmxG2rRnsytXYiwUD3S+7nRv2GrfcO6ZKvYsFQXJGS0/9V8SV9Xw= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-ed25519; t=1635212170; 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=x9SgceT0wI88dfDWZ30KVwiUMHCsAn71fl8Qt1Wq0lM=; b=iMgkDFDcAedLA9YIAeCoxuio9E+cm5EB7Uf3B2uaK5T3SpzRID0o1Moyqd2/rL42rjBDhp id78/e1EmfVNDqDw== To: git@vger.kernel.org Subject: [PATCH v2 2/3] pretty: add tag option to %(describe) Date: Mon, 25 Oct 2021 21:34:51 -0400 Message-Id: <20211026013452.1372122-3-eschwartz@archlinux.org> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211026013452.1372122-1-eschwartz@archlinux.org> References: <20211024014256.3569322-1-eschwartz@archlinux.org> <20211026013452.1372122-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 | 14 +++++++++++++- t/t4205-log-pretty-formats.sh | 8 ++++++++ 3 files changed, 28 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 f8b254d2ff..16b5366fed 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,21 @@ 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) && 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 Tue Oct 26 01:34:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Schwartz X-Patchwork-Id: 12583751 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 28BEAC433F5 for ; Tue, 26 Oct 2021 01:36:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0E00761057 for ; Tue, 26 Oct 2021 01:36:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234890AbhJZBij (ORCPT ); Mon, 25 Oct 2021 21:38:39 -0400 Received: from mail.archlinux.org ([95.216.189.61]:56262 "EHLO mail.archlinux.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234106AbhJZBif (ORCPT ); Mon, 25 Oct 2021 21:38:35 -0400 From: Eli Schwartz DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-rsa; t=1635212171; 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=X/f0sQnfvMoa7873ED7GwcmfI6yYxjM2uA2Xr82KtVI=; b=HnDdrtynY5S03jJ6AJDYxDlvJVtmColEvAjv6IqjWIvnzO1gtHYzKT5CSQW9ujIu8OZ14u 0tWFIaisJvSuoMpywpzOjhBsBvVmbXZxtuXhms0f7uXwcj2YVVnS9lexHAmKCWQtiEeMqQ bdDpKVszykjG9KlSHBLRwwLywTBPziEMfryRiB/ulF///p68Y31AdZvIx99/055EgFIy0l ZUOVEvpr4/9lt1rsoB+g2lo46mpUgqMgYpjYoktoPImTAn5p0oBmhiZthDdVAjwksllkAb 7X/d7IQJHkOQwsuR68gE7t/DIEXj4IwnqCHYYRhaxGWnABEnB373oNxxXuth5pOe+Z6YC4 plB+6lMyt24Leyi7BQB5Ov7KH6h4v3NHIOTPbi/mmrDT6fRtLilmtlnYd8hZ6enZfCJm/s ATicl2+y3X9cT+zI/TWoxvnz9enuueEbGn5gnU6kQJI4KLq7Q6AkaaFmhWykhvH2UPc49n S13Ft5X8invcLFkgGfi1lXydu+NV1vLoVwnCS3sMvJJexv6qvejt0tXX9ZEVjR0Ks+DBBL IU0AAX7IvnB/O3dFrKfoXPgRRra4AQx/DHn7dmIJFTL47mzxFF3Q0lDYTV1GNSX3Gv3vX/ /fmXyqCeUPGH4lS5hJfNDtjaEwiqb4/v0uerIccd4pDzWTtMpzFbw= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-ed25519; t=1635212171; 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=X/f0sQnfvMoa7873ED7GwcmfI6yYxjM2uA2Xr82KtVI=; b=GYcMYCIjWG8NHmRH9HFH9Hx3lthZpqhRMrAUjaLy80KVjoBfxPM6USykQq53Kk4PodDOI3 OQRBNxBMUtPwuABg== To: git@vger.kernel.org Subject: [PATCH v2 3/3] pretty: add abbrev option to %(describe) Date: Mon, 25 Oct 2021 21:34:52 -0400 Message-Id: <20211026013452.1372122-4-eschwartz@archlinux.org> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211026013452.1372122-1-eschwartz@archlinux.org> References: <20211024014256.3569322-1-eschwartz@archlinux.org> <20211026013452.1372122-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 --- Notes: With regard to validating that an integer is passed, I attempt to parse the result using the same mechanism git-describe itself does in the abbrev callback, just with slightly different validation of what we have at the end... because of course here argval is the entire rest of the format string, including the ")". While testing that this actually does what it's supposed to do, I noticed that it doesn't validate junk like leading whitespace or plus signs... this is a problem for `git describe --abbrev=' +15'` too so I guess it's not my problem to fix... 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 16b5366fed..44bfc49b38 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 }, }; @@ -1245,6 +1246,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) && arglen) { + if (!arglen) + return 0; + char* endptr; + 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) && 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