diff options
Diffstat (limited to 'xtask/src/install.rs')
-rw-r--r-- | xtask/src/install.rs | 91 |
1 files changed, 62 insertions, 29 deletions
diff --git a/xtask/src/install.rs b/xtask/src/install.rs index fcc4f05e4..78a8af797 100644 --- a/xtask/src/install.rs +++ b/xtask/src/install.rs | |||
@@ -3,8 +3,7 @@ | |||
3 | use std::{env, path::PathBuf, str}; | 3 | use std::{env, path::PathBuf, str}; |
4 | 4 | ||
5 | use anyhow::{bail, format_err, Context, Result}; | 5 | use anyhow::{bail, format_err, Context, Result}; |
6 | 6 | use xshell::{cmd, pushd}; | |
7 | use crate::not_bash::{pushd, run}; | ||
8 | 7 | ||
9 | // Latest stable, feel free to send a PR if this lags behind. | 8 | // Latest stable, feel free to send a PR if this lags behind. |
10 | const REQUIRED_RUST_VERSION: u32 = 47; | 9 | const REQUIRED_RUST_VERSION: u32 = 47; |
@@ -14,8 +13,43 @@ pub struct InstallCmd { | |||
14 | pub server: Option<ServerOpt>, | 13 | pub server: Option<ServerOpt>, |
15 | } | 14 | } |
16 | 15 | ||
16 | #[derive(Clone, Copy)] | ||
17 | pub enum ClientOpt { | 17 | pub enum ClientOpt { |
18 | VsCode, | 18 | VsCode, |
19 | VsCodeInsiders, | ||
20 | VsCodium, | ||
21 | VsCodeOss, | ||
22 | Any, | ||
23 | } | ||
24 | |||
25 | impl ClientOpt { | ||
26 | pub const fn as_cmds(&self) -> &'static [&'static str] { | ||
27 | match self { | ||
28 | ClientOpt::VsCode => &["code"], | ||
29 | ClientOpt::VsCodeInsiders => &["code-insiders"], | ||
30 | ClientOpt::VsCodium => &["codium"], | ||
31 | ClientOpt::VsCodeOss => &["code-oss"], | ||
32 | ClientOpt::Any => &["code", "code-insiders", "codium", "code-oss"], | ||
33 | } | ||
34 | } | ||
35 | } | ||
36 | |||
37 | impl Default for ClientOpt { | ||
38 | fn default() -> Self { | ||
39 | ClientOpt::Any | ||
40 | } | ||
41 | } | ||
42 | |||
43 | impl std::str::FromStr for ClientOpt { | ||
44 | type Err = anyhow::Error; | ||
45 | |||
46 | fn from_str(s: &str) -> Result<Self, Self::Err> { | ||
47 | [ClientOpt::VsCode, ClientOpt::VsCodeInsiders, ClientOpt::VsCodium, ClientOpt::VsCodeOss] | ||
48 | .iter() | ||
49 | .copied() | ||
50 | .find(|c| [s] == c.as_cmds()) | ||
51 | .ok_or_else(|| anyhow::format_err!("no such client")) | ||
52 | } | ||
19 | } | 53 | } |
20 | 54 | ||
21 | pub struct ServerOpt { | 55 | pub struct ServerOpt { |
@@ -75,38 +109,35 @@ fn fix_path_for_mac() -> Result<()> { | |||
75 | Ok(()) | 109 | Ok(()) |
76 | } | 110 | } |
77 | 111 | ||
78 | fn install_client(ClientOpt::VsCode: ClientOpt) -> Result<()> { | 112 | fn install_client(client_opt: ClientOpt) -> Result<()> { |
79 | let _dir = pushd("./editors/code"); | 113 | let _dir = pushd("./editors/code"); |
80 | 114 | ||
81 | let find_code = |f: fn(&str) -> bool| -> Result<&'static str> { | 115 | let find_code = |f: fn(&str) -> bool| -> Result<&'static str> { |
82 | ["code", "code-insiders", "codium", "code-oss"] | 116 | client_opt.as_cmds().iter().copied().find(|bin| f(bin)).ok_or_else(|| { |
83 | .iter() | 117 | format_err!("Can't execute `code --version`. Perhaps it is not in $PATH?") |
84 | .copied() | 118 | }) |
85 | .find(|bin| f(bin)) | ||
86 | .ok_or_else(|| { | ||
87 | format_err!("Can't execute `code --version`. Perhaps it is not in $PATH?") | ||
88 | }) | ||
89 | }; | 119 | }; |
90 | 120 | ||
91 | let installed_extensions = if cfg!(unix) { | 121 | let installed_extensions = if cfg!(unix) { |
92 | run!("npm --version").context("`npm` is required to build the VS Code plugin")?; | 122 | cmd!("npm --version").run().context("`npm` is required to build the VS Code plugin")?; |
93 | run!("npm install")?; | 123 | cmd!("npm install").run()?; |
94 | 124 | ||
95 | run!("npm run package --scripts-prepend-node-path")?; | 125 | cmd!("npm run package --scripts-prepend-node-path").run()?; |
96 | 126 | ||
97 | let code = find_code(|bin| run!("{} --version", bin).is_ok())?; | 127 | let code = find_code(|bin| cmd!("{bin} --version").read().is_ok())?; |
98 | run!("{} --install-extension rust-analyzer.vsix --force", code)?; | 128 | cmd!("{code} --install-extension rust-analyzer.vsix --force").run()?; |
99 | run!("{} --list-extensions", code; echo = false)? | 129 | cmd!("{code} --list-extensions").read()? |
100 | } else { | 130 | } else { |
101 | run!("cmd.exe /c npm --version") | 131 | cmd!("cmd.exe /c npm --version") |
132 | .run() | ||
102 | .context("`npm` is required to build the VS Code plugin")?; | 133 | .context("`npm` is required to build the VS Code plugin")?; |
103 | run!("cmd.exe /c npm install")?; | 134 | cmd!("cmd.exe /c npm install").run()?; |
104 | 135 | ||
105 | run!("cmd.exe /c npm run package")?; | 136 | cmd!("cmd.exe /c npm run package").run()?; |
106 | 137 | ||
107 | let code = find_code(|bin| run!("cmd.exe /c {}.cmd --version", bin).is_ok())?; | 138 | let code = find_code(|bin| cmd!("cmd.exe /c {bin}.cmd --version").read().is_ok())?; |
108 | run!(r"cmd.exe /c {}.cmd --install-extension rust-analyzer.vsix --force", code)?; | 139 | cmd!("cmd.exe /c {code}.cmd --install-extension rust-analyzer.vsix --force").run()?; |
109 | run!("cmd.exe /c {}.cmd --list-extensions", code; echo = false)? | 140 | cmd!("cmd.exe /c {code}.cmd --list-extensions").read()? |
110 | }; | 141 | }; |
111 | 142 | ||
112 | if !installed_extensions.contains("rust-analyzer") { | 143 | if !installed_extensions.contains("rust-analyzer") { |
@@ -122,7 +153,7 @@ fn install_client(ClientOpt::VsCode: ClientOpt) -> Result<()> { | |||
122 | 153 | ||
123 | fn install_server(opts: ServerOpt) -> Result<()> { | 154 | fn install_server(opts: ServerOpt) -> Result<()> { |
124 | let mut old_rust = false; | 155 | let mut old_rust = false; |
125 | if let Ok(stdout) = run!("cargo --version") { | 156 | if let Ok(stdout) = cmd!("cargo --version").read() { |
126 | if !check_version(&stdout, REQUIRED_RUST_VERSION) { | 157 | if !check_version(&stdout, REQUIRED_RUST_VERSION) { |
127 | old_rust = true; | 158 | old_rust = true; |
128 | } | 159 | } |
@@ -134,12 +165,13 @@ fn install_server(opts: ServerOpt) -> Result<()> { | |||
134 | REQUIRED_RUST_VERSION, | 165 | REQUIRED_RUST_VERSION, |
135 | ) | 166 | ) |
136 | } | 167 | } |
137 | 168 | let features = match opts.malloc { | |
138 | let malloc_feature = match opts.malloc { | 169 | Malloc::System => &[][..], |
139 | Malloc::System => "", | 170 | Malloc::Mimalloc => &["--features", "mimalloc"], |
140 | Malloc::Mimalloc => "--features mimalloc", | ||
141 | }; | 171 | }; |
142 | let res = run!("cargo install --path crates/rust-analyzer --locked --force {}", malloc_feature); | 172 | |
173 | let cmd = cmd!("cargo install --path crates/rust-analyzer --locked --force {features...}"); | ||
174 | let res = cmd.run(); | ||
143 | 175 | ||
144 | if res.is_err() && old_rust { | 176 | if res.is_err() && old_rust { |
145 | eprintln!( | 177 | eprintln!( |
@@ -148,7 +180,8 @@ fn install_server(opts: ServerOpt) -> Result<()> { | |||
148 | ); | 180 | ); |
149 | } | 181 | } |
150 | 182 | ||
151 | res.map(drop) | 183 | res?; |
184 | Ok(()) | ||
152 | } | 185 | } |
153 | 186 | ||
154 | fn check_version(version_output: &str, min_minor_version: u32) -> bool { | 187 | fn check_version(version_output: &str, min_minor_version: u32) -> bool { |