From 838834766d68eac2b1a6dec37f9881bec0c24247 Mon Sep 17 00:00:00 2001 From: chevdor Date: Mon, 16 Jul 2018 21:52:02 +0200 Subject: [PATCH] Add build script to generate completion scripts --- README.md | 16 +++++++++++++++ polkadot/cli/Cargo.toml | 6 +++++- polkadot/cli/build.rs | 44 +++++++++++++++++++++++++++++++++++++++++ polkadot/cli/src/lib.rs | 2 +- 4 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 polkadot/cli/build.rs diff --git a/README.md b/README.md index 53f0cd86598de..013f93b185d83 100644 --- a/README.md +++ b/README.md @@ -101,3 +101,19 @@ You can start a development chain with: ``` cargo run -- --chain=dev --validator --key Alice ``` + +## Shell completion + +The Polkadot cli command supports shell auto-completion. For this to work, you will need to run the completion script matching you build and system. + +Assuming you built a release version using `cargo build --release` and use `bash` run the followig: +``` +source target/release/completion-scripts/polkadot.bash +``` + +You can find completion scripts for: +- bash +- fish +- zsh +- elvish +- powershell diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index b2bf91db90546..31c6fe7bd52b9 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -3,9 +3,10 @@ name = "polkadot-cli" version = "0.2.0" authors = ["Parity Technologies "] description = "Polkadot node implementation in Rust." +build = "build.rs" [dependencies] -clap = { version = "2.27", features = ["yaml"] } +clap = { version = "~2.32", features = ["yaml"] } env_logger = "0.4" error-chain = "0.12" log = "0.3" @@ -40,3 +41,6 @@ polkadot-primitives = { path = "../primitives" } polkadot-runtime = { path = "../runtime" } polkadot-service = { path = "../service" } polkadot-transaction-pool = { path = "../transaction-pool" } + +[build-dependencies] +clap = "~2.32" diff --git a/polkadot/cli/build.rs b/polkadot/cli/build.rs new file mode 100644 index 0000000000000..70d94d4a451fb --- /dev/null +++ b/polkadot/cli/build.rs @@ -0,0 +1,44 @@ +#[macro_use] +extern crate clap; + +use std::fs; +use std::env; +use clap::Shell; +use std::path::Path; + +fn main() { + build_shell_completion(); +} + +/// Build shell completion scripts for all known shells +/// Full list in https://github.com/kbknapp/clap-rs/blob/e9d0562a1dc5dfe731ed7c767e6cee0af08f0cf9/src/app/parser.rs#L123 +fn build_shell_completion() { + let shells = [Shell::Bash, Shell::Fish, Shell::Zsh, Shell::Elvish, Shell::PowerShell]; + for shell in shells.iter() { + build_completion(shell); + } +} + +/// Build the shell auto-completion for a given Shell +fn build_completion(shell: &Shell) { + let yml = load_yaml!("src/cli.yml"); + + let outdir = match env::var_os("OUT_DIR") { + None => return, + Some(dir) => dir, + }; + let path = Path::new(&outdir) + .parent().unwrap() + .parent().unwrap() + .parent().unwrap() + .join("completion-scripts"); + + fs::create_dir(&path).ok(); + + // println!("{:?}", path); + let mut app = clap::App::from_yaml(&yml); + app.gen_completions( + "polkadot", + *shell, + &path); +} diff --git a/polkadot/cli/src/lib.rs b/polkadot/cli/src/lib.rs index 791010b12876a..42a0b264287be 100644 --- a/polkadot/cli/src/lib.rs +++ b/polkadot/cli/src/lib.rs @@ -221,7 +221,7 @@ pub fn run(args: I, worker: W) -> error::Result<()> where info!("Starting collator"); // TODO [rob]: collation node implementation // This isn't a thing. Different parachains will have their own collator executables and - // maybe link to libpolkadot to get a light-client. + // maybe link to libpolkadot to get a light-client. service::Roles::LIGHT } else if matches.is_present("light") { info!("Starting (light)");