src/Pure/Tools/build_log.scala
changeset 64095 1a6d37c31df9
parent 64094 629558a1ecf5
child 64096 5edeb60a7ec5
equal deleted inserted replaced
64094:629558a1ecf5 64095:1a6d37c31df9
   179   }
   179   }
   180 
   180 
   181 
   181 
   182   /* header and meta data */
   182   /* header and meta data */
   183 
   183 
       
   184   val Date_Format =
       
   185     Date.Format.make_patterns(List("EEE MMM d HH:mm:ss VV yyyy", "EEE MMM d HH:mm:ss O yyyy"),
       
   186       // workaround for jdk-8u102
       
   187       s => Word.implode(Word.explode(s).map({
       
   188         case "CET" | "MET" => "GMT+1"
       
   189         case "CEST" | "MEST" => "GMT+2"
       
   190         case "EST" => "GMT+1"  // FIXME ??
       
   191         case a => a })))
       
   192 
   184   object Header_Kind extends Enumeration
   193   object Header_Kind extends Enumeration
   185   {
   194   {
   186     val ISATEST = Value("isatest")
   195     val ISATEST = Value("isatest")
   187     val AFP_TEST = Value("afp-test")
   196     val AFP_TEST = Value("afp-test")
   188     val JENKINS = Value("jenkins")
   197     val JENKINS = Value("jenkins")
   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