aboutsummaryrefslogtreecommitdiff
path: root/xtask/src/install.rs
diff options
context:
space:
mode:
Diffstat (limited to 'xtask/src/install.rs')
-rw-r--r--xtask/src/install.rs91
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 @@
3use std::{env, path::PathBuf, str}; 3use std::{env, path::PathBuf, str};
4 4
5use anyhow::{bail, format_err, Context, Result}; 5use anyhow::{bail, format_err, Context, Result};
6 6use xshell::{cmd, pushd};
7use 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.
10const REQUIRED_RUST_VERSION: u32 = 47; 9const 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)]
17pub enum ClientOpt { 17pub enum ClientOpt {
18 VsCode, 18 VsCode,
19 VsCodeInsiders,
20 VsCodium,
21 VsCodeOss,
22 Any,
23}
24
25impl 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
37impl Default for ClientOpt {
38 fn default() -> Self {
39 ClientOpt::Any
40 }
41}
42
43impl 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
21pub struct ServerOpt { 55pub struct ServerOpt {
@@ -75,38 +109,35 @@ fn fix_path_for_mac() -> Result<()> {
75 Ok(()) 109 Ok(())
76} 110}
77 111
78fn install_client(ClientOpt::VsCode: ClientOpt) -> Result<()> { 112fn 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
123fn install_server(opts: ServerOpt) -> Result<()> { 154fn 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
154fn check_version(version_output: &str, min_minor_version: u32) -> bool { 187fn check_version(version_output: &str, min_minor_version: u32) -> bool {