Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support named, conditional tasks #229

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions dotbot/dispatcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from .plugin import Plugin
from .messenger import Messenger
from .context import Context
from .util import test_success

class Dispatcher(object):
def __init__(self, base_directory, only=None, skip=None):
Expand All @@ -21,29 +22,43 @@ def _setup_context(self, base_directory):
def dispatch(self, tasks):
success = True
for task in tasks:
for action in task:
actions = task
name = task.get('task', None)
if name is not None:
test = task.get('if', None)
if test is not None and not test_success(test, cwd=self._context.base_directory(), log=self._log):
self._log.info('Skipping task %s' % name)
actions = []
else:
actions = task.get('actions', [])
if not actions:
self._log.info('Task %s has no actions' % name)
else:
self._log.info('Starting task %s' % name)
for action in actions:
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
if action == 'defaults':
self._context.set_defaults(task[action]) # replace, not update
self._context.set_defaults(actions[action]) # replace, not update
handled = True
# keep going, let other plugins handle this if they want
for plugin in self._plugins:
if plugin.can_handle(action):
try:
success &= plugin.handle(action, task[action])
success &= plugin.handle(action, actions[action])
handled = True
except Exception as err:
self._log.error(
'An error was encountered while executing action %s' %
action)
self._log.debug(err)
if not handled:
success = False
self._log.error('Action %s not handled' % action)
if name and actions:
self._log.info('Task %s completed' % name)
return success

def _load_plugins(self):
Expand Down
8 changes: 1 addition & 7 deletions dotbot/plugins/link.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def _process_links(self, links):
path = self._default_source(destination, source.get('path'))
else:
path = self._default_source(destination, source)
if test is not None and not self._test_success(test):
if test is not None and not dotbot.util.test_success(test, cwd=self._context.base_directory(), log=self._log):
self._log.lowinfo('Skipping %s' % destination)
continue
path = os.path.expandvars(os.path.expanduser(path))
Expand Down Expand Up @@ -105,12 +105,6 @@ def _process_links(self, links):
self._log.error('Some links were not successfully set up')
return success

def _test_success(self, command):
ret = dotbot.util.shell_command(command, cwd=self._context.base_directory())
if ret != 0:
self._log.debug('Test \'%s\' returned false' % command)
return ret == 0

def _default_source(self, destination, source):
if source is None:
basename = os.path.basename(destination)
Expand Down
2 changes: 1 addition & 1 deletion dotbot/util/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from .common import shell_command
from .common import shell_command, test_success
6 changes: 6 additions & 0 deletions dotbot/util/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,9 @@ def shell_command(command, cwd=None, enable_stdin=False, enable_stdout=False, en
stderr=stderr,
cwd=cwd
)

def test_success(command, cwd=None, log=None):
ret = shell_command(command, cwd=cwd)
if ret != 0 and log != None:
log.debug('Test \'%s\' returned false' % command)
return ret == 0