X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-rename-script;h=b4d314808370e7653d8b034ae90ad413226bf560;hb=a1d4aa742416953a3ac9be9154c55e90a4193cd6;hp=3952382dbce6b27311680cf255dc0ffb6828c011;hpb=399144f21c1b3bcd4c9dadd4f534118475de840d;p=git.git diff --git a/git-rename-script b/git-rename-script index 3952382d..b4d31480 100755 --- a/git-rename-script +++ b/git-rename-script @@ -1,7 +1,70 @@ -#!/bin/sh +#!/usr/bin/perl +# +# Copyright 2005, Ryan Anderson +# +# 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; $_; } ; +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 < +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); +}