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
        }

Reply via email to