Browse Source
Oh, and in the process, rewrite it in Perl. Signed-off-by: Ryan Anderson <ryan@michonline.com> Signed-off-by: Junio C Hamano <junkio@cox.net>maint
Ryan Anderson
20 years ago
committed by
Junio C Hamano
1 changed files with 68 additions and 5 deletions
@ -1,7 +1,70 @@
@@ -1,7 +1,70 @@
|
||||
#!/bin/sh |
||||
#!/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. |
||||
|
||||
. git-sh-setup-script || die "Not a git archive" |
||||
|
||||
[ -f "$1" ] || [ -h "$1" ] || die "git rename: bad source" |
||||
[ -e "$2" ] && die "git rename: destination already exists" |
||||
mv -- "$1" "$2" && git-update-cache --add --remove -- "$1" "$2" |
||||
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); |
||||
} |
||||
|
Loading…
Reference in new issue