mirror of
1
0
Fork 0

Add 'create' directive to create directories

This commit is contained in:
Jesse Leite 2019-10-06 01:13:51 -04:00 committed by Anish Athalye
parent cdef01e9c4
commit 5a0f6676d4
5 changed files with 106 additions and 6 deletions

View File

@ -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

View File

@ -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')):

View File

@ -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
View 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
View 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
'