commit 53f7b36d16daf3657387b01ce6683fba0ba6d182
parent 7f239e85db1b6c64f054a9597718ab049c42a365
Author: Jan Pobrislo <ccx@webprojekty.cz>
Date: Mon, 4 Jan 2016 16:44:10 +0100
all essential functions for confz except for c
Diffstat:
2 files changed, 125 insertions(+), 14 deletions(-)
diff --git a/bin/fileset_inc.sh b/bin/fileset_inc.sh
@@ -193,7 +193,7 @@ check_d() {
return 0
fi
if $f_bang; then
- req type_or_missing f
+ req type_or_missing d
elif test -e "$fname" -o -L "$fname"; then
die "already present but not a directory: $fname"
fi
diff --git a/zsh-funcions/confz_fileset_init b/zsh-funcions/confz_fileset_init
@@ -5,6 +5,7 @@
#
zmodload -F zsh/stat b:zstat
+zmodload -m -F zsh/files b:zf_\*
fileset_ftypes=( # convert hex type to a word
C S # unix socket
@@ -19,7 +20,7 @@ fileset_ftypes=( # convert hex type to a word
)
global -A fileset_stat_cache
-global fileset_stat_cur fileset_stat_next_id fileset_stat_cur_type
+global fileset_stat_cur fileset_stat_next_id fileset_stat_cur_type fileset_stat_cur_perm
fileset_reset_cache(){
# omit unsetting used variables for now
@@ -32,31 +33,34 @@ fileset_reset_cache(){
# runs zstat on $1 if not already in cache
# the result is available as ${(P)fileset_stat_cur}
fileset_stat() {
- local id ret ftype
+ local id ret ftype fperm
id=${fileset_stat_cache[$1]:-missing}
if [[ $id == missing ]]; then
zstat -L -H fileset_stat_$fileset_stat_next_id $1
ret=$?
if (($ret == 0)); then
- fileset_stat_cur=fileset_stat_$fileset_stat_next_id
fileset_stat[$1]=$fileset_stat_next_id
+ fileset_stat_set_cur $fileset_stat_next_id
fileset_stat_next_id=$[ $fileset_stat_next_id + 1 ]
- ftype=$(( [##16] ${${(P)fileset_stat_cur}[mode]} >> 12 ))
- fileset_stat_cur_type=$fileset_ftypes[$ftype]
else
fileset_stat[$1]=-$ret
fi
return $ret
elif (( $id >= 0 )); then
- fileset_stat_cur=fileset_stat_$id
- ftype=$(( [##16] ${${(P)fileset_stat_cur}[mode]} >> 12 ))
- fileset_stat_cur_type=$fileset_ftypes[$ftype]
+ fileset_stat_set_cur $id
return 0
else
return $[ -$id ]
fi
}
+fileset_stat_set_cur(){
+ fileset_stat_cur=fileset_stat_$1
+ ftype=$[ [##16] ${${(P)fileset_stat_cur}[mode]} >> 12 ]
+ fileset_stat_cur_type=$fileset_ftypes[$ftype]
+ fileset_stat_cur_perm=$[ [##8] ${${(P)fileset_stat_cur}[mode]} & 4095 ]
+}
+
fileset_resetcmd() {
fileset_reset_cache
"$@"
@@ -73,6 +77,7 @@ confz_fs_p_check() {
confz_fs_type_or_missing_check() {
checkvars filename flags filetype
+ ! fileset_stat $parent || [[ $fileset_stat_cur_type == $vars[filetype] ]]
}
confz_fs_type_or_missing_do() {
@@ -85,17 +90,123 @@ confz_fs_type_or_missing_do() {
if [[ $vars[flags] == *r* ]]; then
if [[ $vars[flags] == *f* ]]; then
- rm -rf $vars[filename]
+ zf_rm -rf $vars[filename]
else
- rm -r $vars[filename]
+ zf_rm -r $vars[filename]
fi
elif (($is_dir)); then
- rmdir $vars[filename]
+ zf_rmdir $vars[filename]
else
if [[ $vars[flags] == *f* ]]; then
- rm -f $vars[filename]
+ zf_rm -f $vars[filename]
else
- rm $vars[filename]
+ zf_rm $vars[filename]
fi
fi
}
+
+
+confz_fs_l_check() {
+ checkvars filename flags destination
+
+ if [[ $vars[flags] == *p* ]]; then
+ require fs_p :filename
+ fi
+
+ if [[ $vars[flags] == *'!'* ]]; then
+ require fs_type_or_missing :filename :flags filetype=L
+ fi
+
+ fileset_stat $vars[filename] && \
+ [[ $fileset_stat_cur_type == L ]] && \
+ [[ ${${(P)fileset_stat_cur}[link]} == $vars[destination] ]]
+}
+
+confz_fs_l_do() {
+ local missing
+ fileset_stat $vars[filename]
+ missing=$?
+ fileset_reset_cache
+ if ! (($missing)); then
+ rm $vars[filename] || return $?
+ fi
+ zf_ln -s $vars[destination] $vars[filename]
+}
+
+
+confz_fs_r_check() {
+ checkvars filename flags
+ do_command=( confz_fs_type_or_missing_do )
+ ! fileset_stat $vars[filename]
+}
+
+
+confz_fs_m_check() {
+ checkvars filename mode
+ do_command=( fileset_resetcmd chmod $vars[mode] $vars[file] )
+ fileset_stat $vars[file] && (( $fileset_stat_cur_perm == $vars[mode] ))
+}
+
+
+confz_fs_o_check() {
+ checkvars filename owner
+ do_command=( fileset_resetcmd zf_chown $vars[owner] $vars[filename] )
+ fileset_stat $vars[filename] || \
+ die "fs_o: could not access file ${(qqq)vars[filename]}"
+
+ if [[ $vars[owner] =~ '^[0-7]+:[0-7]+$' ]]; then
+ (( ${${(P)fileset_stat_cur}[uid]} == ${${vars[owner]}%:*} && \
+ ${${(P)fileset_stat_cur}[gid]} == ${${vars[owner]}#*:} ))
+ elif [[ $vars[owner] =~ '^[0-7]+$' ]]; then
+ (( ${${(P)fileset_stat_cur}[uid]} == ${${vars[owner]}%:*} ))
+ else
+ die "fs_o does not support non-numeric user/group: ${(qqq)vars[owner]}"
+ fi
+}
+
+
+confz_fs_f_check() {
+ checkvars filename flags
+
+ if [[ $vars[flags] == *p* ]]; then
+ require fs_p :filename
+ fi
+
+ if [[ $vars[flags] == *'!'* ]]; then
+ require fs_type_or_missing :filename :flags filetype=f
+ fi
+
+ fileset_stat $vars[filename] && [[ $fileset_stat_cur_type == f ]]
+}
+
+confz_fs_f_do() {
+ fileset_reset_cache
+ printf '' >> $vars[filename]
+}
+
+
+confz_fs_d_check() {
+ checkvars filename flags
+
+ if [[ $vars[flags] == *'!'* ]]; then
+ require fs_type_or_missing :filename :flags filetype=d
+ fi
+
+ if [[ $vars[flags] == *p* ]]; then
+ do_command=( fileset_resetcmd mkdir -p $vars[filename] )
+ else
+ do_command=( fileset_resetcmd mkdir $vars[filename] )
+ fi
+
+ fileset_stat $vars[filename] && [[ $fileset_stat_cur_type == d ]]
+}
+
+
+confz_fs_c_check() {
+ checkvars filename flags
+ require fs_f :filename :flags
+}
+
+confz_fs_c_do() {
+ false # TODO
+}