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 0000000..cff3a9e
--- /dev/null
+++ b/meta/recipes-devtools/build-compare/files/Rename-rpm-check.sh-to-pkg-diff.sh.patch
@@ -0,0 +1,1599 @@
+From 4de3df5a1b361cd09a081f0e0bdb94cbf684ed48 Mon Sep 17 00:00:00 2001
+From: Robert Yang <liezhi.yang@windriver.com>
+Date: Thu, 19 Feb 2015 00:34:47 -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>
+
+Updated for rpm-check.sh.
+
+Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
+---
+ build-compare.spec   |    2 +-
+ pkg-diff.sh          |  765 ++++++++++++++++++++++++++++++++++++++++++++++++++
+ rpm-check.sh         |  764 -------------------------------------------------
+ same-build-result.sh |    4 +-
+ 4 files changed, 768 insertions(+), 767 deletions(-)
+ create mode 100644 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 100644
+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 dd47642..0000000
+--- a/rpm-check.sh
++++ /dev/null
+@@ -1,764 +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
+-	' "$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.7.9.5
+
