src/Pure/System/process_result.scala
author wenzelm
Sat, 07 Nov 2020 16:36:50 +0100
changeset 72556 7abd365058e9
parent 72337 4075560b3d5c
child 72726 ec6a27bbdab8
permissions -rw-r--r--
unused;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62400
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/System/process_result.scala
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
     3
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
     4
Result of system process.
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
     5
*/
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
     6
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
     7
package isabelle
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
     8
71747
1dd514c8c1df clarified signature;
wenzelm
parents: 71646
diff changeset
     9
object Process_Result
1dd514c8c1df clarified signature;
wenzelm
parents: 71646
diff changeset
    10
{
71749
77232ff6b8f6 tuned message;
wenzelm
parents: 71748
diff changeset
    11
  def print_return_code(rc: Int): String = "Return code: " + rc + rc_text(rc)
77232ff6b8f6 tuned message;
wenzelm
parents: 71748
diff changeset
    12
  def print_rc(rc: Int): String = "return code " + rc + rc_text(rc)
77232ff6b8f6 tuned message;
wenzelm
parents: 71748
diff changeset
    13
77232ff6b8f6 tuned message;
wenzelm
parents: 71748
diff changeset
    14
  def rc_text(rc: Int): String =
77232ff6b8f6 tuned message;
wenzelm
parents: 71748
diff changeset
    15
    return_code_text.get(rc) match {
77232ff6b8f6 tuned message;
wenzelm
parents: 71748
diff changeset
    16
      case None => ""
77232ff6b8f6 tuned message;
wenzelm
parents: 71748
diff changeset
    17
      case Some(text) => " (" + text + ")"
77232ff6b8f6 tuned message;
wenzelm
parents: 71748
diff changeset
    18
    }
77232ff6b8f6 tuned message;
wenzelm
parents: 71748
diff changeset
    19
  private val return_code_text =
71748
34de8369c290 tuned message;
wenzelm
parents: 71747
diff changeset
    20
    Map(0 -> "OK",
34de8369c290 tuned message;
wenzelm
parents: 71747
diff changeset
    21
      1 -> "ERROR",
34de8369c290 tuned message;
wenzelm
parents: 71747
diff changeset
    22
      2 -> "FAILURE",
72337
4075560b3d5c clarified message;
wenzelm
parents: 72002
diff changeset
    23
      127 -> "COMMAND NOT FOUND",
71748
34de8369c290 tuned message;
wenzelm
parents: 71747
diff changeset
    24
      130 -> "INTERRUPT",
34de8369c290 tuned message;
wenzelm
parents: 71747
diff changeset
    25
      131 -> "QUIT SIGNAL",
34de8369c290 tuned message;
wenzelm
parents: 71747
diff changeset
    26
      137 -> "KILL SIGNAL",
34de8369c290 tuned message;
wenzelm
parents: 71747
diff changeset
    27
      138 -> "BUS ERROR",
34de8369c290 tuned message;
wenzelm
parents: 71747
diff changeset
    28
      139 -> "SEGMENTATION VIOLATION",
34de8369c290 tuned message;
wenzelm
parents: 71747
diff changeset
    29
      143 -> "TERMINATION SIGNAL")
71747
1dd514c8c1df clarified signature;
wenzelm
parents: 71646
diff changeset
    30
}
1dd514c8c1df clarified signature;
wenzelm
parents: 71646
diff changeset
    31
62401
15a2533f1f0a more informative Process_Result;
wenzelm
parents: 62400
diff changeset
    32
final case class Process_Result(
62402
bff56eae3ec5 more informative Build.build_results;
wenzelm
parents: 62401
diff changeset
    33
  rc: Int,
bff56eae3ec5 more informative Build.build_results;
wenzelm
parents: 62401
diff changeset
    34
  out_lines: List[String] = Nil,
bff56eae3ec5 more informative Build.build_results;
wenzelm
parents: 62401
diff changeset
    35
  err_lines: List[String] = Nil,
62569
5db10482f4cf bash process with builtin timing;
wenzelm
parents: 62553
diff changeset
    36
  timeout: Boolean = false,
5db10482f4cf bash process with builtin timing;
wenzelm
parents: 62553
diff changeset
    37
  timing: Timing = Timing.zero)
62400
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
    38
{
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
    39
  def out: String = cat_lines(out_lines)
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
    40
  def err: String = cat_lines(err_lines)
71631
3f02bc5a5a03 more accurate treatment of errors;
wenzelm
parents: 68927
diff changeset
    41
71646
86f064893dac clarified signature: more robust;
wenzelm
parents: 71631
diff changeset
    42
  def output(outs: List[String]): Process_Result =
86f064893dac clarified signature: more robust;
wenzelm
parents: 71631
diff changeset
    43
    copy(out_lines = out_lines ::: outs.flatMap(split_lines))
86f064893dac clarified signature: more robust;
wenzelm
parents: 71631
diff changeset
    44
  def errors(errs: List[String]): Process_Result =
86f064893dac clarified signature: more robust;
wenzelm
parents: 71631
diff changeset
    45
    copy(err_lines = err_lines ::: errs.flatMap(split_lines))
72002
5c4800f6b25a more robust protocol for "Timing ..." messages, notably for pide_session=true;
wenzelm
parents: 71749
diff changeset
    46
  def error(err: String): Process_Result =
5c4800f6b25a more robust protocol for "Timing ..." messages, notably for pide_session=true;
wenzelm
parents: 71749
diff changeset
    47
    if (err.isEmpty) this else errors(List(err))
62400
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
    48
62569
5db10482f4cf bash process with builtin timing;
wenzelm
parents: 62553
diff changeset
    49
  def was_timeout: Process_Result = copy(rc = 1, timeout = true)
62401
15a2533f1f0a more informative Process_Result;
wenzelm
parents: 62400
diff changeset
    50
62400
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
    51
  def ok: Boolean = rc == 0
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
    52
  def interrupted: Boolean = rc == Exn.Interrupt.return_code
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
    53
68927
01f46a4b22b4 tuned signature;
wenzelm
parents: 68091
diff changeset
    54
  def error_rc: Process_Result = if (interrupted) this else copy(rc = rc max 1)
01f46a4b22b4 tuned signature;
wenzelm
parents: 68091
diff changeset
    55
64408
50bcf976f276 clarified hg push return code: 1 means "nothing to push";
wenzelm
parents: 64138
diff changeset
    56
  def check_rc(pred: Int => Boolean): Process_Result =
50bcf976f276 clarified hg push return code: 1 means "nothing to push";
wenzelm
parents: 64138
diff changeset
    57
    if (pred(rc)) this
62400
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
    58
    else if (interrupted) throw Exn.Interrupt()
62492
0e53fade87fe clarified modules;
wenzelm
parents: 62405
diff changeset
    59
    else Exn.error(err)
62400
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
    60
64408
50bcf976f276 clarified hg push return code: 1 means "nothing to push";
wenzelm
parents: 64138
diff changeset
    61
  def check: Process_Result = check_rc(_ == 0)
50bcf976f276 clarified hg push return code: 1 means "nothing to push";
wenzelm
parents: 64138
diff changeset
    62
71747
1dd514c8c1df clarified signature;
wenzelm
parents: 71646
diff changeset
    63
  def print_return_code: String = Process_Result.print_return_code(rc)
1dd514c8c1df clarified signature;
wenzelm
parents: 71646
diff changeset
    64
  def print_rc: String = Process_Result.print_rc(rc)
1dd514c8c1df clarified signature;
wenzelm
parents: 71646
diff changeset
    65
62400
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
    66
  def print: Process_Result =
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
    67
  {
64138
cf0c8c5782af eliminated extra trim_line: Process_Result.out/err are based on cat_lines, without trailing newline;
wenzelm
parents: 64024
diff changeset
    68
    Output.warning(err)
cf0c8c5782af eliminated extra trim_line: Process_Result.out/err are based on cat_lines, without trailing newline;
wenzelm
parents: 64024
diff changeset
    69
    Output.writeln(out)
62404
13a0f537e232 retain tail out_lines as printed, but not the whole log content;
wenzelm
parents: 62402
diff changeset
    70
    copy(out_lines = Nil, err_lines = Nil)
62400
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
    71
  }
62553
d2e0d626fb96 tuned signature;
wenzelm
parents: 62492
diff changeset
    72
d2e0d626fb96 tuned signature;
wenzelm
parents: 62492
diff changeset
    73
  def print_stdout: Process_Result =
d2e0d626fb96 tuned signature;
wenzelm
parents: 62492
diff changeset
    74
  {
64138
cf0c8c5782af eliminated extra trim_line: Process_Result.out/err are based on cat_lines, without trailing newline;
wenzelm
parents: 64024
diff changeset
    75
    Output.warning(err, stdout = true)
cf0c8c5782af eliminated extra trim_line: Process_Result.out/err are based on cat_lines, without trailing newline;
wenzelm
parents: 64024
diff changeset
    76
    Output.writeln(out, stdout = true)
62553
d2e0d626fb96 tuned signature;
wenzelm
parents: 62492
diff changeset
    77
    copy(out_lines = Nil, err_lines = Nil)
d2e0d626fb96 tuned signature;
wenzelm
parents: 62492
diff changeset
    78
  }
62400
833af0d6d469 clarified modules;
wenzelm
parents:
diff changeset
    79
}