All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Tan <jonathantanmy@google.com>
To: git@vger.kernel.org
Cc: Jonathan Tan <jonathantanmy@google.com>,
	gitster@pobox.com, peff@peff.net
Subject: [PATCH v6 0/3] Cloning with remote unborn HEAD
Date: Mon,  1 Feb 2021 18:14:58 -0800	[thread overview]
Message-ID: <cover.1612231707.git.jonathantanmy@google.com> (raw)
In-Reply-To: <20201208013121.677494-1-jonathantanmy@google.com>

I don't think we have consensus on whether the "unborn" config should be
advertise/allow/ignore or allow/ignore, so I have left that the same as
in version 5.

But as Junio suggested, I have isolated the reading of config into a
function and some global variables (so that one part can "leave a note"
to the other), so we could have advertise/allow/ignore (if we want)
without making the rest of the code much more complicated.

Other changes:
 - Updated the if/else cascade that parses the input to ls-refs to
   follow Junio's suggestion - "else if (!strcmp("unborn", arg)) {".
 - Moved create_symref() to cover the exact case it's needed.
 - Squashed Ramsay Jones's and Peff's patches.

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         |  3 ++
 Documentation/technical/protocol-v2.txt | 10 ++++-
 builtin/clone.c                         | 34 ++++++++++----
 builtin/fetch-pack.c                    |  3 +-
 builtin/fetch.c                         | 18 +++++---
 builtin/ls-remote.c                     |  9 ++--
 connect.c                               | 32 ++++++++++++--
 ls-refs.c                               | 59 +++++++++++++++++++++++--
 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, 218 insertions(+), 63 deletions(-)
 create mode 100644 Documentation/config/lsrefs.txt

Range-diff against v5:
1:  cb033f9abc ! 1:  411bbafe25 ls-refs: report unborn targets of symrefs
    @@ Documentation/technical/protocol-v2.txt: ls-refs takes in the following argument
          peeled = "peeled:" obj-id
     
      ## ls-refs.c ##
    +@@
    + #include "pkt-line.h"
    + #include "config.h"
    + 
    ++static int config_read;
    ++static int allow_unborn;
    ++
    ++static void ensure_config_read(void)
    ++{
    ++	if (config_read)
    ++		return;
    ++
    ++	if (repo_config_get_bool(the_repository, "lsrefs.allowunborn",
    ++				 &allow_unborn))
    ++		/*
    ++		 * If there is no such config, set it to 1 to allow it by
    ++		 * default.
    ++		 */
    ++		allow_unborn = 1;
    ++	config_read = 1;
    ++}
    ++
    + /*
    +  * Check if one of the prefixes is a prefix of the ref.
    +  * If no prefixes were provided, all refs match.
     @@ ls-refs.c: struct ls_refs_data {
      	unsigned peel;
      	unsigned symrefs;
      	struct strvec prefixes;
    -+	unsigned allow_unborn : 1;
     +	unsigned unborn : 1;
      };
      
    @@ ls-refs.c: static int send_ref(const char *refname, const struct object_id *oid,
      	if (data->symrefs && flag & REF_ISSYMREF) {
      		struct object_id unused;
      		const char *symref_target = resolve_ref_unsafe(refname, 0,
    +@@ ls-refs.c: static int send_ref(const char *refname, const struct object_id *oid,
    + 			    strip_namespace(symref_target));
    + 	}
    + 
    +-	if (data->peel) {
    ++	if (data->peel && oid) {
    + 		struct object_id peeled;
    + 		if (!peel_ref(refname, &peeled))
    + 			strbuf_addf(&refline, " peeled:%s", oid_to_hex(&peeled));
     @@ ls-refs.c: static int send_ref(const char *refname, const struct object_id *oid,
      	return 0;
      }
      
    --static int ls_refs_config(const char *var, const char *value, void *data)
     +static void send_possibly_unborn_head(struct ls_refs_data *data)
    - {
    ++{
     +	struct strbuf namespaced = STRBUF_INIT;
     +	struct object_id oid;
     +	int flag;
    @@ ls-refs.c: static int send_ref(const char *refname, const struct object_id *oid,
     +	strbuf_release(&namespaced);
     +}
     +
    -+static int ls_refs_config(const char *var, const char *value, void *cb_data)
    -+{
    -+	struct ls_refs_data *data = cb_data;
    -+
    -+	if (!strcmp("lsrefs.allowunborn", var))
    -+		data->allow_unborn = git_config_bool(var, value);
    -+
    + static int ls_refs_config(const char *var, const char *value, void *data)
    + {
      	/*
    - 	 * We only serve fetches over v2 for now, so respect only "uploadpack"
    - 	 * config. This may need to eventually be expanded to "receive", but we
     @@ ls-refs.c: int ls_refs(struct repository *r, struct strvec *keys,
      
      	memset(&data, 0, sizeof(data));
      
    --	git_config(ls_refs_config, NULL);
    -+	data.allow_unborn = 1;
    -+	git_config(ls_refs_config, &data);
    ++	ensure_config_read();
    + 	git_config(ls_refs_config, NULL);
      
      	while (packet_reader_read(request) == PACKET_READ_NORMAL) {
    - 		const char *arg = request->line;
     @@ ls-refs.c: int ls_refs(struct repository *r, struct strvec *keys,
      			data.symrefs = 1;
      		else if (skip_prefix(arg, "ref-prefix ", &out))
      			strvec_push(&data.prefixes, out);
    -+		else if (data.allow_unborn && !strcmp("unborn", arg))
    -+			data.unborn = 1;
    ++		else if (!strcmp("unborn", arg))
    ++			data.unborn = allow_unborn;
      	}
      
      	if (request->status != PACKET_READ_FLUSH)
    @@ ls-refs.c: int ls_refs(struct repository *r, struct strvec *keys,
     +int ls_refs_advertise(struct repository *r, struct strbuf *value)
     +{
     +	if (value) {
    -+		int allow_unborn_value;
    -+
    -+		if (repo_config_get_bool(the_repository,
    -+					 "lsrefs.allowunborn",
    -+					 &allow_unborn_value) ||
    -+		    allow_unborn_value)
    ++		ensure_config_read();
    ++		if (allow_unborn)
     +			strbuf_addstr(value, "unborn");
     +	}
     +
2:  0c7ab71872 ! 2:  fad1ebe6b6 connect, transport: encapsulate arg in struct
    @@ transport-helper.c: static int has_attribute(const char *attrs, const char *attr
      	return get_refs_list_using_list(transport, for_push);
     
      ## transport-internal.h ##
    +@@
    + struct ref;
    + struct transport;
    + struct strvec;
    ++struct transport_ls_refs_options;
    + 
    + struct transport_vtable {
    + 	/**
     @@ transport-internal.h: struct transport_vtable {
      	 * the transport to try to share connections, for_push is a
      	 * hint as to whether the ultimate operation is a push or a fetch.
3:  8015415c79 ! 3:  45a48ccc0d clone: respect remote unborn HEAD
    @@ builtin/clone.c: int cmd_clone(int argc, const char **argv, const char *prefix)
     +					"refs/heads/", &branch)) {
     +				ref = transport_ls_refs_options.unborn_head_target;
     +				transport_ls_refs_options.unborn_head_target = NULL;
    ++				create_symref("HEAD", ref, reflog_msg.buf);
     +			} else {
     +				branch = git_default_branch_name();
     +				ref = xstrfmt("refs/heads/%s", branch);
     +			}
      
      			install_branch_config(0, branch, remote_name, ref);
    -+			create_symref("HEAD", ref, "");
      			free(ref);
    - 		}
    - 	}
     @@ builtin/clone.c: int cmd_clone(int argc, const char **argv, const char *prefix)
      	junk_mode = JUNK_LEAVE_ALL;
      
4:  1c06db6494 < -:  ---------- ls-refs: don't peel NULL oid
5:  30d83a9dfa < -:  ---------- transport-internal.h: fix a 'hdr-check' warning
-- 
2.30.0.365.g02bc693789-goog


  parent reply	other threads:[~2021-02-02  2:15 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 ` Jonathan Tan [this message]
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 ` [PATCH v7 0/3] Cloning with " Jonathan Tan
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.1612231707.git.jonathantanmy@google.com \
    --to=jonathantanmy@google.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=peff@peff.net \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.