diff --git a/Cargo.toml b/Cargo.toml index d17eab87..79c13f78 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,8 +13,6 @@ keywords = ["static", "site", "generator", "blog"] include = ["src/**/*", "LICENSE", "README.md"] [build-dependencies] -clap = "3" -clap_complete = "3" winres = "0.1" time = "0.3" @@ -23,6 +21,7 @@ name = "zola" [dependencies] clap = { version = "3", features = ["derive"] } +clap_complete = "3" # Below is for the serve cmd hyper = { version = "0.14.1", default-features = false, features = ["runtime", "server", "http2", "http1"] } tokio = { version = "1.0.1", default-features = false, features = ["rt", "fs", "time"] } diff --git a/build.rs b/build.rs index 40f11040..71b1c452 100644 --- a/build.rs +++ b/build.rs @@ -1,7 +1,3 @@ -// use clap::Shell; - -include!("src/cli.rs"); - fn generate_pe_header() { use time::OffsetDateTime; @@ -18,12 +14,6 @@ fn generate_pe_header() { } fn main() { - // disabled below as it fails in CI - // let mut app = build_cli(); - // app.gen_completions("zola", Shell::Bash, "completions/"); - // app.gen_completions("zola", Shell::Fish, "completions/"); - // app.gen_completions("zola", Shell::Zsh, "completions/"); - // app.gen_completions("zola", Shell::PowerShell, "completions/"); if std::env::var("CARGO_CFG_TARGET_OS").unwrap() != "windows" && std::env::var("PROFILE").unwrap() != "release" { diff --git a/completions/_zola b/completions/_zola deleted file mode 100644 index 3ca5a4d2..00000000 --- a/completions/_zola +++ /dev/null @@ -1,144 +0,0 @@ -#compdef zola - -autoload -U is-at-least - -_zola() { - typeset -A opt_args - typeset -a _arguments_options - local ret=1 - - if is-at-least 5.2; then - _arguments_options=(-s -S -C) - else - _arguments_options=(-s -C) - fi - - local context curcontext="$curcontext" state line - _arguments "${_arguments_options[@]}" \ -'-c+[Path to a config file other than config.toml]' \ -'--config=[Path to a config file other than config.toml]' \ -'-h[Prints help information]' \ -'--help[Prints help information]' \ -'-V[Prints version information]' \ -'--version[Prints version information]' \ -":: :_zola_commands" \ -"*::: :->zola" \ -&& ret=0 - case $state in - (zola) - words=($line[1] "${words[@]}") - (( CURRENT += 1 )) - curcontext="${curcontext%:*:*}:zola-command-$line[1]:" - case $line[1] in - (init) -_arguments "${_arguments_options[@]}" \ -'-h[Prints help information]' \ -'--help[Prints help information]' \ -'-V[Prints version information]' \ -'--version[Prints version information]' \ -'::name -- Name of the project. Will create a new directory with that name in the current directory:_files' \ -&& ret=0 -;; -(build) -_arguments "${_arguments_options[@]}" \ -'-u+[Force the base URL to be that value (default to the one in config.toml)]' \ -'--base-url=[Force the base URL to be that value (default to the one in config.toml)]' \ -'-o+[Outputs the generated site in the given path]' \ -'--output-dir=[Outputs the generated site in the given path]' \ -'--drafts[Include drafts when loading the site]' \ -'-h[Prints help information]' \ -'--help[Prints help information]' \ -'-V[Prints version information]' \ -'--version[Prints version information]' \ -&& ret=0 -;; -(serve) -_arguments "${_arguments_options[@]}" \ -'-i+[Interface to bind on]' \ -'--interface=[Interface to bind on]' \ -'-p+[Which port to use]' \ -'--port=[Which port to use]' \ -'-o+[Outputs the generated site in the given path]' \ -'--output-dir=[Outputs the generated site in the given path]' \ -'-u+[Changes the base_url]' \ -'--base-url=[Changes the base_url]' \ -'--watch-only[Do not start a server, just re-build project on changes]' \ -'--drafts[Include drafts when loading the site]' \ -'-O[Open site in the default browser]' \ -'--open[Open site in the default browser]' \ -'-h[Prints help information]' \ -'--help[Prints help information]' \ -'-V[Prints version information]' \ -'--version[Prints version information]' \ -&& ret=0 -;; -(check) -_arguments "${_arguments_options[@]}" \ -'--drafts[Include drafts when loading the site]' \ -'-h[Prints help information]' \ -'--help[Prints help information]' \ -'-V[Prints version information]' \ -'--version[Prints version information]' \ -&& ret=0 -;; -(help) -_arguments "${_arguments_options[@]}" \ -'-h[Prints help information]' \ -'--help[Prints help information]' \ -'-V[Prints version information]' \ -'--version[Prints version information]' \ -&& ret=0 -;; - esac - ;; -esac -} - -(( $+functions[_zola_commands] )) || -_zola_commands() { - local commands; commands=( - "init:Create a new Zola project" \ -"build:Deletes the output directory if there is one and builds the site" \ -"serve:Serve the site. Rebuild and reload on change automatically" \ -"check:Try building the project without rendering it. Checks links" \ -"help:Prints this message or the help of the given subcommand(s)" \ - ) - _describe -t commands 'zola commands' commands "$@" -} -(( $+functions[_zola__build_commands] )) || -_zola__build_commands() { - local commands; commands=( - - ) - _describe -t commands 'zola build commands' commands "$@" -} -(( $+functions[_zola__check_commands] )) || -_zola__check_commands() { - local commands; commands=( - - ) - _describe -t commands 'zola check commands' commands "$@" -} -(( $+functions[_zola__help_commands] )) || -_zola__help_commands() { - local commands; commands=( - - ) - _describe -t commands 'zola help commands' commands "$@" -} -(( $+functions[_zola__init_commands] )) || -_zola__init_commands() { - local commands; commands=( - - ) - _describe -t commands 'zola init commands' commands "$@" -} -(( $+functions[_zola__serve_commands] )) || -_zola__serve_commands() { - local commands; commands=( - - ) - _describe -t commands 'zola serve commands' commands "$@" -} - -_zola "$@" \ No newline at end of file diff --git a/completions/_zola.ps1 b/completions/_zola.ps1 deleted file mode 100644 index 977ee071..00000000 --- a/completions/_zola.ps1 +++ /dev/null @@ -1,93 +0,0 @@ - -using namespace System.Management.Automation -using namespace System.Management.Automation.Language - -Register-ArgumentCompleter -Native -CommandName 'zola' -ScriptBlock { - param($wordToComplete, $commandAst, $cursorPosition) - - $commandElements = $commandAst.CommandElements - $command = @( - 'zola' - for ($i = 1; $i -lt $commandElements.Count; $i++) { - $element = $commandElements[$i] - if ($element -isnot [StringConstantExpressionAst] -or - $element.StringConstantType -ne [StringConstantType]::BareWord -or - $element.Value.StartsWith('-')) { - break - } - $element.Value - }) -join ';' - - $completions = @(switch ($command) { - 'zola' { - [CompletionResult]::new('-c', 'c', [CompletionResultType]::ParameterName, 'Path to a config file other than config.toml in the root of project') - [CompletionResult]::new('--config', 'config', [CompletionResultType]::ParameterName, 'Path to a config file other than config.toml in the root of project') - [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Prints help information') - [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Prints help information') - [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Prints version information') - [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Prints version information') - [CompletionResult]::new('init', 'init', [CompletionResultType]::ParameterValue, 'Create a new Zola project') - [CompletionResult]::new('build', 'build', [CompletionResultType]::ParameterValue, 'Deletes the output directory if there is one and builds the site') - [CompletionResult]::new('serve', 'serve', [CompletionResultType]::ParameterValue, 'Serve the site. Rebuild and reload on change automatically') - [CompletionResult]::new('check', 'check', [CompletionResultType]::ParameterValue, 'Try building the project without rendering it. Checks links') - [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Prints this message or the help of the given subcommand(s)') - break - } - 'zola;init' { - [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Prints help information') - [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Prints help information') - [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Prints version information') - [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Prints version information') - break - } - 'zola;build' { - [CompletionResult]::new('-u', 'u', [CompletionResultType]::ParameterName, 'Force the base URL to be that value (default to the one in config.toml)') - [CompletionResult]::new('--base-url', 'base-url', [CompletionResultType]::ParameterName, 'Force the base URL to be that value (default to the one in config.toml)') - [CompletionResult]::new('-o', 'o', [CompletionResultType]::ParameterName, 'Outputs the generated site in the given path') - [CompletionResult]::new('--output-dir', 'output-dir', [CompletionResultType]::ParameterName, 'Outputs the generated site in the given path') - [CompletionResult]::new('--drafts', 'drafts', [CompletionResultType]::ParameterName, 'Include drafts when loading the site') - [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Prints help information') - [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Prints help information') - [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Prints version information') - [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Prints version information') - break - } - 'zola;serve' { - [CompletionResult]::new('-i', 'i', [CompletionResultType]::ParameterName, 'Interface to bind on') - [CompletionResult]::new('--interface', 'interface', [CompletionResultType]::ParameterName, 'Interface to bind on') - [CompletionResult]::new('-p', 'p', [CompletionResultType]::ParameterName, 'Which port to use') - [CompletionResult]::new('--port', 'port', [CompletionResultType]::ParameterName, 'Which port to use') - [CompletionResult]::new('-o', 'o', [CompletionResultType]::ParameterName, 'Outputs the generated site in the given path') - [CompletionResult]::new('--output-dir', 'output-dir', [CompletionResultType]::ParameterName, 'Outputs the generated site in the given path') - [CompletionResult]::new('-u', 'u', [CompletionResultType]::ParameterName, 'Changes the base_url') - [CompletionResult]::new('--base-url', 'base-url', [CompletionResultType]::ParameterName, 'Changes the base_url') - [CompletionResult]::new('--watch-only', 'watch-only', [CompletionResultType]::ParameterName, 'Do not start a server, just re-build project on changes') - [CompletionResult]::new('--drafts', 'drafts', [CompletionResultType]::ParameterName, 'Include drafts when loading the site') - [CompletionResult]::new('-O', 'O', [CompletionResultType]::ParameterName, 'Open site in the default browser') - [CompletionResult]::new('--open', 'open', [CompletionResultType]::ParameterName, 'Open site in the default browser') - [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Prints help information') - [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Prints help information') - [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Prints version information') - [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Prints version information') - break - } - 'zola;check' { - [CompletionResult]::new('--drafts', 'drafts', [CompletionResultType]::ParameterName, 'Include drafts when loading the site') - [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Prints help information') - [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Prints help information') - [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Prints version information') - [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Prints version information') - break - } - 'zola;help' { - [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Prints help information') - [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Prints help information') - [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Prints version information') - [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Prints version information') - break - } - }) - - $completions.Where{ $_.CompletionText -like "$wordToComplete*" } | - Sort-Object -Property ListItemText -} diff --git a/completions/zola.bash b/completions/zola.bash deleted file mode 100644 index dcaa0734..00000000 --- a/completions/zola.bash +++ /dev/null @@ -1,187 +0,0 @@ -_zola() { - local i cur prev opts cmds - COMPREPLY=() - cur="${COMP_WORDS[COMP_CWORD]}" - prev="${COMP_WORDS[COMP_CWORD-1]}" - cmd="" - opts="" - - for i in ${COMP_WORDS[@]} - do - case "${i}" in - zola) - cmd="zola" - ;; - - build) - cmd+="__build" - ;; - check) - cmd+="__check" - ;; - help) - cmd+="__help" - ;; - init) - cmd+="__init" - ;; - serve) - cmd+="__serve" - ;; - *) - ;; - esac - done - - case "${cmd}" in - zola) - opts=" -h -V -c --help --version --config init build serve check help" - if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - return 0 - fi - case "${prev}" in - - --config) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - -c) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - *) - COMPREPLY=() - ;; - esac - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - return 0 - ;; - - zola__build) - opts=" -h -V -u -o --drafts --help --version --base-url --output-dir " - if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - return 0 - fi - case "${prev}" in - - --base-url) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - -u) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --output-dir) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - -o) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - *) - COMPREPLY=() - ;; - esac - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - return 0 - ;; - zola__check) - opts=" -h -V --drafts --help --version " - if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - return 0 - fi - case "${prev}" in - - *) - COMPREPLY=() - ;; - esac - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - return 0 - ;; - zola__help) - opts=" -h -V --help --version " - if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - return 0 - fi - case "${prev}" in - - *) - COMPREPLY=() - ;; - esac - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - return 0 - ;; - zola__init) - opts=" -h -V --help --version " - if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - return 0 - fi - case "${prev}" in - - *) - COMPREPLY=() - ;; - esac - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - return 0 - ;; - zola__serve) - opts=" -O -h -V -i -p -o -u --watch-only --drafts --open --help --version --interface --port --output-dir --base-url " - if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - return 0 - fi - case "${prev}" in - - --interface) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - -i) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --port) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - -p) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --output-dir) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - -o) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --base-url) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - -u) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - *) - COMPREPLY=() - ;; - esac - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - return 0 - ;; - esac -} - -complete -F _zola -o bashdefault -o default zola diff --git a/completions/zola.fish b/completions/zola.fish deleted file mode 100644 index a0d1bad8..00000000 --- a/completions/zola.fish +++ /dev/null @@ -1,29 +0,0 @@ -complete -c zola -n "__fish_use_subcommand" -s c -l config -d 'Path to a config file other than config.toml in the root of project' -complete -c zola -n "__fish_use_subcommand" -s h -l help -d 'Prints help information' -complete -c zola -n "__fish_use_subcommand" -s V -l version -d 'Prints version information' -complete -c zola -n "__fish_use_subcommand" -f -a "init" -d 'Create a new Zola project' -complete -c zola -n "__fish_use_subcommand" -f -a "build" -d 'Deletes the output directory if there is one and builds the site' -complete -c zola -n "__fish_use_subcommand" -f -a "serve" -d 'Serve the site. Rebuild and reload on change automatically' -complete -c zola -n "__fish_use_subcommand" -f -a "check" -d 'Try building the project without rendering it. Checks links' -complete -c zola -n "__fish_use_subcommand" -f -a "help" -d 'Prints this message or the help of the given subcommand(s)' -complete -c zola -n "__fish_seen_subcommand_from init" -s h -l help -d 'Prints help information' -complete -c zola -n "__fish_seen_subcommand_from init" -s V -l version -d 'Prints version information' -complete -c zola -n "__fish_seen_subcommand_from build" -s u -l base-url -d 'Force the base URL to be that value (default to the one in config.toml)' -complete -c zola -n "__fish_seen_subcommand_from build" -s o -l output-dir -d 'Outputs the generated site in the given path' -complete -c zola -n "__fish_seen_subcommand_from build" -l drafts -d 'Include drafts when loading the site' -complete -c zola -n "__fish_seen_subcommand_from build" -s h -l help -d 'Prints help information' -complete -c zola -n "__fish_seen_subcommand_from build" -s V -l version -d 'Prints version information' -complete -c zola -n "__fish_seen_subcommand_from serve" -s i -l interface -d 'Interface to bind on' -complete -c zola -n "__fish_seen_subcommand_from serve" -s p -l port -d 'Which port to use' -complete -c zola -n "__fish_seen_subcommand_from serve" -s o -l output-dir -d 'Outputs the generated site in the given path' -complete -c zola -n "__fish_seen_subcommand_from serve" -s u -l base-url -d 'Changes the base_url' -complete -c zola -n "__fish_seen_subcommand_from serve" -l watch-only -d 'Do not start a server, just re-build project on changes' -complete -c zola -n "__fish_seen_subcommand_from serve" -l drafts -d 'Include drafts when loading the site' -complete -c zola -n "__fish_seen_subcommand_from serve" -s O -l open -d 'Open site in the default browser' -complete -c zola -n "__fish_seen_subcommand_from serve" -s h -l help -d 'Prints help information' -complete -c zola -n "__fish_seen_subcommand_from serve" -s V -l version -d 'Prints version information' -complete -c zola -n "__fish_seen_subcommand_from check" -l drafts -d 'Include drafts when loading the site' -complete -c zola -n "__fish_seen_subcommand_from check" -s h -l help -d 'Prints help information' -complete -c zola -n "__fish_seen_subcommand_from check" -s V -l version -d 'Prints version information' -complete -c zola -n "__fish_seen_subcommand_from help" -s h -l help -d 'Prints help information' -complete -c zola -n "__fish_seen_subcommand_from help" -s V -l version -d 'Prints version information' diff --git a/src/cli.rs b/src/cli.rs index 82b1f908..a6bb7e65 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,6 +1,7 @@ use std::path::PathBuf; use clap::{Parser, Subcommand}; +use clap_complete::Shell; #[derive(Parser)] #[clap(version, author, about)] @@ -83,4 +84,11 @@ pub enum Command { #[clap(long)] drafts: bool, }, + + /// Generate shell completion + Completion { + /// Shell to generate completion for + #[clap(arg_enum)] + shell: Shell, + }, } diff --git a/src/main.rs b/src/main.rs index 22fa101c..35119b98 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,7 @@ use std::time::Instant; use cli::{Cli, Command}; use utils::net::{get_available_port, port_is_available}; -use clap::Parser; +use clap::{CommandFactory, Parser}; use time::UtcOffset; mod cli; @@ -100,5 +100,9 @@ fn main() { } } } + Command::Completion { shell } => { + let cmd = &mut Cli::command(); + clap_complete::generate(shell, cmd, cmd.get_name().to_string(), &mut std::io::stdout()); + } } }