summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCasey Rodarmor <casey@rodarmor.com>2016-11-18 15:21:27 -0800
committerAnish Athalye <me@anishathalye.com>2016-11-23 14:11:45 -0500
commitd2e20c77db3811d8d0ef640a743f8dcc85075fdc (patch)
tree8e1b400afc354b383d16201d1855cc0aa6f472e4
parentb482cbda585848c0d5f5345711fe338e319c0adf (diff)
Allow empty link sources
If the source for a link is null, use the basename of the destination with a single leading '.' removed, if present.
-rw-r--r--README.md43
-rw-r--r--plugins/link.py14
-rw-r--r--test/tests/link-default-source.bash26
3 files changed, 81 insertions, 2 deletions
diff --git a/README.md b/README.md
index 6fbc687..25cff54 100644
--- a/README.md
+++ b/README.md
@@ -189,6 +189,49 @@ symbolic link should have a relative path.
path: zshrc
```
+If the source location is omitted or set to `null`, Dotbot will use the
+basename of the destination, with a leading `.` stripped if present. This makes
+the following three config files equivalent:
+
+```yaml
+- link:
+ ~/bin/ack: ack
+ ~/.vim: vim
+ ~/.vimrc:
+ relink: true
+ path: vimrc
+ ~/.zshrc:
+ force: true
+ path: zshrc
+```
+
+```yaml
+- link:
+ ~/bin/ack:
+ ~/.vim:
+ ~/.vimrc:
+ relink: true
+ ~/.zshrc:
+ force: true
+```
+
+```json
+[
+ {
+ "link": {
+ "~/bin/ack": null,
+ "~/.vim": null,
+ "~/.vimrc": {
+ "relink": true
+ },
+ "~/.zshrc": {
+ "force": true
+ }
+ }
+ }
+]
+```
+
### Shell
Shell commands specify shell commands to be run. Shell commands are run in the
diff --git a/plugins/link.py b/plugins/link.py
index ff8685e..ee64175 100644
--- a/plugins/link.py
+++ b/plugins/link.py
@@ -30,9 +30,9 @@ class Link(dotbot.Plugin):
force = source.get('force', force)
relink = source.get('relink', relink)
create = source.get('create', create)
- path = source['path']
+ path = self._default_source(destination, source.get('path'))
else:
- path = source
+ path = self._default_source(destination, source)
path = os.path.expandvars(os.path.expanduser(path))
if create:
success &= self._create(destination)
@@ -46,6 +46,16 @@ class Link(dotbot.Plugin):
self._log.error('Some links were not successfully set up')
return success
+ def _default_source(self, destination, source):
+ if source is None:
+ basename = os.path.basename(destination)
+ if basename.startswith('.'):
+ return basename[1:]
+ else:
+ return basename
+ else:
+ return source
+
def _is_link(self, path):
'''
Returns true if the path is a symbolic link.
diff --git a/test/tests/link-default-source.bash b/test/tests/link-default-source.bash
new file mode 100644
index 0000000..60527d9
--- /dev/null
+++ b/test/tests/link-default-source.bash
@@ -0,0 +1,26 @@
+test_description='link uses destination if source is null'
+. '../test-lib.bash'
+
+test_expect_success 'setup' '
+echo "apple" > ${DOTFILES}/f &&
+echo "grape" > ${DOTFILES}/fd
+'
+
+test_expect_success 'run' '
+run_dotbot <<EOF
+- link:
+ ~/f:
+ ~/.f:
+ ~/fd:
+ force: false
+ ~/.fd:
+ force: false
+EOF
+'
+
+test_expect_success 'test' '
+grep "apple" ~/f &&
+grep "apple" ~/.f &&
+grep "grape" ~/fd &&
+grep "grape" ~/.fd
+'