/
functions
107 lines (86 loc) · 2.51 KB
/
functions
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
103
104
105
106
#!/bin/sh
__sm.config.read()
{
typeset _extension _file _key _variable _prefix _temp _value _delimiter
_extension="$1"
_file="$2"
_key="$3"
_variable="$4"
_prefix="$5"
_delimiter="${6}"
[[ -n "${_variable}" ]] || _variable="${_key}"
[[ -z "${_prefix}" ]] || _variable="${_prefix}_${_variable}"
# Run search in the same process to initialize cache variables.
__sm.config.settings.search ${_extension} "${_file}" > /dev/null
for _file in $( __sm.config.settings.search ${_extension} "${_file}" )
do
[[ -s "${_file}" ]] || continue
_value=$(awk '/^'"${_key}${_delimiter:==}"'/ {gsub("'"${_key}${_delimiter}"'",""); print $0}' "${_file}")
[[ -z "${_value}" ]] || break
done
typeset -g ${_variable} >/dev/null 2>&1
eval "${_variable}=\"${_value}\""
}
__sm.config.write()
{
typeset _extension _file _key _value _delimiter
_extension="$1"
_file="$2"
_key="$3"
_value="$4"
_delimiter="$5"
# unset, delete / write, set
case "${value}" in
(unset|delete)
sed -i.tmp "s#^${_key}${_delimiter}.*\$##" "${_file}"
;;
(*)
if ! awk -F= "/^'"${_key}${_delimiter}"'/{print $2}" "${_file}" >/dev/null 2>&1
then
echo "${_key}${_delimiter}${_value}" >> "${_file}"
else # Overwrite.
sed -i.tmp "s#^${_key}${_delimiter}.*\$#${_key}${_delimiter}${_value}#" "${_file}"
fi
;;
esac
}
__sm.config.settings.search()
{
trace_filter config_search || set -o xtrace
typeset extension setting _path paths
extension=$1
setting=$2
paths=( "/etc/sm/${extension}" "$HOME/.sm/${extension}" ) # Standard paths
if __sm.extension.path "${extension}"
then
paths+=( "${extension_path}/config" )
fi
for _path in "${settings_search_path_append[@]}"
do # Additional paths
__sm.config.settings.search.path.update "${_path}"
paths+=( "${_path}/${extension}" )
done
for _path in "${paths[@]}"
do # Print existing paths.
# if paths exist "${_path}" && ! files are empty "${_path}/${setting}"
if [[ -d "${_path}" && -f "${_path}/${setting}" && -s "${_path}/${setting}" ]]
then
printf "${_path}/${setting}\n"
fi
done
}
__sm.config.settings.search.path.update()
{
typeset path _uri
path=$1
if __sm.string.contains.word "${path}" "${__sm_settings_search_cache[*]}"
then
return 0
fi
if files exist "${path}/.uri" && ! files are empty "${_path}/.uri"
then
_uri="$( __sm.vcs.read_uri "${path}/.uri" )"
fetch_uri "${_uri}" "${path}" >&2
fi
__sm_settings_search_cache+=( "${path}" )
}