commit: f46b89282ff58974bedb6ed29c83cfeab1e5ad4f Author: Florian Schmaus <flow <AT> gentoo <DOT> org> AuthorDate: Mon Aug 1 07:54:22 2022 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Sat Aug 13 17:30:25 2022 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=f46b8928
install-qa-check.d/60pkgconfig: use ver_test to compare versions Motivied by Matthew's question if the version comparision could be improved so that, e.g., 25.0 and 25.0.0 are treated as equal. Note that using ver_test requires that we check the arguments passed to ver_test conform to PMS version strings. If this is not the case, then we fall back to the previous behavior and perform a string comparision. Thanks-to: Matthew Smith <matthew <AT> gentoo.org> Signed-off-by: Florian Schmaus <flow <AT> gentoo.org> Closes: https://github.com/gentoo/portage/pull/882 Signed-off-by: Sam James <sam <AT> gentoo.org> bin/install-qa-check.d/60pkgconfig | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/bin/install-qa-check.d/60pkgconfig b/bin/install-qa-check.d/60pkgconfig index a8e0aa5db..e275e1ee2 100644 --- a/bin/install-qa-check.d/60pkgconfig +++ b/bin/install-qa-check.d/60pkgconfig @@ -103,26 +103,38 @@ pkgconfig_check() { # Skip the check if QA_PKGCONFIG_VERSION is set to empty string. if [[ -n ${QA_PKGCONFIG_VERSION} ]]; then - local all_bad=yes + local pms_ver_re="^([0-9]+(\.[0-9]+)*)([a-z]?)((_(alpha|beta|pre|rc|p)[0-9]*)*)(-r[0-9]+)?$" local -A bad_files + + local is_pms_ver=false + if [[ ${QA_PKGCONFIG_VERSION} =~ ${pms_ver_re} ]] ; then + # Ensure that ver_test is available. + [[ $(type -f ver_test) == function ]] || inherit eapi7-ver + is_pms_ver=true + fi + for f in "${files[@]}" ; do local file_version=$(pkg-config --modversion "${f}") - if [[ ${QA_PKGCONFIG_VERSION} == ${file_version} ]] ; then - all_bad=no - break - fi - - # Record a special value if the .pc file has no version set at all. - if [[ -z ${file_version} ]] ; then + if [[ -n ${file_version} ]] ; then + if ${is_pms_ver} && [[ ${file_version} =~ ${pms_ver_re} ]]; then + # If both versions comply to PMS, then we can use ver_test to compare them. + ver_test ${QA_PKGCONFIG_VERSION} -eq ${file_version} && continue + else + # Otherwise, we resort to string comparision. + [[ ${QA_PKGCONFIG_VERSION} == ${file_version} ]] && continue + fi + else + # Record a special value if the .pc file has no version set at all. file_version="<no-set>" fi + bad_files["${f//${D}}"]="${file_version}" done # Skip result reporting if *_p* because for both _pN and _preN, we # don't generally expect the versions to be exactly accurate, and # we want to avoid false positives. - if [[ ${all_bad} == "yes" && ${PV} != *_p* ]] && ! has live ${PROPERTIES} ; then + if [[ ${#bad_files[@]} -gt 0 && ${PV} != *_p* ]] && ! has live ${PROPERTIES} ; then eqawarn "QA Notice: pkg-config files with mismatched Version found!" eqawarn "The Version field of the following files does not match ${PV}" local bad_file
