summaryrefslogtreecommitdiff
path: root/packaging/same-build-result.sh
blob: 2ed5f3e03ac8d5a3b8e9bc21f517f5dee61adcef (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
#!/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