scalar: accept -C and -c options before the subcommand

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> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Johannes Schindelin committed Jan 28, 2022 at 14:31 UTC 2ae8eb5d71028f0289b4b38663d07b6eefee23a6
3 files changed +39 -1
contrib/scalar/scalar.c
+21 -1
@@ -808,6 +808,25 @@ int cmd_main(int argc, const char **argv)
808 struct strbuf scalar_usage = STRBUF_INIT;
809 int i;
810
811 + while (argc > 1 && *argv[1] == '-') {
812 + if (!strcmp(argv[1], "-C")) {
813 + if (argc < 3)
814 + die(_("-C requires a <directory>"));
815 + if (chdir(argv[2]) < 0)
816 + die_errno(_("could not change to '%s'"),
817 + argv[2]);
818 + argc -= 2;
819 + argv += 2;
820 + } else if (!strcmp(argv[1], "-c")) {
821 + if (argc < 3)
822 + die(_("-c requires a <key>=<value> argument"));
823 + git_config_push_parameter(argv[2]);
824 + argc -= 2;
825 + argv += 2;
826 + } else
827 + break;
828 + }
829 +
830 if (argc > 1) {
831 argv++;
832 argc--;
@@ -818,7 +837,8 @@ int cmd_main(int argc, const char **argv)
837 }
838
839 strbuf_addstr(&scalar_usage,
821 - N_("scalar <command> [<options>]\n\nCommands:\n"));
840 + N_("scalar [-C <directory>] [-c <key>=<value>] "
841 + "<command> [<options>]\n\nCommands:\n"));
842 for (i = 0; builtins[i].name; i++)
843 strbuf_addf(&scalar_usage, "\t%s\n", builtins[i].name);
844
contrib/scalar/scalar.txt
+10
@@ -36,6 +36,16 @@ The `scalar` command implements various subcommands, and different options
36 depending on the subcommand. With the exception of `clone`, `list` and
37 `reconfigure --all`, all subcommands expect to be run in an enlistment.
38
39 +The following options can be specified _before_ the subcommand:
40 +
41 +-C <directory>::
42 + Before running the subcommand, change the working directory. This
43 + option imitates the same option of linkgit:git[1].
44 +
45 +-c <key>=<value>::
46 + For the duration of running the specified subcommand, configure this
47 + setting. This option imitates the same option of linkgit:git[1].
48 +
49 COMMANDS
50 --------
51
contrib/scalar/t/t9099-scalar.sh
+8
@@ -85,4 +85,12 @@ test_expect_success 'scalar delete with enlistment' '
85 test_path_is_missing cloned
86 '
87
88 +test_expect_success 'scalar supports -c/-C' '
89 + test_when_finished "scalar delete sub" &&
90 + git init sub &&
91 + scalar -C sub -c status.aheadBehind=bogus register &&
92 + test -z "$(git -C sub config --local status.aheadBehind)" &&
93 + test true = "$(git -C sub config core.preloadIndex)"
94 +'
95 +
96 test_done