summaryrefslogtreecommitdiff
path: root/packaging/same-build-result.sh
diff options
context:
space:
mode:
authorAnas Nashif <anas.nashif@intel.com>2012-10-30 13:29:09 -0700
committerAnas Nashif <anas.nashif@intel.com>2012-10-30 13:29:09 -0700
commitefbaf9bb0673b446ba40efa8107045987ee367f8 (patch)
tree6579899a46c017a889fa6654aeb78f31c2c42564 /packaging/same-build-result.sh
downloadbuild-compare-efbaf9bb0673b446ba40efa8107045987ee367f8.tar.gz
build-compare-efbaf9bb0673b446ba40efa8107045987ee367f8.tar.bz2
build-compare-efbaf9bb0673b446ba40efa8107045987ee367f8.zip
Diffstat (limited to 'packaging/same-build-result.sh')
-rw-r--r--packaging/same-build-result.sh136
1 files changed, 136 insertions, 0 deletions
diff --git a/packaging/same-build-result.sh b/packaging/same-build-result.sh
new file mode 100644
index 0000000..2ed5f3e
--- /dev/null
+++ b/packaging/same-build-result.sh
@@ -0,0 +1,136 @@
+#!/bin/bash
+#
+# Copyright (c) 2009, 2010, 2012 SUSE Linux Product GmbH, Germany.
+# Licensed under GPL v2, see COPYING file for details.
+#
+# Written by Adrian Schroeter <adrian@suse.de>
+# Enhanced by Andreas Jaeger <aj@suse.de>
+#
+# The script decides if the new build differes from the former one,
+# using rpm-check.sh.
+# The script is called as part of the build process as:
+# /usr/lib/build/same-build-result.sh /.build.oldpackages /usr/src/packages/RPMS /usr/src/packages/SRPMS
+
+CMPSCRIPT=${0%/*}/rpm-check.sh
+SCMPSCRIPT=${0%/*}/srpm-check.sh
+
+check_all=1
+OLDDIR="$1"
+shift
+NEWDIRS="$*"
+
+echo "$CMPSCRIPT"
+
+if [ ! -d "$OLDDIR" ]; then
+ echo "No valid directory with old build result given !"
+ exit 1
+fi
+if [ -z "$NEWDIRS" ]; then
+ echo "No valid directory with new build result given !"
+ exit 1
+fi
+
+if test `find $NEWDIRS -name '*.rpm' -and ! -name '*.delta.rpm' | wc -l` != `find $OLDDIR -name '*.rpm' -and ! -name '*.delta.rpm' | wc -l`; then
+ echo "different number of subpackages"
+ find $OLDDIR $NEWDIRS -name '*.rpm' -and ! -name '*.delta.rpm'
+ exit 1
+fi
+
+osrpm=$(find "$OLDDIR" -name \*src.rpm)
+nsrpm=$(find $NEWDIRS -name \*src.rpm)
+
+if test ! -f "$osrpm"; then
+ echo no old source rpm in $OLDDIR
+ exit 1
+fi
+
+if test ! -f "$nsrpm"; then
+ echo no new source rpm in $NEWDIRS
+ exit 1
+fi
+
+echo "compare $osrpm $nsrpm"
+bash $SCMPSCRIPT "$osrpm" "$nsrpm" || exit 1
+
+# technically we should not all exclude all -32bit but filter for different archs,
+# like done with -x86
+# but it would be better if this script ran earlier in the build
+# sort the rpms so that both lists have the same order
+# problem: a package can contain both noarch and arch subpackages, so we have to
+# take care of proper sorting of NEWRPMS, e.g. noarch/x.rpm and x86_64/w.rpm since OLDRPMS
+# has all the packages in a single directory and would sort this as w.rpm, x.rpm.
+OLDRPMS=($(find "$OLDDIR" -type f -name \*rpm -a ! -name \*src.rpm -a ! -name \*.delta.rpm|sort|grep -v -- -32bit-|grep -v -- -64bit-|grep -v -- '-x86-.*\.ia64\.rpm'))
+NEWRPMS=($(find $NEWDIRS -type f -name \*rpm -a ! -name \*src.rpm -a ! -name \*.delta.rpm|sort --field-separator=/ --key=7|grep -v -- -32bit-|grep -v -- -64bit-|grep -v -- '-x86-.*\.ia64\.rpm'))
+
+# Get release from first RPM and keep for rpmlint check
+# Remember to quote the "." for future regexes
+release1=`rpm -qp --nodigest --nosignature --qf "%{RELEASE}" "${OLDRPMS[0]}"|sed -e 's/\./\\./g'`
+release2=`rpm -qp --nodigest --nosignature --qf "%{RELEASE}" "${NEWRPMS[0]}"|sed -e 's/\./\\./g'`
+
+SUCCESS=1
+rpmqp='rpm -qp --qf %{NAME} --nodigest --nosignature '
+for opac in ${OLDRPMS[*]}; do
+ npac=${NEWRPMS[0]}
+ NEWRPMS=(${NEWRPMS[@]:1}) # shift
+ echo compare "$opac" "$npac"
+ oname=`$rpmqp $opac`
+ nname=`$rpmqp $npac`
+ if test "$oname" != "$nname"; then
+ echo "names differ: $oname $nname"
+ exit 1
+ fi
+ bash $CMPSCRIPT "$opac" "$npac" || SUCCESS=0
+ if test $SUCCESS -eq 0 -a -z "$check_all"; then
+ exit 1
+ fi
+done
+
+if [ -n "${NEWRPMS[0]}" ]; then
+ echo additional new package
+ exit 1
+fi
+
+# Compare rpmlint.log files
+OTHERDIR=/home/abuild/rpmbuild/OTHER
+
+if test -e $OLDDIR/rpmlint.log -a -e $OTHERDIR/rpmlint.log; then
+ file1=`mktemp`
+ file2=`mktemp`
+ echo "comparing $OLDDIR/rpmlint.log and $OTHERDIR/rpmlint.log"
+ # Sort the files first since the order of messages is not deterministic
+ # Remove release from files
+ sort -u $OLDDIR/rpmlint.log|sed -e "s,$release1,@RELEASE@,g" -e "s|/tmp/rpmlint\..*spec|.spec|g" > $file1
+ sort -u $OTHERDIR/rpmlint.log|sed -e "s,$release2,@RELEASE@,g" -e "s|/tmp/rpmlint\..*spec|.spec|g" > $file2
+ if ! cmp -s $file1 $file2; then
+ echo "rpmlint.log files differ:"
+ diff -u $OLDDIR/rpmlint.log $OTHERDIR/rpmlint.log |head -n 20
+ SUCCESS=0
+ fi
+ rm $file1 $file2
+elif test -e $OTHERDIR/rpmlint.log; then
+ echo "rpmlint.log is new"
+ SUCCESS=0
+fi
+
+appdatas=`cd $OTHERDIR && find . -name *-appdata.xml`
+for xml in $appdatas; do
+ # compare appstream data
+ if test -e $OLDDIR/$xml -a -e $OTHERDIR/$xml; then
+ file1=$OLDDIR/$xml
+ file2=$OTHERDIR/$xml
+ if ! cmp -s $file1 $file2; then
+ echo "$xml files differ:"
+ diff -u0 $file1 $file2 |head -n 20
+ SUCCESS=0
+ fi
+ elif test -e $OTHERDIR/$xml; then
+ echo "$xml is new"
+ SUCCESS=0
+ fi
+done
+
+if test $SUCCESS -eq 0; then
+ exit 1
+fi
+echo 'compare validated built as identical !'
+exit 0