From: "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: "Taylor Blau" <me@ttaylorr.com>,
"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"Derrick Stolee" <stolee@gmail.com>,
"Johannes Schindelin" <johannes.schindelin@gmx.de>,
"Johannes Schindelin" <johannes.schindelin@gmx.de>
Subject: [PATCH v2] scalar: accept -C and -c options before the subcommand
Date: Fri, 28 Jan 2022 14:31:57 +0000 [thread overview]
Message-ID: <pull.1130.v2.git.1643380317358.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1130.git.1643195729608.gitgitgadget@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>
The `git` executable has these two very useful options:
-C <directory>:
switch to the specified directory before performing any actions
-c <key>=<value>:
temporarily configure this setting for the duration of the
specified scalar subcommand
With this commit, we teach the `scalar` executable the same trick.
Note: It might look like a good idea to try to reuse the
`handle_options()` function in `git.c` instead of replicating only the
`-c`/`-C` part. However, that function is not only not in `libgit.a`, it
is also intricately entangled with the rest of the code in `git.c` that
is necessary e.g. to handle `--paginate`. Besides, no other option
handled by that `handle_options()` function is relevant to Scalar,
therefore the cost of refactoring vastly would outweigh the benefit.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
scalar: accept -C and -c options
This makes the scalar command a bit more handy by offering the same -c
<key>=<value> and -C <directory> options as the git command.
Changes since v1:
* Added a regression test case.
* Augmented the commit message with a brief analysis why we're choosing
not to refactor git.c:handle_options() but instead copy-edit the
dozen or so lines that we want.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1130%2Fdscho%2Fscalar-c-and-C-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1130/dscho/scalar-c-and-C-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1130
Range-diff vs v1:
1: 8f2af8c3ec1 ! 1: d7ee2d03b04 scalar: accept -C and -c options before the subcommand
@@ Commit message
With this commit, we teach the `scalar` executable the same trick.
+ Note: It might look like a good idea to try to reuse the
+ `handle_options()` function in `git.c` instead of replicating only the
+ `-c`/`-C` part. However, that function is not only not in `libgit.a`, it
+ is also intricately entangled with the rest of the code in `git.c` that
+ is necessary e.g. to handle `--paginate`. Besides, no other option
+ handled by that `handle_options()` function is relevant to Scalar,
+ therefore the cost of refactoring vastly would outweigh the benefit.
+
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
## contrib/scalar/scalar.c ##
@@ contrib/scalar/scalar.txt: The `scalar` command implements various subcommands,
COMMANDS
--------
+
+ ## contrib/scalar/t/t9099-scalar.sh ##
+@@ contrib/scalar/t/t9099-scalar.sh: test_expect_success 'scalar delete with enlistment' '
+ test_path_is_missing cloned
+ '
+
++test_expect_success 'scalar supports -c/-C' '
++ test_when_finished "scalar delete sub" &&
++ git init sub &&
++ scalar -C sub -c status.aheadBehind=bogus register &&
++ test -z "$(git -C sub config --local status.aheadBehind)" &&
++ test true = "$(git -C sub config core.preloadIndex)"
++'
++
+ test_done
contrib/scalar/scalar.c | 22 +++++++++++++++++++++-
contrib/scalar/scalar.txt | 10 ++++++++++
contrib/scalar/t/t9099-scalar.sh | 8 ++++++++
3 files changed, 39 insertions(+), 1 deletion(-)
diff --git a/contrib/scalar/scalar.c b/contrib/scalar/scalar.c
index 1ce9c2b00e8..7db2a97416e 100644
--- a/contrib/scalar/scalar.c
+++ b/contrib/scalar/scalar.c
@@ -808,6 +808,25 @@ int cmd_main(int argc, const char **argv)
struct strbuf scalar_usage = STRBUF_INIT;
int i;
+ while (argc > 1 && *argv[1] == '-') {
+ if (!strcmp(argv[1], "-C")) {
+ if (argc < 3)
+ die(_("-C requires a <directory>"));
+ if (chdir(argv[2]) < 0)
+ die_errno(_("could not change to '%s'"),
+ argv[2]);
+ argc -= 2;
+ argv += 2;
+ } else if (!strcmp(argv[1], "-c")) {
+ if (argc < 3)
+ die(_("-c requires a <key>=<value> argument"));
+ git_config_push_parameter(argv[2]);
+ argc -= 2;
+ argv += 2;
+ } else
+ break;
+ }
+
if (argc > 1) {
argv++;
argc--;
@@ -818,7 +837,8 @@ int cmd_main(int argc, const char **argv)
}
strbuf_addstr(&scalar_usage,
- N_("scalar <command> [<options>]\n\nCommands:\n"));
+ N_("scalar [-C <directory>] [-c <key>=<value>] "
+ "<command> [<options>]\n\nCommands:\n"));
for (i = 0; builtins[i].name; i++)
strbuf_addf(&scalar_usage, "\t%s\n", builtins[i].name);
diff --git a/contrib/scalar/scalar.txt b/contrib/scalar/scalar.txt
index f416d637289..cf4e5b889cc 100644
--- a/contrib/scalar/scalar.txt
+++ b/contrib/scalar/scalar.txt
@@ -36,6 +36,16 @@ The `scalar` command implements various subcommands, and different options
depending on the subcommand. With the exception of `clone`, `list` and
`reconfigure --all`, all subcommands expect to be run in an enlistment.
+The following options can be specified _before_ the subcommand:
+
+-C <directory>::
+ Before running the subcommand, change the working directory. This
+ option imitates the same option of linkgit:git[1].
+
+-c <key>=<value>::
+ For the duration of running the specified subcommand, configure this
+ setting. This option imitates the same option of linkgit:git[1].
+
COMMANDS
--------
diff --git a/contrib/scalar/t/t9099-scalar.sh b/contrib/scalar/t/t9099-scalar.sh
index 2e1502ad45e..89781568f43 100755
--- a/contrib/scalar/t/t9099-scalar.sh
+++ b/contrib/scalar/t/t9099-scalar.sh
@@ -85,4 +85,12 @@ test_expect_success 'scalar delete with enlistment' '
test_path_is_missing cloned
'
+test_expect_success 'scalar supports -c/-C' '
+ test_when_finished "scalar delete sub" &&
+ git init sub &&
+ scalar -C sub -c status.aheadBehind=bogus register &&
+ test -z "$(git -C sub config --local status.aheadBehind)" &&
+ test true = "$(git -C sub config core.preloadIndex)"
+'
+
test_done
base-commit: ddc35d833dd6f9e8946b09cecd3311b8aa18d295
--
gitgitgadget
next prev parent reply other threads:[~2022-01-28 14:32 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-26 11:15 [PATCH] scalar: accept -C and -c options before the subcommand Johannes Schindelin via GitGitGadget
2022-01-26 20:53 ` Taylor Blau
2022-01-28 11:43 ` Johannes Schindelin
2022-01-27 2:55 ` Ævar Arnfjörð Bjarmason
2022-01-27 14:46 ` Derrick Stolee
2022-01-28 11:27 ` Johannes Schindelin
2022-01-28 18:21 ` Ævar Arnfjörð Bjarmason
2022-01-28 19:52 ` Derrick Stolee
2022-01-29 6:39 ` Ævar Arnfjörð Bjarmason
2022-01-28 19:37 ` Derrick Stolee
2022-01-28 18:05 ` Junio C Hamano
2022-01-28 19:38 ` Derrick Stolee
2022-01-28 14:31 ` Johannes Schindelin via GitGitGadget [this message]
2022-01-28 19:40 ` [PATCH v2] " Derrick Stolee
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.1130.v2.git.1643380317358.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=avarab@gmail.com \
--cc=git@vger.kernel.org \
--cc=johannes.schindelin@gmx.de \
--cc=me@ttaylorr.com \
--cc=stolee@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).