1
0
Fork 0
mirror of synced 2024-06-15 21:51:10 -04:00

Support if on tasks.

Just like on a link action, the value is executed in the shell. If
it has a non-zero exit code (failure), the whole task is skipped.
This allows tasks to group actions that only apply in certain
conditions (e.g. on certain OSes or in certain configurations),
and allows all actions (not just link) to be conditional.
This commit is contained in:
Dave Steinberg 2020-07-12 22:01:26 -04:00
parent c5e709d433
commit 633ae5540f
4 changed files with 15 additions and 8 deletions

View file

@ -2,6 +2,7 @@ import os
from .plugin import Plugin from .plugin import Plugin
from .messenger import Messenger from .messenger import Messenger
from .context import Context from .context import Context
from .util import test_success
class Dispatcher(object): class Dispatcher(object):
def __init__(self, base_directory, only=None, skip=None): def __init__(self, base_directory, only=None, skip=None):
@ -21,7 +22,13 @@ class Dispatcher(object):
def dispatch(self, tasks): def dispatch(self, tasks):
success = True success = True
for task in tasks: for task in tasks:
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.lowinfo('Skipping task')
continue
for action in task: for action in task:
if action == 'if':
continue
if self._only is not None and action not in self._only \ if self._only is not None and action not in self._only \
or self._skip is not None and action in self._skip: or self._skip is not None and action in self._skip:
self._log.info('Skipping action %s' % action) self._log.info('Skipping action %s' % action)

View file

@ -47,7 +47,7 @@ class Link(dotbot.Plugin):
path = self._default_source(destination, source.get('path')) path = self._default_source(destination, source.get('path'))
else: else:
path = self._default_source(destination, source) 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) self._log.lowinfo('Skipping %s' % destination)
continue continue
path = os.path.expandvars(os.path.expanduser(path)) path = os.path.expandvars(os.path.expanduser(path))
@ -105,12 +105,6 @@ class Link(dotbot.Plugin):
self._log.error('Some links were not successfully set up') self._log.error('Some links were not successfully set up')
return success 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): def _default_source(self, destination, source):
if source is None: if source is None:
basename = os.path.basename(destination) basename = os.path.basename(destination)

View file

@ -1 +1 @@
from .common import shell_command from .common import shell_command, test_success

View file

@ -32,3 +32,9 @@ def shell_command(command, cwd=None, enable_stdin=False, enable_stdout=False, en
stderr=stderr, stderr=stderr,
cwd=cwd 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