mirror of
1
0
Fork 0

Add --only and --except command-line arguments

Internal to Dotbot, we use the name "skip" instead of "except", because
the latter is a keyword, and using a name like "except_" didn't seem as
nice.
This commit is contained in:
Anish Athalye 2020-03-25 21:38:39 -04:00
parent 5d83f9e797
commit 7ffaa65482
7 changed files with 133 additions and 2 deletions

View File

@ -8,6 +8,7 @@ Dotbot makes installing your dotfiles as easy as `git clone $url && cd dotfiles
- [Configuration](#configuration) - [Configuration](#configuration)
- [Directives](#directives) ([Link](#link), [Create](#create), [Shell](#shell), [Clean](#clean), [Defaults](#defaults)) - [Directives](#directives) ([Link](#link), [Create](#create), [Shell](#shell), [Clean](#clean), [Defaults](#defaults))
- [Plugins](#plugins) - [Plugins](#plugins)
- [Command-line Arguments](#command-line-arguments)
- [Wiki][wiki] - [Wiki][wiki]
--- ---
@ -359,6 +360,23 @@ Plugins are loaded using the `--plugin` and `--plugin-dir` options, using
either absolute paths or paths relative to the base directory. It is either absolute paths or paths relative to the base directory. It is
recommended that these options are added directly to the `install` script. recommended that these options are added directly to the `install` script.
## Command-line Arguments
Dotbot takes a number of command-line arguments; you can run Dotbot with
`--help`, e.g. by running `./install --help`, to see the full list of options.
Here, we highlight a couple that are particularly interesting.
### `--only`
You can call `./install --only [list of directives]`, such as `./install --only
link`, and Dotbot will only run those sections of the config file.
### `--except`
You can call `./install --except [list of directives]`, such as `./install
--except shell`, and Dotbot will run all the sections of the config file except
the ones listed.
## Wiki ## Wiki
Check out the [Dotbot wiki][wiki] for more information, tips and tricks, Check out the [Dotbot wiki][wiki] for more information, tips and tricks,

View File

@ -28,6 +28,10 @@ def add_options(parser):
action='store_true', help='disable built-in plugins') action='store_true', help='disable built-in plugins')
parser.add_argument('--plugin-dir', action='append', dest='plugin_dirs', default=[], parser.add_argument('--plugin-dir', action='append', dest='plugin_dirs', default=[],
metavar='PLUGIN_DIR', help='load all plugins in PLUGIN_DIR') metavar='PLUGIN_DIR', help='load all plugins in PLUGIN_DIR')
parser.add_argument('--only', nargs='+',
help='only run specified directives', metavar='DIRECTIVE')
parser.add_argument('--except', nargs='+', dest='skip',
help='skip specified directives', metavar='DIRECTIVE')
parser.add_argument('--no-color', dest='no_color', action='store_true', parser.add_argument('--no-color', dest='no_color', action='store_true',
help='disable color output') help='disable color output')
parser.add_argument('--version', action='store_true', parser.add_argument('--version', action='store_true',
@ -78,7 +82,7 @@ def main():
# default to directory of config file # default to directory of config file
base_directory = os.path.dirname(os.path.abspath(options.config_file)) base_directory = os.path.dirname(os.path.abspath(options.config_file))
os.chdir(base_directory) os.chdir(base_directory)
dispatcher = Dispatcher(base_directory) dispatcher = Dispatcher(base_directory, only=options.only, skip=options.skip)
success = dispatcher.dispatch(tasks) success = dispatcher.dispatch(tasks)
if success: if success:
log.info('\n==> All tasks executed successfully') log.info('\n==> All tasks executed successfully')

View File

@ -4,10 +4,12 @@ from .messenger import Messenger
from .context import Context from .context import Context
class Dispatcher(object): class Dispatcher(object):
def __init__(self, base_directory): def __init__(self, base_directory, only=None, skip=None):
self._log = Messenger() self._log = Messenger()
self._setup_context(base_directory) self._setup_context(base_directory)
self._load_plugins() self._load_plugins()
self._only = only
self._skip = skip
def _setup_context(self, base_directory): def _setup_context(self, base_directory):
path = os.path.abspath( path = os.path.abspath(
@ -20,6 +22,10 @@ class Dispatcher(object):
success = True success = True
for task in tasks: for task in tasks:
for action in task: for action in task:
if self._only is not None and action not in self._only \
or self._skip is not None and action in self._skip:
self._log.info('Skipping action %s' % action)
continue
handled = False handled = False
if action == 'defaults': if action == 'defaults':
self._context.set_defaults(task[action]) # replace, not update self._context.set_defaults(task[action]) # replace, not update

View File

@ -0,0 +1,21 @@
test_description='--except with multiple arguments'
. '../test-lib.bash'
test_expect_success 'setup' '
ln -s ${DOTFILES}/nonexistent ~/bad && touch ${DOTFILES}/y
'
test_expect_success 'run' '
run_dotbot --except clean shell <<EOF
- clean: ["~"]
- shell:
- echo "x" > ~/x
- link:
~/y: y
EOF
'
test_expect_success 'test' '
[ "$(readlink ~/bad | cut -d/ -f4-)" = "dotfiles/nonexistent" ] &&
! test -f ~/x && test -f ~/y
'

31
test/tests/except.bash Normal file
View File

@ -0,0 +1,31 @@
test_description='--except'
. '../test-lib.bash'
test_expect_success 'setup' '
echo "apple" > ${DOTFILES}/x
'
test_expect_success 'run' '
run_dotbot --except link <<EOF
- shell:
- echo "pear" > ~/y
- link:
~/x: x
EOF
'
test_expect_success 'test' '
grep "pear" ~/y && ! test -f ~/x
'
test_expect_success 'run 2' '
run_dotbot --except shell <<EOF
- shell:
- echo "pear" > ~/z
- link:
~/x: x
'
test_expect_success 'test' '
grep "apple" ~/x && ! test -f ~/z
'

View File

@ -0,0 +1,20 @@
test_description='--only with multiple arguments'
. '../test-lib.bash'
test_expect_success 'setup' '
ln -s ${DOTFILES}/nonexistent ~/bad && touch ${DOTFILES}/y
'
test_expect_success 'run' '
run_dotbot --only clean shell <<EOF
- clean: ["~"]
- shell:
- echo "x" > ~/x
- link:
~/y: y
EOF
'
test_expect_success 'test' '
! test -f ~/bad && grep "x" ~/x && ! test -f ~/y
'

31
test/tests/only.bash Normal file
View File

@ -0,0 +1,31 @@
test_description='--only'
. '../test-lib.bash'
test_expect_success 'setup' '
echo "apple" > ${DOTFILES}/x
'
test_expect_success 'run' '
run_dotbot --only shell <<EOF
- shell:
- echo "pear" > ~/y
- link:
~/x: x
EOF
'
test_expect_success 'test' '
grep "pear" ~/y && ! test -f ~/x
'
test_expect_success 'run 2' '
run_dotbot --only link <<EOF
- shell:
- echo "pear" > ~/z
- link:
~/x: x
'
test_expect_success 'test' '
grep "apple" ~/x && ! test -f ~/z
'