src/Pure/Tools/build_log.scala
author wenzelm
Tue, 04 Oct 2016 21:11:35 +0200
changeset 64045 c6160d0b0337
child 64053 7ece2e14fd6c
permissions -rw-r--r--
clarified modules;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64045
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Tools/build_log.scala
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
     3
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
     4
Build log parsing for historic versions, back to "build_history_base".
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
     5
*/
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
     6
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
     7
package isabelle
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
     8
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
     9
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    10
object Build_Log
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    11
{
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    12
  /* inlined properties (YXML) */
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    13
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    14
  object Props
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    15
  {
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    16
    def parse(text: String): Properties.T = XML.Decode.properties(YXML.parse_body(text))
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    17
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    18
    def parse_lines(prefix: String, lines: List[String]): List[Properties.T] =
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    19
      for (line <- lines; s <- Library.try_unprefix(prefix, line)) yield parse(s)
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    20
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    21
    def find_parse_line(prefix: String, lines: List[String]): Option[Properties.T] =
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    22
      lines.find(_.startsWith(prefix)).map(line => parse(line.substring(prefix.length)))
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    23
  }
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    24
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    25
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    26
  /* session log: produced by "isabelle build" */
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    27
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    28
  sealed case class Session_Info(
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    29
    session_name: String,
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    30
    session_timing: Properties.T,
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    31
    command_timings: List[Properties.T],
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    32
    ml_statistics: List[Properties.T],
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    33
    task_statistics: List[Properties.T])
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    34
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    35
  val SESSION_NAME = "\fSession.name = "
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    36
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    37
  def parse_session_info(name0: String, lines: List[String], full: Boolean): Session_Info =
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    38
  {
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    39
    val xml_cache = new XML.Cache()
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    40
    def parse_lines(prfx: String): List[Properties.T] =
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    41
      Props.parse_lines(prfx, lines).map(xml_cache.props(_))
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    42
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    43
    val session_name =
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    44
      lines.find(_.startsWith(SESSION_NAME)).map(_.substring(SESSION_NAME.length)) match {
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    45
        case None => name0
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    46
        case Some(name) if name0 == "" || name0 == name => name
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    47
        case Some(name) =>
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    48
          error("Session log for " + quote(name0) + " is actually from " + quote(name))
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    49
      }
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    50
    val session_timing = Props.find_parse_line("\fTiming = ", lines) getOrElse Nil
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    51
    val command_timings = parse_lines("\fcommand_timing = ")
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    52
    val ml_statistics = if (full) parse_lines("\fML_statistics = ") else Nil
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    53
    val task_statistics = if (full) parse_lines("\ftask_statistics = ") else Nil
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    54
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    55
    Session_Info(session_name, session_timing, command_timings, ml_statistics, task_statistics)
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    56
  }
c6160d0b0337 clarified modules;
wenzelm
parents:
diff changeset
    57
}