From a9cf9fffe4b7ac6ed9f58d69e06f75681715a0e2 Mon Sep 17 00:00:00 2001 From: Ben Klein Date: Fri, 23 Feb 2018 16:56:19 -0500 Subject: [PATCH 1/2] Implement conditional linking --- README.md | 1 + dotbot/plugins/link.py | 18 ++++++++++++++++++ test/tests/link-if.bash | 2 ++ 3 files changed, 21 insertions(+) create mode 100644 test/tests/link-if.bash diff --git a/README.md b/README.md index 1e5a5fe..759647e 100644 --- a/README.md +++ b/README.md @@ -192,6 +192,7 @@ Available extended configuration parameters: | `force` | Force removes the old target, file or folder, and forces a new link (default:false) | | `relative` | Use a relative path when creating the symlink (default:false, absolute links) | | `glob` | Treat a `*` character as a wildcard, and perform link operations on all of those matches (default:false) | +| `if` | Execute this in your `$SHELL` and only link if it is successful. | #### Example diff --git a/dotbot/plugins/link.py b/dotbot/plugins/link.py index 5274e3b..bf1c5a9 100644 --- a/dotbot/plugins/link.py +++ b/dotbot/plugins/link.py @@ -2,6 +2,7 @@ import os import glob import shutil import dotbot +import subprocess class Link(dotbot.Plugin): @@ -31,6 +32,10 @@ class Link(dotbot.Plugin): use_glob = defaults.get('glob', False) if isinstance(source, dict): # extended config + test = source.get('if') + if test is not None and not self._test_success(test): + self._log.lowinfo('Skipping %s' % destination) + continue relative = source.get('relative', relative) force = source.get('force', force) relink = source.get('relink', relink) @@ -90,6 +95,19 @@ class Link(dotbot.Plugin): self._log.error('Some links were not successfully set up') return success + def _test_success(self, command): + with open(os.devnull, 'w') as devnull: + ret = subprocess.call( + command, + shell=True, + stdout=devnull, + stderr=devnull, + executable=os.environ.get('SHELL'), + ) + 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) diff --git a/test/tests/link-if.bash b/test/tests/link-if.bash new file mode 100644 index 0000000..de7948f --- /dev/null +++ b/test/tests/link-if.bash @@ -0,0 +1,2 @@ +test_description='link if' +. '../test-lib.bash' From b0ce63904c98a0f3f6547dc0d770aad22b08a8ef Mon Sep 17 00:00:00 2001 From: Anish Athalye Date: Tue, 16 Oct 2018 20:22:50 -0400 Subject: [PATCH 2/2] Add test for conditional linking --- test/tests/link-if.bash | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test/tests/link-if.bash b/test/tests/link-if.bash index de7948f..9fe6429 100644 --- a/test/tests/link-if.bash +++ b/test/tests/link-if.bash @@ -1,2 +1,32 @@ test_description='link if' . '../test-lib.bash' + +test_expect_success 'setup' ' +mkdir ~/d +echo "apple" > ${DOTFILES}/f +' + +test_expect_success 'run' ' +run_dotbot <