summaryrefslogtreecommitdiff
path: root/git-mv.perl
diff options
context:
space:
mode:
authorJosef Weidendorfer <Josef.Weidendorfer@gmx.de>2006-03-01 18:09:23 (GMT)
committerJunio C Hamano <junkio@cox.net>2006-03-01 20:13:46 (GMT)
commit9e7c73de0bcd410d12f897b19419dd35accd961e (patch)
tree252aaf76a11eb038821874a30d4292a518ffdb8b /git-mv.perl
parent5e6f85f6c1d988d125dfcba16bb43a9a65f9eab3 (diff)
downloadgit-9e7c73de0bcd410d12f897b19419dd35accd961e.zip
git-9e7c73de0bcd410d12f897b19419dd35accd961e.tar.gz
git-9e7c73de0bcd410d12f897b19419dd35accd961e.tar.bz2
git-mv: fixes for path handling
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> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'git-mv.perl')
-rwxr-xr-xgit-mv.perl26
1 files changed, 14 insertions, 12 deletions
diff --git a/git-mv.perl b/git-mv.perl
index 8cd95c4..f3e859a 100755
--- a/git-mv.perl
+++ b/git-mv.perl
@@ -31,13 +31,14 @@ 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) {
$base = $src;
$base =~ s/^.*\///;
@@ -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";
}