src/Pure/Build/build_manager.scala
author Fabian Huch <huch@in.tum.de>
Wed, 05 Jun 2024 17:27:13 +0200
changeset 80254 6b3374d208b8
parent 80252 96543177ab7e
child 80255 1844c169e360
permissions -rw-r--r--
add verbose option to build_task;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
     1
/*  Title:      Pure/Build/build_manager.scala
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
     2
    Author:     Fabian Huch, TU Muenchen
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
     3
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
     4
Isabelle manager for automated and quasi-interactive builds, with web frontend.
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
     5
*/
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
     6
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
     7
package isabelle
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
     8
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
     9
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    10
import scala.collection.mutable
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    11
import scala.annotation.tailrec
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    12
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    13
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    14
object Build_Manager {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    15
  /* task state synchronized via db */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    16
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    17
  object Component {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    18
    def parse(s: String): Component =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    19
      space_explode('/', s) match {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    20
        case name :: rev :: Nil => Component(name, rev)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    21
        case _ => error("Malformed component: " + quote(s))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    22
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    23
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    24
    def AFP(rev: String = "") = Component("AFP", rev)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    25
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    26
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    27
  case class Component(name: String, rev: String = "") {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    28
    override def toString: String = name + "/" + rev
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    29
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    30
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    31
  sealed trait Build_Config {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    32
    def name: String
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    33
    def components: List[Component]
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    34
    def fresh_build: Boolean
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    35
    def command(build_hosts: List[Build_Cluster.Host]): String
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    36
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    37
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    38
  case class CI_Build(name: String, components: List[Component]) extends Build_Config {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    39
    def fresh_build: Boolean = true
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    40
    def command(build_hosts: List[Build_Cluster.Host]): String = " ci_build " + name
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    41
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    42
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    43
  object User_Build {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    44
    val name: String = "user"
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    45
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    46
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    47
  case class User_Build(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    48
    afp_rev: Option[String] = None,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    49
    prefs: List[Options.Spec] = Nil,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    50
    requirements: Boolean = false,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    51
    all_sessions: Boolean = false,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    52
    base_sessions: List[String] = Nil,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    53
    exclude_session_groups: List[String] = Nil,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    54
    exclude_sessions: List[String] = Nil,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    55
    session_groups: List[String] = Nil,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    56
    sessions: List[String] = Nil,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    57
    build_heap: Boolean = false,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    58
    clean_build: Boolean = false,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    59
    export_files: Boolean = false,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    60
    fresh_build: Boolean = false,
80254
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
    61
    presentation: Boolean = false,
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
    62
    verbose: Boolean = false
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    63
  ) extends Build_Config {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    64
    def name: String = User_Build.name
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    65
    def components: List[Component] = afp_rev.map(Component.AFP).toList
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    66
    def command(build_hosts: List[Build_Cluster.Host]): String = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    67
      " build" +
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    68
        if_proper(afp_rev, " -A:") +
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    69
        base_sessions.map(session => " -B " + Bash.string(session)).mkString +
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    70
        if_proper(build_hosts, build_hosts.map(host => " -H " + Bash.string(host.print)).mkString) +
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    71
        if_proper(presentation, " -P:") +
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    72
        if_proper(requirements, " -R") +
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    73
        if_proper(all_sessions, " -a") +
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    74
        if_proper(build_heap, " -b") +
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    75
        if_proper(clean_build, " -c") +
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    76
        if_proper(export_files, " -e") +
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    77
        if_proper(fresh_build, " -f") +
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    78
        Options.Spec.bash_strings(prefs, bg = true) +
80254
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
    79
        if_proper(verbose, " -v") +
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    80
        sessions.map(session => " " + Bash.string(session)).mkString
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    81
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    82
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    83
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    84
  enum Priority { case low, normal, high }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    85
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    86
  sealed trait T extends Library.Named
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    87
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    88
  sealed case class Task(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    89
    build_config: Build_Config,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    90
    id: UUID.T = UUID.random(),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    91
    submit_date: Date = Date.now(),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    92
    priority: Priority = Priority.normal,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    93
    isabelle_rev: String = ""
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    94
  ) extends T {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    95
    def name: String = id.toString
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    96
    def kind: String = build_config.name
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    97
    def components: List[Component] = build_config.components
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    98
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
    99
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   100
  sealed case class Job(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   101
    id: UUID.T,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   102
    kind: String,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   103
    number: Long,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   104
    isabelle_rev: String,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   105
    components: List[Component],
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   106
    start_date: Date = Date.now(),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   107
    cancelled: Boolean = false
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   108
  ) extends T { def name: String = kind + "/" + number }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   109
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   110
  object Status {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   111
    def from_result(result: Process_Result): Status = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   112
      if (result.ok) Status.ok
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   113
      else if (result.interrupted) Status.cancelled
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   114
      else Status.failed
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   115
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   116
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   117
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   118
  enum Status { case ok, cancelled, aborted, failed  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   119
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   120
  sealed case class Result(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   121
    kind: String,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   122
    number: Long,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   123
    status: Status,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   124
    id: Option[UUID.T] = None,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   125
    date: Date = Date.now(),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   126
    serial: Long = 0,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   127
  ) extends T { def name: String = kind + "/" + number }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   128
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   129
  object State {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   130
    def max_serial(serials: Iterable[Long]): Long = serials.maxOption.getOrElse(0L)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   131
    def inc_serial(serial: Long): Long = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   132
      require(serial < Long.MaxValue, "number overflow")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   133
      serial + 1
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   134
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   135
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   136
    type Pending = Library.Update.Data[Task]
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   137
    type Running = Library.Update.Data[Job]
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   138
    type Finished = Map[String, Result]
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   139
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   140
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   141
  sealed case class State(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   142
    serial: Long = 0,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   143
    pending: State.Pending = Map.empty,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   144
    running: State.Running = Map.empty,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   145
    finished: State.Finished = Map.empty
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   146
  ) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   147
    def next_serial: Long = State.inc_serial(serial)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   148
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   149
    def add_pending(task: Task): State = copy(pending = pending + (task.name -> task))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   150
    def remove_pending(name: String): State = copy(pending = pending - name)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   151
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   152
    def num_builds = running.size + finished.size
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   153
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   154
    def next: List[Task] =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   155
      if (pending.isEmpty) Nil
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   156
      else {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   157
        val priority = pending.values.map(_.priority).maxBy(_.ordinal)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   158
        pending.values.filter(_.priority == priority).toList.sortBy(_.submit_date)(Date.Ordering)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   159
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   160
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   161
    def add_running(job: Job): State = copy(running = running + (job.name -> job))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   162
    def remove_running(name: String): State = copy(running = running - name)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   163
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   164
    def add_finished(result: Result): State = copy(finished = finished + (result.name -> result))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   165
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   166
    lazy val kinds = (
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   167
      pending.values.map(_.kind) ++
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   168
      running.values.map(_.kind) ++
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   169
      finished.values.map(_.kind)).toList.distinct
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   170
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   171
    def next_number(kind: String): Long = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   172
      val serials = get_finished(kind).map(_.number) ::: get_running(kind).map(_.number)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   173
      State.inc_serial(State.max_serial(serials))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   174
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   175
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   176
    def get_running(kind: String): List[Job] =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   177
      (for ((_, job) <- running if job.kind == kind) yield job).toList
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   178
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   179
    def get_finished(kind: String): List[Result] =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   180
      (for ((_, result) <- finished if result.kind == kind) yield result).toList
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   181
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   182
    def get(name: String): Option[T] =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   183
      pending.get(name).orElse(running.get(name)).orElse(finished.get(name))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   184
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   185
    def get(id: UUID.T): Option[T] =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   186
      pending.values.find(_.id == id).orElse(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   187
        running.values.find(_.id == id)).orElse(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   188
        finished.values.find(_.id.contains(id)))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   189
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   190
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   191
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   192
  /* SQL data model */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   193
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   194
  object private_data extends SQL.Data("isabelle_build_manager") {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   195
    /* tables */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   196
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   197
    override lazy val tables: SQL.Tables =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   198
      SQL.Tables(State.table, Pending.table, Running.table, Finished.table)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   199
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   200
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   201
    /* state */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   202
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   203
    object State {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   204
      val serial = SQL.Column.long("serial").make_primary_key
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   205
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   206
      val table = make_table(List(serial), name = "state")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   207
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   208
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   209
    def read_serial(db: SQL.Database): Long =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   210
      db.execute_query_statementO[Long](
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   211
        State.table.select(List(State.serial.max)),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   212
        _.long(State.serial)).getOrElse(0L)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   213
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   214
    def pull_state(db: SQL.Database, state: State): State = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   215
      val serial_db = read_serial(db)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   216
      if (serial_db == state.serial) state
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   217
      else {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   218
        val serial = serial_db max state.serial
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   219
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   220
        val pending = pull_pending(db)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   221
        val running = pull_running(db)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   222
        val finished = pull_finished(db, state.finished)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   223
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   224
        state.copy(serial = serial, pending = pending, running = running, finished = finished)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   225
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   226
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   227
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   228
    def push_state(db: SQL.Database, old_state: State, state: State): State = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   229
      val finished = push_finished(db, state.finished)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   230
      val updates =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   231
        List(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   232
          update_pending(db, old_state.pending, state.pending),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   233
          update_running(db, old_state.running, state.running),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   234
        ).filter(_.defined)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   235
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   236
      if (updates.isEmpty && finished == old_state.finished) state
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   237
      else {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   238
        val serial = state.next_serial
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   239
        db.execute_statement(State.table.delete(State.serial.where_equal(old_state.serial)))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   240
        db.execute_statement(State.table.insert(), body =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   241
          { (stmt: SQL.Statement) =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   242
            stmt.long(1) = serial
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   243
          })
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   244
        state.copy(serial = serial, finished = finished)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   245
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   246
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   247
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   248
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   249
    /* pending */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   250
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   251
    object Pending {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   252
      val kind = SQL.Column.string("kind")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   253
      val id = SQL.Column.string("id").make_primary_key
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   254
      val submit_date = SQL.Column.date("submit_date")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   255
      val priority = SQL.Column.string("priority")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   256
      val isabelle_rev = SQL.Column.string("isabelle_rev")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   257
      val components = SQL.Column.string("components")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   258
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   259
      val prefs = SQL.Column.string("prefs")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   260
      val requirements = SQL.Column.bool("requirements")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   261
      val all_sessions = SQL.Column.bool("all_sessions")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   262
      val base_sessions = SQL.Column.string("base_sessions")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   263
      val exclude_session_groups = SQL.Column.string("exclude_session_groups")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   264
      val exclude_sessions = SQL.Column.string("exclude_sessions")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   265
      val session_groups = SQL.Column.string("session_groups")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   266
      val sessions = SQL.Column.string("sessions")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   267
      val build_heap = SQL.Column.bool("build_heap")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   268
      val clean_build = SQL.Column.bool("clean_build")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   269
      val export_files = SQL.Column.bool("export_files")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   270
      val fresh_build = SQL.Column.bool("fresh_build")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   271
      val presentation = SQL.Column.bool("presentation")
80254
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
   272
      val verbose = SQL.Column.bool("verbose")
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   273
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   274
      val table =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   275
        make_table(List(kind, id, submit_date, priority, isabelle_rev, components, prefs,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   276
          requirements, all_sessions, base_sessions, exclude_session_groups, exclude_sessions,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   277
          session_groups, sessions, build_heap, clean_build, export_files, fresh_build,
80254
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
   278
          presentation, verbose),
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   279
        name = "pending")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   280
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   281
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   282
    def pull_pending(db: SQL.Database): Build_Manager.State.Pending =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   283
      db.execute_query_statement(Pending.table.select(), Map.from[String, Task], get =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   284
        { res =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   285
          val kind = res.string(Pending.kind)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   286
          val id = res.string(Pending.id)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   287
          val submit_date = res.date(Pending.submit_date)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   288
          val priority = Priority.valueOf(res.string(Pending.priority))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   289
          val isabelle_rev = res.string(Pending.isabelle_rev)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   290
          val components = space_explode(',', res.string(Pending.components)).map(Component.parse)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   291
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   292
          val build_config =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   293
            if (kind != User_Build.name) CI_Build(kind, components)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   294
            else {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   295
              val prefs = Options.Spec.parse(res.string(Pending.prefs))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   296
              val requirements = res.bool(Pending.requirements)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   297
              val all_sessions = res.bool(Pending.all_sessions)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   298
              val base_sessions = space_explode(',', res.string(Pending.base_sessions))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   299
              val exclude_session_groups =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   300
                space_explode(',', res.string(Pending.exclude_session_groups))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   301
              val exclude_sessions = space_explode(',', res.string(Pending.exclude_sessions))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   302
              val session_groups = space_explode(',', res.string(Pending.session_groups))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   303
              val sessions = space_explode(',', res.string(Pending.sessions))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   304
              val build_heap = res.bool(Pending.build_heap)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   305
              val clean_build = res.bool(Pending.clean_build)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   306
              val export_files = res.bool(Pending.export_files)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   307
              val fresh_build = res.bool(Pending.fresh_build)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   308
              val presentation = res.bool(Pending.presentation)
80254
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
   309
              val verbose = res.bool(Pending.verbose)
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   310
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   311
              val afp_rev = components.find(_.name == Component.AFP().name).map(_.rev)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   312
              User_Build(afp_rev, prefs, requirements, all_sessions, base_sessions,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   313
                exclude_session_groups, exclude_sessions, session_groups, sessions, build_heap,
80254
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
   314
                clean_build, export_files, fresh_build, presentation, verbose)
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   315
            }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   316
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   317
          val task = Task(build_config, UUID.make(id), submit_date, priority, isabelle_rev)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   318
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   319
          task.name -> task
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   320
        })
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   321
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   322
    def update_pending(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   323
      db: SQL.Database,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   324
      old_pending: Build_Manager.State.Pending,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   325
      pending: Build_Manager.State.Pending
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   326
    ): Library.Update = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   327
      val update = Library.Update.make(old_pending, pending)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   328
      val delete = update.delete.map(old_pending(_).id.toString)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   329
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   330
      if (update.deletes)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   331
        db.execute_statement(Pending.table.delete(Pending.id.where_member(delete)))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   332
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   333
      if (update.inserts) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   334
        db.execute_batch_statement(Pending.table.insert(), batch =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   335
          for (name <- update.insert) yield { (stmt: SQL.Statement) =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   336
            val task = pending(name)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   337
            stmt.string(1) = task.kind
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   338
            stmt.string(2) = task.id.toString
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   339
            stmt.date(3) = task.submit_date
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   340
            stmt.string(4) = task.priority.toString
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   341
            stmt.string(5) = task.isabelle_rev
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   342
            stmt.string(6) = task.components.mkString(",")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   343
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   344
            def get[A](f: User_Build => A): Option[A] =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   345
              task.build_config match {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   346
                case user_build: User_Build => Some(f(user_build))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   347
                case _ => None
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   348
              }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   349
80251
6ae378791c52 read prefs properly;
Fabian Huch <huch@in.tum.de>
parents: 80250
diff changeset
   350
            stmt.string(7) = get(user_build => user_build.prefs.map(_.print).mkString(","))
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   351
            stmt.bool(8) = get(_.requirements)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   352
            stmt.bool(9) = get(_.all_sessions)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   353
            stmt.string(10) = get(_.base_sessions.mkString(","))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   354
            stmt.string(11) = get(_.exclude_session_groups.mkString(","))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   355
            stmt.string(12) = get(_.exclude_sessions.mkString(","))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   356
            stmt.string(13) = get(_.session_groups.mkString(","))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   357
            stmt.string(14) = get(_.sessions.mkString(","))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   358
            stmt.bool(15) = get(_.build_heap)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   359
            stmt.bool(16) = get(_.clean_build)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   360
            stmt.bool(17) = get(_.export_files)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   361
            stmt.bool(18) = get(_.fresh_build)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   362
            stmt.bool(19) = get(_.presentation)
80254
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
   363
            stmt.bool(20) = get(_.verbose)
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   364
          })
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   365
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   366
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   367
      update
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   368
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   369
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   370
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   371
    /* running */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   372
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   373
    object Running {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   374
      val id = SQL.Column.string("id").make_primary_key
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   375
      val kind = SQL.Column.string("kind")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   376
      val number = SQL.Column.long("number")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   377
      val isabelle_rev = SQL.Column.string("isabelle_rev")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   378
      val components = SQL.Column.string("components")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   379
      val start_date = SQL.Column.date("start_date")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   380
      val cancelled = SQL.Column.bool("cancelled")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   381
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   382
      val table =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   383
        make_table(List(id, kind, number, isabelle_rev, components, start_date, cancelled),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   384
        name = "running")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   385
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   386
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   387
    def pull_running(db: SQL.Database): Build_Manager.State.Running =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   388
      db.execute_query_statement(Running.table.select(), Map.from[String, Job], get =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   389
        { res =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   390
          val id = res.string(Running.id)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   391
          val kind = res.string(Running.kind)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   392
          val number = res.long(Running.number)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   393
          val isabelle_rev = res.string(Running.isabelle_rev)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   394
          val components = space_explode(',', res.string(Running.components)).map(Component.parse)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   395
          val start_date = res.date(Running.start_date)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   396
          val cancelled = res.bool(Running.cancelled)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   397
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   398
          val job =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   399
            Job(UUID.make(id), kind, number, isabelle_rev, components, start_date, cancelled)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   400
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   401
          job.name -> job
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   402
        })
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   403
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   404
    def update_running(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   405
      db: SQL.Database,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   406
      old_running: Build_Manager.State.Running,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   407
      running: Build_Manager.State.Running
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   408
    ): Library.Update = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   409
      val update = Library.Update.make(old_running, running)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   410
      val delete = update.delete.map(old_running(_).id.toString)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   411
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   412
      if (update.deletes)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   413
        db.execute_statement(Running.table.delete(Running.id.where_member(delete)))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   414
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   415
      if (update.inserts) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   416
        db.execute_batch_statement(Running.table.insert(), batch =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   417
          for (name <- update.insert) yield { (stmt: SQL.Statement) =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   418
            val job = running(name)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   419
            stmt.string(1) = job.id.toString
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   420
            stmt.string(2) = job.kind
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   421
            stmt.long(3) = job.number
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   422
            stmt.string(4) = job.isabelle_rev
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   423
            stmt.string(5) = job.components.mkString(",")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   424
            stmt.date(6) = job.start_date
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   425
            stmt.bool(7) = job.cancelled
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   426
          })
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   427
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   428
      update
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   429
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   430
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   431
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   432
    /* finished */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   433
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   434
    object Finished {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   435
      val kind = SQL.Column.string("kind")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   436
      val number = SQL.Column.long("number")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   437
      val status = SQL.Column.string("status")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   438
      val id = SQL.Column.string("id")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   439
      val date = SQL.Column.date("date")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   440
      val serial = SQL.Column.long("serial").make_primary_key
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   441
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   442
      val table = make_table(List(kind, number, status, id, date, serial), name = "finished")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   443
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   444
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   445
    def read_finished_serial(db: SQL.Database): Long =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   446
      db.execute_query_statementO[Long](
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   447
        Finished.table.select(List(Finished.serial.max)),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   448
        _.long(Finished.serial)).getOrElse(0L)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   449
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   450
    def pull_finished(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   451
      db: SQL.Database,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   452
      finished: Build_Manager.State.Finished
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   453
    ): Build_Manager.State.Finished = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   454
      val max_serial0 = Build_Manager.State.max_serial(finished.values.map(_.serial))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   455
      val max_serial1 = read_finished_serial(db)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   456
      val missing = (max_serial0 + 1) to max_serial1
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   457
      finished ++ db.execute_query_statement(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   458
        Finished.table.select(sql = Finished.serial.where_member_long(missing)),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   459
        Map.from[String, Result], get =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   460
        { res =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   461
          val kind = res.string(Finished.kind)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   462
          val number = res.long(Finished.number)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   463
          val status = Status.valueOf(res.string(Finished.status))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   464
          val id = res.get_string(Finished.id).map(UUID.make)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   465
          val date = res.date(Finished.date)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   466
          val serial = res.long(Finished.serial)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   467
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   468
          val result = Result(kind, number, status, id, date, serial)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   469
          result.name -> result
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   470
        }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   471
      )
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   472
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   473
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   474
    def push_finished(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   475
      db: SQL.Database,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   476
      finished: Build_Manager.State.Finished
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   477
    ): Build_Manager.State.Finished = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   478
      val (insert0, old) = finished.partition(_._2.serial == 0L)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   479
      val max_serial = Build_Manager.State.max_serial(finished.map(_._2.serial))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   480
      val insert =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   481
        for (((_, result), n) <- insert0.zipWithIndex)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   482
        yield result.copy(serial = max_serial + 1 + n)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   483
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   484
      if (insert.nonEmpty)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   485
        db.execute_batch_statement(Finished.table.insert(), batch =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   486
          for (result <- insert) yield { (stmt: SQL.Statement) =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   487
            stmt.string(1) = result.kind
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   488
            stmt.long(2) = result.number
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   489
            stmt.string(3) = result.status.toString
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   490
            stmt.string(4) = result.id.map(_.toString)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   491
            stmt.date(5) = result.date
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   492
            stmt.long(6) = result.serial
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   493
          })
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   494
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   495
      old ++ insert.map(result => result.serial.toString -> result)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   496
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   497
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   498
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   499
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   500
  /* running build manager processes */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   501
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   502
  abstract class Loop_Process[A](name: String, store: Store, progress: Progress)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   503
    extends Runnable {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   504
    val options = store.options
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   505
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   506
    private val _database =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   507
      try { store.open_database() }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   508
      catch { case exn: Throwable => close(); throw exn }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   509
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   510
    def close(): Unit = Option(_database).foreach(_.close())
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   511
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   512
    protected var _state = State()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   513
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   514
    protected def synchronized_database[A](label: String)(body: => A): A = synchronized {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   515
      Build_Manager.private_data.transaction_lock(_database, label = name + "." + label) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   516
        val old_state = Build_Manager.private_data.pull_state(_database, _state)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   517
        _state = old_state
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   518
        val res = body
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   519
        _state = Build_Manager.private_data.push_state(_database, old_state, _state)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   520
        res
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   521
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   522
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   523
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   524
    protected def delay = options.seconds("build_manager_delay")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   525
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   526
    def init: A
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   527
    def loop_body(a: A): A
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   528
    def stopped(a: A): Boolean = progress.stopped
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   529
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   530
    private val interrupted = Synchronized(false)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   531
    private def sleep(time_limit: Time): Unit =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   532
      interrupted.timed_access(_ => Some(time_limit), b => if (b) Some((), false) else None)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   533
    def interrupt(): Unit = interrupted.change(_ => true)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   534
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   535
    @tailrec private def loop(a: A): Unit =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   536
      if (!stopped(a)) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   537
        val start = Time.now()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   538
        val a1 = loop_body(a)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   539
        if (!stopped(a)) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   540
          sleep(start + delay)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   541
          loop(a1)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   542
        }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   543
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   544
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   545
    override def run(): Unit = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   546
      progress.echo("Started " + name)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   547
      loop(init)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   548
      close()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   549
      progress.echo("Stopped " + name)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   550
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   551
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   552
    def echo(msg: String) = progress.echo(name + ": " + msg)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   553
    def echo_error_message(msg: String) = progress.echo_error_message(name + ": " + msg)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   554
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   555
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   556
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   557
  /* build runner */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   558
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   559
  object Runner {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   560
    object State {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   561
      def empty: State = new State(Map.empty, Map.empty)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   562
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   563
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   564
    class State private(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   565
      processes: Map[String, Future[Bash.Process]],
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   566
      results: Map[String, Future[Process_Result]]
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   567
    ) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   568
      def is_empty = processes.isEmpty && results.isEmpty
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   569
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   570
      def init(build_config: Build_Config, job: Job, context: Context): State = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   571
        val process = Future.fork(context.process(build_config))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   572
        val result =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   573
          Future.fork(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   574
            process.join_result match {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   575
              case Exn.Res(res) => context.run(res)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   576
              case Exn.Exn(_) => Process_Result(Process_Result.RC.interrupt)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   577
            })
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   578
        new State(processes + (job.name -> process), results + (job.name -> result))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   579
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   580
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   581
      def running: List[String] = processes.keys.toList
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   582
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   583
      def update: (State, Map[String, Process_Result]) = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   584
        val finished =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   585
          for ((name, future) <- results if future.is_finished) yield name -> future.join
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   586
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   587
        val processes1 = processes.filterNot((name, _) => finished.contains(name))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   588
        val results1 = results.filterNot((name, _) => finished.contains(name))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   589
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   590
        (new State(processes1, results1), finished)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   591
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   592
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   593
      def cancel(cancelled: List[String]): State = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   594
        for (name <- cancelled) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   595
          val process = processes(name)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   596
          if (process.is_finished) process.join.interrupt()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   597
          else process.cancel()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   598
        }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   599
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   600
        new State(processes.filterNot((name, _) => cancelled.contains(name)), results)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   601
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   602
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   603
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   604
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   605
  class Runner(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   606
    store: Store,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   607
    build_hosts: List[Build_Cluster.Host],
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   608
    isabelle_repository: Mercurial.Repository,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   609
    sync_dirs: List[Sync.Dir],
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   610
    progress: Progress
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   611
  ) extends Loop_Process[Runner.State]("Runner", store, progress) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   612
    val rsync_context = Rsync.Context()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   613
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   614
    private def sync(repository: Mercurial.Repository, rev: String, target: Path): String = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   615
      repository.pull()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   616
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   617
      if (rev.nonEmpty) repository.sync(rsync_context, target, rev = rev)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   618
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   619
      Exn.capture(repository.id(File.read(target + Mercurial.Hg_Sync.PATH_ID))) match {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   620
        case Exn.Res(res) => res
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   621
        case Exn.Exn(exn) => ""
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   622
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   623
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   624
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   625
    private def start_next(): Option[(Build_Config, Job)] =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   626
      synchronized_database("start_job") {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   627
        _state.next.headOption.flatMap { task =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   628
          progress.echo("Initializing " + task.name)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   629
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   630
          _state = _state.remove_pending(task.name)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   631
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   632
          val context = Context(store, task, build_hosts)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   633
          val number = _state.next_number(task.kind)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   634
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   635
          Exn.capture {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   636
            val isabelle_rev =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   637
              sync(isabelle_repository, task.isabelle_rev, context.isabelle_dir)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   638
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   639
            val components =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   640
              for (component <- task.components)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   641
              yield sync_dirs.find(_.name == component.name) match {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   642
                case Some(sync_dir) =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   643
                  val target = context.isabelle_dir + sync_dir.target
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   644
                  component.copy(rev = sync(sync_dir.hg, component.rev, target))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   645
                case None =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   646
                  if (component.rev.isEmpty) component
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   647
                  else error("Unknown component " + component)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   648
              }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   649
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   650
            Job(task.id, task.kind, number, isabelle_rev, components)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   651
          } match {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   652
            case Exn.Res(job) =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   653
              _state = _state.add_running(job)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   654
              val context1 = context.move(Context(store, job))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   655
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   656
              val msg = "Starting " + job.name
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   657
              echo(msg + " (id " + job.id + ")")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   658
              context1.progress.echo(msg)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   659
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   660
              Some(task.build_config, job)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   661
            case Exn.Exn(exn) =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   662
              val result = Result(task.kind, number, Status.aborted)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   663
              val context1 = Context(store, result)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   664
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   665
              val msg = "Failed to start job: " + exn.getMessage
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   666
              echo_error_message(msg)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   667
              context1.progress.echo_error_message(msg)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   668
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   669
              context.remove()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   670
              _state = _state.add_finished(result)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   671
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   672
              None
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   673
          }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   674
        }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   675
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   676
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   677
    private def stop_cancelled(state: Runner.State): Runner.State =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   678
      synchronized_database("stop_cancelled") {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   679
        val cancelled = for (name <- state.running if _state.running(name).cancelled) yield name
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   680
        state.cancel(cancelled)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   681
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   682
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   683
    private def finish_job(name: String, process_result: Process_Result): Unit =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   684
      synchronized_database("finish_job") {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   685
        val job = _state.running(name)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   686
        val context = Context(store, job, build_hosts)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   687
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   688
        val result = Result(job.kind, job.number, Status.from_result(process_result), Some(job.id))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   689
        context.copy_results(Context(store, result))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   690
        context.remove()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   691
        echo("Finished job " + job.id + " with status code " + process_result.rc)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   692
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   693
        _state = _state
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   694
          .remove_running(job.name)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   695
          .add_finished(result)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   696
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   697
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   698
    override def stopped(state: Runner.State): Boolean = progress.stopped && state.is_empty
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   699
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   700
    def init: Runner.State = Runner.State.empty
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   701
    def loop_body(state: Runner.State): Runner.State = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   702
      if (state.is_empty && !progress.stopped) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   703
        start_next() match {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   704
          case None => state
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   705
          case Some((build_config, job)) =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   706
            state.init(build_config, job, Context(store, job, build_hosts))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   707
        }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   708
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   709
      else {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   710
        val (state1, results) = stop_cancelled(state).update
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   711
        results.foreach(finish_job)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   712
        state1
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   713
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   714
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   715
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   716
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   717
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   718
  /* repository poller */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   719
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   720
  object Poller {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   721
    case class State(ids: List[String], next: Future[List[String]])
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   722
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   723
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   724
  class Poller(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   725
    ci_jobs: List[String],
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   726
    store: Store,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   727
    isabelle_repository: Mercurial.Repository,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   728
    sync_dirs: List[Sync.Dir],
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   729
    progress: Progress
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   730
  ) extends Loop_Process[Poller.State]("Poller", store, progress) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   731
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   732
    override def delay = options.seconds("build_manager_poll_delay")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   733
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   734
    private def ids: List[String] =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   735
      isabelle_repository.id("default") :: sync_dirs.map(_.hg.id("default"))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   736
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   737
    private def poll: Future[List[String]] = Future.fork {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   738
      Par_List.map((repo: Mercurial.Repository) => repo.pull(),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   739
        isabelle_repository :: sync_dirs.map(_.hg))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   740
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   741
      ids
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   742
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   743
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   744
    val init: Poller.State = Poller.State(ids, poll)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   745
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   746
    def ci_task(name: String): Task =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   747
      Task(CI_Build(name, sync_dirs.map(dir => Component(dir.name, "default"))),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   748
        priority = Priority.low, isabelle_rev = "default")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   749
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   750
    private def add_task(): Unit = synchronized_database("add_task") {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   751
      for (name <- ci_jobs if !_state.pending.values.exists(_.kind == name)) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   752
        _state = _state.add_pending(ci_task(name))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   753
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   754
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   755
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   756
    def loop_body(state: Poller.State): Poller.State =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   757
      if (!state.next.is_finished) state
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   758
      else {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   759
        state.next.join_result match {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   760
          case Exn.Exn(exn) =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   761
            echo_error_message("Could not reach repository: " + exn.getMessage)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   762
            Poller.State(state.ids, poll)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   763
          case Exn.Res(ids1) =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   764
            if (state.ids != ids1) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   765
              echo("Found new revisions: " + ids1)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   766
              add_task()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   767
            }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   768
            Poller.State(ids1, poll)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   769
        }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   770
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   771
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   772
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   773
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   774
  /* web server */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   775
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   776
  object Web_Server {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   777
    object Page {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   778
      val HOME = Path.basic("home")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   779
      val OVERVIEW = Path.basic("overview")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   780
      val BUILD = Path.basic("build")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   781
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   782
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   783
    object API {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   784
      val BUILD_CANCEL = Path.explode("api/build/cancel")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   785
      val CSS = Path.explode("api/isabelle.css")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   786
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   787
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   788
    object Cache {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   789
      def empty: Cache = new Cache()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   790
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   791
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   792
    class Cache private(keep: Time = Time.minutes(1)) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   793
      var logs: Map[String, (Time, String)] = Map.empty
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   794
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   795
      def update(store: Store, state: State): Unit = synchronized {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   796
        logs =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   797
          for {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   798
            (name, (time, log)) <- logs
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   799
            if time + keep > Time.now()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   800
          } yield name -> (time, Context(store, state.get(name).get).log)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   801
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   802
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   803
      def lookup(store: Store, elem: T): String = synchronized {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   804
        logs.get(elem.name) match {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   805
          case Some((_, log)) =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   806
            logs += elem.name -> (Time.now(), log)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   807
          case None =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   808
            logs += elem.name -> (Time.now(), Context(store, elem).log)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   809
        }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   810
        logs(elem.name)._2
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   811
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   812
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   813
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   814
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   815
  class Web_Server(port: Int, paths: Web_App.Paths, store: Store, progress: Progress)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   816
    extends Loop_Process[Unit]("Web_Server", store, progress) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   817
    import Web_App.*
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   818
    import Web_Server.*
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   819
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   820
    val cache = Cache.empty
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   821
    val Id = new Properties.String(Markup.ID)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   822
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   823
    enum Model {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   824
      case Error extends Model
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   825
      case Cancelled extends Model
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   826
      case Home(state: State) extends Model
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   827
      case Overview(kind: String, state: State) extends Model
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   828
      case Build(elem: T, state: State, public: Boolean = true) extends Model
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   829
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   830
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   831
    object View {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   832
      import HTML.*
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   833
      import More_HTML.*
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   834
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   835
      def render_if(cond: Boolean, body: XML.Body): XML.Body = if (cond) body else Nil
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   836
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   837
      def frontend_link(url: Url, xml: XML.Body): XML.Elem =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   838
        link(url.toString, xml) + ("target" -> "_parent")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   839
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   840
      def link_kind(kind: String): XML.Elem =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   841
        frontend_link(paths.frontend_url(Page.OVERVIEW, Markup.Kind(kind)), text(kind))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   842
      def link_build(name: String, number: Long): XML.Elem =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   843
        frontend_link(paths.frontend_url(Page.BUILD, Markup.Name(name)), text("#" + number))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   844
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   845
      def render_home(state: State): XML.Body = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   846
        def render_kind(kind: String): XML.Elem = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   847
          val running = state.get_running(kind).sortBy(_.number).reverse
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   848
          val finished = state.get_finished(kind).sortBy(_.number).reverse
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   849
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   850
          def render_previous(finished: List[Result]): XML.Body = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   851
            val (failed, rest) = finished.span(_.status != Status.ok)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   852
            val first_failed = failed.lastOption.map(result =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   853
              par(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   854
                text("first failure: ") :::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   855
                link_build(result.name, result.number) ::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   856
                text(" on " + result.date)))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   857
            val last_success = rest.headOption.map(result =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   858
              par(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   859
                text("last success: ") ::: link_build(result.name, result.number) ::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   860
                text(" on " + result.date)))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   861
            first_failed.toList ::: last_success.toList
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   862
          }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   863
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   864
          def render_job(job: Job): XML.Body =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   865
            par(link_build(job.name, job.number) :: text(": running since " + job.start_date)) ::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   866
            render_if(finished.headOption.exists(_.status != Status.ok), render_previous(finished))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   867
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   868
          def render_result(result: Result): XML.Body =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   869
            par(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   870
              link_build(result.name, result.number) ::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   871
              text(" (" + result.status.toString + ") on " + result.date)) ::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   872
            render_if(result.status != Status.ok, render_previous(finished.tail))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   873
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   874
          fieldset(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   875
            XML.elem("legend", List(link_kind(kind))) ::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   876
            (if (running.nonEmpty) render_job(running.head)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   877
            else if (finished.nonEmpty) render_result(finished.head)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   878
            else Nil))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   879
        }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   880
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   881
        chapter("Dashboard") ::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   882
          text("Queue: " + state.pending.size + " tasks waiting") :::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   883
          section("Builds") :: text("Total: " + state.num_builds + " builds") :::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   884
          state.kinds.map(render_kind)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   885
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   886
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   887
      def render_overview(kind: String, state: State): XML.Body = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   888
        def render_job(job: Job): XML.Body =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   889
          List(par(link_build(job.name, job.number) :: text(" running since " + job.start_date)))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   890
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   891
        def render_result(result: Result): XML.Body =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   892
          List(par(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   893
            link_build(result.name, result.number) ::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   894
            text(" (" + result.status + ") on " + result.date)))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   895
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   896
        chapter(kind) ::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   897
          itemize(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   898
            state.get_running(kind).sortBy(_.number).reverse.map(render_job) :::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   899
            state.get_finished(kind).sortBy(_.number).reverse.map(render_result)) :: Nil
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   900
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   901
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   902
      private val ID = Params.key(Markup.ID)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   903
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   904
      def render_build(elem: T, state: State, public: Boolean): XML.Body = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   905
        def render_cancel(id: UUID.T): XML.Body =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   906
          render_if(!public, List(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   907
            submit_form("", List(hidden(ID, id.toString),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   908
              api_button(paths.api_route(API.BUILD_CANCEL), "cancel build")))))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   909
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   910
        def render_rev(isabelle_rev: String, components: List[Component]): XML.Body =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   911
          for {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   912
            component <- Component("Isabelle", isabelle_rev) :: components
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   913
            if component.rev.nonEmpty
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   914
          } yield par(text(component.toString))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   915
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   916
        chapter("Build " + elem.name) :: (elem match {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   917
          case task: Task =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   918
            par(text("Task from " + task.submit_date + ". ")) ::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   919
            render_rev(task.isabelle_rev, task.components) :::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   920
            render_cancel(task.id)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   921
          case job: Job =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   922
            par(text("Start: " + job.start_date)) ::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   923
            par(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   924
              if (job.cancelled) text("Cancelling...")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   925
              else text("Running...") ::: render_cancel(job.id)) ::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   926
            render_rev(job.isabelle_rev, job.components) :::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   927
            source(cache.lookup(store, job)) :: Nil
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   928
          case result: Result =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   929
            par(text("Date: " + result.date)) ::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   930
            par(text("Status: " + result.status)) ::
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   931
            source(cache.lookup(store, result)) :: Nil
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   932
        })
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   933
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   934
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   935
      def render_cancelled: XML.Body =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   936
        List(chapter("Build Cancelled"), frontend_link(paths.frontend_url(Page.HOME), text("Home")))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   937
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   938
      def parse_id(params: Params.Data): Option[UUID.T] =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   939
        for {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   940
          id <- params.get(ID)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   941
          uuid <- UUID.unapply(id)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   942
        } yield uuid
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   943
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   944
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   945
    private val server = new Server[Model](paths, port, progress = progress) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   946
      /* control */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   947
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   948
      def overview: Some[Model.Home] = Some(Model.Home(_state))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   949
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   950
      def get_overview(props: Properties.T): Option[Model.Overview] =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   951
        props match {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   952
          case Markup.Kind(kind) => Some(Model.Overview(kind, _state))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   953
          case _ => None
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   954
        }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   955
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   956
      def get_build(props: Properties.T): Option[Model.Build] =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   957
        props match {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   958
          case Markup.Name(name) =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   959
            val state = _state
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   960
            state.get(name).map(Model.Build(_, state))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   961
          case Id(UUID(id)) =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   962
            val state = _state
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   963
            state.get(id).map(Model.Build(_, state, public = false))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   964
          case _ => None
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   965
        }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   966
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   967
      def cancel_build(params: Params.Data): Option[Model] =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   968
        for {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   969
          id <- View.parse_id(params)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   970
          model <-
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   971
            synchronized_database("cancel_build") {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   972
              _state.get(id).map {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   973
                case task: Task =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   974
                  _state = _state.remove_pending(task.name)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   975
                  Model.Cancelled
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   976
                case job: Job =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   977
                  val job1 = job.copy(cancelled = true)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   978
                  _state = _state
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   979
                    .remove_running(job.name)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   980
                    .add_running(job1)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   981
                  Model.Build(job1, _state, public = false)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   982
                case result: Result => Model.Build(result, _state, public = false)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   983
              }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   984
            }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   985
        } yield model
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   986
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   987
      def render(model: Model): XML.Body =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   988
        HTML.title("Isabelle Build Manager") :: (
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   989
          model match {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   990
            case Model.Error => HTML.text("invalid request")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   991
            case Model.Home(state) => View.render_home(state)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   992
            case Model.Overview(kind, state) => View.render_overview(kind, state)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   993
            case Model.Build(elem, state, public) => View.render_build(elem, state, public)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   994
            case Model.Cancelled => View.render_cancelled
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   995
          })
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   996
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   997
      val error_model: Model = Model.Error
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   998
      val endpoints = List(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
   999
        Get(Page.HOME, "home", _ => overview),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1000
        Get(Page.OVERVIEW, "overview", get_overview),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1001
        Get(Page.BUILD, "build", get_build),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1002
        Post(API.BUILD_CANCEL, "cancel build", cancel_build),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1003
        Get_File(API.CSS, "css", _ => Some(HTML.isabelle_css)))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1004
      val head = List(HTML.style_file(paths.api_route(API.CSS)))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1005
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1006
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1007
    def init: Unit = server.start()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1008
    def loop_body(u: Unit): Unit = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1009
      if (progress.stopped) server.stop()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1010
      else synchronized_database("iterate") { cache.update(store, _state) }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1011
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1012
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1013
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1014
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1015
  /* context */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1016
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1017
  object Context {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1018
    def apply(store: Store, elem: T, build_hosts: List[Build_Cluster.Host] = Nil): Context =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1019
      new Context(store, store.dir(elem), build_hosts)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1020
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1021
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1022
  class Context private(store: Store, val dir: Path, val build_hosts: List[Build_Cluster.Host]) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1023
    def isabelle_dir: Path = dir + Path.basic("isabelle")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1024
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1025
    private val log_file = dir + Path.basic("log")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1026
    val progress = new File_Progress(log_file, verbose = true)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1027
    def log: String =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1028
      Exn.capture(File.read(log_file)) match {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1029
        case Exn.Exn(_) => ""
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1030
        case Exn.Res(res) => res
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1031
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1032
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1033
    def move(other: Context): Context = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1034
      Isabelle_System.make_directory(other.dir.dir)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1035
      Isabelle_System.move_file(dir, other.dir)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1036
      other
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1037
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1038
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1039
    def copy_results(other: Context): Context = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1040
      Isabelle_System.make_directory(other.dir)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1041
      Isabelle_System.copy_file(log_file, other.log_file)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1042
      other
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1043
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1044
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1045
    def remove(): Unit = Isabelle_System.rm_tree(dir)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1046
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1047
    lazy val ssh = store.open_ssh()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1048
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1049
    def process(build_config: Build_Config): Bash.Process = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1050
      val isabelle = Other_Isabelle(isabelle_dir, store.identifier, ssh, progress)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1051
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1052
      val init_components =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1053
        for {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1054
          dir <- build_config.components
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1055
          target = isabelle_dir + Sync.DIRS + Path.basic(dir.name)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1056
          if Components.is_component_dir(target)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1057
        } yield "init_component " + quote(target.absolute.implode)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1058
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1059
      isabelle.init(other_settings = isabelle.init_components() ::: init_components,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1060
        fresh = build_config.fresh_build, echo = true)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1061
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1062
      val cmd = build_config.command(build_hosts)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1063
      progress.echo("isabelle" + cmd)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1064
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1065
      val script = File.bash_path(Isabelle_Tool.exe(isabelle.isabelle_home)) + cmd
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1066
      ssh.bash_process(isabelle.bash_context(script), settings = false)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1067
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1068
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1069
    def run(process: Bash.Process): Process_Result = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1070
      val process_result =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1071
        process.result(progress_stdout = progress.echo(_), progress_stderr = progress.echo(_))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1072
      ssh.close()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1073
      process_result
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1074
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1075
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1076
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1077
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1078
  /* build manager store */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1079
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1080
  case class Store(options: Options) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1081
    val base_dir = Path.explode(options.string("build_manager_dir"))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1082
    val identifier = options.string("build_manager_identifier")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1083
80252
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1084
    private val pending = base_dir + Path.basic("pending")
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1085
    private val running = base_dir + Path.basic("running")
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1086
    private val finished = base_dir + Path.basic("finished")
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1087
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1088
    def dir(elem: T): Path =
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1089
      elem match {
80252
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1090
        case task: Task => pending + Path.basic(task.id.toString)
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1091
        case job: Job => running + Path.make(List(job.kind, job.number.toString))
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1092
        case result: Result => finished + Path.make(List(result.kind, result.number.toString))
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1093
      }
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1094
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1095
    def sync_permissions(dir: Path, ssh: SSH.System = SSH.Local): Unit = {
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1096
      ssh.execute("chmod -R g+rwx " + File.bash_path(dir))
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1097
      ssh.execute("chown -R :" + ssh_group + " " + File.bash_path(dir))
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1098
    }
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1099
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1100
    def init_dirs(): Unit =
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1101
      List(pending, running, finished).foreach(dir =>
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1102
        sync_permissions(Isabelle_System.make_directory(dir)))
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1103
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1104
    val ssh_group: String= options.string("build_manager_ssh_group")
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1105
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1106
    def open_ssh(): SSH.Session =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1107
      SSH.open_session(options,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1108
        host = options.string("build_manager_ssh_host"),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1109
        port = options.int("build_manager_ssh_port"),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1110
        user = options.string("build_manager_ssh_user"))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1111
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1112
    def open_database(server: SSH.Server = SSH.no_server): PostgreSQL.Database =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1113
      PostgreSQL.open_database_server(options, server = server,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1114
        user = options.string("build_manager_database_user"),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1115
        password = options.string("build_manager_database_password"),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1116
        database = options.string("build_manager_database_name"),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1117
        host = options.string("build_manager_database_host"),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1118
        port = options.int("build_manager_database_port"),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1119
        ssh_host = options.string("build_manager_database_ssh_host"),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1120
        ssh_port = options.int("build_manager_database_ssh_port"),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1121
        ssh_user = options.string("build_manager_database_ssh_user"))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1122
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1123
    def open_postgresql_server(): SSH.Server =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1124
      PostgreSQL.open_server(options,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1125
        host = options.string("build_manager_database_host"),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1126
        port = options.int("build_manager_database_port"),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1127
        ssh_host = options.string("build_manager_ssh_host"),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1128
        ssh_port = options.int("build_manager_ssh_port"),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1129
        ssh_user = options.string("build_manager_ssh_user"))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1130
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1131
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1132
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1133
  /* build manager */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1134
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1135
  def build_manager(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1136
    build_hosts: List[Build_Cluster.Host],
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1137
    options: Options,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1138
    port: Int,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1139
    sync_dirs: List[Sync.Dir] = Nil,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1140
    progress: Progress = new Progress
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1141
  ): Unit = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1142
    val store = Store(options)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1143
    val isabelle_repository = Mercurial.self_repository()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1144
    val ci_jobs = space_explode(',', options.string("build_manager_ci_jobs"))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1145
    val url = Url(options.string("build_manager_address"))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1146
    val paths = Web_App.Paths(url, Path.current, true, Web_Server.Page.HOME)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1147
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1148
    using(store.open_database())(db =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1149
      Build_Manager.private_data.transaction_lock(db,
80252
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1150
        create = true, label = "Build_Manager.build_manager") { store.init_dirs() })
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1151
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1152
    val processes = List(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1153
      new Runner(store, build_hosts, isabelle_repository, sync_dirs, progress),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1154
      new Poller(ci_jobs, store, isabelle_repository, sync_dirs, progress),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1155
      new Web_Server(port, paths, store, progress))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1156
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1157
    val threads = processes.map(Isabelle_Thread.create(_))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1158
    POSIX_Interrupt.handler {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1159
      progress.stop()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1160
      processes.foreach(_.interrupt())
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1161
    } {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1162
      threads.foreach(_.start())
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1163
      threads.foreach(_.join())
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1164
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1165
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1166
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1167
  def build_task(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1168
    options: Options,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1169
    store: Store,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1170
    afp_root: Option[Path] = None,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1171
    base_sessions: List[String] = Nil,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1172
    presentation: Boolean = false,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1173
    requirements: Boolean = false,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1174
    exclude_session_groups: List[String] = Nil,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1175
    all_sessions: Boolean = false,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1176
    build_heap: Boolean = false,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1177
    clean_build: Boolean = false,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1178
    export_files: Boolean = false,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1179
    fresh_build: Boolean = false,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1180
    session_groups: List[String] = Nil,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1181
    sessions: List[String] = Nil,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1182
    prefs: List[Options.Spec] = Nil,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1183
    exclude_sessions: List[String] = Nil,
80254
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
  1184
    verbose: Boolean = false,
80250
8ae6f4e8cc2a allow explicit Isabelle rev in build task (e.g., for older Isabelle versions);
Fabian Huch <huch@in.tum.de>
parents: 80246
diff changeset
  1185
    rev: String = "",
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1186
    progress: Progress = new Progress
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1187
  ): UUID.T = {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1188
    val id = UUID.random()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1189
    val afp_rev = if (afp_root.nonEmpty) Some("") else None
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1190
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1191
    val build_config = User_Build(afp_rev, prefs, requirements, all_sessions, base_sessions,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1192
      exclude_session_groups, exclude_sessions, session_groups, sessions, build_heap, clean_build,
80254
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
  1193
      export_files, fresh_build, presentation, verbose)
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1194
    val task = Task(build_config, id, Date.now(), Priority.high)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1195
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1196
    val context = Context(store, task)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1197
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1198
    progress.interrupt_handler {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1199
      using(store.open_ssh()) { ssh =>
80252
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1200
        val rsync_context = Rsync.Context(ssh = ssh)
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1201
        progress.echo("Transferring repositories...")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1202
        Sync.sync(store.options, rsync_context, context.isabelle_dir, preserve_jars = true,
80250
8ae6f4e8cc2a allow explicit Isabelle rev in build task (e.g., for older Isabelle versions);
Fabian Huch <huch@in.tum.de>
parents: 80246
diff changeset
  1203
          dirs = Sync.afp_dirs(afp_root), rev = rev)
80252
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1204
        store.sync_permissions(context.dir, ssh)
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1205
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1206
        if (progress.stopped) {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1207
          progress.echo("Cancelling submission...")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1208
          ssh.rm_tree(context.dir)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1209
        } else {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1210
          using(store.open_postgresql_server()) { server =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1211
            using(store.open_database(server = server)) { db =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1212
              Build_Manager.private_data.transaction_lock(db, label = "Build_Manager.build_task") {
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1213
                val old_state = Build_Manager.private_data.pull_state(db, State())
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1214
                val state = old_state.add_pending(task)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1215
                Build_Manager.private_data.push_state(db, old_state, state)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1216
              }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1217
            }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1218
          }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1219
          val address = options.string("build_manager_address") + "/build?id=" + task.id
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1220
          progress.echo("Submitted task. Private url: " + address)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1221
        }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1222
      }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1223
    }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1224
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1225
    id
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1226
  }
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1227
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1228
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1229
  /* Isabelle tool wrapper */
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1230
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1231
  private def show_options(relevant_options: List[String], options: Options): String =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1232
    cat_lines(relevant_options.flatMap(options.get).map(_.print))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1233
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1234
  private val notable_server_options =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1235
    List(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1236
      "build_manager_dir",
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1237
      "build_manager_address",
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1238
      "build_manager_ssh_host",
80252
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1239
      "build_manager_ssh_group",
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1240
      "build_manager_ci_jobs")
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1241
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1242
  val isabelle_tool = Isabelle_Tool("build_manager", "run build manager", Scala_Project.here,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1243
    { args =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1244
      var afp_root: Option[Path] = None
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1245
      val dirs = new mutable.ListBuffer[Path]
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1246
      val build_hosts = new mutable.ListBuffer[Build_Cluster.Host]
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1247
      var options = Options.init()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1248
      var port = 8080
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1249
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1250
      val getopts = Getopts("""
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1251
Usage: isabelle build_manager [OPTIONS]
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1252
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1253
  Options are:
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1254
    -A ROOT      include AFP with given root directory (":" for """ + AFP.BASE.implode + """)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1255
    -D DIR       include extra component in given directory
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1256
    -H HOSTS     additional cluster host specifications of the form
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1257
                 NAMES:PARAMETERS (separated by commas)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1258
    -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1259
    -p PORT      explicit web server port
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1260
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1261
  Run Isabelle build manager. Notable system options:
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1262
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1263
""" + Library.indent_lines(2, show_options(notable_server_options, options)) + "\n",
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1264
        "A:" -> (arg => afp_root = Some(if (arg == ":") AFP.BASE else Path.explode(arg))),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1265
        "D:" -> (arg => dirs += Path.explode(arg)),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1266
        "H:" -> (arg => build_hosts ++= Build_Cluster.Host.parse(Registry.global, arg)),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1267
        "o:" -> (arg => options = options + arg),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1268
        "p:" -> (arg => port = Value.Int.parse(arg)))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1269
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1270
      val more_args = getopts(args)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1271
      if (more_args.nonEmpty) getopts.usage()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1272
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1273
      val progress = new Console_Progress()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1274
      val sync_dirs =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1275
        Sync.afp_dirs(afp_root) ::: dirs.toList.map(dir => Sync.Dir(dir.file_name, dir))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1276
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1277
      sync_dirs.foreach(_.check())
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1278
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1279
      build_manager(build_hosts = build_hosts.toList, options = options, port = port,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1280
        sync_dirs = sync_dirs, progress = progress)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1281
    })
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1282
80252
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1283
  val notable_client_options = List("build_manager_ssh_user", "build_manager_ssh_group")
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1284
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1285
  val isabelle_tool1 = Isabelle_Tool("build_task", "submit build task for build manager",
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1286
    Scala_Project.here,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1287
    { args =>
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1288
      var afp_root: Option[Path] = None
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1289
      val base_sessions = new mutable.ListBuffer[String]
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1290
      var presentation = false
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1291
      var requirements = false
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1292
      val exclude_session_groups = new mutable.ListBuffer[String]
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1293
      var all_sessions = false
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1294
      var build_heap = false
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1295
      var clean_build = false
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1296
      var export_files = false
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1297
      var fresh_build = false
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1298
      val session_groups = new mutable.ListBuffer[String]
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1299
      var options = Options.init(specs = Options.Spec.ISABELLE_BUILD_OPTIONS)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1300
      var prefs: List[Options.Spec] = Nil
80254
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
  1301
      var verbose = false
80250
8ae6f4e8cc2a allow explicit Isabelle rev in build task (e.g., for older Isabelle versions);
Fabian Huch <huch@in.tum.de>
parents: 80246
diff changeset
  1302
      var rev = ""
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1303
      val exclude_sessions = new mutable.ListBuffer[String]
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1304
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1305
      val getopts = Getopts("""
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1306
Usage: isabelle build_task [OPTIONS] [SESSIONS ...]
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1307
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1308
  Options are:
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1309
    -A ROOT      include AFP with given root directory (":" for """ + AFP.BASE.implode + """)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1310
    -B NAME      include session NAME and all descendants
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1311
    -P           enable HTML/PDF presentation
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1312
    -R           refer to requirements of selected sessions
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1313
    -X NAME      exclude sessions from group NAME and all descendants
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1314
    -a           select all sessions
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1315
    -b           build heap images
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1316
    -c           clean build
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1317
    -e           export files from session specification into file-system
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1318
    -f           fresh build
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1319
    -g NAME      select session group NAME
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1320
    -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1321
    -p OPTIONS   comma-separated preferences for build process
80250
8ae6f4e8cc2a allow explicit Isabelle rev in build task (e.g., for older Isabelle versions);
Fabian Huch <huch@in.tum.de>
parents: 80246
diff changeset
  1322
    -r REV       explicit revision (default: state of working directory)
80254
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
  1323
    -v           verbose
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1324
    -x NAME      exclude session NAME and all descendants
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1325
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1326
  Submit build task on SSH server. Notable system options:
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1327
80252
96543177ab7e build manager: manage directories/permissions, to minimize local administration;
Fabian Huch <huch@in.tum.de>
parents: 80251
diff changeset
  1328
""" + Library.indent_lines(2, show_options(notable_client_options, options)) + "\n",
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1329
        "A:" -> (arg => afp_root = Some(if (arg == ":") AFP.BASE else Path.explode(arg))),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1330
        "B:" -> (arg => base_sessions += arg),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1331
        "P" -> (_ => presentation = true),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1332
        "R" -> (_ => requirements = true),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1333
        "X:" -> (arg => exclude_session_groups += arg),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1334
        "a" -> (_ => all_sessions = true),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1335
        "b" -> (_ => build_heap = true),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1336
        "c" -> (_ => clean_build = true),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1337
        "e" -> (_ => export_files = true),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1338
        "f" -> (_ => fresh_build = true),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1339
        "g:" -> (arg => session_groups += arg),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1340
        "o:" -> (arg => options = options + arg),
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1341
        "p:" -> (arg => prefs = Options.Spec.parse(arg)),
80250
8ae6f4e8cc2a allow explicit Isabelle rev in build task (e.g., for older Isabelle versions);
Fabian Huch <huch@in.tum.de>
parents: 80246
diff changeset
  1342
        "r:" -> (arg => rev = arg),
80254
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
  1343
        "v" -> (_ => verbose = true),
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1344
        "x:" -> (arg => exclude_sessions += arg))
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1345
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1346
      val sessions = getopts(args)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1347
      val store = Store(options)
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1348
      val progress = new Console_Progress()
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1349
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1350
      build_task(options, store = store, afp_root = afp_root, base_sessions =
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1351
        base_sessions.toList, presentation = presentation, requirements = requirements,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1352
        exclude_session_groups = exclude_session_groups.toList, all_sessions = all_sessions,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1353
        build_heap = build_heap, clean_build = clean_build, export_files = export_files,
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1354
        fresh_build = fresh_build, session_groups = session_groups.toList, sessions = sessions,
80254
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
  1355
        prefs = prefs, verbose = verbose, rev = rev, exclude_sessions = exclude_sessions.toList,
6b3374d208b8 add verbose option to build_task;
Fabian Huch <huch@in.tum.de>
parents: 80252
diff changeset
  1356
        progress = progress)
80246
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1357
    })
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1358
}
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1359
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1360
class Build_Manager_Tools extends Isabelle_Scala_Tools(
245dd5f82462 add build manager module;
Fabian Huch <huch@in.tum.de>
parents:
diff changeset
  1361
  Build_Manager.isabelle_tool, Build_Manager.isabelle_tool1)