Package: moreutils
Version: 0.19
Severity: wishlist
Tags: patch
It would be nice if vidir allowed editing not only of the filenames
but also of the targets of symbolic links.
A suggested patch is attached.
Gemeinsame Unterverzeichnisse: moreutils-0.20orig/debian und
moreutils-0.20/debian.
diff -u moreutils-0.20orig/vidir moreutils-0.20/vidir
--- moreutils-0.20orig/vidir 2006-11-12 04:01:36.000000000 +0100
+++ moreutils-0.20/vidir 2006-12-28 01:04:53.000000000 +0100
@@ -6,7 +6,7 @@
=head1 SYNOPSIS
-B<vidir> [--verbose] [directory|file|-] ...
+B<vidir> [--verbose] [--linktargets] [directory|file|-] ...
=head1 DESCRIPTION
@@ -31,6 +31,10 @@
Verbosely display the actions taken by the program.
+=item -l, --linktargets
+
+Allow editing the targets of symlinks.
+
=back
=head1 ENVIRONMENT VARIABLES
@@ -62,12 +66,15 @@
use File::Temp;
use Getopt::Long;
+use strict;
my $error=0;
my $verbose=0;
-if (! GetOptions("verbose|v" => \$verbose)) {
- die "Usage: $0 [--verbose] [directory|file|-]\n";
+my $linktargets=0;
+if (! GetOptions("verbose|v" => \$verbose,
+ "linktargets|l" => \$linktargets )) {
+ die "Usage: $0 [--verbose|-v] [--linktargets|-l] [directory|file|-]\n";
}
my @dir;
@@ -94,11 +101,17 @@
open (OUT, ">".$tmp->filename) || die "$0: cannot write ".$tmp->filename.":
$!\n";
my %item;
+my %link;
my $c=0;
foreach (@dir) {
next if /^(.*\/)?\.$/ || /^(.*\/)?\.\.$/;
$item{++$c}=$_;
print OUT "$c\t$_\n";
+ if ( $linktargets && -l $_ ) {
+ my $l = readlink($_);
+ $link{$c}=$l;
+ print OUT " $c->\t$l\n";
+ }
}
@dir=();
close OUT;
@@ -113,11 +126,12 @@
if (exists $ENV{VISUAL}) {
@editor=split(' ', $ENV{VISUAL});
}
-$ret=system(@editor, $tmp);
+my $ret=system(@editor, $tmp);
if ($ret != 0) {
die "@editor exited nonzero, aborting\n";
}
+my %done;
open (IN, $tmp->filename) || die "$0: cannot read ".$tmp->filename.": $!\n";
while (<IN>) {
chomp;
@@ -125,7 +139,7 @@
my $num=$1;
my $name=$2;
if (! exists $item{$num}) {
- print STDERR "$0: unknown item number $num\n";
+ print STDERR "$0: unknown item number $num in line
$.\n";
$error=1;
}
elsif ($name ne $item{$num}) {
@@ -145,7 +159,7 @@
$error=1;
}
elsif ($verbose) {
- print "'$name' -> '$tmp'\n";
+ print "'$name' => '$tmp'\n";
}
foreach my $item (keys %item) {
if ($item{$item} eq $name) {
@@ -157,13 +171,54 @@
if (! rename($src, $name)) {
print STDERR "$0: failed to rename $src to
$name: $!\n";
$error=1;
+ $name=$src;
}
elsif ($verbose) {
- print "'$src' -> '$name'\n";
+ print "'$src' => '$name'\n";
}
}
+ $done{$num}=$name;
delete $item{$num};
}
+ elsif (/^ (\d+)->\t(.*)/) {
+ my $num=$1;
+ my $target=$2;
+ if (! exists $link{$num}) {
+ print STDERR "$0: unknown link number $num\n";
+ $error=1;
+ }
+ else {
+ my $name;
+ if (exists $item{$num}) {
+ $name=$item{$num};
+ }
+ elsif (exists $done{$num}) {
+ $name=$done{$num};
+ }
+ else {
+ print STDERR "$0: unknown item number $num\n";
+ next;
+ }
+
+ if (! -l $name) {
+ print STDERR "$0: $num. $name is not a
symlink\n";
+ $error=1;
+ next;
+ }
+
+ my $old=$link{$num};
+ if ($old ne $target) {
+ unlink($name);
+ if (! symlink($target, $name) ) {
+ print STDERR "$0: failed to create link
$name -> $target\n";
+ }
+ elsif ($verbose) {
+ print "'$name'->'$old' =>
...->'$target'\n";
+ }
+ }
+ delete $link{$num};
+ }
+ }
elsif (/^\s*$/) {
# skip empty line
}