#!/bin/sh # link tree lt_version='lt-0.1' unset CDPATH export LC_ALL=C IFS=' ' # ca returns the common ancestor between 2 paths # ca /h/u/a/b /h/u/c/d => /h/u ca() { 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#*/} ca_r2=$ca_r2/${ca_p2%%/*} ca_p2=${ca_p2#*/} [ "$ca_r1" != "$ca_r2" ] && break R1=$ca_r1 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= while true; do [ "$bp_b" = "$bp_s" ] && break bp_s=${bp_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 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#../} } #rp /h/u/a/b /h/u/b && echo $R1 skip=".git .gitignore .*.swp Makefile README.md" # link tree src dest lt() { d=$(mkdir -p "$2" && cd "$2" && pwd) cd "$1" && s=$PWD find . ! -type d -print | { cd "$d" while read f; do for k in $skip; do case $f in (./$k|./$k/*) continue 2;; esac done 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 lt "$1" "$2" #echo $1 $2 $3 && $1 $2 $3 && echo $R1