From ed7144d281643add390efab6ae3b27e25de60f17 Mon Sep 17 00:00:00 2001 From: Chevdor Date: Thu, 19 Jul 2018 17:20:11 +0200 Subject: [PATCH] Add support for shell completion (#340) * Add build script to generate completion scripts * Add installation doc for the shell auto-completion --- substrate/README.md | 36 ++++++++++++++++++++++++++ substrate/polkadot/cli/Cargo.toml | 6 ++++- substrate/polkadot/cli/build.rs | 43 +++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 substrate/polkadot/cli/build.rs diff --git a/substrate/README.md b/substrate/README.md index 79894c5a79..0283479feb 100644 --- a/substrate/README.md +++ b/substrate/README.md @@ -101,3 +101,39 @@ You can start a development chain with: ``` cargo run -- --dev ``` + +## 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 following: +``` +source target/release/completion-scripts/polkadot.bash +``` + +You can find completion scripts for: +- bash +- fish +- zsh +- elvish +- powershell + +To make this change persistent, you can proceed as follow: +### First install +``` +COMPL_DIR=$HOME/.completion +mkdir -p $COMPL_DIR +cp -f target/release/completion-scripts/polkadot.bash $COMPL_DIR/ +echo "source $COMPL_DIR/polkadot.bash" >> $HOME/.bash_profile +source $HOME/.bash_profile +``` + +### Update +When you build a new version of Polkadot, the following will ensure you auto-completion script matches the current binary: +``` +COMPL_DIR=$HOME/.completion +mkdir -p $COMPL_DIR +cp -f target/release/completion-scripts/polkadot.bash $COMPL_DIR/ +source $HOME/.bash_profile +``` + diff --git a/substrate/polkadot/cli/Cargo.toml b/substrate/polkadot/cli/Cargo.toml index 3f6505ba6f..52600af8a6 100644 --- a/substrate/polkadot/cli/Cargo.toml +++ b/substrate/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"] } backtrace = "0.3" env_logger = "0.4" error-chain = "0.12" @@ -42,3 +43,6 @@ polkadot-runtime = { path = "../runtime" } polkadot-service = { path = "../service" } polkadot-transaction-pool = { path = "../transaction-pool" } names = "0.11.0" + +[build-dependencies] +clap = "~2.32" diff --git a/substrate/polkadot/cli/build.rs b/substrate/polkadot/cli/build.rs new file mode 100644 index 0000000000..9b878725ee --- /dev/null +++ b/substrate/polkadot/cli/build.rs @@ -0,0 +1,43 @@ +#[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(); + + let mut app = clap::App::from_yaml(&yml); + app.gen_completions( + "polkadot", + *shell, + &path); +}