Merge git-mv fixes from 'maint'
authorJunio C Hamano <junkio@cox.net>
Wed, 1 Mar 2006 20:16:25 +0000 (12:16 -0800)
committerJunio C Hamano <junkio@cox.net>
Wed, 1 Mar 2006 20:16:25 +0000 (12:16 -0800)
1  2 
git-mv.perl
diff --combined git-mv.perl
index 2ea852c9185743d5b84523698cbffaaffb238543,f3e859ae48af05d0b982a159c2197bab7e5da996..fe9c40e1b9ed81f0494bf2c20239c6a5d5b76d30
@@@ -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/^.*\///;
        }
  }
  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]);
      $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";
      }