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 }