From: Jonathan Tan <jonathantanmy@google.com>
To: git@vger.kernel.org
Cc: Jonathan Tan <jonathantanmy@google.com>, gitster@pobox.com
Subject: [PATCH v7 0/3] Cloning with remote unborn HEAD
Date: Thu, 4 Feb 2021 20:58:30 -0800 [thread overview]
Message-ID: <cover.1612493309.git.jonathantanmy@google.com> (raw)
In-Reply-To: <20201208013121.677494-1-jonathantanmy@google.com>
For what it's worth, here's v7 with advertise/allow/ignore and by
default, advertise. I think that some server operators will have use for
this feature, and people who want to disable it for whatever reason can
still do so. The main disadvantage is complexity - the server knob that
server administrators will need to control (but between a simpler
allow/ignore knob and a more complicated advertise/allow/ignore knob, I
think we might as well go for the slightly more complex one) and
complexity in the code (but now that is constrained to one function and
a few global variables).
As you can see from the range-diff, not much has changed from v6.
I've also included Junio's suggestion of tightening the promise made by
the server (when the client says "unborn").
Jonathan Tan (3):
ls-refs: report unborn targets of symrefs
connect, transport: encapsulate arg in struct
clone: respect remote unborn HEAD
Documentation/config.txt | 2 +
Documentation/config/init.txt | 2 +-
Documentation/config/lsrefs.txt | 9 +++
Documentation/technical/protocol-v2.txt | 11 +++-
builtin/clone.c | 34 +++++++++---
builtin/fetch-pack.c | 3 +-
builtin/fetch.c | 18 +++---
builtin/ls-remote.c | 9 +--
connect.c | 32 ++++++++++-
ls-refs.c | 74 ++++++++++++++++++++++++-
ls-refs.h | 1 +
remote.h | 4 +-
serve.c | 2 +-
t/t5606-clone-options.sh | 8 ++-
t/t5701-git-serve.sh | 2 +-
t/t5702-protocol-v2.sh | 25 +++++++++
transport-helper.c | 5 +-
transport-internal.h | 10 +---
transport.c | 23 ++++----
transport.h | 29 +++++++---
20 files changed, 240 insertions(+), 63 deletions(-)
create mode 100644 Documentation/config/lsrefs.txt
Range-diff against v6:
1: 411bbafe25 ! 1: 2d35075369 ls-refs: report unborn targets of symrefs
@@ Commit message
Currently, symrefs that have unborn targets (such as in this case) are
not communicated by the protocol. Teach Git to advertise and support the
"unborn" feature in "ls-refs" (by default, this is advertised, but
- server administrators may turn this off through the lsrefs.allowunborn
+ server administrators may turn this off through the lsrefs.unborn
config). This feature indicates that "ls-refs" supports the "unborn"
argument; when it is specified, "ls-refs" will send the HEAD symref with
the name of its unborn target.
@@ Documentation/config.txt: include::config/interactive.txt[]
## Documentation/config/lsrefs.txt (new) ##
@@
-+lsrefs.allowUnborn::
-+ Allow the server to send information about unborn symrefs during the
-+ protocol v2 ref advertisement.
++lsrefs.unborn::
++ May be "advertise" (the default), "allow", or "ignore". If "advertise",
++ the server will respond to the client sending "unborn" (as described in
++ protocol-v2.txt) and will advertise support for this feature during the
++ protocol v2 capability advertisement. "allow" is the same as
++ "advertise" except that the server will not advertise support for this
++ feature; this is useful for load-balanced servers that cannot be
++ updated automatically (for example), since the administrator could
++ configure "allow", then after a delay, configure "advertise".
## Documentation/technical/protocol-v2.txt ##
@@ Documentation/technical/protocol-v2.txt: ls-refs takes in the following arguments:
@@ Documentation/technical/protocol-v2.txt: ls-refs takes in the following argument
+included in the client's request.
+
+ unborn
-+ The server may send symrefs pointing to unborn branches in the form
-+ "unborn <refname> symref-target:<target>".
++ The server will send information about HEAD even if it is a symref
++ pointing to an unborn branch in the form "unborn HEAD
++ symref-target:<target>".
+
The output of ls-refs is as follows:
@@ ls-refs.c
#include "config.h"
+static int config_read;
++static int advertise_unborn;
+static int allow_unborn;
+
+static void ensure_config_read(void)
+{
++ char *str = NULL;
++
+ if (config_read)
+ return;
+
-+ if (repo_config_get_bool(the_repository, "lsrefs.allowunborn",
-+ &allow_unborn))
++ if (repo_config_get_string(the_repository, "lsrefs.unborn", &str)) {
+ /*
-+ * If there is no such config, set it to 1 to allow it by
++ * If there is no such config, advertise and allow it by
+ * default.
+ */
++ advertise_unborn = 1;
+ allow_unborn = 1;
++ } else {
++ if (!strcmp(str, "advertise")) {
++ advertise_unborn = 1;
++ allow_unborn = 1;
++ } else if (!strcmp(str, "allow")) {
++ allow_unborn = 1;
++ } else if (!strcmp(str, "ignore")) {
++ /* do nothing */
++ } else {
++ die(_("invalid value '%s' for lsrefs.unborn"), str);
++ }
++ }
+ config_read = 1;
+}
+
@@ ls-refs.c: int ls_refs(struct repository *r, struct strvec *keys,
+{
+ if (value) {
+ ensure_config_read();
-+ if (allow_unborn)
++ if (advertise_unborn)
+ strbuf_addstr(value, "unborn");
+ }
+
2: fad1ebe6b6 = 2: d4ed13d02e connect, transport: encapsulate arg in struct
3: 45a48ccc0d ! 3: a3e5a0a7c5 clone: respect remote unborn HEAD
@@ t/t5606-clone-options.sh: test_expect_success 'redirected clone -v does show pro
- git init --bare empty &&
+ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \
+ git -c init.defaultBranch=foo init --bare empty &&
-+ test_config -C empty lsrefs.allowUnborn true &&
++ test_config -C empty lsrefs.unborn advertise &&
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \
git -c init.defaultBranch=up clone empty whats-up &&
- test refs/heads/up = $(git -C whats-up symbolic-ref HEAD) &&
@@ t/t5702-protocol-v2.sh: test_expect_success 'clone with file:// using protocol v
+
+ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \
+ git -c init.defaultBranch=mydefaultbranch init file_empty_parent &&
-+ test_config -C file_empty_parent lsrefs.allowUnborn false &&
++ test_config -C file_empty_parent lsrefs.unborn ignore &&
+
+ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \
+ git -c init.defaultBranch=main -c protocol.version=2 \
--
2.30.0.365.g02bc693789-goog
next prev parent reply other threads:[~2021-02-05 4:59 UTC|newest]
Thread overview: 109+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-08 1:31 Cloning empty repository uses locally configured default branch name Jonathan Tan
2020-12-08 2:16 ` Junio C Hamano
2020-12-08 2:32 ` brian m. carlson
2020-12-08 18:55 ` Jonathan Tan
2020-12-08 21:00 ` Junio C Hamano
2020-12-08 15:58 ` Jeff King
2020-12-08 20:06 ` Jonathan Tan
2020-12-08 21:15 ` Jeff King
2020-12-11 21:05 ` [PATCH] clone: in protocol v2, use remote's default branch Jonathan Tan
2020-12-11 23:41 ` Junio C Hamano
2020-12-14 12:38 ` Ævar Arnfjörð Bjarmason
2020-12-14 15:51 ` Felipe Contreras
2020-12-14 16:30 ` Junio C Hamano
2020-12-15 1:41 ` Ævar Arnfjörð Bjarmason
2020-12-15 2:22 ` Junio C Hamano
2020-12-15 2:38 ` Jeff King
2020-12-15 2:55 ` Junio C Hamano
2020-12-15 4:36 ` Jeff King
2020-12-16 3:09 ` Junio C Hamano
2020-12-16 18:39 ` Jeff King
2020-12-16 20:56 ` Junio C Hamano
2020-12-18 6:19 ` Jeff King
2020-12-15 3:22 ` Felipe Contreras
2020-12-14 19:25 ` Jonathan Tan
2020-12-14 19:42 ` Felipe Contreras
2020-12-15 1:27 ` Jeff King
2020-12-15 19:10 ` Jonathan Tan
2020-12-16 2:07 ` [PATCH v2 0/3] Cloning with remote unborn HEAD Jonathan Tan
2020-12-16 2:07 ` [PATCH v2 1/3] ls-refs: report unborn targets of symrefs Jonathan Tan
2020-12-16 6:16 ` Junio C Hamano
2020-12-16 23:49 ` Jonathan Tan
2020-12-16 18:23 ` Jeff King
2020-12-16 23:54 ` Jonathan Tan
2020-12-17 1:32 ` Junio C Hamano
2020-12-18 6:16 ` Jeff King
2020-12-16 2:07 ` [PATCH v2 2/3] connect, transport: add no-op arg for future patch Jonathan Tan
2020-12-16 6:20 ` Junio C Hamano
2020-12-16 2:07 ` [PATCH v2 3/3] clone: respect remote unborn HEAD Jonathan Tan
2020-12-21 22:30 ` [PATCH v3 0/3] Cloning with " Jonathan Tan
2020-12-21 22:30 ` [PATCH v3 1/3] ls-refs: report unborn targets of symrefs Jonathan Tan
2020-12-21 22:31 ` [PATCH v3 2/3] connect, transport: add no-op arg for future patch Jonathan Tan
2020-12-21 22:31 ` [PATCH v3 3/3] clone: respect remote unborn HEAD Jonathan Tan
2020-12-21 23:48 ` [PATCH v3 0/3] Cloning with " Junio C Hamano
2021-01-21 20:14 ` Jeff King
2020-12-22 21:54 ` [PATCH v4 " Jonathan Tan
2020-12-22 21:54 ` [PATCH v4 1/3] ls-refs: report unborn targets of symrefs Jonathan Tan
2021-01-21 20:48 ` Jeff King
2021-01-26 18:13 ` Jonathan Tan
2021-01-26 23:16 ` Jeff King
2020-12-22 21:54 ` [PATCH v4 2/3] connect, transport: add no-op arg for future patch Jonathan Tan
2021-01-21 20:55 ` Jeff King
2021-01-26 18:16 ` Jonathan Tan
2020-12-22 21:54 ` [PATCH v4 3/3] clone: respect remote unborn HEAD Jonathan Tan
2021-01-21 21:02 ` Jeff King
2021-01-26 18:22 ` Jonathan Tan
2021-01-26 23:04 ` Jeff King
2021-01-28 5:50 ` Junio C Hamano
2020-12-22 22:06 ` [PATCH v4 0/3] Cloning with " Junio C Hamano
2021-01-26 18:55 ` [PATCH v5 " Jonathan Tan
2021-01-26 18:55 ` [PATCH v5 1/3] ls-refs: report unborn targets of symrefs Jonathan Tan
2021-01-26 21:38 ` Junio C Hamano
2021-01-26 23:03 ` Junio C Hamano
2021-01-30 3:55 ` Jonathan Tan
2021-01-26 23:20 ` Jeff King
2021-01-26 23:38 ` Junio C Hamano
2021-01-29 20:23 ` Jonathan Tan
2021-01-29 22:04 ` Junio C Hamano
2021-02-02 2:20 ` Jonathan Tan
2021-02-02 5:00 ` Junio C Hamano
2021-01-27 1:28 ` Ævar Arnfjörð Bjarmason
2021-01-30 4:04 ` Jonathan Tan
2021-01-26 18:55 ` [PATCH v5 2/3] connect, transport: encapsulate arg in struct Jonathan Tan
2021-01-26 21:54 ` Junio C Hamano
2021-01-30 4:06 ` Jonathan Tan
2021-01-26 18:55 ` [PATCH v5 3/3] clone: respect remote unborn HEAD Jonathan Tan
2021-01-26 22:24 ` Junio C Hamano
2021-01-30 4:27 ` Jonathan Tan
2021-01-27 1:11 ` [PATCH v5 0/3] Cloning with " Junio C Hamano
2021-01-27 4:25 ` Jeff King
2021-01-27 6:14 ` Junio C Hamano
2021-01-27 1:41 ` Ævar Arnfjörð Bjarmason
2021-01-30 4:41 ` Jonathan Tan
2021-01-30 11:13 ` Ævar Arnfjörð Bjarmason
2021-02-02 2:22 ` Jonathan Tan
2021-02-03 14:23 ` Ævar Arnfjörð Bjarmason
2021-02-05 22:28 ` Junio C Hamano
2021-02-02 2:14 ` [PATCH v6 " Jonathan Tan
2021-02-02 2:14 ` [PATCH v6 1/3] ls-refs: report unborn targets of symrefs Jonathan Tan
2021-02-02 16:55 ` Junio C Hamano
2021-02-02 18:34 ` Jonathan Tan
2021-02-02 22:17 ` Junio C Hamano
2021-02-03 1:04 ` Jonathan Tan
2021-02-02 2:15 ` [PATCH v6 2/3] connect, transport: encapsulate arg in struct Jonathan Tan
2021-02-02 2:15 ` [PATCH v6 3/3] clone: respect remote unborn HEAD Jonathan Tan
2021-02-05 4:58 ` Jonathan Tan [this message]
2021-02-05 4:58 ` [PATCH v7 1/3] ls-refs: report unborn targets of symrefs Jonathan Tan
2021-02-05 16:10 ` Jeff King
2021-02-05 4:58 ` [PATCH v7 2/3] connect, transport: encapsulate arg in struct Jonathan Tan
2021-02-05 4:58 ` [PATCH v7 3/3] clone: respect remote unborn HEAD Jonathan Tan
2021-02-05 5:25 ` [PATCH v7 0/3] Cloning with " Junio C Hamano
2021-02-05 16:15 ` Jeff King
2021-02-05 21:15 ` Ævar Arnfjörð Bjarmason
2021-02-05 23:07 ` Junio C Hamano
2021-02-05 20:48 ` [PATCH v8 " Jonathan Tan
2021-02-05 20:48 ` [PATCH v8 1/3] ls-refs: report unborn targets of symrefs Jonathan Tan
2021-02-05 20:48 ` [PATCH v8 2/3] connect, transport: encapsulate arg in struct Jonathan Tan
2021-02-05 20:48 ` [PATCH v8 3/3] clone: respect remote unborn HEAD Jonathan Tan
2021-02-06 18:51 ` [PATCH v8 0/3] Cloning with " Junio C Hamano
2021-02-08 22:28 ` Junio C Hamano
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cover.1612493309.git.jonathantanmy@google.com \
--to=jonathantanmy@google.com \
--cc=git@vger.kernel.org \
--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.
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 NNTP newsgroup(s).