gecko-dev/taskcluster/docker/diffoscope/get_and_diffoscope
Mike Hommey 670494e7d5 Bug 1623010 - Separate out the diffing of generated-files. r=dmajor
The diff jobs currently take a Firefox package and compares against the
one from another build. When that fails, it also makes the diff of the
generated files, which can be useful when there are differences, but
can also be useful on its own. Also, because sometimes, like right now,
there are differences in generated files that have no impact on Firefox
itself, when differences do show up for Firefox, the differences in
generated files are added noise that sheriffs can't work around.

Differential Revision: https://phabricator.services.mozilla.com/D67113

--HG--
extra : moz-landing-system : lando
2020-03-17 22:03:01 +00:00

133 lines
3 KiB
Bash

#!/bin/bash
set -e
set -x
cd /builds/worker
mkdir a b
# Until https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=879010 is
# implemented, it's better to first manually extract the data.
# Plus dmg files are not supported yet.
case "$ORIG_URL" in
*/target.zip|*/target.apk)
curl -L "$ORIG_URL" > a.zip
curl -L "$NEW_URL" > b.zip
unzip -d a a.zip
unzip -d b b.zip
;;
*/target.tar.bz2)
curl -L "$ORIG_URL" | tar -C a -jxf -
curl -L "$NEW_URL" | tar -C b -jxf -
;;
*/target.dmg)
for tool in lipo otool; do
ln -s $MOZ_FETCHES_DIR/cctools/bin/x86_64-apple-darwin*-$tool bin/$tool
done
export PATH=$PATH:/builds/worker/bin
curl -L "$ORIG_URL" > a.dmg
curl -L "$NEW_URL" > b.dmg
for i in a b; do
$MOZ_FETCHES_DIR/dmg/dmg extract $i.dmg $i.hfs
$MOZ_FETCHES_DIR/dmg/hfsplus $i.hfs extractall / $i
done
;;
*)
ARTIFACT=$(basename "${ORIG_URL}")
curl -L "$ORIG_URL" > "a/${ARTIFACT}"
curl -L "$NEW_URL" > "b/${ARTIFACT}"
esac
case "$ORIG_URL" in
*/target.apk)
OMNIJAR=assets/omni.ja
;;
*)
OMNIJAR=omni.ja
;;
esac
report_error() {
# We "parse" the diff output, so we look at the lines that contain a "tee", like:
# ├── firefox
# │ ├── libxul.so
# │ │ ├── readelf --wide --notes {}
# We ignore lines like the last one, to only report file names. And we ignore
# lines for directories such as the first one, but still look at them to report
# full paths.
python3 <<-EOF
TEE = '├──'
paths = set()
path = []
with open("$1.txt") as fh:
for l in fh:
if TEE not in l:
continue
fields = l.split()
# We rely on the number of │ to figure out at what level the file
# name applies.
if fields[-2:-1] == [TEE]:
path[len(fields) - 2:] = [fields[-1]]
else:
# Align path length to match the number of │
path.append(None)
path_ = [p for p in path if p]
full_path = '/'.join(path_)
parent_path = '/'.join(path_[:-1])
if parent_path in paths:
paths.remove(parent_path)
if full_path:
paths.add(full_path)
for p in sorted(paths):
print('TEST-UNEXPECTED-FAIL | {} differs. See the $1.html or $1.txt artifact'.format(p))
EOF
}
# Builds are 99% of the time differing in some small ways, so it's not
# really useful to report a failure (at least not until we actually
# care about the builds being 100% identical).
POST=true
fail() {
exit 1
}
for option; do
case "$option" in
--unpack)
CURDIR=$PWD
for dir in a b; do
# Need to run mach python from inside the gecko source.
# See bug #1533642.
(cd $GECKO_PATH && ./mach python --no-virtualenv toolkit/mozapps/installer/unpack.py --omnijar $OMNIJAR $CURDIR/$dir)
done
;;
--fail)
POST="fail"
;;
*)
echo "Unsupported option: $option" >&2
exit 1
esac
done
if [ -n "$PRE_DIFF" ]; then
eval $PRE_DIFF
fi
if diffoscope \
--html diff.html \
--text diff.txt \
--progress \
$DIFFOSCOPE_ARGS \
a b
then
# Ok
:
else
report_error diff
$POST
fi