aboutsummaryrefslogtreecommitdiffstats
path: root/Tools/portbuild/scripts/processonelog
blob: d197309a648848f52b9b7a7e37a375702c722872 (plain) (blame)
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
#!/bin/sh
# $FreeBSD$
#
# Read a single errorlogfile and output a line of the format
#    $filename|$portname|$affected|$logsize|$dir|$maintainer|\
#    $reason|$tag|$broken|$datetime
#
# Originally factored out of: ports/Tools/portbuild/scripts/processlogs

filename=$1
indexdir=.
errordir=.
if [ "$2" != "" ]; then indexdir=$2; fi
if [ "$3" != "" ]; then errordir=$3; fi
indexdir=$(realpath $indexdir)
errordir=$(realpath $errordir)
indexfilename=$indexdir/INDEX

portname=$(basename $filename .log.bz2)
if [ "${portname}" = "${filename}" ]; then
    cat=cat
else
    cat=bzcat
fi
portname=$(basename $portname .log)

affected=$(($(grep -cF $portname < $indexfilename) -1))
logsize=$(/bin/ls -sk $errordir/$filename | awk '{print $1}')
dir=$(${cat} $errordir/$filename | head -6 | grep '^port directory:' | awk '{print $3}' | \
        sed -e 's,^/[^/]*/[^/]*/,,')
maintainer=$(${cat} $errordir/$filename | head -6 | grep '^maintained by' | awk '{print $3}')
datetime=$(${cat} $errordir/$filename | head -6 | grep '^build started at' | \
        sed -e 's/build started at ...//' | tr ' ' '_' )

# now try to classify the type of error found in the file.
# the first case handles failures to even try to build any
# port (i.e. HTML file no longer there, pointyhat being unable
# to fetch any file, pointyhat being able to build any port, etc.)
if [ -z "$dir" -o -z "$datetime" ]; then
  reason="cluster"; tag="cluster"
elif bzgrep -q 'list of extra files and directories' $1; then
  reason="mtree"; tag="mtree"
elif bzgrep -q "See <URL:http://gcc.gnu.org/bugs.html> for instructions." $1; then
  reason="gcc_bug"; tag="gcc-bug"
elif bzgrep -q "See <URL:http://www.gnu.org/software/gcc/bugs.html> for instructions." $1; then
  reason="gcc_bug"; tag="gcc-bug"
elif bzgrep -q 'Checksum mismatch' $1; then
  reason="checksum"; tag="checksum"
elif bzgrep -qE '/usr/local/bin/(perl|perl5.6.1):.*(not found|No such file or directory)' $1; then
  reason="perl"; tag="perl"
elif bzgrep -qE 'perl(.*): Perl is not installed, try .pkg_add -r perl.' $1; then
  reason="perl"; tag="perl"
elif bzgrep -q 'cannot find -lc_r' $1; then
  reason="threads"; tag="threads"
elif bzgrep -q "checking for.*lc_r\.\.\. no" $1; then
  reason="threads"; tag="threads"
elif bzgrep -qE '(No checksum recorded for|(Maybe|Either) .* is out of date, or)' $1; then
  reason="distinfo_update"; tag="distinfo"
elif bzgrep -q "checking whether apxs works.*apxs: not found" $1; then
  reason="apxs"; tag="apxs"
# note: must run before the configure_error check
elif bzgrep -qE "Configuration .* not supported" $1; then
  reason="arch"; tag="arch"
elif bzgrep -qE '(configure: error:|Script.*configure.*failed unexpectedly|script.*failed: here are the contents of)' $1; then
  if bzgrep -qE "configure: error: cpu .* not supported" $1; then
    reason="arch"; tag="arch"
  elif bzgrep -qE "configure: error: (This program requires STL to compile|One or more.*STL headers are missing)" $1; then
    reason="stl"; tag="stl"
  elif bzgrep -qE "configure: error: [Pp]erl (5.* required|version too old)" $1; then
    reason="perl"; tag="perl"
  else
    reason="configure_error"; tag="configure"
  fi
elif bzgrep -q "Couldn't fetch it - please try" $1; then
  reason="fetch"; tag="fetch"
elif bzgrep -q "out of .* hunks .*--saving rejects to" $1; then
  reason="patch"; tag="patch"
elif bzgrep -q 'Error: category .* not in list of valid categories' $1; then
  reason="CATEGORIES"; tag="categories"
elif bzgrep -qi 'read-only file system' $1; then
  reason="WRKDIR"; tag="wrkdir"
elif bzgrep -q "Error: shared library \".*\" does not exist" $1; then
  reason="LIB_DEPENDS"; tag="libdepends"
elif bzgrep -q ".*\.h: No such file" $1; then
  if bzgrep -qE "(X11/.*|Xosdefs)\.h: No such file" $1; then
    if bzgrep -q "XFree86-.*\.tgz" $1; then
      reason="missing_header"; tag="header"
    else
      reason="USE_XLIB"; tag="usexlib"
    fi
  else
    reason="missing_header"; tag="header"
  fi
elif bzgrep -q "pnohang: killing make checksum" $1; then
  reason="fetch_timeout"; tag="fetch-timeout"
elif bzgrep -qE "USER   PID  PPID  PGID.*JOBC STAT  TT       TIME COMMAND" $1; then
  reason="runaway_process"; tag="runaway"
elif bzgrep -q "pnohang: killing make package" $1; then
  reason="runaway_process"; tag="runaway"
elif bzgrep -qE "pkg_(add|create):.*(can't find enough temporary space|projected size of .* exceeds available free space)" $1; then
  reason="disk_full"; tag="df"
elif bzgrep -qE '(parse error|too (many|few) arguments to|argument.*doesn.*prototype|incompatible type for argument|conflicting types for|undeclared \(first use (in |)this function\)|incorrect number of parameters|has incomplete type and cannot be initialized|error: storage size.* isn.t known)' $1; then
  reason="compiler_error"; tag="cc"
elif bzgrep -qE '(ANSI C.. forbids|is a contravariance violation|changed for new ANSI .for. scoping|[0-9]: passing .* changes signedness|discards qualifiers|lacks a cast|redeclared as different kind of symbol|invalid type .* for default argument to|wrong type argument to unary exclamation mark|duplicate explicit instantiation of|incompatible types in assignment|assuming . on overloaded member function|call of overloaded .* is ambiguous|declaration of C function .* conflicts with|initialization of non-const reference type|using typedef-name .* after|[0-9]: implicit declaration of function|[0-9]: size of array .* is too large|fixed or forbidden register .* for class|assignment of read-only variable|error: label at end of compound statement|error:.*(has no|is not a) member|error:.*is (private|protected)|error: uninitialized member|error: unrecognized command line option)' $1; then
  reason="new_compiler_error"; tag="newgcc"
elif bzgrep -qE '(syntax error before|ISO C\+\+ forbids|friend declaration|no matching function for call to|.main. must return .int.|invalid conversion from|cannot be used as a macro name as it is an operator in C\+\+|is not a member of type|after previous specification in|no class template named|because worst conversion for the former|better than worst conversion|no match for.*operator|no match for call to|undeclared in namespace|is used as a type, but is not|error: array bound forbidden|error: class definition|error: expected constructor|error: there are no arguments|error:.*cast.*loses precision|ISO C\+\+ does not support)' $1; then
  reason="bad_C++_code"; tag="badc++"
elif bzgrep -qE '(/usr/libexec/elf/ld: cannot find|undefined reference to|cannot open -l.*: No such file)' $1; then
  reason="linker_error"; tag="ld"
elif bzgrep -qE 'chown:.*[Ii]nvalid argument' $1; then
  reason="chown"; tag="chown"
#elif bzgrep -qE 'cp:.*Invalid argument' $1; then
#  reason="munmap"; tag="munmap"
elif bzgrep -q 'install: .*: No such file' $1; then
  if bzgrep -q 'install: /usr/local/www/cgi-bin.*No such file or directory' $1; then
    reason="cgi-bin"; tag="cgi-bin"
  else
    reason="install_error"; tag="install"
  fi
elif bzgrep -q "/usr/.*/man/.*: No such file or directory" $1; then
  reason="manpage"; tag="manpage"
elif bzgrep -qE "(Can't|unable to) open display" $1; then
  reason="DISPLAY"; tag="display"
elif bzgrep -q "conflicts with installed package" $1; then
  reason="depend_object"; tag="dependobj"
elif bzgrep -q " is already installed - perhaps an older version" $1; then
  reason="depend_object"; tag="dependobj"
elif bzgrep -q "You may wish to ..make deinstall.. and install this port again" $1; then
  reason="depend_object"; tag="dependobj"
elif bzgrep -q "error in dependency .*, exiting" $1; then
  reason="depend_package"; tag="dependpkg"
elif bzgrep -q "core dumped" $1; then
  reason="coredump"; tag="coredump"
elif bzgrep -q "Segmentation fault" $1; then
  reason="segfault"; tag="segfault"
elif bzgrep -q "initializer element is not constant" $1; then
  reason="stdio"; tag="stdio"
elif bzgrep -q "structure has no member named" $1; then
  reason="struct_changes"; tag="struct"
elif bzgrep -q "Error: alignment not a power of 2" $1; then
  reason="alignment"; tag="alignment"
elif bzgrep -qE "bin.apxs:(.)(not found|No such file or directory)" $1; then
  reason="apxs"; tag="apxs"
elif bzgrep -qE "failed to exec .*bin/apxs" $1; then
  reason="apxs"; tag="apxs"
elif bzgrep -q ".s: Assembler messages:" $1; then
  reason="arch"; tag="arch"
elif bzgrep -qE "Cannot (determine .* target|find the byte order) for this architecture" $1; then
  reason="arch"; tag="arch"
elif bzgrep -qE "^cc1: bad value.*for -mcpu.*switch" $1; then
  reason="arch"; tag="arch"
elif bzgrep -q "could not read symbols: File in wrong format" $1; then
  reason="arch"; tag="arch"
elif bzgrep -qE "[Ee]rror: [Uu]nknown opcode" $1; then
  reason="arch"; tag="arch"
elif bzgrep -qE "error.*Unsupported architecture" $1; then
  reason="arch"; tag="arch"
elif bzgrep -q "ENDIAN must be defined 0 or 1" $1; then
  reason="arch"; tag="arch"
elif bzgrep -q "failed to merge target-specific data" $1; then
  reason="arch"; tag="arch"
elif bzgrep -qE "(file not recognized|failed to set dynamic section sizes): File format not recognized" $1; then
  reason="arch"; tag="arch"
elif bzgrep -q "impossible register constraint" $1; then
  reason="arch"; tag="arch"
elif bzgrep -qE "inconsistent operand constraints in an .asm" $1;  then
  reason="arch"; tag="arch"
elif bzgrep -qE "Invalid configuration.*unknown.*machine.*unknown not recognized" $1; then
  reason="arch"; tag="arch"
elif bzgrep -q "invalid lvalue in asm statement" $1;  then
  reason="arch"; tag="arch"
elif bzgrep -qE "is only for.*, and you are running" $1;  then
  reason="arch"; tag="arch"
elif bzgrep -q "not a valid 64 bit base/index expression" $1;  then
  reason="arch"; tag="arch"
elif bzgrep -qE "relocation R_X86_64_32.*can not be used when making a shared object" $1;  then
  reason="arch"; tag="arch"
elif bzgrep -q "relocation truncated to fit: " $1;  then
  reason="arch"; tag="arch"
elif bzgrep -q "shminit failed: Function not implemented" $1;  then
  reason="arch"; tag="arch"
elif bzgrep -qE "The target cpu, .*, is not currently supported." $1;  then
  reason="arch"; tag="arch"
elif bzgrep -q "This architecture seems to be neither big endian nor little endian" $1;  then
  reason="arch"; tag="arch"
elif bzgrep -q "unknown register name" $1;  then
  reason="arch"; tag="arch"
elif bzgrep -q "Unable to correct byte order" $1;  then
  reason="arch"; tag="arch"
elif bzgrep -q "Unsupported platform, sorry" $1;  then
  reason="arch"; tag="arch"
elif bzgrep -q "won't run on this architecture" $1;  then
  reason="arch"; tag="arch"
elif bzgrep -qE "#error .Cannot compile:" $1; then
  reason="assert"; tag="assert"
elif bzgrep -qE "autoconf(.*): not found" $1; then
  reason="autoconf"; tag="autoconf"
elif bzgrep -qE "autoconf(.*): No such file or directory" $1; then
  reason="autoconf"; tag="autoconf"
elif bzgrep -q "autoheader: not found" $1; then
  reason="autoheader"; tag="autoheader"
elif bzgrep -qE "automake(.*): not found" $1; then
  reason="automake"; tag="automake"
elif bzgrep -q "/usr/local/www/cgi-bin does not exist" $1; then
  reason="cgi-bin"; tag="cgi-bin"
elif bzgrep -q "Shared object \"libc.so.6\" not found, required by" $1; then
  reason="compat6x"; tag="compat6x"
elif bzgrep -q "Cannot open /dev/tty for read" $1; then
  reason="DISPLAY"; tag="display"
elif bzgrep -q "RuntimeError: cannot open display" $1; then
  reason="DISPLAY"; tag="display"
elif bzgrep -q "You must run this program under the X-Window System" $1; then
  reason="DISPLAY"; tag="display"
elif bzgrep -qE "Member name contains .\.\." $1; then
  reason="fetch"; tag="fetch"
elif bzgrep -q "fetch: transfer timed out" $1; then
  reason="fetch_timeout"; tag="fetch-timeout"
elif bzgrep -q "fetch: transfer timed out" $1; then
  reason="fetch_timeout"; tag="fetch-timeout"
elif bzgrep -q 'Run-time system build failed for some reason' $1; then
  reason="install_error"; tag="install"
elif bzgrep -q 'tar: Error opening archive: Failed to open.*No such file or directory' $1; then
  reason="install_error"; tag="install"
elif bzgrep -q "cc: .*libintl.*: No such file or directory" $1; then
  reason="linker_error"; tag="ld"
elif bzgrep -qE "cc: ndbm\.so: No such file or directory" $1; then
  reason="linker_error"; tag="ld"
elif bzgrep -q "error: The X11 shared library could not be loaded" $1; then
  reason="linker_error"; tag="ld"
elif bzgrep -q "libtool: link: cannot find the library" $1; then
  reason="linker_error"; tag="ld"
elif bzgrep -q "relocation against dynamic symbol" $1; then
  reason="linker_error"; tag="ld"
elif bzgrep -q "Shared object.*not found, required by" $1; then
  reason="linker_error"; tag="ld"
elif bzgrep -q "Could not create Makefile" $1; then
  reason="makefile"; tag="makefile"
elif bzgrep -v "regression-test.continuing" $1 | grep -qE "make.*(cannot open [Mm]akefile|don.t know how to make|fatal errors encountered|No rule to make target|built-in)"; then
  reason="makefile"; tag="makefile"
elif bzgrep -qE "(Error: mtree file ./etc/mtree/BSD.local.dist. is missing|error in pkg_delete|filesystem was touched prior to .make install|list of files present before this port was installed|list of filesystem changes from before and after)" $1; then
  reason="mtree"; tag="mtree"
elif bzgrep -qE "cp:.*site_perl: No such file or directory" $1; then
  reason="perl"; tag="perl"
elif bzgrep -q "Perl .* required--this is only version" $1; then
  reason="perl"; tag="perl"
elif bzgrep -q 'BEGIN failed--compilation aborted at ..Makefile.PL line' $1; then
  reason="perl5"; tag="perl5"
elif bzgrep -q "Abort trap" $1; then
  reason="process_failed"; tag="process"
elif bzgrep -q "Bus error" $1; then
  reason="process_failed"; tag="process"
elif bzgrep -q "Signal 1[01]" $1; then
  reason="process_failed"; tag="process"
elif bzgrep -q "python: not found" $1; then
  reason="python"; tag="python"
elif bzgrep -q ': The -pthread option is deprecated' $1; then
  reason="threads"; tag="threads"
elif bzgrep -q "Error: pthreads are required to build this package" $1; then
  reason="threads"; tag="threads"
elif bzgrep -q "Please install/update your POSIX threads (pthreads) library" $1; then
  reason="threads"; tag="threads"
elif bzgrep -qE "requires.*thread support" $1; then
  reason="threads"; tag="threads"
elif bzgrep -q "/usr/bin/ld: cannot find -lpthread" $1; then
  reason="threads"; tag="threads"
elif bzgrep -q "/usr/bin/ld: cannot find -lXThrStub" $1; then
  reason="threads"; tag="threads"
elif bzgrep -q "<varargs.h> is obsolete with this version of GCC" $1; then
  reason="varargs"; tag="varargs"

# Although these can be fairly common, and thus in one sense ought to be
# earlier in the evaluation, in practice they are most often secondary
# types of errors, and thus need to be evaluated after all the specific
# cases.

elif bzgrep -qE '(gmake:.*Error [12]|tar: Error exit delayed from previous errors)' $1; then
    reason="install_error"; tag="install"
elif bzgrep -q "Cannot stat: " $1; then
  reason="configure_error"; tag="configure"
elif bzgrep -q "/usr/bin/ld: cannot find -l" $1; then
  reason="linker_error"; tag="ld"
elif bzgrep -q "cd: can't cd to" $1; then
  reason="NFS"; tag="nfs"
elif bzgrep -q "pkg_create: make_dist: tar command failed with code" $1; then
  reason="PLIST"; tag="plist"

else
  reason="???"; tag="unknown"
fi

# XXX MCL perhaps segfault, coredump should be unified into process failed?

# clean up some error cases -- the way .logs works, it expects that
# every field in it MUST be nonblank, so we insert a metatoken here.
# See below.
if [ -z "$dir" ]; then
   dir="NONE"
fi
if [ -z "$maintainer" ]; then
   maintainer="NONE"
fi
if [ -z "$datetime" ]; then
   datetime="NONE"
fi

broken="no"
if bzgrep -q "Trying build of .* even though it is marked BROKEN" $1; then
   broken="broken"
fi

echo "$filename|$portname|$affected|$logsize|$dir|$maintainer|$reason|$tag|$broken|$datetime|$errordir"