From: Junio C Hamano Date: Wed, 1 Mar 2006 20:16:25 +0000 (-0800) Subject: Merge git-mv fixes from 'maint' X-Git-Tag: v1.3.0-rc1~109 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/4d569a2c422a9655390e7d33cad0bab88379f13d?ds=inline;hp=-c Merge git-mv fixes from 'maint' --- 4d569a2c422a9655390e7d33cad0bab88379f13d diff --combined git-mv.perl index 2ea852c918,f3e859ae48..fe9c40e1b9 --- a/git-mv.perl +++ b/git-mv.perl @@@ -19,25 -19,26 +19,26 @@@ EO exit(1); } - my $GIT_DIR = `git rev-parse --git-dir`; - exit 1 if $?; # rev-parse would have given "not a git dir" message. - chomp($GIT_DIR); - our ($opt_n, $opt_f, $opt_h, $opt_k, $opt_v); getopts("hnfkv") || usage; usage() if $opt_h; @ARGV >= 1 or usage; + my $GIT_DIR = `git rev-parse --git-dir`; + exit 1 if $?; # rev-parse would have given "not a git dir" message. + 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/^.*\///; @@@ -46,10 -47,14 +47,14 @@@ } } else { - if ($argCount != 2) { + if ($argCount < 2) { + print "Error: need at least two arguments\n"; + exit(1); + } + if ($argCount > 2) { print "Error: moving to directory '" . $ARGV[$argCount-1] - . "' not possible; not exisiting\n"; + . "' not possible; not existing\n"; exit(1); } @srcArgs = ($ARGV[0]); @@@ -57,6 -62,16 +62,16 @@@ $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); @@@ -75,15 -90,6 +90,15 @@@ 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"; }