src/Pure/Tools/server_commands.scala
author wenzelm
Wed, 14 Mar 2018 17:43:30 +0100
changeset 67858 cba5c5657378
parent 67853 74e2a4b62826
child 67861 cd1cac824ef8
permissions -rw-r--r--
more informative JSON results;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
67848
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Tools/server_commands.scala
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
     3
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
     4
Miscellaneous Isabelle server commands.
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
     5
*/
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
     6
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
     7
package isabelle
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
     8
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
     9
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    10
object Server_Commands
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    11
{
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    12
  object Session_Build
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    13
  {
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    14
    sealed case class Args(
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    15
      session: String,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    16
      prefs: String = "",
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    17
      opts: List[String] = Nil,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    18
      dirs: List[String] = Nil,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    19
      ancestor_session: String = "",
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    20
      all_known: Boolean = false,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    21
      focus_session: Boolean = false,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    22
      required_session: Boolean = false,
67853
74e2a4b62826 more options;
wenzelm
parents: 67852
diff changeset
    23
      system_mode: Boolean = false,
74e2a4b62826 more options;
wenzelm
parents: 67852
diff changeset
    24
      verbose: Boolean = false)
67848
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    25
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    26
    def unapply(json: JSON.T): Option[Args] =
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    27
      for {
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    28
        session <- JSON.string(json, "session")
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    29
        prefs <- JSON.string_default(json, "preferences")
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    30
        opts <- JSON.list_default(json, "options", JSON.Value.String.unapply _)
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    31
        dirs <- JSON.list_default(json, "dirs", JSON.Value.String.unapply _)
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    32
        ancestor_session <- JSON.string_default(json, "ancestor_session")
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    33
        all_known <- JSON.bool_default(json, "all_known")
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    34
        focus_session <- JSON.bool_default(json, "focus_session")
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    35
        required_session <- JSON.bool_default(json, "required_session")
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    36
        system_mode <- JSON.bool_default(json, "system_mode")
67853
74e2a4b62826 more options;
wenzelm
parents: 67852
diff changeset
    37
        verbose <- JSON.bool_default(json, "verbose")
67848
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    38
      }
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    39
      yield {
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    40
        Args(session, prefs = prefs, opts = opts, dirs = dirs, ancestor_session = ancestor_session,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    41
          all_known = all_known, focus_session = focus_session, required_session = required_session,
67853
74e2a4b62826 more options;
wenzelm
parents: 67852
diff changeset
    42
          system_mode = system_mode, verbose = verbose)
67848
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    43
      }
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    44
67858
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    45
    def command(progress: Progress, args: Args): (JSON.T, Build.Results, Sessions.Base_Info) =
67848
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    46
    {
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    47
      val options = Options.init(prefs = args.prefs, opts = args.opts)
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    48
      val dirs = args.dirs.map(Path.explode(_))
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    49
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    50
      val base_info =
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    51
        Sessions.base_info(options,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    52
          args.session,
67852
f701a1d5d852 allow cancellation of Sessions.deps/base_info via progress.stopped (progress.echo only happens for options like "verbose");
wenzelm
parents: 67850
diff changeset
    53
          progress = progress,
67848
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    54
          dirs = dirs,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    55
          ancestor_session = proper_string(args.ancestor_session),
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    56
          all_known = args.all_known,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    57
          focus_session = args.focus_session,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    58
          required_session = args.required_session)
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    59
      val base = base_info.check_base
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    60
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    61
      val results =
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    62
        Build.build(options,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    63
          progress = progress,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    64
          build_heap = true,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    65
          system_mode = args.system_mode,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    66
          dirs = dirs,
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    67
          infos = base_info.infos,
67853
74e2a4b62826 more options;
wenzelm
parents: 67852
diff changeset
    68
          verbose = args.verbose,
67848
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    69
          sessions = List(args.session))
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    70
67858
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    71
      val sessions_order =
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    72
        base_info.sessions_structure.imports_topological_order.zipWithIndex.
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    73
          toMap.withDefaultValue(-1)
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    74
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    75
      val results_json =
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    76
        JSON.Object(
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    77
          "return_code" -> results.rc,
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    78
          "sessions" ->
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    79
            results.sessions.toList.sortBy(sessions_order).map(session =>
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    80
              JSON.Object(
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    81
                "session" -> session,
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    82
                "return_code" -> results(session).rc,
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    83
                "timeout" -> results(session).timeout,
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    84
                "timing" -> results(session).timing.json)))
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    85
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    86
      if (results.ok) (results_json, results, base_info)
cba5c5657378 more informative JSON results;
wenzelm
parents: 67853
diff changeset
    87
      else throw new Server.Error("Session build failed: return code " + results.rc, results_json)
67848
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    88
    }
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    89
  }
dd83610333de added server command "session_build": similar to JEdit_Resources.session_build;
wenzelm
parents:
diff changeset
    90
}