| author | paulson |
| Sat, 28 Jul 2018 16:06:51 +0100 | |
| changeset 68688 | 3a58abb11840 |
| parent 68410 | 4e27f5c361d2 |
| child 68770 | add44e2b8cb0 |
| 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 |
||
| 64201 | 10 |
import java.io.{File => JFile}
|
11 |
||
12 |
||
|
68410
4e27f5c361d2
clarified signature: more uniform theory_message (see also d7920eb7de54);
wenzelm
parents:
68330
diff
changeset
|
13 |
object Progress |
|
4e27f5c361d2
clarified signature: more uniform theory_message (see also d7920eb7de54);
wenzelm
parents:
68330
diff
changeset
|
14 |
{
|
|
4e27f5c361d2
clarified signature: more uniform theory_message (see also d7920eb7de54);
wenzelm
parents:
68330
diff
changeset
|
15 |
def theory_message(session: String, theory: String): String = |
|
4e27f5c361d2
clarified signature: more uniform theory_message (see also d7920eb7de54);
wenzelm
parents:
68330
diff
changeset
|
16 |
if (session == "") "theory " + theory else session + ": theory " + theory |
|
4e27f5c361d2
clarified signature: more uniform theory_message (see also d7920eb7de54);
wenzelm
parents:
68330
diff
changeset
|
17 |
} |
|
4e27f5c361d2
clarified signature: more uniform theory_message (see also d7920eb7de54);
wenzelm
parents:
68330
diff
changeset
|
18 |
|
| 61276 | 19 |
class Progress |
20 |
{
|
|
21 |
def echo(msg: String) {}
|
|
| 64049 | 22 |
def echo_if(cond: Boolean, msg: String) { if (cond) echo(msg) }
|
| 61276 | 23 |
def theory(session: String, theory: String) {}
|
| 64909 | 24 |
|
| 65826 | 25 |
def echo_warning(msg: String) { echo(Output.warning_text(msg)) }
|
| 65828 | 26 |
def echo_error_message(msg: String) { echo(Output.error_message_text(msg)) }
|
| 65826 | 27 |
|
| 65921 | 28 |
def timeit[A](message: String = "", enabled: Boolean = true)(e: => A): A = |
29 |
Timing.timeit(message, enabled, echo(_))(e) |
|
30 |
||
| 61276 | 31 |
def stopped: Boolean = false |
| 68305 | 32 |
def interrupt_handler[A](e: => A): A = e |
| 67880 | 33 |
def expose_interrupt() { if (stopped) throw Exn.Interrupt() }
|
| 61276 | 34 |
override def toString: String = if (stopped) "Progress(stopped)" else "Progress" |
| 64201 | 35 |
|
36 |
def bash(script: String, |
|
37 |
cwd: JFile = null, |
|
38 |
env: Map[String, String] = Isabelle_System.settings(), |
|
39 |
redirect: Boolean = false, |
|
| 65930 | 40 |
echo: Boolean = false, |
41 |
strict: Boolean = true): Process_Result = |
|
| 64201 | 42 |
{
|
43 |
Isabelle_System.bash(script, cwd = cwd, env = env, redirect = redirect, |
|
44 |
progress_stdout = echo_if(echo, _), |
|
| 65930 | 45 |
progress_stderr = echo_if(echo, _), |
46 |
strict = strict) |
|
| 64201 | 47 |
} |
| 61276 | 48 |
} |
49 |
||
| 64909 | 50 |
object No_Progress extends Progress |
| 61276 | 51 |
|
| 64117 | 52 |
class Console_Progress(verbose: Boolean = false, stderr: Boolean = false) extends Progress |
| 61276 | 53 |
{
|
| 64117 | 54 |
override def echo(msg: String) |
55 |
{
|
|
| 67178 | 56 |
Output.writeln(msg, stdout = !stderr) |
| 64117 | 57 |
} |
58 |
||
| 61276 | 59 |
override def theory(session: String, theory: String): Unit = |
|
68410
4e27f5c361d2
clarified signature: more uniform theory_message (see also d7920eb7de54);
wenzelm
parents:
68330
diff
changeset
|
60 |
if (verbose) echo(Progress.theory_message(session, theory)) |
| 61276 | 61 |
|
62 |
@volatile private var is_stopped = false |
|
| 68305 | 63 |
override def interrupt_handler[A](e: => A): A = |
64 |
POSIX_Interrupt.handler { is_stopped = true } { e }
|
|
| 61276 | 65 |
override def stopped: Boolean = |
66 |
{
|
|
67 |
if (Thread.interrupted) is_stopped = true |
|
68 |
is_stopped |
|
69 |
} |
|
70 |
} |
|
| 65888 | 71 |
|
72 |
class File_Progress(path: Path, verbose: Boolean = false) extends Progress |
|
73 |
{
|
|
74 |
override def echo(msg: String): Unit = |
|
75 |
File.append(path, msg + "\n") |
|
76 |
||
77 |
override def theory(session: String, theory: String): Unit = |
|
|
68410
4e27f5c361d2
clarified signature: more uniform theory_message (see also d7920eb7de54);
wenzelm
parents:
68330
diff
changeset
|
78 |
if (verbose) echo(Progress.theory_message(session, theory)) |
| 65888 | 79 |
|
80 |
override def toString: String = path.toString |
|
81 |
} |