fileset

git mirror of https://ccx.te2000.cz/bzr/fileset
git clone https://ccx.te2000.cz/git/fileset
Log | Files | Refs | README

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 }