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

[PATCH v4 02/12] Allow programs to not depend on remotes having urls

From
Sverre Rabbelier <srabbelier@gmail.com>
Date
Nov 18, 2009, 01:42 UTC
Message-ID
<1258508552-20752-3-git-send-email-srabbelier@gmail.com>
In-Reply-To
<1258508552-20752-2-git-send-email-srabbelier@gmail.com>
From: Daniel Barkalow <barkalow@iabervon.org>

For fetch and ls-remote, which use the first url of a remote, have transport_get() determine this by passing a remote and passing NULL for the url. For push, which uses every url of a remote, use each url in turn if there are any, and use NULL if there are none.

This will allow the transport code to do something different if the location is not specified with a url.

Also, have the message for a fetch say "foreign" if there is no url.
Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Sverre Rabbelier <srabbelier@gmail.com>
---
	Rebased against master again, Daniel, please verify that I
	didn't mess resolving conflicts.
 builtin-fetch.c     |    7 +++-
 builtin-ls-remote.c |    2 +-
 builtin-push.c      |   68 +++++++++++++++++++++++++++++++-------------------
 transport.c         |    3 ++
 4 files changed, 51 insertions(+), 29 deletions(-)
diff --git a/builtin-fetch.c b/builtin-fetch.c
index f871f2b..99bc3b9 100644
--- a/builtin-fetch.c
+++ b/builtin-fetch.c
@@ -309,7 +309,10 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 	if (!fp)
 		return error("cannot open %s: %s\n", filename, strerror(errno));
 
-	url = transport_anonymize_url(raw_url);
+	if (raw_url)
+		url = transport_anonymize_url(raw_url);
+	else
+		url = xstrdup("foreign");
 	for (rm = ref_map; rm; rm = rm->next) {
 		struct ref *ref = NULL;
 
@@ -704,7 +707,7 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
 	if (!remote)
 		die("Where do you want to fetch from today?");
 
-	transport = transport_get(remote, remote->url[0]);
+	transport = transport_get(remote, NULL);
 	if (verbosity >= 2)
 		transport->verbose = 1;
 	if (verbosity < 0)
diff --git a/builtin-ls-remote.c b/builtin-ls-remote.c
index b5bad0c..70f5622 100644
--- a/builtin-ls-remote.c
+++ b/builtin-ls-remote.c
@@ -89,7 +89,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
 	remote = remote_get(dest);
 	if (!remote->url_nr)
 		die("remote %s has no configured URL", dest);
-	transport = transport_get(remote, remote->url[0]);
+	transport = transport_get(remote, NULL);
 	if (uploadpack != NULL)
 		transport_set_option(transport, TRANS_OPT_UPLOADPACK, uploadpack);
 
diff --git a/builtin-push.c b/builtin-push.c
index 356d7c1..a21e46c 100644
--- a/builtin-push.c
+++ b/builtin-push.c
@@ -87,6 +87,36 @@ static void setup_default_push_refspecs(void)
 	}
 }
 
+static int push_with_options(struct transport *transport, int flags)
+{
+	int err;
+	int nonfastforward;
+	if (receivepack)
+		transport_set_option(transport,
+				     TRANS_OPT_RECEIVEPACK, receivepack);
+	if (thin)
+		transport_set_option(transport, TRANS_OPT_THIN, "yes");
+
+	if (flags & TRANSPORT_PUSH_VERBOSE)
+		fprintf(stderr, "Pushing to %s\n", transport->url);
+	err = transport_push(transport, refspec_nr, refspec, flags,
+			     &nonfastforward);
+	err |= transport_disconnect(transport);
+
+	if (!err)
+		return 0;
+
+	error("failed to push some refs to '%s'", transport->url);
+
+	if (nonfastforward && advice_push_nonfastforward) {
+		printf("To prevent you from losing history, non-fast-forward updates were rejected\n"
+		       "Merge the remote changes before pushing again.  See the 'non-fast-forward'\n"
+		       "section of 'git push --help' for details.\n");
+	}
+
+	return 1;
+}
+
 static int do_push(const char *repo, int flags)
 {
 	int i, errs;
@@ -135,33 +165,19 @@ static int do_push(const char *repo, int flags)
 		url = remote->url;
 		url_nr = remote->url_nr;
 	}
-	for (i = 0; i < url_nr; i++) {
-		struct transport *transport =
-			transport_get(remote, url[i]);
-		int err;
-		int nonfastforward;
-		if (receivepack)
-			transport_set_option(transport,
-					     TRANS_OPT_RECEIVEPACK, receivepack);
-		if (thin)
-			transport_set_option(transport, TRANS_OPT_THIN, "yes");
-
-		if (flags & TRANSPORT_PUSH_VERBOSE)
-			fprintf(stderr, "Pushing to %s\n", url[i]);
-		err = transport_push(transport, refspec_nr, refspec, flags,
-				     &nonfastforward);
-		err |= transport_disconnect(transport);
-
-		if (!err)
-			continue;
-
-		error("failed to push some refs to '%s'", url[i]);
-		if (nonfastforward && advice_push_nonfastforward) {
-			printf("To prevent you from losing history, non-fast-forward updates were rejected\n"
-			       "Merge the remote changes before pushing again.  See the 'non-fast-forward'\n"
-			       "section of 'git push --help' for details.\n");
+	if (url_nr) {
+		for (i = 0; i < url_nr; i++) {
+			struct transport *transport =
+				transport_get(remote, url[i]);
+			if (push_with_options(transport, flags))
+				errs++;
 		}
-		errs++;
+	} else {
+		struct transport *transport =
+			transport_get(remote, NULL);
+
+		if (push_with_options(transport, flags))
+			errs++;
 	}
 	return !!errs;
 }
diff --git a/transport.c b/transport.c
index d249203..4987555 100644
--- a/transport.c
+++ b/transport.c
@@ -816,6 +816,9 @@ struct transport *transport_get(struct remote *remote, const char *url)
 		die("No remote provided to transport_get()");
 
 	ret->remote = remote;
+
+	if (!url && remote && remote->url)
+		url = remote->url[0];
 	ret->url = url;
 
 	if (!prefixcmp(url, "rsync:")) {
-- 
1.6.5.3.164.g07b0c
Previous: Sverre RabbelierNext: Sverre Rabbelier
Message 3 of 13 in “Reroll of the remote-vcs-helper series”
  1. 00/12 Reroll of the remote-vcs-helper seriesSverre Rabbelier, Nov 18, 2009
  2. 01/12 Fix memory leak in helper method for disconnectSverre Rabbelier, Nov 18, 2009
  3. 02/12 Allow programs to not depend on remotes having urlsSverre Rabbelier, Nov 18, 2009
  4. 03/12 Use a function to determine whether a remote is validSverre Rabbelier, Nov 18, 2009
  5. 04/12 Allow fetch to modify refsSverre Rabbelier, Nov 18, 2009
  6. 05/12 Add a config option for remotes to specify a foreign vcsSverre Rabbelier, Nov 18, 2009
  7. 06/12 Allow specifying the remote helper in the urlSverre Rabbelier, Nov 18, 2009
  8. 07/12 Add support for "import" helper commandSverre Rabbelier, Nov 18, 2009
  9. 08/12 Allow helper to map private ref names into normal namesSverre Rabbelier, Nov 18, 2009
  10. 09/12 Fix various memory leaks in transport-helper.cSverre Rabbelier, Nov 18, 2009
  11. 10/12 Allow helpers to report in "list" command that the ref is unchangedSverre Rabbelier, Nov 18, 2009
  12. 11/12 Basic build infrastructure for Python scriptsSverre Rabbelier, Nov 18, 2009
  13. 12/12 Add Python support library for remote helpersSverre Rabbelier, Nov 18, 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.