From: Ryan Anderson <ryan@michonline.com>
To: Junio C Hamano <junkio@cox.net>, git@vger.kernel.org
Cc: Ryan Anderson <ryan@michonline.com>
Subject: [PATCH] Add support for renaming multiple items at once, and for the destination to be a directory.
Date: Mon, 31 Oct 2005 02:25:31 -0500 [thread overview]
Message-ID: <11307435312942-git-send-email-ryan@michonline.com> (raw)
In-Reply-To: <7vzmp04uot.fsf@assigned-by-dhcp.cox.net>
Signed-off-by: Ryan Anderson <ryan@michonline.com>
---
> *1* It strikes me that git rename *could* be friendlier by emulating
> how "mv" treats the paths parameters (current implementation insists
> two parameters $src and $dst). What do you think, Ryan?
How does this look?
Documentation/git-rename.txt | 1 +
git-rename.perl | 69 +++++++++++++++++++++++++++---------------
2 files changed, 46 insertions(+), 24 deletions(-)
applies-to: 0146495a383d5af298e9c9ef33e1c5d506c63afc
172761431e16af8650f973fc16fae6e74935b422
diff --git a/Documentation/git-rename.txt b/Documentation/git-rename.txt
index 583cb03..17ca558 100644
--- a/Documentation/git-rename.txt
+++ b/Documentation/git-rename.txt
@@ -9,6 +9,7 @@ git-rename - Script used to rename a fil
SYNOPSIS
--------
'git-rename' <source> <destination>
+'git-rename' <source> [source ... ] <destination directory>
DESCRIPTION
-----------
diff --git a/git-rename.perl b/git-rename.perl
index 3b1127b..51dec91 100755
--- a/git-rename.perl
+++ b/git-rename.perl
@@ -8,6 +8,9 @@
use warnings;
use strict;
+require 5.008;
+
+use File::Basename qw(basename);
sub usage($);
@@ -19,40 +22,58 @@ unless ( -d $GIT_DIR && -d $GIT_DIR . "/
usage("Git repository not found.");
}
-usage("") if scalar @ARGV != 2;
+usage("") if scalar @ARGV < 2;
-my ($src,$dst) = @ARGV;
+my $dst = pop @ARGV;
+my @src = @ARGV;
-unless (-f $src || -l $src || -d $src) {
- usage("git rename: bad source '$src'");
+foreach my $src (@src) {
+ unless (-f $src || -l $src || -d $src) {
+ usage("git rename: bad source '$src'");
+ }
}
-if (-e $dst) {
- usage("git rename: destinations '$dst' already exists");
+if (-e $dst && !-d $dst) {
+ usage("git rename: destination '$dst' already exists");
}
-my (@allfiles,@srcfiles,@dstfiles);
-
-$/ = "\0";
-open(F,"-|","git-ls-files","-z")
- or die "Failed to open pipe from git-ls-files: " . $!;
+# Append a "/" if one doesn't exist on the end of $dst, and $dst is
+# a directory.
+$dst .= "/" if -d $dst && $dst !~ m#/$#;
+
+foreach my $src (@src) {
+ my (@allfiles,@srcfiles,@dstfiles);
+ my $actualdst = $dst;
+
+ $/ = "\0";
+ open(F,"-|","git-ls-files","-z")
+ or die "Failed to open pipe from git-ls-files: " . $!;
+
+ @allfiles = map { chomp; $_; } <F>;
+ close(F);
+
+ if (-d $src) {
+ # Remove a trailing / if any
+ $src =~ s#/$##;
+ my $tsrc = basename $src;
+ $actualdst = $dst . $tsrc;
+ }
+
+ my $safesrc = quotemeta($src);
+ @srcfiles = grep /^$safesrc/, @allfiles;
+ @dstfiles = @srcfiles;
+ s#^$safesrc(/|$)#$actualdst$1# for @dstfiles;
-@allfiles = map { chomp; $_; } <F>;
-close(F);
-my $safesrc = quotemeta($src);
-@srcfiles = grep /^$safesrc/, @allfiles;
-@dstfiles = @srcfiles;
-s#^$safesrc(/|$)#$dst$1# for @dstfiles;
+ rename($src,$actualdst)
+ or die "rename($src,$actualdst) failed: $!";
-rename($src,$dst)
- or die "rename failed: $!";
+ my $rc = system("git-update-index","--add","--",@dstfiles);
+ die "git-update-index failed to add new name (related to $src and $dst) with code $?\n" if $rc;
-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;
+ $rc = system("git-update-index","--remove","--",@srcfiles);
+ die "git-update-index failed to remove old name (related to $src) with code $?\n" if $rc;
+}
sub usage($) {
---
0.99.9.GIT
next prev parent reply other threads:[~2005-10-31 7:25 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-10-23 5:44 move directories in work dir Rogelio M. Serrano Jr.
2005-10-23 6:24 ` Junio C Hamano
2005-10-23 6:53 ` Rogelio M. Serrano Jr.
2005-10-31 7:25 ` Ryan Anderson [this message]
2005-10-31 7:53 ` [PATCH] Add support for renaming multiple items at once, and for the destination to be a directory Peter Eriksen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=11307435312942-git-send-email-ryan@michonline.com \
--to=ryan@michonline.com \
--cc=git@vger.kernel.org \
--cc=junkio@cox.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.