Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'git-mv.perl')
-rwxr-xr-xgit-mv.perl94
1 files changed, 53 insertions, 41 deletions
diff --git a/git-mv.perl b/git-mv.perl
index bf54c38413..b6c0b48818 100755
--- a/git-mv.perl
+++ b/git-mv.perl
@@ -13,35 +13,15 @@ use Getopt::Std;
sub usage() {
print <<EOT;
-$0 [-f] [-n] <source> <dest>
-$0 [-f] [-k] [-n] <source> ... <dest directory>
-
-In the first form, source must exist and be either a file,
-symlink or directory, dest must not exist. It renames source to dest.
-In the second form, the last argument has to be an existing
-directory; the given sources will be moved into this directory.
-
-Updates the git cache to reflect the change.
-Use "git commit" to make the change permanently.
-
-Options:
- -f Force renaming/moving, even if target exists
- -k Continue on error by skipping
- not-existing or not revision-controlled source
- -n Do nothing; show what would happen
+$0 [-f] [-n] <source> <destination>
+$0 [-f] [-n] [-k] <source> ... <destination directory>
EOT
exit(1);
}
-# Sanity checks:
-my $GIT_DIR = $ENV{'GIT_DIR'} || ".git";
-
-unless ( -d $GIT_DIR && -d $GIT_DIR . "/objects" &&
- -d $GIT_DIR . "/objects/" && -d $GIT_DIR . "/refs") {
- print "Git repository not found.";
- 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);
our ($opt_n, $opt_f, $opt_h, $opt_k, $opt_v);
getopts("hnfkv") || usage;
@@ -70,7 +50,7 @@ else {
print "Error: moving to directory '"
. $ARGV[$argCount-1]
. "' not possible; not exisiting\n";
- usage;
+ exit(1);
}
@srcArgs = ($ARGV[0]);
@dstArgs = ($ARGV[1]);
@@ -122,7 +102,7 @@ while(scalar @srcArgs > 0) {
}
}
- if (($bad eq "") && ($src eq $dstDir)) {
+ if (($bad eq "") && ($dst =~ /^$safesrc\//)) {
$bad = "can not move directory '$src' into itself";
}
@@ -148,7 +128,7 @@ while(scalar @srcArgs > 0) {
next;
}
print "Error: $bad\n";
- usage();
+ exit(1);
}
push @srcs, $src;
push @dsts, $dst;
@@ -156,14 +136,22 @@ while(scalar @srcArgs > 0) {
# Final pass: rename/move
my (@deletedfiles,@addedfiles,@changedfiles);
+$bad = "";
while(scalar @srcs > 0) {
$src = shift @srcs;
$dst = shift @dsts;
if ($opt_n || $opt_v) { print "Renaming $src to $dst\n"; }
if (!$opt_n) {
- rename($src,$dst)
- or die "rename failed: $!";
+ if (!rename($src,$dst)) {
+ $bad = "renaming '$src' failed: $!";
+ if ($opt_k) {
+ print "Warning: skipped: $bad\n";
+ $bad = "";
+ next;
+ }
+ last;
+ }
}
$safesrc = quotemeta($src);
@@ -187,20 +175,44 @@ while(scalar @srcs > 0) {
}
if ($opt_n) {
+ if (@changedfiles) {
print "Changed : ". join(", ", @changedfiles) ."\n";
+ }
+ if (@addedfiles) {
print "Adding : ". join(", ", @addedfiles) ."\n";
+ }
+ if (@deletedfiles) {
print "Deleting : ". join(", ", @deletedfiles) ."\n";
- exit(1);
+ }
}
-
-my $rc;
-if (scalar @changedfiles >0) {
- $rc = system("git-update-index","--",@changedfiles);
- die "git-update-index failed to update changed files with code $?\n" if $rc;
+else {
+ if (@changedfiles) {
+ open(H, "| git-update-index -z --stdin")
+ or die "git-update-index failed to update changed files with code $!\n";
+ foreach my $fileName (@changedfiles) {
+ print H "$fileName\0";
+ }
+ close(H);
+ }
+ if (@addedfiles) {
+ open(H, "| git-update-index --add -z --stdin")
+ or die "git-update-index failed to add new names with code $!\n";
+ foreach my $fileName (@addedfiles) {
+ print H "$fileName\0";
+ }
+ close(H);
+ }
+ if (@deletedfiles) {
+ open(H, "| git-update-index --remove -z --stdin")
+ or die "git-update-index failed to remove old names with code $!\n";
+ foreach my $fileName (@deletedfiles) {
+ print H "$fileName\0";
+ }
+ close(H);
+ }
}
-if (scalar @addedfiles >0) {
- $rc = system("git-update-index","--add","--",@addedfiles);
- die "git-update-index failed to add new names with code $?\n" if $rc;
+
+if ($bad ne "") {
+ print "Error: $bad\n";
+ exit(1);
}
-$rc = system("git-update-index","--remove","--",@deletedfiles);
-die "git-update-index failed to remove old names with code $?\n" if $rc;