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", |