src/Pure/Admin/isabelle_cronjob.scala
author wenzelm
Wed, 12 Oct 2016 21:35:36 +0200
changeset 64171 568cd5123952
parent 64170 a0c2cbe2fc8e
child 64172 e7863057df41
permissions -rw-r--r--
clarified task logging via log service;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64148
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Admin/isabelle_cronjob.scala
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
     3
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
     4
Main entry point for administrative cronjob at TUM.
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
     5
*/
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
     6
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
     7
package isabelle
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
     8
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
     9
64170
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
    10
import scala.annotation.tailrec
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
    11
import scala.collection.mutable
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
    12
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
    13
64148
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
    14
object Isabelle_Cronjob
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
    15
{
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    16
  /** file-system state: owned by main cronjob **/
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    17
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    18
  val main_dir = Path.explode("~/cronjob")
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    19
  val run_dir = main_dir + Path.explode("run")
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    20
  val log_dir = main_dir + Path.explode("log")
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    21
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    22
  val main_state_file = run_dir + Path.explode("main.state")
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    23
  val main_log = log_dir + Path.explode("main.log")  // owned by log service
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    24
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    25
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    26
  /* task logging */
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    27
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    28
  sealed case class Logger_Task(name: String, body: Logger => Unit)
64154
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    29
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    30
  class Log_Service private[Isabelle_Cronjob](progress: Progress)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    31
  {
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    32
    private val thread: Consumer_Thread[String] =
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    33
      Consumer_Thread.fork("cronjob: logger", daemon = true)(
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    34
        consume = (text: String) =>
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    35
          {
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    36
            File.append(main_log, text + "\n")   // critical
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    37
            progress.echo(text)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    38
            true
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    39
          })
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    40
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    41
    def shutdown() { thread.shutdown() }
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    42
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    43
    val hostname = Isabelle_System.hostname()
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    44
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    45
    def log(date: Date, task_name: String, msg: String): Unit =
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    46
      thread.send(
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    47
        "[" + Build_Log.print_date(date) + ", " + hostname + ", " + task_name + "]: " + msg)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    48
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    49
    def start_logger(start_date: Date, task_name: String): Logger =
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    50
      new Logger(this, start_date, task_name)
64154
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    51
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    52
    def run_task(start_date: Date, task: Logger_Task)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    53
    {
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    54
      val logger = start_logger(start_date, task.name)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    55
      val res = Exn.capture { task.body(logger) }
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    56
      val end_date = Date.now()
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    57
      val err =
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    58
        res match {
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    59
          case Exn.Res(_) => None
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    60
          case Exn.Exn(exn) => Some(Exn.message(exn))
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    61
        }
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    62
      logger.log_end(end_date, err)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    63
    }
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    64
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    65
    def fork_task(start_date: Date, task: Logger_Task): Task =
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    66
      new Task(task.name, run_task(start_date, task))
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    67
  }
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    68
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    69
  class Logger private[Isabelle_Cronjob](
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    70
    val log_service: Log_Service, val start_date: Date, val task_name: String)
64162
03057a8fdd1f simplified: no internal state for Mercurial;
wenzelm
parents: 64157
diff changeset
    71
  {
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    72
    def log(date: Date, msg: String): Unit = log_service.log(date, task_name, msg)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    73
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    74
    def log_end(end_date: Date, err: Option[String])
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    75
    {
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    76
      val elapsed_time = end_date.time - start_date.time
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    77
      val msg =
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    78
        (if (err.isEmpty) "finished" else "ERROR " + err.get) +
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    79
        (if (elapsed_time.seconds < 3.0) "" else ", elapsed time " + elapsed_time.message_hms)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    80
      log(end_date, msg)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    81
    }
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    82
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    83
    log(start_date, "started")
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    84
  }
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    85
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    86
  class Task private[Isabelle_Cronjob](name: String, body: => Unit)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    87
  {
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    88
    private val future: Future[Unit] = Future.thread("cronjob: " + name) { body }
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    89
    def is_finished: Boolean = future.is_finished
64162
03057a8fdd1f simplified: no internal state for Mercurial;
wenzelm
parents: 64157
diff changeset
    90
  }
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    91
64170
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
    92
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
    93
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
    94
  /** particular tasks **/
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
    95
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
    96
  /* identify repository snapshots */
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
    97
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    98
  val isabelle_repos = main_dir + Path.explode("isabelle-build_history")
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
    99
  val afp_repos = main_dir + Path.explode("AFP-build_history")
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   100
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   101
  val isabelle_identify =
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   102
    Logger_Task("isabelle_identify", logger =>
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   103
      {
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   104
        def pull_repos(root: Path): String =
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   105
        {
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   106
          val hg = Mercurial.repository(root)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   107
          hg.pull(options = "-q")
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   108
          hg.identify("tip", options = "-i")
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   109
        }
64170
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   110
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   111
        val isabelle_id = pull_repos(isabelle_repos)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   112
        val afp_id = pull_repos(afp_repos)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   113
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   114
        val log_path = log_dir + Build_Log.log_path("isabelle_identify", logger.start_date)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   115
        Isabelle_System.mkdirs(log_path.dir)
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   116
        File.write(log_path,
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   117
          Library.terminate_lines(
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   118
            List("isabelle_identify: " + Build_Log.print_date(logger.start_date),
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   119
              "",
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   120
              "Isabelle version: " + isabelle_id,
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   121
              "AFP version: " + afp_id)))
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   122
      })
64170
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   123
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   124
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   125
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   126
  /** cronjob **/
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   127
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   128
  private val all_tasks = List(isabelle_identify)
64170
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   129
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   130
  def cronjob(progress: Progress)
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   131
  {
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   132
    /* soft lock */
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   133
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   134
    val still_running =
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   135
      try { Some(File.read(main_state_file)) }
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   136
      catch { case ERROR(_) => None }
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   137
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   138
    still_running match {
64170
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   139
      case None | Some("") =>
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   140
      case Some(running) =>
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   141
        error("Isabelle cronjob appears to be still running: " + running)
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   142
    }
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   143
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   144
    val main_start_date = Date.now()
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   145
    val log_service = new Log_Service(progress)
64154
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
   146
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   147
    File.write(main_state_file, main_start_date + " " + log_service.hostname)
64154
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
   148
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
   149
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   150
    /* parallel tasks */
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   151
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   152
    def parallel_tasks(tasks: List[Logger_Task])
64170
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   153
    {
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   154
      @tailrec def await(running: List[Task])
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   155
      {
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   156
        running.partition(_.is_finished) match {
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   157
          case (Nil, Nil) =>
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   158
          case (Nil, _ :: _) => Thread.sleep(500); await(running)
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   159
          case (_ :: _, remaining) => await(remaining)
64170
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   160
        }
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   161
      }
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   162
      val start_date = Date.now()
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   163
      await(tasks.map(task => log_service.fork_task(start_date, task)))
64170
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   164
    }
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   165
64170
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   166
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   167
    /* main */
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   168
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   169
    log_service.run_task(main_start_date,
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   170
      Logger_Task("isabelle_cronjob", _ => parallel_tasks(all_tasks)))
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   171
64171
568cd5123952 clarified task logging via log service;
wenzelm
parents: 64170
diff changeset
   172
    log_service.shutdown()
64170
a0c2cbe2fc8e more explicit management of tasks;
wenzelm
parents: 64162
diff changeset
   173
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   174
    main_state_file.file.delete
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   175
  }
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   176
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   177
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   178
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   179
  /** command line entry point **/
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   180
64148
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   181
  def main(args: Array[String])
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   182
  {
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   183
    Command_Line.tool0 {
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   184
      var force = false
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   185
      var verbose = false
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   186
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   187
      val getopts = Getopts("""
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   188
Usage: Admin/cronjob/main [OPTIONS]
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   189
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   190
  Options are:
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   191
    -f           apply force to do anything
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   192
    -v           verbose
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   193
""",
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   194
        "f" -> (_ => force = true),
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   195
        "v" -> (_ => verbose = true))
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   196
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   197
      val more_args = getopts(args)
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   198
      if (more_args.nonEmpty) getopts.usage()
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   199
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   200
      val progress = if (verbose) new Console_Progress() else Ignore_Progress
64148
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   201
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   202
      if (force) cronjob(progress)
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   203
      else error("Need to apply force to do anything")
64148
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   204
    }
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   205
  }
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   206
}