| author | wenzelm | 
| Sun, 14 Feb 2016 11:52:27 +0100 | |
| changeset 62302 | 236e1ea5a197 | 
| parent 62298 | d4e99aa28abc | 
| child 62304 | e7a52a838a23 | 
| permissions | -rw-r--r-- | 
| 30175 | 1  | 
/* Title: Pure/System/isabelle_system.scala  | 
| 27919 | 2  | 
Author: Makarius  | 
3  | 
||
| 
43695
 
5130dfe1b7be
simplified Symbol based on lazy Symbol.Interpretation -- reduced odd "functorial style";
 
wenzelm 
parents: 
43670 
diff
changeset
 | 
4  | 
Fundamental Isabelle system environment: quasi-static module with  | 
| 
 
5130dfe1b7be
simplified Symbol based on lazy Symbol.Interpretation -- reduced odd "functorial style";
 
wenzelm 
parents: 
43670 
diff
changeset
 | 
5  | 
optional init operation.  | 
| 27919 | 6  | 
*/  | 
7  | 
||
8  | 
package isabelle  | 
|
9  | 
||
| 55618 | 10  | 
|
| 61281 | 11  | 
import java.io.{File => JFile, IOException, BufferedReader, InputStreamReader}
 | 
| 56477 | 12  | 
import java.nio.file.{Path => JPath, Files, SimpleFileVisitor, FileVisitResult}
 | 
13  | 
import java.nio.file.attribute.BasicFileAttributes  | 
|
| 27936 | 14  | 
|
| 61281 | 15  | 
import scala.collection.mutable  | 
16  | 
||
| 27919 | 17  | 
|
| 
43514
 
45cf8d5e109a
lazy Isabelle_System.default supports implicit boot;
 
wenzelm 
parents: 
43484 
diff
changeset
 | 
18  | 
object Isabelle_System  | 
| 
 
45cf8d5e109a
lazy Isabelle_System.default supports implicit boot;
 
wenzelm 
parents: 
43484 
diff
changeset
 | 
19  | 
{
 | 
| 
50652
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
20  | 
/** bootstrap information **/  | 
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
21  | 
|
| 
50652
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
22  | 
def jdk_home(): String =  | 
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
23  | 
  {
 | 
| 53582 | 24  | 
    val java_home = System.getProperty("java.home", "")
 | 
| 
50652
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
25  | 
val home = new JFile(java_home)  | 
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
26  | 
val parent = home.getParent  | 
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
27  | 
if (home.getName == "jre" && parent != null &&  | 
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
28  | 
(new JFile(new JFile(parent, "bin"), "javac")).exists) parent  | 
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
29  | 
else java_home  | 
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
30  | 
}  | 
| 
37013
 
641923374eba
Isabelle_System: allow explicit isabelle_home argument;
 
wenzelm 
parents: 
36991 
diff
changeset
 | 
31  | 
|
| 61291 | 32  | 
def bootstrap_directory(  | 
33  | 
preference: String, envar: String, property: String, description: String): String =  | 
|
| 
50652
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
34  | 
  {
 | 
| 61291 | 35  | 
def check(s: String): Option[String] =  | 
36  | 
if (s != null && s != "") Some(s) else None  | 
|
| 
50652
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
37  | 
|
| 61291 | 38  | 
val value =  | 
39  | 
check(preference) orElse // explicit argument  | 
|
40  | 
check(System.getenv(envar)) orElse // e.g. inherited from running isabelle tool  | 
|
41  | 
check(System.getProperty(property)) getOrElse // e.g. via JVM application boot process  | 
|
42  | 
      error("Unknown " + description + " directory")
 | 
|
| 
50652
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
43  | 
|
| 61291 | 44  | 
if ((new JFile(value)).isDirectory) value  | 
45  | 
    else error("Bad " + description + " directory " + quote(value))
 | 
|
| 
50652
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
46  | 
}  | 
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
47  | 
|
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
48  | 
|
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
49  | 
|
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
50  | 
/** implicit settings environment **/  | 
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
51  | 
|
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
52  | 
@volatile private var _settings: Option[Map[String, String]] = None  | 
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
53  | 
|
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
54  | 
def settings(): Map[String, String] =  | 
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
55  | 
  {
 | 
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
56  | 
if (_settings.isEmpty) init() // unsynchronized check  | 
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
57  | 
_settings.get  | 
| 
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
58  | 
}  | 
| 31796 | 59  | 
|
| 
61293
 
876e7eae22be
clarified ISABELLE_ROOT (platform path) vs. ISABELLE_HOME (standard path);
 
wenzelm 
parents: 
61291 
diff
changeset
 | 
60  | 
  def init(isabelle_root: String = "", cygwin_root: String = ""): Unit = synchronized {
 | 
| 
50652
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
61  | 
    if (_settings.isEmpty) {
 | 
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
62  | 
import scala.collection.JavaConversions._  | 
| 
37013
 
641923374eba
Isabelle_System: allow explicit isabelle_home argument;
 
wenzelm 
parents: 
36991 
diff
changeset
 | 
63  | 
|
| 
61293
 
876e7eae22be
clarified ISABELLE_ROOT (platform path) vs. ISABELLE_HOME (standard path);
 
wenzelm 
parents: 
61291 
diff
changeset
 | 
64  | 
val isabelle_root1 =  | 
| 
 
876e7eae22be
clarified ISABELLE_ROOT (platform path) vs. ISABELLE_HOME (standard path);
 
wenzelm 
parents: 
61291 
diff
changeset
 | 
65  | 
bootstrap_directory(isabelle_root, "ISABELLE_ROOT", "isabelle.root", "Isabelle root")  | 
| 61291 | 66  | 
|
67  | 
val cygwin_root1 =  | 
|
68  | 
if (Platform.is_windows)  | 
|
69  | 
bootstrap_directory(cygwin_root, "CYGWIN_ROOT", "cygwin.root", "Cygwin root")  | 
|
70  | 
else ""  | 
|
71  | 
||
| 61295 | 72  | 
if (Platform.is_windows) Cygwin.init(isabelle_root1, cygwin_root1)  | 
73  | 
||
| 51820 | 74  | 
def set_cygwin_root()  | 
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
75  | 
      {
 | 
| 51820 | 76  | 
if (Platform.is_windows)  | 
| 61291 | 77  | 
          _settings = Some(_settings.getOrElse(Map.empty) + ("CYGWIN_ROOT" -> cygwin_root1))
 | 
| 51820 | 78  | 
}  | 
| 
47725
 
447b635bcea5
cold-start HOME is user.home, in accordance with Cygwin-Terminal.bat;
 
wenzelm 
parents: 
47674 
diff
changeset
 | 
79  | 
|
| 51820 | 80  | 
set_cygwin_root()  | 
| 
57411
 
9444489766a1
sane environment defaults for Mac OS X, based on former App1/script -- e.g. relevant for MacTeX PATH;
 
wenzelm 
parents: 
56871 
diff
changeset
 | 
81  | 
|
| 
58640
 
37f852399a32
prefer original TEMP from Windows, e.g. relevant for Isabelle distribution within read-only directory (due to its bundled Cygwin and /tmp inside of it);
 
wenzelm 
parents: 
57411 
diff
changeset
 | 
82  | 
def default(env: Map[String, String], entry: (String, String)): Map[String, String] =  | 
| 
 
37f852399a32
prefer original TEMP from Windows, e.g. relevant for Isabelle distribution within read-only directory (due to its bundled Cygwin and /tmp inside of it);
 
wenzelm 
parents: 
57411 
diff
changeset
 | 
83  | 
if (env.isDefinedAt(entry._1) || entry._2 == "") env  | 
| 
 
37f852399a32
prefer original TEMP from Windows, e.g. relevant for Isabelle distribution within read-only directory (due to its bundled Cygwin and /tmp inside of it);
 
wenzelm 
parents: 
57411 
diff
changeset
 | 
84  | 
else env + entry  | 
| 
 
37f852399a32
prefer original TEMP from Windows, e.g. relevant for Isabelle distribution within read-only directory (due to its bundled Cygwin and /tmp inside of it);
 
wenzelm 
parents: 
57411 
diff
changeset
 | 
85  | 
|
| 
57411
 
9444489766a1
sane environment defaults for Mac OS X, based on former App1/script -- e.g. relevant for MacTeX PATH;
 
wenzelm 
parents: 
56871 
diff
changeset
 | 
86  | 
val env =  | 
| 
 
9444489766a1
sane environment defaults for Mac OS X, based on former App1/script -- e.g. relevant for MacTeX PATH;
 
wenzelm 
parents: 
56871 
diff
changeset
 | 
87  | 
      {
 | 
| 
58640
 
37f852399a32
prefer original TEMP from Windows, e.g. relevant for Isabelle distribution within read-only directory (due to its bundled Cygwin and /tmp inside of it);
 
wenzelm 
parents: 
57411 
diff
changeset
 | 
88  | 
val temp_windows =  | 
| 
 
37f852399a32
prefer original TEMP from Windows, e.g. relevant for Isabelle distribution within read-only directory (due to its bundled Cygwin and /tmp inside of it);
 
wenzelm 
parents: 
57411 
diff
changeset
 | 
89  | 
        {
 | 
| 61291 | 90  | 
          val temp = if (Platform.is_windows) System.getenv("TEMP") else null
 | 
| 
58640
 
37f852399a32
prefer original TEMP from Windows, e.g. relevant for Isabelle distribution within read-only directory (due to its bundled Cygwin and /tmp inside of it);
 
wenzelm 
parents: 
57411 
diff
changeset
 | 
91  | 
          if (temp != null && temp.contains('\\')) temp else ""
 | 
| 
 
37f852399a32
prefer original TEMP from Windows, e.g. relevant for Isabelle distribution within read-only directory (due to its bundled Cygwin and /tmp inside of it);
 
wenzelm 
parents: 
57411 
diff
changeset
 | 
92  | 
}  | 
| 
57411
 
9444489766a1
sane environment defaults for Mac OS X, based on former App1/script -- e.g. relevant for MacTeX PATH;
 
wenzelm 
parents: 
56871 
diff
changeset
 | 
93  | 
        val user_home = System.getProperty("user.home", "")
 | 
| 
 
9444489766a1
sane environment defaults for Mac OS X, based on former App1/script -- e.g. relevant for MacTeX PATH;
 
wenzelm 
parents: 
56871 
diff
changeset
 | 
94  | 
        val isabelle_app = System.getProperty("isabelle.app", "")
 | 
| 51820 | 95  | 
|
| 
58640
 
37f852399a32
prefer original TEMP from Windows, e.g. relevant for Isabelle distribution within read-only directory (due to its bundled Cygwin and /tmp inside of it);
 
wenzelm 
parents: 
57411 
diff
changeset
 | 
96  | 
default(  | 
| 
 
37f852399a32
prefer original TEMP from Windows, e.g. relevant for Isabelle distribution within read-only directory (due to its bundled Cygwin and /tmp inside of it);
 
wenzelm 
parents: 
57411 
diff
changeset
 | 
97  | 
default(  | 
| 60992 | 98  | 
            default(sys.env + ("ISABELLE_JDK_HOME" -> File.standard_path(jdk_home())),
 | 
| 60215 | 99  | 
"TEMP_WINDOWS" -> temp_windows),  | 
100  | 
"HOME" -> user_home),  | 
|
101  | 
"ISABELLE_APP" -> "true")  | 
|
| 
57411
 
9444489766a1
sane environment defaults for Mac OS X, based on former App1/script -- e.g. relevant for MacTeX PATH;
 
wenzelm 
parents: 
56871 
diff
changeset
 | 
102  | 
}  | 
| 29177 | 103  | 
|
| 51820 | 104  | 
val settings =  | 
| 
56428
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
105  | 
      {
 | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
106  | 
        val dump = JFile.createTempFile("settings", null)
 | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
107  | 
dump.deleteOnExit  | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
108  | 
        try {
 | 
| 
61293
 
876e7eae22be
clarified ISABELLE_ROOT (platform path) vs. ISABELLE_HOME (standard path);
 
wenzelm 
parents: 
61291 
diff
changeset
 | 
109  | 
val cmd1 =  | 
| 61291 | 110  | 
if (Platform.is_windows) List(cygwin_root1 + "\\bin\\bash", "-l") else Nil  | 
| 
61293
 
876e7eae22be
clarified ISABELLE_ROOT (platform path) vs. ISABELLE_HOME (standard path);
 
wenzelm 
parents: 
61291 
diff
changeset
 | 
111  | 
val cmd2 =  | 
| 
 
876e7eae22be
clarified ISABELLE_ROOT (platform path) vs. ISABELLE_HOME (standard path);
 
wenzelm 
parents: 
61291 
diff
changeset
 | 
112  | 
List(isabelle_root1 + JFile.separator + "bin" + JFile.separator + "isabelle",  | 
| 
 
876e7eae22be
clarified ISABELLE_ROOT (platform path) vs. ISABELLE_HOME (standard path);
 
wenzelm 
parents: 
61291 
diff
changeset
 | 
113  | 
"getenv", "-d", dump.toString)  | 
| 
 
876e7eae22be
clarified ISABELLE_ROOT (platform path) vs. ISABELLE_HOME (standard path);
 
wenzelm 
parents: 
61291 
diff
changeset
 | 
114  | 
|
| 62291 | 115  | 
val (output, rc) = process_output(process(null, env, true, (cmd1 ::: cmd2): _*))  | 
| 51820 | 116  | 
if (rc != 0) error(output)  | 
| 56477 | 117  | 
|
| 51820 | 118  | 
val entries =  | 
| 
56661
 
ef623f6f036b
avoid octal escape literals -- deprecated in scala-2.11.0;
 
wenzelm 
parents: 
56599 
diff
changeset
 | 
119  | 
            (for (entry <- File.read(dump) split "\u0000" if entry != "") yield {
 | 
| 51820 | 120  | 
              val i = entry.indexOf('=')
 | 
| 60215 | 121  | 
if (i <= 0) entry -> ""  | 
122  | 
else entry.substring(0, i) -> entry.substring(i + 1)  | 
|
| 51820 | 123  | 
}).toMap  | 
124  | 
          entries + ("PATH" -> entries("PATH_JVM")) - "PATH_JVM"
 | 
|
125  | 
}  | 
|
| 
56428
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
126  | 
        finally { dump.delete }
 | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
127  | 
}  | 
| 
50652
 
ead5714cc480
tuned signature -- eliminated obsolete Standard_System;
 
wenzelm 
parents: 
50651 
diff
changeset
 | 
128  | 
_settings = Some(settings)  | 
| 51820 | 129  | 
set_cygwin_root()  | 
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
130  | 
}  | 
| 27953 | 131  | 
}  | 
| 27919 | 132  | 
|
| 31796 | 133  | 
|
134  | 
/* getenv */  | 
|
135  | 
||
| 
47661
 
012a887997f3
USER_HOME settings variable points to cross-platform user home directory;
 
wenzelm 
parents: 
47113 
diff
changeset
 | 
136  | 
def getenv(name: String): String = settings.getOrElse(name, "")  | 
| 31498 | 137  | 
|
138  | 
def getenv_strict(name: String): String =  | 
|
139  | 
  {
 | 
|
| 
31234
 
6ce6801129de
getenv_strict needs to be based on getenv (accidentally broken in 0e88d33e8d19);
 
wenzelm 
parents: 
30175 
diff
changeset
 | 
140  | 
val value = getenv(name)  | 
| 60196 | 141  | 
if (value != "") value  | 
142  | 
    else error("Undefined Isabelle environment variable: " + quote(name))
 | 
|
| 27919 | 143  | 
}  | 
144  | 
||
| 61291 | 145  | 
  def cygwin_root(): String = getenv_strict("CYGWIN_ROOT")
 | 
| 51820 | 146  | 
|
| 31796 | 147  | 
|
| 54039 | 148  | 
|
| 43606 | 149  | 
/** file-system operations **/  | 
| 31796 | 150  | 
|
| 
48923
 
a2df77fcf1eb
prefer jEdit file name representation (potentially via VFS);
 
wenzelm 
parents: 
48550 
diff
changeset
 | 
151  | 
/* source files of Isabelle/ML bootstrap */  | 
| 31436 | 152  | 
|
| 
48923
 
a2df77fcf1eb
prefer jEdit file name representation (potentially via VFS);
 
wenzelm 
parents: 
48550 
diff
changeset
 | 
153  | 
def source_file(path: Path): Option[Path] =  | 
| 31498 | 154  | 
  {
 | 
| 
48923
 
a2df77fcf1eb
prefer jEdit file name representation (potentially via VFS);
 
wenzelm 
parents: 
48550 
diff
changeset
 | 
155  | 
def check(p: Path): Option[Path] = if (p.is_file) Some(p) else None  | 
| 
 
a2df77fcf1eb
prefer jEdit file name representation (potentially via VFS);
 
wenzelm 
parents: 
48550 
diff
changeset
 | 
156  | 
|
| 
 
a2df77fcf1eb
prefer jEdit file name representation (potentially via VFS);
 
wenzelm 
parents: 
48550 
diff
changeset
 | 
157  | 
if (path.is_absolute || path.is_current) check(path)  | 
| 31436 | 158  | 
    else {
 | 
| 
48923
 
a2df77fcf1eb
prefer jEdit file name representation (potentially via VFS);
 
wenzelm 
parents: 
48550 
diff
changeset
 | 
159  | 
      check(Path.explode("~~/src/Pure") + path) orElse
 | 
| 55876 | 160  | 
        (if (getenv("ML_SOURCES") == "") None
 | 
161  | 
         else check(Path.explode("$ML_SOURCES") + path))
 | 
|
| 31436 | 162  | 
}  | 
163  | 
}  | 
|
164  | 
||
165  | 
||
| 
50893
 
d55eb82ae77b
Isabelle_System.mkdirs with explicit error checking (in accordance to ML version), e.g. relevant with read-only DMG file-system on Mac OS X;
 
wenzelm 
parents: 
50854 
diff
changeset
 | 
166  | 
/* mkdirs */  | 
| 
 
d55eb82ae77b
Isabelle_System.mkdirs with explicit error checking (in accordance to ML version), e.g. relevant with read-only DMG file-system on Mac OS X;
 
wenzelm 
parents: 
50854 
diff
changeset
 | 
167  | 
|
| 60013 | 168  | 
def mkdirs(path: Path): Unit =  | 
| 
60263
 
2a5dbad75355
more portable mkdirs via perl, e.g. relevant for Windows UNC paths (network shares);
 
wenzelm 
parents: 
60215 
diff
changeset
 | 
169  | 
    if (!path.is_dir) {
 | 
| 62302 | 170  | 
      bash("perl -e \"use File::Path make_path; make_path(" + File.shell_path(path) + ");\"")
 | 
| 60988 | 171  | 
      if (!path.is_dir) error("Failed to create directory: " + quote(File.platform_path(path)))
 | 
| 
60263
 
2a5dbad75355
more portable mkdirs via perl, e.g. relevant for Windows UNC paths (network shares);
 
wenzelm 
parents: 
60215 
diff
changeset
 | 
172  | 
}  | 
| 
50893
 
d55eb82ae77b
Isabelle_System.mkdirs with explicit error checking (in accordance to ML version), e.g. relevant with read-only DMG file-system on Mac OS X;
 
wenzelm 
parents: 
50854 
diff
changeset
 | 
173  | 
|
| 
 
d55eb82ae77b
Isabelle_System.mkdirs with explicit error checking (in accordance to ML version), e.g. relevant with read-only DMG file-system on Mac OS X;
 
wenzelm 
parents: 
50854 
diff
changeset
 | 
174  | 
|
| 32450 | 175  | 
|
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
176  | 
/** external processes **/  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
177  | 
|
| 62291 | 178  | 
/* raw process */  | 
| 50651 | 179  | 
|
| 62291 | 180  | 
def process(cwd: JFile, env: Map[String, String], redirect: Boolean, args: String*): Process =  | 
| 50651 | 181  | 
  {
 | 
182  | 
val cmdline = new java.util.LinkedList[String]  | 
|
183  | 
for (s <- args) cmdline.add(s)  | 
|
184  | 
||
185  | 
val proc = new ProcessBuilder(cmdline)  | 
|
186  | 
if (cwd != null) proc.directory(cwd)  | 
|
187  | 
    if (env != null) {
 | 
|
188  | 
proc.environment.clear  | 
|
189  | 
for ((x, y) <- env) proc.environment.put(x, y)  | 
|
190  | 
}  | 
|
191  | 
proc.redirectErrorStream(redirect)  | 
|
192  | 
proc.start  | 
|
193  | 
}  | 
|
194  | 
||
| 61282 | 195  | 
def process_output(proc: Process): (String, Int) =  | 
| 50651 | 196  | 
  {
 | 
197  | 
proc.getOutputStream.close  | 
|
| 61281 | 198  | 
|
| 61282 | 199  | 
val output = File.read_stream(proc.getInputStream)  | 
| 50651 | 200  | 
val rc =  | 
201  | 
      try { proc.waitFor }
 | 
|
202  | 
      finally {
 | 
|
203  | 
proc.getInputStream.close  | 
|
204  | 
proc.getErrorStream.close  | 
|
205  | 
proc.destroy  | 
|
206  | 
Thread.interrupted  | 
|
207  | 
}  | 
|
208  | 
(output, rc)  | 
|
209  | 
}  | 
|
210  | 
||
211  | 
||
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
212  | 
/* plain execute */  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
213  | 
|
| 48409 | 214  | 
def execute_env(cwd: JFile, env: Map[String, String], redirect: Boolean, args: String*): Process =  | 
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
215  | 
  {
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
216  | 
val cmdline =  | 
| 61291 | 217  | 
if (Platform.is_windows) List(cygwin_root() + "\\bin\\env.exe") ::: args.toList  | 
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
218  | 
else args  | 
| 
48353
 
bcce872202b3
support external processes with explicit environment;
 
wenzelm 
parents: 
48278 
diff
changeset
 | 
219  | 
val env1 = if (env == null) settings else settings ++ env  | 
| 62291 | 220  | 
process(cwd, env1, redirect, cmdline: _*)  | 
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
221  | 
}  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
222  | 
|
| 
48353
 
bcce872202b3
support external processes with explicit environment;
 
wenzelm 
parents: 
48278 
diff
changeset
 | 
223  | 
def execute(redirect: Boolean, args: String*): Process =  | 
| 
 
bcce872202b3
support external processes with explicit environment;
 
wenzelm 
parents: 
48278 
diff
changeset
 | 
224  | 
execute_env(null, null, redirect, args: _*)  | 
| 
 
bcce872202b3
support external processes with explicit environment;
 
wenzelm 
parents: 
48278 
diff
changeset
 | 
225  | 
|
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
226  | 
|
| 
56428
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
227  | 
/* tmp files */  | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
228  | 
|
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
229  | 
private def isabelle_tmp_prefix(): JFile =  | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
230  | 
  {
 | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
231  | 
    val path = Path.explode("$ISABELLE_TMP_PREFIX")
 | 
| 60013 | 232  | 
path.file.mkdirs // low-level mkdirs  | 
| 60988 | 233  | 
File.platform_file(path)  | 
| 
56428
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
234  | 
}  | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
235  | 
|
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
236  | 
def tmp_file[A](name: String, ext: String = ""): JFile =  | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
237  | 
  {
 | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
238  | 
val suffix = if (ext == "") "" else "." + ext  | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
239  | 
val file = Files.createTempFile(isabelle_tmp_prefix().toPath, name, suffix).toFile  | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
240  | 
file.deleteOnExit  | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
241  | 
file  | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
242  | 
}  | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
243  | 
|
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
244  | 
def with_tmp_file[A](name: String, ext: String = "")(body: JFile => A): A =  | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
245  | 
  {
 | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
246  | 
val file = tmp_file(name, ext)  | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
247  | 
    try { body(file) } finally { file.delete }
 | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
248  | 
}  | 
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
249  | 
|
| 
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
250  | 
|
| 56477 | 251  | 
/* tmp dirs */  | 
252  | 
||
253  | 
def rm_tree(root: JFile)  | 
|
254  | 
  {
 | 
|
255  | 
root.delete  | 
|
256  | 
    if (root.isDirectory) {
 | 
|
257  | 
Files.walkFileTree(root.toPath,  | 
|
258  | 
        new SimpleFileVisitor[JPath] {
 | 
|
259  | 
override def visitFile(file: JPath, attrs: BasicFileAttributes): FileVisitResult =  | 
|
260  | 
          {
 | 
|
261  | 
Files.delete(file)  | 
|
262  | 
FileVisitResult.CONTINUE  | 
|
263  | 
}  | 
|
264  | 
||
265  | 
override def postVisitDirectory(dir: JPath, e: IOException): FileVisitResult =  | 
|
266  | 
          {
 | 
|
267  | 
            if (e == null) {
 | 
|
268  | 
Files.delete(dir)  | 
|
269  | 
FileVisitResult.CONTINUE  | 
|
270  | 
}  | 
|
271  | 
else throw e  | 
|
272  | 
}  | 
|
273  | 
}  | 
|
274  | 
)  | 
|
275  | 
}  | 
|
276  | 
}  | 
|
277  | 
||
278  | 
def tmp_dir(name: String): JFile =  | 
|
279  | 
  {
 | 
|
280  | 
val dir = Files.createTempDirectory(isabelle_tmp_prefix().toPath, name).toFile  | 
|
281  | 
dir.deleteOnExit  | 
|
282  | 
dir  | 
|
283  | 
}  | 
|
284  | 
||
285  | 
def with_tmp_dir[A](name: String)(body: JFile => A): A =  | 
|
286  | 
  {
 | 
|
287  | 
val dir = tmp_dir(name)  | 
|
288  | 
    try { body(dir) } finally { rm_tree(dir) }
 | 
|
289  | 
}  | 
|
290  | 
||
291  | 
||
| 61025 | 292  | 
/* kill */  | 
293  | 
||
294  | 
def kill(signal: String, group_pid: String): (String, Int) =  | 
|
295  | 
  {
 | 
|
296  | 
val bash =  | 
|
| 61291 | 297  | 
if (Platform.is_windows) List(cygwin_root() + "\\bin\\bash.exe")  | 
| 61025 | 298  | 
      else List("/usr/bin/env", "bash")
 | 
299  | 
    val cmdline = bash ::: List("-c", "kill -" + signal + " -" + group_pid)
 | 
|
| 62291 | 300  | 
process_output(process(null, null, true, cmdline: _*))  | 
| 61025 | 301  | 
}  | 
302  | 
||
303  | 
||
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
304  | 
/* bash */  | 
| 31796 | 305  | 
|
| 60991 | 306  | 
private class Limited_Progress(proc: Bash.Process, progress_limit: Option[Long])  | 
| 
56666
 
229309cbc508
avoid accidental use of scala.language.reflectiveCalls;
 
wenzelm 
parents: 
56661 
diff
changeset
 | 
307  | 
  {
 | 
| 
 
229309cbc508
avoid accidental use of scala.language.reflectiveCalls;
 
wenzelm 
parents: 
56661 
diff
changeset
 | 
308  | 
private var count = 0L  | 
| 
 
229309cbc508
avoid accidental use of scala.language.reflectiveCalls;
 
wenzelm 
parents: 
56661 
diff
changeset
 | 
309  | 
    def apply(progress: String => Unit)(line: String): Unit = synchronized {
 | 
| 
 
229309cbc508
avoid accidental use of scala.language.reflectiveCalls;
 
wenzelm 
parents: 
56661 
diff
changeset
 | 
310  | 
progress(line)  | 
| 
 
229309cbc508
avoid accidental use of scala.language.reflectiveCalls;
 
wenzelm 
parents: 
56661 
diff
changeset
 | 
311  | 
count = count + line.length + 1  | 
| 
 
229309cbc508
avoid accidental use of scala.language.reflectiveCalls;
 
wenzelm 
parents: 
56661 
diff
changeset
 | 
312  | 
      progress_limit match {
 | 
| 
 
229309cbc508
avoid accidental use of scala.language.reflectiveCalls;
 
wenzelm 
parents: 
56661 
diff
changeset
 | 
313  | 
case Some(limit) if count > limit => proc.terminate  | 
| 
 
229309cbc508
avoid accidental use of scala.language.reflectiveCalls;
 
wenzelm 
parents: 
56661 
diff
changeset
 | 
314  | 
case _ =>  | 
| 
 
229309cbc508
avoid accidental use of scala.language.reflectiveCalls;
 
wenzelm 
parents: 
56661 
diff
changeset
 | 
315  | 
}  | 
| 
 
229309cbc508
avoid accidental use of scala.language.reflectiveCalls;
 
wenzelm 
parents: 
56661 
diff
changeset
 | 
316  | 
}  | 
| 
 
229309cbc508
avoid accidental use of scala.language.reflectiveCalls;
 
wenzelm 
parents: 
56661 
diff
changeset
 | 
317  | 
}  | 
| 
 
229309cbc508
avoid accidental use of scala.language.reflectiveCalls;
 
wenzelm 
parents: 
56661 
diff
changeset
 | 
318  | 
|
| 62302 | 319  | 
def bash(script: String, cwd: JFile = null, env: Map[String, String] = null,  | 
| 
51962
 
016cb7d8f297
limit build process output, to avoid bombing Isabelle/Scala process by ill-behaved jobs (e.g. Containers in AFP/9025435b29cf);
 
wenzelm 
parents: 
51820 
diff
changeset
 | 
320  | 
progress_stdout: String => Unit = (_: String) => (),  | 
| 
 
016cb7d8f297
limit build process output, to avoid bombing Isabelle/Scala process by ill-behaved jobs (e.g. Containers in AFP/9025435b29cf);
 
wenzelm 
parents: 
51820 
diff
changeset
 | 
321  | 
progress_stderr: String => Unit = (_: String) => (),  | 
| 
56871
 
d06ff36b4fa7
expose interrupts more like ML version, but not in managed bash processes of Build;
 
wenzelm 
parents: 
56862 
diff
changeset
 | 
322  | 
progress_limit: Option[Long] = None,  | 
| 60991 | 323  | 
strict: Boolean = true): Bash.Result =  | 
| 
34198
 
ff5486262cd6
moved Library.decode_permissive_utf8 to Isabelle_System;
 
wenzelm 
parents: 
34196 
diff
changeset
 | 
324  | 
  {
 | 
| 
56428
 
1acf2d76ac23
more standard Isabelle_System.tmp_file and tmp_dir operations, in accordance to ML version;
 
wenzelm 
parents: 
55876 
diff
changeset
 | 
325  | 
    with_tmp_file("isabelle_script") { script_file =>
 | 
| 
48411
 
5b3440850d36
more abstract file system operations in Scala, corresponding to ML version;
 
wenzelm 
parents: 
48409 
diff
changeset
 | 
326  | 
File.write(script_file, script)  | 
| 62296 | 327  | 
val proc = Bash.process(cwd, env, false, File.standard_path(script_file))  | 
| 
51962
 
016cb7d8f297
limit build process output, to avoid bombing Isabelle/Scala process by ill-behaved jobs (e.g. Containers in AFP/9025435b29cf);
 
wenzelm 
parents: 
51820 
diff
changeset
 | 
328  | 
proc.stdin.close  | 
| 
39581
 
430ff865089b
refined Isabelle_System.bash_output: pass pid via stdout, separate stdout/stderr;
 
wenzelm 
parents: 
39576 
diff
changeset
 | 
329  | 
|
| 
56666
 
229309cbc508
avoid accidental use of scala.language.reflectiveCalls;
 
wenzelm 
parents: 
56661 
diff
changeset
 | 
330  | 
val limited = new Limited_Progress(proc, progress_limit)  | 
| 
61559
 
313eca3fa847
more direct task future implementation, with proper cancel operation;
 
wenzelm 
parents: 
61556 
diff
changeset
 | 
331  | 
val stdout =  | 
| 
 
313eca3fa847
more direct task future implementation, with proper cancel operation;
 
wenzelm 
parents: 
61556 
diff
changeset
 | 
332  | 
        Future.thread("bash_stdout") { File.read_lines(proc.stdout, limited(progress_stdout)) }
 | 
| 
 
313eca3fa847
more direct task future implementation, with proper cancel operation;
 
wenzelm 
parents: 
61556 
diff
changeset
 | 
333  | 
val stderr =  | 
| 
 
313eca3fa847
more direct task future implementation, with proper cancel operation;
 
wenzelm 
parents: 
61556 
diff
changeset
 | 
334  | 
        Future.thread("bash_stderr") { File.read_lines(proc.stderr, limited(progress_stderr)) }
 | 
| 
34198
 
ff5486262cd6
moved Library.decode_permissive_utf8 to Isabelle_System;
 
wenzelm 
parents: 
34196 
diff
changeset
 | 
335  | 
|
| 
39581
 
430ff865089b
refined Isabelle_System.bash_output: pass pid via stdout, separate stdout/stderr;
 
wenzelm 
parents: 
39576 
diff
changeset
 | 
336  | 
val rc =  | 
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
337  | 
        try { proc.join }
 | 
| 
56667
 
65e84b0ef974
more abstract Exn.Interrupt and POSIX return code;
 
wenzelm 
parents: 
56666 
diff
changeset
 | 
338  | 
        catch { case Exn.Interrupt() => proc.terminate; Exn.Interrupt.return_code }
 | 
| 
56871
 
d06ff36b4fa7
expose interrupts more like ML version, but not in managed bash processes of Build;
 
wenzelm 
parents: 
56862 
diff
changeset
 | 
339  | 
if (strict && rc == Exn.Interrupt.return_code) throw Exn.Interrupt()  | 
| 
 
d06ff36b4fa7
expose interrupts more like ML version, but not in managed bash processes of Build;
 
wenzelm 
parents: 
56862 
diff
changeset
 | 
340  | 
|
| 60991 | 341  | 
Bash.Result(stdout.join, stderr.join, rc)  | 
| 
34198
 
ff5486262cd6
moved Library.decode_permissive_utf8 to Isabelle_System;
 
wenzelm 
parents: 
34196 
diff
changeset
 | 
342  | 
}  | 
| 
 
ff5486262cd6
moved Library.decode_permissive_utf8 to Isabelle_System;
 
wenzelm 
parents: 
34196 
diff
changeset
 | 
343  | 
}  | 
| 
 
ff5486262cd6
moved Library.decode_permissive_utf8 to Isabelle_System;
 
wenzelm 
parents: 
34196 
diff
changeset
 | 
344  | 
|
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
345  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
346  | 
/* system tools */  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
347  | 
|
| 
31818
 
f698f76a3713
builtin isabelle_tool for ML and Scala -- avoids excessive shell script (especially important for Cygwin);
 
wenzelm 
parents: 
31803 
diff
changeset
 | 
348  | 
def isabelle_tool(name: String, args: String*): (String, Int) =  | 
| 31498 | 349  | 
  {
 | 
| 43669 | 350  | 
    Path.split(getenv_strict("ISABELLE_TOOLS")).find { dir =>
 | 
| 48373 | 351  | 
val file = (dir + Path.basic(name)).file  | 
| 42124 | 352  | 
      try {
 | 
353  | 
file.isFile && file.canRead && file.canExecute &&  | 
|
354  | 
          !name.endsWith("~") && !name.endsWith(".orig")
 | 
|
355  | 
}  | 
|
| 
31818
 
f698f76a3713
builtin isabelle_tool for ML and Scala -- avoids excessive shell script (especially important for Cygwin);
 
wenzelm 
parents: 
31803 
diff
changeset
 | 
356  | 
      catch { case _: SecurityException => false }
 | 
| 34200 | 357  | 
    } match {
 | 
| 
31818
 
f698f76a3713
builtin isabelle_tool for ML and Scala -- avoids excessive shell script (especially important for Cygwin);
 
wenzelm 
parents: 
31803 
diff
changeset
 | 
358  | 
case Some(dir) =>  | 
| 60988 | 359  | 
val file = File.standard_path(dir + Path.basic(name))  | 
| 61282 | 360  | 
process_output(execute(true, (List(file) ::: args.toList): _*))  | 
| 
31818
 
f698f76a3713
builtin isabelle_tool for ML and Scala -- avoids excessive shell script (especially important for Cygwin);
 
wenzelm 
parents: 
31803 
diff
changeset
 | 
361  | 
      case None => ("Unknown Isabelle tool: " + name, 2)
 | 
| 
 
f698f76a3713
builtin isabelle_tool for ML and Scala -- avoids excessive shell script (especially important for Cygwin);
 
wenzelm 
parents: 
31803 
diff
changeset
 | 
362  | 
}  | 
| 28063 | 363  | 
}  | 
364  | 
||
| 54690 | 365  | 
def open(arg: String): Unit =  | 
| 62302 | 366  | 
    bash("exec \"$ISABELLE_OPEN\" '" + arg + "' >/dev/null 2>/dev/null &")
 | 
| 54690 | 367  | 
|
368  | 
def pdf_viewer(arg: Path): Unit =  | 
|
| 62302 | 369  | 
    bash("exec \"$PDF_VIEWER\" '" + File.standard_path(arg) + "' >/dev/null 2>/dev/null &")
 | 
| 54690 | 370  | 
|
| 60991 | 371  | 
def hg(cmd_line: String, cwd: Path = Path.current): Bash.Result =  | 
| 62302 | 372  | 
    bash("cd " + File.shell_path(cwd) + " && \"${HG:-hg}\" " + cmd_line)
 | 
| 28063 | 373  | 
|
| 32450 | 374  | 
|
| 31796 | 375  | 
/** Isabelle resources **/  | 
376  | 
||
| 32328 | 377  | 
/* components */  | 
378  | 
||
| 43669 | 379  | 
def components(): List[Path] =  | 
380  | 
    Path.split(getenv_strict("ISABELLE_COMPONENTS"))
 | 
|
| 32328 | 381  | 
|
382  | 
||
| 
50403
 
87868964733c
more uniform default logic, using settings, options, args etc.;
 
wenzelm 
parents: 
50298 
diff
changeset
 | 
383  | 
/* logic images */  | 
| 29152 | 384  | 
|
| 48503 | 385  | 
def find_logics_dirs(): List[Path] =  | 
| 31498 | 386  | 
  {
 | 
| 48503 | 387  | 
    val ml_ident = Path.explode("$ML_IDENTIFIER").expand
 | 
388  | 
    Path.split(getenv_strict("ISABELLE_PATH")).map(_ + ml_ident)
 | 
|
| 29152 | 389  | 
}  | 
| 29570 | 390  | 
|
| 48503 | 391  | 
def find_logics(): List[String] =  | 
392  | 
    (for {
 | 
|
393  | 
dir <- find_logics_dirs()  | 
|
394  | 
files = dir.file.listFiles() if files != null  | 
|
395  | 
file <- files.toList if file.isFile } yield file.getName).sorted  | 
|
396  | 
||
| 
50403
 
87868964733c
more uniform default logic, using settings, options, args etc.;
 
wenzelm 
parents: 
50298 
diff
changeset
 | 
397  | 
def default_logic(args: String*): String =  | 
| 
 
87868964733c
more uniform default logic, using settings, options, args etc.;
 
wenzelm 
parents: 
50298 
diff
changeset
 | 
398  | 
  {
 | 
| 
 
87868964733c
more uniform default logic, using settings, options, args etc.;
 
wenzelm 
parents: 
50298 
diff
changeset
 | 
399  | 
    args.find(_ != "") match {
 | 
| 
 
87868964733c
more uniform default logic, using settings, options, args etc.;
 
wenzelm 
parents: 
50298 
diff
changeset
 | 
400  | 
case Some(logic) => logic  | 
| 
 
87868964733c
more uniform default logic, using settings, options, args etc.;
 
wenzelm 
parents: 
50298 
diff
changeset
 | 
401  | 
      case None => Isabelle_System.getenv_strict("ISABELLE_LOGIC")
 | 
| 
 
87868964733c
more uniform default logic, using settings, options, args etc.;
 
wenzelm 
parents: 
50298 
diff
changeset
 | 
402  | 
}  | 
| 
 
87868964733c
more uniform default logic, using settings, options, args etc.;
 
wenzelm 
parents: 
50298 
diff
changeset
 | 
403  | 
}  | 
| 27919 | 404  | 
}  |