Add ignore-missing option to link
This commit is contained in:
parent
a8380f6496
commit
eabd84bce1
3 changed files with 36 additions and 6 deletions
|
@ -178,6 +178,7 @@ Available extended configuration parameters:
|
||||||
| `relative` | Use a relative path to the source when creating the symlink (default:false, absolute links) |
|
| `relative` | Use a relative path to the source 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) |
|
| `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. |
|
| `if` | Execute this in your `$SHELL` and only link if it is successful. |
|
||||||
|
| `ignore-missing` | Do not fail if the source is missing and create the link anyway (default:false) |
|
||||||
|
|
||||||
#### Example
|
#### Example
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ class Link(dotbot.Plugin):
|
||||||
create = defaults.get('create', False)
|
create = defaults.get('create', False)
|
||||||
use_glob = defaults.get('glob', False)
|
use_glob = defaults.get('glob', False)
|
||||||
test = defaults.get('if', None)
|
test = defaults.get('if', None)
|
||||||
|
ignore_missing = defaults.get('ignore-missing', False)
|
||||||
if isinstance(source, dict):
|
if isinstance(source, dict):
|
||||||
# extended config
|
# extended config
|
||||||
test = source.get('if', test)
|
test = source.get('if', test)
|
||||||
|
@ -39,6 +40,7 @@ class Link(dotbot.Plugin):
|
||||||
relink = source.get('relink', relink)
|
relink = source.get('relink', relink)
|
||||||
create = source.get('create', create)
|
create = source.get('create', create)
|
||||||
use_glob = source.get('glob', use_glob)
|
use_glob = source.get('glob', use_glob)
|
||||||
|
ignore_missing = source.get('ignore-missing', ignore_missing)
|
||||||
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)
|
||||||
|
@ -67,7 +69,7 @@ class Link(dotbot.Plugin):
|
||||||
success &= self._create(destination)
|
success &= self._create(destination)
|
||||||
if force or relink:
|
if force or relink:
|
||||||
success &= self._delete(path, destination, relative, force)
|
success &= self._delete(path, destination, relative, force)
|
||||||
success &= self._link(path, destination, relative)
|
success &= self._link(path, destination, relative, ignore_missing)
|
||||||
else:
|
else:
|
||||||
self._log.lowinfo("Globs from '" + path + "': " + str(glob_results))
|
self._log.lowinfo("Globs from '" + path + "': " + str(glob_results))
|
||||||
glob_base = path[:glob_star_loc]
|
glob_base = path[:glob_star_loc]
|
||||||
|
@ -78,18 +80,22 @@ class Link(dotbot.Plugin):
|
||||||
success &= self._create(glob_link_destination)
|
success &= self._create(glob_link_destination)
|
||||||
if force or relink:
|
if force or relink:
|
||||||
success &= self._delete(glob_full_item, glob_link_destination, relative, force)
|
success &= self._delete(glob_full_item, glob_link_destination, relative, force)
|
||||||
success &= self._link(glob_full_item, glob_link_destination, relative)
|
success &= self._link(glob_full_item, glob_link_destination, relative, ignore_missing)
|
||||||
else:
|
else:
|
||||||
if create:
|
if create:
|
||||||
success &= self._create(destination)
|
success &= self._create(destination)
|
||||||
if not self._exists(os.path.join(self._context.base_directory(), path)):
|
if not ignore_missing and not self._exists(os.path.join(self._context.base_directory(), path)):
|
||||||
|
# we seemingly check this twice (here and in _link) because
|
||||||
|
# if the file doesn't exist and force is True, we don't
|
||||||
|
# want to remove the original (this is tested by
|
||||||
|
# link-force-leaves-when-nonexistent.bash)
|
||||||
success = False
|
success = False
|
||||||
self._log.warning('Nonexistent source %s -> %s' %
|
self._log.warning('Nonexistent source %s -> %s' %
|
||||||
(destination, path))
|
(destination, path))
|
||||||
continue
|
continue
|
||||||
if force or relink:
|
if force or relink:
|
||||||
success &= self._delete(path, destination, relative, force)
|
success &= self._delete(path, destination, relative, force)
|
||||||
success &= self._link(path, destination, relative)
|
success &= self._link(path, destination, relative, ignore_missing)
|
||||||
if success:
|
if success:
|
||||||
self._log.info('All links have been set up')
|
self._log.info('All links have been set up')
|
||||||
else:
|
else:
|
||||||
|
@ -189,7 +195,7 @@ class Link(dotbot.Plugin):
|
||||||
destination_dir = os.path.dirname(destination)
|
destination_dir = os.path.dirname(destination)
|
||||||
return os.path.relpath(source, destination_dir)
|
return os.path.relpath(source, destination_dir)
|
||||||
|
|
||||||
def _link(self, source, link_name, relative):
|
def _link(self, source, link_name, relative, ignore_missing):
|
||||||
'''
|
'''
|
||||||
Links link_name to source.
|
Links link_name to source.
|
||||||
|
|
||||||
|
@ -209,7 +215,7 @@ class Link(dotbot.Plugin):
|
||||||
# we need to use absolute_source below because our cwd is the dotfiles
|
# we need to use absolute_source below because our cwd is the dotfiles
|
||||||
# directory, and if source is relative, it will be relative to the
|
# directory, and if source is relative, it will be relative to the
|
||||||
# destination directory
|
# destination directory
|
||||||
elif not self._exists(link_name) and self._exists(absolute_source):
|
elif not self._exists(link_name) and (ignore_missing or self._exists(absolute_source)):
|
||||||
try:
|
try:
|
||||||
os.symlink(source, destination)
|
os.symlink(source, destination)
|
||||||
except OSError:
|
except OSError:
|
||||||
|
|
23
test/tests/link-ignore-missing.bash
Normal file
23
test/tests/link-ignore-missing.bash
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
test_description='link is created even if source is missing'
|
||||||
|
. '../test-lib.bash'
|
||||||
|
|
||||||
|
test_expect_failure 'run' '
|
||||||
|
run_dotbot <<EOF
|
||||||
|
- link:
|
||||||
|
~/missing_link:
|
||||||
|
path: missing
|
||||||
|
EOF
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'run 2' '
|
||||||
|
run_dotbot <<EOF
|
||||||
|
- link:
|
||||||
|
~/missing_link:
|
||||||
|
path: missing
|
||||||
|
ignore-missing: true
|
||||||
|
EOF
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'test' '
|
||||||
|
test -L ~/missing_link
|
||||||
|
'
|
Loading…
Reference in a new issue