src/Tools/VSCode/src/vscode_setup.scala
author wenzelm
Wed, 09 Mar 2022 16:21:14 +0100
changeset 75252 41dfe941c3da
parent 75224 419781ac89bf
child 75257 d1e5f9dbf885
permissions -rw-r--r--
inline Isabelle symbols into source text, so that "isabelle vscode" can start up properly without access to process.env or fs;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/VSCode/src/vscode_setup.scala
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     3
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     4
Setup VSCode from VSCodium distribution.
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     5
*/
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     6
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     7
package isabelle.vscode
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     8
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     9
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    10
import isabelle._
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    11
75155
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    12
import java.security.MessageDigest
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    13
import java.util.Base64
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    14
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    15
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    16
object VSCode_Setup
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    17
{
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    18
  /* global resources */
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    19
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    20
  def vscode_home: Path = Path.variable("ISABELLE_VSCODE_HOME")
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    21
  def vscode_settings: Path = Path.variable("ISABELLE_VSCODE_SETTINGS")
75157
d67ec542b5b5 clarified default settings;
wenzelm
parents: 75156
diff changeset
    22
  def vscode_settings_user: Path = vscode_settings + Path.explode("user-data/User/settings.json")
75224
419781ac89bf misc tuning and clarification;
wenzelm
parents: 75223
diff changeset
    23
  def version: String = Build_VSCodium.version
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    24
75214
a51a0a704854 build component for VSCodium (cross-compiled from sources for all platforms);
wenzelm
parents: 75209
diff changeset
    25
  def vscodium_home: Path = Path.variable("ISABELLE_VSCODIUM_HOME")
75215
1129e82dc1ec more robust;
wenzelm
parents: 75214
diff changeset
    26
  def vscodium_home_ok(): Boolean =
1129e82dc1ec more robust;
wenzelm
parents: 75214
diff changeset
    27
    try { vscodium_home.is_dir }
1129e82dc1ec more robust;
wenzelm
parents: 75214
diff changeset
    28
    catch { case ERROR(_) => false }
75214
a51a0a704854 build component for VSCodium (cross-compiled from sources for all platforms);
wenzelm
parents: 75209
diff changeset
    29
75224
419781ac89bf misc tuning and clarification;
wenzelm
parents: 75223
diff changeset
    30
  def vscode_installation(info: Build_VSCodium.Platform_Info): (Boolean, Path) =
75156
09da7b15162b tuned whitespace;
wenzelm
parents: 75155
diff changeset
    31
  {
09da7b15162b tuned whitespace;
wenzelm
parents: 75155
diff changeset
    32
    val install_dir =
75224
419781ac89bf misc tuning and clarification;
wenzelm
parents: 75223
diff changeset
    33
      info.platform_dir(vscode_settings + Path.basic("installation") + Path.basic(version))
419781ac89bf misc tuning and clarification;
wenzelm
parents: 75223
diff changeset
    34
    val install_ok = Build_VSCodium.vscodium_exe(install_dir).is_file
75156
09da7b15162b tuned whitespace;
wenzelm
parents: 75155
diff changeset
    35
    (install_ok, install_dir)
09da7b15162b tuned whitespace;
wenzelm
parents: 75155
diff changeset
    36
  }
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    37
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    38
75155
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    39
  /* patch resources */
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    40
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    41
  // see https://github.com/microsoft/vscode/blob/main/build/gulpfile.vscode.js
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    42
  // function computeChecksum(filename)
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    43
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    44
  def file_checksum(path: Path): String =
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    45
  {
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    46
    val digest = MessageDigest.getInstance("MD5")
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    47
    digest.update(Bytes.read(path).array)
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    48
    Bytes(Base64.getEncoder.encode(digest.digest()))
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    49
      .text.replaceAll("=", "")
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    50
  }
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    51
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    52
  def patch_resources(dir: Path): Unit =
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    53
  {
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    54
    HTML.init_fonts(dir + Path.explode("app/out/vs/base/browser/ui"))
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    55
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    56
    val workbench_css = dir + Path.explode("app/out/vs/workbench/workbench.desktop.main.css")
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    57
    val checksum1 = file_checksum(workbench_css)
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    58
    File.append(workbench_css, "\n\n" + HTML.fonts_css_dir(prefix = "../base/browser/ui"))
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    59
    val checksum2 = file_checksum(workbench_css)
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    60
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    61
    val file_name = workbench_css.file_name
75205
wenzelm
parents: 75202
diff changeset
    62
    File.change_lines(dir + Path.explode("app/product.json")) { _.map(line =>
wenzelm
parents: 75202
diff changeset
    63
      if (line.containsSlice(file_name) && line.contains(checksum1)) {
wenzelm
parents: 75202
diff changeset
    64
        line.replace(checksum1, checksum2)
wenzelm
parents: 75202
diff changeset
    65
      }
wenzelm
parents: 75202
diff changeset
    66
      else line)
75202
4fdde010086f clarified signature;
wenzelm
parents: 75178
diff changeset
    67
    }
75155
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    68
  }
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    69
0b6c43a87fa6 support Isabelle fonts via patch of vscode resources;
wenzelm
parents: 75100
diff changeset
    70
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    71
  /* vscode setup */
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    72
75088
32ebb38154e7 clarified options;
wenzelm
parents: 75083
diff changeset
    73
  def default_platform: Platform.Family.Value = Platform.family
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    74
75166
wenzelm
parents: 75165
diff changeset
    75
  private val init_settings = """  {
wenzelm
parents: 75165
diff changeset
    76
    "editor.fontFamily": "'Isabelle DejaVu Sans Mono'",
wenzelm
parents: 75165
diff changeset
    77
    "editor.fontSize": 18,
wenzelm
parents: 75165
diff changeset
    78
    "editor.lineNumbers": "off",
wenzelm
parents: 75165
diff changeset
    79
    "editor.renderIndentGuides": false,
wenzelm
parents: 75165
diff changeset
    80
    "editor.rulers": [80, 100],
75171
96b26b0d2cc5 clarified rendering;
wenzelm
parents: 75167
diff changeset
    81
    "editor.unicodeHighlight.ambiguousCharacters": false,
75166
wenzelm
parents: 75165
diff changeset
    82
    "extensions.autoCheckUpdates": false,
75167
wenzelm
parents: 75166
diff changeset
    83
    "extensions.autoUpdate": false,
75178
01017b938135 proper monospace font for terminal;
wenzelm
parents: 75171
diff changeset
    84
    "terminal.integrated.fontFamily": "monospace",
75167
wenzelm
parents: 75166
diff changeset
    85
    "update.mode": "none"
75166
wenzelm
parents: 75165
diff changeset
    86
  }
wenzelm
parents: 75165
diff changeset
    87
"""
wenzelm
parents: 75165
diff changeset
    88
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    89
  def vscode_setup(
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    90
    check: Boolean = false,
75088
32ebb38154e7 clarified options;
wenzelm
parents: 75083
diff changeset
    91
    platform: Platform.Family.Value = default_platform,
75099
b5a9315578f8 clarified options;
wenzelm
parents: 75092
diff changeset
    92
    quiet: Boolean = false,
75100
6eff5c260381 clarified options;
wenzelm
parents: 75099
diff changeset
    93
    fresh: Boolean = false,
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    94
    progress: Progress = new Progress): Unit =
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    95
  {
75224
419781ac89bf misc tuning and clarification;
wenzelm
parents: 75223
diff changeset
    96
    val platform_info = Build_VSCodium.the_platform_info(platform)
419781ac89bf misc tuning and clarification;
wenzelm
parents: 75223
diff changeset
    97
    val (install_ok, install_dir) = vscode_installation(platform_info)
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    98
75163
c440b77c79c0 tuned message;
wenzelm
parents: 75162
diff changeset
    99
    if (!vscode_settings_user.is_file) {
c440b77c79c0 tuned message;
wenzelm
parents: 75162
diff changeset
   100
      Isabelle_System.make_directory(vscode_settings_user.dir)
c440b77c79c0 tuned message;
wenzelm
parents: 75162
diff changeset
   101
      File.write(vscode_settings_user, init_settings)
c440b77c79c0 tuned message;
wenzelm
parents: 75162
diff changeset
   102
    }
75157
d67ec542b5b5 clarified default settings;
wenzelm
parents: 75156
diff changeset
   103
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   104
    if (check) {
75215
1129e82dc1ec more robust;
wenzelm
parents: 75214
diff changeset
   105
      if (vscodium_home_ok()) {
75214
a51a0a704854 build component for VSCodium (cross-compiled from sources for all platforms);
wenzelm
parents: 75209
diff changeset
   106
        progress.echo(vscodium_home.expand.implode)
a51a0a704854 build component for VSCodium (cross-compiled from sources for all platforms);
wenzelm
parents: 75209
diff changeset
   107
      }
a51a0a704854 build component for VSCodium (cross-compiled from sources for all platforms);
wenzelm
parents: 75209
diff changeset
   108
      else if (install_ok) {
75209
4187f6f18232 provide symbols statically via ISABELLE_VSCODE_WORKSPACE, instead of LSP/PIDE protocol;
wenzelm
parents: 75205
diff changeset
   109
        progress.echo(install_dir.expand.implode)
4187f6f18232 provide symbols statically via ISABELLE_VSCODE_WORKSPACE, instead of LSP/PIDE protocol;
wenzelm
parents: 75205
diff changeset
   110
      }
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   111
      else {
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   112
        error("Bad Isabelle/VSCode installation: " + install_dir.expand +
75092
cdc2838f7536 tuned message;
wenzelm
parents: 75089
diff changeset
   113
          "\n(use \"isabelle vscode_setup\" for download and installation)")
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   114
      }
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   115
    }
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   116
    else {
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   117
      if (install_ok) {
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   118
        progress.echo_warning("Isabelle/VSCode installation already present: " + install_dir.expand)
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   119
      }
75100
6eff5c260381 clarified options;
wenzelm
parents: 75099
diff changeset
   120
      if (!install_ok || fresh) {
6eff5c260381 clarified options;
wenzelm
parents: 75099
diff changeset
   121
        Isabelle_System.make_directory(install_dir)
75224
419781ac89bf misc tuning and clarification;
wenzelm
parents: 75223
diff changeset
   122
        platform_info.download(install_dir, progress = if (quiet) new Progress else progress)
419781ac89bf misc tuning and clarification;
wenzelm
parents: 75223
diff changeset
   123
        platform_info.patch_resources(install_dir)
419781ac89bf misc tuning and clarification;
wenzelm
parents: 75223
diff changeset
   124
        platform_info.setup_executables(install_dir)
75100
6eff5c260381 clarified options;
wenzelm
parents: 75099
diff changeset
   125
      }
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   126
    }
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   127
  }
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   128
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   129
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   130
  /* Isabelle tool wrapper */
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   131
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   132
  val isabelle_tool =
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   133
    Isabelle_Tool("vscode_setup", "setup VSCode from VSCodium distribution",
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   134
      Scala_Project.here, args =>
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   135
    {
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   136
      var check = false
75100
6eff5c260381 clarified options;
wenzelm
parents: 75099
diff changeset
   137
      var fresh = false
75088
32ebb38154e7 clarified options;
wenzelm
parents: 75083
diff changeset
   138
      var platforms = List(default_platform)
75099
b5a9315578f8 clarified options;
wenzelm
parents: 75092
diff changeset
   139
      var quiet = false
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   140
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   141
      val getopts = Getopts("""
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   142
Usage: vscode_setup [OPTIONS]
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   143
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   144
  Options are:
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   145
    -C           check and print installation directory
75100
6eff5c260381 clarified options;
wenzelm
parents: 75099
diff changeset
   146
    -f           force fresh installation
75088
32ebb38154e7 clarified options;
wenzelm
parents: 75083
diff changeset
   147
    -p NAMES     platform families: comma-separated names
32ebb38154e7 clarified options;
wenzelm
parents: 75083
diff changeset
   148
                 (""" + commas_quote(Platform.Family.list.map(_.toString)) + """, default: """ +
32ebb38154e7 clarified options;
wenzelm
parents: 75083
diff changeset
   149
        quote(default_platform.toString) + """)
75099
b5a9315578f8 clarified options;
wenzelm
parents: 75092
diff changeset
   150
    -q           quiet mode
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   151
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   152
  Maintain local installation of VSCode, see also https://vscodium.com
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   153
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   154
  Option -C checks the existing installation (without download), and
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   155
  prints its directory location.
75163
c440b77c79c0 tuned message;
wenzelm
parents: 75162
diff changeset
   156
c440b77c79c0 tuned message;
wenzelm
parents: 75162
diff changeset
   157
  The following initial settings are provided for a fresh installation:
75165
19454aac373c tuned message;
wenzelm
parents: 75164
diff changeset
   158
""" + init_settings,
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   159
        "C" -> (_ => check = true),
75100
6eff5c260381 clarified options;
wenzelm
parents: 75099
diff changeset
   160
        "f" -> (_ => fresh = true),
75088
32ebb38154e7 clarified options;
wenzelm
parents: 75083
diff changeset
   161
        "p:" -> (arg => platforms = Library.space_explode(',', arg).map(Platform.Family.parse)),
75099
b5a9315578f8 clarified options;
wenzelm
parents: 75092
diff changeset
   162
        "q" -> (_ => quiet = true))
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   163
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   164
      val more_args = getopts(args)
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   165
      if (more_args.nonEmpty) getopts.usage()
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   166
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   167
      val progress = new Console_Progress()
75088
32ebb38154e7 clarified options;
wenzelm
parents: 75083
diff changeset
   168
      for (platform <- platforms) {
75224
419781ac89bf misc tuning and clarification;
wenzelm
parents: 75223
diff changeset
   169
        vscode_setup(check = check, platform = platform, quiet = quiet, fresh = fresh, progress = progress)
75088
32ebb38154e7 clarified options;
wenzelm
parents: 75083
diff changeset
   170
      }
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   171
    })
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
   172
}