blob: e21e0f1b3c4197fd66a24e0c561ff08556ca3223 (
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
|
#!/usr/bin/env bash
#
# Prints build logs for failed derivations in quiet build mode (-Q).
# See https://github.com/NixOS/nix/issues/443
#
# Usage:
#
# nix-build ... -Q ... 2>&1 | whatsupnix [user@target[:port]]
#
# Exit Codes:
#
# 0 No failed derivations could be found. This either means there where
# no build errors, or stdin wasn't nix-build output.
#
# 1 Usage error; arguments couldn't be parsed.
#
# 2 Nix error; input looks like Nix failed.
#
# 3 Build error; at least one failed derivation could be found.
#
tmpdir=$(mktemp -d --tmpdir whatsupnix.XXXXXXXX)
failed_drvs=$tmpdir/failed_drvs; touch "$failed_drvs"
nix_errors=$tmpdir/nix_errors; touch "$nix_errors"
cleanup() {
rm "$failed_drvs"
rm "$nix_errors"
rmdir "$tmpdir"
}
trap cleanup EXIT
exec >&2
gawk \
-v failed_drvs="$failed_drvs" \
-v nix_errors="$nix_errors" \
'
/^(\033\[31;1m)?error:/ {
print $0 >> nix_errors
}
match($0, /^builder for ‘(\/nix\/store\/[^’]+\.drv)’ failed/, m) {
print m[1] >> failed_drvs
}
{ print $0; fflush("/dev/stdout") }
'
case $# in
0)
print_log() {
NIX_PAGER= nix-store -l "$1"
}
;;
1)
remote_user=${1%%@*}
if test "$remote_user" = "$1"; then
remote_user=root
else
set -- "${1#$remote_user@}"
fi
remote_port=${1##*:}
if test "$remote_port" = "$1"; then
remote_port=22
else
set -- "${1%:$remote_port}"
fi
remote_host=$1
print_log() {
ssh "$remote_user@$remote_host" -p "$remote_port" \
env NIX_PAGER= nix-store -l "$1"
}
;;
*)
echo "usage: whatsupnix [[USER@]HOST[:PORT]]" >&2
exit 1
esac
while read -r drv; do
title="** FAILED $drv LOG **"
frame=${title//?/*}
echo "$frame"
echo "$title"
echo "$frame"
echo
print_log "$drv"
echo
done < "$failed_drvs"
if test -s "$nix_errors"; then
exit 2
elif test -s "$failed_drvs"; then
exit 3
else
exit 0
fi
|