diff options
author | Randy Witt <randy.e.witt@linux.intel.com> | 2015-02-11 16:24:12 -0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-02-14 22:26:11 +0000 |
commit | 48387f0c0c4cccc8bc89afd121b7d8315475964a (patch) | |
tree | 3cab39f4d1b95673362f517f87a1f68934f4ed19 /meta/recipes-devtools | |
parent | 1fc671938b2389866fb4a36801698caf4e92e05d (diff) | |
download | openembedded-core-48387f0c0c4cccc8bc89afd121b7d8315475964a.tar.gz openembedded-core-48387f0c0c4cccc8bc89afd121b7d8315475964a.tar.bz2 openembedded-core-48387f0c0c4cccc8bc89afd121b7d8315475964a.zip |
build-compare: Add the build-compare_git.bb recipe.
The description for build-compare describes it as "This package contains
scripts to find out if the build result differs to a former build." More
specifically this contains a script that will display differences between
"packages." It works with rpms, tarballs and other various types of
packages.
The idea is that it will eventually be used in Yocto to check for differences
between sstate so that we can check for build reproducibility. It will
also be used once an updateable sdk is in place, so that packages that
have different hashes but are not different in contents, don't get updated.
It could also be used in the same manner when updating packages from a
package feed.
[Yocto #6992]
Signed-off-by: Randy Witt <randy.e.witt@linux.intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Diffstat (limited to 'meta/recipes-devtools')
3 files changed, 1663 insertions, 0 deletions
diff --git a/meta/recipes-devtools/build-compare/build-compare_git.bb b/meta/recipes-devtools/build-compare/build-compare_git.bb new file mode 100644 index 0000000000..418aee0d5e --- /dev/null +++ b/meta/recipes-devtools/build-compare/build-compare_git.bb @@ -0,0 +1,27 @@ +SUMMARY = "Build Result Compare Script" +DESCRIPTION = "This package contains scripts to find out if the build result\ +differs to a former build." +HOMEPAGE = "https://github.com/openSUSE/build-compare" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe" + +SRC_URI = "git://github.com/openSUSE/build-compare.git" +SRC_URI += "file://Rename-rpm-check.sh-to-pkg-diff.sh.patch;striplevel=1" +SRC_URI += "file://Ignore-DWARF-sections.patch;striplevel=1" +PATCHTOOL = "git" + +SRCREV = "c5352c054c6ef15735da31b76d6d88620f4aff0a" + +S = "${WORKDIR}/git" + +BBCLASSEXTEND += "native nativesdk" + +do_install() { + install -d ${D}/${bindir} + install -m 755 functions.sh ${D}/${bindir} + install -m 755 pkg-diff.sh ${D}/${bindir} + install -m 755 same-build-result.sh ${D}/${bindir} + install -m 755 srpm-check.sh ${D}/${bindir} +} + +RDEPENDS_${PN} += "bash" diff --git a/meta/recipes-devtools/build-compare/files/Ignore-DWARF-sections.patch b/meta/recipes-devtools/build-compare/files/Ignore-DWARF-sections.patch new file mode 100644 index 0000000000..7dda1acbf2 --- /dev/null +++ b/meta/recipes-devtools/build-compare/files/Ignore-DWARF-sections.patch @@ -0,0 +1,40 @@ +From 015715694eadd714b903f30ade876e0738d44974 Mon Sep 17 00:00:00 2001 +From: Randy Witt <randy.e.witt@linux.intel.com> +Date: Mon, 5 Jan 2015 15:09:20 -0800 +Subject: [PATCH] Ignore DWARF sections. + +Assume for now that we don't care about the DWARF sections due to path +differences. However, in the case the tool is ran on a "debug" package +it will most likely falsely say the packages have no differences. + +Upstream-Status: Inappropriate [other] + +The package difference tool is correctly labelling the packages as different +when the DWARF sections don't match due to paths. The paths in the debug info +should actually be made to be the same using compile flags or some other +mechanism. + +However, to make the tool more useful to Yocto until the work can be done +to ensure identical paths in debug sections, this patch is being applied. + +Signed-off-by: Randy Witt <randy.e.witt@linux.intel.com> +--- + pkg-diff.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/pkg-diff.sh b/pkg-diff.sh +index 56035c1..0f1fa76 100755 +--- a/pkg-diff.sh ++++ b/pkg-diff.sh +@@ -658,7 +658,7 @@ check_single_file() + echo "" >$file1 + echo "" >$file2 + # Don't compare .build-id and .gnu_debuglink sections +- sections="$(objdump -s new/$file | grep "Contents of section .*:" | sed -r "s,.* (.*):,\1,g" | grep -v -e "\.build-id" -e "\.gnu_debuglink" | tr "\n" " ")" ++ sections="$(objdump -s new/$file | grep "Contents of section .*:" | sed -r "s,.* (.*):,\1,g" | grep -v -e "\.build-id" -e "\.gnu_debuglink" -e "\.debug_abbrev" -e "\.debug_aranges" -e "\.debug_frame" -e "\.debug_info" -e "\.debug_line" -e "\.debug_loc" -e "\.debug_macinfo" -e "\.debug_pubnames" -e "\.debug_pubtypes" -e "\.debug_ranges" -e "\.debug_str" | tr "\n" " ")" + for section in $sections; do + objdump -s -j $section old/$file | sed "s,^old/,," > $file1 + objdump -s -j $section new/$file | sed "s,^new/,," > $file2 +-- +1.9.3 + diff --git a/meta/recipes-devtools/build-compare/files/Rename-rpm-check.sh-to-pkg-diff.sh.patch b/meta/recipes-devtools/build-compare/files/Rename-rpm-check.sh-to-pkg-diff.sh.patch new file mode 100644 index 0000000000..3e1e679a9c --- /dev/null +++ b/meta/recipes-devtools/build-compare/files/Rename-rpm-check.sh-to-pkg-diff.sh.patch @@ -0,0 +1,1596 @@ +From f5db896b7f49b56dad0d51c9bdb3d4c9525edab2 Mon Sep 17 00:00:00 2001 +From: Randy Witt <randy.e.witt@linux.intel.com> +Date: Mon, 5 Jan 2015 15:58:35 -0800 +Subject: [PATCH] Rename rpm-check.sh to pkg-diff.sh. + +The tool now accepts package input other than rpm, so change the name +which could be misleading. + +Upstream-Status: Submitted [https://github.com/openSUSE/build-compare/pulls] + +Signed-off-by: Randy Witt <randy.e.witt@linux.intel.com> +--- + build-compare.spec | 2 +- + pkg-diff.sh | 765 +++++++++++++++++++++++++++++++++++++++++++++++++++ + rpm-check.sh | 765 --------------------------------------------------- + same-build-result.sh | 4 +- + 4 files changed, 768 insertions(+), 768 deletions(-) + create mode 100755 pkg-diff.sh + delete mode 100755 rpm-check.sh + +diff --git a/build-compare.spec b/build-compare.spec +index 14a97e9..5f47ca1 100644 +--- a/build-compare.spec ++++ b/build-compare.spec +@@ -25,7 +25,7 @@ Version: 2015.02.10 + Release: 0 + Source1: COPYING + Source2: same-build-result.sh +-Source3: rpm-check.sh ++Source3: pkg-diff.sh + Source4: functions.sh + Source5: srpm-check.sh + BuildRoot: %{_tmppath}/%{name}-%{version}-build +diff --git a/pkg-diff.sh b/pkg-diff.sh +new file mode 100755 +index 0000000..56035c1 +--- /dev/null ++++ b/pkg-diff.sh +@@ -0,0 +1,765 @@ ++#! /bin/bash ++# ++# Copyright (c) 2009, 2010, 2011, 2012 SUSE Linux Product GmbH, Germany. ++# Licensed under GPL v2, see COPYING file for details. ++# ++# Written by Michael Matz and Stephan Coolo ++# Enhanced by Andreas Jaeger ++ ++FUNCTIONS=${0%/*}/functions.sh ++ ++check_all= ++case $1 in ++ -a | --check-all) ++ check_all=1 ++ shift ++esac ++ ++if test "$#" != 2; then ++ echo "usage: $0 [-a|--check-all] old.rpm new.rpm" ++ exit 1 ++fi ++ ++self_script=$(cd $(dirname $0); echo $(pwd)/$(basename $0)) ++ ++source $FUNCTIONS ++ ++oldpkg=`readlink -f $1` ++newpkg=`readlink -f $2` ++rename_script=`mktemp` ++ ++if test ! -f "$oldpkg"; then ++ echo "can't open $1" ++ exit 1 ++fi ++ ++if test ! -f "$newpkg"; then ++ echo "can't open $2" ++ exit 1 ++fi ++ ++#usage unjar <file> ++function unjar() ++{ ++ local file ++ file=$1 ++ ++ if [[ $(type -p fastjar) ]]; then ++ UNJAR=fastjar ++ elif [[ $(type -p jar) ]]; then ++ UNJAR=jar ++ elif [[ $(type -p unzip) ]]; then ++ UNJAR=unzip ++ else ++ echo "ERROR: jar, fastjar, or unzip is not installed (trying file $file)" ++ exit 1 ++ fi ++ ++ case $UNJAR in ++ jar|fastjar) ++ # echo jar -xf $file ++ ${UNJAR} -xf $file ++ ;; ++ unzip) ++ unzip -oqq $file ++ ;; ++ esac ++} ++ ++# list files in directory ++#usage unjar_l <file> ++function unjar_l() ++{ ++ local file ++ file=$1 ++ ++ if [[ $(type -p fastjar) ]]; then ++ UNJAR=fastjar ++ elif [[ $(type -p jar) ]]; then ++ UNJAR=jar ++ elif [[ $(type -p unzip) ]]; then ++ UNJAR=unzip ++ else ++ echo "ERROR: jar, fastjar, or unzip is not installed (trying file $file)" ++ exit 1 ++ fi ++ ++ case $UNJAR in ++ jar|fastjar) ++ ${UNJAR} -tf $file ++ ;; ++ unzip) ++ unzip -l $file ++ ;; ++ esac ++} ++ ++filter_disasm() ++{ ++ sed -e 's/^ *[0-9a-f]\+://' -e 's/\$0x[0-9a-f]\+/$something/' -e 's/callq *[0-9a-f]\+/callq /' -e 's/# *[0-9a-f]\+/# /' -e 's/\(0x\)\?[0-9a-f]\+(/offset(/' -e 's/[0-9a-f]\+ </</' -e 's/^<\(.*\)>:/\1:/' -e 's/<\(.*\)+0x[0-9a-f]\+>/<\1 + ofs>/' ++} ++ ++echo "Comparing `basename $oldpkg` to `basename $newpkg`" ++ ++case $oldpkg in ++ *.rpm) ++ cmp_spec $rename_script $oldpkg $newpkg ++ RES=$? ++ case $RES in ++ 0) ++ echo "RPM meta information is identical" ++ if test -z "$check_all"; then ++ exit 0 ++ fi ++ ;; ++ 1) ++ echo "RPM meta information is different" ++ if test -z "$check_all"; then ++ exit 1 ++ fi ++ ;; ++ 2) ++ echo "RPM file checksum differs." ++ RES=0 ++ ;; ++ *) ++ echo "Wrong exit code!" ++ exit 1 ++ ;; ++ esac ++ ;; ++esac ++ ++file1=`mktemp` ++file2=`mktemp` ++ ++dir=`mktemp -d` ++echo "Extracting packages" ++unpackage $oldpkg $dir/old ++unpackage $newpkg $dir/new ++ ++# files is set in cmp_spec for rpms, so if RES is empty we should assume ++# it wasn't an rpm and pick all files for comparison. ++if [ -z $RES ]; then ++ oldfiles=`cd $dir/old; find . -type f` ++ newfiles=`cd $dir/new; find . -type f` ++ ++ files=`echo -e "$oldfiles\n$newfiles" | sort -u` ++fi ++ ++cd $dir ++bash $rename_script ++ ++dfile=`mktemp` ++ ++diff_two_files() ++{ ++ if ! cmp -s old/$file new/$file; then ++ echo "$file differs ($ftype)" ++ hexdump -C old/$file > $file1 ++ hexdump -C new/$file > $file2 ++ diff -u $file1 $file2 | head -n 200 ++ return 1 ++ fi ++ return 0 ++} ++ ++trim_man_first_line() ++{ ++ # Handles the first line if it is like: ++ #.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.28) ++ #.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.43.3. ++ local f=$1 ++ sed -i -e '1{ ++ s|^\.\\"[[:blank:]]\+Automatically[[:blank:]]generated[[:blank:]]by[[:blank:]]Pod::Man[[:blank:]].*|.\\" Overly verbose Pod::Man| ++ s|^\.\\"[[:blank:]]\+DO[[:blank:]]NOT[[:blank:]]MODIFY[[:blank:]]THIS[[:blank:]]FILE![[:blank:]]\+It[[:blank:]]was[[:blank:]]generated[[:blank:]]by[[:blank:]]help2man[[:blank:]].*|.\\" Overly verbose help2man| ++ }' $f ++} ++ ++trim_man_TH() ++{ ++ # Handles lines like: ++ # .TH debhelper 7 "2010-02-27" "7.4.15" "Debhelper" ++ # .TH DIRMNGR-CLIENT 1 2010-02-27 "Dirmngr 1.0.3" "GNU Privacy Guard" ++ # .TH ccmake 1 "March 06, 2010" "ccmake 2.8.1-rc3" ++ # .TH QEMU-IMG 1 "2010-03-14" " " " " ++ # .TH kdecmake 1 "May 07, 2010" "cmake 2.8.1" ++ # .TH "appender.h" 3 "12 May 2010" "Version 1.2.1" "log4c" \" -*- nroff -*- ++ # .TH "appender.h" 3 "Tue Aug 31 2010" "Version 1.2.1" "log4c" \" -*- nroff -*- ++ # .TH "OFFLINEIMAP" "1" "11 May 2010" "John Goerzen" "OfflineIMAP Manual" ++ # .TH gv 3guile "13 May 2010" ++ #.TH "GIT\-ARCHIMPORT" "1" "09/13/2010" "Git 1\&.7\&.1" "Git Manual" ++ # .TH LDIRECTORD 8 "2010-10-20" "perl v5.12.2" "User Contributed Perl Documentation" ++ # .TH ccmake 1 "February 05, 2012" "ccmake 2.8.7" ++ # .TH "appender.h" 3 "Tue Aug 31 2010" "Version 1.2.1" "log4c" \" -*- nroff -*- ++ # .TH ARCH "1" "September 2010" "GNU coreutils 8.5" "User Commands" ++ # .TH "GCM-CALIBRATE" "1" "03 February 2012" "" "" ++ #.TH Locale::Po4a::Xml.pm 3pm "2015-01-30" "Po4a Tools" "Po4a Tools" ++ local f=$1 ++ # (.TH quoted section) (quoted_date)(*) ++ sed -i -e 's|^\([[:blank:]]*\.TH[[:blank:]]\+"[^"]\+"[[:blank:]]\+[^[:blank:]]\+\)[[:blank:]]\+\("[^"]\+"\)\([[:blank:]]\+.*\)\?|\1 "qq2000-01-01"\3|' $f ++ # (.TH unquoted section) (quoted_date)(*) ++ sed -i -e 's|^\([[:blank:]]*\.TH[[:blank:]]\+[^"][^[:blank:]]\+[[:blank:]]\+[^[:blank:]]\+\)[[:blank:]]\+\("[^"]\+"\)\([[:blank:]]\+.*\)\?|\1 "uq2000-02-02"\3|' $f ++ # (.TH quoted section) (unquoted_date)(*) ++ sed -i -e 's|^\([[:blank:]]*\.TH[[:blank:]]\+"[^"]\+"[[:blank:]]\+[^[:blank:]]\+\)[[:blank:]]\+\([^"][^[:blank:]]\+\)\([[:blank:]]\+.*\)\?|\1 qu2000-03-03\3|' $f ++ # (.TH unquoted section) (unquoted_date)(*) ++ sed -i -e 's|^\([[:blank:]]*\.TH[[:blank:]]\+[^"][^[:blank:]]\+[[:blank:]]\+[^[:blank:]]\+\)[[:blank:]]\+\([^"][^[:blank:]]\+\)\([[:blank:]]\+.*\)\?|\1 uu2000-04-04\3|' $f ++} ++ ++strip_numbered_anchors() ++{ ++ # Remove numbered anchors on Docbook / HTML files. ++ # This should be save since we remove them from old and new files. ++ # A trailing </a> or </div> tag will stay also on both files. ++ for f in old/$file new/$file; do ++ sed -i -e 's%<[ ]*a[ ]\+name[^<]*[0-9]\+[^<]*%%g' \ ++ -e 's%<[ ]*a[ ]\+href[^<]*#[^<]*[0-9]\+[^<]*%%g' \ ++ -e 's%<[^<]*id="ftn\.[^<]*[0-9]\+[^<]*%%g' $f ++ done ++} ++ ++ ++check_compressed_file() ++{ ++ local file=$1 ++ local ext=$2 ++ local tmpdir=`mktemp -d` ++ local ftype ++ local ret=0 ++ echo "$ext file with odd filename: $file" ++ if test -n "$tmpdir"; then ++ mkdir $tmpdir/{old,new} ++ cp --parents --dereference old/$file $tmpdir/ ++ cp --parents --dereference new/$file $tmpdir/ ++ if pushd $tmpdir > /dev/null ; then ++ case "$ext" in ++ bz2) ++ mv old/$file{,.bz2} ++ mv new/$file{,.bz2} ++ bzip2 -d old/$file.bz2 ++ bzip2 -d new/$file.bz2 ++ ;; ++ gzip) ++ mv old/$file{,.gz} ++ mv new/$file{,.gz} ++ gzip -d old/$file.gz ++ gzip -d new/$file.gz ++ ;; ++ xz) ++ mv old/$file{,.xz} ++ mv new/$file{,.xz} ++ xz -d old/$file.xz ++ xz -d new/$file.xz ++ ;; ++ esac ++ ftype=`/usr/bin/file old/$file | sed 's@^[^:]\+:[[:blank:]]*@@'` ++ case $ftype in ++ POSIX\ tar\ archive) ++ echo "$ext content is: $ftype" ++ mv old/$file{,.tar} ++ mv new/$file{,.tar} ++ if ! check_single_file ${file}.tar; then ++ ret=1 ++ fi ++ ;; ++ ASCII\ cpio\ archive\ *) ++ echo "$ext content is: $ftype" ++ mv old/$file{,.cpio} ++ mv new/$file{,.cpio} ++ if ! check_single_file ${file}.cpio; then ++ ret=1 ++ fi ++ ;; ++ *) ++ echo "unhandled $ext content: $ftype" ++ if ! diff_two_files; then ++ ret=1 ++ fi ++ ;; ++ esac ++ popd > /dev/null ++ fi ++ rm -rf "$tmpdir" ++ fi ++ return $ret ++} ++ ++check_single_file() ++{ ++ local file="$1" ++ case $file in ++ *.spec) ++ sed -i -e "s,Release:.*$release1,Release: @RELEASE@," old/$file ++ sed -i -e "s,Release:.*$release2,Release: @RELEASE@," new/$file ++ ;; ++ *.exe.mdb|*.dll.mdb) ++ # Just debug information, we can skip them ++ echo "$file skipped as debug file." ++ return 0 ++ ;; ++ *.a) ++ flist=`ar t new/$file` ++ pwd=$PWD ++ fdir=`dirname $file` ++ cd old/$fdir ++ ar x `basename $file` ++ cd $pwd/new/$fdir ++ ar x `basename $file` ++ cd $pwd ++ for f in $flist; do ++ if ! check_single_file $fdir/$f; then ++ return 1 ++ fi ++ done ++ return 0 ++ ;; ++ *.cpio) ++ flist=`cpio --quiet --list --force-local < "new/$file"` ++ pwd=$PWD ++ fdir=$file.extract.$PPID.$$ ++ mkdir old/$fdir new/$fdir ++ cd old/$fdir ++ cpio --quiet --extract --force-local < "../${file##*/}" ++ cd $pwd/new/$fdir ++ cpio --quiet --extract --force-local < "../${file##*/}" ++ cd $pwd ++ local ret=0 ++ for f in $flist; do ++ if ! check_single_file $fdir/$f; then ++ ret=1 ++ if test -z "$check_all"; then ++ break ++ fi ++ fi ++ done ++ rm -rf old/$fdir new/$fdir ++ return $ret ++ ;; ++ *.tar|*.tar.bz2|*.tar.gz|*.tgz|*.tbz2) ++ flist=`tar tf new/$file` ++ pwd=$PWD ++ fdir=`dirname $file` ++ cd old/$fdir ++ tar xf `basename $file` ++ cd $pwd/new/$fdir ++ tar xf `basename $file` ++ cd $pwd ++ local ret=0 ++ for f in $flist; do ++ if ! check_single_file $fdir/$f; then ++ ret=1 ++ if test -z "$check_all"; then ++ break ++ fi ++ fi ++ done ++ return $ret ++ ;; ++ *.zip|*.jar|*.war) ++ cd old ++ unjar_l ./$file |sort > flist ++ # 10-05-2010 14:39 ++ sed -i -e "s, [0-9][0-9]-[0-9][0-9]-[0-9]\+ [0-9][0-9]:[0-9][0-9] , date ," flist ++ # 2012-02-03 07:59 ++ sed -i -e "s, 20[0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9] , date ," flist ++ cd ../new ++ unjar_l ./$file |sort> flist ++ sed -i -e "s, [0-9][0-9]-[0-9][0-9]-[0-9]\+ [0-9][0-9]:[0-9][0-9] , date ,; " flist ++ sed -i -e "s, 20[0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9] , date ," flist ++ cd .. ++ if ! cmp -s old/flist new/flist; then ++ echo "$file has different file list" ++ diff -u old/flist new/flist ++ return 1 ++ fi ++ flist=`grep date new/flist | sed -e 's,.* date ,,'` ++ pwd=$PWD ++ fdir=`dirname $file` ++ cd old/$fdir ++ unjar `basename $file` ++ cd $pwd/new/$fdir ++ unjar `basename $file` ++ cd $pwd ++ local ret=0 ++ for f in $flist; do ++ if test -f new/$fdir/$f && ! check_single_file $fdir/$f; then ++ ret=1 ++ if test -z "$check_all"; then ++ break ++ fi ++ fi ++ done ++ return $ret;; ++ *.pyc|*.pyo) ++ perl -e "open fh, '+<', 'old/$file'; seek fh, 4, SEEK_SET; print fh '0000';" ++ perl -e "open fh, '+<', 'new/$file'; seek fh, 4, SEEK_SET; print fh '0000';" ++ ;; ++ *.bz2) ++ bunzip2 -c old/$file > old/${file/.bz2/} ++ bunzip2 -c new/$file > new/${file/.bz2/} ++ check_single_file ${file/.bz2/} ++ return $? ++ ;; ++ *.gz) ++ gunzip -c old/$file > old/${file/.gz/} ++ gunzip -c new/$file > new/${file/.gz/} ++ check_single_file ${file/.gz/} ++ return $? ++ ;; ++ *.rpm) ++ $self_script -a old/$file new/$file ++ return $? ++ ;; ++ *png) ++ # Try to remove timestamps, only if convert from ImageMagick is installed ++ if [[ $(type -p convert) ]]; then ++ convert old/$file +set date:create +set date:modify old/${file/.png/_n.png} ++ convert old/$file +set date:create +set date:modify new/${file/.png/_n.png} ++ if ! cmp -s old/${file/.png/_n.png} new/${file/.png/_n.png}; then ++ echo "$file differs ($ftype)" ++ hexdump -C old/${file/.png/_n.png} > $file1 ++ hexdump -C new/${file/.png/_n.png} > $file2 ++ diff -u $file1 $file2 | head -n 20 ++ return 1 ++ fi ++ return 0 ++ fi ++ ;; ++ /usr/share/locale/*/LC_MESSAGES/*.mo|/usr/share/locale-bundle/*/LC_MESSAGES/*.mo) ++ for f in old/$file new/$file; do ++ sed -i -e "s,POT-Creation-Date: ....-..-.. ..:..+....,POT-Creation-Date: 1970-01-01 00:00+0000," $f ++ done ++ ;; ++ /usr/share/doc/packages/*/*.html|\ ++ /usr/share/doc/kde/HTML/*/*/*.html|/usr/share/doc/*/html/*.html) ++ for f in old/$file new/$file; do ++ # texi2html output, e.g. in kvm, indent, qemu ++ sed -i -e "s|^<!-- Created on .*, 20.. by texi2html .\...|<!-- Created on August 7, 2009 by texi2html 1.82|" $f ++ sed -i -e 's|^ *This document was generated by <em>Autobuild</em> on <em>.*, 20..</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html .\...</em></a>.$| This document was generated by <em>Autobuild</em> on <em>August 7, 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.|' $f ++ # doxygen docu, e.g. in libssh and log4c ++ sed -i -e 's|Generated on ... ... [0-9]* [0-9]*:[0-9][0-9]:[0-9][0-9] 20[0-9][0-9] for |Generated on Mon May 10 20:45:00 2010 for |' $f ++ # Generated on Sat Aug 14 2010 16:49:48 for libssh ++ sed -i -e 's|Generated on ... ... [0-9]* 20[0-9][0-9] [0-9]*:[0-9][0-9]:[0-9][0-9] for |Generated on Mon May 10 20:45:00 2010 for |' $f ++ done ++ strip_numbered_anchors ++ ;; ++ /usr/share/javadoc/*.html |\ ++ /usr/share/javadoc/*/*.html|/usr/share/javadoc/*/*/*.html) ++ strip_numbered_anchors ++ # There are more timestamps in html, so far we handle only some primitive versions. ++ for f in old/$file new/$file; do ++ # Javadoc: ++ # <head> ++ # <!-- Generated by javadoc (version 1.7.0_75) on Tue Feb 03 02:20:12 GMT 2015 --> ++ # <!-- Generated by javadoc on Tue Feb 03 00:02:48 GMT 2015 --> ++ # <meta name="date" content="2015-02-03"> ++ # </head> ++ sed -i -e ' ++ /^<head>/{ ++ : next ++ n ++ /^<\/head>/{ ++ b end_head ++ } ++ s/^\(<!-- Generated by javadoc\) \((\(build\|version\) [0-9._]\+) on ... ... .. ..:..:.. \(GMT\|UTC\) ....\) \(-->\)/\1 some-date-removed-by-build-compare \5/ ++ t next ++ s/^\(<!-- Generated by javadoc\) \(on ... ... .. ..:..:.. \(GMT\|UTC\) ....\) \(-->\)/\1 some-date-removed-by-build-compare \3/ ++ t next ++ s/^<meta name="date" content="[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}">/<meta name="date" content="some-date-removed-by-build-compare">/ ++ b next ++ } ++ : end_head ++ ' $f ++ # Gjdoc HtmlDoclet: ++ sed -i -e 's%Generated by Gjdoc HtmlDoclet [0-9,.]*, part of <a href="http://www.gnu.org/software/classpath/cp-tools/" title="" target="_top">GNU Classpath Tools</a>, on .*, 20.. [0-9]*:..:.. \(a\|p\)\.m\. GMT.%Generated by Gjdoc.%' $f ++ sed -i -e 's%<!DOCTYPE html PUBLIC "-//gnu.org///DTD XHTML 1.1 plus Target 1.0//EN"\(.*\)GNU Classpath Tools</a>, on [A-Z][a-z]* [0-9]*, 20?? [0-9]*:??:?? \(a|p\)\.m\. GMT.</p>%<!DOCTYPE html PUBLIC "-//gnu.org///DTD XHTML 1.1 plus Target 1.0//EN"\1GNU Classpath Tools</a>, on January 1, 2009 0:00:00 a.m. GMT.</p>%' $f ++ sed -i -e 's%<!DOCTYPE html PUBLIC "-//gnu.org///DTD\(.*GNU Classpath Tools</a>\), on [a-zA-Z]* [0-9][0-9], 20.. [0-9]*:..:.. \(a\|p\)\.m\. GMT.</p>%<!DOCTYPE html PUBLIC "-//gnu.org///DTD\1,on May 1, 2010 1:11:42 p.m. GMT.</p>%' $f ++ # deprecated-list is randomly ordered, sort it for comparison ++ case $f in ++ */deprecated-list.html) ++ sort -o $f $f ++ ;; ++ esac ++ done ++ ;; ++ /usr/share/javadoc/gjdoc.properties |\ ++ /usr/share/javadoc/*/gjdoc.properties) ++ for f in old/$file new/$file; do ++ sed -i -e 's|^#[A-Z][a-z]\{2\} [A-Z][a-z]\{2\} [0-9]\{2\} ..:..:.. GMT 20..$|#Fri Jan 01 11:27:36 GMT 2009|' $f ++ done ++ ;; ++ */fonts.scale|*/fonts.dir|*/encodings.dir) ++ for f in old/$file new/$file; do ++ # sort files before comparing ++ sort -o $f $f ++ done ++ ;; ++ /var/adm/perl-modules/*) ++ for f in old/$file new/$file; do ++ sed -i -e 's|^=head2 ... ... .. ..:..:.. ....: C<Module>|=head2 Wed Jul 1 00:00:00 2009: C<Module>|' $f ++ done ++ ;; ++ /usr/share/man/man3/*3pm) ++ for f in old/$file new/$file; do ++ sed -i -e 's| 3 "20..-..-.." "perl v5....." "User Contributed Perl Documentation"$| 3 "2009-01-01" "perl v5.10.0" "User Contributed Perl Documentation"|' $f ++ trim_man_TH $f ++ trim_man_first_line $f ++ done ++ ;; ++ /usr/share/man/*/man*|/usr/share/man/man*|/usr/lib/texmf/doc/man/*/*) ++ ++ for f in old/$file new/$file; do ++ trim_man_TH $f ++ trim_man_first_line $f ++ # generated by docbook xml: ++ #.\" Date: 09/13/2010 ++ sed -i -e 's|Date: [0-1][0-9]/[0-9][0-9]/201[0-9]|Date: 09/13/2010|' $f ++ done ++ ;; ++ *.elc) ++ # emacs lisp files ++ for f in old/$file new/$file; do ++ sed -i -e 's|Compiled by abuild@.* on ... ... .. ..:..:.. 20..$|compiled by abuild@buildhost on Wed Jul 01 00:00:00 2009|' $f ++ done ++ ;; ++ /var/lib/texmf/web2c/*/*fmt |\ ++ /var/lib/texmf/web2c/metafont/*.base|\ ++ /var/lib/texmf/web2c/metapost/*.mem) ++ # binary dump of TeX and Metafont formats, we can ignore them for good ++ echo "difference in $file ignored." ++ return 0 ++ ;; ++ */libtool) ++ for f in old/$file new/$file; do ++ sed -i -e 's|^# Libtool was configured on host [A-Za-z0-9]*:$|# Libtool was configured on host x42:|' $f ++ done ++ ;; ++ /etc/mail/*cf|/etc/sendmail.cf) ++ # from sendmail package ++ for f in old/$file new/$file; do ++ # - ##### built by abuild@build33 on Thu May 6 11:21:17 UTC 2010 ++ sed -i -e 's|built by abuild@[a-z0-9]* on ... ... [0-9]* [0-9]*:[0-9][0-9]:[0-9][0-9] .* 20[0-9][0-9]|built by abuild@build42 on Thu May 6 11:21:17 UTC 2010|' $f ++ done ++ ;; ++ /usr/share/doc/kde/HTML/*/*/index.cache|/usr/share/doc/kde/HTML/*/*/*/index.cache|\ ++ /usr/share/gtk-doc/html/*/*.html|/usr/share/gtk-doc/html/*/*.devhelp2) ++ # various kde and gtk packages ++ strip_numbered_anchors ++ ;; ++ */created.rid) ++ # ruby documentation ++ # file just contains a timestamp and nothing else, so ignore it ++ echo "Ignore $file" ++ return 0 ++ ;; ++ */rdoc/files/*.html) ++ # ruby documentation ++ # <td>Mon Sep 20 19:02:43 +0000 2010</td> ++ for f in old/$file new/$file; do ++ sed -i -e 's%<td>[A-Z][a-z][a-z] [A-Z][a-z][a-z] [0-9]\+ [0-9]\+:[0-9]\+:[0-9]\+ +0000 201[0-9]</td>%<td>Mon Sep 20 19:02:43 +0000 2010</td>%g' $f ++ done ++ strip_numbered_anchors ++ ;; ++ */Linux*Env.Set.sh) ++ # LibreOffice files, contains: ++ # Generated on: Mon Apr 18 13:19:22 UTC 2011 ++ for f in old/$file new/$file; do ++ sed -i -e 's%^# Generated on:.*UTC 201[0-9] *$%# Generated on: Sometime%g' $f ++ done ++ ;; ++ /usr/lib/libreoffice/solver/inc/*/deliver.log) ++ # LibreOffice log file ++ echo "Ignore $file" ++ return 0 ++ ;; ++ /var/adm/update-messages/*|/var/adm/update-scripts/*) ++ # encode version-release inside ++ oldfn=`echo "$file"|sed -e s/-$release2/-$release1/;` ++ ++ # fetchmsttfonts embeds the release number in the update shell script. ++ echo sed -i -e "s/-$release1/-$release2/g;" "old/$oldfn" ++ sed -i -e "s/-$release1/-$release2/g;" "old/$oldfn" ++ ++ if ! diff -u old/$oldfn new/$file; then ++ echo "$oldfn is not same as $file" ++ return 1 ++ fi ++ echo "$file and $oldfn are same" ++ return 0 ++ ;; ++ *.ps) ++ for f in "old/$file" "new/$file"; do ++ sed -i -e ' ++ /^%%CreationDate:[[:blank:]]/d ++ /^%%Creator:[[:blank:]]groff[[:blank:]]version[[:blank:]]/d ++ /^%DVIPSSource:[[:blank:]]/d ++ ' "$f" ++ done ++ ;; ++ *pdf) ++ # PDF files contain a unique ID, remove it ++ # Format of the ID is: ++ # /ID [<9ACE247A70CF9BEAFEE15E116259BD6D> <9ACE247A70CF9BEAFEE15E116259BD6D>] ++ # with optional spaces. pdftex creates also: ++ # /CreationDate (D:20120103083206Z) ++ # /ModDate (D:20120103083206Z) ++ # and possibly XML metadata as well ++ for f in "old/$file" "new/$file"; do ++ sed -i \ ++ '/obj/,/endobj/{ ++ s%/ID \?\[ \?<[^>]\+> \?<[^>]\+> \?\]%/IDrandom%g; ++ s%/CreationDate \?(D:[^)]*)%/CreationDate (D: XXX)%g; ++ s%/ModDate \?(D:[^)]*)%/ModDate (D: XXX)%g; ++ s%<pdf:CreationDate>[^<]*</pdf:CreationDate>%<pdf:CreationDate>XXX</pdf:CreationDate>%g; ++ s%<pdf:ModDate>[^<]*</pdf:ModDate>%<pdf:ModDate>XXX</pdf:ModDate>%g; ++ s%<xap:CreateDate>[^<]*</xap:CreateDate>%<xap:CreateDate>XXX</xap:CreateDate>%g; ++ s%<xap:ModifyDate>[^<]*</xap:ModifyDate>%<xap:ModifyDate>XXX</xap:ModifyDate>%g; ++ s%<xap:MetadataDate>[^<]*</xap:MetadataDate>%<xap:MetadataDate>XXX</xap:MetadataDate>%g; ++ }' "$f" ++ done ++ ;; ++ esac ++ ++ ftype=`/usr/bin/file old/$file | sed 's@^[^:]\+:[[:blank:]]*@@'` ++ case $ftype in ++ PE32\ executable*Mono\/\.Net\ assembly*) ++ echo "PE32 Mono/.Net assembly: $file" ++ if [ -x /usr/bin/monodis ] ; then ++ monodis old/$file 2>/dev/null|sed -e 's/GUID = {.*}/GUID = { 42 }/;'> ${file1} ++ monodis new/$file 2>/dev/null|sed -e 's/GUID = {.*}/GUID = { 42 }/;'> ${file2} ++ if ! cmp -s ${file1} ${file2}; then ++ echo "$file differs ($ftype)" ++ diff -u ${file1} ${file2} ++ return 1 ++ fi ++ else ++ echo "Cannot compare, no monodis installed" ++ return 1 ++ fi ++ ;; ++ ELF*executable*|ELF*[LM]SB\ shared\ object*) ++ objdump -d --no-show-raw-insn old/$file | filter_disasm > $file1 ++ if ! test -s $file1; then ++ # objdump has no idea how to handle it ++ if ! diff_two_files; then ++ ret=1 ++ break ++ fi ++ fi ++ elfdiff= ++ sed -i -e "s,old/,," $file1 ++ objdump -d --no-show-raw-insn new/$file | filter_disasm > $file2 ++ sed -i -e "s,new/,," $file2 ++ if ! diff -u $file1 $file2 > $dfile; then ++ echo "$file differs in assembler output" ++ head -n 200 $dfile ++ elfdiff="1" ++ fi ++ echo "" >$file1 ++ echo "" >$file2 ++ # Don't compare .build-id and .gnu_debuglink sections ++ sections="$(objdump -s new/$file | grep "Contents of section .*:" | sed -r "s,.* (.*):,\1,g" | grep -v -e "\.build-id" -e "\.gnu_debuglink" | tr "\n" " ")" ++ for section in $sections; do ++ objdump -s -j $section old/$file | sed "s,^old/,," > $file1 ++ objdump -s -j $section new/$file | sed "s,^new/,," > $file2 ++ if ! diff -u $file1 $file2 > $dfile; then ++ echo "$file differs in ELF section $section" ++ head -n 200 $dfile ++ elfdiff="1" ++ fi ++ done ++ if test -z "$elfdiff"; then ++ echo "$file: only difference was in build-id or gnu_debuglink, GOOD." ++ return 0 ++ fi ++ return 1 ++ ;; ++ *ASCII*|*text*) ++ if ! cmp -s old/$file new/$file; then ++ echo "$file differs ($ftype)" ++ diff -u old/$file new/$file | head -n 200 ++ return 1 ++ fi ++ ;; ++ directory|setuid,\ directory|sticky,\ directory) ++ # tar might package directories - ignore them here ++ return 0 ++ ;; ++ bzip2\ compressed\ data*) ++ if ! check_compressed_file "$file" "bz2"; then ++ return 1 ++ fi ++ ;; ++ gzip\ compressed\ data*) ++ if ! check_compressed_file "$file" "gzip"; then ++ return 1 ++ fi ++ ;; ++ XZ\ compressed\ data*) ++ if ! check_compressed_file "$file" "xz"; then ++ return 1 ++ fi ++ ;; ++ POSIX\ tar\ archive) ++ mv old/$file{,.tar} ++ mv new/$file{,.tar} ++ if ! check_single_file ${file}.tar; then ++ return 1 ++ fi ++ ;; ++ cpio\ archive) ++ mv old/$file{,.cpio} ++ mv new/$file{,.cpio} ++ if ! check_single_file ${file}.cpio; then ++ return 1 ++ fi ++ ;; ++ symbolic\ link\ to\ *) ++ readlink "old/$file" > $file1 ++ readlink "new/$file" > $file2 ++ if ! diff -u $file1 $file2; then ++ echo "symlink target for $file differs" ++ return 1 ++ fi ++ ;; ++ *) ++ if ! diff_two_files; then ++ return 1 ++ fi ++ ;; ++ esac ++ return 0 ++} ++ ++# We need /proc mounted for some tests, so check that it's mounted and ++# complain if not. ++PROC_MOUNTED=0 ++if [ ! -d /proc/self/ ]; then ++ echo "/proc is not mounted" ++ mount -orw -n -tproc none /proc ++ PROC_MOUNTED=1 ++fi ++ ++# preserve cmp_spec result for check_all runs ++ret=$RES ++for file in $files; do ++ if ! check_single_file $file; then ++ ret=1 ++ if test -z "$check_all"; then ++ break ++ fi ++ fi ++done ++ ++if [ "$PROC_MOUNTED" -eq "1" ]; then ++ echo "Unmounting proc" ++ umount /proc ++fi ++ ++rm $file1 $file2 $dfile $rename_script ++rm -rf $dir ++if test "$ret" = 0; then ++ echo "Package content is identical" ++fi ++exit $ret ++# vim: tw=666 ts=2 et +diff --git a/rpm-check.sh b/rpm-check.sh +deleted file mode 100755 +index 56035c1..0000000 +--- a/rpm-check.sh ++++ /dev/null +@@ -1,765 +0,0 @@ +-#! /bin/bash +-# +-# Copyright (c) 2009, 2010, 2011, 2012 SUSE Linux Product GmbH, Germany. +-# Licensed under GPL v2, see COPYING file for details. +-# +-# Written by Michael Matz and Stephan Coolo +-# Enhanced by Andreas Jaeger +- +-FUNCTIONS=${0%/*}/functions.sh +- +-check_all= +-case $1 in +- -a | --check-all) +- check_all=1 +- shift +-esac +- +-if test "$#" != 2; then +- echo "usage: $0 [-a|--check-all] old.rpm new.rpm" +- exit 1 +-fi +- +-self_script=$(cd $(dirname $0); echo $(pwd)/$(basename $0)) +- +-source $FUNCTIONS +- +-oldpkg=`readlink -f $1` +-newpkg=`readlink -f $2` +-rename_script=`mktemp` +- +-if test ! -f "$oldpkg"; then +- echo "can't open $1" +- exit 1 +-fi +- +-if test ! -f "$newpkg"; then +- echo "can't open $2" +- exit 1 +-fi +- +-#usage unjar <file> +-function unjar() +-{ +- local file +- file=$1 +- +- if [[ $(type -p fastjar) ]]; then +- UNJAR=fastjar +- elif [[ $(type -p jar) ]]; then +- UNJAR=jar +- elif [[ $(type -p unzip) ]]; then +- UNJAR=unzip +- else +- echo "ERROR: jar, fastjar, or unzip is not installed (trying file $file)" +- exit 1 +- fi +- +- case $UNJAR in +- jar|fastjar) +- # echo jar -xf $file +- ${UNJAR} -xf $file +- ;; +- unzip) +- unzip -oqq $file +- ;; +- esac +-} +- +-# list files in directory +-#usage unjar_l <file> +-function unjar_l() +-{ +- local file +- file=$1 +- +- if [[ $(type -p fastjar) ]]; then +- UNJAR=fastjar +- elif [[ $(type -p jar) ]]; then +- UNJAR=jar +- elif [[ $(type -p unzip) ]]; then +- UNJAR=unzip +- else +- echo "ERROR: jar, fastjar, or unzip is not installed (trying file $file)" +- exit 1 +- fi +- +- case $UNJAR in +- jar|fastjar) +- ${UNJAR} -tf $file +- ;; +- unzip) +- unzip -l $file +- ;; +- esac +-} +- +-filter_disasm() +-{ +- sed -e 's/^ *[0-9a-f]\+://' -e 's/\$0x[0-9a-f]\+/$something/' -e 's/callq *[0-9a-f]\+/callq /' -e 's/# *[0-9a-f]\+/# /' -e 's/\(0x\)\?[0-9a-f]\+(/offset(/' -e 's/[0-9a-f]\+ </</' -e 's/^<\(.*\)>:/\1:/' -e 's/<\(.*\)+0x[0-9a-f]\+>/<\1 + ofs>/' +-} +- +-echo "Comparing `basename $oldpkg` to `basename $newpkg`" +- +-case $oldpkg in +- *.rpm) +- cmp_spec $rename_script $oldpkg $newpkg +- RES=$? +- case $RES in +- 0) +- echo "RPM meta information is identical" +- if test -z "$check_all"; then +- exit 0 +- fi +- ;; +- 1) +- echo "RPM meta information is different" +- if test -z "$check_all"; then +- exit 1 +- fi +- ;; +- 2) +- echo "RPM file checksum differs." +- RES=0 +- ;; +- *) +- echo "Wrong exit code!" +- exit 1 +- ;; +- esac +- ;; +-esac +- +-file1=`mktemp` +-file2=`mktemp` +- +-dir=`mktemp -d` +-echo "Extracting packages" +-unpackage $oldpkg $dir/old +-unpackage $newpkg $dir/new +- +-# files is set in cmp_spec for rpms, so if RES is empty we should assume +-# it wasn't an rpm and pick all files for comparison. +-if [ -z $RES ]; then +- oldfiles=`cd $dir/old; find . -type f` +- newfiles=`cd $dir/new; find . -type f` +- +- files=`echo -e "$oldfiles\n$newfiles" | sort -u` +-fi +- +-cd $dir +-bash $rename_script +- +-dfile=`mktemp` +- +-diff_two_files() +-{ +- if ! cmp -s old/$file new/$file; then +- echo "$file differs ($ftype)" +- hexdump -C old/$file > $file1 +- hexdump -C new/$file > $file2 +- diff -u $file1 $file2 | head -n 200 +- return 1 +- fi +- return 0 +-} +- +-trim_man_first_line() +-{ +- # Handles the first line if it is like: +- #.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.28) +- #.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.43.3. +- local f=$1 +- sed -i -e '1{ +- s|^\.\\"[[:blank:]]\+Automatically[[:blank:]]generated[[:blank:]]by[[:blank:]]Pod::Man[[:blank:]].*|.\\" Overly verbose Pod::Man| +- s|^\.\\"[[:blank:]]\+DO[[:blank:]]NOT[[:blank:]]MODIFY[[:blank:]]THIS[[:blank:]]FILE![[:blank:]]\+It[[:blank:]]was[[:blank:]]generated[[:blank:]]by[[:blank:]]help2man[[:blank:]].*|.\\" Overly verbose help2man| +- }' $f +-} +- +-trim_man_TH() +-{ +- # Handles lines like: +- # .TH debhelper 7 "2010-02-27" "7.4.15" "Debhelper" +- # .TH DIRMNGR-CLIENT 1 2010-02-27 "Dirmngr 1.0.3" "GNU Privacy Guard" +- # .TH ccmake 1 "March 06, 2010" "ccmake 2.8.1-rc3" +- # .TH QEMU-IMG 1 "2010-03-14" " " " " +- # .TH kdecmake 1 "May 07, 2010" "cmake 2.8.1" +- # .TH "appender.h" 3 "12 May 2010" "Version 1.2.1" "log4c" \" -*- nroff -*- +- # .TH "appender.h" 3 "Tue Aug 31 2010" "Version 1.2.1" "log4c" \" -*- nroff -*- +- # .TH "OFFLINEIMAP" "1" "11 May 2010" "John Goerzen" "OfflineIMAP Manual" +- # .TH gv 3guile "13 May 2010" +- #.TH "GIT\-ARCHIMPORT" "1" "09/13/2010" "Git 1\&.7\&.1" "Git Manual" +- # .TH LDIRECTORD 8 "2010-10-20" "perl v5.12.2" "User Contributed Perl Documentation" +- # .TH ccmake 1 "February 05, 2012" "ccmake 2.8.7" +- # .TH "appender.h" 3 "Tue Aug 31 2010" "Version 1.2.1" "log4c" \" -*- nroff -*- +- # .TH ARCH "1" "September 2010" "GNU coreutils 8.5" "User Commands" +- # .TH "GCM-CALIBRATE" "1" "03 February 2012" "" "" +- #.TH Locale::Po4a::Xml.pm 3pm "2015-01-30" "Po4a Tools" "Po4a Tools" +- local f=$1 +- # (.TH quoted section) (quoted_date)(*) +- sed -i -e 's|^\([[:blank:]]*\.TH[[:blank:]]\+"[^"]\+"[[:blank:]]\+[^[:blank:]]\+\)[[:blank:]]\+\("[^"]\+"\)\([[:blank:]]\+.*\)\?|\1 "qq2000-01-01"\3|' $f +- # (.TH unquoted section) (quoted_date)(*) +- sed -i -e 's|^\([[:blank:]]*\.TH[[:blank:]]\+[^"][^[:blank:]]\+[[:blank:]]\+[^[:blank:]]\+\)[[:blank:]]\+\("[^"]\+"\)\([[:blank:]]\+.*\)\?|\1 "uq2000-02-02"\3|' $f +- # (.TH quoted section) (unquoted_date)(*) +- sed -i -e 's|^\([[:blank:]]*\.TH[[:blank:]]\+"[^"]\+"[[:blank:]]\+[^[:blank:]]\+\)[[:blank:]]\+\([^"][^[:blank:]]\+\)\([[:blank:]]\+.*\)\?|\1 qu2000-03-03\3|' $f +- # (.TH unquoted section) (unquoted_date)(*) +- sed -i -e 's|^\([[:blank:]]*\.TH[[:blank:]]\+[^"][^[:blank:]]\+[[:blank:]]\+[^[:blank:]]\+\)[[:blank:]]\+\([^"][^[:blank:]]\+\)\([[:blank:]]\+.*\)\?|\1 uu2000-04-04\3|' $f +-} +- +-strip_numbered_anchors() +-{ +- # Remove numbered anchors on Docbook / HTML files. +- # This should be save since we remove them from old and new files. +- # A trailing </a> or </div> tag will stay also on both files. +- for f in old/$file new/$file; do +- sed -i -e 's%<[ ]*a[ ]\+name[^<]*[0-9]\+[^<]*%%g' \ +- -e 's%<[ ]*a[ ]\+href[^<]*#[^<]*[0-9]\+[^<]*%%g' \ +- -e 's%<[^<]*id="ftn\.[^<]*[0-9]\+[^<]*%%g' $f +- done +-} +- +- +-check_compressed_file() +-{ +- local file=$1 +- local ext=$2 +- local tmpdir=`mktemp -d` +- local ftype +- local ret=0 +- echo "$ext file with odd filename: $file" +- if test -n "$tmpdir"; then +- mkdir $tmpdir/{old,new} +- cp --parents --dereference old/$file $tmpdir/ +- cp --parents --dereference new/$file $tmpdir/ +- if pushd $tmpdir > /dev/null ; then +- case "$ext" in +- bz2) +- mv old/$file{,.bz2} +- mv new/$file{,.bz2} +- bzip2 -d old/$file.bz2 +- bzip2 -d new/$file.bz2 +- ;; +- gzip) +- mv old/$file{,.gz} +- mv new/$file{,.gz} +- gzip -d old/$file.gz +- gzip -d new/$file.gz +- ;; +- xz) +- mv old/$file{,.xz} +- mv new/$file{,.xz} +- xz -d old/$file.xz +- xz -d new/$file.xz +- ;; +- esac +- ftype=`/usr/bin/file old/$file | sed 's@^[^:]\+:[[:blank:]]*@@'` +- case $ftype in +- POSIX\ tar\ archive) +- echo "$ext content is: $ftype" +- mv old/$file{,.tar} +- mv new/$file{,.tar} +- if ! check_single_file ${file}.tar; then +- ret=1 +- fi +- ;; +- ASCII\ cpio\ archive\ *) +- echo "$ext content is: $ftype" +- mv old/$file{,.cpio} +- mv new/$file{,.cpio} +- if ! check_single_file ${file}.cpio; then +- ret=1 +- fi +- ;; +- *) +- echo "unhandled $ext content: $ftype" +- if ! diff_two_files; then +- ret=1 +- fi +- ;; +- esac +- popd > /dev/null +- fi +- rm -rf "$tmpdir" +- fi +- return $ret +-} +- +-check_single_file() +-{ +- local file="$1" +- case $file in +- *.spec) +- sed -i -e "s,Release:.*$release1,Release: @RELEASE@," old/$file +- sed -i -e "s,Release:.*$release2,Release: @RELEASE@," new/$file +- ;; +- *.exe.mdb|*.dll.mdb) +- # Just debug information, we can skip them +- echo "$file skipped as debug file." +- return 0 +- ;; +- *.a) +- flist=`ar t new/$file` +- pwd=$PWD +- fdir=`dirname $file` +- cd old/$fdir +- ar x `basename $file` +- cd $pwd/new/$fdir +- ar x `basename $file` +- cd $pwd +- for f in $flist; do +- if ! check_single_file $fdir/$f; then +- return 1 +- fi +- done +- return 0 +- ;; +- *.cpio) +- flist=`cpio --quiet --list --force-local < "new/$file"` +- pwd=$PWD +- fdir=$file.extract.$PPID.$$ +- mkdir old/$fdir new/$fdir +- cd old/$fdir +- cpio --quiet --extract --force-local < "../${file##*/}" +- cd $pwd/new/$fdir +- cpio --quiet --extract --force-local < "../${file##*/}" +- cd $pwd +- local ret=0 +- for f in $flist; do +- if ! check_single_file $fdir/$f; then +- ret=1 +- if test -z "$check_all"; then +- break +- fi +- fi +- done +- rm -rf old/$fdir new/$fdir +- return $ret +- ;; +- *.tar|*.tar.bz2|*.tar.gz|*.tgz|*.tbz2) +- flist=`tar tf new/$file` +- pwd=$PWD +- fdir=`dirname $file` +- cd old/$fdir +- tar xf `basename $file` +- cd $pwd/new/$fdir +- tar xf `basename $file` +- cd $pwd +- local ret=0 +- for f in $flist; do +- if ! check_single_file $fdir/$f; then +- ret=1 +- if test -z "$check_all"; then +- break +- fi +- fi +- done +- return $ret +- ;; +- *.zip|*.jar|*.war) +- cd old +- unjar_l ./$file |sort > flist +- # 10-05-2010 14:39 +- sed -i -e "s, [0-9][0-9]-[0-9][0-9]-[0-9]\+ [0-9][0-9]:[0-9][0-9] , date ," flist +- # 2012-02-03 07:59 +- sed -i -e "s, 20[0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9] , date ," flist +- cd ../new +- unjar_l ./$file |sort> flist +- sed -i -e "s, [0-9][0-9]-[0-9][0-9]-[0-9]\+ [0-9][0-9]:[0-9][0-9] , date ,; " flist +- sed -i -e "s, 20[0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9] , date ," flist +- cd .. +- if ! cmp -s old/flist new/flist; then +- echo "$file has different file list" +- diff -u old/flist new/flist +- return 1 +- fi +- flist=`grep date new/flist | sed -e 's,.* date ,,'` +- pwd=$PWD +- fdir=`dirname $file` +- cd old/$fdir +- unjar `basename $file` +- cd $pwd/new/$fdir +- unjar `basename $file` +- cd $pwd +- local ret=0 +- for f in $flist; do +- if test -f new/$fdir/$f && ! check_single_file $fdir/$f; then +- ret=1 +- if test -z "$check_all"; then +- break +- fi +- fi +- done +- return $ret;; +- *.pyc|*.pyo) +- perl -e "open fh, '+<', 'old/$file'; seek fh, 4, SEEK_SET; print fh '0000';" +- perl -e "open fh, '+<', 'new/$file'; seek fh, 4, SEEK_SET; print fh '0000';" +- ;; +- *.bz2) +- bunzip2 -c old/$file > old/${file/.bz2/} +- bunzip2 -c new/$file > new/${file/.bz2/} +- check_single_file ${file/.bz2/} +- return $? +- ;; +- *.gz) +- gunzip -c old/$file > old/${file/.gz/} +- gunzip -c new/$file > new/${file/.gz/} +- check_single_file ${file/.gz/} +- return $? +- ;; +- *.rpm) +- $self_script -a old/$file new/$file +- return $? +- ;; +- *png) +- # Try to remove timestamps, only if convert from ImageMagick is installed +- if [[ $(type -p convert) ]]; then +- convert old/$file +set date:create +set date:modify old/${file/.png/_n.png} +- convert old/$file +set date:create +set date:modify new/${file/.png/_n.png} +- if ! cmp -s old/${file/.png/_n.png} new/${file/.png/_n.png}; then +- echo "$file differs ($ftype)" +- hexdump -C old/${file/.png/_n.png} > $file1 +- hexdump -C new/${file/.png/_n.png} > $file2 +- diff -u $file1 $file2 | head -n 20 +- return 1 +- fi +- return 0 +- fi +- ;; +- /usr/share/locale/*/LC_MESSAGES/*.mo|/usr/share/locale-bundle/*/LC_MESSAGES/*.mo) +- for f in old/$file new/$file; do +- sed -i -e "s,POT-Creation-Date: ....-..-.. ..:..+....,POT-Creation-Date: 1970-01-01 00:00+0000," $f +- done +- ;; +- /usr/share/doc/packages/*/*.html|\ +- /usr/share/doc/kde/HTML/*/*/*.html|/usr/share/doc/*/html/*.html) +- for f in old/$file new/$file; do +- # texi2html output, e.g. in kvm, indent, qemu +- sed -i -e "s|^<!-- Created on .*, 20.. by texi2html .\...|<!-- Created on August 7, 2009 by texi2html 1.82|" $f +- sed -i -e 's|^ *This document was generated by <em>Autobuild</em> on <em>.*, 20..</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html .\...</em></a>.$| This document was generated by <em>Autobuild</em> on <em>August 7, 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.|' $f +- # doxygen docu, e.g. in libssh and log4c +- sed -i -e 's|Generated on ... ... [0-9]* [0-9]*:[0-9][0-9]:[0-9][0-9] 20[0-9][0-9] for |Generated on Mon May 10 20:45:00 2010 for |' $f +- # Generated on Sat Aug 14 2010 16:49:48 for libssh +- sed -i -e 's|Generated on ... ... [0-9]* 20[0-9][0-9] [0-9]*:[0-9][0-9]:[0-9][0-9] for |Generated on Mon May 10 20:45:00 2010 for |' $f +- done +- strip_numbered_anchors +- ;; +- /usr/share/javadoc/*.html |\ +- /usr/share/javadoc/*/*.html|/usr/share/javadoc/*/*/*.html) +- strip_numbered_anchors +- # There are more timestamps in html, so far we handle only some primitive versions. +- for f in old/$file new/$file; do +- # Javadoc: +- # <head> +- # <!-- Generated by javadoc (version 1.7.0_75) on Tue Feb 03 02:20:12 GMT 2015 --> +- # <!-- Generated by javadoc on Tue Feb 03 00:02:48 GMT 2015 --> +- # <meta name="date" content="2015-02-03"> +- # </head> +- sed -i -e ' +- /^<head>/{ +- : next +- n +- /^<\/head>/{ +- b end_head +- } +- s/^\(<!-- Generated by javadoc\) \((\(build\|version\) [0-9._]\+) on ... ... .. ..:..:.. \(GMT\|UTC\) ....\) \(-->\)/\1 some-date-removed-by-build-compare \5/ +- t next +- s/^\(<!-- Generated by javadoc\) \(on ... ... .. ..:..:.. \(GMT\|UTC\) ....\) \(-->\)/\1 some-date-removed-by-build-compare \3/ +- t next +- s/^<meta name="date" content="[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}">/<meta name="date" content="some-date-removed-by-build-compare">/ +- b next +- } +- : end_head +- ' $f +- # Gjdoc HtmlDoclet: +- sed -i -e 's%Generated by Gjdoc HtmlDoclet [0-9,.]*, part of <a href="http://www.gnu.org/software/classpath/cp-tools/" title="" target="_top">GNU Classpath Tools</a>, on .*, 20.. [0-9]*:..:.. \(a\|p\)\.m\. GMT.%Generated by Gjdoc.%' $f +- sed -i -e 's%<!DOCTYPE html PUBLIC "-//gnu.org///DTD XHTML 1.1 plus Target 1.0//EN"\(.*\)GNU Classpath Tools</a>, on [A-Z][a-z]* [0-9]*, 20?? [0-9]*:??:?? \(a|p\)\.m\. GMT.</p>%<!DOCTYPE html PUBLIC "-//gnu.org///DTD XHTML 1.1 plus Target 1.0//EN"\1GNU Classpath Tools</a>, on January 1, 2009 0:00:00 a.m. GMT.</p>%' $f +- sed -i -e 's%<!DOCTYPE html PUBLIC "-//gnu.org///DTD\(.*GNU Classpath Tools</a>\), on [a-zA-Z]* [0-9][0-9], 20.. [0-9]*:..:.. \(a\|p\)\.m\. GMT.</p>%<!DOCTYPE html PUBLIC "-//gnu.org///DTD\1,on May 1, 2010 1:11:42 p.m. GMT.</p>%' $f +- # deprecated-list is randomly ordered, sort it for comparison +- case $f in +- */deprecated-list.html) +- sort -o $f $f +- ;; +- esac +- done +- ;; +- /usr/share/javadoc/gjdoc.properties |\ +- /usr/share/javadoc/*/gjdoc.properties) +- for f in old/$file new/$file; do +- sed -i -e 's|^#[A-Z][a-z]\{2\} [A-Z][a-z]\{2\} [0-9]\{2\} ..:..:.. GMT 20..$|#Fri Jan 01 11:27:36 GMT 2009|' $f +- done +- ;; +- */fonts.scale|*/fonts.dir|*/encodings.dir) +- for f in old/$file new/$file; do +- # sort files before comparing +- sort -o $f $f +- done +- ;; +- /var/adm/perl-modules/*) +- for f in old/$file new/$file; do +- sed -i -e 's|^=head2 ... ... .. ..:..:.. ....: C<Module>|=head2 Wed Jul 1 00:00:00 2009: C<Module>|' $f +- done +- ;; +- /usr/share/man/man3/*3pm) +- for f in old/$file new/$file; do +- sed -i -e 's| 3 "20..-..-.." "perl v5....." "User Contributed Perl Documentation"$| 3 "2009-01-01" "perl v5.10.0" "User Contributed Perl Documentation"|' $f +- trim_man_TH $f +- trim_man_first_line $f +- done +- ;; +- /usr/share/man/*/man*|/usr/share/man/man*|/usr/lib/texmf/doc/man/*/*) +- +- for f in old/$file new/$file; do +- trim_man_TH $f +- trim_man_first_line $f +- # generated by docbook xml: +- #.\" Date: 09/13/2010 +- sed -i -e 's|Date: [0-1][0-9]/[0-9][0-9]/201[0-9]|Date: 09/13/2010|' $f +- done +- ;; +- *.elc) +- # emacs lisp files +- for f in old/$file new/$file; do +- sed -i -e 's|Compiled by abuild@.* on ... ... .. ..:..:.. 20..$|compiled by abuild@buildhost on Wed Jul 01 00:00:00 2009|' $f +- done +- ;; +- /var/lib/texmf/web2c/*/*fmt |\ +- /var/lib/texmf/web2c/metafont/*.base|\ +- /var/lib/texmf/web2c/metapost/*.mem) +- # binary dump of TeX and Metafont formats, we can ignore them for good +- echo "difference in $file ignored." +- return 0 +- ;; +- */libtool) +- for f in old/$file new/$file; do +- sed -i -e 's|^# Libtool was configured on host [A-Za-z0-9]*:$|# Libtool was configured on host x42:|' $f +- done +- ;; +- /etc/mail/*cf|/etc/sendmail.cf) +- # from sendmail package +- for f in old/$file new/$file; do +- # - ##### built by abuild@build33 on Thu May 6 11:21:17 UTC 2010 +- sed -i -e 's|built by abuild@[a-z0-9]* on ... ... [0-9]* [0-9]*:[0-9][0-9]:[0-9][0-9] .* 20[0-9][0-9]|built by abuild@build42 on Thu May 6 11:21:17 UTC 2010|' $f +- done +- ;; +- /usr/share/doc/kde/HTML/*/*/index.cache|/usr/share/doc/kde/HTML/*/*/*/index.cache|\ +- /usr/share/gtk-doc/html/*/*.html|/usr/share/gtk-doc/html/*/*.devhelp2) +- # various kde and gtk packages +- strip_numbered_anchors +- ;; +- */created.rid) +- # ruby documentation +- # file just contains a timestamp and nothing else, so ignore it +- echo "Ignore $file" +- return 0 +- ;; +- */rdoc/files/*.html) +- # ruby documentation +- # <td>Mon Sep 20 19:02:43 +0000 2010</td> +- for f in old/$file new/$file; do +- sed -i -e 's%<td>[A-Z][a-z][a-z] [A-Z][a-z][a-z] [0-9]\+ [0-9]\+:[0-9]\+:[0-9]\+ +0000 201[0-9]</td>%<td>Mon Sep 20 19:02:43 +0000 2010</td>%g' $f +- done +- strip_numbered_anchors +- ;; +- */Linux*Env.Set.sh) +- # LibreOffice files, contains: +- # Generated on: Mon Apr 18 13:19:22 UTC 2011 +- for f in old/$file new/$file; do +- sed -i -e 's%^# Generated on:.*UTC 201[0-9] *$%# Generated on: Sometime%g' $f +- done +- ;; +- /usr/lib/libreoffice/solver/inc/*/deliver.log) +- # LibreOffice log file +- echo "Ignore $file" +- return 0 +- ;; +- /var/adm/update-messages/*|/var/adm/update-scripts/*) +- # encode version-release inside +- oldfn=`echo "$file"|sed -e s/-$release2/-$release1/;` +- +- # fetchmsttfonts embeds the release number in the update shell script. +- echo sed -i -e "s/-$release1/-$release2/g;" "old/$oldfn" +- sed -i -e "s/-$release1/-$release2/g;" "old/$oldfn" +- +- if ! diff -u old/$oldfn new/$file; then +- echo "$oldfn is not same as $file" +- return 1 +- fi +- echo "$file and $oldfn are same" +- return 0 +- ;; +- *.ps) +- for f in "old/$file" "new/$file"; do +- sed -i -e ' +- /^%%CreationDate:[[:blank:]]/d +- /^%%Creator:[[:blank:]]groff[[:blank:]]version[[:blank:]]/d +- /^%DVIPSSource:[[:blank:]]/d +- ' "$f" +- done +- ;; +- *pdf) +- # PDF files contain a unique ID, remove it +- # Format of the ID is: +- # /ID [<9ACE247A70CF9BEAFEE15E116259BD6D> <9ACE247A70CF9BEAFEE15E116259BD6D>] +- # with optional spaces. pdftex creates also: +- # /CreationDate (D:20120103083206Z) +- # /ModDate (D:20120103083206Z) +- # and possibly XML metadata as well +- for f in "old/$file" "new/$file"; do +- sed -i \ +- '/obj/,/endobj/{ +- s%/ID \?\[ \?<[^>]\+> \?<[^>]\+> \?\]%/IDrandom%g; +- s%/CreationDate \?(D:[^)]*)%/CreationDate (D: XXX)%g; +- s%/ModDate \?(D:[^)]*)%/ModDate (D: XXX)%g; +- s%<pdf:CreationDate>[^<]*</pdf:CreationDate>%<pdf:CreationDate>XXX</pdf:CreationDate>%g; +- s%<pdf:ModDate>[^<]*</pdf:ModDate>%<pdf:ModDate>XXX</pdf:ModDate>%g; +- s%<xap:CreateDate>[^<]*</xap:CreateDate>%<xap:CreateDate>XXX</xap:CreateDate>%g; +- s%<xap:ModifyDate>[^<]*</xap:ModifyDate>%<xap:ModifyDate>XXX</xap:ModifyDate>%g; +- s%<xap:MetadataDate>[^<]*</xap:MetadataDate>%<xap:MetadataDate>XXX</xap:MetadataDate>%g; +- }' "$f" +- done +- ;; +- esac +- +- ftype=`/usr/bin/file old/$file | sed 's@^[^:]\+:[[:blank:]]*@@'` +- case $ftype in +- PE32\ executable*Mono\/\.Net\ assembly*) +- echo "PE32 Mono/.Net assembly: $file" +- if [ -x /usr/bin/monodis ] ; then +- monodis old/$file 2>/dev/null|sed -e 's/GUID = {.*}/GUID = { 42 }/;'> ${file1} +- monodis new/$file 2>/dev/null|sed -e 's/GUID = {.*}/GUID = { 42 }/;'> ${file2} +- if ! cmp -s ${file1} ${file2}; then +- echo "$file differs ($ftype)" +- diff -u ${file1} ${file2} +- return 1 +- fi +- else +- echo "Cannot compare, no monodis installed" +- return 1 +- fi +- ;; +- ELF*executable*|ELF*[LM]SB\ shared\ object*) +- objdump -d --no-show-raw-insn old/$file | filter_disasm > $file1 +- if ! test -s $file1; then +- # objdump has no idea how to handle it +- if ! diff_two_files; then +- ret=1 +- break +- fi +- fi +- elfdiff= +- sed -i -e "s,old/,," $file1 +- objdump -d --no-show-raw-insn new/$file | filter_disasm > $file2 +- sed -i -e "s,new/,," $file2 +- if ! diff -u $file1 $file2 > $dfile; then +- echo "$file differs in assembler output" +- head -n 200 $dfile +- elfdiff="1" +- fi +- echo "" >$file1 +- echo "" >$file2 +- # Don't compare .build-id and .gnu_debuglink sections +- sections="$(objdump -s new/$file | grep "Contents of section .*:" | sed -r "s,.* (.*):,\1,g" | grep -v -e "\.build-id" -e "\.gnu_debuglink" | tr "\n" " ")" +- for section in $sections; do +- objdump -s -j $section old/$file | sed "s,^old/,," > $file1 +- objdump -s -j $section new/$file | sed "s,^new/,," > $file2 +- if ! diff -u $file1 $file2 > $dfile; then +- echo "$file differs in ELF section $section" +- head -n 200 $dfile +- elfdiff="1" +- fi +- done +- if test -z "$elfdiff"; then +- echo "$file: only difference was in build-id or gnu_debuglink, GOOD." +- return 0 +- fi +- return 1 +- ;; +- *ASCII*|*text*) +- if ! cmp -s old/$file new/$file; then +- echo "$file differs ($ftype)" +- diff -u old/$file new/$file | head -n 200 +- return 1 +- fi +- ;; +- directory|setuid,\ directory|sticky,\ directory) +- # tar might package directories - ignore them here +- return 0 +- ;; +- bzip2\ compressed\ data*) +- if ! check_compressed_file "$file" "bz2"; then +- return 1 +- fi +- ;; +- gzip\ compressed\ data*) +- if ! check_compressed_file "$file" "gzip"; then +- return 1 +- fi +- ;; +- XZ\ compressed\ data*) +- if ! check_compressed_file "$file" "xz"; then +- return 1 +- fi +- ;; +- POSIX\ tar\ archive) +- mv old/$file{,.tar} +- mv new/$file{,.tar} +- if ! check_single_file ${file}.tar; then +- return 1 +- fi +- ;; +- cpio\ archive) +- mv old/$file{,.cpio} +- mv new/$file{,.cpio} +- if ! check_single_file ${file}.cpio; then +- return 1 +- fi +- ;; +- symbolic\ link\ to\ *) +- readlink "old/$file" > $file1 +- readlink "new/$file" > $file2 +- if ! diff -u $file1 $file2; then +- echo "symlink target for $file differs" +- return 1 +- fi +- ;; +- *) +- if ! diff_two_files; then +- return 1 +- fi +- ;; +- esac +- return 0 +-} +- +-# We need /proc mounted for some tests, so check that it's mounted and +-# complain if not. +-PROC_MOUNTED=0 +-if [ ! -d /proc/self/ ]; then +- echo "/proc is not mounted" +- mount -orw -n -tproc none /proc +- PROC_MOUNTED=1 +-fi +- +-# preserve cmp_spec result for check_all runs +-ret=$RES +-for file in $files; do +- if ! check_single_file $file; then +- ret=1 +- if test -z "$check_all"; then +- break +- fi +- fi +-done +- +-if [ "$PROC_MOUNTED" -eq "1" ]; then +- echo "Unmounting proc" +- umount /proc +-fi +- +-rm $file1 $file2 $dfile $rename_script +-rm -rf $dir +-if test "$ret" = 0; then +- echo "Package content is identical" +-fi +-exit $ret +-# vim: tw=666 ts=2 et +diff --git a/same-build-result.sh b/same-build-result.sh +index c8907e2..7e9bd4f 100644 +--- a/same-build-result.sh ++++ b/same-build-result.sh +@@ -7,11 +7,11 @@ + # Enhanced by Andreas Jaeger <aj@suse.de> + # + # The script decides if the new build differes from the former one, +-# using rpm-check.sh. ++# using pkg-diff.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 ++CMPSCRIPT=${0%/*}/pkg-diff.sh + SCMPSCRIPT=${0%/*}/srpm-check.sh + + check_all=1 +-- +1.9.3 + |