src/Pure/Admin/isabelle_cronjob.scala
author wenzelm
Tue, 11 Oct 2016 22:24:14 +0200
changeset 64155 646c4d6a6a02
parent 64154 e5cf40a54b1e
child 64156 01716e3c3e68
permissions -rw-r--r--
tuned signature;
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
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
    10
object Isabelle_Cronjob
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
    11
{
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    12
  /** file-system state: owned by main cronjob **/
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    13
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    14
  val main_dir = Path.explode("~/cronjob")
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    15
  val run_dir = main_dir + Path.explode("run")
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    16
  val log_dir = main_dir + Path.explode("log")
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_state_file = run_dir + Path.explode("main.state")
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    19
  val main_log = log_dir + Path.explode("main.log")
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    20
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    21
64154
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    22
  /* managed repository clones */
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    23
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    24
  val isabelle_repos = main_dir + Path.explode("isabelle-build_history")
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    25
  val afp_repos = main_dir + Path.explode("AFP-build_history")
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    26
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    27
  def pull_repos(root: Path): String =
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    28
    using(Mercurial.open_repository(root))(hg =>
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    29
      {
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    30
        hg.pull(options = "-q")
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    31
        hg.identify("tip")
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    32
      })
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    33
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    34
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    35
  /** cronjob **/
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    36
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    37
  def cronjob(progress: Progress)
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    38
  {
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    39
    /* log */
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    40
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    41
    val hostname = Isabelle_System.hostname()
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    42
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    43
    def log(date: Date, msg: String)
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    44
    {
64155
646c4d6a6a02 tuned signature;
wenzelm
parents: 64154
diff changeset
    45
      val text = "[" + Build_Log.print_date(date) + " " + hostname + "]: " + msg
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    46
      File.append(main_log, text + "\n")
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    47
      progress.echo(text)
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    48
    }
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    49
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    50
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    51
    /* start */
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    52
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    53
    val start_date = Date.now()
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    54
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    55
    val still_running =
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    56
      try { Some(File.read(main_state_file)) }
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    57
      catch { case ERROR(_) => None }
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    58
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    59
    still_running match {
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    60
      case Some(running) =>
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    61
        error("Isabelle cronjob appears to be still running: " + running)
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    62
      case None =>
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    63
        File.write(main_state_file, start_date + " " + hostname)
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    64
        log(start_date, "start cronjob")
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    65
    }
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    66
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    67
64154
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    68
    /* identify repository snapshots */
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    69
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    70
    {
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    71
      val pull_date = Date.now()
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    72
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    73
      val isabelle_id = pull_repos(isabelle_repos)
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    74
      val afp_id = pull_repos(afp_repos)
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    75
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    76
      val log_path = log_dir + Build_Log.log_path("isabelle_identify", pull_date)
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    77
      Isabelle_System.mkdirs(log_path.dir)
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    78
      File.write(log_path,
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    79
        Library.terminate_lines(
64155
646c4d6a6a02 tuned signature;
wenzelm
parents: 64154
diff changeset
    80
          List("isabelle_identify: " + Build_Log.print_date(pull_date),
64154
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    81
            "",
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    82
            "Isabelle version: " + isabelle_id,
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    83
            "AFP version: " + afp_id)))
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    84
    }
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    85
e5cf40a54b1e identify managed repository clones;
wenzelm
parents: 64153
diff changeset
    86
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    87
    /* end */
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    88
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    89
    val end_date = Date.now()
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    90
    val elapsed_time = end_date.time - start_date.time
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    91
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    92
    log(end_date, "end cronjob, elapsed time " + elapsed_time.message_hms)
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    93
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    94
    main_state_file.file.delete
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    95
  }
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    96
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    97
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    98
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
    99
  /** command line entry point **/
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   100
64148
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   101
  def main(args: Array[String])
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   102
  {
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   103
    Command_Line.tool0 {
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   104
      var force = false
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   105
      var verbose = false
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   106
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   107
      val getopts = Getopts("""
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   108
Usage: Admin/cronjob/main [OPTIONS]
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   109
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   110
  Options are:
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   111
    -f           apply force to do anything
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   112
    -v           verbose
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   113
""",
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   114
        "f" -> (_ => force = true),
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   115
        "v" -> (_ => verbose = true))
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   116
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   117
      val more_args = getopts(args)
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   118
      if (more_args.nonEmpty) getopts.usage()
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   119
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   120
      val progress = if (verbose) new Console_Progress() else Ignore_Progress
64148
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   121
64153
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   122
      if (force) cronjob(progress)
769791954872 some timing and logging, similar to old isatest.log;
wenzelm
parents: 64148
diff changeset
   123
      else error("Need to apply force to do anything")
64148
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   124
    }
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   125
  }
bbf43b7c4d0d basic setup for Isabelle cronjob;
wenzelm
parents:
diff changeset
   126
}