# # Copyright (c) 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 LucĂ­a Andrea Illanes Albornoz # set +o errexit -o noglob -o nounset is assumed. # # # Private subroutines # rtlp_fileop_check() { local _rpfc_prefix="${1}" _rpfc_pname="" _rpfc_rname=""; shift; return 0; }; rtlp_fileop_log() { rtl_log_msgV "fileop" "0;${1}"; }; # # Public globals # RTL_FILEOP_SOURCE_FNAME=""; # # Public subroutines # # # rtl_fileop() - clean download cache for single package # @_op: file operation (one of: cd, chmod, chgrp, chown, cp_follow, cp, install, ln_symbolic, mv, touch, mkdir, mkfifo, rm, source, source_opt, test) # @...: file operation arguments # # Returns: zero (0) on success, non-zero (>0) on failure # rtl_fileop() { local _rf_op="${1}" \ _rf_dst="" _rf_group="" _rf_install_args="" \ _rf_mode="" _rf_owner="" _rf_rc=0 _rf_src=""; shift; case "${_rf_op}" in cd) if [ \( "${1:+1}" != 1 \) -o ! \( -L "${1}" -o -e "${1}" \) ]; then rtl_log_msgV "fatalexit" "${MSG_rtl_fileop_invalid_dir}" "${1}"; elif rtlp_fileop_check "${PREFIX:-}" "${1}"; then rtlp_fileop_log "Changing working directory to \`${1}'."; cd -- "${1}"; _rf_rc="${?}"; fi; ;; chmod) if [ "${#}" -lt 2 ]; then rtl_log_msgV "fatalexit" "${MSG_rtl_fileop_invparm_chmod}" "${*}"; elif _rf_mode="${1}" && shift\ && rtlp_fileop_check "${PREFIX:-}" "${*}"; then rtlp_fileop_log "Changing file mode bits of \`${*}' to \`${_rf_mode}'."; chmod -- "${_rf_mode}" "${@}"; _rf_rc="${?}"; fi; ;; chgrp) if [ "${#}" -lt 2 ]; then rtl_log_msgV "fatalexit" "${MSG_rtl_fileop_invparm_chgrp}" "${*}"; elif _rf_group="${1}" && shift\ && rtlp_fileop_check "${PREFIX:-}" "${*}"; then rtlp_fileop_log "Changing file group of \`${*}' to \`${_rf_group}'."; chgrp -- "${_rf_group}" "${@}"; _rf_rc="${?}"; fi; ;; chown) if [ "${#}" -lt 2 ]; then rtl_log_msgV "fatalexit" "${MSG_rtl_fileop_invparm_chown}" "${*}"; elif _rf_owner="${1}" && shift\ && rtlp_fileop_check "${PREFIX:-}" "${*}"; then rtlp_fileop_log "Changing file owner of \`${*}' to \`${_rf_owner}'."; chown -- "${_rf_owner}" "${@}"; _rf_rc="${?}"; fi; ;; cp_follow) if [ "${#}" -lt 2 ]; then rtl_log_msgV "fatalexit" "${MSG_rtl_fileop_invparm_cp_follow}" "${*}"; elif rtlp_fileop_check "${PREFIX:-}" "${*}"; then _rf_src="${*}"; _rf_src="${_rf_src% *}"; _rf_dst="${*}"; _rf_dst="${_rf_dst##* }"; rtlp_fileop_log "Copying \`${_rf_src}' into \`${_rf_dst}' w/ -pLR."; cp -pLR -- "${@}"; _rf_rc="${?}"; fi; ;; cp) if [ "${#}" -lt 2 ]; then rtl_log_msgV "fatalexit" "${MSG_rtl_fileop_invparm_cp}" "${*}"; elif rtlp_fileop_check "${PREFIX:-}" "${*}"; then _rf_src="${*}"; _rf_src="${_rf_src% *}"; _rf_dst="${*}"; _rf_dst="${_rf_dst##* }"; rtlp_fileop_log "Copying \`${_rf_src}' into \`${_rf_dst}' w/ -pPR."; cp -pPR -- "${@}"; _rf_rc="${?}"; fi; ;; install) if [ "${#}" -lt 2 ]; then rtl_log_msgV "fatalexit" "${MSG_rtl_fileop_invparm_install}" "${*}"; else rtl_lindexV \$_rf_dst -1 "${@}"; rtl_lrangeV \$_rf_install_args 0 1 "${@}"; rtl_lindexV \$_rf_install_args -2 "${@}"; if rtlp_fileop_check "${PREFIX:-}" "${_rf_dst}" "${_rf_src}"; then rtlp_fileop_log "Installing \`${_rf_src}' into \`${_rf_dst}' w/ ${_rf_install_args}."; install "${@}"; _rf_rc="${?}"; fi; fi; ;; ln_symbolic) if [ \( "${1:+1}" != 1 \) -o \( "${2:+1}" != 1 \) ]; then rtl_log_msgV "fatalexit" "${MSG_rtl_fileop_invparm_ln_symbolic}" "${*}"; elif rtlp_fileop_check "${PREFIX:-}" "${2}"; then if rtl_fileop test "${2}"; then rtl_fileop rm "${2}"; fi; if [ "${?}" -eq 0 ]; then rtlp_fileop_log "Linking \`${1}' to \`${2}' w/ -fs"; ln -fs -- "${1}" "${2}"; _rf_rc="${?}"; fi; fi; ;; mv) if [ \( "${1:+1}" != 1 \) -o \( "${2:+1}" != 1 \) ]; then rtl_log_msgV "fatalexit" "${MSG_rtl_fileop_invparm_mv}" "${*}"; elif rtlp_fileop_check "${PREFIX:-}" "${1}" "${2}"; then rtlp_fileop_log "Moving \`${1}' to \`${2}' w/ -fs"; mv -f -- "${1}" "${2}"; _rf_rc="${?}"; fi; ;; touch) if [ "${1:+1}" != 1 ]; then rtl_log_msgV "fatalexit" "${MSG_rtl_fileop_invparm_touch}" "${*}"; elif rtlp_fileop_check "${PREFIX:-}" "${1}"; then rtlp_fileop_log "Touching file \`${1}'${2:+ w/ timestamp \`${2}\'}."; touch ${2:+-t "${2}"} -- "${1}"; _rf_rc="${?}"; fi; ;; mkdir|mkfifo|rm|source|source_with_fnamevar|source_opt|source_opt_with_fnamevar|test) while [ \( "${?}" -eq 0 \) -a \( ""${#}"" -gt 0 \) ]; do if [ "${1:+1}" != 1 ]; then rtl_log_msgV "fatalexit" "${MSG_rtl_fileop_invparm}" "${_rf_op}" "${*}"; elif [ "${_rf_op}" = mkdir ]\ && [ ! -d "${1}" ]\ && rtlp_fileop_check "${PREFIX:-}" "${1}"; then if rtl_fileop test "${1}"; then rtl_fileop rm "${1}"; fi; rtlp_fileop_log "Making directory \`${1}'."; mkdir -p -- "${1}"; _rf_rc="${?}"; elif [ "${_rf_op}" = mkfifo ]\ && rtlp_fileop_check "${PREFIX:-}" "${1}"; then if rtl_fileop test "${1}"; then rtl_fileop rm "${1}"; fi; rtlp_fileop_log "Creating FIFO \`${1}'."; rtlp_fileop_check "${PREFIX:-}" "${1}"; mkfifo -- "${1}"; _rf_rc="${?}"; elif [ "${_rf_op}" = rm ]\ && rtl_fileop test "${1}"\ && rtlp_fileop_check "${PREFIX:-}" "${1}"; then rtlp_fileop_log "Removing directory or file \`${1}'."; rm -rf -- "${1}"; _rf_rc="${?}"; elif [ "${_rf_op}" = source ]\ && rtlp_fileop_check "${PREFIX:-}" "${1}"; then rtlp_fileop_log "Sourcing file \`${1}'."; . "${1}"; _rf_rc="${?}"; elif [ "${_rf_op}" = source_with_fnamevar ]\ && rtlp_fileop_check "${PREFIX:-}" "${1}"; then rtlp_fileop_log "Sourcing file \`${1}'."; RTL_FILEOP_SOURCE_FNAME="${1}"; . "${1}"; _rf_rc="${?}"; elif [ "${_rf_op}" = source_opt ]\ && rtl_fileop test "${1}"\ && rtlp_fileop_check "${PREFIX:-}" "${1}"; then rtlp_fileop_log "Sourcing file \`${1}'."; . "${1}"; _rf_rc="${?}"; elif [ "${_rf_op}" = source_opt_with_fnamevar ]\ && rtl_fileop test "${1}"\ && rtlp_fileop_check "${PREFIX:-}" "${1}"; then rtlp_fileop_log "Sourcing file \`${1}'."; RTL_FILEOP_SOURCE_FNAME="${1}"; . "${1}"; _rf_rc="${?}"; elif [ "${_rf_op}" = test ]\ && rtlp_fileop_check "${PREFIX:-}" "${1}"\ && ! [ \( -L "${1}" \) -o \( -e "${1}" \) ]; then return 1; fi; shift; done; ;; *) rtl_log_msgV "fatalexit" "${MSG_rtl_fileop_invparm_fileop}" "${*}"; ;; esac; return "${_rf_rc}"; }; # vim:filetype=sh textwidth=0