aboutsummaryrefslogtreecommitdiffstats
path: root/bin/makelinks
diff options
context:
space:
mode:
Diffstat (limited to 'bin/makelinks')
-rwxr-xr-xbin/makelinks49
1 files changed, 49 insertions, 0 deletions
diff --git a/bin/makelinks b/bin/makelinks
new file mode 100755
index 0000000..6247453
--- /dev/null
+++ b/bin/makelinks
@@ -0,0 +1,49 @@
+#!/bin/sh -e
+#
+#
+# "makelinks base linkdir realdir" does a "relative ln", relatively to "base". "linkdir" and "realdir" are relative path to subdirectories under "base". Symlinks are created into linkdir for files in realdir. The symlinks do not contain "base".
+#
+#
+
+test "$#" -ge 3 || { echo "makelinks: too few arguments" 1>&2 ; exit 100 ; }
+
+computerelative() {
+ source="$1"
+ target="$2"
+
+ common="$source"
+ result=""
+
+ while test "${target#$common}" = "$target" ; do
+ common="$(dirname $common)"
+ if test -z "$result" ; then
+ result=".."
+ else
+ result="../$result"
+ fi
+ done
+
+ if test "$common" = "/" ; then
+ result="$result/"
+ fi
+
+ forward="${target#$common}"
+
+ if test -n "$result" -a -n "$forward" ; then
+ result="$result$forward"
+ elif test -n "$forward" ; then
+ result="${forward:1}"
+ fi
+
+ echo "$result"
+}
+
+base=${1%%/}
+linkdir=${2%%/}
+realdir=${3%%/}
+
+targetdir=$(computerelative "$base$linkdir" "$base$realdir")
+
+for i in $(ls -1 "$base$realdir") ; do
+ ln -sf "$targetdir/$i" "$base$linkdir/$i" || true
+done