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

Re: [PATCH 2/2] Improve the naming of guessed target repository for git clone

From
Alex Riesen <raa.lkml@gmail.com>
Date
May 14, 2009, 08:33 UTC
Message-ID
<81b0412b0905140133l78def06kae0cb4798feaa4a9@mail.gmail.com>
In-Reply-To
<81b0412b0905132254n5046666t24f3887f1fd4e4d9@mail.gmail.com>

Strip leading and trailing spaces off guessed target directory, and replace sequences of whitespace and 'control' characters with one space character.

User still can have any name by specifying it explicitely after url.
Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
---
2009/5/14 Alex Riesen <raa.lkml@gmail.com>:
> But I should complete the patch: remove heading whitespace, and replace
> multiple spaces and control characters with one space.
Done.
 builtin-clone.c |   34 +++++++++++++++++++++++++++++-----
 1 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/builtin-clone.c b/builtin-clone.c
index 880373f..d068b7e 100644
--- a/builtin-clone.c
+++ b/builtin-clone.c
@@ -104,11 +104,12 @@ static char *get_repo_path(const char *repo, int
*is_bundle)
 static char *guess_dir_name(const char *repo, int is_bundle, int is_bare)
 {
 	const char *end = repo + strlen(repo), *start;
+	char *dir;

 	/*
-	 * Strip trailing slashes and /.git
+	 * Strip trailing spaces, slashes and /.git
 	 */
-	while (repo < end && is_dir_sep(end[-1]))
+	while (repo < end && (is_dir_sep(end[-1]) || isspace(end[-1])))
 		end--;
 	if (end - repo > 5 && is_dir_sep(end[-5]) &&
 	    !strncmp(end - 4, ".git", 4)) {
@@ -140,10 +141,33 @@ static char *guess_dir_name(const char *repo,
int is_bundle, int is_bare)
 	if (is_bare) {
 		struct strbuf result = STRBUF_INIT;
 		strbuf_addf(&result, "%.*s.git", (int)(end - start), start);
-		return strbuf_detach(&result, 0);
+		dir = strbuf_detach(&result, 0);
+	} else
+		dir = xstrndup(start, end - start);
+	/*
+	 * Replace sequences of 'control' characters and whitespace
+	 * with one ascii space, remove leading and trailing spaces.
+	 */
+	if (*dir) {
+		char *out = dir;
+		int prev_space = 1 /* strip leading whitespace */;
+		for (end = dir; *end; ++end) {
+			char ch = *end;
+			if ((unsigned char)ch < '\x20')
+				ch = '\x20';
+			if (isspace(ch)) {
+				if (prev_space)
+					continue;
+				prev_space = 1;
+			} else
+				prev_space = 0;
+			*out++ = ch;
+		}
+		*out = '\0';
+		if (out > dir && prev_space)
+			out[-1] = '\0';
 	}
-
-	return xstrndup(start, end - start);
+	return dir;
 }

 static void strip_trailing_slashes(char *dir)
-- 
1.6.3.1.37.g5d96e


From 6d6075130afbdd35260e3e33c099f57d9faebe98 Mon Sep 17 00:00:00 2001
From: Alex Riesen <raa.lkml@gmail.com>
Date: Wed, 13 May 2009 18:32:06 +0200
Subject: [PATCH 2/2] Improve the naming of guessed target repository for git clone

Strip leading and trailing spaces off guessed target directory, and
replace sequences of whitespace and 'control' characters with one
space character.

User still can have any name by specifying it explicitely after url.

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
---
 builtin-clone.c |   34 +++++++++++++++++++++++++++++-----
 1 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/builtin-clone.c b/builtin-clone.c
index 880373f..d068b7e 100644
--- a/builtin-clone.c
+++ b/builtin-clone.c
@@ -104,11 +104,12 @@ static char *get_repo_path(const char *repo, int *is_bundle)
 static char *guess_dir_name(const char *repo, int is_bundle, int is_bare)
 {
 	const char *end = repo + strlen(repo), *start;
+	char *dir;
 
 	/*
-	 * Strip trailing slashes and /.git
+	 * Strip trailing spaces, slashes and /.git
 	 */
-	while (repo < end && is_dir_sep(end[-1]))
+	while (repo < end && (is_dir_sep(end[-1]) || isspace(end[-1])))
 		end--;
 	if (end - repo > 5 && is_dir_sep(end[-5]) &&
 	    !strncmp(end - 4, ".git", 4)) {
@@ -140,10 +141,33 @@ static char *guess_dir_name(const char *repo, int is_bundle, int is_bare)
 	if (is_bare) {
 		struct strbuf result = STRBUF_INIT;
 		strbuf_addf(&result, "%.*s.git", (int)(end - start), start);
-		return strbuf_detach(&result, 0);
+		dir = strbuf_detach(&result, 0);
+	} else
+		dir = xstrndup(start, end - start);
+	/*
+	 * Replace sequences of 'control' characters and whitespace
+	 * with one ascii space, remove leading and trailing spaces.
+	 */
+	if (*dir) {
+		char *out = dir;
+		int prev_space = 1 /* strip leading whitespace */;
+		for (end = dir; *end; ++end) {
+			char ch = *end;
+			if ((unsigned char)ch < '\x20')
+				ch = '\x20';
+			if (isspace(ch)) {
+				if (prev_space)
+					continue;
+				prev_space = 1;
+			} else
+				prev_space = 0;
+			*out++ = ch;
+		}
+		*out = '\0';
+		if (out > dir && prev_space)
+			out[-1] = '\0';
 	}
-
-	return xstrndup(start, end - start);
+	return dir;
 }
 
 static void strip_trailing_slashes(char *dir)
-- 
1.6.3.1.37.g5d96e
Previous: Hugo MildenbergerNext: Junio C Hamano
Message 26 of 30 in “git fails with control characters in trunk directory name”
  1. Hugo MildenbergerMay 11, 2009
  2. Alex RiesenMay 12, 2009
  3. Hugo MildenbergerMay 12, 2009
  4. Alex RiesenMay 12, 2009
  5. Hugo MildenbergerMay 12, 2009
  6. Alex RiesenMay 12, 2009
  7. Hugo MildenbergerMay 12, 2009
  8. Alex RiesenMay 12, 2009
  9. Quote LF in urls git fetch saves in FETCH_HEADAlex Riesen, May 12, 2009
  10. Junio C HamanoMay 12, 2009
  11. Alex RiesenMay 13, 2009
  12. Hugo MildenbergerMay 13, 2009
  13. Daniel BarkalowMay 13, 2009
  14. Alex RiesenMay 13, 2009
  15. Alex RiesenMay 13, 2009
  16. Daniel BarkalowMay 13, 2009
  17. Alex RiesenMay 13, 2009
  18. Junio C HamanoMay 13, 2009
  19. 1/2 Quote LF in urls git fetch saves in FETCH_HEADAlex Riesen, May 13, 2009
  20. 2/2 Improve the naming of guessed target repository for git cloneAlex Riesen, May 13, 2009
  21. Junio C HamanoMay 14, 2009
  22. Alex RiesenMay 14, 2009
  23. Junio C HamanoMay 14, 2009
  24. Alex RiesenMay 14, 2009
  25. Hugo MildenbergerMay 14, 2009
  26. Alex RiesenMay 14, 2009
  27. Junio C HamanoMay 16, 2009
  28. Alex RiesenMay 12, 2009
  29. Alex RiesenMay 13, 2009
  30. Hugo MildenbergerMay 13, 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.