3 # Copyright 2005, Ryan Anderson <ryan@michonline.com>
5 # This file is licensed under the GPL v2, or a later version
6 # at the discretion of Linus Torvalds.
15 my $GIT_DIR = $ENV{'GIT_DIR'} || ".git";
17 unless ( -d $GIT_DIR && -d $GIT_DIR . "/objects" &&
18 -d $GIT_DIR . "/objects/" && -d $GIT_DIR . "/refs") {
19 usage("Git repository not found.");
22 usage("") if scalar @ARGV != 2;
24 my ($src,$dst) = @ARGV;
26 unless (-f $src || -l $src || -d $src) {
27 usage("git rename: bad source '$src'");
31 usage("git rename: destinations '$dst' already exists");
34 my (@allfiles,@srcfiles,@dstfiles);
37 open(F,"-|","git-ls-files","-z")
38 or die "Failed to open pipe from git-ls-files: " . $!;
40 @allfiles = map { chomp; $_; } <F>;
43 my $safesrc = quotemeta($src);
44 @srcfiles = grep /^$safesrc/, @allfiles;
45 @dstfiles = @srcfiles;
46 s#^$safesrc(/|$)#$dst$1# for @dstfiles;
49 or die "rename failed: $!";
51 my $rc = system("git-update-index","--add","--",@dstfiles);
52 die "git-update-index failed to add new name with code $?\n" if $rc;
54 $rc = system("git-update-index","--remove","--",@srcfiles);
55 die "git-update-index failed to remove old name with code $?\n" if $rc;
60 print $s, "\n" if (length $s != 0);
63 source must exist and be either a file, symlink or directory.
66 Renames source to dest, and updates the git cache to reflect the change.
67 Use "git commit" to make record the change permanently.