# 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
