summaryrefslogtreecommitdiffhomepage
path: root/subr/check_updates.subr
blob: 65acb8304c86f517b5592f0b6b4e719bbec1f7f0 (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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#
# . ./build.vars and set -o errexit -o noglob are assumed.
# See warning at the top of build.vars.
#

cpu_get_fnames() {
	case "${cu_name}" in
	infounzip|infozip)
		cu_fname="${cu_url##*/}";
		cu_fname_base="${cu_fname%%[0-9]*}";
		cu_fname_ext="${cu_fname#${cu_fname_base}${cu_version}.}";
		;;
	libgpg_error)
		cu_url_index="${cu_url%/*}/";
		cu_fnames="$(wget ${WGET_ARGS} -qO- "${cu_url_index}"	|\
			sed -n '/href="[^"]\+"/s/^.*href="\([^"]\+\)".*$/\1/p')";
		cu_fname_base="libgpg-error";
		;;
	libpthread_stubs)
		cu_fname_base="libpthread-stubs";
		;;
	rxvt_unicode)
		cu_fname_base="rxvt-unicode";
		;;
	the_silver_searcher)
		cu_url_index="http://geoff.greer.fm/ag/";
		cu_fnames="$(wget ${WGET_ARGS} -qO- ${cu_url_index}		|\
			sed -n '/href="[^"]\+"/{s/^.*href="\([^"]\+\)".*$/\1/;s/\/$//;p}')";
		;;
	util_linux)
		cu_fname_base="util-linux";
		cu_url_index="https://www.kernel.org/pub/linux/utils/util-linux/";
		cu_fnames="$(wget ${WGET_ARGS} -qO- ${cu_url_index}		|\
			sed -n '/href="[^"]\+"/{s/^.*href="\([^"]\+\)".*$/\1/;s/\/$//;p}')";
		;;
	xcb_proto)
		cu_fname_base="xcb-proto";
		;;
	*)
		if [ "${cu_url#*://github.com/*}" != "${cu_url}" ]; then
			_cpugf_uname="${cu_url#*/github.com/}";
			_cpugf_uname="${_cpugf_uname%%/*}";
			_cpugf_pname="${cu_url#*/github.com/${_cpugf_uname}/}";
			_cpugf_pname="${_cpugf_pname%%/*}";
			cu_url_index="https://github.com/${_cpugf_uname%%/*}/${_cpugf_pname%%/*}/releases/";
			unset _cpu_uname _cpu_pname;
			cu_fnames="$(wget ${WGET_ARGS} -qO- ${cu_url_index}	|\
				sed -n '/<span class="tag-name">/s/^.*<span class="tag-name">\([a-zA-Z]\+-\|v\|\)\(.\+\)<\/span>.*$/\2/p')";
			cu_fname_base="${cu_name}";
			cu_fname_ext="${cu_fname#v${cu_version}.}";
		fi;
		;;
	esac;
	if [ -z "${cu_url_index}" ]; then
		cu_url_index="${cu_url%/*}/";
		cu_fnames="$(wget ${WGET_ARGS} -qO- "${cu_url_index}"	|\
			sed -n '/[hH][rR][eE][fF]="[^"]\+"/s/^.*[hH][rR][eE][fF]="\([^"]\+\)".*$/\1/p')";
	fi;
	: ${cu_fname:="${cu_url##*/}"};
	: ${cu_fname_base:="${cu_fname%%-*}"};
	: ${cu_fname_ext:="${cu_fname#${cu_fname_base}-${cu_version}.}"};
};

cpu_get_version() {
	case "${cu_name}" in
	infounzip|infozip)
		if [ "${cu_fname#${cu_fname_base}}" != "${cu_fname}" ]\
		&& [ "${cu_fname%.${cu_fname_ext}}" != "${cu_fname}" ]; then
			cu_fname_version="${cu_fname%.${cu_fname_ext}}";
			cu_fname_version="${cu_fname_version#*zip*}";
		fi;
		;;
	mksh)
		if [ "${cu_fname#${cu_fname_base}-}" != "${cu_fname}" ]\
		&& [ "${cu_fname%.${cu_fname_ext}}" != "${cu_fname}" ]; then
			cu_fname_version="${cu_fname%.${cu_fname_ext}}";
			cu_fname_version="${cu_fname_version#*-R}";
		fi;
		;;
	util_linux)
		if [ "${cu_fname#${cu_fname_base}-}" = "${cu_fname}" ]\
		&& [ "${cu_fname%.${cu_fname_ext}}" = "${cu_fname}" ]; then
			cu_fname_version="${cu_fname%.${cu_fname_ext}}";
			cu_fname_version="${cu_fname_version#v}";
		fi;
		;;
	*)
		if [ "${cu_url#*://github.com/*}" != "${cu_url}" ]; then
			if [ "${cu_fname#${cu_fname_base}-}" = "${cu_fname}" ]\
			&& [ "${cu_fname%.${cu_fname_ext}}" = "${cu_fname}" ]; then
				cu_fname_version="${cu_fname}";
			fi;
		elif [ "${cu_fname#${cu_fname_base}-}" != "${cu_fname}" ]\
		&& [ "${cu_fname%.${cu_fname_ext}}" != "${cu_fname}" ]; then
			cu_fname_version="${cu_fname#${cu_fname_base}-}";
			cu_fname_version="${cu_fname_version%.${cu_fname_ext}}";
		fi;
		;;
	esac;
};

check_pkg_updates() {
	cu_name="${1}"; cu_version="${2}"; cu_url="${3}"; cu_url_type="${4}";
	if match_list "${CHECK_UPDATES_SKIP}" " " "${cu_name}"; then
		log_msg vnfo "Skipping \`${cu_name}' (set in \${CHECK_UPDATES_SKIP}.)";
		return 0;
	elif [ "${cu_url_type}" = "git" ]; then
		log_msg vnfo "Skipping \`${cu_name}' (URL_TYPE is Git.)";
		return 0;
	elif [ -z "${cu_version}" -o -z "${cu_url}" ]; then
		log_msg fail "Zero-length \${cu_version} and/or \${cu_url} for \`${cu_name}' (ignored.)";
		return 0;
	else
		log_msg vnfo "Checking ${cu_name} v${cu_version} for updates.";
		cpu_get_fnames; _cpu_versions="";
	fi;
	for cu_fname in ${cu_fnames}; do
		cu_fname="${cu_fname##*/}"; cpu_get_version;
		if [ -z "${cu_fname_version}" ]					\
		|| ! echo "${cu_fname_version}" | grep -Eq '^[-_.0-9a-zA-Z]+$'	\
		||   echo "${cu_fname_version}" | grep -Eq '^[_.a-zA-Z]+'; then
			log_msg varn "Skipping \`${cu_fname_version}' (empty/invalid version.)";
		else
			_cpu_versions="${_cpu_versions:+${_cpu_versions} }${cu_fname_version}";
		fi;
	done;
	if [ -z "${_cpu_versions}" ]; then
		log_msg warn "No versions available for \`${cu_name}' (Filename URL: ${cu_url}, index URL: ${cu_url_index}).";
	else
		_cpu_versions="$(echo "${_cpu_versions}"	|\
			sed 's/ /\n/g' | sort -rV | uniq	|\
			head -n${CHECK_UPDATES_SHOW_NEW:-6}	|\
			paste -d" " -s)";
		case "${cu_name}" in
		mksh)
			cu_version="${cu_version#R}";
		esac;
		if [ "${_cpu_versions%% *}" != "${cu_version}" ]; then
			log_msg info "New release(s) available for ${cu_name} v${cu_version}: ${_cpu_versions}.";
		else
			log_msg vnfo "${cu_name} v${cu_version} is up to date.";
		fi;
	fi;
	unset	cu_fname cu_fname_base cu_fname_ext cu_fnames cu_fname_version	\
		cu_name cu_url cu_url_fname cu_url_fname_base cu_url_fname_ext	\
		cu_url_index cu_url_type cu_version _cpu_versions;
};

# vim:filetype=sh