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:
parent
5d83f9e797
commit
7ffaa65482
7 changed files with 133 additions and 2 deletions
18
README.md
18
README.md
|
@ -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,
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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
|
||||||
|
|
21
test/tests/except-multi.bash
Normal file
21
test/tests/except-multi.bash
Normal 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
31
test/tests/except.bash
Normal 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
|
||||||
|
'
|
20
test/tests/only-multi.bash
Normal file
20
test/tests/only-multi.bash
Normal 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
31
test/tests/only.bash
Normal 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
|
||||||
|
'
|
Loading…
Reference in a new issue