git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: Junio C Hamano <gitster@pobox.com>
Cc: Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>,
	git@vger.kernel.org
Subject: Re: [PATCH 08/15] scalar: implement the `clone` subcommand
Date: Fri, 3 Sep 2021 17:20:35 +0200 (CEST)	[thread overview]
Message-ID: <nycvar.QRO.7.76.6.2109031709190.55@tvgsbejvaqbjf.bet> (raw)
In-Reply-To: <xmqqsfyoqm6e.fsf@gitster.g>

Hi Junio,

On Wed, 1 Sep 2021, Junio C Hamano wrote:

> "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
> writes:
>
> > +static char *remote_default_branch(const char *url)
> > +{
> > +	struct child_process cp = CHILD_PROCESS_INIT;
> > +	struct strbuf out = STRBUF_INIT;
> > +
> > +	cp.git_cmd = 1;
> > +	strvec_pushl(&cp.args, "ls-remote", "--symref", url, "HEAD", NULL);
> > +	strbuf_addstr(&out, "-\n");
>
> Is this a workaround for the problem that the first "ref:" line
> won't be found by looking for "\nref: " in the loop?  Cute, but the
> extra "-" is a bit misleading.

The `-` is actually needed because of the `ref + 1` below, over which you
stumbled.

>
> > +	if (!pipe_command(&cp, NULL, 0, &out, 0, NULL, 0)) {
> > +		char *ref = out.buf;
> > +
> > +		while ((ref = strstr(ref + 1, "\nref: "))) {
> > +			const char *p;
> > +			char *head, *branch;
> > +
> > +			ref += strlen("\nref: ");
> > +			head = strstr(ref, "\tHEAD");
> > +
> > +			if (!head || memchr(ref, '\n', head - ref))
> > +				continue;
>
> OK.  We expect "ref: " <refname> "\t" <head> "\n" where <head> is
> "HEAD" for their .git/HEAD and refs/remotes/<nick>/HEAD for their
> remote-tracking branch for the remote they call <nick>, on a single
> line.  We reject a line that is not of that shape, and we reject a
> line that is about remote-tracking branch by only looking for
> "\tHEAD". Makes sense.
>
> The strstr() goes from "ref + 1", which feels sloppy.

I would use a different adjective, one that is less judgemental in nature,
but then, you were talking about your feelings.

> When we reject the line we found that begins with "ref :", I would have
> expected that the next scan would start at the beginning of the next
> line, not from the middle of this line at the first letter 'e' in
> 'refs/heads/' on the current line "ref: refs/heads/.....".  As long as
> the current line is long enough, strstr() would not miss the beginning
> of the next line, so it might be OK.

It would even work if the current line is shorter, but as you point out:
it is wasteful. And it could be improved to be more readable. I reworked
it, and it now looks like this:

	if (!pipe_command(&cp, NULL, 0, &out, 0, NULL, 0)) {
		const char *line = out.buf;

		while (*line) {
			const char *eol = strchrnul(line, '\n'), *p;
			size_t len = eol - line;
			char *branch;

			if (!skip_prefix(line, "ref: ", &p) ||
			    !strip_suffix_mem(line, &len, "\tHEAD")) {
				line = eol + (*eol == '\n');
				continue;
			}

			eol = line + len;
			if (skip_prefix(p, "refs/heads/", &p)) {
				branch = xstrndup(p, eol - p);
				strbuf_release(&out);
				return branch;
			}

			error(_("remote HEAD is not a branch: '%.*s'"),
			      (int)(eol - p), p);
			strbuf_release(&out);
			return NULL;
		}
	}

It now parses the output line by line, looking for the expected prefix and
suffix, then verifies the ref name format, and either returns the short
branch name or errors out with the message that this is not a branch.

>
> > +			if (skip_prefix(ref, "refs/heads/", &p)) {
> > +				branch = xstrndup(p, head - p);
> > +				strbuf_release(&out);
> > +				return branch;
> > +			}
> > +
> > +			error(_("remote HEAD is not a branch: '%.*s'"),
> > +			      (int)(head - ref), ref);
> > +			strbuf_release(&out);
> > +			return NULL;
>
> OK.  Any symref whose basename is HEAD in their remote-tracking
> hierarchy would have been rejected earlier in the loop.
>
> Is there a particular reason why we return early here, instead of
> breaking out of hte loop and let the generic "failed to get" code
> path below to handle this case?

Yes, the reason is that I wanted to err on the side of caution. If the
remote repository reports a default branch that is not a default branch at
all, I do not want to pretend that things are fine and then run into
trouble later when we set up a non-branch as remote-tracking target or
something like that.

>
> > +		}
> > +	}
> > +	warning(_("failed to get default branch name from remote; "
> > +		  "using local default"));
> > +	strbuf_reset(&out);
> > +
> > +	child_process_init(&cp);
> > +	cp.git_cmd = 1;
> > +	strvec_pushl(&cp.args, "symbolic-ref", "--short", "HEAD", NULL);
> > +	if (!pipe_command(&cp, NULL, 0, &out, 0, NULL, 0)) {
> > +		strbuf_trim(&out);
> > +		return strbuf_detach(&out, NULL);
> > +	}
> > +
> > +	strbuf_release(&out);
> > +	error(_("failed to get default branch name"));
> > +	return NULL;
> > +}
>
> > +static int cmd_clone(int argc, const char **argv)
> > +{
> > +	const char *branch = NULL;
> > +	int full_clone = 0;
> > +	struct option clone_options[] = {
> > +		OPT_STRING('b', "branch", &branch, N_("<branch>"),
> > +			   N_("branch to checkout after clone")),
> > +		OPT_BOOL(0, "full-clone", &full_clone,
> > +			 N_("when cloning, create full working directory")),
> > +		OPT_END(),
> > +	};
> > +	const char * const clone_usage[] = {
> > +		N_("scalar clone [<options>] [--] <repo> [<dir>]"),
> > +		NULL
> > +	};
> > +	const char *url;
> > +	char *enlistment = NULL, *dir = NULL;
> > +	struct strbuf buf = STRBUF_INIT;
> > +	int res;
> > +
> > +	argc = parse_options(argc, argv, NULL, clone_options, clone_usage, 0);
> > +
> > +	if (argc == 2) {
> > +		url = argv[0];
> > +		enlistment = xstrdup(argv[1]);
> > +	} else if (argc == 1) {
> > +		url = argv[0];
> > +
> > +		strbuf_addstr(&buf, url);
> > +		/* Strip trailing slashes, if any */
> > +		while (buf.len > 0 && is_dir_sep(buf.buf[buf.len - 1]))
> > +			strbuf_setlen(&buf, buf.len - 1);
> > +		/* Strip suffix `.git`, if any */
> > +		strbuf_strip_suffix(&buf, ".git");
> > +
> > +		enlistment = find_last_dir_sep(buf.buf);
> > +		if (!enlistment) {
> > +			die(_("cannot deduce worktree name from '%s'"), url);
> > +		}
> > +		enlistment = xstrdup(enlistment + 1);
> > +	} else {
> > +		usage_msg_opt(_("You must specify a repository to clone."),
> > +			      clone_usage, clone_options);
> > +	}
> > +
> > +	if (is_directory(enlistment))
> > +		die(_("directory '%s' exists already"), enlistment);
> > +
> > +	dir = xstrfmt("%s/src", enlistment);
> > +
> > +	strbuf_reset(&buf);
> > +	if (branch)
> > +		strbuf_addf(&buf, "init.defaultBranch=%s", branch);
> > +	else {
> > +		char *b = repo_default_branch_name(the_repository, 1);
> > +		strbuf_addf(&buf, "init.defaultBranch=%s", b);
> > +		free(b);
>
> Doesn't "git clone" already use their HEAD without having to make an
> extra "git ls-remote" roundtrip?
>
> Ahh, you do not do "git clone"; you do "git init", set things up,
> and then "git fetch" and checkout, all manually.
>
> Which is kind of shame.
>
> I wonder if it is a cleaner implementation to give a new option to
> "git clone" that gives a command sequence (not necessarily have to
> be implemented as a shell script) that specifies necessary
> pre-configuration steps to be done before the command starts the
> transfer step.

Right. It is a shame, I agree. And it is one of the things I want to work
on, after the Scalar patch series made it into Git.

The reason why I don't want to work on this now is that I expect this
effort to result in new options for `git clone`, new options that need to
be designed well, and where I fully expect a long discussion until we
reach a consensus how these options should look like, especially since we
will need to maintain backwards-compatibility of Scalar's functionality.

Therefore, in the interest to keep the patch series relatively easy to
review, I left this in the "for later" pile, for now.

Ciao,
Dscho

  parent reply	other threads:[~2021-09-03 15:22 UTC|newest]

Thread overview: 303+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-30 21:34 [PATCH 00/15] [RFC] Upstreaming the Scalar command Johannes Schindelin via GitGitGadget
2021-08-30 21:34 ` [PATCH 01/15] scalar: create a rudimentary executable Johannes Schindelin via GitGitGadget
2021-08-30 21:34 ` [PATCH 02/15] scalar: start documenting the command Johannes Schindelin via GitGitGadget
2021-08-30 21:34 ` [PATCH 03/15] scalar: create test infrastructure Johannes Schindelin via GitGitGadget
2021-08-31  8:15   ` Ævar Arnfjörð Bjarmason
2021-08-30 21:34 ` [PATCH 04/15] scalar: 'register' sets recommended config and starts maintenance Derrick Stolee via GitGitGadget
2021-08-31  8:11   ` Ævar Arnfjörð Bjarmason
2021-08-31 14:22     ` Derrick Stolee
2021-09-01 16:16   ` Junio C Hamano
2021-09-03 15:41     ` Johannes Schindelin
2021-09-03 17:35       ` Junio C Hamano
2021-08-30 21:34 ` [PATCH 05/15] scalar: 'unregister' stops background maintenance Derrick Stolee via GitGitGadget
2021-08-30 21:34 ` [PATCH 06/15] scalar: let 'unregister' handle a deleted enlistment directory gracefully Johannes Schindelin via GitGitGadget
2021-08-30 21:34 ` [PATCH 07/15] scalar: implement 'scalar list' Derrick Stolee via GitGitGadget
2021-08-30 21:34 ` [PATCH 08/15] scalar: implement the `clone` subcommand Johannes Schindelin via GitGitGadget
2021-08-31  8:23   ` Ævar Arnfjörð Bjarmason
2021-08-31 16:47     ` Eric Sunshine
2021-09-03 15:21       ` Johannes Schindelin
2021-09-01 16:45   ` Junio C Hamano
2021-09-03 12:30     ` Derrick Stolee
2021-09-03 17:18       ` Junio C Hamano
2021-09-03 15:20     ` Johannes Schindelin [this message]
2021-09-03 17:29       ` Junio C Hamano
2021-09-08 18:59         ` Johannes Schindelin
2021-09-09 10:29           ` Ævar Arnfjörð Bjarmason
2021-09-28  5:19   ` Elijah Newren
2021-10-06 20:40     ` Johannes Schindelin
2021-10-07 14:09       ` Elijah Newren
2021-08-30 21:34 ` [PATCH 09/15] scalar: teach 'clone' to support the --single-branch option Johannes Schindelin via GitGitGadget
2021-08-30 21:34 ` [PATCH 10/15] scalar: implement the `run` command Derrick Stolee via GitGitGadget
2021-08-31  8:27   ` Ævar Arnfjörð Bjarmason
2021-09-03 15:50     ` Johannes Schindelin
2021-09-03 17:49       ` Junio C Hamano
2021-09-08 19:11         ` Johannes Schindelin
2021-08-30 21:34 ` [PATCH 11/15] scalar: allow reconfiguring an existing enlistment Johannes Schindelin via GitGitGadget
2021-08-31  8:29   ` Ævar Arnfjörð Bjarmason
2021-09-03 15:53     ` Johannes Schindelin
2021-09-06  1:01       ` Ævar Arnfjörð Bjarmason
2021-08-30 21:34 ` [PATCH 12/15] scalar: teach 'reconfigure' to optionally handle all registered enlistments Johannes Schindelin via GitGitGadget
2021-08-31  6:19   ` Eric Sunshine
2021-09-03 15:23     ` Johannes Schindelin
2021-09-03 17:02       ` Eric Sunshine
2021-09-08 18:21         ` Johannes Schindelin
2021-08-30 21:34 ` [PATCH 13/15] scalar: implement the `delete` command Matthew John Cheetham via GitGitGadget
2021-08-30 21:34 ` [PATCH 14/15] scalar: implement the `version` command Johannes Schindelin via GitGitGadget
2021-08-31  6:24   ` Eric Sunshine
2021-09-03 15:24     ` Johannes Schindelin
2021-08-30 21:34 ` [PATCH 15/15] scalar: accept -C and -c options before the subcommand Johannes Schindelin via GitGitGadget
2021-08-31  8:32   ` Ævar Arnfjörð Bjarmason
2021-08-31 14:30     ` Derrick Stolee
2021-08-31 14:52       ` Ævar Arnfjörð Bjarmason
2021-08-31  0:51 ` [PATCH 00/15] [RFC] Upstreaming the Scalar command Derrick Stolee
2021-09-01 15:00   ` Elijah Newren
2021-09-03 17:54 ` [PATCH v2 " Johannes Schindelin via GitGitGadget
2021-09-03 17:54   ` [PATCH v2 01/15] scalar: create a rudimentary executable Johannes Schindelin via GitGitGadget
2021-09-14 10:47     ` Ævar Arnfjörð Bjarmason
2021-09-03 17:54   ` [PATCH v2 02/15] scalar: start documenting the command Johannes Schindelin via GitGitGadget
2021-09-03 17:54   ` [PATCH v2 03/15] scalar: create test infrastructure Johannes Schindelin via GitGitGadget
2021-09-03 17:54   ` [PATCH v2 04/15] scalar: 'register' sets recommended config and starts maintenance Derrick Stolee via GitGitGadget
2021-09-03 17:54   ` [PATCH v2 05/15] scalar: 'unregister' stops background maintenance Derrick Stolee via GitGitGadget
2021-09-03 17:54   ` [PATCH v2 06/15] scalar: let 'unregister' handle a deleted enlistment directory gracefully Johannes Schindelin via GitGitGadget
2021-09-03 17:54   ` [PATCH v2 07/15] scalar: implement 'scalar list' Derrick Stolee via GitGitGadget
2021-09-04  8:58     ` Bagas Sanjaya
2021-09-08 19:11       ` Johannes Schindelin
2021-09-03 17:54   ` [PATCH v2 08/15] scalar: implement the `clone` subcommand Johannes Schindelin via GitGitGadget
2021-09-06  1:12     ` Ævar Arnfjörð Bjarmason
2021-09-08 19:23       ` Johannes Schindelin
2021-09-03 17:54   ` [PATCH v2 09/15] scalar: teach 'clone' to support the --single-branch option Johannes Schindelin via GitGitGadget
2021-09-03 17:54   ` [PATCH v2 10/15] scalar: implement the `run` command Derrick Stolee via GitGitGadget
2021-09-03 17:54   ` [PATCH v2 11/15] scalar: allow reconfiguring an existing enlistment Johannes Schindelin via GitGitGadget
2021-09-03 17:54   ` [PATCH v2 12/15] scalar: teach 'reconfigure' to optionally handle all registered enlistments Johannes Schindelin via GitGitGadget
2021-09-03 17:54   ` [PATCH v2 13/15] scalar: implement the `delete` command Matthew John Cheetham via GitGitGadget
2021-09-03 17:54   ` [PATCH v2 14/15] scalar: implement the `version` command Johannes Schindelin via GitGitGadget
2021-09-03 17:54   ` [PATCH v2 15/15] scalar: accept -C and -c options before the subcommand Johannes Schindelin via GitGitGadget
2021-09-06  0:59   ` [PATCH v2 00/15] [RFC] Upstreaming the Scalar command Ævar Arnfjörð Bjarmason
2021-09-08 19:24   ` [PATCH v3 " Johannes Schindelin via GitGitGadget
2021-09-08 19:24     ` [PATCH v3 01/15] scalar: create a rudimentary executable Johannes Schindelin via GitGitGadget
2021-09-09 15:36       ` Elijah Newren
2021-09-13 13:32         ` Johannes Schindelin
2021-09-08 19:24     ` [PATCH v3 02/15] scalar: start documenting the command Johannes Schindelin via GitGitGadget
2021-09-08 19:24     ` [PATCH v3 03/15] scalar: create test infrastructure Johannes Schindelin via GitGitGadget
2021-09-08 19:24     ` [PATCH v3 04/15] scalar: 'register' sets recommended config and starts maintenance Derrick Stolee via GitGitGadget
2021-09-08 19:24     ` [PATCH v3 05/15] scalar: 'unregister' stops background maintenance Derrick Stolee via GitGitGadget
2021-09-08 19:24     ` [PATCH v3 06/15] scalar: let 'unregister' handle a deleted enlistment directory gracefully Johannes Schindelin via GitGitGadget
2021-09-08 19:24     ` [PATCH v3 07/15] scalar: implement 'scalar list' Derrick Stolee via GitGitGadget
2021-09-09  6:11       ` Bagas Sanjaya
2021-09-08 19:24     ` [PATCH v3 08/15] scalar: implement the `clone` subcommand Johannes Schindelin via GitGitGadget
2021-09-08 19:24     ` [PATCH v3 09/15] scalar: teach 'clone' to support the --single-branch option Johannes Schindelin via GitGitGadget
2021-09-08 19:24     ` [PATCH v3 10/15] scalar: implement the `run` command Derrick Stolee via GitGitGadget
2021-09-08 19:24     ` [PATCH v3 11/15] scalar: allow reconfiguring an existing enlistment Johannes Schindelin via GitGitGadget
2021-09-08 19:24     ` [PATCH v3 12/15] scalar: teach 'reconfigure' to optionally handle all registered enlistments Johannes Schindelin via GitGitGadget
2021-09-08 19:24     ` [PATCH v3 13/15] scalar: implement the `delete` command Matthew John Cheetham via GitGitGadget
2021-09-08 19:24     ` [PATCH v3 14/15] scalar: implement the `version` command Johannes Schindelin via GitGitGadget
2021-09-08 19:24     ` [PATCH v3 15/15] scalar: accept -C and -c options before the subcommand Johannes Schindelin via GitGitGadget
2021-09-09 10:14     ` [PATCH v3 00/15] [RFC] Upstreaming the Scalar command Ævar Arnfjörð Bjarmason
2021-09-13 14:20       ` Ævar Arnfjörð Bjarmason
2021-09-13 20:53         ` Johannes Schindelin
2021-09-14 10:59           ` Ævar Arnfjörð Bjarmason
2021-09-14 14:24             ` Train station analogy, was " Johannes Schindelin
2021-09-14 17:29               ` Junio C Hamano
2021-09-14 18:09                 ` Ævar Arnfjörð Bjarmason
2021-09-14 20:35                   ` Derrick Stolee
2021-09-14 23:22                     ` Theodore Ts'o
2021-09-15 17:51                     ` Ævar Arnfjörð Bjarmason
2021-09-14 21:49                 ` Junio C Hamano
2021-10-06 20:09                   ` Johannes Schindelin
2021-10-06 20:25                     ` Junio C Hamano
2021-10-07 10:58                       ` Johannes Schindelin
2021-10-07  1:03                     ` Ævar Arnfjörð Bjarmason
2021-09-14 18:25               ` Ævar Arnfjörð Bjarmason
2021-09-14 14:39     ` [PATCH v4 00/15] " Johannes Schindelin via GitGitGadget
2021-09-14 14:39       ` [PATCH v4 01/15] scalar: create a rudimentary executable Johannes Schindelin via GitGitGadget
2021-09-24 12:52         ` Ævar Arnfjörð Bjarmason
2021-09-24 17:54           ` Junio C Hamano
2021-09-26 19:15             ` Ævar Arnfjörð Bjarmason
2021-09-27 20:32               ` Junio C Hamano
2021-09-14 14:39       ` [PATCH v4 02/15] scalar: start documenting the command Johannes Schindelin via GitGitGadget
2021-09-14 14:39       ` [PATCH v4 03/15] scalar: create test infrastructure Johannes Schindelin via GitGitGadget
2021-09-14 14:39       ` [PATCH v4 04/15] scalar: 'register' sets recommended config and starts maintenance Derrick Stolee via GitGitGadget
2021-09-28  5:01         ` Elijah Newren
2021-09-28  7:27           ` Ævar Arnfjörð Bjarmason
2021-10-06 20:32           ` Johannes Schindelin
2021-09-28  5:05         ` Elijah Newren
2021-10-06 20:38           ` Johannes Schindelin
2021-09-14 14:39       ` [PATCH v4 05/15] scalar: 'unregister' stops background maintenance Derrick Stolee via GitGitGadget
2021-09-14 14:39       ` [PATCH v4 06/15] scalar: let 'unregister' handle a deleted enlistment directory gracefully Johannes Schindelin via GitGitGadget
2021-09-14 14:39       ` [PATCH v4 07/15] scalar: implement 'scalar list' Derrick Stolee via GitGitGadget
2021-09-14 14:39       ` [PATCH v4 08/15] scalar: implement the `clone` subcommand Johannes Schindelin via GitGitGadget
2021-09-14 14:39       ` [PATCH v4 09/15] scalar: teach 'clone' to support the --single-branch option Johannes Schindelin via GitGitGadget
2021-09-14 14:39       ` [PATCH v4 10/15] scalar: implement the `run` command Derrick Stolee via GitGitGadget
2021-09-14 14:39       ` [PATCH v4 11/15] scalar: allow reconfiguring an existing enlistment Johannes Schindelin via GitGitGadget
2021-09-28  5:24         ` Elijah Newren
2021-10-06 20:43           ` Johannes Schindelin
2021-09-14 14:39       ` [PATCH v4 12/15] scalar: teach 'reconfigure' to optionally handle all registered enlistments Johannes Schindelin via GitGitGadget
2021-09-14 14:39       ` [PATCH v4 13/15] scalar: implement the `delete` command Matthew John Cheetham via GitGitGadget
2021-09-28  6:24         ` Elijah Newren
     [not found]           ` <468CE4B8-D2C9-4FBC-B801-739F86C88ACB@outlook.com>
2021-10-06 20:48             ` Johannes Schindelin
2021-09-14 14:39       ` [PATCH v4 14/15] scalar: implement the `version` command Johannes Schindelin via GitGitGadget
2021-09-14 14:39       ` [PATCH v4 15/15] scalar: accept -C and -c options before the subcommand Johannes Schindelin via GitGitGadget
2021-09-14 15:10       ` [PATCH v4 00/15] Upstreaming the Scalar command Johannes Schindelin
2021-09-14 17:51         ` Junio C Hamano
2021-10-07 10:58       ` [PATCH v5 " Johannes Schindelin via GitGitGadget
2021-10-07 10:58         ` [PATCH v5 01/15] scalar: create a rudimentary executable Johannes Schindelin via GitGitGadget
2021-10-07 10:58         ` [PATCH v5 02/15] scalar: start documenting the command Johannes Schindelin via GitGitGadget
2021-10-07 10:58         ` [PATCH v5 03/15] scalar: create test infrastructure Johannes Schindelin via GitGitGadget
2021-10-07 10:58         ` [PATCH v5 04/15] scalar: 'register' sets recommended config and starts maintenance Derrick Stolee via GitGitGadget
2021-10-07 10:58         ` [PATCH v5 05/15] scalar: 'unregister' stops background maintenance Derrick Stolee via GitGitGadget
2021-10-07 10:59         ` [PATCH v5 06/15] scalar: let 'unregister' handle a deleted enlistment directory gracefully Johannes Schindelin via GitGitGadget
2021-10-07 10:59         ` [PATCH v5 07/15] scalar: implement 'scalar list' Derrick Stolee via GitGitGadget
2021-10-07 10:59         ` [PATCH v5 08/15] scalar: implement the `clone` subcommand Johannes Schindelin via GitGitGadget
2021-10-07 10:59         ` [PATCH v5 09/15] scalar: teach 'clone' to support the --single-branch option Johannes Schindelin via GitGitGadget
2021-10-07 10:59         ` [PATCH v5 10/15] scalar: implement the `run` command Derrick Stolee via GitGitGadget
2021-10-07 10:59         ` [PATCH v5 11/15] scalar: allow reconfiguring an existing enlistment Johannes Schindelin via GitGitGadget
2021-10-07 10:59         ` [PATCH v5 12/15] scalar: teach 'reconfigure' to optionally handle all registered enlistments Johannes Schindelin via GitGitGadget
2021-10-07 10:59         ` [PATCH v5 13/15] scalar: implement the `delete` command Matthew John Cheetham via GitGitGadget
2021-10-07 10:59         ` [PATCH v5 14/15] scalar: implement the `version` command Johannes Schindelin via GitGitGadget
2021-10-07 10:59         ` [PATCH v5 15/15] scalar: accept -C and -c options before the subcommand Johannes Schindelin via GitGitGadget
2021-10-07 11:28         ` [PATCH v5 00/15] Upstreaming the Scalar command Ævar Arnfjörð Bjarmason
2021-10-27  8:27         ` [PATCH v6 " Johannes Schindelin via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 01/15] scalar: create a rudimentary executable Johannes Schindelin via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 02/15] scalar: start documenting the command Johannes Schindelin via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 03/15] scalar: create test infrastructure Johannes Schindelin via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 04/15] scalar: 'register' sets recommended config and starts maintenance Derrick Stolee via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 05/15] scalar: 'unregister' stops background maintenance Derrick Stolee via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 06/15] scalar: let 'unregister' handle a deleted enlistment directory gracefully Johannes Schindelin via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 07/15] scalar: implement 'scalar list' Derrick Stolee via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 08/15] scalar: implement the `clone` subcommand Johannes Schindelin via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 09/15] scalar: teach 'clone' to support the --single-branch option Johannes Schindelin via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 10/15] scalar: implement the `run` command Derrick Stolee via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 11/15] scalar: allow reconfiguring an existing enlistment Johannes Schindelin via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 12/15] scalar: teach 'reconfigure' to optionally handle all registered enlistments Johannes Schindelin via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 13/15] scalar: implement the `delete` command Matthew John Cheetham via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 14/15] scalar: implement the `version` command Johannes Schindelin via GitGitGadget
2021-10-27  8:27           ` [PATCH v6 15/15] scalar: accept -C and -c options before the subcommand Johannes Schindelin via GitGitGadget
2021-10-27 21:57           ` [PATCH v6 00/15] Upstreaming the Scalar command Derrick Stolee
2021-11-17 14:19           ` [PATCH v7 00/17] " Johannes Schindelin via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 01/17] scalar: add a README with a roadmap Johannes Schindelin via GitGitGadget
2021-11-17 15:40               ` Derrick Stolee
2021-11-18 13:51                 ` Johannes Schindelin
2021-11-17 14:19             ` [PATCH v7 02/17] scalar: create a rudimentary executable Johannes Schindelin via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 03/17] scalar: start documenting the command Johannes Schindelin via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 04/17] scalar: create test infrastructure Johannes Schindelin via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 05/17] cmake: optionally build `scalar`, too Johannes Schindelin via GitGitGadget
2021-11-17 21:12               ` Matt Rogers
2021-11-18 13:32                 ` Johannes Schindelin
2021-11-17 14:19             ` [PATCH v7 06/17] ci: also run the `scalar` tests Johannes Schindelin via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 07/17] scalar: 'register' sets recommended config and starts maintenance Derrick Stolee via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 08/17] scalar: 'unregister' stops background maintenance Derrick Stolee via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 09/17] scalar: let 'unregister' handle a deleted enlistment directory gracefully Johannes Schindelin via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 10/17] scalar: implement 'scalar list' Derrick Stolee via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 11/17] scalar: implement the `clone` subcommand Johannes Schindelin via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 12/17] scalar: teach 'clone' to support the --single-branch option Johannes Schindelin via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 13/17] scalar: implement the `run` command Derrick Stolee via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 14/17] scalar: allow reconfiguring an existing enlistment Johannes Schindelin via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 15/17] scalar: teach 'reconfigure' to optionally handle all registered enlistments Johannes Schindelin via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 16/17] scalar: implement the `delete` command Matthew John Cheetham via GitGitGadget
2021-11-17 14:19             ` [PATCH v7 17/17] scalar: implement the `version` command Johannes Schindelin via GitGitGadget
2021-11-18 14:11             ` [PATCH v7 00/17] Upstreaming the Scalar command Ævar Arnfjörð Bjarmason
2021-11-19 23:03             ` [PATCH v8 " Johannes Schindelin via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 01/17] scalar: add a README with a roadmap Johannes Schindelin via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 02/17] scalar: create a rudimentary executable Johannes Schindelin via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 03/17] scalar: start documenting the command Johannes Schindelin via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 04/17] scalar: create test infrastructure Johannes Schindelin via GitGitGadget
2021-11-30 13:27                 ` Ævar Arnfjörð Bjarmason
2021-11-19 23:03               ` [PATCH v8 05/17] cmake: optionally build `scalar`, too Johannes Schindelin via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 06/17] ci: also run the `scalar` tests Johannes Schindelin via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 07/17] scalar: 'register' sets recommended config and starts maintenance Derrick Stolee via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 08/17] scalar: 'unregister' stops background maintenance Derrick Stolee via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 09/17] scalar: let 'unregister' handle a deleted enlistment directory gracefully Johannes Schindelin via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 10/17] scalar: implement 'scalar list' Derrick Stolee via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 11/17] scalar: implement the `clone` subcommand Johannes Schindelin via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 12/17] scalar: teach 'clone' to support the --single-branch option Johannes Schindelin via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 13/17] scalar: implement the `run` command Derrick Stolee via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 14/17] scalar: allow reconfiguring an existing enlistment Johannes Schindelin via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 15/17] scalar: teach 'reconfigure' to optionally handle all registered enlistments Johannes Schindelin via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 16/17] scalar: implement the `delete` command Matthew John Cheetham via GitGitGadget
2021-11-19 23:03               ` [PATCH v8 17/17] scalar: implement the `version` command Johannes Schindelin via GitGitGadget
2021-11-20 17:22               ` [PATCH v8 00/17] Upstreaming the Scalar command Elijah Newren
2021-11-22 12:21                 ` Johannes Schindelin
2021-11-22 16:36                   ` Ævar Arnfjörð Bjarmason
2021-11-22 22:08                     ` Johannes Schindelin
2021-11-22 23:29                       ` Ævar Arnfjörð Bjarmason
2021-11-23 11:52                         ` Johannes Schindelin
2021-11-23 12:45                           ` Ævar Arnfjörð Bjarmason
2021-11-23 13:05                             ` Johannes Schindelin
2021-11-30 11:54               ` [PATCH v9 " Johannes Schindelin via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 01/17] scalar: add a README with a roadmap Johannes Schindelin via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 02/17] scalar: create a rudimentary executable Johannes Schindelin via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 03/17] scalar: start documenting the command Johannes Schindelin via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 04/17] scalar: create test infrastructure Johannes Schindelin via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 05/17] cmake: optionally build `scalar`, too Johannes Schindelin via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 06/17] ci: also run the `scalar` tests Johannes Schindelin via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 07/17] scalar: 'register' sets recommended config and starts maintenance Derrick Stolee via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 08/17] scalar: 'unregister' stops background maintenance Derrick Stolee via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 09/17] scalar: let 'unregister' handle a deleted enlistment directory gracefully Johannes Schindelin via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 10/17] scalar: implement 'scalar list' Derrick Stolee via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 11/17] scalar: implement the `clone` subcommand Johannes Schindelin via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 12/17] scalar: teach 'clone' to support the --single-branch option Johannes Schindelin via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 13/17] scalar: implement the `run` command Derrick Stolee via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 14/17] scalar: allow reconfiguring an existing enlistment Johannes Schindelin via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 15/17] scalar: teach 'reconfigure' to optionally handle all registered enlistments Johannes Schindelin via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 16/17] scalar: implement the `delete` command Matthew John Cheetham via GitGitGadget
2021-11-30 11:54                 ` [PATCH v9 17/17] scalar: implement the `version` command Johannes Schindelin via GitGitGadget
2021-11-30 12:16                 ` [PATCH v9 00/17] Upstreaming the Scalar command Ævar Arnfjörð Bjarmason
2021-11-30 14:11                   ` Johannes Schindelin
2021-11-30 14:50                     ` Ævar Arnfjörð Bjarmason
2021-12-01 17:58                     ` Junio C Hamano
2021-12-02 14:53                       ` Johannes Schindelin
2021-12-02 17:03                         ` Junio C Hamano
2021-12-02 17:39                           ` Elijah Newren
2021-12-02 18:42                             ` Junio C Hamano
2021-12-08 11:26                               ` Johannes Schindelin
2021-12-09  4:02                                 ` Junio C Hamano
2021-12-03 13:34                 ` [PATCH v10 00/15] " Johannes Schindelin via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 01/15] scalar: add a README with a roadmap Johannes Schindelin via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 02/15] scalar: create a rudimentary executable Johannes Schindelin via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 03/15] scalar: start documenting the command Johannes Schindelin via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 04/15] scalar: create test infrastructure Johannes Schindelin via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 05/15] scalar: 'register' sets recommended config and starts maintenance Derrick Stolee via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 06/15] scalar: 'unregister' stops background maintenance Derrick Stolee via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 07/15] scalar: let 'unregister' handle a deleted enlistment directory gracefully Johannes Schindelin via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 08/15] scalar: implement 'scalar list' Derrick Stolee via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 09/15] scalar: implement the `clone` subcommand Johannes Schindelin via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 10/15] scalar: teach 'clone' to support the --single-branch option Johannes Schindelin via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 11/15] scalar: implement the `run` command Derrick Stolee via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 12/15] scalar: allow reconfiguring an existing enlistment Johannes Schindelin via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 13/15] scalar: teach 'reconfigure' to optionally handle all registered enlistments Johannes Schindelin via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 14/15] scalar: implement the `delete` command Matthew John Cheetham via GitGitGadget
2021-12-03 13:34                   ` [PATCH v10 15/15] scalar: implement the `version` command Johannes Schindelin via GitGitGadget
2021-12-03 15:48                   ` [PATCH v10 00/15] Upstreaming the Scalar command Elijah Newren
2021-12-05 10:02                     ` Junio C Hamano
2021-12-07 20:05                       ` Ævar Arnfjörð Bjarmason
2021-12-08 19:55                         ` Junio C Hamano
2021-12-08 20:04                           ` [RFC/PATCH] Makefile: add test-all target Junio C Hamano
2021-12-08 21:30                             ` Derrick Stolee
2021-12-08 22:22                               ` Junio C Hamano
2021-12-08 21:52                             ` Jeff King
2021-12-08 22:25                               ` Junio C Hamano
2021-12-09 17:57                               ` Junio C Hamano
2021-12-10  8:37                                 ` Jeff King
2021-12-13  9:12                                   ` Junio C Hamano
2021-12-09  3:44                             ` Ævar Arnfjörð Bjarmason
2021-12-09 18:12                               ` Junio C Hamano
2021-12-10  2:38                                 ` Ævar Arnfjörð Bjarmason
2021-12-10  8:50                                   ` Jeff King
2021-12-10  9:30                                     ` Ævar Arnfjörð Bjarmason
2021-12-10 23:43                                     ` Johannes Schindelin
2021-12-10 23:27                                 ` Elijah Newren
2021-12-13  9:12                                   ` Junio C Hamano
2021-12-10 23:14                             ` Johannes Schindelin
2021-12-13  8:42                               ` Junio C Hamano
2021-12-14 13:16                                 ` Jeff King
2021-12-14 13:18                                   ` Jeff King
2021-12-11 11:08                             ` Bagas Sanjaya
2021-12-08 11:15                       ` [PATCH v10 00/15] Upstreaming the Scalar command Johannes Schindelin
2021-12-08 13:04                         ` Ævar Arnfjörð Bjarmason
2021-12-08 14:17                         ` Derrick Stolee
2021-12-08 18:29                         ` Elijah Newren
2021-12-09  3:52                         ` Junio C Hamano
2021-12-11  0:29                           ` Johannes Schindelin
2021-12-11  1:07                             ` Ævar Arnfjörð Bjarmason
2021-12-11  5:15                             ` Elijah Newren
2021-12-11 13:46                               ` Johannes Schindelin

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=nycvar.QRO.7.76.6.2109031709190.55@tvgsbejvaqbjf.bet \
    --to=johannes.schindelin@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=gitster@pobox.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).