1
0
Fork 0
mirror of synced 2024-11-16 21:45:35 -05:00

Merge branch 'ssbanerje/master'

This commit is contained in:
Anish Athalye 2021-10-03 20:37:24 -04:00
commit fb18c9b112
3 changed files with 51 additions and 3 deletions

View file

@ -42,6 +42,8 @@ def add_options(parser):
help='disable color output')
parser.add_argument('--version', action='store_true',
help='show program\'s version number and exit')
parser.add_argument('-x', '--exit-on-failure', dest='exit_on_failure', action='store_true',
help='exit after first failed directive')
def read_config(config_file):
reader = ConfigReader(config_file)
@ -107,7 +109,8 @@ def main():
# default to directory of config file
base_directory = os.path.dirname(os.path.abspath(options.config_file))
os.chdir(base_directory)
dispatcher = Dispatcher(base_directory, only=options.only, skip=options.skip, options=options)
dispatcher = Dispatcher(base_directory, only=options.only, skip=options.skip,
exit_on_failure=options.exit_on_failure, options=options)
success = dispatcher.dispatch(tasks)
if success:
log.info('\n==> All tasks executed successfully')

View file

@ -5,12 +5,14 @@ from .messenger import Messenger
from .context import Context
class Dispatcher(object):
def __init__(self, base_directory, only=None, skip=None, options=Namespace()):
def __init__(self, base_directory, only=None, skip=None, exit_on_failure=False,
options=Namespace()):
self._log = Messenger()
self._setup_context(base_directory, options)
self._load_plugins()
self._only = only
self._skip = skip
self._exit = exit_on_failure
def _setup_context(self, base_directory, options):
path = os.path.abspath(
@ -36,16 +38,27 @@ class Dispatcher(object):
for plugin in self._plugins:
if plugin.can_handle(action):
try:
success &= plugin.handle(action, task[action])
local_success = plugin.handle(action, task[action])
if not local_success and self._exit:
# The action has failed exit
self._log.error('Action %s failed' % action)
return False
success &= local_success
handled = True
except Exception as err:
self._log.error(
'An error was encountered while executing action %s' %
action)
self._log.debug(err)
if self._exit:
# There was an execption exit
return False
if not handled:
success = False
self._log.error('Action %s not handled' % action)
if self._exit:
# Invalid action exit
return False
return success
def _load_plugins(self):

View file

@ -0,0 +1,32 @@
test_description='test exit on failure'
. '../test-lib.bash'
test_expect_success 'setup' '
echo "apple" > ${DOTFILES}/f1 &&
echo "orange" > ${DOTFILES}/f2 &&
echo "pineapple" > ${DOTFILES}/f3
'
test_expect_failure 'run_case1' '
run_dotbot -x <<EOF
- shell:
- "this_is_not_a_command"
- link:
~/f1:
EOF
'
test_expect_failure 'run_case2' '
run_dotbot -x <<EOF
- link:
~/f2:
- shell:
- "this_is_not_a_command"
- link:
~/f3:
EOF
'
test_expect_success 'test' '
[[ ! -f ~/f1 ]] && [[ -f ~/f2 ]] && [[ ! -f ~/f3 ]]
'