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

[PATCH 1/3] builtin/fetch.c: Add pretty_url() and print_url()

From
TMTom Miller <jackerran@gmail.com>
Date
Dec 18, 2013, 21:22 UTC
Message-ID
<1387401776-30994-1-git-send-email-jackerran@gmail.com>

In order to fix branchname DF conflicts during `fetch --prune`, the way the header is output to the screen needs to be refactored. Here is an exmaple of the output with the line in question denoted by '>':

	$ git fetch --prune --dry-run upstream
>	From https://github.com/git/git
	   a155a5f..5512ac5  maint      -> upstream/maint
	   d7aced9..7794a68  master     -> upstream/master
	   523f7c4..3e57c29  next       -> upstream/next
	 + 462f102...0937cdf pu         -> upstream/pu  (forced update)
	   e24105a..5d352bc  todo       -> upstream/todo
	 * [new tag]         v1.8.5.2   -> v1.8.5.2
	 * [new tag]         v1.8.5.2   -> v1.8.5.2

pretty_url(): This function when passed a transport url will anonymize the transport of the url. It will strip a trailing '/'. It will also strip a trailing '.git'. It will return the newly formated url for use. I do not believe there is a need for stripping the trailing '/' and '.git' from a url, but it was already there and I wanted to make as little changes as possible.

print_url(): This function will convert a transport url to a pretty url using pretty_url(). Then it will print out the pretty url to stderr as indicated above in the example output. It uses a global variable named "gshown_url' to prevent this header for being printed twice.

Signed-off-by: Tom Miller <jackerran@gmail.com>
---
 builtin/fetch.c | 60 ++++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 42 insertions(+), 18 deletions(-)
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 3d978eb..b3145f6 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -44,6 +44,42 @@ static struct transport *gtransport;
 static struct transport *gsecondary;
 static const char *submodule_prefix = "";
 static const char *recurse_submodules_default;
+static int gshown_url = 0;
+
+static char *pretty_url(const char *raw_url) {
+	if (raw_url) {
+		int url_len, i;
+		char *pretty_url, *url;
+
+		url = transport_anonymize_url(raw_url);
+
+		url_len = strlen(url);
+		for (i = url_len - 1; url[i] == '/' && 0 <= i; i--)
+			;
+		url_len = i + 1;
+		if (4 < i && !strncmp(".git", url + i - 3, 4))
+			url_len = i - 3;
+
+		pretty_url = xcalloc(1, 1 + url_len);
+		memcpy(pretty_url, url, url_len);
+
+		free(url);
+		return pretty_url;
+	}
+	return xstrdup("foreign");
+}
+
+static void print_url(const char *raw_url) {
+	if (!gshown_url) {
+		char *url = pretty_url(raw_url);
+
+		fprintf(stderr, _("From %s\n"), url);
+
+		gshown_url = 1;
+		free(url);
+	}
+}
+
 
 static int option_parse_recurse_submodules(const struct option *opt,
 				   const char *arg, int unset)
@@ -535,7 +571,7 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 {
 	FILE *fp;
 	struct commit *commit;
-	int url_len, i, shown_url = 0, rc = 0;
+	int url_len, i, rc = 0;
 	struct strbuf note = STRBUF_INIT;
 	const char *what, *kind;
 	struct ref *rm;
@@ -546,10 +582,8 @@ 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));
 
-	if (raw_url)
-		url = transport_anonymize_url(raw_url);
-	else
-		url = xstrdup("foreign");
+	url = pretty_url(raw_url);
+	url_len = strlen(url);
 
 	rm = ref_map;
 	if (check_everything_connected(iterate_ref_map, 0, &rm)) {
@@ -606,13 +640,6 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 				what = rm->name;
 			}
 
-			url_len = strlen(url);
-			for (i = url_len - 1; url[i] == '/' && 0 <= i; i--)
-				;
-			url_len = i + 1;
-			if (4 < i && !strncmp(".git", url + i - 3, 4))
-				url_len = i - 3;
-
 			strbuf_reset(&note);
 			if (*what) {
 				if (*kind)
@@ -651,13 +678,10 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 					    REFCOL_WIDTH,
 					    *what ? what : "HEAD");
 			if (note.len) {
-				if (verbosity >= 0 && !shown_url) {
-					fprintf(stderr, _("From %.*s\n"),
-							url_len, url);
-					shown_url = 1;
-				}
-				if (verbosity >= 0)
+				if (verbosity >= 0) {
+					print_url(raw_url);
 					fprintf(stderr, " %s\n", note.buf);
+				}
 			}
 		}
 	}
-- 
1.8.5.1.163.gd7aced9
Next: Tom Miller
Message 1 of 13 in “builtin/fetch.c: Add pretty_url() and print_url()”
  1. 1/3 builtin/fetch.c: Add pretty_url() and print_url()Tom Miller, Dec 18, 2013
  2. 2/3 fetch --prune: Always print header urlTom Miller, Dec 18, 2013
  3. 3/3 fetch --prune: Repair branchname DF conflictsTom Miller, Dec 18, 2013
  4. Junio C HamanoDec 18, 2013
  5. Tom MillerDec 19, 2013
  6. Junio C HamanoDec 19, 2013
  7. Jeff KingDec 19, 2013
  8. Junio C HamanoDec 19, 2013
  9. Junio C HamanoDec 18, 2013
  10. Tom MillerDec 19, 2013
  11. Thomas MillerDec 19, 2013
  12. 1/2 fetch --prune: Always print header urlTom Miller, Dec 19, 2013
  13. 2/2 fetch --prune: Run prune before fetchingTom Miller, Dec 19, 2013

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.