summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-rwxr-xr-xbin/lt65
1 files changed, 42 insertions, 23 deletions
diff --git a/bin/lt b/bin/lt
index 808b9f0..f09f3b7 100755
--- a/bin/lt
+++ b/bin/lt
@@ -7,10 +7,21 @@ unset CDPATH
export LC_ALL=C IFS='
'
+help() {
+ echo "Lt is a tool for creating link trees.
+
+Usage:
+ lt [-Vn] src dest
+
+Options:
+ -V print version and exit
+ -n print actions but not execute"
+}
+
# ca returns the common ancestor between 2 paths
-# ca /h/u/a/b /h/u/c/d => /h/u
+# i.e. ca /h/u/a/b /h/u/c/d => /h/u
ca() {
- ca_p1=${1#/} ca_p2=${2#/} ca_r1= ca_r2= R1=/
+ ca_p1=${1#/} ca_p2=${2#/} ca_r1='' ca_r2='' R1=/
while true; do
[ "$ca_p1" ] || [ "$ca_p2" ] || break
ca_r1=$ca_r1/${ca_p1%%/*} ca_p1=${ca_p1#*/}
@@ -20,53 +31,61 @@ ca() {
done
}
-#echo ca $1 $2 && ca $1 $2 && echo "$R1"
-
-# bp returns the relative path from source to base
-bp() {
- bp_s=$1 bp_b=$2 R1=
+# pp returns the relative path from child to parent
+# i.e. pp /h/u/a /h/u => ..
+pp() {
+ pp_s=$1 pp_b=$2 R1=''
while true; do
- [ "$bp_b" = "$bp_s" ] && break
- bp_s=${bp_s%/*}
+ [ "$pp_b" = "$pp_s" ] && break
+ pp_s=${pp_s%/*}
[ "$R1" ] && R1=$R1/.. || R1=..
done
}
-#echo bp /h/u/a /h/u && bp /h/u/a /h/u && echo "$R1"
-
# rp returns the relative path between src and base
-# rp /h/u/a/b/f /h/u/b/f [/h/u] ../a/b/f
+# i.e. rp /h/u/a/b/f /h/u/b/f [/h/u] ../a/b/f
rp() {
rp_s=$1 rp_d=$2 rp_c=$3
! [ "$rp_c" ] && ca "$1" "$2" && rp_c=$R1
- rp_bd=${rp_d#$rp_c/}
rp_bs=${rp_s#$rp_c/}
- bp "$rp_d" "$rp_c" && R1=$R1/$rp_bs && R1=${R1#../}
+ pp "$rp_d" "$rp_c" && R1=$R1/$rp_bs && R1=${R1#../}
}
-#rp /h/u/a/b /h/u/b && echo $R1
-
skip=".git .gitignore .*.swp Makefile README.md"
-# link tree src dest
+# lt links src tree to dest (each file is a link)
lt() {
d=$(mkdir -p "$2" && cd "$2" && pwd)
- cd "$1" && s=$PWD
+ cd "$1" && s=$PWD &&
find . ! -type d -print | {
- cd "$d"
- while read f; do
+ cd "$d" &&
+ while read -r f; do
for k in $skip; do
case $f in (./$k|./$k/*) continue 2;; esac
done
- f=${f#./}
- fd=$d/$f; fd=${fd%/*}
+ f=${f#./}; fd=$d/$f; fd=${fd%/*}
test -d "$fd" || $trace mkdir -p "$fd"
rp "$s/$f" "$d/$f" && $trace ln -sf "$R1" "$d/$f"
done
}
}
-#trace=echo
+while getopts :nvV opt; do
+ case $opt in
+ (n) trace='echo' ;;
+ (V) echo "$lt_version"; exit ;;
+ (*) help; exit 1;;
+ esac
+done
+shift $((OPTIND -1))
+
lt "$1" "$2"
#echo $1 $2 $3 && $1 $2 $3 && echo $R1
+
+# Shell coding style:
+# - standard POSIX shell, to be used as-is on Unix, Linux (busybox), *BSD*
+# - no bashism, GNUism, etc.
+# - local variables in same process are prefixed with function name, to avoid collisions
+# - same process functions return values in R1, R2, ... global vars.
+# - self-documented, self-tested