diff options
author | Aleksey Kladov <[email protected]> | 2019-07-27 12:35:18 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-07-27 12:35:18 +0100 |
commit | ecb1327fed1ece4083aa09255dbd927c5df304ef (patch) | |
tree | c6a49bf13df5cd5529f9145391c7922ef17eb3a7 /crates/ra_tools | |
parent | d23a7558702bcffd9c551bea444475f4a76ba201 (diff) |
Overhaul installation process
The new commands are
$ cargo install-ra --client-code
$ cargo install-ra --server --jemalloc
Diffstat (limited to 'crates/ra_tools')
-rw-r--r-- | crates/ra_tools/src/lib.rs | 23 | ||||
-rw-r--r-- | crates/ra_tools/src/main.rs | 135 |
2 files changed, 114 insertions, 44 deletions
diff --git a/crates/ra_tools/src/lib.rs b/crates/ra_tools/src/lib.rs index 79fbcd11d..bb7845f7d 100644 --- a/crates/ra_tools/src/lib.rs +++ b/crates/ra_tools/src/lib.rs | |||
@@ -79,6 +79,29 @@ pub fn project_root() -> PathBuf { | |||
79 | Path::new(&env!("CARGO_MANIFEST_DIR")).ancestors().nth(2).unwrap().to_path_buf() | 79 | Path::new(&env!("CARGO_MANIFEST_DIR")).ancestors().nth(2).unwrap().to_path_buf() |
80 | } | 80 | } |
81 | 81 | ||
82 | pub struct Cmd { | ||
83 | pub unix: &'static str, | ||
84 | pub windows: &'static str, | ||
85 | pub work_dir: &'static str, | ||
86 | } | ||
87 | |||
88 | impl Cmd { | ||
89 | pub fn run(self) -> Result<()> { | ||
90 | if cfg!(windows) { | ||
91 | run(self.windows, self.work_dir) | ||
92 | } else { | ||
93 | run(self.unix, self.work_dir) | ||
94 | } | ||
95 | } | ||
96 | pub fn run_with_output(self) -> Result<Output> { | ||
97 | if cfg!(windows) { | ||
98 | run_with_output(self.windows, self.work_dir) | ||
99 | } else { | ||
100 | run_with_output(self.unix, self.work_dir) | ||
101 | } | ||
102 | } | ||
103 | } | ||
104 | |||
82 | pub fn run(cmdline: &str, dir: &str) -> Result<()> { | 105 | pub fn run(cmdline: &str, dir: &str) -> Result<()> { |
83 | do_run(cmdline, dir, |c| { | 106 | do_run(cmdline, dir, |c| { |
84 | c.stdout(Stdio::inherit()); | 107 | c.stdout(Stdio::inherit()); |
diff --git a/crates/ra_tools/src/main.rs b/crates/ra_tools/src/main.rs index 7ed592f71..59d4ea6d3 100644 --- a/crates/ra_tools/src/main.rs +++ b/crates/ra_tools/src/main.rs | |||
@@ -1,70 +1,73 @@ | |||
1 | use clap::{App, SubCommand}; | 1 | use clap::{App, Arg, SubCommand}; |
2 | use core::str; | 2 | use core::str; |
3 | use ra_tools::{ | 3 | use ra_tools::{ |
4 | gen_tests, generate, install_format_hook, run, run_clippy, run_fuzzer, run_rustfmt, | 4 | gen_tests, generate, install_format_hook, run, run_clippy, run_fuzzer, run_rustfmt, Cmd, |
5 | run_with_output, Overwrite, Result, | 5 | Overwrite, Result, |
6 | }; | 6 | }; |
7 | use std::{env, path::PathBuf}; | 7 | use std::{env, path::PathBuf}; |
8 | 8 | ||
9 | struct InstallOpt { | ||
10 | client: Option<ClientOpt>, | ||
11 | server: Option<ServerOpt>, | ||
12 | } | ||
13 | |||
14 | enum ClientOpt { | ||
15 | VsCode, | ||
16 | } | ||
17 | |||
18 | struct ServerOpt { | ||
19 | jemalloc: bool, | ||
20 | } | ||
21 | |||
9 | fn main() -> Result<()> { | 22 | fn main() -> Result<()> { |
10 | let matches = App::new("tasks") | 23 | let matches = App::new("tasks") |
11 | .setting(clap::AppSettings::SubcommandRequiredElseHelp) | 24 | .setting(clap::AppSettings::SubcommandRequiredElseHelp) |
12 | .subcommand(SubCommand::with_name("gen-syntax")) | 25 | .subcommand(SubCommand::with_name("gen-syntax")) |
13 | .subcommand(SubCommand::with_name("gen-tests")) | 26 | .subcommand(SubCommand::with_name("gen-tests")) |
14 | .subcommand(SubCommand::with_name("install-code")) | 27 | .subcommand( |
28 | SubCommand::with_name("install-ra") | ||
29 | .arg(Arg::with_name("server").long("--server")) | ||
30 | .arg(Arg::with_name("jemalloc").long("jemalloc").requires("server")) | ||
31 | .arg(Arg::with_name("client-code").long("client-code").conflicts_with("server")), | ||
32 | ) | ||
33 | .alias("install-code") | ||
15 | .subcommand(SubCommand::with_name("format")) | 34 | .subcommand(SubCommand::with_name("format")) |
16 | .subcommand(SubCommand::with_name("format-hook")) | 35 | .subcommand(SubCommand::with_name("format-hook")) |
17 | .subcommand(SubCommand::with_name("fuzz-tests")) | 36 | .subcommand(SubCommand::with_name("fuzz-tests")) |
18 | .subcommand(SubCommand::with_name("lint")) | 37 | .subcommand(SubCommand::with_name("lint")) |
19 | .get_matches(); | 38 | .get_matches(); |
20 | match matches.subcommand_name().expect("Subcommand must be specified") { | 39 | match matches.subcommand() { |
21 | "install-code" => { | 40 | ("install-ra", Some(matches)) => { |
22 | if cfg!(target_os = "macos") { | 41 | let opts = InstallOpt { |
23 | fix_path_for_mac()?; | 42 | client: if matches.is_present("server") { None } else { Some(ClientOpt::VsCode) }, |
24 | } | 43 | server: if matches.is_present("client-code") { |
25 | install_code_extension()?; | 44 | None |
45 | } else { | ||
46 | Some(ServerOpt { jemalloc: matches.is_present("jemalloc") }) | ||
47 | }, | ||
48 | }; | ||
49 | install(opts)? | ||
26 | } | 50 | } |
27 | "gen-tests" => gen_tests(Overwrite)?, | 51 | ("gen-tests", _) => gen_tests(Overwrite)?, |
28 | "gen-syntax" => generate(Overwrite)?, | 52 | ("gen-syntax", _) => generate(Overwrite)?, |
29 | "format" => run_rustfmt(Overwrite)?, | 53 | ("format", _) => run_rustfmt(Overwrite)?, |
30 | "format-hook" => install_format_hook()?, | 54 | ("format-hook", _) => install_format_hook()?, |
31 | "lint" => run_clippy()?, | 55 | ("lint", _) => run_clippy()?, |
32 | "fuzz-tests" => run_fuzzer()?, | 56 | ("fuzz-tests", _) => run_fuzzer()?, |
33 | _ => unreachable!(), | 57 | _ => unreachable!(), |
34 | } | 58 | } |
35 | Ok(()) | 59 | Ok(()) |
36 | } | 60 | } |
37 | 61 | ||
38 | fn install_code_extension() -> Result<()> { | 62 | fn install(opts: InstallOpt) -> Result<()> { |
39 | run("cargo install --path crates/ra_lsp_server --force", ".")?; | 63 | if cfg!(target_os = "macos") { |
40 | if cfg!(windows) { | 64 | fix_path_for_mac()? |
41 | run(r"cmd.exe /c npm.cmd ci", "./editors/code")?; | ||
42 | run(r"cmd.exe /c npm.cmd run package", "./editors/code")?; | ||
43 | } else { | ||
44 | run(r"npm ci", "./editors/code")?; | ||
45 | run(r"npm run package", "./editors/code")?; | ||
46 | } | 65 | } |
47 | if cfg!(windows) { | 66 | if let Some(client) = opts.client { |
48 | run( | 67 | install_client(client)?; |
49 | r"cmd.exe /c code.cmd --install-extension ./ra-lsp-0.0.1.vsix --force", | ||
50 | "./editors/code", | ||
51 | )?; | ||
52 | } else { | ||
53 | run(r"code --install-extension ./ra-lsp-0.0.1.vsix --force", "./editors/code")?; | ||
54 | } | 68 | } |
55 | verify_installed_extensions()?; | 69 | if let Some(server) = opts.server { |
56 | Ok(()) | 70 | install_server(server)?; |
57 | } | ||
58 | |||
59 | fn verify_installed_extensions() -> Result<()> { | ||
60 | let exts = if cfg!(windows) { | ||
61 | run_with_output(r"cmd.exe /c code.cmd --list-extensions", ".")? | ||
62 | } else { | ||
63 | run_with_output(r"code --list-extensions", ".")? | ||
64 | }; | ||
65 | if !str::from_utf8(&exts.stdout)?.contains("ra-lsp") { | ||
66 | Err("Could not install the Visual Studio Code extension. Please make sure you \ | ||
67 | have at least NodeJS 10.x installed and try again.")?; | ||
68 | } | 71 | } |
69 | Ok(()) | 72 | Ok(()) |
70 | } | 73 | } |
@@ -101,3 +104,47 @@ fn fix_path_for_mac() -> Result<()> { | |||
101 | 104 | ||
102 | Ok(()) | 105 | Ok(()) |
103 | } | 106 | } |
107 | |||
108 | fn install_client(ClientOpt::VsCode: ClientOpt) -> Result<()> { | ||
109 | Cmd { unix: r"npm ci", windows: r"cmd.exe /c npm.cmd ci", work_dir: "./editors/code" }.run()?; | ||
110 | |||
111 | let code_in_path = Cmd { | ||
112 | unix: r"code --version", | ||
113 | windows: r"cmd.exe /c code.cmd --version", | ||
114 | work_dir: "./editors/code", | ||
115 | } | ||
116 | .run() | ||
117 | .is_ok(); | ||
118 | if !code_in_path { | ||
119 | Err("Can't execute `code --version`. Perhaps it is not in $PATH?")?; | ||
120 | } | ||
121 | |||
122 | Cmd { | ||
123 | unix: r"code --install-extension ./ra-lsp-0.0.1.vsix --force", | ||
124 | windows: r"cmd.exe /c code.cmd --install-extension ./ra-lsp-0.0.1.vsix --force", | ||
125 | work_dir: "./editors/code", | ||
126 | } | ||
127 | .run()?; | ||
128 | |||
129 | let output = Cmd { | ||
130 | unix: r"code --list-extensions", | ||
131 | windows: r"cmd.exe /c code.cmd --list-extensions", | ||
132 | work_dir: ".", | ||
133 | } | ||
134 | .run_with_output()?; | ||
135 | |||
136 | if !str::from_utf8(&output.stdout)?.contains("ra-lsp") { | ||
137 | Err("Could not install the Visual Studio Code extension. \ | ||
138 | Please make sure you have at least NodeJS 10.x installed and try again.")?; | ||
139 | } | ||
140 | |||
141 | Ok(()) | ||
142 | } | ||
143 | |||
144 | fn install_server(opts: ServerOpt) -> Result<()> { | ||
145 | if opts.jemalloc { | ||
146 | run("cargo install --path crates/ra_lsp_server --force --features jemalloc", ".") | ||
147 | } else { | ||
148 | run("cargo install --path crates/ra_lsp_server --force", ".") | ||
149 | } | ||
150 | } | ||