fileset_inc.sh (3358B)
1 #!/bin/sh 2 unalias -a 3 export fname 4 die() { 5 printf '%s\n' "$*" 6 exit 1 7 } 8 9 flags() { 10 case "$1" in (*'!'*) f_bang=true;; (*) f_bang=false;; esac 11 case "$1" in (*p*) f_p=true;; (*) f_p=false;; esac 12 case "$1" in (*f*) f_f=true;; (*) f_f=false;; esac 13 case "$1" in (*r*) f_r=true;; (*) f_r=false;; esac 14 case "$1" in (*n*) f_n=true;; (*) f_n=false;; esac 15 case "$1" in (*N*) f_N=true;; (*) f_N=false;; esac 16 case "$1" in (*a*) f_a=true;; (*) f_a=false;; esac 17 case "$1" in (*i*) f_i=true;; (*) f_i=false;; esac 18 case "$1" in (*o*) f_o=true;; (*) f_o=false;; esac 19 } 20 21 22 print_flags() { 23 $f_bang && printf '!' 24 $f_p && printf p 25 $f_f && printf f 26 $f_r && printf r 27 $f_n && printf n 28 $f_N && printf N 29 $f_a && printf a 30 $f_i && printf i 31 $f_o && printf o 32 } 33 34 if ! readlink -f . >/dev/null 2>&1; then 35 # Hackity hack. If you know of better way, let me know. 36 if test -x /bin/rsync -o -x /usr/bin/rsync; then 37 readlink() { 38 rsync -l8 --list-only "$1" | sed 's|^.* ->||' 39 } 40 else 41 readlink() { 42 ls -ld "$1" | sed 's|^.* ->||' 43 } 44 fi 45 fi 46 47 : ${check_only:=false} 48 49 req() { 50 if ! "check_$@"; then 51 if $check_only; then 52 die "check failed on '$fname': $* ($(print_flags))" 53 else 54 "do_$@" || die "action failed on '$fname': $* ($(print_flags))" 55 check_only=true 56 req "$@" 57 check_only=false 58 fi 59 fi 60 } 61 62 63 check_p() { 64 test -d "$(dirname "$fname")" 65 } 66 67 do_p() { 68 mkdir -p "$(dirname "$fname")" || exit $? 69 } 70 71 72 check_type_or_missing() { 73 test '!' -e "$fname" -o "-$1" "$fname" 74 } 75 76 do_type_or_missing() { 77 if $f_r; then 78 if $f_f; then 79 rm -rf "$fname" || exit $? 80 else 81 rm -r "$fname" || exit $? 82 fi 83 elif test -d "$fname"; then 84 rmdir "$fname" 85 else 86 if $f_f; then 87 rm -f "$fname" || exit $? 88 else 89 rm "$fname" || exit $? 90 fi 91 fi 92 } 93 94 95 do_l() { 96 if test -L "$fname"; then 97 rm "$fname" 98 elif test -e "$fname"; then 99 die "already present but not a symbolic link: $fname" 100 fi 101 ln -s "$1" "$fname" || exit $? 102 } 103 104 check_l() { 105 if $f_p; then 106 req p 107 fi 108 if $f_bang; then 109 req type_or_missing L 110 fi 111 test -L "$fname" && test x"$(readlink "$fname")" = x"$1" 112 } 113 114 l() { 115 req l "$@" 116 } 117 118 119 check_r() { 120 ! test -e "$fname" -o -L "$fname" 121 } 122 123 do_r() { 124 do_type_or_missing 125 } 126 127 r() { 128 req r "$@" 129 } 130 131 132 check_m() { 133 test -e "$fname" -o -L "$fname" && \ 134 test 0 -lt $(find "$fname" -prune -perm "$1" | wc -l) 135 } 136 137 do_m() { 138 chmod "$1" "$fname" 139 } 140 141 m() { 142 req m "$@" 143 } 144 145 146 check_o() { 147 test -e "$fname" -o -L "$fname" || return 1 148 case "$1" in 149 (*:*) test 0 -lt $( \ 150 find "$fname" -prune -user "${1%:*}" -group "${1#*:}" | wc -l \ 151 ) 152 return $?;; 153 (*) test 0 -lt $(find "$fname" -prune -user "$1" | wc -l) 154 return $?;; 155 esac 156 } 157 158 do_o() { 159 chown "$1" "$fname" 160 } 161 162 o() { 163 req o "$@" 164 } 165 166 167 check_f() { 168 if test -f "$fname"; then 169 return 0 170 fi 171 if $f_p; then 172 req p 173 fi 174 if $f_bang; then 175 req type_or_missing f 176 elif test -e "$fname" -o -L "$fname"; then 177 die "already present but not a file: $fname" 178 fi 179 return 1 180 } 181 182 do_f() { 183 touch "$fname" 184 } 185 186 f() { 187 req f "$@" 188 } 189 190 191 check_d() { 192 if test -d "$fname"; then 193 return 0 194 fi 195 if $f_bang; then 196 req type_or_missing d 197 elif test -e "$fname" -o -L "$fname"; then 198 die "already present but not a directory: $fname" 199 fi 200 return 1 201 } 202 203 do_d() { 204 if $f_p; then 205 mkdir -p "$fname" 206 else 207 mkdir "$fname" 208 fi 209 } 210 211 d() { 212 req d "$@" 213 } 214 215 216 check_c() { 217 req f 218 "$@" | cmp -s - "$fname" 219 } 220 221 do_c() { 222 "$@" > "$fname" 223 } 224 225 c() { 226 req c "$@" 227 }