threads / patch / 19982

patchgit-mv: fix directory separator treatment on Windows

Subject: [PATCH] git-mv: fix directory separator treatment on Windows

## tl;dr

2 messages between Jun 30, 2009 and Jun 30, 2009. Diffs are folded; open one to read it.

replies: 1people: 2as markdown or json

Johannes Sixt· Jun 30, 2009, 13:33 UTC · lore
From: Johannes Sixt <j6t@kdbg.org>
The following invocations did not work as expected on Windows:
    git mv foo\bar dest
    git mv foo\ dest
The first command was interpreted as
    git mv foo/bar dest/foo/bar

because the Windows style directory separator was not obeyed when the basename of 'foo\bar' was computed.

The second command failed because the Windows style directory separator was not removed from the source directory, whereupon the lookup of the directory in the index failed.

This fixes both issues by using is_dir_sep() and basename().
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
 builtin-mv.c |   10 +++-------
 1 files changed, 3 insertions(+), 7 deletions(-)
Show changes to builtin-mv.c +3 −7
diff --git a/builtin-mv.c b/builtin-mv.c
index 8b81d4b..68f4738 100644
--- a/builtin-mv.c
+++ b/builtin-mv.c
@@ -24,14 +24,10 @@ static const char **copy_pathspec(const char *prefix,
 	result[count] = NULL;
 	for (i = 0; i < count; i++) {
 		int length = strlen(result[i]);
-		if (length > 0 && result[i][length - 1] == '/') {
+		if (length > 0 && is_dir_sep(result[i][length - 1]))
 			result[i] = xmemdupz(result[i], length - 1);
-		}
-		if (base_name) {
-			const char *last_slash = strrchr(result[i], '/');
-			if (last_slash)
-				result[i] = last_slash + 1;
-		}
+		if (base_name)
+			result[i] = basename((char *)result[i]);
 	}
 	return get_pathspec(prefix, result);
 }
-- 
1.6.3.3.1337.g9661167.dirty
Johannes Schindelin· Jun 30, 2009, 14:20 UTC · re: Johannes Sixt · lore

Re: [PATCH] git-mv: fix directory separator treatment on Windows

Hi,
On Tue, 30 Jun 2009, Johannes Sixt wrote:
Show 21 quoted lines
> From: Johannes Sixt <j6t@kdbg.org>
> 
> The following invocations did not work as expected on Windows:
> 
>     git mv foo\bar dest
>     git mv foo\ dest
> 
> The first command was interpreted as
> 
>     git mv foo/bar dest/foo/bar
> 
> because the Windows style directory separator was not obeyed when the
> basename of 'foo\bar' was computed.
> 
> The second command failed because the Windows style directory separator was
> not removed from the source directory, whereupon the lookup of the
> directory in the index failed.
> 
> This fixes both issues by using is_dir_sep() and basename().
> 
> Signed-off-by: Johannes Sixt <j6t@kdbg.org>
ACK
Dscho

← back to recent threads