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

[PATCH v3 08/12] Allow helper to map private ref names into normal names

From
Sverre Rabbelier <srabbelier@gmail.com>
Date
Nov 6, 2009, 22:52 UTC
Message-ID
<1257547966-14603-9-git-send-email-srabbelier@gmail.com>
In-Reply-To
<1257547966-14603-8-git-send-email-srabbelier@gmail.com>
From: Daniel Barkalow <barkalow@iabervon.org>

This allows a helper to say that, when it handles "import refs/heads/topic", the script it outputs will actually write to refs/svn/origin/branches/topic; therefore, transport-helper should read it from the latter location after git-fast-import completes. ---

	New in this series.
	Daniel, you did not include a S-o-b, I assume because you
	mean to add documentation?
 remote.c           |   17 +++++++++++++++++
 remote.h           |    3 +++
 transport-helper.c |   26 +++++++++++++++++++++++++-
 3 files changed, 45 insertions(+), 1 deletions(-)
diff --git a/remote.c b/remote.c
index 09bb79c..09e14a8 100644
--- a/remote.c
+++ b/remote.c
@@ -811,6 +811,23 @@ static int match_name_with_pattern(const char *key, const char *name,
 	return ret;
 }
 
+char *apply_refspecs(struct refspec *refspecs, int nr_refspec,
+		     const char *name)
+{
+	int i;
+	char *ret = NULL;
+	for (i = 0; i < nr_refspec; i++) {
+		struct refspec *refspec = refspecs + i;
+		if (refspec->pattern) {
+			if (match_name_with_pattern(refspec->src, name,
+						    refspec->dst, &ret))
+				return ret;
+		} else if (!strcmp(refspec->src, name))
+			return strdup(refspec->dst);
+	}
+	return NULL;
+}
+
 int remote_find_tracking(struct remote *remote, struct refspec *refspec)
 {
 	int find_src = refspec->src == NULL;
diff --git a/remote.h b/remote.h
index ac0ce2f..c2f920b 100644
--- a/remote.h
+++ b/remote.h
@@ -91,6 +91,9 @@ void ref_remove_duplicates(struct ref *ref_map);
 int valid_fetch_refspec(const char *refspec);
 struct refspec *parse_fetch_refspec(int nr_refspec, const char **refspec);
 
+char *apply_refspecs(struct refspec *refspecs, int nr_refspec,
+		     const char *name);
+
 int match_refs(struct ref *src, struct ref **dst,
 	       int nr_refspec, const char **refspec, int all);
 
diff --git a/transport-helper.c b/transport-helper.c
index 82caaae..c4ab84a 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -5,6 +5,7 @@
 #include "commit.h"
 #include "diff.h"
 #include "revision.h"
+#include "remote.h"
 
 struct helper_data
 {
@@ -12,6 +13,9 @@ struct helper_data
 	struct child_process *helper;
 	unsigned fetch : 1;
 	unsigned import : 1;
+	/* These go from remote name (as in "list") to private name */
+	struct refspec *refspecs;
+	int refspec_nr;
 };
 
 static struct child_process *get_helper(struct transport *transport)
@@ -20,6 +24,9 @@ static struct child_process *get_helper(struct transport *transport)
 	struct strbuf buf = STRBUF_INIT;
 	struct child_process *helper;
 	FILE *file;
+	const char **refspecs = NULL;
+	int refspec_nr = 0;
+	int refspec_alloc = 0;
 
 	if (data->helper)
 		return data->helper;
@@ -51,6 +58,16 @@ static struct child_process *get_helper(struct transport *transport)
 			data->fetch = 1;
 		if (!strcmp(buf.buf, "import"))
 			data->import = 1;
+		if (!prefixcmp(buf.buf, "refspec ")) {
+			ALLOC_GROW(refspecs,
+				   refspec_nr + 1,
+				   refspec_alloc);
+			refspecs[refspec_nr++] = strdup(buf.buf + strlen("refspec "));
+		}
+	}
+	if (refspecs) {
+		data->refspec_nr = refspec_nr;
+		data->refspecs = parse_fetch_refspec(refspec_nr, refspecs);
 	}
 	return data->helper;
 }
@@ -119,6 +136,7 @@ static int fetch_with_import(struct transport *transport,
 {
 	struct child_process fastimport;
 	struct child_process *helper = get_helper(transport);
+	struct helper_data *data = transport->data;
 	int i;
 	struct ref *posn;
 	struct strbuf buf = STRBUF_INIT;
@@ -139,10 +157,16 @@ static int fetch_with_import(struct transport *transport,
 	finish_command(&fastimport);
 
 	for (i = 0; i < nr_heads; i++) {
+		char *private;
 		posn = to_fetch[i];
 		if (posn->status & REF_STATUS_UPTODATE)
 			continue;
-		read_ref(posn->name, posn->old_sha1);
+		if (data->refspecs)
+			private = apply_refspecs(data->refspecs, data->refspec_nr, posn->name);
+		else
+			private = strdup(posn->name);
+		read_ref(private, posn->old_sha1);
+		free(private);
 	}
 	return 0;
 }
-- 
1.6.5.2.158.g6dacb
Previous: Sverre RabbelierNext: Sverre Rabbelier
Message 9 of 22 in “Reroll of the remote-vcs-helper series”
  1. 00/12 Reroll of the remote-vcs-helper seriesSverre Rabbelier, Nov 6, 2009
  2. 01/12 Fix memory leak in helper method for disconnectSverre Rabbelier, Nov 6, 2009
  3. 02/12 Allow programs to not depend on remotes having urlsSverre Rabbelier, Nov 6, 2009
  4. 03/12 Use a function to determine whether a remote is validSverre Rabbelier, Nov 6, 2009
  5. 04/12 Allow fetch to modify refsSverre Rabbelier, Nov 6, 2009
  6. 05/12 Add a config option for remotes to specify a foreign vcsSverre Rabbelier, Nov 6, 2009
  7. 06/12 Allow specifying the remote helper in the urlSverre Rabbelier, Nov 6, 2009
  8. 07/12 Add support for "import" helper commandSverre Rabbelier, Nov 6, 2009
  9. 08/12 Allow helper to map private ref names into normal namesSverre Rabbelier, Nov 6, 2009
  10. 09/12 Allow helpers to report in "list" command that the ref is unchangedSverre Rabbelier, Nov 6, 2009
  11. 10/12 Allow helpers to request the path to the .git directorySverre Rabbelier, Nov 6, 2009
  12. 11/12 Basic build infrastructure for Python scriptsSverre Rabbelier, Nov 6, 2009
  13. 12/12 Add Python support library for remote helpersSverre Rabbelier, Nov 6, 2009
  14. Andrzej K. HaczewskiNov 6, 2009
  15. Sverre RabbelierNov 6, 2009
  16. Johannes SchindelinNov 7, 2009
  17. Daniel BarkalowNov 6, 2009
  18. Sverre RabbelierNov 6, 2009
  19. Sverre RabbelierNov 9, 2009
  20. Junio C HamanoNov 9, 2009
  21. Sverre RabbelierNov 9, 2009
  22. Junio C HamanoNov 9, 2009

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.