diff options
author | Robert Helgesson <robert@rycee.net> | 2019-06-09 01:47:43 +0200 |
---|---|---|
committer | Robert Helgesson <robert@rycee.net> | 2019-06-09 22:19:03 +0200 |
commit | 42732990cd93e396f7702b2bde460a4aa2fb83a1 (patch) | |
tree | d9a288508d60902773506e3706c80afbe1eee331 /home-manager | |
parent | f82246171b253801021c6f98cc50fa461cd972e5 (diff) |
home-manager: rewrite argument parsing
This rewrite allows "long options" but unfortunately does not allow
merged options such as `-vn`.
Also improve the home-manager manual page, with this it should include
all sub-commands and arguments.
Finally, include the home-manager manual page in the generated HTML
documentation.
Diffstat (limited to 'home-manager')
-rw-r--r-- | home-manager/completion.bash | 21 | ||||
-rw-r--r-- | home-manager/home-manager | 92 |
2 files changed, 70 insertions, 43 deletions
diff --git a/home-manager/completion.bash b/home-manager/completion.bash index cb7c0009693..501b87279fa 100644 --- a/home-manager/completion.bash +++ b/home-manager/completion.bash @@ -49,9 +49,13 @@ # -A # -I # -f +# --file # -h +# --help # -n +# --dry-run # -v +# --verbose # build # edit # expire-generations @@ -61,6 +65,7 @@ # packages # remove-generations # switch +# uninstall # $ home-manager e<TAB> # @@ -88,15 +93,21 @@ # expire-generations # packages # news +# uninstall # « home-manager » Options: # +# -b EXT # -f FILE +# --file FILE # -A ATTRIBUTE # -I PATH # -v +# --verbose # -n +# --dry-run # -h +# --help # $ home-manager # @@ -109,6 +120,7 @@ # -A ATTRIBUTE Optional attribute that selects a configuration # expression in the configuration file. # -I PATH Add a path to the Nix expression search path. +# -b EXT Move existing files to new path rather than fail. # -v Verbose output # -n Do a dry run, only prints what actions would be taken # -h Print this help @@ -138,7 +150,8 @@ # # news Show news entries in a pager # - +# uninstall Remove Home Manager +# ################################################## # Dependencies: @@ -265,14 +278,14 @@ _home-manager_completions () #--------------------------# local Subcommands - Subcommands=( "help" "edit" "build" "switch" "generations" "remove-generations" "expire-generations" "packages" "news" ) + Subcommands=( "help" "edit" "build" "switch" "generations" "remove-generations" "expire-generations" "packages" "news" "uninstall" ) # ^ « home-manager »'s subcommands. #--------------------------# local Options - Options=( "-f" "-A" "-I" "-h" "-n" "-v" ) + Options=( "-f" "--file" "-b" "-A" "-I" "-h" "--help" "-n" "--dry-run" "-v" "--verbose" "--show-trace" ) # ^ « home-manager »'s options. @@ -304,7 +317,7 @@ _home-manager_completions () case "$PreviousWord" in - "-f") + "-f"|"--file") COMPREPLY+=( $( compgen -A file -- "$CurrentWord") ) ;; diff --git a/home-manager/home-manager b/home-manager/home-manager index b6ea92edb9e..bd81fc92357 100644 --- a/home-manager/home-manager +++ b/home-manager/home-manager @@ -93,12 +93,14 @@ function doBuildAttr() { nix build \ -f "<home-manager/home-manager/home-manager.nix>" \ $extraArgs \ + ${PASSTHROUGH_OPTS[*]} \ --argstr confPath "$HOME_MANAGER_CONFIG" \ --argstr confAttr "$HOME_MANAGER_CONFIG_ATTRIBUTE" else nix-build \ "<home-manager/home-manager/home-manager.nix>" \ $extraArgs \ + ${PASSTHROUGH_OPTS[*]} \ --argstr confPath "$HOME_MANAGER_CONFIG" \ --argstr confAttr "$HOME_MANAGER_CONFIG_ATTRIBUTE" fi @@ -451,62 +453,69 @@ function doHelp() { EXTRA_NIX_PATH=() HOME_MANAGER_CONFIG_ATTRIBUTE="" +PASSTHROUGH_OPTS=() +COMMAND="" +COMMAND_ARGS=() -# As a special case, if the user has given --help anywhere on the -# command line then print help and exit. -for arg in "$@"; do - if [[ $arg == "--help" ]]; then - doHelp - exit 0 - fi -done - -while getopts 2f:I:A:b:vnh opt; do +while [[ $# -gt 0 ]]; do + opt="$1" + shift case $opt in - 2) + build|edit|expire-generations|generations|help|news|packages|remove-generations|switch|uninstall) + COMMAND="$opt" + ;; + -2) USE_NIX2_COMMAND=1 ;; - f) - HOME_MANAGER_CONFIG="$OPTARG" + -A) + HOME_MANAGER_CONFIG_ATTRIBUTE="$1" + shift ;; - I) - EXTRA_NIX_PATH+=("$OPTARG") + -I) + EXTRA_NIX_PATH+=("$1") + shift ;; - A) - HOME_MANAGER_CONFIG_ATTRIBUTE="$OPTARG" + -b) + export HOME_MANAGER_BACKUP_EXT="$1" + shift ;; - b) - export HOME_MANAGER_BACKUP_EXT="$OPTARG" + -f|--file) + HOME_MANAGER_CONFIG="$1" + shift ;; - v) - export VERBOSE=1 + -h|--help) + doHelp ;; - n) + -n|--dry-run) export DRY_RUN=1 ;; - h) - doHelp - exit 0 + --show-trace) + PASSTHROUGH_OPTS+=("$opt") + ;; + -v|--verbose) + export VERBOSE=1 ;; *) - doHelp >&2 - exit 1 + case $COMMAND in + expire-generations|remove-generations) + COMMAND_ARGS+=("$opt") + ;; + *) + errorEcho "$0: unknown option '$opt'" + errorEcho "Run '$0 --help' for usage help" + exit 1 + ;; + esac ;; esac done -# Get rid of the options. -shift "$((OPTIND-1))" - -if [[ $# -eq 0 ]]; then +if [[ -z $COMMAND ]]; then doHelp >&2 exit 1 fi -cmd="$1" -shift 1 - -case "$cmd" in +case $COMMAND in edit) doEdit ;; @@ -520,10 +529,15 @@ case "$cmd" in doListGens ;; remove-generations) - doRmGenerations "$@" + doRmGenerations "${COMMAND_ARGS[@]}" ;; expire-generations) - doExpireGenerations "$@" + if [[ ${#COMMAND_ARGS[@]} != 1 ]]; then + errorEcho "expire-generations expects one argument, got ${#COMMAND_ARGS[@]}." + exit 1 + else + doExpireGenerations "${COMMAND_ARGS[@]}" + fi ;; packages) doListPackages @@ -534,11 +548,11 @@ case "$cmd" in uninstall) doUninstall ;; - help|--help) + help) doHelp ;; *) - errorEcho "Unknown command: $cmd" + errorEcho "Unknown command: $COMMAND" doHelp >&2 exit 1 ;; |