6259: allow xtask install --client[=CLIENT] to specify client r=Emilgardis a=Emilgardis



Co-authored-by: Emil Gardström <emil.gardstrom@gmail.com>
This commit is contained in:
bors[bot] 2020-10-20 20:49:17 +00:00 committed by GitHub
commit 0833484914
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 17 deletions

View file

@ -13,8 +13,43 @@ pub struct InstallCmd {
pub server: Option<ServerOpt>, pub server: Option<ServerOpt>,
} }
#[derive(Clone, Copy)]
pub enum ClientOpt { pub enum ClientOpt {
VsCode, VsCode,
VsCodeInsiders,
VsCodium,
VsCodeOss,
Any,
}
impl ClientOpt {
pub const fn as_cmds(&self) -> &'static [&'static str] {
match self {
ClientOpt::VsCode => &["code"],
ClientOpt::VsCodeInsiders => &["code-insiders"],
ClientOpt::VsCodium => &["codium"],
ClientOpt::VsCodeOss => &["code-oss"],
ClientOpt::Any => &["code", "code-insiders", "codium", "code-oss"],
}
}
}
impl Default for ClientOpt {
fn default() -> Self {
ClientOpt::Any
}
}
impl std::str::FromStr for ClientOpt {
type Err = anyhow::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
[ClientOpt::VsCode, ClientOpt::VsCodeInsiders, ClientOpt::VsCodium, ClientOpt::VsCodeOss]
.iter()
.copied()
.find(|c| [s] == c.as_cmds())
.ok_or_else(|| anyhow::format_err!("no such client"))
}
} }
pub struct ServerOpt { pub struct ServerOpt {
@ -74,15 +109,11 @@ fn fix_path_for_mac() -> Result<()> {
Ok(()) Ok(())
} }
fn install_client(ClientOpt::VsCode: ClientOpt) -> Result<()> { fn install_client(client_opt: ClientOpt) -> Result<()> {
let _dir = pushd("./editors/code")?; let _dir = pushd("./editors/code");
let find_code = |f: fn(&str) -> bool| -> Result<&'static str> { let find_code = |f: fn(&str) -> bool| -> Result<&'static str> {
["code", "code-insiders", "codium", "code-oss"] client_opt.as_cmds().iter().copied().find(|bin| f(bin)).ok_or_else(|| {
.iter()
.copied()
.find(|bin| f(bin))
.ok_or_else(|| {
format_err!("Can't execute `code --version`. Perhaps it is not in $PATH?") format_err!("Can't execute `code --version`. Perhaps it is not in $PATH?")
}) })
}; };

View file

@ -16,7 +16,7 @@ use xshell::pushd;
use xtask::{ use xtask::{
codegen::{self, Mode}, codegen::{self, Mode},
dist::DistCmd, dist::DistCmd,
install::{ClientOpt, InstallCmd, Malloc, ServerOpt}, install::{InstallCmd, Malloc, ServerOpt},
metrics::MetricsCmd, metrics::MetricsCmd,
pre_cache::PreCacheCmd, pre_cache::PreCacheCmd,
pre_commit, project_root, pre_commit, project_root,
@ -46,7 +46,8 @@ USAGE:
cargo xtask install [FLAGS] cargo xtask install [FLAGS]
FLAGS: FLAGS:
--client-code Install only VS Code plugin --client[=CLIENT] Install only VS Code plugin.
CLIENT is one of 'code', 'code-insiders', 'codium', or 'code-oss'
--server Install only the language server --server Install only the language server
--mimalloc Use mimalloc for server --mimalloc Use mimalloc for server
-h, --help Prints help information -h, --help Prints help information
@ -55,10 +56,10 @@ FLAGS:
return Ok(()); return Ok(());
} }
let server = args.contains("--server"); let server = args.contains("--server");
let client_code = args.contains("--client-code"); let client_code = args.contains("--client");
if server && client_code { if server && client_code {
eprintln!( eprintln!(
"error: The argument `--server` cannot be used with `--client-code`\n\n\ "error: The argument `--server` cannot be used with `--client`\n\n\
For more information try --help" For more information try --help"
); );
return Ok(()); return Ok(());
@ -67,10 +68,12 @@ FLAGS:
let malloc = let malloc =
if args.contains("--mimalloc") { Malloc::Mimalloc } else { Malloc::System }; if args.contains("--mimalloc") { Malloc::Mimalloc } else { Malloc::System };
let client_opt = args.opt_value_from_str("--client")?;
args.finish()?; args.finish()?;
InstallCmd { InstallCmd {
client: if server { None } else { Some(ClientOpt::VsCode) }, client: if server { None } else { Some(client_opt.unwrap_or_default()) },
server: if client_code { None } else { Some(ServerOpt { malloc }) }, server: if client_code { None } else { Some(ServerOpt { malloc }) },
} }
.run() .run()