blob: 74093132757d786276e3299bb3e611679df8ae44 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
#!/bin/bash
set -e
set -x
cd /builds/worker
mkdir a b
# /builds/worker/bin contains wrapper binaries to divert what diffoscope
# needs to use, so it needs to appear first.
export PATH=/builds/worker/bin:$PATH
# 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
*.zip|*.apk)
curl -L "$ORIG_URL" > a.zip
curl -L "$NEW_URL" > b.zip
unzip -d a a.zip
unzip -d b b.zip
;;
*.tar.bz2)
curl -L "$ORIG_URL" | tar -C a -jxf -
curl -L "$NEW_URL" | tar -C b -jxf -
;;
*.tar.gz)
curl -L "$ORIG_URL" | tar -C a -zxf -
curl -L "$NEW_URL" | tar -C b -zxf -
;;
*.dmg)
for tool in lipo otool; do
ln -s $MOZ_FETCHES_DIR/cctools/bin/x86_64-apple-darwin*-$tool bin/$tool
done
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
|