aboutsummaryrefslogtreecommitdiff
path: root/xtask/src/main.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2021-03-01 18:12:44 +0000
committerAleksey Kladov <[email protected]>2021-03-01 19:12:43 +0000
commit4ce20b80c5ca5e0523980aa8dd95b1cc76d78d59 (patch)
treecdd4c3c2b0406548415315ccafb6312860ffa402 /xtask/src/main.rs
parent9860a396035f61a5cc9265c1104a640547bded51 (diff)
Use cli parser with auto-generated help
Diffstat (limited to 'xtask/src/main.rs')
-rw-r--r--xtask/src/main.rs134
1 files changed, 26 insertions, 108 deletions
diff --git a/xtask/src/main.rs b/xtask/src/main.rs
index 84b17ce23..e419db7a7 100644
--- a/xtask/src/main.rs
+++ b/xtask/src/main.rs
@@ -7,6 +7,8 @@
7//! 7//!
8//! This binary is integrated into the `cargo` command line by using an alias in 8//! This binary is integrated into the `cargo` command line by using an alias in
9//! `.cargo/config`. 9//! `.cargo/config`.
10mod flags;
11
10mod codegen; 12mod codegen;
11mod ast_src; 13mod ast_src;
12#[cfg(test)] 14#[cfg(test)]
@@ -19,8 +21,6 @@ mod metrics;
19mod pre_cache; 21mod pre_cache;
20 22
21use anyhow::{bail, Result}; 23use anyhow::{bail, Result};
22use codegen::CodegenCmd;
23use pico_args::Arguments;
24use std::{ 24use std::{
25 env, 25 env,
26 path::{Path, PathBuf}, 26 path::{Path, PathBuf},
@@ -32,42 +32,19 @@ use crate::{
32 codegen::Mode, 32 codegen::Mode,
33 dist::DistCmd, 33 dist::DistCmd,
34 install::{InstallCmd, Malloc, ServerOpt}, 34 install::{InstallCmd, Malloc, ServerOpt},
35 metrics::MetricsCmd,
36 pre_cache::PreCacheCmd,
37 release::{PromoteCmd, ReleaseCmd},
38}; 35};
39 36
40fn main() -> Result<()> { 37fn main() -> Result<()> {
41 let _d = pushd(project_root())?; 38 let _d = pushd(project_root())?;
42 39
43 let mut args = Arguments::from_env(); 40 let flags = flags::Xtask::from_env()?;
44 let subcommand = args.subcommand()?.unwrap_or_default(); 41 match flags.subcommand {
45 42 flags::XtaskCmd::Help(_) => {
46 match subcommand.as_str() { 43 println!("{}", flags::Xtask::HELP);
47 "install" => { 44 return Ok(());
48 if args.contains(["-h", "--help"]) { 45 }
49 eprintln!( 46 flags::XtaskCmd::Install(flags) => {
50 "\ 47 if flags.server && flags.client {
51cargo xtask install
52Install rust-analyzer server or editor plugin.
53
54USAGE:
55 cargo xtask install [FLAGS]
56
57FLAGS:
58 --client[=CLIENT] Install only VS Code plugin.
59 CLIENT is one of 'code', 'code-exploration', 'code-insiders', 'codium', or 'code-oss'
60 --server Install only the language server
61 --mimalloc Use mimalloc allocator for server
62 --jemalloc Use jemalloc allocator for server
63 -h, --help Prints help information
64 "
65 );
66 return Ok(());
67 }
68 let server = args.contains("--server");
69 let client_code = args.contains("--client");
70 if server && client_code {
71 eprintln!( 48 eprintln!(
72 "error: The argument `--server` cannot be used with `--client`\n\n\ 49 "error: The argument `--server` cannot be used with `--client`\n\n\
73 For more information try --help" 50 For more information try --help"
@@ -75,102 +52,43 @@ FLAGS:
75 return Ok(()); 52 return Ok(());
76 } 53 }
77 54
78 let malloc = if args.contains("--mimalloc") { 55 let malloc = if flags.mimalloc {
79 Malloc::Mimalloc 56 Malloc::Mimalloc
80 } else if args.contains("--jemalloc") { 57 } else if flags.jemalloc {
81 Malloc::Jemalloc 58 Malloc::Jemalloc
82 } else { 59 } else {
83 Malloc::System 60 Malloc::System
84 }; 61 };
85 62
86 let client_opt = args.opt_value_from_str("--client")?; 63 let client_bin = flags.code_bin.map(|it| it.parse()).transpose()?;
87
88 finish_args(args)?;
89 64
90 InstallCmd { 65 InstallCmd {
91 client: if server { None } else { Some(client_opt.unwrap_or_default()) }, 66 client: if flags.server { None } else { client_bin },
92 server: if client_code { None } else { Some(ServerOpt { malloc }) }, 67 server: if flags.client { None } else { Some(ServerOpt { malloc }) },
93 } 68 }
94 .run() 69 .run()
95 } 70 }
96 "codegen" => { 71 flags::XtaskCmd::Codegen(cmd) => cmd.run(),
97 let features = args.contains("--features"); 72 flags::XtaskCmd::Lint(_) => run_clippy(),
98 finish_args(args)?; 73 flags::XtaskCmd::FuzzTests(_) => run_fuzzer(),
99 CodegenCmd { features }.run() 74 flags::XtaskCmd::PreCache(cmd) => cmd.run(),
100 } 75 flags::XtaskCmd::Release(cmd) => cmd.run(),
101 "lint" => { 76 flags::XtaskCmd::Promote(cmd) => cmd.run(),
102 finish_args(args)?; 77 flags::XtaskCmd::Dist(flags) => {
103 run_clippy() 78 DistCmd { nightly: flags.nightly, client_version: flags.client }.run()
104 }
105 "fuzz-tests" => {
106 finish_args(args)?;
107 run_fuzzer()
108 }
109 "pre-cache" => {
110 finish_args(args)?;
111 PreCacheCmd.run()
112 } 79 }
113 "release" => { 80 flags::XtaskCmd::Metrics(cmd) => cmd.run(),
114 let dry_run = args.contains("--dry-run"); 81 flags::XtaskCmd::Bb(cmd) => {
115 finish_args(args)?;
116 ReleaseCmd { dry_run }.run()
117 }
118 "promote" => {
119 let dry_run = args.contains("--dry-run");
120 finish_args(args)?;
121 PromoteCmd { dry_run }.run()
122 }
123 "dist" => {
124 let nightly = args.contains("--nightly");
125 let client_version: Option<String> = args.opt_value_from_str("--client")?;
126 finish_args(args)?;
127 DistCmd { nightly, client_version }.run()
128 }
129 "metrics" => {
130 let dry_run = args.contains("--dry-run");
131 finish_args(args)?;
132 MetricsCmd { dry_run }.run()
133 }
134 "bb" => {
135 let suffix: String = args.free_from_str()?;
136 finish_args(args)?;
137 { 82 {
138 let _d = pushd("./crates/rust-analyzer")?; 83 let _d = pushd("./crates/rust-analyzer")?;
139 cmd!("cargo build --release --features jemalloc").run()?; 84 cmd!("cargo build --release --features jemalloc").run()?;
140 } 85 }
141 cp("./target/release/rust-analyzer", format!("./target/rust-analyzer-{}", suffix))?; 86 cp("./target/release/rust-analyzer", format!("./target/rust-analyzer-{}", cmd.suffix))?;
142 Ok(())
143 }
144 _ => {
145 eprintln!(
146 "\
147cargo xtask
148Run custom build command.
149
150USAGE:
151 cargo xtask <SUBCOMMAND>
152
153SUBCOMMANDS:
154 fuzz-tests
155 codegen
156 install
157 lint
158 dist
159 promote
160 bb"
161 );
162 Ok(()) 87 Ok(())
163 } 88 }
164 } 89 }
165} 90}
166 91
167fn finish_args(args: Arguments) -> Result<()> {
168 if !args.finish().is_empty() {
169 bail!("Unused arguments.");
170 }
171 Ok(())
172}
173
174fn project_root() -> PathBuf { 92fn project_root() -> PathBuf {
175 Path::new( 93 Path::new(
176 &env::var("CARGO_MANIFEST_DIR").unwrap_or_else(|_| env!("CARGO_MANIFEST_DIR").to_owned()), 94 &env::var("CARGO_MANIFEST_DIR").unwrap_or_else(|_| env!("CARGO_MANIFEST_DIR").to_owned()),