#!/bin/sh - # build a "symlink mask" - make symlinks to the source tree. # inspired by the mk.links feature in BIND distributions. # $Header: /c/src/local.bin/RCS/srclinks,v 1.29 2001/02/09 22:41:44 pkern Exp $ prog=$0 USAGE="usage: $prog [-dq] [-s ] [-t target-dir] source-dir [tree ...]" # default name for the base symlink in each directory. sym=SRC # verbose by default. note=echo nonl=-n nlc= case `uname` in AIX) nonl= nlc=\\c ;; esac # no copies by default. copy= while getopts c:dqs:t: c do case $c in c) copy="$copy $OPTARG" ;; d) debug=y ;; q) note=: ;; s) sym=$OPTARG ;; t) dest="$OPTARG/" ;; *) echo "$USAGE" >&2 ; exit 1 ;; esac done shift `expr $OPTIND - 1` # directories which should be symlinked instead of copied. linked="CVS RCS DIST ORIG .ORIG" or='(' skip= for n in $linked ; do skip="$skip $or -name $n" ; or=" -o" ; done # also skip over files which should be copied instead of linked. for n in $copy ; do skip="$skip $or -name $n" ; or=" -o" ; done skip="$skip )" # files which should be copied instead of linked. if [ -n "$copy" ] ; then or='(' copies= for n in $copy do copies="$copies $or -name $n" or=" -o" done copies="$copies )" fi # if single arg is a path ... case "$#,$1" in 1,*/*) # then assume the path base is the copy source. b="`basename "$1"`" d="`dirname "$1"`" set - "$d" "$b" ;; esac case "$#" in 0|1) echo "$USAGE" >&2 exit 1 ;; esac case "$debug" in y*) set -x ;; esac # the original tree. src=$1 shift for root do from=$sym/ [ "$src" != "$sym" ] && from=$src/ if [ "$src" != "$sym" -a ! -d "$dest$root" ] ; then mkdir "$dest$root" || exit # check for absolute or relative src. case "$src" in /*) pwd= ;; *) pwd="`pwd`/" ;; esac ln -s "$pwd$src/`basename "$root"`" "$dest$root"/$sym fi $note "${root}: directories" find "$from$root" -type d -a ! $skip -print | sed "s,^$from,," | while read d do $note $nonl " _ $dest$d "$nlc [ -d "$dest$d"/$sym ] && $note "" && continue [ -d "$dest$d" ] || mkdir "$dest$d" || exit ln -s ../$sym/"`basename "$d"`" "$dest$d"/$sym || exit $note " + " done cn=0 $note "${root}: links" ( find "$from$root" -type d -a $skip -print ; find "$from$root" $skip -prune -o ! -type d -print ) | sed "s,^$from,," | while read f do cn=`expr $cn + 1` [ $cn -ge 72 ] && cn=1 && $note "" [ $cn -eq 1 ] && $note $nonl " "$nlc $note $nonl "."$nlc [ -f "$dest$f" -o -h "$dest$f" ] && continue d="`dirname "$f"`" b="`basename "$f"`" ln -s "$sym/$b" "$dest$f" || exit $note $nonl "+"$nlc done $note " done." if [ -n "$copies" ] ; then cn=0 $note $nonl "${root}: copies "$nlc find "$from$root" $copies -print | sed "s,^$from,," | while read f do cn=`expr $cn + 1` [ $cn -ge 72 ] && cn=1 && $note "" [ $cn -eq 1 ] && $note $nonl " "$nlc $note $nonl "."$nlc [ -f "$dest$f" -o -h "$dest$f" ] && continue d="`dirname "$f"`" b="`basename "$f"`" cp -p "$d/$sym/$b" "$dest$f" || exit $note $nonl "+"$nlc done $note " done." fi done