aeeaa0 subr.rtl/rtl_fetch{_git,}.subr: split.

Authored and Committed by Lucio Andrés Illanes Albornoz 3 years ago
    subr.rtl/rtl_fetch{_git,}.subr: split.
    subr.rtl/rtl_{filepath,complex}.subr: split.
    subr.rtl/{rtl_filepath,}.subr: split.
    subr.rtl/rtl_{platform,complex}.subr: split.
    
        
file modified
+0 -1
subr.rtl/rtl.subr CHANGED
@@ -2,7 +2,6 @@
2
2
# set +o errexit -o noglob -o nounset is assumed.
3
3
#
4
4
5
- rtl_basename() { local _fname="${1##*/}"; printf "%s" "${_fname}"; };
6
5
rtl_date() { command date "+${1:-${DEFAULT_TIMESTAMP_FMT:-"%Y/%m/%d %H:%M:%S"}}"; };
7
6
rtl_set_IFS_nl() { IFS="
8
7
"; };
file modified
+0 -203
subr.rtl/rtl_complex.subr CHANGED
@@ -2,88 +2,6 @@
2
2
# set +o errexit -o noglob -o nounset is assumed.
3
3
#
4
4
5
- rtl_check_digest() {
6
- local _fname="${1}" _digest_check="${2}" _digest=""; RTL_CHECK_DIGEST_DIGEST="";
7
- if ! [ -e "${_fname}" ]; then
8
- return 1;
9
- else set -- $(sha256sum "${_fname}");
10
- RTL_CHECK_DIGEST_DIGEST="${1}";
11
- if [ "${RTL_CHECK_DIGEST_DIGEST}" = "${_digest_check}" ]; then
12
- return 0;
13
- else
14
- return 1;
15
- fi;
16
- fi;
17
- };
18
-
19
- rtl_check_digest_file() {
20
- local _fname="${1}" _digest_check="${2}" _digest_fname="${3}" _digest="" RTL_CHECK_DIGEST_DIGEST="";
21
- if ! [ -e "${_digest_fname}" ]; then
22
- return 1;
23
- else _digest="$(cat "${_digest_fname}")";
24
- if [ "${_digest}" != "${_digest_check}" ]\
25
- || ! rtl_check_digest "${_fname}" "${_digest_check}"; then
26
- return 1;
27
- fi;
28
- fi;
29
- };
30
-
31
- rtl_check_path_vars() {
32
- local _vnames="${1}" _rc=0 _vname="" _vname_val=""; _status="";
33
- for _vname in ${_vnames}; do
34
- _vname_val="$(rtl_get_var_unsafe "${_vname}")";
35
- if [ -z "${_vname_val}" ]; then
36
- _rc=1; _status="Error: variable \`${_vname}' is empty or unset."; break;
37
- elif [ "${_vname_val#* *}" != "${_vname_val}" ]; then
38
- _rc=2; _status="Error: variable \`${_vname}' contains one or more whitespace characters."; break;
39
- fi;
40
- done;
41
- return "${_rc}";
42
- };
43
-
44
- rtl_check_prereqs() {
45
- local _cmd="" _cmds_missing="" _rc=0; _status="";
46
- for _cmd in "${@}"; do
47
- if ! which "${_cmd}" >/dev/null 2>&1; then
48
- _cmds_missing="${_cmds_missing:+${_cmds_missing} }${_cmd}";
49
- fi;
50
- done;
51
- if [ -n "${_cmds_missing}" ]; then
52
- _rc=1; _status="Error: missing prerequisite package(s): ${_cmds_missing}";
53
- fi;
54
- return "${_rc}";
55
- };
56
-
57
- rtl_clean_env() {
58
- local _env_vars_except="${1}" _env_var="" _env_vars="";
59
- _env_vars="$(export | sed -ne '/^export/{s/^export //;s/=.*$//p}')";
60
- for _env_var in ${_env_vars}; do
61
- if [ "${_env_var#DEFAULT_}" != "${_env_var}" ]\
62
- || [ "${_env_var#PKG_}" != "${_env_var}" ]; then
63
- _env_vars_except="$(rtl_lconcat "${_env_vars_except}" "${_env_var}")";
64
- fi;
65
- done;
66
- rtl_unset_vars $(rtl_lfilter "${_env_vars}" "${_env_vars_except}");
67
- };
68
-
69
- rtl_dirname() {
70
- local _dname="${1%/*}";
71
- while rtl_matchr "${_dname}" "*/"; do
72
- _dname="${_dname%/}";
73
- done; printf "%s" "${_dname:-/}";
74
- };
75
-
76
- rtl_exists_any() {
77
- local _subdir="${1}"; shift;
78
- while [ "${#}" -gt 0 ]; do
79
- if [ -e "${_subdir}/${1}" ]; then
80
- return 0;
81
- else
82
- shift;
83
- fi;
84
- done; return 1;
85
- };
86
-
87
5
rtl_export_vars() {
88
6
local _unsetfl=0; [ "x${1}" = "x-u" ] && { _unsetfl=1; shift; };
89
7
while [ "${#}" -ge 2 ]; do
@@ -135,49 +53,6 @@ rtl_filter_vars() {
135
53
printf "%s" "${_vars}";
136
54
};
137
55
138
- rtl_flock_acquire() {
139
- local _fd="${1}" _conflict_exit_code="${2:-253}" _wait="${3:-3600}"
140
- while true; do
141
- if flock -E "${_conflict_exit_code}" -w "${_wait}" "${_fd}"; then
142
- break;
143
- elif [ "${?}" -eq "${_conflict_exit_code}" ]; then
144
- continue;
145
- else
146
- return "${?}";
147
- fi;
148
- done;
149
- };
150
-
151
- rtl_get_cpu_count() {
152
- local _line="" _ncpus=0 _rc=0 _sname="$(uname -s 2>/dev/null)"; _status="";
153
- case "${_sname}" in
154
- Linux) if [ ! -e "/proc/cpuinfo" ]; then
155
- _rc=1; _status="Error: /proc/cpuinfo non-existent.";
156
- else while read -r _line; do
157
- if rtl_match "${_line}" "processor*:"; then
158
- : $((_ncpus+=1));
159
- fi;
160
- done < /proc/cpuinfo; printf "%s" "${_ncpus}";
161
- fi; ;;
162
- *) _rc=1; _status="Error: unknown platform \`${_sname}'."; ;;
163
- esac; return "${_rc}";
164
- };
165
-
166
- rtl_get_var_unsafe() {
167
- local _vname="";
168
- if [ "x${1}" = "x-u" ]; then
169
- shift; _vname="$(rtl_toupper "${1}")";
170
- else
171
- _vname="${1}";
172
- fi;
173
- eval echo \${${_vname}} 2>/dev/null;
174
- };
175
-
176
- rtl_get_vars_fast() {
177
- local _pattern="${1}";
178
- set | awk -F= '/'"${_pattern}"'/{print $1}' | sort;
179
- };
180
-
181
56
rtl_head() {
182
57
local _pattern="${1}" _s="${2}";
183
58
while true; do
@@ -190,34 +65,6 @@ rtl_head() {
190
65
printf "%s" "${_s}";
191
66
};
192
67
193
- rtl_is_newer() {
194
- local _new_fname="${1}" _old_fname="${2}" _new_ts="" _old_ts="";
195
- if ! [ -e "${_old_fname}" ]; then
196
- return 0;
197
- else _new_ts="$(stat -c %Y "${_new_fname}" 2>&1)";
198
- _old_ts="$(stat -c %Y "${_old_fname}" 2>&1)";
199
- if [ "${_new_ts:-0}" -gt "${_old_ts:-0}" ]; then
200
- return 0;
201
- else
202
- return 1;
203
- fi;
204
- fi;
205
- };
206
-
207
- rtl_kill_tree() {
208
- local _pid="${1}" _signal="${2:-TERM}" _pid_child="" _pids="";
209
- if _pids="$(pgrep -P "${_pid}")"\
210
- && [ -n "${_pids}" ]; then
211
- for _pid_child in ${_pids}; do
212
- rtl_kill_tree "${_pid_child}" "${_signal}";
213
- done;
214
- fi;
215
- if [ "${_pid:-0}" -ne "${$}" ]\
216
- && kill "-${_signal}" "${_pid}" 2>/dev/null; then
217
- RTL_KILL_TREE_PIDS="$(rtl_lconcat "${RTL_KILL_TREE_PIDS}" "${_pid}")";
218
- fi;
219
- };
220
-
221
68
rtl_percentage() {
222
69
local _in="${1}" _max="${2}" _perc;
223
70
_perc="$((100 * ${_in} + ${_max} / 2))";
@@ -225,54 +72,4 @@ rtl_percentage() {
225
72
printf "%d\n" "${_perc}";
226
73
};
227
74
228
- rtl_prompt() {
229
- local _fmt="${1}" _choice=""; shift;
230
- printf "${_fmt}? (y|N) " "${@}";
231
- read -r _choice;
232
- case "${_choice}" in
233
- [yY]) _choice=1; ;;
234
- *) _choice=0; ;;
235
- esac;
236
- return "${_choice}";
237
- };
238
-
239
- rtl_rc() {
240
- local _nflag="${1}" _cmd="${2}"; shift 2;
241
- case "${_nflag}" in
242
- 1) if [ "${#}" -gt 0 ]; then
243
- rtl_log_msg notice "Command line: %s %s" "${_cmd}" "${*}";
244
- else
245
- rtl_log_msg notice "Command line: %s" "${_cmd}";
246
- fi; ;;
247
- *) "${_cmd}" "${@}";
248
- esac;
249
- };
250
-
251
- rtl_run_cmd_unsplit() {
252
- local _cmd="${1}" _cmdline="" _rc="" IFS; shift;
253
- while [ ${#} -gt 0 ]; do
254
- [ -n "${1}" ] &&\
255
- _cmdline="${_cmdline:+${_cmdline}:}${1}";
256
- shift;
257
- done;
258
- IFS=:; ${_cmd} ${_cmdline}; _rc=$?;
259
- return ${_rc};
260
- };
261
-
262
- rtl_set_vars() {
263
- local _vars_set_vname="${1}" _vname_dst="${2}" _vname_src_tmpls="${3}" \
264
- _vars_set_old="" _vars_set_tmp="" _vname_src="";
265
- for _vname_src in $(rtl_toupper "${_vname_src_tmpls}"); do
266
- _vname_src="${_vname_src}_${_vname_dst}";
267
- _vval_src="$(rtl_get_var_unsafe "${_vname_src}")";
268
- if [ -n "${_vval_src}" ]; then
269
- rtl_set_var_unsafe "PKG_${_vname_dst}" "${_vval_src}";
270
- _vars_set_tmp="$(rtl_lconcat "${_vars_set_tmp}" "PKG_${_vname_dst}")";
271
- fi;
272
- done;
273
- _vars_set_old="$(rtl_get_var_unsafe "${_vars_set_vname}")";
274
- rtl_set_var_unsafe "${_vars_set_vname}" \
275
- "$(rtl_lconcat "${_vars_set_old}" "${_vars_set_tmp}")";
276
- };
277
-
278
75
# vim:filetype=sh
file modified
+0 -90
subr.rtl/rtl_fetch.subr CHANGED
@@ -2,96 +2,6 @@
2
2
# set +o errexit -o noglob -o nounset is assumed.
3
3
#
4
4
5
- rtl_fetch_mirror_urls_git() {
6
- local _git_args="${1}" _tgtdir="${2}" _rc=0 _repo_dname="" _subdir="" _url="" _url_spec=""; shift 2;
7
-
8
- for _url_spec in "${@}"; do
9
- _subdir="${_url_spec%=*}"; _subdir="${_subdir##*/}"; _url="${_url_spec#*=}"; _url="${_url%@*}";
10
- _repo_dname="${_url##*/}"; [ "${_repo_dname%.git}" = "${_repo_dname}" ] && _repo_dname="${_repo_dname}.git";
11
-
12
- if [ ! -e "$(rtl_dirname "${_tgtdir}")" ]; then
13
- rtl_fileop mkdir "$(rtl_dirname "${_tgtdir}")";
14
- fi;
15
- (set -o errexit -o noglob -o nounset;
16
- rtl_flock_acquire 4 || exit "${?}";
17
- trap "rm -f \"${_tgtdir}/.fetching\"" EXIT;
18
- if [ -e "${_tgtdir}/${_repo_dname}" ]; then
19
- (rtl_fileop cd "${_tgtdir}/${_repo_dname}" && git fetch ${_git_args} --all) || return 1;
20
- else (rtl_fileop cd "${_tgtdir}" && git clone ${_git_args} --mirror "${_url}") || return 1;
21
- fi) 4<>"${_tgtdir}/.fetching";
22
- if [ "${?}" -ne 0 ]; then
23
- _rc=1;
24
- fi;
25
- done; return "${_rc}";
26
- };
27
-
28
- rtlp_fetch_url_git() {
29
- local _cache_dname="${1}" _git_args="${2}" _git_branch="${3}" _mirrors="${4}" _pkg_name="${5}"\
30
- _subdir="${6}" _tgtdir="${7}" _url="${8}" _cache_dname_full="" _clonefl=0 _oldpwd="" _url_base="";
31
-
32
- _cache_dname_full="${_cache_dname}/${_subdir##*/}";
33
- (set -o errexit -o noglob -o nounset;
34
- rtl_flock_acquire 4 || exit "${?}";
35
- trap "rm -f \"${_cache_dname_full%%[/]}.fetching\"" EXIT;
36
- if [ -e "${_cache_dname_full}" ]; then
37
- (rtl_fileop cd "${_cache_dname_full}" &&\
38
- git pull ${_git_args} origin "${_git_branch:-main}") || return 1;
39
- (rtl_fileop cd "${_cache_dname_full}" &&\
40
- git submodule update) || return 1;
41
- else if git clone ${_git_args} -b "${_git_branch:-main}" "${_url}" "${_cache_dname_full}"; then
42
- _clonefl=1;
43
- elif [ "${_mirrors}" = "skip" ]; then
44
- return 1;
45
- else for _url_base in ${_mirrors}; do
46
- if git clone ${_git_args} -b "${_git_branch:-main}" "${_url_base}/${_pkg_name}/${_url##*/}" "${_cache_dname_full}"; then
47
- _clonefl=1; break;
48
- fi;
49
- done;
50
- fi;
51
- if [ "${_clonefl}" -eq 0 ]; then
52
- return 1;
53
- else if [ -n "${_git_branch}" ]; then
54
- (rtl_fileop cd "${_cache_dname_full}" &&\
55
- git checkout "${_git_branch}") || return 1;
56
- fi;
57
- (rtl_fileop cd "${_cache_dname_full}" &&\
58
- git submodule update --init) || return 1;
59
- fi;
60
- fi;
61
- if [ "${_cache_dname}" != "${_tgtdir}" ]; then
62
- _oldpwd="${PWD}"; rtl_fileop cd "${_tgtdir}" || return 1;
63
- rtl_fileop rm "${_tgtdir}/${_subdir}" || return 1;
64
- if [ ! -e "$(rtl_dirname "${_tgtdir}/${_subdir}")" ]; then
65
- rtl_fileop mkdir "$(rtl_dirname "${_tgtdir}/${_subdir}")";
66
- fi;
67
- rtl_fileop cp "${_cache_dname_full}" "${_tgtdir}/${_subdir}" || return 1;
68
- rtl_fileop cd "${_oldpwd}" || return 1;
69
- fi) 4<>"${_cache_dname_full%%[/]}.fetching";
70
-
71
- if [ "${?}" -eq 0 ]; then
72
- cd "$(pwd)";
73
- else
74
- return 1;
75
- fi;
76
- };
77
-
78
- rtl_fetch_urls_git() {
79
- local _cache_dname="${1}" _git_args="${2}" _tgtdir="${3}" _pkg_name="${4}" _mirrors="${5}"\
80
- _git_branch="" _subdir="" _url="" _url_spec=""; shift 5;
81
-
82
- for _url_spec in "${@}"; do
83
- _subdir="${_url_spec%=*}"; _url="${_url_spec#*=}"; _url="${_url%@*}";
84
- if [ "${_url_spec#*@}" != "${_url_spec}" ]; then
85
- _git_branch=${_url_spec#*@};
86
- fi;
87
- if ! rtlp_fetch_url_git \
88
- "${_cache_dname}" "${_git_args}" "${_git_branch}" "${_mirrors}"\
89
- "${_pkg_name}" "${_subdir}" "${_tgtdir}" "${_url}"; then
90
- return 1;
91
- fi;
92
- done;
93
- };
94
-
95
5
# N.B. URLs ($1) may contain `?' or '&' characters.
96
6
rtl_fetch_url_wget() {
97
7
local _urls="${1}" _sha256sum_src="${2}" _target_dname="${3}" _target_fname="${4}" _target_name="${5}" _mirrors="${6:-}"\
subr.rtl/rtl_fetch_git.subr ADDED
@@ -0,0 +1,95 @@
1
+ #
2
+ # set +o errexit -o noglob -o nounset is assumed.
3
+ #
4
+
5
+ rtlp_fetch_url_git() {
6
+ local _cache_dname="${1}" _git_args="${2}" _git_branch="${3}" _mirrors="${4}" _pkg_name="${5}"\
7
+ _subdir="${6}" _tgtdir="${7}" _url="${8}" _cache_dname_full="" _clonefl=0 _oldpwd="" _url_base="";
8
+
9
+ _cache_dname_full="${_cache_dname}/${_subdir##*/}";
10
+ (set -o errexit -o noglob -o nounset;
11
+ rtl_flock_acquire 4 || exit "${?}";
12
+ trap "rm -f \"${_cache_dname_full%%[/]}.fetching\"" EXIT;
13
+ if [ -e "${_cache_dname_full}" ]; then
14
+ (rtl_fileop cd "${_cache_dname_full}" &&\
15
+ git pull ${_git_args} origin "${_git_branch:-main}") || return 1;
16
+ (rtl_fileop cd "${_cache_dname_full}" &&\
17
+ git submodule update) || return 1;
18
+ else if git clone ${_git_args} -b "${_git_branch:-main}" "${_url}" "${_cache_dname_full}"; then
19
+ _clonefl=1;
20
+ elif [ "${_mirrors}" = "skip" ]; then
21
+ return 1;
22
+ else for _url_base in ${_mirrors}; do
23
+ if git clone ${_git_args} -b "${_git_branch:-main}" "${_url_base}/${_pkg_name}/${_url##*/}" "${_cache_dname_full}"; then
24
+ _clonefl=1; break;
25
+ fi;
26
+ done;
27
+ fi;
28
+ if [ "${_clonefl}" -eq 0 ]; then
29
+ return 1;
30
+ else if [ -n "${_git_branch}" ]; then
31
+ (rtl_fileop cd "${_cache_dname_full}" &&\
32
+ git checkout "${_git_branch}") || return 1;
33
+ fi;
34
+ (rtl_fileop cd "${_cache_dname_full}" &&\
35
+ git submodule update --init) || return 1;
36
+ fi;
37
+ fi;
38
+ if [ "${_cache_dname}" != "${_tgtdir}" ]; then
39
+ _oldpwd="${PWD}"; rtl_fileop cd "${_tgtdir}" || return 1;
40
+ rtl_fileop rm "${_tgtdir}/${_subdir}" || return 1;
41
+ if [ ! -e "$(rtl_dirname "${_tgtdir}/${_subdir}")" ]; then
42
+ rtl_fileop mkdir "$(rtl_dirname "${_tgtdir}/${_subdir}")";
43
+ fi;
44
+ rtl_fileop cp "${_cache_dname_full}" "${_tgtdir}/${_subdir}" || return 1;
45
+ rtl_fileop cd "${_oldpwd}" || return 1;
46
+ fi) 4<>"${_cache_dname_full%%[/]}.fetching";
47
+
48
+ if [ "${?}" -eq 0 ]; then
49
+ cd "$(pwd)";
50
+ else
51
+ return 1;
52
+ fi;
53
+ };
54
+
55
+ rtl_fetch_mirror_urls_git() {
56
+ local _git_args="${1}" _tgtdir="${2}" _rc=0 _repo_dname="" _subdir="" _url="" _url_spec=""; shift 2;
57
+
58
+ for _url_spec in "${@}"; do
59
+ _subdir="${_url_spec%=*}"; _subdir="${_subdir##*/}"; _url="${_url_spec#*=}"; _url="${_url%@*}";
60
+ _repo_dname="${_url##*/}"; [ "${_repo_dname%.git}" = "${_repo_dname}" ] && _repo_dname="${_repo_dname}.git";
61
+
62
+ if [ ! -e "$(rtl_dirname "${_tgtdir}")" ]; then
63
+ rtl_fileop mkdir "$(rtl_dirname "${_tgtdir}")";
64
+ fi;
65
+ (set -o errexit -o noglob -o nounset;
66
+ rtl_flock_acquire 4 || exit "${?}";
67
+ trap "rm -f \"${_tgtdir}/.fetching\"" EXIT;
68
+ if [ -e "${_tgtdir}/${_repo_dname}" ]; then
69
+ (rtl_fileop cd "${_tgtdir}/${_repo_dname}" && git fetch ${_git_args} --all) || return 1;
70
+ else (rtl_fileop cd "${_tgtdir}" && git clone ${_git_args} --mirror "${_url}") || return 1;
71
+ fi) 4<>"${_tgtdir}/.fetching";
72
+ if [ "${?}" -ne 0 ]; then
73
+ _rc=1;
74
+ fi;
75
+ done; return "${_rc}";
76
+ };
77
+
78
+ rtl_fetch_urls_git() {
79
+ local _cache_dname="${1}" _git_args="${2}" _tgtdir="${3}" _pkg_name="${4}" _mirrors="${5}"\
80
+ _git_branch="" _subdir="" _url="" _url_spec=""; shift 5;
81
+
82
+ for _url_spec in "${@}"; do
83
+ _subdir="${_url_spec%=*}"; _url="${_url_spec#*=}"; _url="${_url%@*}";
84
+ if [ "${_url_spec#*@}" != "${_url_spec}" ]; then
85
+ _git_branch=${_url_spec#*@};
86
+ fi;
87
+ if ! rtlp_fetch_url_git \
88
+ "${_cache_dname}" "${_git_args}" "${_git_branch}" "${_mirrors}"\
89
+ "${_pkg_name}" "${_subdir}" "${_tgtdir}" "${_url}"; then
90
+ return 1;
91
+ fi;
92
+ done;
93
+ };
94
+
95
+ # vim:filetype=sh
subr.rtl/rtl_filepath.subr ADDED
@@ -0,0 +1,96 @@
1
+ #
2
+ # set +o errexit -o noglob -o nounset is assumed.
3
+ #
4
+
5
+ rtl_basename() {
6
+ local _fname="${1##*/}"; printf "%s" "${_fname}";
7
+ };
8
+
9
+ rtl_check_digest() {
10
+ local _fname="${1}" _digest_check="${2}" _digest=""; RTL_CHECK_DIGEST_DIGEST="";
11
+ if ! [ -e "${_fname}" ]; then
12
+ return 1;
13
+ else set -- $(sha256sum "${_fname}");
14
+ RTL_CHECK_DIGEST_DIGEST="${1}";
15
+ if [ "${RTL_CHECK_DIGEST_DIGEST}" = "${_digest_check}" ]; then
16
+ return 0;
17
+ else
18
+ return 1;
19
+ fi;
20
+ fi;
21
+ };
22
+
23
+ rtl_check_digest_file() {
24
+ local _fname="${1}" _digest_check="${2}" _digest_fname="${3}" _digest="" RTL_CHECK_DIGEST_DIGEST="";
25
+ if ! [ -e "${_digest_fname}" ]; then
26
+ return 1;
27
+ else _digest="$(cat "${_digest_fname}")";
28
+ if [ "${_digest}" != "${_digest_check}" ]\
29
+ || ! rtl_check_digest "${_fname}" "${_digest_check}"; then
30
+ return 1;
31
+ fi;
32
+ fi;
33
+ };
34
+
35
+ rtl_check_path_vars() {
36
+ local _vnames="${1}" _rc=0 _vname="" _vname_val=""; _status="";
37
+ for _vname in ${_vnames}; do
38
+ _vname_val="$(rtl_get_var_unsafe "${_vname}")";
39
+ if [ -z "${_vname_val}" ]; then
40
+ _rc=1; _status="Error: variable \`${_vname}' is empty or unset."; break;
41
+ elif [ "${_vname_val#* *}" != "${_vname_val}" ]; then
42
+ _rc=2; _status="Error: variable \`${_vname}' contains one or more whitespace characters."; break;
43
+ fi;
44
+ done;
45
+ return "${_rc}";
46
+ };
47
+
48
+ rtl_dirname() {
49
+ local _dname="${1%/*}";
50
+ case "${_dname}" in
51
+ "") _dname="."; ;;
52
+ *) while rtl_matchr "${_dname}" "*/"; do
53
+ _dname="${_dname%/}";
54
+ done; ;;
55
+ esac; printf "%s" "${_dname:-/}";
56
+ };
57
+
58
+ rtl_exists_any() {
59
+ local _subdir="${1}"; shift;
60
+ while [ "${#}" -gt 0 ]; do
61
+ if [ -e "${_subdir}/${1}" ]; then
62
+ return 0;
63
+ else
64
+ shift;
65
+ fi;
66
+ done; return 1;
67
+ };
68
+
69
+ rtl_flock_acquire() {
70
+ local _fd="${1}" _conflict_exit_code="${2:-253}" _wait="${3:-3600}"
71
+ while true; do
72
+ if flock -E "${_conflict_exit_code}" -w "${_wait}" "${_fd}"; then
73
+ break;
74
+ elif [ "${?}" -eq "${_conflict_exit_code}" ]; then
75
+ continue;
76
+ else
77
+ return "${?}";
78
+ fi;
79
+ done;
80
+ };
81
+
82
+ rtl_is_newer() {
83
+ local _new_fname="${1}" _old_fname="${2}" _new_ts="" _old_ts="";
84
+ if ! [ -e "${_old_fname}" ]; then
85
+ return 0;
86
+ else _new_ts="$(stat -c %Y "${_new_fname}" 2>&1)";
87
+ _old_ts="$(stat -c %Y "${_old_fname}" 2>&1)";
88
+ if [ "${_new_ts:-0}" -gt "${_old_ts:-0}" ]; then
89
+ return 0;
90
+ else
91
+ return 1;
92
+ fi;
93
+ fi;
94
+ };
95
+
96
+ # vim:filetype=sh
subr.rtl/rtl_platform.subr ADDED
@@ -0,0 +1,124 @@
1
+ #
2
+ # set +o errexit -o noglob -o nounset is assumed.
3
+ #
4
+
5
+ rtl_check_prereqs() {
6
+ local _cmd="" _cmds_missing="" _rc=0; _status="";
7
+ for _cmd in "${@}"; do
8
+ if ! which "${_cmd}" >/dev/null 2>&1; then
9
+ _cmds_missing="${_cmds_missing:+${_cmds_missing} }${_cmd}";
10
+ fi;
11
+ done;
12
+ if [ -n "${_cmds_missing}" ]; then
13
+ _rc=1; _status="Error: missing prerequisite package(s): ${_cmds_missing}";
14
+ fi;
15
+ return "${_rc}";
16
+ };
17
+
18
+ rtl_clean_env() {
19
+ local _env_vars_except="${1}" _env_var="" _env_vars="";
20
+ _env_vars="$(export | sed -ne '/^export/{s/^export //;s/=.*$//p}')";
21
+ for _env_var in ${_env_vars}; do
22
+ if [ "${_env_var#DEFAULT_}" != "${_env_var}" ]\
23
+ || [ "${_env_var#PKG_}" != "${_env_var}" ]; then
24
+ _env_vars_except="$(rtl_lconcat "${_env_vars_except}" "${_env_var}")";
25
+ fi;
26
+ done;
27
+ rtl_unset_vars $(rtl_lfilter "${_env_vars}" "${_env_vars_except}");
28
+ };
29
+
30
+ rtl_get_cpu_count() {
31
+ local _line="" _ncpus=0 _rc=0 _sname="$(uname -s 2>/dev/null)"; _status="";
32
+ case "${_sname}" in
33
+ Linux) if [ ! -e "/proc/cpuinfo" ]; then
34
+ _rc=1; _status="Error: /proc/cpuinfo non-existent.";
35
+ else while read -r _line; do
36
+ if rtl_match "${_line}" "processor*:"; then
37
+ : $((_ncpus+=1));
38
+ fi;
39
+ done < /proc/cpuinfo; printf "%s" "${_ncpus}";
40
+ fi; ;;
41
+ *) _rc=1; _status="Error: unknown platform \`${_sname}'."; ;;
42
+ esac; return "${_rc}";
43
+ };
44
+
45
+ rtl_get_var_unsafe() {
46
+ local _vname="";
47
+ if [ "x${1}" = "x-u" ]; then
48
+ shift; _vname="$(rtl_toupper "${1}")";
49
+ else
50
+ _vname="${1}";
51
+ fi;
52
+ eval echo \${${_vname}} 2>/dev/null;
53
+ };
54
+
55
+ rtl_get_vars_fast() {
56
+ local _pattern="${1}";
57
+ set | awk -F= '/'"${_pattern}"'/{print $1}' | sort;
58
+ };
59
+
60
+ rtl_kill_tree() {
61
+ local _pid="${1}" _signal="${2:-TERM}" _pid_child="" _pids="";
62
+ if _pids="$(pgrep -P "${_pid}")"\
63
+ && [ -n "${_pids}" ]; then
64
+ for _pid_child in ${_pids}; do
65
+ rtl_kill_tree "${_pid_child}" "${_signal}";
66
+ done;
67
+ fi;
68
+ if [ "${_pid:-0}" -ne "${$}" ]\
69
+ && kill "-${_signal}" "${_pid}" 2>/dev/null; then
70
+ RTL_KILL_TREE_PIDS="$(rtl_lconcat "${RTL_KILL_TREE_PIDS}" "${_pid}")";
71
+ fi;
72
+ };
73
+
74
+ rtl_prompt() {
75
+ local _fmt="${1}" _choice=""; shift;
76
+ printf "${_fmt}? (y|N) " "${@}";
77
+ read -r _choice;
78
+ case "${_choice}" in
79
+ [yY]) _choice=1; ;;
80
+ *) _choice=0; ;;
81
+ esac;
82
+ return "${_choice}";
83
+ };
84
+
85
+ rtl_rc() {
86
+ local _nflag="${1}" _cmd="${2}"; shift 2;
87
+ case "${_nflag}" in
88
+ 1) if [ "${#}" -gt 0 ]; then
89
+ rtl_log_msg notice "Command line: %s %s" "${_cmd}" "${*}";
90
+ else
91
+ rtl_log_msg notice "Command line: %s" "${_cmd}";
92
+ fi; ;;
93
+ *) "${_cmd}" "${@}";
94
+ esac;
95
+ };
96
+
97
+ rtl_run_cmd_unsplit() {
98
+ local _cmd="${1}" _cmdline="" _rc="" IFS; shift;
99
+ while [ ${#} -gt 0 ]; do
100
+ [ -n "${1}" ] &&\
101
+ _cmdline="${_cmdline:+${_cmdline}:}${1}";
102
+ shift;
103
+ done;
104
+ IFS=:; ${_cmd} ${_cmdline}; _rc=$?;
105
+ return ${_rc};
106
+ };
107
+
108
+ rtl_set_vars() {
109
+ local _vars_set_vname="${1}" _vname_dst="${2}" _vname_src_tmpls="${3}" \
110
+ _vars_set_old="" _vars_set_tmp="" _vname_src="";
111
+ for _vname_src in $(rtl_toupper "${_vname_src_tmpls}"); do
112
+ _vname_src="${_vname_src}_${_vname_dst}";
113
+ _vval_src="$(rtl_get_var_unsafe "${_vname_src}")";
114
+ if [ -n "${_vval_src}" ]; then
115
+ rtl_set_var_unsafe "PKG_${_vname_dst}" "${_vval_src}";
116
+ _vars_set_tmp="$(rtl_lconcat "${_vars_set_tmp}" "PKG_${_vname_dst}")";
117
+ fi;
118
+ done;
119
+ _vars_set_old="$(rtl_get_var_unsafe "${_vars_set_vname}")";
120
+ rtl_set_var_unsafe "${_vars_set_vname}" \
121
+ "$(rtl_lconcat "${_vars_set_old}" "${_vars_set_tmp}")";
122
+ };
123
+
124
+ # vim:filetype=sh