diff options
Diffstat (limited to 'git-rename.perl')
-rwxr-xr-x | git-rename.perl | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/git-rename.perl b/git-rename.perl new file mode 100755 index 000000000..a28c8c83b --- /dev/null +++ b/git-rename.perl @@ -0,0 +1,70 @@ +#!/usr/bin/perl +# +# Copyright 2005, Ryan Anderson <ryan@michonline.com> +# +# This file is licensed under the GPL v2, or a later version +# at the discretion of Linus Torvalds. + + +use warnings; +use strict; + +sub usage($); + +# Sanity checks: +my $GIT_DIR = $ENV{'GIT_DIR'} || ".git"; + +unless ( -d $GIT_DIR && -d $GIT_DIR . "/objects" && + -d $GIT_DIR . "/objects/00" && -d $GIT_DIR . "/refs") { + usage("Git repository not found."); +} + +usage("") if scalar @ARGV != 2; + +my ($src,$dst) = @ARGV; + +unless (-f $src || -l $src || -d $src) { + usage("git rename: bad source '$src'"); +} + +if (-e $dst) { + usage("git rename: destinations '$dst' already exists"); +} + +my (@allfiles,@srcfiles,@dstfiles); + +$/ = "\0"; +open(F,"-|","git-ls-files","-z") + or die "Failed to open pipe from git-ls-files: " . $!; + +@allfiles = map { chomp; $_; } <F>; +close(F); + +my $safesrc = quotemeta($src); +@srcfiles = grep /^$safesrc/, @allfiles; +@dstfiles = @srcfiles; +s#^$safesrc(/|$)#$dst$1# for @dstfiles; + +rename($src,$dst) + or die "rename failed: $!"; + +my $rc = system("git-update-index","--add","--",@dstfiles); +die "git-update-index failed to add new name with code $?\n" if $rc; + +$rc = system("git-update-index","--remove","--",@srcfiles); +die "git-update-index failed to remove old name with code $?\n" if $rc; + + +sub usage($) { + my $s = shift; + print $s, "\n" if (length $s != 0); + print <<EOT; +$0 <source> <dest> +source must exist and be either a file, symlink or directory. +dest must NOT exist. + +Renames source to dest, and updates the git cache to reflect the change. +Use "git commit" to make record the change permanently. +EOT + exit(1); +} |