diff options
Diffstat (limited to 'debian/fixlinks')
-rwxr-xr-x | debian/fixlinks | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/debian/fixlinks b/debian/fixlinks new file mode 100755 index 000000000..39f719b12 --- /dev/null +++ b/debian/fixlinks @@ -0,0 +1,80 @@ +#!/usr/bin/perl -w +# vi: set ts=4: + + +@LINKS=`find . -type l|xargs ls -l`; + +#print @LINKS; + + +while($_ = shift @LINKS){ + chomp; + my ($perm,$nlinks,$owner,$group,$size,$month,$day,$year,$file) = + split(' ', $_, 9); + my $link; + + if($perm =~ m/^l/){ + ($relfile, $link) = split(' -> ', $file); + } + + # chop off leading . in $file + $file = $relfile; + $file =~ s/^\.//; + + if($perm =~ m/^l/){ + my @pathcomponents = split('/', $file); + my @linkcomponents = split('/', $link); + + if($link =~ m/^\//){ + @newcomponents = @linkcomponents; + }else{ + @newcomponents = @pathcomponents; + + # chop off filename + pop(@newcomponents); + + while($comp = shift @linkcomponents){ + #print "path: ",join(':',@newcomponents)," -- $comp -- ", join(':',@linkcomponents),"\n"; + + if($comp eq ""){ + # ignore + }elsif($comp eq ".."){ + pop(@newcomponents); + }else{ + push @newcomponents,$comp; + } + } + } + + if($newcomponents[0] eq ""){ + shift(@newcomponents); + } + if($pathcomponents[0] eq ""){ + shift(@pathcomponents); + } + + #print "from ",join('/',@pathcomponents),"\n"; + #print "to ",join('/',@newcomponents),"\n"; + + if($newcomponents[0] eq $pathcomponents[0]){ + #print $newcomponents[0],", ",$pathcomponents[0]; + #print "should be relative\n"; + while($newcomponents[0] eq $pathcomponents[0]){ + shift(@newcomponents); + shift(@pathcomponents); + } + while(@pathcomponents > 1){ + shift(@pathcomponents); + unshift(@newcomponents,".."); + } + }else{ + #print "should be absolute\n"; + unshift(@newcomponents,""); + } + $newlink=join('/',@newcomponents); + print "ln -sf $newlink $relfile\n"; + unlink($relfile); + symlink($newlink,$relfile); + } +} + |