]> git.donarmstrong.com Git - debhelper.git/blobdiff - dh_link
r1837: remove dup line
[debhelper.git] / dh_link
diff --git a/dh_link b/dh_link
index 6cb889cdd79ea3b92132f2f9ee0ca79cdbc51cbb..5dd9da3d96843062dd271e3020c073659d76539c 100755 (executable)
--- a/dh_link
+++ b/dh_link
@@ -76,6 +76,39 @@ the X man page foo.1x
 
 =cut
 
+# This expand_path expands all path "." and ".." components, but doesn't
+# resolve symbolic links.
+sub expand_path {
+       my $start = @_ ? shift : '.';
+       my @pathname = split(m:/+:,$start);
+
+       my $entry;
+       my @respath;
+       foreach $entry (@pathname) {
+               if ($entry eq '.' || $entry eq '') {
+                       # Do nothing
+               }
+               elsif ($entry eq '..') {
+                       if ($#respath == -1) {
+                               # Do nothing
+                       }
+                       else {
+                               pop @respath;
+                       }
+               }
+               else {
+                       push @respath, $entry;
+               }
+       }
+
+       my $result;
+       foreach $entry (@respath) {
+               $result .= '/' . $entry;
+       }
+       return $result;
+}
+
+
 init();
 
 foreach my $package (@{$dh{DOPACKAGES}}) {
@@ -119,7 +152,6 @@ foreach my $package (@{$dh{DOPACKAGES}}) {
                                        push @links, "$dir/$target";
                                }
                                push @links, "$dir/$_";
-                               doit("rm","-f",$_);
                                
                        },
                        $tmp);
@@ -127,9 +159,8 @@ foreach my $package (@{$dh{DOPACKAGES}}) {
        
        while (@links) {
                my $dest=pop @links;
-               my $src=pop @links;
+               my $src=expand_path(pop @links);
 
-               # Relavatize src and dest.
                $src=~s:^/::;
                $dest=~s:^/::;
 
@@ -163,8 +194,12 @@ foreach my $package (@{$dh{DOPACKAGES}}) {
                        # Make sure it's properly absolute.
                        $src="/$src";
                }
-               
-               doit("ln","-sf",$src,"$tmp/$dest");
+
+               if (-d "$tmp/$dest" && ! -l "$tmp/$dest") {
+                       error("link destination $tmp/$dest is a directory");
+               }
+               doit("rm", "-f", "$tmp/$dest");
+               doit("ln","-sf", $src, "$tmp/$dest");
        }
 }