| author | wenzelm | 
| Thu, 07 Oct 2021 13:12:08 +0200 | |
| changeset 74482 | bd5998580edb | 
| parent 73897 | 0ddb5de0506e | 
| child 75393 | 87ebf5a50283 | 
| permissions | -rw-r--r-- | 
| 61276 | 1  | 
/* Title: Pure/System/progress.scala  | 
2  | 
Author: Makarius  | 
|
3  | 
||
4  | 
Progress context for system processes.  | 
|
5  | 
*/  | 
|
6  | 
||
7  | 
package isabelle  | 
|
8  | 
||
9  | 
||
| 73897 | 10  | 
import java.util.{Map => JMap}
 | 
| 64201 | 11  | 
import java.io.{File => JFile}
 | 
12  | 
||
13  | 
||
| 
68410
 
4e27f5c361d2
clarified signature: more uniform theory_message (see also d7920eb7de54);
 
wenzelm 
parents: 
68330 
diff
changeset
 | 
14  | 
object Progress  | 
| 
 
4e27f5c361d2
clarified signature: more uniform theory_message (see also d7920eb7de54);
 
wenzelm 
parents: 
68330 
diff
changeset
 | 
15  | 
{
 | 
| 68957 | 16  | 
sealed case class Theory(theory: String, session: String = "", percentage: Option[Int] = None)  | 
17  | 
  {
 | 
|
| 68987 | 18  | 
def message: String = print_session + print_theory + print_percentage  | 
19  | 
||
20  | 
def print_session: String = if (session == "") "" else session + ": "  | 
|
21  | 
def print_theory: String = "theory " + theory  | 
|
22  | 
def print_percentage: String =  | 
|
23  | 
      percentage match { case None => "" case Some(p) => " " + p + "%" }
 | 
|
| 68957 | 24  | 
}  | 
| 
68410
 
4e27f5c361d2
clarified signature: more uniform theory_message (see also d7920eb7de54);
 
wenzelm 
parents: 
68330 
diff
changeset
 | 
25  | 
}  | 
| 
 
4e27f5c361d2
clarified signature: more uniform theory_message (see also d7920eb7de54);
 
wenzelm 
parents: 
68330 
diff
changeset
 | 
26  | 
|
| 61276 | 27  | 
class Progress  | 
28  | 
{
 | 
|
| 73340 | 29  | 
  def echo(msg: String): Unit = {}
 | 
30  | 
  def echo_if(cond: Boolean, msg: String): Unit = { if (cond) echo(msg) }
 | 
|
31  | 
  def theory(theory: Progress.Theory): Unit = {}
 | 
|
32  | 
  def nodes_status(nodes_status: Document_Status.Nodes_Status): Unit = {}
 | 
|
| 64909 | 33  | 
|
| 73340 | 34  | 
def echo_warning(msg: String): Unit = echo(Output.warning_text(msg))  | 
35  | 
def echo_error_message(msg: String): Unit = echo(Output.error_message_text(msg))  | 
|
| 65826 | 36  | 
|
| 65921 | 37  | 
def timeit[A](message: String = "", enabled: Boolean = true)(e: => A): A =  | 
| 71601 | 38  | 
Timing.timeit(message, enabled, echo)(e)  | 
| 65921 | 39  | 
|
| 
71726
 
a5fda30edae2
clarified signature: more uniform treatment of stopped/interrupted state;
 
wenzelm 
parents: 
71601 
diff
changeset
 | 
40  | 
@volatile protected var is_stopped = false  | 
| 73367 | 41  | 
  def stop(): Unit = { is_stopped = true }
 | 
| 
71726
 
a5fda30edae2
clarified signature: more uniform treatment of stopped/interrupted state;
 
wenzelm 
parents: 
71601 
diff
changeset
 | 
42  | 
def stopped: Boolean =  | 
| 
 
a5fda30edae2
clarified signature: more uniform treatment of stopped/interrupted state;
 
wenzelm 
parents: 
71601 
diff
changeset
 | 
43  | 
  {
 | 
| 73367 | 44  | 
if (Thread.interrupted()) is_stopped = true  | 
| 
71726
 
a5fda30edae2
clarified signature: more uniform treatment of stopped/interrupted state;
 
wenzelm 
parents: 
71601 
diff
changeset
 | 
45  | 
is_stopped  | 
| 
 
a5fda30edae2
clarified signature: more uniform treatment of stopped/interrupted state;
 
wenzelm 
parents: 
71601 
diff
changeset
 | 
46  | 
}  | 
| 
 
a5fda30edae2
clarified signature: more uniform treatment of stopped/interrupted state;
 
wenzelm 
parents: 
71601 
diff
changeset
 | 
47  | 
|
| 73367 | 48  | 
  def interrupt_handler[A](e: => A): A = POSIX_Interrupt.handler { stop() } { e }
 | 
| 73340 | 49  | 
def expose_interrupt(): Unit = if (stopped) throw Exn.Interrupt()  | 
| 61276 | 50  | 
override def toString: String = if (stopped) "Progress(stopped)" else "Progress"  | 
| 64201 | 51  | 
|
52  | 
def bash(script: String,  | 
|
53  | 
cwd: JFile = null,  | 
|
| 73897 | 54  | 
env: JMap[String, String] = Isabelle_System.settings(),  | 
| 64201 | 55  | 
redirect: Boolean = false,  | 
| 65930 | 56  | 
echo: Boolean = false,  | 
| 72599 | 57  | 
watchdog: Time = Time.zero,  | 
| 65930 | 58  | 
strict: Boolean = true): Process_Result =  | 
| 64201 | 59  | 
  {
 | 
| 72599 | 60  | 
val result =  | 
61  | 
Isabelle_System.bash(script, cwd = cwd, env = env, redirect = redirect,  | 
|
62  | 
progress_stdout = echo_if(echo, _),  | 
|
63  | 
progress_stderr = echo_if(echo, _),  | 
|
64  | 
watchdog = if (watchdog.is_zero) None else Some((watchdog, _ => stopped)),  | 
|
65  | 
strict = strict)  | 
|
66  | 
if (strict && stopped) throw Exn.Interrupt() else result  | 
|
| 64201 | 67  | 
}  | 
| 61276 | 68  | 
}  | 
69  | 
||
| 64117 | 70  | 
class Console_Progress(verbose: Boolean = false, stderr: Boolean = false) extends Progress  | 
| 61276 | 71  | 
{
 | 
| 
68951
 
a7b1fe2d30ad
more uniform Progress, with theory() for batch-build and theory_percentage() for PIDE session;
 
wenzelm 
parents: 
68903 
diff
changeset
 | 
72  | 
override def echo(msg: String): Unit =  | 
| 
71100
 
f31903cc57b0
clarified Console_Progress.echo: include empty lines as in other Progress instances, especially relevant for Progress.bash (e.g. "isabelle phabricator ./bin/config help");
 
wenzelm 
parents: 
69818 
diff
changeset
 | 
73  | 
Output.writeln(msg, stdout = !stderr, include_empty = true)  | 
| 64117 | 74  | 
|
| 68957 | 75  | 
override def theory(theory: Progress.Theory): Unit =  | 
76  | 
if (verbose) echo(theory.message)  | 
|
| 61276 | 77  | 
}  | 
| 65888 | 78  | 
|
79  | 
class File_Progress(path: Path, verbose: Boolean = false) extends Progress  | 
|
80  | 
{
 | 
|
81  | 
override def echo(msg: String): Unit =  | 
|
82  | 
File.append(path, msg + "\n")  | 
|
83  | 
||
| 68957 | 84  | 
override def theory(theory: Progress.Theory): Unit =  | 
85  | 
if (verbose) echo(theory.message)  | 
|
| 
68951
 
a7b1fe2d30ad
more uniform Progress, with theory() for batch-build and theory_percentage() for PIDE session;
 
wenzelm 
parents: 
68903 
diff
changeset
 | 
86  | 
|
| 65888 | 87  | 
override def toString: String = path.toString  | 
88  | 
}  |