summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: fb6a3d8)
raw | patch | inline | side by side (parent: fb6a3d8)
author | Ryan Anderson <ryan@michonline.com> | |
Mon, 25 Jul 2005 05:26:47 +0000 (01:26 -0400) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Thu, 28 Jul 2005 05:47:06 +0000 (22:47 -0700) |
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>
Signed-off-by: Ryan Anderson <ryan@michonline.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
git-rename-script | patch | blob | history |
diff --git a/git-rename-script b/git-rename-script
index 3952382dbce6b27311680cf255dc0ffb6828c011..b4d314808370e7653d8b034ae90ad413226bf560 100755 (executable)
--- a/git-rename-script
+++ b/git-rename-script
-#!/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);
+}