Add 'create' directive to create directories
This commit is contained in:
parent
cdef01e9c4
commit
5a0f6676d4
5 changed files with 106 additions and 6 deletions
33
README.md
33
README.md
|
@ -105,6 +105,10 @@ The conventional name for the configuration file is `install.conf.yaml`.
|
||||||
~/.vim: vim
|
~/.vim: vim
|
||||||
~/.vimrc: vimrc
|
~/.vimrc: vimrc
|
||||||
|
|
||||||
|
- create:
|
||||||
|
- ~/downloads
|
||||||
|
- ~/.vim/undo-history
|
||||||
|
|
||||||
- shell:
|
- shell:
|
||||||
- [git submodule update --init --recursive, Installing submodules]
|
- [git submodule update --init --recursive, Installing submodules]
|
||||||
```
|
```
|
||||||
|
@ -119,9 +123,9 @@ Configuration
|
||||||
|
|
||||||
Dotbot uses YAML or JSON-formatted configuration files to let you specify how
|
Dotbot uses YAML or JSON-formatted configuration files to let you specify how
|
||||||
to set up your dotfiles. Currently, Dotbot knows how to [link](#link) files and
|
to set up your dotfiles. Currently, Dotbot knows how to [link](#link) files and
|
||||||
folders, execute [shell](#shell) commands, and [clean](#clean) directories of
|
folders, [create](#create) folders, execute [shell](#shell) commands, and
|
||||||
broken symbolic links. Dotbot also supports user [plugins](#plugins) for custom
|
[clean](#clean) directories of broken symbolic links. Dotbot also supports user
|
||||||
commands.
|
[plugins](#plugins) for custom commands.
|
||||||
|
|
||||||
**Ideally, bootstrap configurations should be idempotent. That is, the
|
**Ideally, bootstrap configurations should be idempotent. That is, the
|
||||||
installer should be able to be run multiple times without causing any
|
installer should be able to be run multiple times without causing any
|
||||||
|
@ -219,6 +223,25 @@ the following config files equivalent:
|
||||||
relink: true
|
relink: true
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Create
|
||||||
|
|
||||||
|
Create commands specify empty directories to be created. This can be useful
|
||||||
|
for scaffolding out folders or parent folder structure required for various
|
||||||
|
apps, plugins, shell commands, etc.
|
||||||
|
|
||||||
|
#### Format
|
||||||
|
|
||||||
|
Create commands are specified as an array of directories to be created.
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- create:
|
||||||
|
- ~/projects
|
||||||
|
- ~/downloads
|
||||||
|
- ~/.vim/undo-history
|
||||||
|
```
|
||||||
|
|
||||||
### Shell
|
### Shell
|
||||||
|
|
||||||
Shell commands specify shell commands to be run. Shell commands are run in the
|
Shell commands specify shell commands to be run. Shell commands are run in the
|
||||||
|
@ -243,8 +266,8 @@ command itself.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- shell:
|
- shell:
|
||||||
- mkdir -p ~/src
|
- chsh -s $(which zsh)
|
||||||
- [mkdir -p ~/downloads, Creating downloads directory]
|
- [chsh -s $(which zsh), Making zsh the default shell]
|
||||||
-
|
-
|
||||||
command: read var && echo Your variable is $var
|
command: read var && echo Your variable is $var
|
||||||
stdin: true
|
stdin: true
|
||||||
|
|
|
@ -56,7 +56,7 @@ def main():
|
||||||
log.use_color(False)
|
log.use_color(False)
|
||||||
plugin_directories = list(options.plugin_dirs)
|
plugin_directories = list(options.plugin_dirs)
|
||||||
if not options.disable_built_in_plugins:
|
if not options.disable_built_in_plugins:
|
||||||
from .plugins import Clean, Link, Shell
|
from .plugins import Clean, Create, Link, Shell
|
||||||
plugin_paths = []
|
plugin_paths = []
|
||||||
for directory in plugin_directories:
|
for directory in plugin_directories:
|
||||||
for plugin_path in glob.glob(os.path.join(directory, '*.py')):
|
for plugin_path in glob.glob(os.path.join(directory, '*.py')):
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
from .clean import Clean
|
from .clean import Clean
|
||||||
|
from .create import Create
|
||||||
from .link import Link
|
from .link import Link
|
||||||
from .shell import Shell
|
from .shell import Shell
|
||||||
|
|
53
dotbot/plugins/create.py
Normal file
53
dotbot/plugins/create.py
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
import os
|
||||||
|
import glob
|
||||||
|
import shutil
|
||||||
|
import dotbot
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
|
class Create(dotbot.Plugin):
|
||||||
|
'''
|
||||||
|
Create empty paths.
|
||||||
|
'''
|
||||||
|
|
||||||
|
_directive = 'create'
|
||||||
|
|
||||||
|
def can_handle(self, directive):
|
||||||
|
return directive == self._directive
|
||||||
|
|
||||||
|
def handle(self, directive, data):
|
||||||
|
if directive != self._directive:
|
||||||
|
raise ValueError('Create cannot handle directive %s' % directive)
|
||||||
|
return self._process_paths(data)
|
||||||
|
|
||||||
|
def _process_paths(self, paths):
|
||||||
|
success = True
|
||||||
|
for path in paths:
|
||||||
|
path = os.path.expandvars(os.path.expanduser(path))
|
||||||
|
success &= self._create(path)
|
||||||
|
if success:
|
||||||
|
self._log.info('All paths have been set up')
|
||||||
|
else:
|
||||||
|
self._log.error('Some paths were not successfully set up')
|
||||||
|
return success
|
||||||
|
|
||||||
|
def _exists(self, path):
|
||||||
|
'''
|
||||||
|
Returns true if the path exists.
|
||||||
|
'''
|
||||||
|
path = os.path.expanduser(path)
|
||||||
|
return os.path.exists(path)
|
||||||
|
|
||||||
|
def _create(self, path):
|
||||||
|
success = True
|
||||||
|
if not self._exists(path):
|
||||||
|
self._log.debug('Trying to create path %s' % path)
|
||||||
|
try:
|
||||||
|
self._log.lowinfo('Creating path %s' % path)
|
||||||
|
os.makedirs(path)
|
||||||
|
except OSError:
|
||||||
|
self._log.warning('Failed to create path %s' % path)
|
||||||
|
success = False
|
||||||
|
else:
|
||||||
|
self._log.lowinfo('Path exists %s' % path)
|
||||||
|
return success
|
23
test/tests/create.bash
Normal file
23
test/tests/create.bash
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
test_description='create folders'
|
||||||
|
. '../test-lib.bash'
|
||||||
|
|
||||||
|
test_expect_success 'run' '
|
||||||
|
run_dotbot <<EOF
|
||||||
|
- create:
|
||||||
|
- ~/somedir
|
||||||
|
- ~/nested/somedir
|
||||||
|
EOF
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'test' '
|
||||||
|
[ -d ~/somedir ] &&
|
||||||
|
[ -d ~/nested/somedir ]
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'run 2' '
|
||||||
|
run_dotbot <<EOF
|
||||||
|
- create:
|
||||||
|
- ~/somedir
|
||||||
|
- ~/nested/somedir
|
||||||
|
EOF
|
||||||
|
'
|
Loading…
Reference in a new issue