From patchwork Mon Sep 13 00:13:19 2021 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: 12487731 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.8 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 2F6B8C43217 for ; Mon, 13 Sep 2021 00:13:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1248F60EE7 for ; Mon, 13 Sep 2021 00:13:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236816AbhIMAOx (ORCPT ); Sun, 12 Sep 2021 20:14:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50474 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236802AbhIMAOw (ORCPT ); Sun, 12 Sep 2021 20:14:52 -0400 Received: from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com [IPv6:2a00:1450:4864:20::32a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E4806C06175F for ; Sun, 12 Sep 2021 17:13:37 -0700 (PDT) Received: by mail-wm1-x32a.google.com with SMTP id u19-20020a7bc053000000b002f8d045b2caso5366036wmc.1 for ; Sun, 12 Sep 2021 17:13:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=skwc322iqDIkfDWQITxKXoa67aztJl0DbiABHabtZIc=; b=SSL9TlyOO//xHr5gwIPCvC245qIW6Estiv5CcnTAefS4WCCMwOhO5HR5mPsTVg3qZT QfYZUZhnD09jYzbr6+HEDb7CMLH/Y0AIRi5FGpZE3sxnGM+p+6YRn2Xr+wbcBAsvskrg l5g3ctXCN49ypaiaQhC+3bI6LlU271Z8ZiC0hxcj1SzLMMBsEu3CikmlfdzAlYXa/Uda hRVd8EyxicgMFhtonYt6gUMp7HQtVmMpXjArlF/qWj5szmYLUWuJZx6AW5XkHTVzUQek Uf2UIEqklLBErud0o7C8aMpGKDYO4JaOEC0vDnLOWyBpNSBvnYrwTO7bAlW5Po6yAUjw nhsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=skwc322iqDIkfDWQITxKXoa67aztJl0DbiABHabtZIc=; b=OAtiKeFjvLTHnS5HSeI4KXwlfwjc7hexwoLzeAt2NDeszpV3D4lPX81anFSy88wJhe MFC5WvYOJgna1zIUz1oRxzAMNJO7OVsMKAFV2wVT57CEIiqQ3zAxf4mFqpLpDYR1u3bC v0l5Rzt/NYfiJxQUAmoF6HxzSeCDx0Do0YsHnrkxuSGR9xK6PJkQvy1DsyJYXg1z9JvJ GZAcNOM2/J7kzmLqUnUNWpndcn0ccUDWsy9R75KbcZP90g/LsAa6GaPdQyaJSxHJuXzy wo6l4qQAatk0ZhT3WD5+Q5ays87GWxkK4pXdhjXRVuPvR/vZ3Ol9ipDohZIByErTeK/a b9uQ== X-Gm-Message-State: AOAM533+n2xwQk1oOkcU7nuQ9+D+2ROakJXq0SDuveraNCvRdt/I+AV6 3kUzW/prXRGRMzomPgKqYQsKgO6BxvOyhg== X-Google-Smtp-Source: ABdhPJwBrWOLhnXKNnjv2g1ZRxOoHW/yAN6cDIQNy0+zi2ddlXa2g63btGQUEHafchjaTj+VVM4T5w== X-Received: by 2002:a7b:c4d2:: with SMTP id g18mr8614985wmk.135.1631492015897; Sun, 12 Sep 2021 17:13:35 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id j14sm5827974wrp.21.2021.09.12.17.13.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Sep 2021 17:13:35 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , Carlo Arenas , Eric Sunshine , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v4 1/4] parse-options API users: align usage output in C-strings Date: Mon, 13 Sep 2021 02:13:19 +0200 Message-Id: X-Mailer: git-send-email 2.33.0.1001.g3ab2ac1eaae In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org In preparation for having continued usage lines properly aligned in "git -h" output, let's have the "[" on the second such lines align with the "[" on the first line. In some cases this makes the output worse, because e.g. the "git ls-remote -h" output had been aligned to account for the extra whitespace that the usage_with_options_internal() function in parse-options.c would add. In other cases such as builtin/stash.c (not changed here), we were aligned in the C strings, but since that didn't account for the extra padding in usage_with_options_internal() it would come out looking misaligned, e.g. code like this: N_("git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" " [-u|--include-untracked] [-a|--all] [-m|--message ]\n" Would emit: or: git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [-m|--message ] Let's change all the usage arrays which use such continued usage output via "\n"-embedding to be like builtin/stash.c. This makes the output worse temporarily, but in a subsequent change I'll improve the usage_with_options_internal() to take this into account, at which point all of the strings being changed here will emit prettier output. Signed-off-by: Ævar Arnfjörð Bjarmason --- builtin/ls-remote.c | 4 ++-- builtin/show-branch.c | 6 +++--- builtin/stash.c | 2 +- builtin/tag.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c index f4fd823af83..318949c3d75 100644 --- a/builtin/ls-remote.c +++ b/builtin/ls-remote.c @@ -7,8 +7,8 @@ static const char * const ls_remote_usage[] = { N_("git ls-remote [--heads] [--tags] [--refs] [--upload-pack=]\n" - " [-q | --quiet] [--exit-code] [--get-url]\n" - " [--symref] [ [...]]"), + " [-q | --quiet] [--exit-code] [--get-url]\n" + " [--symref] [ [...]]"), NULL }; diff --git a/builtin/show-branch.c b/builtin/show-branch.c index bea4bbf4680..082449293b5 100644 --- a/builtin/show-branch.c +++ b/builtin/show-branch.c @@ -11,9 +11,9 @@ static const char* show_branch_usage[] = { N_("git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" - " [--current] [--color[=] | --no-color] [--sparse]\n" - " [--more= | --list | --independent | --merge-base]\n" - " [--no-name | --sha1-name] [--topics] [( | )...]"), + " [--current] [--color[=] | --no-color] [--sparse]\n" + " [--more= | --list | --independent | --merge-base]\n" + " [--no-name | --sha1-name] [--topics] [( | )...]"), N_("git show-branch (-g | --reflog)[=[,]] [--list] []"), NULL }; diff --git a/builtin/stash.c b/builtin/stash.c index 8f42360ca91..45b19007d7c 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -85,7 +85,7 @@ static const char * const git_stash_push_usage[] = { static const char * const git_stash_save_usage[] = { N_("git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" - " [-u|--include-untracked] [-a|--all] []"), + " [-u|--include-untracked] [-a|--all] []"), NULL }; diff --git a/builtin/tag.c b/builtin/tag.c index 065b6bf093e..6535ed27ee9 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -23,10 +23,10 @@ static const char * const git_tag_usage[] = { N_("git tag [-a | -s | -u ] [-f] [-m | -F ]\n" - "\t\t []"), + " []"), N_("git tag -d ..."), N_("git tag -l [-n[]] [--contains ] [--no-contains ] [--points-at ]\n" - "\t\t[--format=] [--merged ] [--no-merged ] [...]"), + " [--format=] [--merged ] [--no-merged ] [...]"), N_("git tag -v [--format=] ..."), NULL }; From patchwork Mon Sep 13 00:13:20 2021 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: 12487733 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.8 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 964ACC433F5 for ; Mon, 13 Sep 2021 00:13:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 77D6260EE7 for ; Mon, 13 Sep 2021 00:13:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236828AbhIMAO5 (ORCPT ); Sun, 12 Sep 2021 20:14:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50476 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234094AbhIMAOx (ORCPT ); Sun, 12 Sep 2021 20:14:53 -0400 Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6D2D4C061574 for ; Sun, 12 Sep 2021 17:13:38 -0700 (PDT) Received: by mail-wm1-x330.google.com with SMTP id b21-20020a1c8015000000b003049690d882so2827308wmd.5 for ; Sun, 12 Sep 2021 17:13:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=r2GR4nfgYhhIwjTv6Kyo1FfmSwih5XNCV7n5pTFzzxA=; b=owW3eEUD4WKkAlx5P5MJIv5AlBegyLK2zE3P/DOmVWW9/vnr3b/hYPAkosRGzk2MyF tjdsAacpO51i7dc0eMA//e57GJ4jnmh9fq55nDY5L0QPQPbwu/phuTcRT82jLi5eFdyx L+vdGKIKJs2zqr0iL5S3IIAK26AcWzHwdRJGdbkUx8fpiTRpaHRQpvlHx+GOzxo1XAAH KhxQUMSz6jrF9dvh2eIGAKtodnuziX4KFYmHr6lmVgBx4egDyhom05OwVW3uHaMP+wTE lzpo9edztSiEey6scAiflmzgNOmzcg9IceTgpExeP/VmZF7JNq5GdbVcnYN3OT6FMc/A 5C/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=r2GR4nfgYhhIwjTv6Kyo1FfmSwih5XNCV7n5pTFzzxA=; b=rX0kcPaEDUInEUG179omLtTlccOUh8zZZTh7CtLC9ANEZfhuFnx2xMDNscjlBL+6A0 1XiJmH26mJqhF0FJ4eV/H8PromTkGHdtqsgjxHIgy40WZ9USMHknhf8O/oLX0IfbwYwp Yy9BJ12243OtYBatUtvYY1k3uLZP7eXs5Je0CxPAEfJ6x7f6e/O6TG6oNuJgG9uZ7Urn hKEKN9d79KsHwGIcMHa55hVm+/pY4MowxB2bS4QfDNSYCxgzjkYbmwY+Fz0eFPCuMplQ CtmTT0DoB3l7ykQdl0o947UgApPV2+amh2PjEQ4RT9YD/dWqf8rF+Ictl8h26aQTI2v5 3U/Q== X-Gm-Message-State: AOAM532KqlfchIgStjqEUBBsn6lg4U1SsS/U6cKI17es3cenN9uiQ/XE LJY7SMJXoT65ctvfD4lIzKmUuWtCZzD4eg== X-Google-Smtp-Source: ABdhPJw6pt3nknhVfO5k5Sd5Yluj6YIkJqtnqD1uBeZSZbPcB8ZD7zGUBWZplDwmhqaIY0r4akDjug== X-Received: by 2002:a7b:cb09:: with SMTP id u9mr8613671wmj.63.1631492016826; Sun, 12 Sep 2021 17:13:36 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id j14sm5827974wrp.21.2021.09.12.17.13.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Sep 2021 17:13:36 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , Carlo Arenas , Eric Sunshine , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v4 2/4] send-pack: properly use parse_options() API for usage string Date: Mon, 13 Sep 2021 02:13:20 +0200 Message-Id: X-Mailer: git-send-email 2.33.0.1001.g3ab2ac1eaae In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org When "send-pack" was changed to use the parse_options() API in 068c77a5189 (builtin/send-pack.c: use parse_options API, 2015-08-19) it was made to use one very long line, instead it should split them up with newlines. Furthermore we were including an inline explanation that you couldn't combine "--all" and "", but unlike in the "blame" case this was not preceded by an empty string. Let's instead show that --all and can't be combined in the the usual language of the usage syntax instead. We can make it clear that one of the two options "--foo" and "--bar" is mandatory, but that the two are mutually exclusive by referring to them as "( --foo | --bar )". Signed-off-by: Ævar Arnfjörð Bjarmason --- Documentation/git-send-pack.txt | 4 ++-- builtin/send-pack.c | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Documentation/git-send-pack.txt b/Documentation/git-send-pack.txt index 44fd146b912..be41f119740 100644 --- a/Documentation/git-send-pack.txt +++ b/Documentation/git-send-pack.txt @@ -9,10 +9,10 @@ git-send-pack - Push objects over Git protocol to another repository SYNOPSIS -------- [verse] -'git send-pack' [--all] [--dry-run] [--force] [--receive-pack=] +'git send-pack' [--dry-run] [--force] [--receive-pack=] [--verbose] [--thin] [--atomic] [--[no-]signed|--signed=(true|false|if-asked)] - [:] [...] + [:] (--all | ...) DESCRIPTION ----------- diff --git a/builtin/send-pack.c b/builtin/send-pack.c index 729dea1d255..89321423125 100644 --- a/builtin/send-pack.c +++ b/builtin/send-pack.c @@ -17,10 +17,10 @@ #include "protocol.h" static const char * const send_pack_usage[] = { - N_("git send-pack [--all | --mirror] [--dry-run] [--force] " - "[--receive-pack=] [--verbose] [--thin] [--atomic] " - "[:] [...]\n" - " --all and explicit specification are mutually exclusive."), + N_("git send-pack [--mirror] [--dry-run] [--force]\n" + " [--receive-pack=]\n" + " [--verbose] [--thin] [--atomic]\n" + " [:] (--all | ...)"), NULL, }; From patchwork Mon Sep 13 00:13:21 2021 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: 12487735 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,URIBL_BLOCKED,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 C7318C433F5 for ; Mon, 13 Sep 2021 00:13:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AA4EA61029 for ; Mon, 13 Sep 2021 00:13:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236846AbhIMAPA (ORCPT ); Sun, 12 Sep 2021 20:15:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50482 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236818AbhIMAOy (ORCPT ); Sun, 12 Sep 2021 20:14:54 -0400 Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 35101C061574 for ; Sun, 12 Sep 2021 17:13:39 -0700 (PDT) Received: by mail-wm1-x32e.google.com with SMTP id k5-20020a05600c1c8500b002f76c42214bso5650357wms.3 for ; Sun, 12 Sep 2021 17:13:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kqEkudrd+2fs7hjYqcHrulSDZf2P/fz7a2Wkk8fwQ8A=; b=qXHGEaJYQdGGDe6M88emI2NPP0ZVFvmMVEX8ySSgC2ZE9tBugjSJZHz7nqeQs/mvHK FxDdYgahND76pxO03FkewP39BtetsEoStMfvw3eY0iTexeaKVdJKIKyKUoKu9rFzce74 hWp0G+lrPkHur9if4nXTdF3SMhJ3dnvcq6L+ubUNLeBxfJC4OlYrzpyTauNHwMDwQgar ei4F/YRmnLXRyw7D7EXcgpgVL4XUBWc4uZuWJycnfUtonWdJv3fED/6yg+PUM2rQ1TOu meqo9qu+TJrASvnT/Tm3fTfWLpCOKwAXyCGuCAbJzUGsVBQ0trktsYV4i+L9UUPkUW3f K5XA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kqEkudrd+2fs7hjYqcHrulSDZf2P/fz7a2Wkk8fwQ8A=; b=HDevTdEZQw33pdGNF3+2hdKnzPT68Mbq336jqPbJn7hW1OsBUqRmSgRrTUI8UcbOrh ILh4YP4TSqcwR025yS2L2wdpsDYkNH2YyiBHLWMqPft7bsgmwmLVOcEwCtlNuoaGNgZ2 gv17VK9/CDxwWRy6/rcbvtFQMeuOytczXxVmj1E45Lb3ghZlMumArX/ijrO5bTcUs/0A Pevp3qZuY3ycslgvkmlX/VKnnxTQ9FLeQrWvX5IR28l3bROxxdGnC6dbQJtLK+aa8h/y P9UE665jNv6VQ1w2GbWdEmwBvsxZEVH2F13x6mw63DugdA6bjnAMKfXeyoF0VCG1Iuaz bZxw== X-Gm-Message-State: AOAM531a1iJZAmjQdERe2Fp/ZlQNwMrIK/VCoLTvj1bR0OZ2DyTxL9OG Eq9AP8+lixmbk7iUVK8H8Sf8DsfA+7bCFg== X-Google-Smtp-Source: ABdhPJwWmX7D2W5v2R9ZcVqLzUuKeC4y+Ug4XaRq4/SCl1u3dy8OQHRim/55D5liv25Sep5CVr+F6w== X-Received: by 2002:a1c:21c3:: with SMTP id h186mr8612871wmh.18.1631492017636; Sun, 12 Sep 2021 17:13:37 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id j14sm5827974wrp.21.2021.09.12.17.13.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Sep 2021 17:13:37 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , Carlo Arenas , Eric Sunshine , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v4 3/4] git rev-parse --parseopt tests: add more usagestr tests Date: Mon, 13 Sep 2021 02:13:21 +0200 Message-Id: X-Mailer: git-send-email 2.33.0.1001.g3ab2ac1eaae In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Add tests for the "usagestr" passed to parse-options.c usage_with_options_internal() through cmd_parseopt(). These test for edge cases in the existing behavior related to the "--parseopt" interface doing its own line-splitting with strbuf_getline(), and the native C interface expecting and potentially needing to handle newlines within the strings in the array it accepts. The results are probably something that wasn't anticipated, but let's make sure we stay backwards compatible with it. Signed-off-by: Ævar Arnfjörð Bjarmason --- t/t1502-rev-parse-parseopt.sh | 54 +++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh index b29563fc997..284fe18e726 100755 --- a/t/t1502-rev-parse-parseopt.sh +++ b/t/t1502-rev-parse-parseopt.sh @@ -282,4 +282,58 @@ test_expect_success 'test --parseopt --stuck-long and short option with unset op test_cmp expect output ' +test_expect_success 'test --parseopt help output: "wrapped" options normal "or:" lines' ' + sed -e "s/^|//" >spec <<-\EOF && + |cmd [--some-option] + | [--another-option] + |cmd [--yet-another-option] + |-- + |h,help show the help + EOF + + sed -e "s/^|//" >expect <<-\END_EXPECT && + |cat <<\EOF + |usage: cmd [--some-option] + | or: [--another-option] + | or: cmd [--yet-another-option] + | + | -h, --help show the help + | + |EOF + END_EXPECT + + test_must_fail git rev-parse --parseopt -- -h >out actual && + test_cmp expect actual +' + +test_expect_success 'test --parseopt help output: multi-line blurb after empty line' ' + sed -e "s/^|//" >spec <<-\EOF && + |cmd [--some-option] + | [--another-option] + | + |multi + |line + |blurb + |-- + |h,help show the help + EOF + + sed -e "s/^|//" >expect <<-\END_EXPECT && + |cat <<\EOF + |usage: cmd [--some-option] + | or: [--another-option] + | + | multi + | line + | blurb + | + | -h, --help show the help + | + |EOF + END_EXPECT + + test_must_fail git rev-parse --parseopt -- -h >out actual && + test_cmp expect actual +' + test_done From patchwork Mon Sep 13 00:13:22 2021 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: 12487737 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.8 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 DAF61C433EF for ; Mon, 13 Sep 2021 00:13:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C2CAC61056 for ; Mon, 13 Sep 2021 00:13:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236849AbhIMAPB (ORCPT ); Sun, 12 Sep 2021 20:15:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50486 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236824AbhIMAOz (ORCPT ); Sun, 12 Sep 2021 20:14:55 -0400 Received: from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com [IPv6:2a00:1450:4864:20::32a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 48E89C06175F for ; Sun, 12 Sep 2021 17:13:40 -0700 (PDT) Received: by mail-wm1-x32a.google.com with SMTP id e26so5381325wmk.2 for ; Sun, 12 Sep 2021 17:13:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=p/ksR24wY5NweedgSLwFEFicXt35ubVv9roIxSZe6U0=; b=qJ38w7C/lpTSjfHGhklBSVqkoqwtAIJr+iiFYYjl08DSYloO3yF2iDI+J5dmeqzVs3 LSF6SsWjXtdzhCsrKQlxZmenX54KeB177TW9kgdQWn2CBmYty2u0+yBcCg+R6O//GUec ggF+E+TOs5fHUnU6uebK0UU+S4DFBpRBdWxT7M6ggW1lIJCgX8ZsFoABuB9hqrlJ0pAh zkrQEvnodm77ufj1u3xQPQ++W59vF5mC6GSaCWqZiwSTk4hfVC+upfwnT+3U/cRPWQ2Z l+CLPxcrGGv0qCfrvMZf6qiwenuJVfvL1N+gIz13GFtbTb39A52/6KMYGikcgL2Hbc5u m4DQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=p/ksR24wY5NweedgSLwFEFicXt35ubVv9roIxSZe6U0=; b=dmKMg1/w3jgLdmP+8FDdMZQnsFE0rITUSBT0fdtpzKCWaRyagngHSbuSrG8qIK3DaE nup6qB7j/auEBqYMNW4Owmr7nTL6RkRl+nuryhb9u0+3P13GcWb9NLXofJDzJ8GttNAC hQN/ampx5dr+Y7IWWZAx1b6v/VJdm8TsNFKe9FAhpJMaUAkXn6SYO654Xx6/3UxR9Vrl C4CUDVILCFlxz9FlHJXMK49JXsutiSgkYDjgrG1zp0YiTaPmP5rx0n51c19RJoA+CIcR 7QA4Vzysvtl2DDRTN4K7g7ITOoY5YhyjRwKlGSxjnVjUpH2hHGP/GnCbb9GYObtzK6Qv iJkA== X-Gm-Message-State: AOAM532ZROrMPx8Eoh9s4lwtSj/UpmMmQnVHGbqlhzlY/xoLbe5nm6qD 9maqp/xNM2hP1q0ArFqXMIT9jNozRpSE9w== X-Google-Smtp-Source: ABdhPJyNMzyaFoR5TjPQ6WZC22+5rzpxLx3J9wlObS3dSkj3+gkywLyMJBvQqqjmMIrfkbgfSyJvSA== X-Received: by 2002:a1c:3584:: with SMTP id c126mr8551905wma.121.1631492018582; Sun, 12 Sep 2021 17:13:38 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id j14sm5827974wrp.21.2021.09.12.17.13.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Sep 2021 17:13:38 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , Carlo Arenas , Eric Sunshine , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v4 4/4] parse-options: properly align continued usage output Date: Mon, 13 Sep 2021 02:13:22 +0200 Message-Id: X-Mailer: git-send-email 2.33.0.1001.g3ab2ac1eaae In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Some commands such as "git stash" emit continued options output with e.g. "git stash -h", because usage_with_options_internal() prefixes with its own whitespace the resulting output wasn't properly aligned. Let's account for the added whitespace, which properly aligns the output. The "git stash" command has usage output with a N_() translation that legitimately stretches across multiple lines; N_("git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" " [-u|--include-untracked] [-a|--all] [-m|--message ]\n" [...] We'd like to have that output aligned with the length of the initial "git stash " output, but since usage_with_options_internal() adds its own whitespace prefixing we fell short, before this change we'd emit: $ git stash -h usage: git stash list [] or: git stash show [] [] [...] or: git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [-m|--message ] [...] Now we'll properly emit aligned output. I.e. the last four lines above will instead be (a whitespace-only change to the above): [...] or: git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [-m|--message ] [...] We could also go for an approach where we have the caller support no padding of their own, i.e. (same as the first example, except for the padding on the second line): N_("git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" "[-u|--include-untracked] [-a|--all] [-m|--message ]\n" [...] But to do that we'll need to find the length of "git stash". We can discover that from the "cmd" in the "struct cmd_struct", but there might cases with sub-commands or "git" itself taking arguments that would make that non-trivial. Even if it was I still think this approach is better, because this way we'll get the same legible alignment in the C code. The fact that usage_with_options_internal() is adding its own prefix padding is an implementation detail that callers shouldn't need to worry about. Implementation notes: We could skip the string_list_split() with a strchr(str, '\n') check, but we'd then need to duplicate our state machine for strings that do and don't contain a "\n". It's simpler to just always split into a "struct string_list", even though the common case is that that "struct string_list" will contain only one element. This is not performance-sensitive code. This change is relatively more complex since I've accounted for making it future-proof for RTL translation support. Later in usage_with_options_internal() we have some existing padding code dating back to d7a38c54a6c (parse-options: be able to generate usages automatically, 2007-10-15) which isn't RTL-safe, but that code would be easy to fix. Let's not introduce new RTL translation problems here. Signed-off-by: Ævar Arnfjörð Bjarmason --- parse-options.c | 76 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 12 deletions(-) diff --git a/parse-options.c b/parse-options.c index 2abff136a17..75f0a6c81c5 100644 --- a/parse-options.c +++ b/parse-options.c @@ -917,25 +917,77 @@ static int usage_with_options_internal(struct parse_opt_ctx_t *ctx, FILE *outfile = err ? stderr : stdout; int need_newline; + const char *usage_prefix = _("usage: %s"); + /* + * The translation could be anything, but we can count on + * msgfmt(1)'s --check option to have asserted that "%s" is in + * the translation. So compute the length of the "usage: " + * part. We are assuming that the translator wasn't overly + * clever and used e.g. "%1$s" instead of "%s", there's only + * one "%s" in "usage_prefix" above, so there's no reason to + * do so even with a RTL language. + */ + size_t usage_len = strlen(usage_prefix) - strlen("%s"); + /* + * TRANSLATORS: the colon here should align with the + * one in "usage: %s" translation. + */ + const char *or_prefix = _(" or: %s"); + /* + * TRANSLATORS: You should only need to translate this format + * string if your language is a RTL language (e.g. Arabic, + * Hebrew etc.), not if it's a LTR language (e.g. German, + * Russian, Chinese etc.). + * + * When a translated usage string has an embedded "\n" it's + * because options have wrapped to the next line. The line + * after the "\n" will then be padded to align with the + * command name, such as N_("git cmd [opt]\n<8 + * spaces>[opt2]"), where the 8 spaces are the same length as + * "git cmd ". + * + * This format string prints out that already-translated + * line. The "%*s" is whitespace padding to account for the + * padding at the start of the line that we add in this + * function. The "%s" is a line in the (hopefully already + * translated) N_() usage string, which contained embedded + * newlines before we split it up. + */ + const char *usage_continued = _("%*s%s"); + const char *prefix = usage_prefix; + int saw_empty_line = 0; + if (!usagestr) return PARSE_OPT_HELP; if (!err && ctx && ctx->flags & PARSE_OPT_SHELL_EVAL) fprintf(outfile, "cat <<\\EOF\n"); - fprintf_ln(outfile, _("usage: %s"), _(*usagestr++)); - while (*usagestr && **usagestr) - /* - * TRANSLATORS: the colon here should align with the - * one in "usage: %s" translation. - */ - fprintf_ln(outfile, _(" or: %s"), _(*usagestr++)); while (*usagestr) { - if (**usagestr) - fprintf_ln(outfile, _(" %s"), _(*usagestr)); - else - fputc('\n', outfile); - usagestr++; + const char *str = _(*usagestr++); + struct string_list list = STRING_LIST_INIT_DUP; + unsigned int j; + + if (!saw_empty_line && !*str) + saw_empty_line = 1; + + string_list_split(&list, str, '\n', -1); + for (j = 0; j < list.nr; j++) { + const char *line = list.items[j].string; + + if (saw_empty_line && *line) + fprintf_ln(outfile, _(" %s"), line); + else if (saw_empty_line) + fputc('\n', outfile); + else if (!j) + fprintf_ln(outfile, prefix, line); + else + fprintf_ln(outfile, usage_continued, + (int)usage_len, "", line); + } + string_list_clear(&list, 0); + + prefix = or_prefix; } need_newline = 1;