src/Pure/Admin/isabelle_cronjob.scala
changeset 67070 85e6c1ff5be3
parent 67049 0bb8369d10d6
child 67075 eada9bd5fff2
equal deleted inserted replaced
67069:f11486d31586 67070:85e6c1ff5be3
   262           afp = true,
   262           afp = true,
   263           slow = true,
   263           slow = true,
   264           detect = Build_Log.Prop.build_tags + " = " + SQL.string("AFP"))))
   264           detect = Build_Log.Prop.build_tags + " = " + SQL.string("AFP"))))
   265 
   265 
   266   private def remote_build_history(
   266   private def remote_build_history(
   267     rev: String, afp_rev: Option[String], i: Int, user_home: Boolean, r: Remote_Build): Logger_Task =
   267     rev: String, afp_rev: Option[String], i: Int, r: Remote_Build): Logger_Task =
   268   {
   268   {
   269     val task_name = "build_history-" + r.host
   269     val task_name = "build_history-" + r.host
   270     Logger_Task(task_name, logger =>
   270     Logger_Task(task_name, logger =>
   271       {
   271       {
   272         using(logger.ssh_context.open_session(host = r.host, user = r.user, port = r.port))(
   272         using(logger.ssh_context.open_session(host = r.host, user = r.user, port = r.port))(
   273           ssh =>
   273           ssh =>
   274             {
   274             {
   275               val self_update = !r.shared_home
   275               val self_update = !r.shared_home
   276               val push_isabelle_home = self_update && Mercurial.is_repository(Path.explode("~~"))
   276               val push_isabelle_home = self_update && Mercurial.is_repository(Path.explode("~~"))
   277 
       
   278               if (user_home && r.shared_home) {
       
   279                 ssh.execute("""
       
   280 if [ ! -e /tmp/isabelle-isatest/contrib ]
       
   281 then
       
   282   mkdir -p /tmp/isabelle-isatest && ln -s /home/isabelle/contrib /tmp/isabelle-isatest
       
   283 fi""").check
       
   284               }
       
   285 
   277 
   286               val results =
   278               val results =
   287                 Build_History.remote_build_history(ssh,
   279                 Build_History.remote_build_history(ssh,
   288                   isabelle_repos,
   280                   isabelle_repos,
   289                   isabelle_repos.ext(r.host),
   281                   isabelle_repos.ext(r.host),
   291                   self_update = self_update,
   283                   self_update = self_update,
   292                   push_isabelle_home = push_isabelle_home,
   284                   push_isabelle_home = push_isabelle_home,
   293                   rev = rev,
   285                   rev = rev,
   294                   afp_rev = afp_rev,
   286                   afp_rev = afp_rev,
   295                   options =
   287                   options =
   296                     (if (user_home && r.shared_home) " -u /tmp/isabelle-isatest" else "") +
       
   297                     " -N " + Bash.string(task_name) + (if (i < 0) "" else "_" + (i + 1).toString) +
   288                     " -N " + Bash.string(task_name) + (if (i < 0) "" else "_" + (i + 1).toString) +
   298                     " -f " + r.options,
   289                     " -f " + r.options,
   299                   args = "-o timeout=10800 " + r.args)
   290                   args = "-o timeout=10800 " + r.args)
   300 
   291 
   301               for ((log_name, bytes) <- results) {
   292               for ((log_name, bytes) <- results) {
   446     /* repository structure */
   437     /* repository structure */
   447 
   438 
   448     val hg = Mercurial.repository(isabelle_repos)
   439     val hg = Mercurial.repository(isabelle_repos)
   449     val hg_graph = hg.graph()
   440     val hg_graph = hg.graph()
   450 
   441 
   451     val user_home: String => Boolean =
       
   452       hg_graph.all_succs(List("19b6091c2137")).contains(_)
       
   453 
       
   454     def history_base_filter(r: Remote_Build): Item => Boolean =
   442     def history_base_filter(r: Remote_Build): Item => Boolean =
   455     {
   443     {
   456       val base_rev = hg.id(r.history_base)
   444       val base_rev = hg.id(r.history_base)
   457       val nodes = hg_graph.all_succs(List(base_rev)).toSet
   445       val nodes = hg_graph.all_succs(List(base_rev)).toSet
   458       (item: Item) => nodes(item.isabelle_version)
   446       (item: Item) => nodes(item.isabelle_version)
   473                 PAR(remote_builds.map(seq =>
   461                 PAR(remote_builds.map(seq =>
   474                   SEQ(
   462                   SEQ(
   475                     for {
   463                     for {
   476                       (r, i) <- (if (seq.length <= 1) seq.map((_, -1)) else seq.zipWithIndex)
   464                       (r, i) <- (if (seq.length <= 1) seq.map((_, -1)) else seq.zipWithIndex)
   477                       (rev, afp_rev) <- r.pick(logger.options, hg.id(), history_base_filter(r))
   465                       (rev, afp_rev) <- r.pick(logger.options, hg.id(), history_base_filter(r))
   478                     } yield remote_build_history(rev, afp_rev, i, user_home(rev), r)))),
   466                     } yield remote_build_history(rev, afp_rev, i, r)))),
   479                 Logger_Task("jenkins_logs", _ =>
   467                 Logger_Task("jenkins_logs", _ =>
   480                   Jenkins.download_logs(Jenkins.build_log_jobs, main_dir)),
   468                   Jenkins.download_logs(Jenkins.build_log_jobs, main_dir)),
   481                 Logger_Task("build_log_database",
   469                 Logger_Task("build_log_database",
   482                   logger => Isabelle_Devel.build_log_database(logger.options, build_log_dirs)),
   470                   logger => Isabelle_Devel.build_log_database(logger.options, build_log_dirs)),
   483                 Logger_Task("build_status",
   471                 Logger_Task("build_status",