diff options
author | Bodo Möller <bodo@openssl.org> | 1999-04-28 22:07:28 +0000 |
---|---|---|
committer | Bodo Möller <bodo@openssl.org> | 1999-04-28 22:07:28 +0000 |
commit | 065e106f25b670586c9fb955beba87f4b456c940 (patch) | |
tree | 70657597cac4413c4ae1296cfd6c507b6d9ba165 /util/mklink.pl | |
parent | ddeee82c6333f27cb85940b271c3cc4d2e940717 (diff) |
A faster (and more general, and better documented) replacement for mklink.sh.
Submitted by:
Reviewed by:
PR:
Diffstat (limited to 'util/mklink.pl')
-rwxr-xr-x | util/mklink.pl | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/util/mklink.pl b/util/mklink.pl new file mode 100755 index 0000000000..9f4892559e --- /dev/null +++ b/util/mklink.pl @@ -0,0 +1,52 @@ +#!/usr/local/bin/perl + +# mklink.pl -- a faster substitute for mklink.sh. + +# The first command line argument is a non-empty relative path +# specifying the "from" directory. +# Each other argument is a file name not containing / and names +# a file in the current directory. +# +# For each of these files, we create in the "from" directory a link +# of the same name pointing to the local file. +# +# We assume that the directory structure is a tree, i.e. that does not +# contain symbolic links and that the parent of / is never referenced. +# Apart from this, this script should be able to handle even the most +# pathological cases. + +my $from = shift; +my @files = @ARGV; + +my @from_path = split(/\//, $from); +my $pwd = `pwd`; +chop($pwd); +my @pwd_path = split(/\//, $pwd); + +my @to_path = (); +foreach my $dirname (@from_path) { + + # In this loop, @to_path always is a relative path from + # @pwd_path (interpreted is an absolute path) to the original pwd. + + # At the end, @from_path (as a relative path from the original pwd) + # designates the same directory as the absolute path @pwd_path, + # which means that @to_path then is a path from there to the original pwd. + + next if ($dirname eq "" || $dirname eq "."); + + if ($dirname eq "..") { + @to_path = (pop(@pwd_path), @to_path); + } else { + @to_path = ("..", @to_path); + push(@pwd_path, $dirname); + } +} + +my $to = join('/', @to_path); + +foreach my $file (@files) { +# print "ln -s $to/$file $from/$file\n"; + symlink("$to/$file", "$from/$file"); + print $file . " => $from/$file\n"; +} |