71 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
| #!/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-cache","--add","--",@dstfiles);
 | |
| die "git-update-cache failed to add new name with code $?\n" if $rc;
 | |
| 
 | |
| $rc = system("git-update-cache","--remove","--",@srcfiles);
 | |
| die "git-update-cache 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);
 | |
| }
 |