diff mbox series

[v2,2/3] connect, transport: add no-op arg for future patch

Message ID e24fb6d746279a71f8d6a532790231c2a46468aa.1608084282.git.jonathantanmy@google.com (mailing list archive)
State Superseded
Headers show
Series Cloning with remote unborn HEAD | expand

Commit Message

Jonathan Tan Dec. 16, 2020, 2:07 a.m. UTC
A future patch will require transport_get_remote_refs() and
get_remote_refs() to gain a new argument. Add the argument in this
patch, with no effect on execution, so that the future patch only needs
to concern itself with new logic.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
---
 builtin/clone.c      |  2 +-
 builtin/fetch-pack.c |  3 ++-
 builtin/fetch.c      |  2 +-
 builtin/ls-remote.c  |  2 +-
 builtin/remote.c     |  2 +-
 connect.c            |  5 ++++-
 remote.h             |  3 ++-
 transport-helper.c   |  7 +++++--
 transport-internal.h | 13 +++++--------
 transport.c          | 29 ++++++++++++++++++-----------
 transport.h          |  7 ++++++-
 11 files changed, 46 insertions(+), 29 deletions(-)

Comments

Junio C Hamano Dec. 16, 2020, 6:20 a.m. UTC | #1
Jonathan Tan <jonathantanmy@google.com> writes:

> A future patch will require transport_get_remote_refs() and
> get_remote_refs() to gain a new argument. Add the argument in this
> patch, with no effect on execution, so that the future patch only needs
> to concern itself with new logic.

Please give at least a hint about what this "new argument" will be
passing around through the callchain.  E.g.

	In a future patch we plan to return the name of an unborn
	current branch from deep in the callchain to a caller via a
	new pointer parameter that points at a variable in the
	caller when the caller calls get_remote_refs() and
	transport_get_remote_refs().  Add the parameter to functions
	involved in the callchain, but no caller passes an actual
	argument yet in this step ...

or something like that.

>
> Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
> ---
>  builtin/clone.c      |  2 +-
>  builtin/fetch-pack.c |  3 ++-
>  builtin/fetch.c      |  2 +-
>  builtin/ls-remote.c  |  2 +-
>  builtin/remote.c     |  2 +-
>  connect.c            |  5 ++++-
>  remote.h             |  3 ++-
>  transport-helper.c   |  7 +++++--
>  transport-internal.h | 13 +++++--------
>  transport.c          | 29 ++++++++++++++++++-----------
>  transport.h          |  7 ++++++-
>  11 files changed, 46 insertions(+), 29 deletions(-)
>
> diff --git a/builtin/clone.c b/builtin/clone.c
> index a0841923cf..70f9450db4 100644
> --- a/builtin/clone.c
> +++ b/builtin/clone.c
> @@ -1264,7 +1264,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
>  	if (!option_no_tags)
>  		strvec_push(&ref_prefixes, "refs/tags/");
>  
> -	refs = transport_get_remote_refs(transport, &ref_prefixes);
> +	refs = transport_get_remote_refs(transport, &ref_prefixes, NULL);
>  
>  	if (refs) {
>  		int hash_algo = hash_algo_by_ptr(transport_get_hash_algo(transport));
> diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c
> index 58b7c1fbdc..9f921dfab4 100644
> --- a/builtin/fetch-pack.c
> +++ b/builtin/fetch-pack.c
> @@ -220,7 +220,8 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
>  	version = discover_version(&reader);
>  	switch (version) {
>  	case protocol_v2:
> -		get_remote_refs(fd[1], &reader, &ref, 0, NULL, NULL, args.stateless_rpc);
> +		get_remote_refs(fd[1], &reader, &ref, 0, NULL, NULL,
> +				args.stateless_rpc, NULL);
>  		break;
>  	case protocol_v1:
>  	case protocol_v0:
> diff --git a/builtin/fetch.c b/builtin/fetch.c
> index ecf8537605..a7ef59acfc 100644
> --- a/builtin/fetch.c
> +++ b/builtin/fetch.c
> @@ -1393,7 +1393,7 @@ static int do_fetch(struct transport *transport,
>  
>  	if (must_list_refs) {
>  		trace2_region_enter("fetch", "remote_refs", the_repository);
> -		remote_refs = transport_get_remote_refs(transport, &ref_prefixes);
> +		remote_refs = transport_get_remote_refs(transport, &ref_prefixes, NULL);
>  		trace2_region_leave("fetch", "remote_refs", the_repository);
>  	} else
>  		remote_refs = NULL;
> diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c
> index 092917eca2..4cf3f60b1b 100644
> --- a/builtin/ls-remote.c
> +++ b/builtin/ls-remote.c
> @@ -118,7 +118,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
>  	if (server_options.nr)
>  		transport->server_options = &server_options;
>  
> -	ref = transport_get_remote_refs(transport, &ref_prefixes);
> +	ref = transport_get_remote_refs(transport, &ref_prefixes, NULL);
>  	if (ref) {
>  		int hash_algo = hash_algo_by_ptr(transport_get_hash_algo(transport));
>  		repo_set_hash_algo(the_repository, hash_algo);
> diff --git a/builtin/remote.c b/builtin/remote.c
> index c1b211b272..246e62f118 100644
> --- a/builtin/remote.c
> +++ b/builtin/remote.c
> @@ -950,7 +950,7 @@ static int get_remote_ref_states(const char *name,
>  	if (query) {
>  		transport = transport_get(states->remote, states->remote->url_nr > 0 ?
>  			states->remote->url[0] : NULL);
> -		remote_refs = transport_get_remote_refs(transport, NULL);
> +		remote_refs = transport_get_remote_refs(transport, NULL, NULL);
>  		transport_disconnect(transport);
>  
>  		states->queried = 1;
> diff --git a/connect.c b/connect.c
> index 8b8f56cf6d..99d9052365 100644
> --- a/connect.c
> +++ b/connect.c
> @@ -455,7 +455,8 @@ struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
>  			     struct ref **list, int for_push,
>  			     const struct strvec *ref_prefixes,
>  			     const struct string_list *server_options,
> -			     int stateless_rpc)
> +			     int stateless_rpc,
> +			     char **unborn_head_target)
>  {
>  	int i;
>  	const char *hash_name;
> @@ -496,6 +497,8 @@ struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
>  
>  	/* Process response from server */
>  	while (packet_reader_read(reader) == PACKET_READ_NORMAL) {
> +		if (unborn_head_target)
> +			BUG("NEEDSWORK: provide unborn HEAD target to caller while reading refs");
>  		if (!process_ref_v2(reader, &list))
>  			die(_("invalid ls-refs response: %s"), reader->line);
>  	}
> diff --git a/remote.h b/remote.h
> index 3211abdf05..967f2178d8 100644
> --- a/remote.h
> +++ b/remote.h
> @@ -198,7 +198,8 @@ struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
>  			     struct ref **list, int for_push,
>  			     const struct strvec *ref_prefixes,
>  			     const struct string_list *server_options,
> -			     int stateless_rpc);
> +			     int stateless_rpc,
> +			     char **unborn_head_target);
>  
>  int resolve_remote_symref(struct ref *ref, struct ref *list);
>  
> diff --git a/transport-helper.c b/transport-helper.c
> index 5f6e0b3bd8..5d97eba935 100644
> --- a/transport-helper.c
> +++ b/transport-helper.c
> @@ -1162,13 +1162,16 @@ static int has_attribute(const char *attrs, const char *attr)
>  }
>  
>  static struct ref *get_refs_list(struct transport *transport, int for_push,
> -				 const struct strvec *ref_prefixes)
> +				 const struct strvec *ref_prefixes,
> +				 char **unborn_head_target)
>  {
>  	get_helper(transport);
>  
>  	if (process_connect(transport, for_push)) {
>  		do_take_over(transport);
> -		return transport->vtable->get_refs_list(transport, for_push, ref_prefixes);
> +		return transport->vtable->get_refs_list(transport, for_push,
> +							ref_prefixes,
> +							unborn_head_target);
>  	}
>  
>  	return get_refs_list_using_list(transport, for_push);
> diff --git a/transport-internal.h b/transport-internal.h
> index 27c9daffc4..5037f6197d 100644
> --- a/transport-internal.h
> +++ b/transport-internal.h
> @@ -18,19 +18,16 @@ 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.
>  	 *
> -	 * If communicating using protocol v2 a list of prefixes can be
> -	 * provided to be sent to the server to enable it to limit the ref
> -	 * advertisement.  Since ref filtering is done on the server's end, and
> -	 * only when using protocol v2, this list will be ignored when not
> -	 * using protocol v2 meaning this function can return refs which don't
> -	 * match the provided ref_prefixes.
> -	 *
>  	 * If the transport is able to determine the remote hash for
>  	 * the ref without a huge amount of effort, it should store it
>  	 * in the ref's old_sha1 field; otherwise it should be all 0.
> +	 *
> +	 * See transport_get_remote_refs() for information on ref_prefixes and
> +	 * unborn_head_target.
>  	 **/
>  	struct ref *(*get_refs_list)(struct transport *transport, int for_push,
> -				     const struct strvec *ref_prefixes);
> +				     const struct strvec *ref_prefixes,
> +				     char **unborn_head_target);
>  
>  	/**
>  	 * Fetch the objects for the given refs. Note that this gets
> diff --git a/transport.c b/transport.c
> index 47da955e4f..815e175017 100644
> --- a/transport.c
> +++ b/transport.c
> @@ -127,7 +127,8 @@ struct bundle_transport_data {
>  
>  static struct ref *get_refs_from_bundle(struct transport *transport,
>  					int for_push,
> -					const struct strvec *ref_prefixes)
> +					const struct strvec *ref_prefixes,
> +					char **unborn_head_target)
>  {
>  	struct bundle_transport_data *data = transport->data;
>  	struct ref *result = NULL;
> @@ -163,7 +164,7 @@ static int fetch_refs_from_bundle(struct transport *transport,
>  	int ret;
>  
>  	if (!data->get_refs_from_bundle_called)
> -		get_refs_from_bundle(transport, 0, NULL);
> +		get_refs_from_bundle(transport, 0, NULL, NULL);
>  	ret = unbundle(the_repository, &data->header, data->fd,
>  			   transport->progress ? BUNDLE_VERBOSE : 0);
>  	transport->hash_algo = data->header.hash_algo;
> @@ -281,7 +282,7 @@ static void die_if_server_options(struct transport *transport)
>   */
>  static struct ref *handshake(struct transport *transport, int for_push,
>  			     const struct strvec *ref_prefixes,
> -			     int must_list_refs)
> +			     int must_list_refs, char **unborn_head_target)
>  {
>  	struct git_transport_data *data = transport->data;
>  	struct ref *refs = NULL;
> @@ -301,7 +302,8 @@ static struct ref *handshake(struct transport *transport, int for_push,
>  			get_remote_refs(data->fd[1], &reader, &refs, for_push,
>  					ref_prefixes,
>  					transport->server_options,
> -					transport->stateless_rpc);
> +					transport->stateless_rpc,
> +					unborn_head_target);
>  		break;
>  	case protocol_v1:
>  	case protocol_v0:
> @@ -324,9 +326,11 @@ static struct ref *handshake(struct transport *transport, int for_push,
>  }
>  
>  static struct ref *get_refs_via_connect(struct transport *transport, int for_push,
> -					const struct strvec *ref_prefixes)
> +					const struct strvec *ref_prefixes,
> +					char **unborn_head_target)
>  {
> -	return handshake(transport, for_push, ref_prefixes, 1);
> +	return handshake(transport, for_push, ref_prefixes, 1,
> +			 unborn_head_target);
>  }
>  
>  static int fetch_refs_via_pack(struct transport *transport,
> @@ -370,7 +374,7 @@ static int fetch_refs_via_pack(struct transport *transport,
>  				break;
>  			}
>  		}
> -		refs_tmp = handshake(transport, 0, NULL, must_list_refs);
> +		refs_tmp = handshake(transport, 0, NULL, must_list_refs, NULL);
>  	}
>  
>  	if (data->version == protocol_unknown_version)
> @@ -765,7 +769,7 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re
>  		return -1;
>  
>  	if (!data->got_remote_heads)
> -		get_refs_via_connect(transport, 1, NULL);
> +		get_refs_via_connect(transport, 1, NULL, NULL);
>  
>  	memset(&args, 0, sizeof(args));
>  	args.send_mirror = !!(flags & TRANSPORT_PUSH_MIRROR);
> @@ -1251,7 +1255,8 @@ int transport_push(struct repository *r,
>  
>  		trace2_region_enter("transport_push", "get_refs_list", r);
>  		remote_refs = transport->vtable->get_refs_list(transport, 1,
> -							       &ref_prefixes);
> +							       &ref_prefixes,
> +							       NULL);
>  		trace2_region_leave("transport_push", "get_refs_list", r);
>  
>  		strvec_clear(&ref_prefixes);
> @@ -1370,12 +1375,14 @@ int transport_push(struct repository *r,
>  }
>  
>  const struct ref *transport_get_remote_refs(struct transport *transport,
> -					    const struct strvec *ref_prefixes)
> +					    const struct strvec *ref_prefixes,
> +					    char **unborn_head_target)
>  {
>  	if (!transport->got_remote_refs) {
>  		transport->remote_refs =
>  			transport->vtable->get_refs_list(transport, 0,
> -							 ref_prefixes);
> +							 ref_prefixes,
> +							 unborn_head_target);
>  		transport->got_remote_refs = 1;
>  	}
>  
> diff --git a/transport.h b/transport.h
> index 24558c027d..65de0c9c00 100644
> --- a/transport.h
> +++ b/transport.h
> @@ -241,9 +241,14 @@ int transport_push(struct repository *repo,
>   * advertisement.  Since ref filtering is done on the server's end (and only
>   * when using protocol v2), this can return refs which don't match the provided
>   * ref_prefixes.
> + *
> + * If unborn_head_target is not NULL, and the remote reports HEAD as pointing
> + * to an unborn branch, this function stores the unborn branch in
> + * unborn_head_target. It should be freed by the caller.
>   */
>  const struct ref *transport_get_remote_refs(struct transport *transport,
> -					    const struct strvec *ref_prefixes);
> +					    const struct strvec *ref_prefixes,
> +					    char **unborn_head_target);
>  
>  /*
>   * Fetch the hash algorithm used by a remote.
diff mbox series

Patch

diff --git a/builtin/clone.c b/builtin/clone.c
index a0841923cf..70f9450db4 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -1264,7 +1264,7 @@  int cmd_clone(int argc, const char **argv, const char *prefix)
 	if (!option_no_tags)
 		strvec_push(&ref_prefixes, "refs/tags/");
 
-	refs = transport_get_remote_refs(transport, &ref_prefixes);
+	refs = transport_get_remote_refs(transport, &ref_prefixes, NULL);
 
 	if (refs) {
 		int hash_algo = hash_algo_by_ptr(transport_get_hash_algo(transport));
diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c
index 58b7c1fbdc..9f921dfab4 100644
--- a/builtin/fetch-pack.c
+++ b/builtin/fetch-pack.c
@@ -220,7 +220,8 @@  int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
 	version = discover_version(&reader);
 	switch (version) {
 	case protocol_v2:
-		get_remote_refs(fd[1], &reader, &ref, 0, NULL, NULL, args.stateless_rpc);
+		get_remote_refs(fd[1], &reader, &ref, 0, NULL, NULL,
+				args.stateless_rpc, NULL);
 		break;
 	case protocol_v1:
 	case protocol_v0:
diff --git a/builtin/fetch.c b/builtin/fetch.c
index ecf8537605..a7ef59acfc 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -1393,7 +1393,7 @@  static int do_fetch(struct transport *transport,
 
 	if (must_list_refs) {
 		trace2_region_enter("fetch", "remote_refs", the_repository);
-		remote_refs = transport_get_remote_refs(transport, &ref_prefixes);
+		remote_refs = transport_get_remote_refs(transport, &ref_prefixes, NULL);
 		trace2_region_leave("fetch", "remote_refs", the_repository);
 	} else
 		remote_refs = NULL;
diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c
index 092917eca2..4cf3f60b1b 100644
--- a/builtin/ls-remote.c
+++ b/builtin/ls-remote.c
@@ -118,7 +118,7 @@  int cmd_ls_remote(int argc, const char **argv, const char *prefix)
 	if (server_options.nr)
 		transport->server_options = &server_options;
 
-	ref = transport_get_remote_refs(transport, &ref_prefixes);
+	ref = transport_get_remote_refs(transport, &ref_prefixes, NULL);
 	if (ref) {
 		int hash_algo = hash_algo_by_ptr(transport_get_hash_algo(transport));
 		repo_set_hash_algo(the_repository, hash_algo);
diff --git a/builtin/remote.c b/builtin/remote.c
index c1b211b272..246e62f118 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -950,7 +950,7 @@  static int get_remote_ref_states(const char *name,
 	if (query) {
 		transport = transport_get(states->remote, states->remote->url_nr > 0 ?
 			states->remote->url[0] : NULL);
-		remote_refs = transport_get_remote_refs(transport, NULL);
+		remote_refs = transport_get_remote_refs(transport, NULL, NULL);
 		transport_disconnect(transport);
 
 		states->queried = 1;
diff --git a/connect.c b/connect.c
index 8b8f56cf6d..99d9052365 100644
--- a/connect.c
+++ b/connect.c
@@ -455,7 +455,8 @@  struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
 			     struct ref **list, int for_push,
 			     const struct strvec *ref_prefixes,
 			     const struct string_list *server_options,
-			     int stateless_rpc)
+			     int stateless_rpc,
+			     char **unborn_head_target)
 {
 	int i;
 	const char *hash_name;
@@ -496,6 +497,8 @@  struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
 
 	/* Process response from server */
 	while (packet_reader_read(reader) == PACKET_READ_NORMAL) {
+		if (unborn_head_target)
+			BUG("NEEDSWORK: provide unborn HEAD target to caller while reading refs");
 		if (!process_ref_v2(reader, &list))
 			die(_("invalid ls-refs response: %s"), reader->line);
 	}
diff --git a/remote.h b/remote.h
index 3211abdf05..967f2178d8 100644
--- a/remote.h
+++ b/remote.h
@@ -198,7 +198,8 @@  struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
 			     struct ref **list, int for_push,
 			     const struct strvec *ref_prefixes,
 			     const struct string_list *server_options,
-			     int stateless_rpc);
+			     int stateless_rpc,
+			     char **unborn_head_target);
 
 int resolve_remote_symref(struct ref *ref, struct ref *list);
 
diff --git a/transport-helper.c b/transport-helper.c
index 5f6e0b3bd8..5d97eba935 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -1162,13 +1162,16 @@  static int has_attribute(const char *attrs, const char *attr)
 }
 
 static struct ref *get_refs_list(struct transport *transport, int for_push,
-				 const struct strvec *ref_prefixes)
+				 const struct strvec *ref_prefixes,
+				 char **unborn_head_target)
 {
 	get_helper(transport);
 
 	if (process_connect(transport, for_push)) {
 		do_take_over(transport);
-		return transport->vtable->get_refs_list(transport, for_push, ref_prefixes);
+		return transport->vtable->get_refs_list(transport, for_push,
+							ref_prefixes,
+							unborn_head_target);
 	}
 
 	return get_refs_list_using_list(transport, for_push);
diff --git a/transport-internal.h b/transport-internal.h
index 27c9daffc4..5037f6197d 100644
--- a/transport-internal.h
+++ b/transport-internal.h
@@ -18,19 +18,16 @@  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.
 	 *
-	 * If communicating using protocol v2 a list of prefixes can be
-	 * provided to be sent to the server to enable it to limit the ref
-	 * advertisement.  Since ref filtering is done on the server's end, and
-	 * only when using protocol v2, this list will be ignored when not
-	 * using protocol v2 meaning this function can return refs which don't
-	 * match the provided ref_prefixes.
-	 *
 	 * If the transport is able to determine the remote hash for
 	 * the ref without a huge amount of effort, it should store it
 	 * in the ref's old_sha1 field; otherwise it should be all 0.
+	 *
+	 * See transport_get_remote_refs() for information on ref_prefixes and
+	 * unborn_head_target.
 	 **/
 	struct ref *(*get_refs_list)(struct transport *transport, int for_push,
-				     const struct strvec *ref_prefixes);
+				     const struct strvec *ref_prefixes,
+				     char **unborn_head_target);
 
 	/**
 	 * Fetch the objects for the given refs. Note that this gets
diff --git a/transport.c b/transport.c
index 47da955e4f..815e175017 100644
--- a/transport.c
+++ b/transport.c
@@ -127,7 +127,8 @@  struct bundle_transport_data {
 
 static struct ref *get_refs_from_bundle(struct transport *transport,
 					int for_push,
-					const struct strvec *ref_prefixes)
+					const struct strvec *ref_prefixes,
+					char **unborn_head_target)
 {
 	struct bundle_transport_data *data = transport->data;
 	struct ref *result = NULL;
@@ -163,7 +164,7 @@  static int fetch_refs_from_bundle(struct transport *transport,
 	int ret;
 
 	if (!data->get_refs_from_bundle_called)
-		get_refs_from_bundle(transport, 0, NULL);
+		get_refs_from_bundle(transport, 0, NULL, NULL);
 	ret = unbundle(the_repository, &data->header, data->fd,
 			   transport->progress ? BUNDLE_VERBOSE : 0);
 	transport->hash_algo = data->header.hash_algo;
@@ -281,7 +282,7 @@  static void die_if_server_options(struct transport *transport)
  */
 static struct ref *handshake(struct transport *transport, int for_push,
 			     const struct strvec *ref_prefixes,
-			     int must_list_refs)
+			     int must_list_refs, char **unborn_head_target)
 {
 	struct git_transport_data *data = transport->data;
 	struct ref *refs = NULL;
@@ -301,7 +302,8 @@  static struct ref *handshake(struct transport *transport, int for_push,
 			get_remote_refs(data->fd[1], &reader, &refs, for_push,
 					ref_prefixes,
 					transport->server_options,
-					transport->stateless_rpc);
+					transport->stateless_rpc,
+					unborn_head_target);
 		break;
 	case protocol_v1:
 	case protocol_v0:
@@ -324,9 +326,11 @@  static struct ref *handshake(struct transport *transport, int for_push,
 }
 
 static struct ref *get_refs_via_connect(struct transport *transport, int for_push,
-					const struct strvec *ref_prefixes)
+					const struct strvec *ref_prefixes,
+					char **unborn_head_target)
 {
-	return handshake(transport, for_push, ref_prefixes, 1);
+	return handshake(transport, for_push, ref_prefixes, 1,
+			 unborn_head_target);
 }
 
 static int fetch_refs_via_pack(struct transport *transport,
@@ -370,7 +374,7 @@  static int fetch_refs_via_pack(struct transport *transport,
 				break;
 			}
 		}
-		refs_tmp = handshake(transport, 0, NULL, must_list_refs);
+		refs_tmp = handshake(transport, 0, NULL, must_list_refs, NULL);
 	}
 
 	if (data->version == protocol_unknown_version)
@@ -765,7 +769,7 @@  static int git_transport_push(struct transport *transport, struct ref *remote_re
 		return -1;
 
 	if (!data->got_remote_heads)
-		get_refs_via_connect(transport, 1, NULL);
+		get_refs_via_connect(transport, 1, NULL, NULL);
 
 	memset(&args, 0, sizeof(args));
 	args.send_mirror = !!(flags & TRANSPORT_PUSH_MIRROR);
@@ -1251,7 +1255,8 @@  int transport_push(struct repository *r,
 
 		trace2_region_enter("transport_push", "get_refs_list", r);
 		remote_refs = transport->vtable->get_refs_list(transport, 1,
-							       &ref_prefixes);
+							       &ref_prefixes,
+							       NULL);
 		trace2_region_leave("transport_push", "get_refs_list", r);
 
 		strvec_clear(&ref_prefixes);
@@ -1370,12 +1375,14 @@  int transport_push(struct repository *r,
 }
 
 const struct ref *transport_get_remote_refs(struct transport *transport,
-					    const struct strvec *ref_prefixes)
+					    const struct strvec *ref_prefixes,
+					    char **unborn_head_target)
 {
 	if (!transport->got_remote_refs) {
 		transport->remote_refs =
 			transport->vtable->get_refs_list(transport, 0,
-							 ref_prefixes);
+							 ref_prefixes,
+							 unborn_head_target);
 		transport->got_remote_refs = 1;
 	}
 
diff --git a/transport.h b/transport.h
index 24558c027d..65de0c9c00 100644
--- a/transport.h
+++ b/transport.h
@@ -241,9 +241,14 @@  int transport_push(struct repository *repo,
  * advertisement.  Since ref filtering is done on the server's end (and only
  * when using protocol v2), this can return refs which don't match the provided
  * ref_prefixes.
+ *
+ * If unborn_head_target is not NULL, and the remote reports HEAD as pointing
+ * to an unborn branch, this function stores the unborn branch in
+ * unborn_head_target. It should be freed by the caller.
  */
 const struct ref *transport_get_remote_refs(struct transport *transport,
-					    const struct strvec *ref_prefixes);
+					    const struct strvec *ref_prefixes,
+					    char **unborn_head_target);
 
 /*
  * Fetch the hash algorithm used by a remote.