From fa5484c81c40e0a5a05194909600716f39ce0faf Mon Sep 17 00:00:00 2001 From: Dave Reisner Date: Tue, 17 Apr 2012 19:23:15 -0400 Subject: mkinitcpio: adopt parseopts for option parsing Updates the doc and bash-completion, as well. Also adds the previously unmentioned -A option to the --help output. Signed-off-by: Dave Reisner --- bash-completion | 33 ++++++++---- mkinitcpio | 152 ++++++++++++++++++++++++++++++++++--------------------- mkinitcpio.8.txt | 32 ++++++------ 3 files changed, 132 insertions(+), 85 deletions(-) diff --git a/bash-completion b/bash-completion index b7fc277..f4c476b 100644 --- a/bash-completion +++ b/bash-completion @@ -32,18 +32,29 @@ _find_kernel_versions() { } _mkinitcpio() { - local action cur prev - action="-A -b -c -g -H -h -k -L -M -n -p -S -s -v -z" + local action cur prev opts + opts=(-A --add -b --basedir -c --config -g --generate -H --hookhelp + -h --help -k --kernel -L --listhooks -M --automods -n --nocolor + -p --preset -S --skiphooks -s --save -t --builddir -v --verbose + -z --compress) + _get_comp_words_by_ref cur prev - case "$prev" in - -c|-g) _filedir;; - -k) _find_kernel_versions;; - -b) _filedir -d;; - -p) COMPREPLY=($(cd /etc/mkinitcpio.d/ && compgen -X '!*.preset' -f -- $cur)) - COMPREPLY=("${COMPREPLY[@]%.preset}");; - -A|-H|-S) COMPREPLY=($(cd /lib/initcpio/install/ && compgen -f -- $cur) \ - $(cd /usr/lib/initcpio/install/ && compgen -f -- $cur));; - *) COMPREPLY=($(compgen -W "${action}" -- "$cur"));; + + case $prev in + -[cg]|--config|--generate) + _filedir ;; + -k|--kernel) + _find_kernel_versions ;; + -[bt]|--basedir|--builddir) + _filedir -d ;; + -p|--preset) + COMPREPLY=($(cd /etc/mkinitcpio.d/ && compgen -X '!*.preset' -f -- $cur)) + COMPREPLY=("${COMPREPLY[@]%.preset}") ;; + -[AHS]|--add|--hookhelp|--skiphooks) + COMPREPLY=($(cd /lib/initcpio/install/ && compgen -f -- $cur) + $(cd /usr/lib/initcpio/install/ && compgen -f -- $cur)) ;; + *) + COMPREPLY=($(compgen -W "${opts[*]}" -- "$cur")) ;; esac } diff --git a/mkinitcpio b/mkinitcpio index 4618baa..9a3c343 100755 --- a/mkinitcpio +++ b/mkinitcpio @@ -41,21 +41,22 @@ mkinitcpio $version usage: ${0##*/} [options] Options: - -b BASEDIR Use BASEDIR. default: / - -c CONFIG Use CONFIG file. default: /etc/mkinitcpio.conf - -g IMAGE Generate a cpio image as IMAGE. default: no - -H HOOKNAME Output help for hook 'HOOKNAME'. - -h Display this message. - -k KERNELVERSION Use KERNELVERSION. default: $(uname -r) - -L List all available hooks. - -M Display modules found via autodetection. - -n Disable colorized output messages. - -p PRESET Build specified preset from /etc/mkinitcpio.d - -S SKIPHOOKS Skip SKIPHOOKS (comma-separated) when building the image. - -s Save build directory. default: no - -t DIR Use DIR as the temporary build directory. - -v Verbose output. Default: no. - -z COMPRESS Use COMPRESS on resulting image + -A, --add Add specified hooks, comma separated, to image + -b, --basedir Use alternate base directory. (default: /) + -c, --config Use alternate config file. (default: /etc/mkinitcpio.conf) + -g, --generate Generate cpio image and write to specified path + -H, --hookhelp Display help for given hook and exit + -h, --help Display this message and exit + -k, --kernel Use specified kernel version (default: $(uname -r)) + -L, --listhooks List all available hooks + -M, --automods Display modules found via autodetection + -n, --nocolor Disable colorized output messages + -p, --preset Build specified preset from /etc/mkinitcpio.d + -S, --skiphooks Skip specified hooks, comma-separated, during build + -s, --save Save build directory. (default: no) + -t, --builddir Use DIR as the temporary build directory + -v, --verbose Verbose output (default: no) + -z, --compress Use an alternate compressor on the image EOF cleanup 1 @@ -109,51 +110,86 @@ get_kernver() { trap 'cleanup 130' INT trap 'cleanup 143' TERM -while getopts ':A:c:k:sb:g:p:m:nvH:LMhS:t:z:' arg; do - case $arg in - A) IFS=, read -r -a add <<< "$OPTARG" - ADDHOOKS+=("${add[@]}") - unset add ;; - c) CONFIG=$OPTARG ;; - k) optkver=$OPTARG ;; - s) SAVELIST=1 ;; - b) BASEDIR=$OPTARG ;; - g) GENIMG=$OPTARG ;; - h) usage ;; - p) PRESET=$OPTARG ;; - n) COLOR=0 ;; - v) QUIET=0 ;; - S) IFS=, read -r -a skip <<< "$OPTARG" - SKIPHOOKS+=("${skip[@]}") - unset skip ;; - H) if script=$(find_in_dirs "$OPTARG" "${INSTDIR[@]}"); then - . "$script" - if [[ $(type -t help) != function ]]; then - error "No help for hook $OPTARG" - exit 1 - fi - else - error "No hook '$OPTARG'" - exit 1 - fi - msg "Help for hook '$OPTARG':" - help - exit 0 ;; - L) msg "Available hooks" - for dir in "${INSTDIR[@]}"; do - ( cd "$dir" >/dev/null; printf ' %s\n' * ) - done | column -c$(tput cols) - exit 0 ;; - M) SHOW_AUTOMODS=1 ;; - t) TMPDIR=$OPTARG ;; - z) optcompress=$OPTARG ;; - :) error "option requires an argument -- '$OPTARG' (use -h for help)" - exit 1 ;; - \?) error "invalid option -- '$OPTARG' (use -h for help)" - exit 1 ;; +OPT_SHORT='A:b:c:g:H:hk:mnLMp:S:st:vz:' +OPT_LONG=('add:' 'basedir:' 'config:' 'generate:' 'hookhelp:' 'help' 'kernel:' 'listhooks' + 'automods' 'nocolor' 'preset:' 'skiphooks:' 'save' 'builddir:' 'verbose' 'compress:') + +if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then + exit 1 +fi +set -- "${OPTRET[@]}" +unset OPT_SHORT OPT_LONG OPTRET + +while :; do + case $1 in + -A|--add) + shift + IFS=, read -r -a add <<< "$1" + ADDHOOKS+=("${add[@]}") + unset add ;; + -c|--config) + shift + CONFIG=$1 ;; + -k|--kernel) + shift + optkver=$1 ;; + -s|--save) + SAVELIST=1 ;; + -b|--basedir) + shift + BASEDIR=$1 ;; + -g|--generate) + shift + GENIMG=$1 ;; + -h|--help) + usage ;; + -p|--preset) + shift + PRESET=$1 ;; + -n|--nocolor) + COLOR=0 ;; + -v|--verbose) + QUIET=0 ;; + -S|--skiphooks) + shift + IFS=, read -r -a skip <<< "$1" + SKIPHOOKS+=("${skip[@]}") + unset skip ;; + -H|--hookhelp) + shift + if script=$(find_in_dirs "$1" "${INSTDIR[@]}"); then + . "$script" + if [[ $(type -t help) != function ]]; then + error "No help for hook $1" + exit 1 + fi + else + error "No hook '$1'" + exit 1 + fi + msg "Help for hook '$1':" + help + exit 0 ;; + -L|--listhooks) + msg "Available hooks" + for dir in "${INSTDIR[@]}"; do + ( cd "$dir" >/dev/null; printf ' %s\n' * ) + done | column -c$(tput cols) + exit 0 ;; + -M|--automods) + SHOW_AUTOMODS=1 ;; + -t|--builddir) + shift + TMPDIR=$1 ;; + -z|--compress) + shift + optcompress=$1 ;; + --) + shift + break 2 ;; esac + shift done -shift $((OPTIND - 1)) if [[ -t 1 ]] && (( COLOR )); then # prefer terminal safe colored and bold text when tput is supported diff --git a/mkinitcpio.8.txt b/mkinitcpio.8.txt index 2b45f3b..10076a8 100644 --- a/mkinitcpio.8.txt +++ b/mkinitcpio.8.txt @@ -24,68 +24,68 @@ other features. Options ------- -*-A* 'hooks':: +*-A, \--add* 'hooks':: Add the additional 'hooks' to the image. These will be processed in order after all other hooks from the config file. Multiple hooks should be comma-separated. This option can be specified multiple times. -*-b* 'basedir':: +*-b, \--basedir* 'basedir':: Use 'basedir' as a starting point for gathering information about the currently running system. Default: /. -*-c* 'config':: +*-c, \--config* 'config':: Use 'config' file to generate the ramdisk. Default: /etc/mkinitcpio.conf -*-g* 'filename':: +*-g, \--generate* 'filename':: Generate a CPIO image as 'filename'. Default: no; this means nothing will be written to the filesystem unless this option is specified. -*-H* 'hookname':: +*-H, \--hookhelp* 'hookname':: Output help for hookname 'hookname'. -*-h*:: +*-h, \--help*:: Output a short overview of available command-line switches. -*-k* 'kernelversion':: +*-k, \--kernel* 'kernelversion':: Use 'kernelversion', instead of the current running kernel. This may be a path to a kernel image or a specific kernel version. If specified as a path to an image, this will always be prefixed by the 'basedir'. -*-L*:: +*-L, \--listhooks*:: List all available hooks. -*-M*:: +*-M, \--automods*:: Display modules found via autodetection. mkinitcpio will automatically try to determine which kernel modules are needed to start your computer. This option lists which modules were detected. -*-n*:: +*-n, \--nocolor*:: Disable color output. -*-p* 'preset':: +*-p, \--preset* 'preset':: Build initramfs image(s) according to specified 'preset'. This may be a file in /etc/mkinitcpio.d (without the .preset extension) or a full, absolute path to a file. -*-S* 'hooks':: +*-S, \--skiphooks* 'hooks':: Skip 'hooks' when generating the image. Multiple hooks should be comma-separated. This option can be specified multiple times. -*-s*:: +*-s, \--save*:: Saves the build directory for the initial ramdisk. Default: no; This means the directory will not be retained if this option isn't specified. Useful for debugging purposes. -*-t* 'tmpdir':: +*-t, \--builddir* 'tmpdir':: Use 'tmpdir' as the temporary build directory instead of /tmp. 'tmpdir' must exist. The 'TMPDIR' environment variable is also honored to set this location, but the command line option will take precedence. -*-v*:: +*-v, \--verbose*:: Verbose output. Outputs more information about what's happening during creation of the ramdisk. -*-z* 'compress':: +*-z, \--compress* 'compress':: Override the compression method with the 'compress' program. About Hooks -- cgit v1.2.3-24-g4f1b