diff options
author | Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de> | 2020-02-26 21:54:12 +0000 |
---|---|---|
committer | Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de> | 2020-02-26 21:54:12 +0000 |
commit | c6d6e08feab839a9dc5792071fb803494cc51a69 (patch) | |
tree | 1513c817e4446ac3cf512d6c1f287a10fc1daf2e /subr/rtl_fileop.subr | |
parent | 4a5da5254e1207686f492e7ce8759c80466185f3 (diff) | |
download | midipix_build-c6d6e08feab839a9dc5792071fb803494cc51a69.tar.bz2 midipix_build-c6d6e08feab839a9dc5792071fb803494cc51a69.tar.xz |
General cleanup, pt. II.
Diffstat (limited to 'subr/rtl_fileop.subr')
-rw-r--r-- | subr/rtl_fileop.subr | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/subr/rtl_fileop.subr b/subr/rtl_fileop.subr new file mode 100644 index 00000000..cc861787 --- /dev/null +++ b/subr/rtl_fileop.subr @@ -0,0 +1,111 @@ +# +# set +o errexit -o noglob is assumed. +# + +exp_rtl_fileop_check() { + local _prefix="${1}" _pname="" _rname=""; shift; + while [ "${#}" -gt 0 ]; do + return 0; + shift; done; +}; + +rtl_fileop() { + local _op="${1}" _dst="" _install_args="" _rc=0 _src=""; shift; + case "${_op}" in + cd) if [ \( -z "${1}" \) -o ! \( -L "${1}" -o -e "${1}" \) ]; then + rtl_log_msg failexit "Invalid or non-existent directory \`${1}'."; + elif exp_rtl_fileop_check "${PREFIX}" "${1}"; then + rtl_log_msg vvvv "Changing working directory to \`${1}'."; + cd -- "${1}"; _rc="${?}"; + fi; ;; + cp_follow) + if [ "${#}" -lt 2 ]; then + rtl_log_msg failexit "Missing parameters (in: cp_follow ${*}.)"; + elif exp_rtl_fileop_check "${PREFIX}" "${*}"; then + _src="${*}"; _src="${_src% *}"; + _dst="${*}"; _dst="${_dst##* }"; + rtl_log_msg vvvv "Copying \`${_src}' into \`${_dst}' w/ -pLR."; + cp -pLR -- "${@}"; _rc="${?}"; + fi; ;; + cp) if [ "${#}" -lt 2 ]; then + rtl_log_msg failexit "Missing parameters (in: cp ${*}.)"; + elif exp_rtl_fileop_check "${PREFIX}" "${*}"; then + _src="${*}"; _src="${_src% *}"; + _dst="${*}"; _dst="${_dst##* }"; + rtl_log_msg vvvv "Copying \`${_src}' into \`${_dst}' w/ -pPR."; + cp -pPR -- "${@}"; _rc="${?}"; + fi; ;; + install) + if [ "${#}" -lt 2 ]; then + rtl_log_msg failexit "Missing parameters (in: install ${*}.)"; + else _dst="$(while [ ""${#}"" -gt 2 ]; do shift; done; echo "${2}")"; + _install_args="$(while [ ""${#}"" -gt 2 ]; do echo "${1}"; shift; done)"; + _src="$(while [ ""${#}"" -gt 2 ]; do shift; done; echo "${1}")"; + if exp_rtl_fileop_check "${PREFIX}" "${_dst}" "${_src}"; then + rtl_log_msg vvvv "Installing \`${_src}' into \`${_dst}' w/ ${_install_args}."; + install "${@}"; _rc="${?}"; + fi; + fi; ;; + ln_symbolic) + if [ \( -z "${1}" \) -o \( -z "${2}" \) ]; then + rtl_log_msg failexit "Missing parameters (in: ln_symbolic ${*}.)"; + elif exp_rtl_fileop_check "${PREFIX}" "${2}"; then + if rtl_fileop test "${2}"; then + rtl_fileop rm "${2}"; + fi; + if [ "${?}" -eq 0 ]; then + rtl_log_msg vvvv "Linking \`${1}' to \`${2}' w/ -fs"; + ln -fs -- "${1}" "${2}"; _rc="${?}"; + fi; + fi; ;; + mv) if [ \( -z "${1}" \) -o \( -z "${2}" \) ]; then + rtl_log_msg failexit "Missing parameters (in: mv ${*}.)"; + elif exp_rtl_fileop_check "${PREFIX}" "${1}" "${2}"; then + rtl_log_msg vvvv "Moving \`${1}' to \`${2}' w/ -fs"; + mv -f -- "${1}" "${2}"; _rc="${?}"; + fi; ;; + mkdir|mkfifo|rm|source_opt|test|touch) + while [ \( "${?}" -eq 0 \) -a \( ""${#}"" -gt 0 \) ]; do + if [ -z "${1}" ]; then + rtl_log_msg failexit "Missing parameters (in: ${_op} ${*}.)"; + elif [ "${_op}" = mkdir ]\ + && [ ! -d "${1}" ]\ + && exp_rtl_fileop_check "${PREFIX}" "${1}"; then + if rtl_fileop test "${1}"; then + rtl_fileop rm "${1}"; + fi; + rtl_log_msg vvvv "Making directory \`${1}'."; + mkdir -p -- "${1}"; _rc="${?}"; + elif [ "${_op}" = mkfifo ]\ + && exp_rtl_fileop_check "${PREFIX}" "${1}"; then + if rtl_fileop test "${1}"; then + rtl_fileop rm "${1}"; + fi; + rtl_log_msg vvvv "Creating FIFO \`${1}'."; + exp_rtl_fileop_check "${PREFIX}" "${1}"; + mkfifo -- "${1}"; _rc="${?}"; + elif [ "${_op}" = rm ]\ + && rtl_fileop test "${1}"\ + && exp_rtl_fileop_check "${PREFIX}" "${1}"; then + rtl_log_msg vvvv "Removing directory or file \`${1}'."; + rm -rf -- "${1}"; _rc="${?}"; + elif [ "${_op}" = source_opt ]\ + && rtl_fileop test "${1}"\ + && exp_rtl_fileop_check "${PREFIX}" "${1}"; then + rtl_log_msg vvvv "Sourcing file \`${1}'."; + . "${1}"; _rc="${?}"; + elif [ "${_op}" = test ]\ + && exp_rtl_fileop_check "${PREFIX}" "${1}"\ + && ! [ \( -L "${1}" \) -o \( -e "${1}" \) ]; then + return 1; + elif [ "${_op}" = touch ]\ + && exp_rtl_fileop_check "${PREFIX}" "${1}"; then + rtl_log_msg vvvv "Touching file \`${1}'."; + touch -- "${1}"; _rc="${?}"; + fi; shift; + done; ;; + *) rtl_log_msg failexit "Error: rtl_fileop() called w/ invalid parameter(s): ${*}"; ;; + esac; return "${_rc}"; +}; + +# vim:filetype=sh |