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

[PATCH] git-mv: fixes for path handling

From
JWJosef Weidendorfer <josef.weidendorfer@gmx.de>
Date
Mar 1, 2006, 18:09 UTC
Message-ID
<200603011909.23357.Josef.Weidendorfer@gmx.de>

Moving a directory ending in a slash was not working as the destination was not calculated correctly. E.g. in the git repo,

 git-mv t/ Documentation
gave the error
 Error: destination 'Documentation' already exists

To get rid of this problem, strip trailing slashes from all arguments. The comment in cg-mv made me curious about this issue; Pasky, thanks! As result, the workaround in cg-mv is not needed any more.

Also, another bug was shown by cg-mv. When moving files outside of a subdirectory, it typically calls git-mv with something like

 git-mv Documentation/git.txt Documentation/../git-mv.txt
which triggers the following error from git-update-index:
 Ignoring path Documentation/../git-mv.txt

The result is a moved file, removed from git revisioning, but not added again. To fix this, the paths have to be normalized not have ".." in the middle. This was already done in git-mv, but only for a better visual appearance :(

Signed-off-by: Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
---
 git-mv.perl |   24 +++++++++++++-----------
 1 files changed, 13 insertions(+), 11 deletions(-)
15d94ce0807c1d99d10f6c3ddd32963b1ac0fece
diff --git a/git-mv.perl b/git-mv.perl
index 8cd95c4..9b43dcc 100755
--- a/git-mv.perl
+++ b/git-mv.perl
@@ -31,11 +31,12 @@ chomp($GIT_DIR);
 my (@srcArgs, @dstArgs, @srcs, @dsts);
 my ($src, $dst, $base, $dstDir);
 
+# remove any trailing slash in arguments
+for (@ARGV) { s/\/*$//; }
+
 my $argCount = scalar @ARGV;
 if (-d $ARGV[$argCount-1]) {
 	$dstDir = $ARGV[$argCount-1];
-	# remove any trailing slash
-	$dstDir =~ s/\/$//;
 	@srcArgs = @ARGV[0..$argCount-2];
 	
 	foreach $src (@srcArgs) {
@@ -61,6 +62,16 @@ else {
     $dstDir = "";
 }
 
+# normalize paths, needed to compare against versioned files and update-index
+# also, this is nicer to end-users by doing ".//a/./b/.//./c" ==> "a/b/c"
+for (@srcArgs, @dstArgs) {
+    s|^\./||;
+    s|/\./|/| while (m|/\./|);
+    s|//+|/|g;
+    # Also "a/b/../c" ==> "a/c"
+    1 while (s,(^|/)[^/]+/\.\./,$1,);
+}
+
 my (@allfiles,@srcfiles,@dstfiles);
 my $safesrc;
 my (%overwritten, %srcForDst);
@@ -79,15 +90,6 @@ while(scalar @srcArgs > 0) {
     $dst = shift @dstArgs;
     $bad = "";
 
-    for ($src, $dst) {
-	# Be nicer to end-users by doing ".//a/./b/.//./c" ==> "a/b/c"
-	s|^\./||;
-	s|/\./|/| while (m|/\./|);
-	s|//+|/|g;
-	# Also "a/b/../c" ==> "a/c"
-	1 while (s,(^|/)[^/]+/\.\./,$1,);
-    }
-
     if ($opt_v) {
 	print "Checking rename of '$src' to '$dst'\n";
     }
-- 
1.2.0.g719b
Message 1 of 1 in “git-mv: fixes for path handling”
  1. git-mv: fixes for path handlingJosef Weidendorfer, Mar 1, 2006

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.