198 val build_end = "build_end" |
207 val build_end = "build_end" |
199 val isabelle_version = "isabelle_version" |
208 val isabelle_version = "isabelle_version" |
200 val afp_version = "afp_version" |
209 val afp_version = "afp_version" |
201 } |
210 } |
202 |
211 |
|
212 object Isatest |
|
213 { |
|
214 val Test_Start = new Regex("""^------------------- starting test --- (.+) --- (.+)$""") |
|
215 val Test_End = new Regex("""^------------------- test (?:successful|FAILED) --- (.+) --- .*$""") |
|
216 val Isabelle_Version = new Regex("""^Isabelle version: (\S+)$""") |
|
217 val No_AFP_Version = new Regex("""$.""") |
|
218 } |
|
219 |
203 object AFP |
220 object AFP |
204 { |
221 { |
205 val Date_Format = |
|
206 Date.Format.make_patterns(List("EEE MMM d HH:mm:ss VV yyyy", "EEE MMM d HH:mm:ss O yyyy"), |
|
207 // workaround for jdk-8u102 |
|
208 s => Word.implode(Word.explode(s).map({ |
|
209 case "CET" | "MET" => "GMT+1" |
|
210 case "CEST" | "MEST" => "GMT+2" |
|
211 case "EST" => "GMT+1" // FIXME ?? |
|
212 case a => a }))) |
|
213 |
|
214 val Test_Start = new Regex("""^Start test(?: for .+)? at ([^,]+), (.*)$""") |
222 val Test_Start = new Regex("""^Start test(?: for .+)? at ([^,]+), (.*)$""") |
215 val Test_Start_Old = new Regex("""^Start test(?: for .+)? at ([^,]+)$""") |
223 val Test_Start_Old = new Regex("""^Start test(?: for .+)? at ([^,]+)$""") |
216 val Test_End = new Regex("""^End test on (.+), .+, elapsed time:.*$""") |
224 val Test_End = new Regex("""^End test on (.+), .+, elapsed time:.*$""") |
217 val Isabelle_Version = new Regex("""^Isabelle version: .* -- hg id (\S+)$""") |
225 val Isabelle_Version = new Regex("""^Isabelle version: .* -- hg id (\S+)$""") |
218 val AFP_Version = new Regex("""^AFP version: .* -- hg id (\S+)$""") |
226 val AFP_Version = new Regex("""^AFP version: .* -- hg id (\S+)$""") |
219 } |
227 } |
220 |
228 |
221 private def parse_header(log_file: Log_File): Header = |
229 private def parse_header(log_file: Log_File): Header = |
222 { |
230 { |
223 def parse_afp(start: Date, hostname: String): Header = |
231 def parse(kind: Header_Kind.Value, start: Date, hostname: String, |
|
232 Test_End: Regex, Isabelle_Version: Regex, AFP_Version: Regex): Header = |
224 { |
233 { |
225 val start_date = Field.build_start -> start.toString |
234 val start_date = Field.build_start -> start.toString |
226 val end_date = |
235 val end_date = |
227 log_file.lines.last match { |
236 log_file.lines.last match { |
228 case AFP.Test_End(AFP.Date_Format.Strict(end_date)) => |
237 case Test_End(Date_Format.Strict(end_date)) => |
229 List(Field.build_end -> end_date.toString) |
238 List(Field.build_end -> end_date.toString) |
230 case _ => Nil |
239 case _ => Nil |
231 } |
240 } |
232 |
241 |
233 val build_host = if (hostname == "") Nil else List(Field.build_host -> hostname) |
242 val build_host = if (hostname == "") Nil else List(Field.build_host -> hostname) |
234 |
243 |
235 val isabelle_version = |
244 val isabelle_version = |
236 log_file.find_match(AFP.Isabelle_Version).map(Field.isabelle_version -> _) |
245 log_file.find_match(Isabelle_Version).map(Field.isabelle_version -> _) |
237 |
246 |
238 val afp_version = |
247 val afp_version = |
239 log_file.find_match(AFP.AFP_Version).map(Field.afp_version -> _) |
248 log_file.find_match(AFP_Version).map(Field.afp_version -> _) |
240 |
249 |
241 Header(Header_Kind.AFP_TEST, |
250 Header(kind, |
242 start_date :: end_date ::: build_host ::: isabelle_version.toList ::: afp_version.toList, |
251 start_date :: end_date ::: build_host ::: |
|
252 isabelle_version.toList ::: afp_version.toList, |
243 log_file.get_settings(Settings.all_settings)) |
253 log_file.get_settings(Settings.all_settings)) |
244 } |
254 } |
245 |
255 |
246 log_file.lines match { |
256 log_file.lines match { |
247 case AFP.Test_Start(AFP.Date_Format.Strict(start_date), hostname) :: _ => |
257 case Isatest.Test_Start(Date_Format.Strict(start), hostname) :: _ => |
248 parse_afp(start_date, hostname) |
258 parse(Header_Kind.ISATEST, start, hostname, |
249 case AFP.Test_Start_Old(AFP.Date_Format.Strict(start_date)) :: _ => |
259 Isatest.Test_End, Isatest.Isabelle_Version, Isatest.No_AFP_Version) |
250 parse_afp(start_date, "") |
260 case AFP.Test_Start(Date_Format.Strict(start), hostname) :: _ => |
|
261 parse(Header_Kind.AFP_TEST, start, hostname, |
|
262 AFP.Test_End, AFP.Isabelle_Version, AFP.AFP_Version) |
|
263 case AFP.Test_Start_Old(Date_Format.Strict(start)) :: _ => |
|
264 parse(Header_Kind.AFP_TEST, start, "", |
|
265 AFP.Test_End, AFP.Isabelle_Version, AFP.AFP_Version) |
251 case _ => log_file.err("cannot detect log header format") |
266 case _ => log_file.err("cannot detect log header format") |
252 } |
267 } |
253 } |
268 } |
254 |
269 |
255 |
270 |