aboutsummaryrefslogtreecommitdiff
path: root/home-manager
diff options
context:
space:
mode:
authorRobert Helgesson <robert@rycee.net>2019-06-09 01:47:43 +0200
committerRobert Helgesson <robert@rycee.net>2019-06-09 22:19:03 +0200
commit42732990cd93e396f7702b2bde460a4aa2fb83a1 (patch)
treed9a288508d60902773506e3706c80afbe1eee331 /home-manager
parentf82246171b253801021c6f98cc50fa461cd972e5 (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.bash21
-rw-r--r--home-manager/home-manager92
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
;;