summaryrefslogtreecommitdiffstats
path: root/Tools/portbuild/scripts/processonelog
blob: 7b3718613bb785f9a38900fe09daa67be9f63886 (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
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
#!/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 -qE "(Error: mtree file ./etc/mtree/BSD.local.dist. is missing|error in pkg_delete|filesystem was touched prior to .make install|list of extra files and directories|list of files present before this port was installed|list of filesystem changes from before and after)" $1; then
  reason="mtree"; tag="mtree"
# 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: [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 "Error: shared library \".*\" does not exist" $1; then
  reason="LIB_DEPENDS"; tag="libdepends"
elif bzgrep -qE "\.(c|cc|cxx|cpp|h|y)[1-9:]+ .+\.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 -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|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]: 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|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 'error: (array type has incomplete element type|conflicts with new declaration|expected.*before .class|expected primary expression|extra qualification .* on member|.*has incomplete type|invalid cast from type .* to type|invalid lvalue in (assignment|decrement|increment|unary)|invalid storage class for function|lvalue required as (increment operator|left operand)|.*should have been declared inside|static declaration of.*follows non-static declaration|two or more data types in declaration specifiers|.* was not declared in this scope)' $1; then
  reason="gcc4_error"; tag="gcc4"
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 -q 'install: .*: No such file' $1; then
  reason="install_error"; tag="install"
elif bzgrep -qE "(conflicts with installed package|is already installed - perhaps an older version|You may wish to ..make deinstall.. and install this port again)" $1; then
  reason="depend_object"; tag="dependobj"
elif bzgrep -q "core dumped" $1; then
  reason="coredump"; tag="coredump"

# below here are the less common items

elif bzgrep -qE "(.s: Assembler messages:|Cannot (determine .* target|find the byte order) for this architecture|^cc1: bad value.*for -mcpu.*switch|could not read symbols: File in wrong format|[Ee]rror: [Uu]nknown opcode|error.*Unsupported architecture|ENDIAN must be defined 0 or 1|failed to merge target-specific data|(file not recognized|failed to set dynamic section sizes): File format not recognized|impossible register constraint|inconsistent operand constraints in an .asm|Invalid configuration.*unknown.*machine.*unknown not recognized|invalid lvalue in asm statement|is only for.*, and you are running|not a valid 64 bit base/index expression|relocation R_X86_64_32.*can not be used when making a shared object|relocation truncated to fit: |shminit failed: Function not implemented|The target cpu, .*, is not currently supported.|This architecture seems to be neither big endian nor little endian|unknown register name|Unable to correct byte order|Unsupported platform, sorry|won't run on this architecture)" $1;  then
  reason="arch"; tag="arch"
elif bzgrep -qE "autoconf([0-9\-\.]*): (not found|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 'Checksum mismatch' $1; then
  reason="checksum"; tag="checksum"
elif bzgrep -qE 'chown:.*[Ii]nvalid argument' $1; then
  reason="chown"; tag="chown"
elif bzgrep -q "Shared object \"libc.so.6\" not found, required by" $1; then
  reason="compat6x"; tag="compat6x"
elif bzgrep -q "error in dependency .*, exiting" $1; then
  reason="depend_package"; tag="dependpkg"
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 "((Can't|unable to) open display|Cannot open /dev/tty for read|RuntimeError: cannot open display|You must run this program under the X-Window System)" $1; then
elif bzgrep -qE '(No checksum recorded for|(Maybe|Either) .* is out of date, or)' $1; then
  reason="distinfo_update"; tag="distinfo"
elif bzgrep -qE "Member name contains .\.\." $1; then
  reason="fetch"; tag="fetch"
elif bzgrep -qE "(pnohang: killing make checksum|fetch: transfer timed out)" $1; then
  reason="fetch_timeout"; tag="fetch-timeout"
elif bzgrep -qE "(f77: not found|f77:No such file or directory|Unable to find a fortran compiler)" $1; then
  reason="f77"; tag="f77"
elif bzgrep -q "See <URL:http://gcc.gnu.org/bugs.html> for instructions." $1; then
  reason="gcc_bug"; tag="gcc-bug"
elif bzgrep -qE "(Run-time system build failed for some reason|tar: Error opening archive: Failed to open.*No such file or directory)" $1; then
  reason="install_error"; tag="install"
elif bzgrep -qE "(cc: .*libintl.*: No such file or directory|cc: ndbm\.so: No such file or directory|error: The X11 shared library could not be loaded|libtool: link: cannot find the library|relocation against dynamic symbol|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 -q "/usr/.*/man/.*: No such file or directory" $1; then
  reason="manpage"; tag="manpage"
elif bzgrep -q "out of .* hunks .*--saving rejects to" $1; then
  reason="patch"; tag="patch"
elif bzgrep -qE "(/usr/local/bin/(perl|perl5.6.1):.*(not found|No such file or directory)|cp:.*site_perl: No such file or directory|perl(.*): Perl is not installed, try .pkg_add -r perl|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 -qE "(Abort trap|Bus error|Signal 1[01])" $1; then
  reason="process_failed"; tag="process"
elif bzgrep -q "python: not found" $1; then
  reason="python"; tag="python"
elif bzgrep -qE "(USER   PID  PPID  PGID.*JOBC STAT  TT       TIME COMMAND|pnohang: killing make package)" $1; then
  reason="runaway_process"; tag="runaway"
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 "shminit failed: Permission denied" $1; then
  reason="sysvipc"; tag="sysvipc"
elif bzgrep -qE "(/usr/bin/ld: cannot find -l(pthread|XThrStub)|cannot find -lc_r|checking for.*lc_r\.\.\. no|Error: pthreads are required to build this package|Please install/update your POSIX threads (pthreads) library|requires.*thread support|: The -pthread option is deprecated)" $1; then
  reason="threads"; tag="threads"
elif bzgrep -q "<varargs.h> is obsolete with this version of GCC" $1; then
  reason="varargs"; tag="varargs"
elif bzgrep -qi 'read-only file system' $1; then
  reason="WRKDIR"; tag="wrkdir"

# 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 'cc1.*warnings being treated as errors' $1; then
  reason="compiler_error"; tag="cc"
elif bzgrep -q '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

# 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"
OpenPOWER on IntegriCloud