summaryrefslogtreecommitdiffstats
path: root/taskcluster/docker/diffoscope/get_and_diffoscope
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