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

[PATCH v5 15/35] transport: convert get_refs_list to take a list of ref prefixes

From
BWBrandon Williams <bmwill@google.com>
Date
Mar 14, 2018, 18:31 UTC
Message-ID
<20180314183213.223440-16-bmwill@google.com>
In-Reply-To
<20180314183213.223440-1-bmwill@google.com>

Convert the 'struct transport' virtual function 'get_refs_list()' to optionally take an argv_array of ref prefixes. When communicating with a server using protocol v2 these ref prefixes can be sent when requesting a listing of their refs allowing the server to filter the refs it sends based on the sent prefixes. This list will be ignored when not using protocol v2.

Signed-off-by: Brandon Williams <bmwill@google.com>
---
 transport-helper.c   |  5 +++--
 transport-internal.h | 11 ++++++++++-
 transport.c          | 18 +++++++++++-------
 3 files changed, 24 insertions(+), 10 deletions(-)
diff --git a/transport-helper.c b/transport-helper.c
index 5080150231..8774ab3013 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -1026,7 +1026,8 @@ static int has_attribute(const char *attrs, const char *attr) {
 	}
 }
 
-static struct ref *get_refs_list(struct transport *transport, int for_push)
+static struct ref *get_refs_list(struct transport *transport, int for_push,
+				 const struct argv_array *ref_prefixes)
 {
 	struct helper_data *data = transport->data;
 	struct child_process *helper;
@@ -1039,7 +1040,7 @@ static struct ref *get_refs_list(struct transport *transport, int for_push)
 
 	if (process_connect(transport, for_push)) {
 		do_take_over(transport);
-		return transport->vtable->get_refs_list(transport, for_push);
+		return transport->vtable->get_refs_list(transport, for_push, ref_prefixes);
 	}
 
 	if (data->push && for_push)
diff --git a/transport-internal.h b/transport-internal.h
index 3c1a29d727..1cde6258a7 100644
--- a/transport-internal.h
+++ b/transport-internal.h
@@ -3,6 +3,7 @@
 
 struct ref;
 struct transport;
+struct argv_array;
 
 struct transport_vtable {
 	/**
@@ -17,11 +18,19 @@ 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.
 	 **/
-	struct ref *(*get_refs_list)(struct transport *transport, int for_push);
+	struct ref *(*get_refs_list)(struct transport *transport, int for_push,
+				     const struct argv_array *ref_prefixes);
 
 	/**
 	 * Fetch the objects for the given refs. Note that this gets
diff --git a/transport.c b/transport.c
index ffc6b2614f..2e68010dd0 100644
--- a/transport.c
+++ b/transport.c
@@ -72,7 +72,9 @@ struct bundle_transport_data {
 	struct bundle_header header;
 };
 
-static struct ref *get_refs_from_bundle(struct transport *transport, int for_push)
+static struct ref *get_refs_from_bundle(struct transport *transport,
+					int for_push,
+					const struct argv_array *ref_prefixes)
 {
 	struct bundle_transport_data *data = transport->data;
 	struct ref *result = NULL;
@@ -189,7 +191,8 @@ static int connect_setup(struct transport *transport, int for_push)
 	return 0;
 }
 
-static struct ref *get_refs_via_connect(struct transport *transport, int for_push)
+static struct ref *get_refs_via_connect(struct transport *transport, int for_push,
+					const struct argv_array *ref_prefixes)
 {
 	struct git_transport_data *data = transport->data;
 	struct ref *refs = NULL;
@@ -204,7 +207,8 @@ static struct ref *get_refs_via_connect(struct transport *transport, int for_pus
 	data->version = discover_version(&reader);
 	switch (data->version) {
 	case protocol_v2:
-		get_remote_refs(data->fd[1], &reader, &refs, for_push, NULL);
+		get_remote_refs(data->fd[1], &reader, &refs, for_push,
+				ref_prefixes);
 		break;
 	case protocol_v1:
 	case protocol_v0:
@@ -250,7 +254,7 @@ static int fetch_refs_via_pack(struct transport *transport,
 	args.update_shallow = data->options.update_shallow;
 
 	if (!data->got_remote_heads)
-		refs_tmp = get_refs_via_connect(transport, 0);
+		refs_tmp = get_refs_via_connect(transport, 0, NULL);
 
 	switch (data->version) {
 	case protocol_v2:
@@ -568,7 +572,7 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re
 	int ret = 0;
 
 	if (!data->got_remote_heads)
-		get_refs_via_connect(transport, 1);
+		get_refs_via_connect(transport, 1, NULL);
 
 	memset(&args, 0, sizeof(args));
 	args.send_mirror = !!(flags & TRANSPORT_PUSH_MIRROR);
@@ -1028,7 +1032,7 @@ int transport_push(struct transport *transport,
 		if (check_push_refs(local_refs, refspec_nr, refspec) < 0)
 			return -1;
 
-		remote_refs = transport->vtable->get_refs_list(transport, 1);
+		remote_refs = transport->vtable->get_refs_list(transport, 1, NULL);
 
 		if (flags & TRANSPORT_PUSH_ALL)
 			match_flags |= MATCH_REFS_ALL;
@@ -1137,7 +1141,7 @@ int transport_push(struct transport *transport,
 const struct ref *transport_get_remote_refs(struct transport *transport)
 {
 	if (!transport->got_remote_refs) {
-		transport->remote_refs = transport->vtable->get_refs_list(transport, 0);
+		transport->remote_refs = transport->vtable->get_refs_list(transport, 0, NULL);
 		transport->got_remote_refs = 1;
 	}
 
-- 
2.16.2.804.g6dcf76e118-goog
Previous: Brandon WilliamsNext: Brandon Williams
Message 36 of 85 in “protocol version 2”
  1. 00/35 protocol version 2Brandon Williams, Mar 14, 2018
  2. 01/35 pkt-line: introduce packet_read_with_statusBrandon Williams, Mar 14, 2018
  3. Junio C HamanoMar 14, 2018
  4. Brandon WilliamsMar 15, 2018
  5. Junio C HamanoMar 15, 2018
  6. 02/35 pkt-line: allow peeking a packet line without consuming itBrandon Williams, Mar 14, 2018
  7. 03/35 pkt-line: add delim packet supportBrandon Williams, Mar 14, 2018
  8. 04/35 upload-pack: convert to a builtinBrandon Williams, Mar 14, 2018
  9. 07/35 connect: convert get_remote_heads to use struct packet_readerBrandon Williams, Mar 14, 2018
  10. 10/35 protocol: introduce enum protocol_version value protocol_v2Brandon Williams, Mar 14, 2018
  11. 11/35 test-pkt-line: introduce a packet-line test helperBrandon Williams, Mar 14, 2018
  12. 12/35 serve: introduce git-serveBrandon Williams, Mar 14, 2018
  13. Junio C HamanoMar 14, 2018
  14. Brandon WilliamsMar 15, 2018
  15. 14/35 connect: request remote refs using v2Brandon Williams, Mar 14, 2018
  16. 13/35 ls-refs: introduce ls-refs server commandBrandon Williams, Mar 14, 2018
  17. 18/35 fetch: pass ref prefixes when fetchingBrandon Williams, Mar 14, 2018
  18. 17/35 ls-remote: pass ref prefixes when requesting a remote's refsBrandon Williams, Mar 14, 2018
  19. 19/35 push: pass ref prefixes when pushingBrandon Williams, Mar 14, 2018
  20. 21/35 fetch-pack: perform a fetch using v2Brandon Williams, Mar 14, 2018
  21. 22/35 fetch-pack: support shallow requestsBrandon Williams, Mar 14, 2018
  22. 26/35 transport-helper: refactor process_connect_serviceBrandon Williams, Mar 14, 2018
  23. 27/35 transport-helper: introduce stateless-connectBrandon Williams, Mar 14, 2018
  24. 28/35 pkt-line: add packet_buf_write_len functionBrandon Williams, Mar 14, 2018
  25. 31/35 http: allow providing extra headers for http requestsBrandon Williams, Mar 14, 2018
  26. 29/35 remote-curl: create copy of the service nameBrandon Williams, Mar 14, 2018
  27. 32/35 http: don't always add Git-Protocol headerBrandon Williams, Mar 14, 2018
  28. 33/35 http: eliminate "# service" line when using protocol v2Brandon Williams, Mar 14, 2018
  29. 35/35 remote-curl: don't request v2 when pushingBrandon Williams, Mar 14, 2018
  30. 34/35 remote-curl: implement stateless-connect commandBrandon Williams, Mar 14, 2018
  31. 23/35 connect: refactor git_connect to only get the protocol version onceBrandon Williams, Mar 14, 2018
  32. 25/35 transport-helper: remove name parameterBrandon Williams, Mar 14, 2018
  33. 30/35 remote-curl: store the protocol version the server responded withBrandon Williams, Mar 14, 2018
  34. 20/35 upload-pack: introduce fetch server commandBrandon Williams, Mar 14, 2018
  35. 24/35 connect: don't request v2 when pushingBrandon Williams, Mar 14, 2018
  36. 15/35 transport: convert get_refs_list to take a list of ref prefixesBrandon Williams, Mar 14, 2018
  37. 16/35 transport: convert transport_get_remote_refs to take a list of ref prefixesBrandon Williams, Mar 14, 2018
  38. 08/35 connect: discover protocol version outside of get_remote_headsBrandon Williams, Mar 14, 2018
  39. 09/35 transport: store protocol versionBrandon Williams, Mar 14, 2018
  40. 05/35 upload-pack: factor out processing linesBrandon Williams, Mar 14, 2018
  41. 06/35 transport: use get_refs_via_connect to get refsBrandon Williams, Mar 14, 2018
  42. 00/35 protocol version 2Brandon Williams, Mar 15, 2018
  43. 01/35 pkt-line: introduce packet_read_with_statusBrandon Williams, Mar 15, 2018
  44. 02/35 pkt-line: allow peeking a packet line without consuming itBrandon Williams, Mar 15, 2018
  45. 03/35 pkt-line: add delim packet supportBrandon Williams, Mar 15, 2018
  46. 06/35 transport: use get_refs_via_connect to get refsBrandon Williams, Mar 15, 2018
  47. 07/35 connect: convert get_remote_heads to use struct packet_readerBrandon Williams, Mar 15, 2018
  48. Duy NguyenMar 27, 2018
  49. Jeff KingMar 27, 2018
  50. Duy NguyenMar 27, 2018
  51. Duy NguyenMar 27, 2018
  52. Brandon WilliamsMar 27, 2018
  53. 08/35 connect: discover protocol version outside of get_remote_headsBrandon Williams, Mar 15, 2018
  54. 09/35 transport: store protocol versionBrandon Williams, Mar 15, 2018
  55. 10/35 protocol: introduce enum protocol_version value protocol_v2Brandon Williams, Mar 15, 2018
  56. 11/35 test-pkt-line: introduce a packet-line test helperBrandon Williams, Mar 15, 2018
  57. 12/35 serve: introduce git-serveBrandon Williams, Mar 15, 2018
  58. 13/35 ls-refs: introduce ls-refs server commandBrandon Williams, Mar 15, 2018
  59. 16/35 transport: convert transport_get_remote_refs to take a list of ref prefixesBrandon Williams, Mar 15, 2018
  60. 17/35 ls-remote: pass ref prefixes when requesting a remote's refsBrandon Williams, Mar 15, 2018
  61. 18/35 fetch: pass ref prefixes when fetchingBrandon Williams, Mar 15, 2018
  62. 20/35 upload-pack: introduce fetch server commandBrandon Williams, Mar 15, 2018
  63. 19/35 push: pass ref prefixes when pushingBrandon Williams, Mar 15, 2018
  64. 22/35 fetch-pack: support shallow requestsBrandon Williams, Mar 15, 2018
  65. 27/35 transport-helper: introduce stateless-connectBrandon Williams, Mar 15, 2018
  66. 26/35 transport-helper: refactor process_connect_serviceBrandon Williams, Mar 15, 2018
  67. 29/35 remote-curl: create copy of the service nameBrandon Williams, Mar 15, 2018
  68. 30/35 remote-curl: store the protocol version the server responded withBrandon Williams, Mar 15, 2018
  69. 33/35 http: eliminate "# service" line when using protocol v2Brandon Williams, Mar 15, 2018
  70. 34/35 remote-curl: implement stateless-connect commandBrandon Williams, Mar 15, 2018
  71. 35/35 remote-curl: don't request v2 when pushingBrandon Williams, Mar 15, 2018
  72. 31/35 http: allow providing extra headers for http requestsBrandon Williams, Mar 15, 2018
  73. 32/35 http: don't always add Git-Protocol headerBrandon Williams, Mar 15, 2018
  74. 28/35 pkt-line: add packet_buf_write_len functionBrandon Williams, Mar 15, 2018
  75. 23/35 connect: refactor git_connect to only get the protocol version onceBrandon Williams, Mar 15, 2018
  76. 25/35 transport-helper: remove name parameterBrandon Williams, Mar 15, 2018
  77. 24/35 connect: don't request v2 when pushingBrandon Williams, Mar 15, 2018
  78. 21/35 fetch-pack: perform a fetch using v2Brandon Williams, Mar 15, 2018
  79. 14/35 connect: request remote refs using v2Brandon Williams, Mar 15, 2018
  80. 15/35 transport: convert get_refs_list to take a list of ref prefixesBrandon Williams, Mar 15, 2018
  81. 04/35 upload-pack: convert to a builtinBrandon Williams, Mar 15, 2018
  82. 05/35 upload-pack: factor out processing linesBrandon Williams, Mar 15, 2018
  83. {fetch,upload}-pack: clearly mark unreachable v2 codeÆvar Arnfjörð Bjarmason, Mar 30, 2018
  84. Brandon WilliamsMar 30, 2018
  85. Stefan BellerMar 30, 2018

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.