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

[PATCH 10/13] transport-helper: implement marks location as capability

From
Sverre Rabbelier <srabbelier@gmail.com>
Date
Aug 29, 2010, 03:45 UTC
Message-ID
<1283053540-27042-11-git-send-email-srabbelier@gmail.com>
In-Reply-To
<1283053540-27042-1-git-send-email-srabbelier@gmail.com>

While this requires the helper to flush stdout after listing 'gitdir' as capability, and read a command (the 'gitdir' response from the remote helper infrastructure) right after that, this is more elegant and does not require an ad-hoc exchange of values.

CC: Daniel Barkalow <barkalow@iabervon.org>
---
  Daniel made some fuss about the ad-hoc exchange when I first sent
  the 'export command' series for review, and it's been nagging me.
  As you can see in the remote-testgit implementation, it's a bit
  icky on the helper side (you have to flush sdout and read another
  command in the middle of responding to 'capabilities'), but I think
  it's better than the alternative.
 git-remote-testgit.py |   29 ++++++++++++++++-------------
 transport-helper.c    |   47 ++++++++++++++++++-----------------------------
 2 files changed, 34 insertions(+), 42 deletions(-)
diff --git a/git-remote-testgit.py b/git-remote-testgit.py
index 50341ce..e2b213d 100644
--- a/git-remote-testgit.py
+++ b/git-remote-testgit.py
@@ -71,8 +71,24 @@ def do_capabilities(repo, args):
     print "import"
     print "export"
     print "gitdir"
+
+    sys.stdout.flush()
+    if not read_one_line(repo):
+        die("Expected gitdir, got empty line")
+
     print "refspec refs/heads/*:%s*" % repo.prefix
 
+    dirname = repo.get_base_path(repo.gitdir)
+
+    if not os.path.exists(dirname):
+        os.makedirs(dirname)
+
+    path = os.path.join(dirname, 'testgit.marks')
+
+    print "*export-marks %s" % path
+    if os.path.exists(path):
+        print "*import-marks %s" % path
+
     print # end capabilities
 
 
@@ -142,19 +158,6 @@ def do_export(repo, args):
     if not repo.gitdir:
         die("Need gitdir to export")
 
-    dirname = repo.get_base_path(repo.gitdir)
-
-    if not os.path.exists(dirname):
-        os.makedirs(dirname)
-
-    path = os.path.join(dirname, 'testgit.marks')
-    print path
-    if os.path.exists(path):
-        print path
-    else:
-        print ""
-    sys.stdout.flush()
-
     update_local_repo(repo)
     repo.importer.do_import(repo.gitdir)
     repo.non_local.push(repo.gitdir)
diff --git a/transport-helper.c b/transport-helper.c
index 82bdad3..0edc1d5 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -23,6 +23,8 @@ struct helper_data
 		push : 1,
 		connect : 1,
 		no_disconnect_req : 1;
+	char *export_marks;
+	char *import_marks;
 	/* These go from remote name (as in "list") to private name */
 	struct refspec *refspecs;
 	int refspec_nr;
@@ -179,6 +181,16 @@ static struct child_process *get_helper(struct transport *transport)
 			strbuf_addf(&gitdir, "gitdir %s\n", get_git_dir());
 			sendline(data, &gitdir);
 			strbuf_release(&gitdir);
+		} else if (!prefixcmp(capname, "export-marks ")) {
+			struct strbuf arg = STRBUF_INIT;
+			strbuf_addstr(&arg, "--export-marks=");
+			strbuf_addstr(&arg, capname + strlen("export-marks "));
+			data->export_marks = strbuf_detach(&arg, NULL);
+		} else if (!prefixcmp(capname, "import-marks")) {
+			struct strbuf arg = STRBUF_INIT;
+			strbuf_addstr(&arg, "--import-marks=");
+			strbuf_addstr(&arg, capname + strlen("import-marks "));
+			data->import_marks = strbuf_detach(&arg, NULL);
 		} else if (mandatory) {
 			die("Unknown mandatory capability %s. This remote "
 			    "helper probably needs newer version of Git.\n",
@@ -364,10 +376,9 @@ static int get_importer(struct transport *transport, struct child_process *fasti
 
 static int get_exporter(struct transport *transport,
 			struct child_process *fastexport,
-			const char *export_marks,
-			const char *import_marks,
 			struct string_list *revlist_args)
 {
+	struct helper_data *data = transport->data;
 	struct child_process *helper = get_helper(transport);
 	int argc = 0, i;
 	memset(fastexport, 0, sizeof(*fastexport));
@@ -378,10 +389,10 @@ static int get_exporter(struct transport *transport,
 	fastexport->argv = xcalloc(5 + revlist_args->nr, sizeof(*fastexport->argv));
 	fastexport->argv[argc++] = "fast-export";
 	fastexport->argv[argc++] = "--use-done-feature";
-	if (export_marks)
-		fastexport->argv[argc++] = export_marks;
-	if (import_marks)
-		fastexport->argv[argc++] = import_marks;
+	if (data->export_marks)
+		fastexport->argv[argc++] = data->export_marks;
+	if (data->import_marks)
+		fastexport->argv[argc++] = data->import_marks;
 
 	for (i = 0; i < revlist_args->nr; i++)
 		fastexport->argv[argc++] = revlist_args->items[i].string;
@@ -708,7 +719,6 @@ static int push_refs_with_export(struct transport *transport,
 	struct ref *ref;
 	struct child_process *helper, exporter;
 	struct helper_data *data = transport->data;
-	char *export_marks = NULL, *import_marks = NULL;
 	struct string_list revlist_args = { NULL, 0, 0 };
 	struct strbuf buf = STRBUF_INIT;
 
@@ -716,26 +726,6 @@ static int push_refs_with_export(struct transport *transport,
 
 	write_constant(helper->in, "export\n");
 
-	recvline(data, &buf);
-	if (debug)
-		fprintf(stderr, "Debug: Got export_marks '%s'\n", buf.buf);
-	if (buf.len) {
-		struct strbuf arg = STRBUF_INIT;
-		strbuf_addstr(&arg, "--export-marks=");
-		strbuf_addbuf(&arg, &buf);
-		export_marks = strbuf_detach(&arg, NULL);
-	}
-
-	recvline(data, &buf);
-	if (debug)
-		fprintf(stderr, "Debug: Got import_marks '%s'\n", buf.buf);
-	if (buf.len) {
-		struct strbuf arg = STRBUF_INIT;
-		strbuf_addstr(&arg, "--import-marks=");
-		strbuf_addbuf(&arg, &buf);
-		import_marks = strbuf_detach(&arg, NULL);
-	}
-
 	strbuf_reset(&buf);
 
 	for (ref = remote_refs; ref; ref = ref->next) {
@@ -754,8 +744,7 @@ static int push_refs_with_export(struct transport *transport,
 
 	}
 
-	if (get_exporter(transport, &exporter,
-			 export_marks, import_marks, &revlist_args))
+	if (get_exporter(transport, &exporter, &revlist_args))
 		die("Couldn't run fast-export");
 
 	if(finish_command(&exporter))
-- 
1.7.2.1.240.g6a95c3
Previous: Jonathan NiederNext: Daniel Barkalow
Message 37 of 52 in “remote helper improvements”
  1. 00/13 remote helper improvementsSverre Rabbelier, Aug 29, 2010
  2. 01/13 fast-import: add the 'done' commandSverre Rabbelier, Aug 29, 2010
  3. Daniel BarkalowAug 29, 2010
  4. Sverre RabbelierAug 29, 2010
  5. Jonathan NiederAug 29, 2010
  6. Sverre RabbelierAug 29, 2010
  7. Jonathan NiederAug 29, 2010
  8. Sverre RabbelierAug 30, 2010
  9. Jonathan NiederAug 30, 2010
  10. Sverre RabbelierAug 30, 2010
  11. Jonathan NiederAug 30, 2010
  12. Jonathan NiederFeb 13, 2011
  13. 02/13 fast-export: support done featureSverre Rabbelier, Aug 29, 2010
  14. Daniel BarkalowAug 29, 2010
  15. Sverre RabbelierAug 29, 2010
  16. Tay Ray ChuanAug 29, 2010
  17. Sverre RabbelierAug 30, 2010
  18. 03/13 transport-helper: factor out push_update_refs_statusSverre Rabbelier, Aug 29, 2010
  19. Jonathan NiederAug 29, 2010
  20. Sverre RabbelierAug 29, 2010
  21. 04/13 transport-helper: check status code of finish_commandSverre Rabbelier, Aug 29, 2010
  22. Jonathan NiederAug 29, 2010
  23. 05/13 transport-helper: use the new done feature to properly do importsSverre Rabbelier, Aug 29, 2010
  24. Jonathan NiederAug 29, 2010
  25. Sverre RabbelierAug 30, 2010
  26. 06/13 transport-helper: update ref status after push with exportSverre Rabbelier, Aug 29, 2010
  27. Jonathan NiederAug 29, 2010
  28. Sverre RabbelierAug 30, 2010
  29. 07/13 transport-helper: change import semanticsSverre Rabbelier, Aug 29, 2010
  30. Daniel BarkalowAug 29, 2010
  31. Sverre RabbelierAug 29, 2010
  32. 08/13 transport-helper: export should disconnect tooSverre Rabbelier, Aug 29, 2010
  33. Daniel BarkalowAug 29, 2010
  34. Sverre RabbelierAug 29, 2010
  35. 09/13 transport-helper: Use capname for gitdir capability tooSverre Rabbelier, Aug 29, 2010
  36. Jonathan NiederAug 30, 2010
  37. 10/13 transport-helper: implement marks location as capabilitySverre Rabbelier, Aug 29, 2010
  38. Daniel BarkalowAug 29, 2010
  39. Sverre RabbelierAug 29, 2010
  40. Jonathan NiederAug 30, 2010
  41. Sverre RabbelierAug 30, 2010
  42. 11/13 remote-curl: accept empty line as terminatorSverre Rabbelier, Aug 29, 2010
  43. Jonathan NiederAug 30, 2010
  44. Sverre RabbelierAug 30, 2010
  45. 12/13 git-remote-testgit: only push for non-local repositoriesSverre Rabbelier, Aug 29, 2010
  46. Jonathan NiederAug 30, 2010
  47. Sverre RabbelierAug 30, 2010
  48. Jonathan NiederAug 30, 2010
  49. 13/13 git-remote-testgit: fix error handlingSverre Rabbelier, Aug 29, 2010
  50. Jonathan NiederAug 30, 2010
  51. Sverre RabbelierAug 30, 2010
  52. Sverre RabbelierAug 30, 2010

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.