git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] scalar: accept -C and -c options before the subcommand

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Jan 28, 2022, 11:43 UTC
Message-ID
<nycvar.QRO.7.76.6.2201281227330.347@tvgsbejvaqbjf.bet>
In-Reply-To
<YfG0ybYOCwDzlbi5@nand.local>
Hi Taylor,
On Wed, 26 Jan 2022, Taylor Blau wrote:
Show 59 quoted lines
> On Wed, Jan 26, 2022 at 11:15:29AM +0000, Johannes Schindelin via GitGitGadget wrote:
> > 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.
> >
> > 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.
> >
> > Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1130%2Fdscho%2Fscalar-c-and-C-v1
> > Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1130/dscho/scalar-c-and-C-v1
> > Pull-Request: https://github.com/gitgitgadget/git/pull/1130
> >
> >  contrib/scalar/scalar.c   | 22 +++++++++++++++++++++-
> >  contrib/scalar/scalar.txt | 10 ++++++++++
> >  2 files changed, 31 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;
> > +	}
> > +
>
> All looks right to me based on a cursory scan. It's too bad that we have
> to copy this code from git.c::handle_options().

It's only a dozen lines, though, and they are pretty stable, so I doubt that we risk divergent copied code.

> Could we call handle_options() (assuming that it was available to
> Scalar's compilation unit) instead? I'm not sure if that's a naive
> question or not, but it might be nice to explain it out in the commit
> message in case other reviewers have the same question that I did.

I just responded to Stolee elsewhere in this thread with a lengthy analysis of the options, and the conclusion that it would not be worth the effort to refactor `handle_options()`.

> On a more practical note: is there an easy way to test this?
It would be pretty easy to test `-C`:
	git init sub &&
	scalar -C sub register &&
	[... verify that `sub/` is now a Scalar repository ...]

For `-c`, we would need to configure something parsed by `git_default_config()` that would influence what `scalar register` does, then verify that. Or even better, use a config setting that is in the "Optional" section of `set_recommended_config()`, i.e. it will refuse to override an already-configured value. Something like `status.aheadBehind`.

I added this:
-- snip --
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
-- snap --

Ciao,
Dscho
Previous: Taylor BlauNext: Ævar Arnfjörð Bjarmason
Message 3 of 14 in “scalar: accept -C and -c options before the subcommand”
  1. scalar: accept -C and -c options before the subcommandJohannes Schindelin via GitGitGadget, Jan 26, 2022
  2. Taylor BlauJan 26, 2022
  3. Johannes SchindelinJan 28, 2022
  4. Ævar Arnfjörð BjarmasonJan 27, 2022
  5. Derrick StoleeJan 27, 2022
  6. Johannes SchindelinJan 28, 2022
  7. Ævar Arnfjörð BjarmasonJan 28, 2022
  8. Derrick StoleeJan 28, 2022
  9. Ævar Arnfjörð BjarmasonJan 29, 2022
  10. Derrick StoleeJan 28, 2022
  11. Junio C HamanoJan 28, 2022
  12. Derrick StoleeJan 28, 2022
  13. scalar: accept -C and -c options before the subcommandJohannes Schindelin via GitGitGadget, Jan 28, 2022
  14. Derrick StoleeJan 28, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.