src/Pure/System/isabelle_system.ML
author paulson <lp15@cam.ac.uk>
Fri, 06 Jun 2025 18:36:29 +0100
changeset 82690 cccbfa567117
parent 82082 794bf73e100f
permissions -rw-r--r--
Sylvestre's correction to ex_least_nat_le and other tidying
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
40743
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/System/isabelle_system.ML
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
     3
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
     4
Isabelle system support.
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
     5
*)
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
     6
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
     7
signature ISABELLE_SYSTEM =
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
     8
sig
74147
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
     9
  val bash_process: Bash.params -> Process_Result.T
71902
1529336eaedc check bash functions against Isabelle settings environment;
wenzelm
parents: 70050
diff changeset
    10
  val bash_output: string -> string * int
1529336eaedc check bash functions against Isabelle settings environment;
wenzelm
parents: 70050
diff changeset
    11
  val bash: string -> int
1529336eaedc check bash functions against Isabelle settings environment;
wenzelm
parents: 70050
diff changeset
    12
  val bash_functions: unit -> string list
1529336eaedc check bash functions against Isabelle settings environment;
wenzelm
parents: 70050
diff changeset
    13
  val check_bash_function: Proof.context -> string * Position.T -> string
73434
00b77365552e clarified signature: refer to file name instead of file content;
wenzelm
parents: 73419
diff changeset
    14
  val absolute_path: Path.T -> string
72376
04bce3478688 clarified signature;
wenzelm
parents: 72375
diff changeset
    15
  val make_directory: Path.T -> Path.T
40743
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
    16
  val copy_dir: Path.T -> Path.T -> unit
56533
cd8b6d849b6a explicit 'document_files' in session ROOT specifications;
wenzelm
parents: 56498
diff changeset
    17
  val copy_file: Path.T -> Path.T -> unit
cd8b6d849b6a explicit 'document_files' in session ROOT specifications;
wenzelm
parents: 56498
diff changeset
    18
  val copy_file_base: Path.T * Path.T -> Path.T -> unit
42127
8223e7f4b0da Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
wenzelm
parents: 41944
diff changeset
    19
  val create_tmp_path: string -> string -> Path.T
8223e7f4b0da Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
wenzelm
parents: 41944
diff changeset
    20
  val with_tmp_file: string -> string -> (Path.T -> 'a) -> 'a
73324
48abb09d49ea more Isabelle/ML/Scala operations;
wenzelm
parents: 73323
diff changeset
    21
  val rm_tree: Path.T -> unit
41307
bb8468ae414e slightly more standard Isabelle_System.with_tmp_file/with_tmp_dir (cf. Scala version);
wenzelm
parents: 40785
diff changeset
    22
  val with_tmp_dir: string -> (Path.T -> 'a) -> 'a
75578
d3ba143a7ab8 prefer scalable byte strings;
wenzelm
parents: 75577
diff changeset
    23
  val download: string -> Bytes.T
73566
4e6b31ed7197 clarified signature: avoid tmp file;
wenzelm
parents: 73565
diff changeset
    24
  val download_file: string -> Path.T -> unit
73523
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
    25
  val isabelle_id: unit -> string
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
    26
  val isabelle_identifier: unit -> string option
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
    27
  val isabelle_heading: unit -> string
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
    28
  val isabelle_name: unit -> string
73547
a7aabdf889b7 clarified signature;
wenzelm
parents: 73523
diff changeset
    29
  val identification: unit -> string
40743
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
    30
end;
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
    31
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
    32
structure Isabelle_System: ISABELLE_SYSTEM =
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
    33
struct
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
    34
43850
7f2cbc713344 moved bash operations to Isabelle_System (cf. Scala version);
wenzelm
parents: 43849
diff changeset
    35
(* bash *)
7f2cbc713344 moved bash operations to Isabelle_System (cf. Scala version);
wenzelm
parents: 43849
diff changeset
    36
74147
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
    37
val absolute_path = Path.implode o File.absolute_path;
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
    38
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
    39
fun bash_process params =
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
    40
  let
74212
a1ccecae6a57 clarified process description;
wenzelm
parents: 74210
diff changeset
    41
    val {script, input, cwd, putenv, redirect, timeout, description} =
74147
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
    42
      Bash.dest_params params;
78716
97dfba4405e3 tuned signature;
wenzelm
parents: 78681
diff changeset
    43
    val server_run =
82082
794bf73e100f clarified signature: scalable Bash.input thanks to Bytes.T;
wenzelm
parents: 78787
diff changeset
    44
     [Bytes.string Bash.server_run,
794bf73e100f clarified signature: scalable Bash.input thanks to Bytes.T;
wenzelm
parents: 78787
diff changeset
    45
      Bytes.string script,
794bf73e100f clarified signature: scalable Bash.input thanks to Bytes.T;
wenzelm
parents: 78787
diff changeset
    46
      input,
794bf73e100f clarified signature: scalable Bash.input thanks to Bytes.T;
wenzelm
parents: 78787
diff changeset
    47
      let open XML.Encode in YXML.bytes_of_body (option (string o absolute_path) cwd) end,
794bf73e100f clarified signature: scalable Bash.input thanks to Bytes.T;
wenzelm
parents: 78787
diff changeset
    48
      let open XML.Encode in YXML.bytes_of_body o list (pair string string) end
794bf73e100f clarified signature: scalable Bash.input thanks to Bytes.T;
wenzelm
parents: 78787
diff changeset
    49
        (("ISABELLE_TMP", getenv "ISABELLE_TMP") :: putenv),
794bf73e100f clarified signature: scalable Bash.input thanks to Bytes.T;
wenzelm
parents: 78787
diff changeset
    50
      Bytes.string (Value.print_bool redirect),
794bf73e100f clarified signature: scalable Bash.input thanks to Bytes.T;
wenzelm
parents: 78787
diff changeset
    51
      Bytes.string (Value.print_real (Time.toReal timeout)),
794bf73e100f clarified signature: scalable Bash.input thanks to Bytes.T;
wenzelm
parents: 78787
diff changeset
    52
      Bytes.string description];
74147
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
    53
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
    54
    val address = Options.default_string \<^system_option>\<open>bash_process_address\<close>;
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
    55
    val password = Options.default_string \<^system_option>\<open>bash_process_password\<close>;
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
    56
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
    57
    val _ = address = "" andalso raise Fail "Bad bash_process server address";
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
    58
    fun with_streams f = Socket_IO.with_streams' f address password;
73264
440546ea20e6 clarified modules;
wenzelm
parents: 72951
diff changeset
    59
74210
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    60
    fun kill (SOME uuid) =
75577
c51e1cef1eae more scalable byte messages, notably for Scala functions in ML;
wenzelm
parents: 74336
diff changeset
    61
          with_streams (fn s => Byte_Message.write_message_string (#2 s) [Bash.server_kill, uuid])
74147
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
    62
      | kill NONE = ();
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
    63
  in
78720
909dc00766a0 clarified signature;
wenzelm
parents: 78719
diff changeset
    64
    Thread_Attributes.uninterruptible_body (fn run =>
74147
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
    65
      let
74210
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    66
        fun err () = raise Fail "Malformed result from bash_process server";
78725
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78722
diff changeset
    67
        fun loop_body s =
78716
97dfba4405e3 tuned signature;
wenzelm
parents: 78681
diff changeset
    68
          (case run Byte_Message.read_message_string (#1 s) of
74210
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    69
            SOME (head :: args) =>
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    70
              if head = Bash.server_uuid andalso length args = 1 then
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    71
                loop (SOME (hd args)) s
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    72
              else if head = Bash.server_interrupt andalso null args then
78787
a7e4b412cc7c tuned signature, following Isabelle/Scala;
wenzelm
parents: 78757
diff changeset
    73
                Isabelle_Thread.raise_interrupt ()
74210
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    74
              else if head = Bash.server_failure andalso length args = 1 then
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    75
                raise Fail (hd args)
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    76
              else if head = Bash.server_result andalso length args >= 4 then
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    77
                let
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    78
                  val a :: b :: c :: d :: lines = args;
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    79
                  val rc = Value.parse_int a;
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    80
                  val (elapsed, cpu) = apply2 (Time.fromMilliseconds o Value.parse_int) (b, c);
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    81
                  val (out_lines, err_lines) = chop (Value.parse_int d) lines;
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    82
                in
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    83
                  if rc = Process_Result.timeout_rc then raise Timeout.TIMEOUT elapsed
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    84
                  else
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    85
                    Process_Result.make
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    86
                     {rc = rc,
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    87
                      out_lines = out_lines,
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    88
                      err_lines = err_lines,
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    89
                      timing = {elapsed = elapsed, cpu = cpu, gc = Time.zeroTime}}
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    90
                 end
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    91
               else err ()
c14774713d62 clarified signature;
wenzelm
parents: 74147
diff changeset
    92
          | _ => err ())
78725
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78722
diff changeset
    93
        and loop maybe_uuid s =
78757
a094bf81a496 clarified signature;
wenzelm
parents: 78725
diff changeset
    94
          (case Exn.capture_body (fn () => loop_body s) of
78725
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78722
diff changeset
    95
            Exn.Res res => res
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78722
diff changeset
    96
          | Exn.Exn exn => (kill maybe_uuid; Exn.reraise exn));
78716
97dfba4405e3 tuned signature;
wenzelm
parents: 78681
diff changeset
    97
      in
82082
794bf73e100f clarified signature: scalable Bash.input thanks to Bytes.T;
wenzelm
parents: 78787
diff changeset
    98
        with_streams (fn s => (Byte_Message.write_message (#2 s) server_run; loop NONE s))
78720
909dc00766a0 clarified signature;
wenzelm
parents: 78719
diff changeset
    99
      end)
74147
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
   100
  end;
73604
51b291ae3e2d avoid "exec" to change the winpid;
wenzelm
parents: 73576
diff changeset
   101
74147
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
   102
val bash = Bash.script #> bash_process #> Process_Result.print #> Process_Result.rc;
73281
22417b631453 clarified signature, following Isabelle/Scala;
wenzelm
parents: 73279
diff changeset
   103
43850
7f2cbc713344 moved bash operations to Isabelle_System (cf. Scala version);
wenzelm
parents: 43849
diff changeset
   104
fun bash_output s =
47499
4b0daca2bf88 redirect bash stderr to Isabelle warning as appropriate -- avoid raw process error output which may either get ignored or overload PIDE syslog in extreme cases;
wenzelm
parents: 46502
diff changeset
   105
  let
74147
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
   106
    val res = bash_process (Bash.script s);
73277
0110e2e2964c clarified signature: always trim_line of Process_Result.out/err, uniformly in ML and Scala;
wenzelm
parents: 73275
diff changeset
   107
    val _ = warning (Process_Result.err res);
73275
f0db1e4c89bc clarified signature, following Isabelle/Scala;
wenzelm
parents: 73273
diff changeset
   108
  in (Process_Result.out res, Process_Result.rc res) end;
43850
7f2cbc713344 moved bash operations to Isabelle_System (cf. Scala version);
wenzelm
parents: 43849
diff changeset
   109
7f2cbc713344 moved bash operations to Isabelle_System (cf. Scala version);
wenzelm
parents: 43849
diff changeset
   110
71902
1529336eaedc check bash functions against Isabelle settings environment;
wenzelm
parents: 70050
diff changeset
   111
(* bash functions *)
1529336eaedc check bash functions against Isabelle settings environment;
wenzelm
parents: 70050
diff changeset
   112
1529336eaedc check bash functions against Isabelle settings environment;
wenzelm
parents: 70050
diff changeset
   113
fun bash_functions () =
74147
d030b988d470 provide bash_process server for Isabelle/ML and other external programs;
wenzelm
parents: 74142
diff changeset
   114
  bash_process (Bash.script "declare -Fx")
73279
37aff2142295 clarified signature;
wenzelm
parents: 73277
diff changeset
   115
  |> Process_Result.check
37aff2142295 clarified signature;
wenzelm
parents: 73277
diff changeset
   116
  |> Process_Result.out_lines
37aff2142295 clarified signature;
wenzelm
parents: 73277
diff changeset
   117
  |> map_filter (space_explode " " #> try List.last);
71902
1529336eaedc check bash functions against Isabelle settings environment;
wenzelm
parents: 70050
diff changeset
   118
71911
d25093536482 clarified signature;
wenzelm
parents: 71902
diff changeset
   119
fun check_bash_function ctxt arg =
71912
b9fbc93f3a24 clarified markup;
wenzelm
parents: 71911
diff changeset
   120
  Completion.check_entity Markup.bash_functionN
b9fbc93f3a24 clarified markup;
wenzelm
parents: 71911
diff changeset
   121
    (bash_functions () |> map (rpair Position.none)) ctxt arg;
71902
1529336eaedc check bash functions against Isabelle settings environment;
wenzelm
parents: 70050
diff changeset
   122
1529336eaedc check bash functions against Isabelle settings environment;
wenzelm
parents: 70050
diff changeset
   123
73322
5b15eee1a661 more Isabelle/ML/Scala operations;
wenzelm
parents: 73316
diff changeset
   124
(* directory and file operations *)
5b15eee1a661 more Isabelle/ML/Scala operations;
wenzelm
parents: 73316
diff changeset
   125
73567
355af2d1b817 clarified signature;
wenzelm
parents: 73566
diff changeset
   126
fun scala_function name = ignore o Scala.function name o map absolute_path;
40743
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
   127
73322
5b15eee1a661 more Isabelle/ML/Scala operations;
wenzelm
parents: 73316
diff changeset
   128
fun make_directory path = (scala_function "make_directory" [path]; path);
40743
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
   129
73322
5b15eee1a661 more Isabelle/ML/Scala operations;
wenzelm
parents: 73316
diff changeset
   130
fun copy_dir src dst = scala_function "copy_dir" [src, dst];
40743
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
   131
73322
5b15eee1a661 more Isabelle/ML/Scala operations;
wenzelm
parents: 73316
diff changeset
   132
fun copy_file src dst = scala_function "copy_file" [src, dst];
56533
cd8b6d849b6a explicit 'document_files' in session ROOT specifications;
wenzelm
parents: 56498
diff changeset
   133
73322
5b15eee1a661 more Isabelle/ML/Scala operations;
wenzelm
parents: 73316
diff changeset
   134
fun copy_file_base (base_dir, src) target_dir =
73567
355af2d1b817 clarified signature;
wenzelm
parents: 73566
diff changeset
   135
  ignore (Scala.function "copy_file_base"
355af2d1b817 clarified signature;
wenzelm
parents: 73566
diff changeset
   136
    [absolute_path base_dir, Path.implode src, absolute_path target_dir]);
56533
cd8b6d849b6a explicit 'document_files' in session ROOT specifications;
wenzelm
parents: 56498
diff changeset
   137
41307
bb8468ae414e slightly more standard Isabelle_System.with_tmp_file/with_tmp_dir (cf. Scala version);
wenzelm
parents: 40785
diff changeset
   138
56498
6437c989a744 tuned comments (see Scala version);
wenzelm
parents: 50843
diff changeset
   139
(* tmp files *)
41307
bb8468ae414e slightly more standard Isabelle_System.with_tmp_file/with_tmp_dir (cf. Scala version);
wenzelm
parents: 40785
diff changeset
   140
42127
8223e7f4b0da Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
wenzelm
parents: 41944
diff changeset
   141
fun create_tmp_path name ext =
41307
bb8468ae414e slightly more standard Isabelle_System.with_tmp_file/with_tmp_dir (cf. Scala version);
wenzelm
parents: 40785
diff changeset
   142
  let
42127
8223e7f4b0da Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
wenzelm
parents: 41944
diff changeset
   143
    val path = File.tmp_path (Path.basic (name ^ serial_string ()) |> Path.ext ext);
41307
bb8468ae414e slightly more standard Isabelle_System.with_tmp_file/with_tmp_dir (cf. Scala version);
wenzelm
parents: 40785
diff changeset
   144
    val _ = File.exists path andalso
41944
b97091ae583a Path.print is the official way to show file-system paths to users -- note that Path.implode often indicates violation of the abstract datatype;
wenzelm
parents: 41352
diff changeset
   145
      raise Fail ("Temporary file already exists: " ^ Path.print path);
41307
bb8468ae414e slightly more standard Isabelle_System.with_tmp_file/with_tmp_dir (cf. Scala version);
wenzelm
parents: 40785
diff changeset
   146
  in path end;
bb8468ae414e slightly more standard Isabelle_System.with_tmp_file/with_tmp_dir (cf. Scala version);
wenzelm
parents: 40785
diff changeset
   147
78722
3636dc23aa0e more robust management of resources, using Thread_Attributes.uninterruptible;
wenzelm
parents: 78721
diff changeset
   148
fun with_tmp_file name ext = Thread_Attributes.uninterruptible (fn run => fn f =>
3636dc23aa0e more robust management of resources, using Thread_Attributes.uninterruptible;
wenzelm
parents: 78721
diff changeset
   149
  let
3636dc23aa0e more robust management of resources, using Thread_Attributes.uninterruptible;
wenzelm
parents: 78721
diff changeset
   150
    val path = create_tmp_path name ext;
3636dc23aa0e more robust management of resources, using Thread_Attributes.uninterruptible;
wenzelm
parents: 78721
diff changeset
   151
    val result = Exn.capture (run f) path;
3636dc23aa0e more robust management of resources, using Thread_Attributes.uninterruptible;
wenzelm
parents: 78721
diff changeset
   152
    val _ = try File.rm path;
3636dc23aa0e more robust management of resources, using Thread_Attributes.uninterruptible;
wenzelm
parents: 78721
diff changeset
   153
  in Exn.release result end);
41307
bb8468ae414e slightly more standard Isabelle_System.with_tmp_file/with_tmp_dir (cf. Scala version);
wenzelm
parents: 40785
diff changeset
   154
56498
6437c989a744 tuned comments (see Scala version);
wenzelm
parents: 50843
diff changeset
   155
6437c989a744 tuned comments (see Scala version);
wenzelm
parents: 50843
diff changeset
   156
(* tmp dirs *)
6437c989a744 tuned comments (see Scala version);
wenzelm
parents: 50843
diff changeset
   157
73324
48abb09d49ea more Isabelle/ML/Scala operations;
wenzelm
parents: 73323
diff changeset
   158
fun rm_tree path = scala_function "rm_tree" [path];
48abb09d49ea more Isabelle/ML/Scala operations;
wenzelm
parents: 73323
diff changeset
   159
78721
wenzelm
parents: 78720
diff changeset
   160
fun with_tmp_dir name = Thread_Attributes.uninterruptible (fn run => fn f =>
78719
89038d9ef77d more robust management of resources, using Thread_Attributes.uninterruptible;
wenzelm
parents: 78716
diff changeset
   161
  let
89038d9ef77d more robust management of resources, using Thread_Attributes.uninterruptible;
wenzelm
parents: 78716
diff changeset
   162
    val path = create_tmp_path name "";
89038d9ef77d more robust management of resources, using Thread_Attributes.uninterruptible;
wenzelm
parents: 78716
diff changeset
   163
    val _ = make_directory path;
89038d9ef77d more robust management of resources, using Thread_Attributes.uninterruptible;
wenzelm
parents: 78716
diff changeset
   164
    val result = Exn.capture (run f) path;
89038d9ef77d more robust management of resources, using Thread_Attributes.uninterruptible;
wenzelm
parents: 78716
diff changeset
   165
    val _ = try rm_tree path;
78720
909dc00766a0 clarified signature;
wenzelm
parents: 78719
diff changeset
   166
  in Exn.release result end);
41307
bb8468ae414e slightly more standard Isabelle_System.with_tmp_file/with_tmp_dir (cf. Scala version);
wenzelm
parents: 40785
diff changeset
   167
72948
f3d0e4ea492d download as in Isabelle/Scala;
wenzelm
parents: 72511
diff changeset
   168
f3d0e4ea492d download as in Isabelle/Scala;
wenzelm
parents: 72511
diff changeset
   169
(* download file *)
f3d0e4ea492d download as in Isabelle/Scala;
wenzelm
parents: 72511
diff changeset
   170
75578
d3ba143a7ab8 prefer scalable byte strings;
wenzelm
parents: 75577
diff changeset
   171
val download = Bytes.string #> Scala.function1_bytes "download";
73566
4e6b31ed7197 clarified signature: avoid tmp file;
wenzelm
parents: 73565
diff changeset
   172
75578
d3ba143a7ab8 prefer scalable byte strings;
wenzelm
parents: 75577
diff changeset
   173
fun download_file url path = Bytes.write path (download url);
72948
f3d0e4ea492d download as in Isabelle/Scala;
wenzelm
parents: 72511
diff changeset
   174
73523
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
   175
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
   176
(* Isabelle distribution identification *)
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
   177
73565
1aa92bc4d356 clarified signature for Scala functions;
wenzelm
parents: 73547
diff changeset
   178
fun isabelle_id () = Scala.function1 "isabelle_id" "";
73523
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
   179
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
   180
fun isabelle_identifier () = try getenv_strict "ISABELLE_IDENTIFIER";
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
   181
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
   182
fun isabelle_heading () =
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
   183
  (case isabelle_identifier () of
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
   184
    NONE => ""
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
   185
  | SOME version => " (" ^ version ^ ")");
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
   186
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
   187
fun isabelle_name () = getenv_strict "ISABELLE_NAME";
2cd23d587db9 further clarification of Isabelle distribution identification -- avoid odd patching of sources;
wenzelm
parents: 73434
diff changeset
   188
74336
7bb0ac635397 permissive identification, e.g. relevant for HOL-SPARK examples running on rsync-clone;
wenzelm
parents: 74212
diff changeset
   189
fun identification () =
7bb0ac635397 permissive identification, e.g. relevant for HOL-SPARK examples running on rsync-clone;
wenzelm
parents: 74212
diff changeset
   190
  "Isabelle" ^ (case try isabelle_id () of SOME id => "/" ^ id | NONE => "") ^ isabelle_heading ();
73547
a7aabdf889b7 clarified signature;
wenzelm
parents: 73523
diff changeset
   191
40743
b07a0dbc8a38 more explicit Isabelle_System operations;
wenzelm
parents:
diff changeset
   192
end;