chiark / gitweb /
Cope with directories
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 16 Dec 2015 18:25:16 +0000 (18:25 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 16 Dec 2015 18:25:16 +0000 (18:25 +0000)
infra/makelinks

index 0fd38dc..ac907f7 100755 (executable)
@@ -9,7 +9,7 @@
 set -e -o posix -o pipefail
 
 badusage () {
-    echo >&2 "usage: $0 [-n|-v] list|setup|import|clean"
+    echo >&2 "usage: $0 [-n|-v] list|setup|dirimport|dirmove|clean"
     exit 18
 }
 
@@ -27,13 +27,13 @@ while true; do
 done
 
 case "$#.$1" in
-1.list|1.setup|1.import|1.clean) ;;
+1.list|1.setup|1.import|1.dirimport|1.clean) ;;
 *)  badusage ;;
 esac
 
 mode=$1; shift
 
-dots=$( find dot -type f -name '[0-9a-zA-Z]*[0-9a-zA-Z]' )
+dots=$( find dot -maxdepth 1 -name '[0-9a-zA-Z]*[0-9a-zA-Z]' )
 
 basepath=$(pwd)
 basepath=${basepath#$HOME/}
@@ -84,22 +84,33 @@ for dot in $dots; do
     elif ! [ -e "$inhome" ]; then
        needs setup "absent here"
        $act ln -s "$basepath/$dot" "$inhome"
-    elif [ -f "$inhome" ] && cmp -s "$dot" "$inhome"; then
-       needs setup "identical here but not yet symlinked"
-       $act rm -f "$inhome"~
+    elif [ -f "$inhome" ] && [ -f "$dot" ]; then
+       if cmp -s "$dot" "$inhome"; then
+           needs setup "identical here but not yet symlinked"
+           $act rm -f "$inhome"~
+           $act ln -s "$basepath/$dot" "$inhome"~
+           $act mv -f "$inhome"~ "$inhome"
+       else
+           needs import "modified here"
+           $act rm -f "$dot"~
+           $act cp "$inhome" "$dot"~
+           $act mv -f "$dot"~ "$dot"
+       fi
+    elif [ -d "$inhome" ] && [ -d "$dot" ]; then
+       needs dirimport "directory here not yet symlinked"
+       $act mv "$dot" "$dot~"
        $act ln -s "$basepath/$dot" "$inhome"~
-       $act mv -f "$inhome"~ "$inhome"
+       $act mv "$inhome" "$dot"
+       $act mv "$inhome~" "$inhome"
+       $act rm -rf "$dot~"
     else
-       needs import "modified here"
-       $act rm -f "$dot"~
-       $act cp "$inhome" "$dot"~
-       $act mv -f "$dot"~ "$dot"
+       bad "mismatched file types"
     fi
 done
 
 brokens=$(
     cd $HOME
-    find -L .[0-9a-zA-Z]* -xdev -type l -lname "$basepath/dot/*"
+    find -L .[0-9a-zA-Z]* -maxdepth 0 -xdev -type l -lname "$basepath/dot/*"
 )
 for underhome in $brokens; do
     inhome="$HOME/$underhome"