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

[PATCH v2 1/8] serve: pass "config context" through to individual commands

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Dec 13, 2018, 15:58 UTC
Message-ID
<20181213155817.27666-2-avarab@gmail.com>
In-Reply-To
<xmqqimzygmz6.fsf@gitster-ct.c.googlers.com>
From: Jeff King <peff@peff.net>

In protocol v2, instead of just running "upload-pack", we have a generic "serve" loop which runs command requests from the client. What used to be "upload-pack" is now generally split into two operations: "ls-refs" and "fetch". The latter knows it must respect uploadpack.* config, but the former is not actually specific to a fetch operation (we do not yet do v2 receive-pack, but eventually we may, and ls-refs would support both operations).

However, ls-refs does need to know which operation we're performing, in order to read the correct config (e.g., uploadpack.hiderefs versus receive.hiderefs; we don't read _either_ right now, but this is the first step to fixing that).

In the generic "git-serve" program, we don't have that information. But in the protocol as it is actually used by clients, the client still asks to run "git-upload-pack", and then issues an "ls-refs" from there. So we _do_ know at that point that "uploadpack" is the right config context. This patch teaches the protocol v2 "serve" code to pass that context through to the individual commands (a future patch will teach ls-refs to actually use it).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 builtin/upload-pack.c | 1 +
 ls-refs.c             | 4 +++-
 ls-refs.h             | 3 ++-
 serve.c               | 9 +++++----
 serve.h               | 7 +++++++
 upload-pack.c         | 4 ++--
 upload-pack.h         | 4 ++--
 7 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/builtin/upload-pack.c b/builtin/upload-pack.c
index 42dc4da5a1..67192cfa9e 100644
--- a/builtin/upload-pack.c
+++ b/builtin/upload-pack.c
@@ -52,6 +52,7 @@ int cmd_upload_pack(int argc, const char **argv, const char *prefix)
 	case protocol_v2:
 		serve_opts.advertise_capabilities = opts.advertise_refs;
 		serve_opts.stateless_rpc = opts.stateless_rpc;
+		serve_opts.config_context = "uploadpack";
 		serve(&serve_opts);
 		break;
 	case protocol_v1:
diff --git a/ls-refs.c b/ls-refs.c
index a06f12eca8..e8e31475f0 100644
--- a/ls-refs.c
+++ b/ls-refs.c
@@ -69,7 +69,9 @@ static int send_ref(const char *refname, const struct object_id *oid,
 	return 0;
 }
 
-int ls_refs(struct repository *r, struct argv_array *keys,
+int ls_refs(struct repository *r,
+	    const char *config_section,
+	    struct argv_array *keys,
 	    struct packet_reader *request)
 {
 	struct ls_refs_data data;
diff --git a/ls-refs.h b/ls-refs.h
index b62877e8da..da26fc9824 100644
--- a/ls-refs.h
+++ b/ls-refs.h
@@ -4,7 +4,8 @@
 struct repository;
 struct argv_array;
 struct packet_reader;
-extern int ls_refs(struct repository *r, struct argv_array *keys,
+extern int ls_refs(struct repository *r, const char *config_context,
+		   struct argv_array *keys,
 		   struct packet_reader *request);
 
 #endif /* LS_REFS_H */
diff --git a/serve.c b/serve.c
index bda085f09c..70f89cf0d9 100644
--- a/serve.c
+++ b/serve.c
@@ -48,6 +48,7 @@ struct protocol_capability {
 	 * This field should be NULL for capabilities which are not commands.
 	 */
 	int (*command)(struct repository *r,
+		       const char *config_context,
 		       struct argv_array *keys,
 		       struct packet_reader *request);
 };
@@ -158,7 +159,7 @@ enum request_state {
 	PROCESS_REQUEST_DONE,
 };
 
-static int process_request(void)
+static int process_request(struct serve_options *opts)
 {
 	enum request_state state = PROCESS_REQUEST_KEYS;
 	struct packet_reader reader;
@@ -222,7 +223,7 @@ static int process_request(void)
 	if (!command)
 		die("no command requested");
 
-	command->command(the_repository, &keys, &reader);
+	command->command(the_repository, opts->config_context, &keys, &reader);
 
 	argv_array_clear(&keys);
 	return 0;
@@ -249,10 +250,10 @@ void serve(struct serve_options *options)
 	 * a single request/response exchange
 	 */
 	if (options->stateless_rpc) {
-		process_request();
+		process_request(options);
 	} else {
 		for (;;)
-			if (process_request())
+			if (process_request(options))
 				break;
 	}
 }
diff --git a/serve.h b/serve.h
index fe65ba9f46..d527224cbb 100644
--- a/serve.h
+++ b/serve.h
@@ -8,6 +8,13 @@ extern int has_capability(const struct argv_array *keys, const char *capability,
 struct serve_options {
 	unsigned advertise_capabilities;
 	unsigned stateless_rpc;
+
+	/*
+	 * Some operations may need to know the context when looking up config;
+	 * e.g., set this to "uploadpack" to respect "uploadpack.hiderefs" (as
+	 * opposed to "receive.hiderefs").
+	 */
+	const char *config_context;
 };
 #define SERVE_OPTIONS_INIT { 0 }
 extern void serve(struct serve_options *options);
diff --git a/upload-pack.c b/upload-pack.c
index 5e81f1ff24..914bbb40bc 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -1413,8 +1413,8 @@ enum fetch_state {
 	FETCH_DONE,
 };
 
-int upload_pack_v2(struct repository *r, struct argv_array *keys,
-		   struct packet_reader *request)
+int upload_pack_v2(struct repository *r, const char *config_context,
+		   struct argv_array *keys, struct packet_reader *request)
 {
 	enum fetch_state state = FETCH_PROCESS_ARGS;
 	struct upload_pack_data data;
diff --git a/upload-pack.h b/upload-pack.h
index cab2178796..2a9f51197c 100644
--- a/upload-pack.h
+++ b/upload-pack.h
@@ -13,8 +13,8 @@ void upload_pack(struct upload_pack_options *options);
 struct repository;
 struct argv_array;
 struct packet_reader;
-extern int upload_pack_v2(struct repository *r, struct argv_array *keys,
-			  struct packet_reader *request);
+extern int upload_pack_v2(struct repository *r, const char *config_context,
+			  struct argv_array *keys, struct packet_reader *request);
 
 struct strbuf;
 extern int upload_pack_advertise(struct repository *r,
-- 
2.20.0.405.gbc1bbc6f85
Previous: Jeff KingNext: Ævar Arnfjörð Bjarmason
Message 36 of 73 in “protocol v2 and hidden refs”
  1. 0/3 protocol v2 and hidden refsJeff King, Dec 11, 2018
  2. 1/3 serve: pass "config context" through to individual commandsJeff King, Dec 11, 2018
  3. Junio C HamanoDec 14, 2018
  4. Jeff KingDec 14, 2018
  5. Junio C HamanoDec 15, 2018
  6. Jeff KingDec 16, 2018
  7. Junio C HamanoDec 16, 2018
  8. Jeff KingDec 18, 2018
  9. Jonathan NiederDec 14, 2018
  10. Jeff KingDec 14, 2018
  11. Jonathan NiederDec 14, 2018
  12. Jeff KingDec 14, 2018
  13. 2/3 parse_hide_refs_config: handle NULL sectionJeff King, Dec 11, 2018
  14. Junio C HamanoDec 14, 2018
  15. 3/3 upload-pack: support hidden refs with protocol v2Jeff King, Dec 11, 2018
  16. Ævar Arnfjörð BjarmasonDec 11, 2018
  17. Jeff KingDec 11, 2018
  18. 0/3 Add a GIT_TEST_PROTOCOL_VERSION=X test modeÆvar Arnfjörð Bjarmason, Dec 11, 2018
  19. Ævar Arnfjörð BjarmasonDec 11, 2018
  20. 1/3 tests: add a special setup where for protocol.versionÆvar Arnfjörð Bjarmason, Dec 11, 2018
  21. 0/3 Some fixes and improvementsJonathan Tan, Dec 12, 2018
  22. 1/3 squash this into your patchJonathan Tan, Dec 12, 2018
  23. 3/3 also squash this into your patchJonathan Tan, Dec 12, 2018
  24. 2/3 builtin/fetch-pack: support protocol version 2Jonathan Tan, Dec 12, 2018
  25. Junio C HamanoDec 13, 2018
  26. 0/8 protocol v2 fixesÆvar Arnfjörð Bjarmason, Dec 13, 2018
  27. 0/4 protocol v2 fixesÆvar Arnfjörð Bjarmason, Dec 17, 2018
  28. Jeff KingDec 18, 2018
  29. 1/4 serve: pass "config context" through to individual commandsÆvar Arnfjörð Bjarmason, Dec 17, 2018
  30. 3/4 upload-pack: support hidden refs with protocol v2Ævar Arnfjörð Bjarmason, Dec 17, 2018
  31. 2/4 parse_hide_refs_config: handle NULL sectionÆvar Arnfjörð Bjarmason, Dec 17, 2018
  32. 4/4 fetch-pack: support protocol version 2Ævar Arnfjörð Bjarmason, Dec 17, 2018
  33. Junio C HamanoJan 8, 2019
  34. Jonathan TanJan 8, 2019
  35. Jeff KingJan 8, 2019
  36. 1/8 serve: pass "config context" through to individual commandsÆvar Arnfjörð Bjarmason, Dec 13, 2018
  37. 2/8 parse_hide_refs_config: handle NULL sectionÆvar Arnfjörð Bjarmason, Dec 13, 2018
  38. 3/8 upload-pack: support hidden refs with protocol v2Ævar Arnfjörð Bjarmason, Dec 13, 2018
  39. 4/8 tests: add a check for unportable env --unsetÆvar Arnfjörð Bjarmason, Dec 13, 2018
  40. 5/8 tests: add a special setup where for protocol.versionÆvar Arnfjörð Bjarmason, Dec 13, 2018
  41. Jonathan TanDec 13, 2018
  42. 6/8 tests: mark & fix tests broken under GIT_TEST_PROTOCOL_VERSION=1Ævar Arnfjörð Bjarmason, Dec 13, 2018
  43. 7/8 builtin/fetch-pack: support protocol version 2Ævar Arnfjörð Bjarmason, Dec 13, 2018
  44. Jeff KingDec 14, 2018
  45. 8/8 tests: mark tests broken under GIT_TEST_PROTOCOL_VERSION=2Ævar Arnfjörð Bjarmason, Dec 13, 2018
  46. Ævar Arnfjörð BjarmasonDec 13, 2018
  47. Junio C HamanoDec 14, 2018
  48. Jeff KingDec 14, 2018
  49. Ævar Arnfjörð BjarmasonDec 14, 2018
  50. Ævar Arnfjörð BjarmasonDec 14, 2018
  51. Jeff KingDec 17, 2018
  52. Jeff KingDec 17, 2018
  53. upload-pack: turn on uploadpack.allowAnySHA1InWant=trueÆvar Arnfjörð Bjarmason, Dec 17, 2018
  54. David TurnerDec 17, 2018
  55. Ævar Arnfjörð BjarmasonDec 17, 2018
  56. David TurnerDec 17, 2018
  57. Jonathan NiederDec 17, 2018
  58. Ævar Arnfjörð BjarmasonDec 17, 2018
  59. Jonathan NiederDec 18, 2018
  60. Ævar Arnfjörð BjarmasonDec 18, 2018
  61. Jeff KingDec 18, 2018
  62. Jeff KingDec 18, 2018
  63. Ævar Arnfjörð BjarmasonDec 18, 2018
  64. Junio C HamanoDec 26, 2018
  65. Ævar Arnfjörð BjarmasonDec 27, 2018
  66. Jonathan NiederDec 27, 2018
  67. 2/3 tests: mark tests broken under GIT_TEST_PROTOCOL_VERSION=1Ævar Arnfjörð Bjarmason, Dec 11, 2018
  68. 3/3 tests: mark tests broken under GIT_TEST_PROTOCOL_VERSION=2Ævar Arnfjörð Bjarmason, Dec 11, 2018
  69. Jonathan TanDec 13, 2018
  70. Jeff KingDec 14, 2018
  71. Ævar Arnfjörð BjarmasonDec 15, 2018
  72. Jeff KingDec 16, 2018
  73. Ævar Arnfjörð BjarmasonDec 16, 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.