fileset

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

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:
Mbin/fileset_inc.sh | 2+-
Mzsh-funcions/confz_fileset_init | 137+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
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 +}