summaryrefslogtreecommitdiffhomepage
path: root/subr/ex_rtl_fileop.subr
blob: 201d5abe71205a4b5945035e36365d026d1c4760 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#
# set -o noglob is assumed.
#

exp_rtl_fileop_check() {
	local _prefix="${1}" _pname="" _rname=""; shift;
	while [ ${#} -gt 0 ]; do
		return 0;
	shift; done;
};

ex_rtl_fileop() {
	local _op="${1}" _src="" _dst=""; shift;
	case "${_op}" in
	cd)	if [ \( -z "${1}" \) -o ! \( -L "${1}" -o -e "${1}" \) ]; then
			ex_rtl_log_msg failexit "Invalid or non-existent directory \`${1}'.";
		else
			ex_rtl_log_msg vvvo "Changing working directory to \`${1}'.";
			exp_rtl_fileop_check "${PREFIX}" "${1}";
			cd -- "${1}";
		fi; ;;
	cp_follow)
		if [ ${#} -lt 2 ]; then
			ex_rtl_log_msg failexit "Missing parameters (in: cp_follow ${*}.)";
		else
			_src="${*}"; _src="${_src% *}";
			_dst="${*}"; _dst="${_dst##* }";
			ex_rtl_log_msg vvvo "Copying \`${_src}' into \`${_dst}' w/ -pLR.";
			exp_rtl_fileop_check "${PREFIX}" "${*}";
			cp -pLR -- "${@}";
		fi; ;;
	cp)	if [ ${#} -lt 2 ]; then
			ex_rtl_log_msg failexit "Missing parameters (in: cp ${*}.)";
		else
			_src="${*}"; _src="${_src% *}";
			_dst="${*}"; _dst="${_dst##* }";
			ex_rtl_log_msg vvvo "Copying \`${_src}' into \`${_dst}' w/ -pPR.";
			exp_rtl_fileop_check "${PREFIX}" "${*}";
			cp -pPR -- "${@}";
		fi; ;;
	ln_symbolic)
		if [ \( -z "${1}" \) -o \( -z "${2}" \) ]; then
			ex_rtl_log_msg failexit "Missing parameters (in: ln_symbolic ${*}.)";
		else
			exp_rtl_fileop_check "${PREFIX}" "${2}";
			if ex_rtl_fileop test "${2}"; then
				ex_rtl_fileop rm "${2}";
			fi;
			ex_rtl_log_msg vvvo "Linking \`${1}' to \`${2}' w/ -fs";
			ln -fs -- "${1}" "${2}";
		fi; ;;
	mv)	if [ \( -z "${1}" \) -o \( -z "${2}" \) ]; then
			ex_rtl_log_msg failexit "Missing parameters (in: mv ${*}.)";
		else
			ex_rtl_log_msg vvvo "Moving \`${1}' to \`${2}' w/ -fs";
			exp_rtl_fileop_check "${PREFIX}" "${1}" "${2}";
			mv -f -- "${1}" "${2}";
		fi; ;;
	mkdir|mkfifo|rm|source_opt|test|touch)
		while [ ${#} -gt 0 ]; do
			if [ -z "${1}" ]; then
				ex_rtl_log_msg failexit "Missing parameters (in: ${_op} ${*}.)";
			elif [ "${_op}" = mkdir ]\
			&& [ ! -d "${1}" ]; then
				exp_rtl_fileop_check "${PREFIX}" "${1}";
				if ex_rtl_fileop test "${1}"; then
					ex_rtl_fileop rm "${1}";
				fi;
				ex_rtl_log_msg vvvo "Making directory \`${1}'.";
				mkdir -p -- "${1}";
			elif [ "${_op}" = mkfifo ]; then
				exp_rtl_fileop_check "${PREFIX}" "${1}";
				if ex_rtl_fileop test "${1}"; then
					ex_rtl_fileop rm "${1}";
				fi;
				ex_rtl_log_msg vvvo "Creating FIFO \`${1}'.";
				exp_rtl_fileop_check "${PREFIX}" "${1}";
				mkfifo -- "${1}";
			elif [ "${_op}" = rm ]\
			&& ex_rtl_fileop test "${1}"; then
				ex_rtl_log_msg vvvo "Removing directory or file \`${1}'.";
				exp_rtl_fileop_check "${PREFIX}" "${1}";
				rm -rf -- "${1}";
			elif [ "${_op}" = source_opt ]\
			&& ex_rtl_fileop test "${1}"; then
				ex_rtl_log_msg vvvo "Sourcing file \`${1}'.";
				exp_rtl_fileop_check "${PREFIX}" "${1}";
				. "${1}";
			elif [ "${_op}" = test ]\
			&& ! [ \( -L "${1}" \) -o \( -e "${1}" \) ]; then
				return 1;
			elif [ "${_op}" = touch ]; then
				ex_rtl_log_msg vvvo "Touching file \`${1}'.";
				exp_rtl_fileop_check "${PREFIX}" "${1}";
				touch -- "${1}";
			fi; shift;
		done; ;;
	*)	ex_rtl_log_msg failexit "Error: ex_rtl_fileop() called w/ invalid parameter(s): ${*}"; ;;
	esac; return 0;
};

# vim:filetype=sh