X-Git-Url: https://git.octo.it/?p=git.git;a=blobdiff_plain;f=git-mv.perl;h=75aa8feeb6201c54e55bfaca0cc178c53891e776;hp=8cd95c472ffb7b86fcd1faa0c7b8d365029b9597;hb=HEAD;hpb=5e6f85f6c1d988d125dfcba16bb43a9a65f9eab3 diff --git a/git-mv.perl b/git-mv.perl index 8cd95c47..75aa8fee 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,24 @@ else { $dstDir = ""; } +my $subdir_prefix = `git rev-parse --show-prefix`; +chomp($subdir_prefix); + +# run in git base directory, so that git-ls-files lists all revisioned files +chdir "$GIT_DIR/.."; + +# 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) { + # prepend git prefix as we run from base directory + $_ = $subdir_prefix.$_; + 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);