diff --git a/common/xbps-src/shutils/consistency_check.sh b/common/xbps-src/shutils/consistency_check.sh new file mode 100644 index 00000000000..0dbb194e46b --- /dev/null +++ b/common/xbps-src/shutils/consistency_check.sh @@ -0,0 +1,79 @@ +# vim: set ts=4 sw=4 et: + +consistency_check_existing () { + while IFS=" " read -r dep origname deplabel; do + [ -f "$XBPS_SRCPKGDIR/$dep/template" ] && continue + case "$deplabel" in + makedepends|hostmakedepends) + msg_warn "unsatisfied $deplabel in $origname: $dep does not exist\n"; + ;; + *) printf "%s %s %s\n" "$dep" "$origname" "$deplabel" ;; + esac + done +} + +consistency_convert_pkgname () { + local origname= pkgname version= revision= + while IFS=" " read -r dep origname deplabel; do + case "$deplabel" in + makedepends|hostmakedepends) + printf "%s %s %s\n" "$dep" "$origname" "$deplabel" + continue + ;; + esac + case "$dep" in + *\<*|*\>*|*=*) + printf "%s %s %s\n" "$dep" "$origname" "$deplabel" + continue + ;; + esac + if pkgname=$(xbps-uhelper getpkgname "$dep" 2> /dev/null) && \ + version=$(xbps-uhelper getpkgversion "$dep" 2> /dev/null) && \ + revision=$(xbps-uhelper getpkgrevision "$dep" 2> /dev/null); then + printf "%s %s %s\n" "${pkgname}>=${version}_${revision}" "$origname" "$deplabel" + else + printf "%s %s %s\n" "$dep>=0" "$origname" "$deplabel" + fi + done +} + +consistency_check_smart () { + local pkgname= depdef= dep= + while IFS=" " read -r depdef origname deplabel; do + case "$deplabel" in + makedepends|hostmakedepends) + printf "%s %s %s\n" "$depdef" "$origname" "$deplabel" + continue + ;; + esac + + dep=$(xbps-uhelper getpkgdepname "$depdef") + + if [ ! -f "$XBPS_SRCPKGDIR/$dep/template" ]; then + msg_warn "unsatisfied $deplabel in $origname: $dep does not exist\n"; + continue + fi + ( + XBPS_TARGET_PKG=$dep + read_pkg + xbps-uhelper pkgmatch "$depdef" "${pkgname}-${version}_${revision}" && continue + msg_red "unsatisfied $deplabel in $origname: $dep is $version, but required is $depdef\n"; + ) + done +} + +consistency_check() { + local pkg= pkgname= + for pkg in "$XBPS_SRCPKGDIR"/*/template; do + XBPS_TARGET_PKG=$(basename $(dirname $pkg)) + ( + read_pkg + [ "$depends" ] && printf "%s $pkgname depends\n" $depends + [ "$conflicts" ] && printf "%s $pkgname conflicts\n" $conflicts + [ -L "$XBPS_SRCPKGDIR/$XBPS_TARGET_PKG" ] && continue + [ "$makedepends" ] && printf "%s $pkgname makedepends\n" $makedepends + [ "$hostmakedepends" ] && printf "%s $pkgname hostmakedepends\n" $hostmakedepends + ) + done | grep -v "^virtual?" | sed "s/^[^ ]*?//" | consistency_check_existing | \ + consistency_convert_pkgname | consistency_check_smart +} diff --git a/xbps-src b/xbps-src index 4747076800c..3e38212c8fb 100755 --- a/xbps-src +++ b/xbps-src @@ -30,6 +30,9 @@ bootstrap-update build Build package source (fetch + extract + configure + build). +consistency-check + Runs a consistency check on all packages + chroot Enter to the chroot in . @@ -677,6 +680,9 @@ case "$XBPS_TARGET" in remove_pkg $XBPS_CROSS_BUILD fi ;; + consistency-check) + consistency_check + ;; remove-autodeps) if [ -n "$CHROOT_READY" -a -z "$IN_CHROOT" ]; then chroot_handler remove-autodeps