aboutsummaryrefslogtreecommitdiff
blob: 9a7c036e6b3c844614827166d7981945d9409e6c (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
150
151
152
153
154
155
# check for missing calls to xdg-utils regen functions

xdg_desktop_database_check() {
	type -P update-desktop-database &>/dev/null || return

	local d f all_files=() missing
	for d in usr/share/applications; do
		[[ -d ${d} ]] || continue

		local files=() find_args=()
		# if the cache does not exist at all, we complain for any file
		# otherwise, we look for files newer than the cache
		[[ -f ${d}/mimeinfo.cache ]] &&
			find_args+=( -newercm "${d}"/mimeinfo.cache ) || missing=1

		# look for any .desktop files that are newer than the cache
		# and that have any mime types defined
		while read -r -d $'\0' f; do
			files+=( "${f}" )
		done < <(find "${d}" -name '*.desktop' "${find_args[@]}" \
			-exec grep -lZi '^MimeType=' {} +)

		# if any files were found, update the db to avoid repeating
		# the warning for subsequent packages
		if [[ ${files[@]} ]]; then
			all_files+=("${files[@]}")
			addwrite "${d}"
			update-desktop-database "${d}"
		fi
	done

	# preinst initializes the baseline state for the posinst check
	[[ ${PORTAGE_QA_PHASE} == preinst ]] && return

	# parallel-install makes it impossible to blame a specific package
	has parallel-install ${FEATURES} && return

	# The eqatag call is prohibitively expensive if the cache is
	# missing and there are a large number of files.
	if [[ -z ${missing} && ${all_files[@]} ]]; then
		eqawarn "QA Notice: .desktop files with MimeType= were found installed"
		eqawarn "but desktop mimeinfo cache has not been updated:"
		eqatag -v xdg-utils.desktop "${all_files[@]/#//}"
		eqawarn "Please make sure to call xdg_desktop_database_update()"
		eqawarn "in pkg_postinst() and pkg_postrm() phases of appropriate pkgs."
	fi
}

xdg_icon_cache_check() {
	type -P gtk-update-icon-cache &>/dev/null || return

	local d f all_files=() missing
	for d in usr/share/icons/*/; do
		# xdg_icon_cache_update updates only themes with an index
		[[ -f ${d}/index.theme ]] || continue

		local files=() find_args=(
			# gtk-update-icon-cache supports only specific file
			# suffixes; match that to avoid false positives
			'(' -name '*.png' -o -name '*.svg'
				-o -name '*.xpm' -o -name '*.icon' ')'
		)
		# if the cache does not exist at all, we complain for any file
		# otherwise, we look for files newer than the cache
		[[ -f ${d}/icon-theme.cache ]] &&
			find_args+=( -newercm "${d}"/icon-theme.cache ) || missing=1

		# (use -mindepth 2 to easily skip the cache files)
		while read -r -d $'\0' f; do
			files+=( "${f}" )
		done < <(find "${d}" -mindepth 2 -type f "${find_args[@]}" -print0)

		# if any files were found, update the db to avoid repeating
		# the warning for subsequent packages
		if [[ ${files[@]} ]]; then
			all_files+=("${files[@]}")
			addwrite "${d}"
			gtk-update-icon-cache -qf "${d}"
		fi
	done

	# preinst initializes the baseline state for the posinst check
	[[ ${PORTAGE_QA_PHASE} == preinst ]] && return

	# parallel-install makes it impossible to blame a specific package
	has parallel-install ${FEATURES} && return

	# avoid false-positives on first install (bug 649464)
	[[ ${PN} == gtk-update-icon-cache ]] && return

	# The eqatag call is prohibitively expensive if the cache is
	# missing and there are a large number of files.
	if [[ -z ${missing} && ${all_files[@]} ]]; then
		eqawarn "QA Notice: new icons were found installed but icon cache"
		eqawarn "has not been updated:"
		eqatag -v xdg-utils.icon-cache "${all_files[@]/#//}"
		eqawarn "Please make sure to call xdg_icon_cache_update()"
		eqawarn "in pkg_postinst() and pkg_postrm() phases of appropriate pkgs."
	fi
}

xdg_mimeinfo_database_check() {
	type -P update-mime-database &>/dev/null || return

	local d f all_files=() missing
	for d in usr/share/mime; do
		[[ -d ${d} ]] || continue

		local files=() find_args=()
		# if the cache does not exist at all, we complain for any file
		# otherwise, we look for files newer than the cache
		[[ -f ${d}/mime.cache ]] &&
			find_args+=( -newercm "${d}"/mime.cache ) || missing=1

		while read -r -d $'\0' f; do
			files+=( "${f}" )
		done < <(find "${d}" -name '*.xml' "${find_args[@]}" -print0)

		# if any files were found, update the db to avoid repeating
		# the warning for subsequent packages
		if [[ ${files[@]} ]]; then
			all_files+=("${files[@]}")
			addwrite "${d}"
			update-mime-database "${d}"
		fi
	done

	# preinst initializes the baseline state for the posinst check
	[[ ${PORTAGE_QA_PHASE} == preinst ]] && return

	# parallel-install makes it impossible to blame a specific package
	has parallel-install ${FEATURES} && return

	# The eqatag call is prohibitively expensive if the cache is
	# missing and there are a large number of files.
	if [[ -z ${missing} && ${all_files[@]} ]]; then
		eqawarn "QA Notice: mime-info files were found installed but mime-info"
		eqawarn "cache has not been updated:"
		eqatag -v xdg-utils.mime-info "${all_files[@]/#//}"
		eqawarn "Please make sure to call xdg_mimeinfo_database_update()"
		eqawarn "in pkg_postinst() and pkg_postrm() phases of appropriate pkgs."
	fi
}

xdg_utils_postinst_check() {
	cd "${EROOT:-/}" || die
	xdg_desktop_database_check
	xdg_icon_cache_check
	xdg_mimeinfo_database_check
}

xdg_utils_postinst_check
: # guarantee successful exit

# vim:ft=sh