mirror of
https://github.com/deadc0de6/dotdrop.git
synced 2026-02-11 13:44:16 +00:00
adding mkdocs
This commit is contained in:
126
docs/config/config-variables.md
Normal file
126
docs/config/config-variables.md
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
# Config variables
|
||||||
|
|
||||||
|
* [Config available variables](available-variables)
|
||||||
|
* [Variables entry](#variables-entry)
|
||||||
|
* [Profile variables](#profile-variables)
|
||||||
|
* [Config variables in templates](#config-variables-in-templates)
|
||||||
|
* [Interpreted variables entry](#interpreted-variables-entry)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Config available variables
|
||||||
|
|
||||||
|
Multiple variables can be used within the config file to
|
||||||
|
parametrize following elements of the config:
|
||||||
|
|
||||||
|
* dotfiles `src` and `dst` paths (see [Dynamic dotfile paths](config#dynamic-dotfile-paths))
|
||||||
|
* external path specifications
|
||||||
|
* `import_variables`
|
||||||
|
* `import_actions`
|
||||||
|
* `import_configs`
|
||||||
|
* profiles's `import`
|
||||||
|
|
||||||
|
`actions` and `transformations` also support the use of variables
|
||||||
|
but those are resolved when the action/transformation is executed
|
||||||
|
(see [Dynamic actions](config#dynamic-actions),
|
||||||
|
[Dynamic transformations](config#dynamic-transformations) and [Templating](templating)).
|
||||||
|
|
||||||
|
Following variables are available in the config files:
|
||||||
|
|
||||||
|
* [variables defined in the config](#variables-entry)
|
||||||
|
* [interpreted variables defined in the config](#interpreted-variables-entry)
|
||||||
|
* [profile variables defined in the config](#profile-variables)
|
||||||
|
* environment variables: `{{@@ env['MY_VAR'] @@}}`
|
||||||
|
* dotdrop header: `{{@@ header() @@}}` (see [Dotdrop header](templating#dotdrop-header))
|
||||||
|
|
||||||
|
As well as all template methods (see [Available methods](templating#available-methods))
|
||||||
|
|
||||||
|
# Variables entry
|
||||||
|
|
||||||
|
Variables defined in the `variables` entry are made available within the config file.
|
||||||
|
|
||||||
|
Config variables are recursively evaluated what means that
|
||||||
|
a config like the below
|
||||||
|
```yaml
|
||||||
|
variables:
|
||||||
|
var1: "var1"
|
||||||
|
var2: "{{@@ var1 @@}} var2"
|
||||||
|
var3: "{{@@ var2 @@}} var3"
|
||||||
|
var4: "{{@@ dvar4 @@}}"
|
||||||
|
dynvariables:
|
||||||
|
dvar1: "echo dvar1"
|
||||||
|
dvar2: "{{@@ dvar1 @@}} dvar2"
|
||||||
|
dvar3: "{{@@ dvar2 @@}} dvar3"
|
||||||
|
dvar4: "echo {{@@ var3 @@}}"
|
||||||
|
```
|
||||||
|
|
||||||
|
will result in the following available variables:
|
||||||
|
* var1: `var1`
|
||||||
|
* var2: `var1 var2`
|
||||||
|
* var3: `var1 var2 var3`
|
||||||
|
* var4: `echo var1 var2 var3`
|
||||||
|
* dvar1: `dvar1`
|
||||||
|
* dvar2: `dvar1 dvar2`
|
||||||
|
* dvar3: `dvar1 dvar2 dvar3`
|
||||||
|
* dvar4: `var1 var2 var3`
|
||||||
|
|
||||||
|
# Profile variables
|
||||||
|
|
||||||
|
Profile variables will take precedence over globally defined variables.
|
||||||
|
This means that you could do something like this:
|
||||||
|
```yaml
|
||||||
|
variables:
|
||||||
|
git_email: home@email.com
|
||||||
|
dotfiles:
|
||||||
|
f_gitconfig:
|
||||||
|
dst: ~/.gitconfig
|
||||||
|
src: gitconfig
|
||||||
|
profiles:
|
||||||
|
work:
|
||||||
|
dotfiles:
|
||||||
|
- f_gitconfig
|
||||||
|
variables:
|
||||||
|
git_email: work@email.com
|
||||||
|
private:
|
||||||
|
dotfiles:
|
||||||
|
- f_gitconfig
|
||||||
|
```
|
||||||
|
|
||||||
|
# Config variables in templates
|
||||||
|
|
||||||
|
`variables` and `dynvariables` are also made available in templates
|
||||||
|
(see [Template variables](templating#template-variables)).
|
||||||
|
|
||||||
|
Variables in the config file
|
||||||
|
```yaml
|
||||||
|
variables:
|
||||||
|
var1: some variable content
|
||||||
|
var2: some other content
|
||||||
|
```
|
||||||
|
|
||||||
|
Can be used in any templates like this
|
||||||
|
```
|
||||||
|
var1 value is: {{@@ var1 @@}}
|
||||||
|
```
|
||||||
|
|
||||||
|
# Interpreted variables entry
|
||||||
|
|
||||||
|
It is also possible to have *dynamic* variables in the sense that their
|
||||||
|
content will be interpreted by the shell before being substituted.
|
||||||
|
|
||||||
|
These need to be defined in the config file under the entry `dynvariables`.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
```yaml
|
||||||
|
dynvariables:
|
||||||
|
dvar1: head -1 /proc/meminfo
|
||||||
|
dvar2: "echo 'this is some test' | rev | tr ' ' ','"
|
||||||
|
dvar3: /tmp/my_shell_script.sh
|
||||||
|
user: "echo $USER"
|
||||||
|
config_file: test -f "{{@@ user_config @@}}" && echo "{{@@ user_config @@}}" || echo "{{@@ dfl_config @@}}"
|
||||||
|
variables:
|
||||||
|
user_config: "profile_{{@@ user @@}}_uid.yaml"
|
||||||
|
dfl_config: "profile_default.yaml"
|
||||||
|
```
|
||||||
|
|
||||||
|
They have the same properties as [Variables](#variables-entry).
|
||||||
581
docs/config/config.md
Normal file
581
docs/config/config.md
Normal file
@@ -0,0 +1,581 @@
|
|||||||
|
# Config
|
||||||
|
|
||||||
|
The config file used by dotdrop is
|
||||||
|
[config.yaml](https://github.com/deadc0de6/dotdrop/blob/master/config.yaml).
|
||||||
|
|
||||||
|
* [Location](#location)
|
||||||
|
* [Format](#format)
|
||||||
|
* [Actions](#actions)
|
||||||
|
* [Transformations](#transformations)
|
||||||
|
* [Variables](#variables)
|
||||||
|
* [Interpreted variables](#interpreted-variables)
|
||||||
|
* Config details on
|
||||||
|
* [Symlinking dotfiles](#symlinking-dotfiles)
|
||||||
|
* [All dotfiles for a profile](#all-dotfiles-for-a-profile)
|
||||||
|
* [Include dotfiles from another profile](#include-dotfiles-from-another-profile)
|
||||||
|
* [Import profile dotfiles from file](#import-profile-dotfiles-from-file)
|
||||||
|
* [Import variables from file](#import-variables-from-file)
|
||||||
|
* [Import actions from file](#import-actions-from-file)
|
||||||
|
* [Import config files](#import-config-files)
|
||||||
|
* Dynamic elements
|
||||||
|
* [Dynamic dotfile paths](#dynamic-dotfile-paths)
|
||||||
|
* [Dynamic actions](#dynamic-actions)
|
||||||
|
* [Dynamic transformations](#dynamic-transformations)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Location
|
||||||
|
|
||||||
|
Unless specified dotdrop will look in following places for the config file (`config.yaml`)
|
||||||
|
and use the first one found
|
||||||
|
|
||||||
|
* current/working directory or the directory where [dotdrop.sh](https://github.com/deadc0de6/dotdrop/blob/master/dotdrop.sh) is located if used
|
||||||
|
* `${XDG_CONFIG_HOME}/dotdrop/`
|
||||||
|
* `~/.config/dotdrop/`
|
||||||
|
* `/etc/xdg/dotdrop/`
|
||||||
|
* `/etc/dotdrop/`
|
||||||
|
|
||||||
|
You can force dotdrop to use a different file either by using the `-c --cfg` cli switch
|
||||||
|
or by defining the `DOTDROP_CONFIG` environment variable.
|
||||||
|
|
||||||
|
# Format
|
||||||
|
|
||||||
|
Dotdrop config file uses [yaml](https://yaml.org/) syntax.
|
||||||
|
|
||||||
|
Content Format:
|
||||||
|
|
||||||
|
* **config** entry (mandatory): contains settings for the deployment
|
||||||
|
* `backup`: create a backup of the dotfile in case it differs from the
|
||||||
|
one that will be installed by dotdrop (default *true*)
|
||||||
|
* `banner`: display the banner (default *true*)
|
||||||
|
* `cmpignore`: list of patterns to ignore when comparing, apply to all dotfiles
|
||||||
|
(enclose in quotes when using wildcards, see [ignore patterns](ignore-pattern))
|
||||||
|
* `create`: create directory hierarchy when installing dotfiles if
|
||||||
|
it doesn't exist (default *true*)
|
||||||
|
* `default_actions`: list of action's keys to execute for all installed dotfile
|
||||||
|
(see [Use actions](usage-actions))
|
||||||
|
* `diff_command`: the diff command to use for diffing files (default `diff -r -u {0} {1}`)
|
||||||
|
* `dotpath`: path to the directory containing the dotfiles to be managed (default `dotfiles`)
|
||||||
|
by dotdrop (absolute path or relative to the config file location)
|
||||||
|
* `filter_file`: list of paths to load templating filters from
|
||||||
|
(see [Templating available filters](templating#available-filters))
|
||||||
|
* `func_file`: list of paths to load templating functions from
|
||||||
|
(see [Templating available methods](templating#available-methods))
|
||||||
|
* `ignoreempty`: do not deploy template if empty (default *false*)
|
||||||
|
* `import_actions`: list of paths to load actions from
|
||||||
|
(absolute path or relative to the config file location,
|
||||||
|
see [Import actions from file](#import-actions-from-file))
|
||||||
|
* `import_configs`: list of config file paths to be imported in
|
||||||
|
the current config (absolute path or relative to the current config file location,
|
||||||
|
see [Import config files](#import-config-files))
|
||||||
|
* `import_variables`: list of paths to load variables from
|
||||||
|
(absolute path or relative to the config file location,
|
||||||
|
see [Import variables from file](#import-variables-from-file))
|
||||||
|
* `instignore`: list of patterns to ignore when installing, apply to all dotfiles
|
||||||
|
(enclose in quotes when using wildcards, see [ignore patterns](ignore-pattern))
|
||||||
|
* `keepdot`: preserve leading dot when importing hidden file in the `dotpath` (default *false*)
|
||||||
|
* `link_dotfile_default`: set dotfile's `link` attribute to this value when undefined.
|
||||||
|
Possible values: *nolink*, *link*, *link_children* (default: *nolink*,
|
||||||
|
see [Symlinking dotfiles](#symlinking-dotfiles))
|
||||||
|
* `link_on_import`: set dotfile's `link` attribute to this value when importing.
|
||||||
|
Possible values: *nolink*, *link*, *link_children* (default: *nolink*,
|
||||||
|
see [Symlinking dotfiles](#symlinking-dotfiles))
|
||||||
|
* `longkey`: use long keys for dotfiles when importing (default *false*,
|
||||||
|
see [Import dotfiles](usage#import-dotfiles))
|
||||||
|
* `minversion`: (*for internal use, do not modify*) provides the minimal dotdrop version to use
|
||||||
|
* `showdiff`: on install show a diff before asking to overwrite (see `--showdiff`) (default *false*)
|
||||||
|
* `upignore`: list of patterns to ignore when updating, apply to all dotfiles
|
||||||
|
(enclose in quotes when using wildcards, see [ignore patterns](ignore-pattern))
|
||||||
|
* `workdir`: path to the directory where templates are installed before being symlinked
|
||||||
|
when using `link:link` or `link:link_children`
|
||||||
|
(absolute path or relative to the config file location, defaults to *~/.config/dotdrop*)
|
||||||
|
* DEPRECATED `link_by_default`: when importing a dotfile set `link` to that value per default (default *false*)
|
||||||
|
|
||||||
|
* **dotfiles** entry (mandatory): a list of dotfiles
|
||||||
|
* `dst`: where this dotfile needs to be deployed
|
||||||
|
(dotfile with empty `dst` are ignored and considered installed,
|
||||||
|
can use `variables` and `dynvariables`, make sure to quote)
|
||||||
|
* `src`: dotfile path within the `dotpath`
|
||||||
|
(dotfile with empty `src` are ignored and considered installed,
|
||||||
|
can use `variables` and `dynvariables`, make sure to quote)
|
||||||
|
* `link`: define how this dotfile is installed.
|
||||||
|
Possible values: *nolink*, *link*, *link_children* (default: `link_dotfile_default`,
|
||||||
|
see [Symlinking dotfiles](#symlinking-dotfiles))
|
||||||
|
* `actions`: list of action keys that need to be defined in the **actions** entry below
|
||||||
|
(see [Use actions](usage-actions))
|
||||||
|
* `cmpignore`: list of patterns to ignore when comparing (enclose in quotes when using wildcards,
|
||||||
|
see [ignore patterns](ignore-pattern))
|
||||||
|
* `ignoreempty`: if true empty template will not be deployed (defaults to the value of `ignoreempty` above)
|
||||||
|
* `instignore`: list of patterns to ignore when installing (enclose in quotes when using wildcards,
|
||||||
|
see [ignore patterns](ignore-pattern))
|
||||||
|
* `trans_read`: transformation key to apply when installing this dotfile
|
||||||
|
(must be defined in the **trans_read** entry below, see [Use transformations](usage-transformations))
|
||||||
|
* `trans_write`: transformation key to apply when updating this dotfile
|
||||||
|
(must be defined in the **trans_write** entry below, see [Use transformations](usage-transformations))
|
||||||
|
* `upignore`: list of patterns to ignore when updating (enclose in quotes when using wildcards,
|
||||||
|
see [ignore patterns](ignore-pattern))
|
||||||
|
* DEPRECATED `link_children`: replaced by `link: link_children`
|
||||||
|
* DEPRECATED `trans`: replaced by `trans_read`
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
<dotfile-key-name>:
|
||||||
|
dst: <where-this-file-is-deployed>
|
||||||
|
src: <filename-within-the-dotpath>
|
||||||
|
## Optional
|
||||||
|
link: (nolink|link|link_children)
|
||||||
|
ignoreempty: (true|false)
|
||||||
|
cmpignore:
|
||||||
|
- "<ignore-pattern>"
|
||||||
|
upignore:
|
||||||
|
- "<ignore-pattern>"
|
||||||
|
instignore:
|
||||||
|
- "<ignore-pattern>"
|
||||||
|
actions:
|
||||||
|
- <action-key>
|
||||||
|
trans_read: <transformation-key>
|
||||||
|
trans_write: <transformation-key>
|
||||||
|
```
|
||||||
|
|
||||||
|
* **profiles** entry (mandatory): a list of profiles with the different dotfiles that
|
||||||
|
need to be managed
|
||||||
|
* `dotfiles`: the dotfiles associated to this profile
|
||||||
|
* `import`: list of paths containing dotfiles keys for this profile
|
||||||
|
(absolute path or relative to the config file location,
|
||||||
|
see [Import profile dotfiles from file](#import-profile-dotfiles-from-file)).
|
||||||
|
* `include`: include all elements (dotfiles, actions, (dyn)variables, etc) from another profile
|
||||||
|
(see [Include dotfiles from another profile](#include-dotfiles-from-another-profile))
|
||||||
|
* `variables`: profile specific variables
|
||||||
|
(see [Variables](#variables))
|
||||||
|
* `dynvariables`: profile specific interpreted variables
|
||||||
|
(see [Interpreted variables](#interpreted-variables))
|
||||||
|
* `actions`: list of action keys that need to be defined in the **actions** entry below
|
||||||
|
(see [Use actions](usage-actions))
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
<some-profile-name-usually-the-hostname>:
|
||||||
|
dotfiles:
|
||||||
|
- <some-dotfile-key-name-defined-above>
|
||||||
|
- <some-other-dotfile-key-name>
|
||||||
|
- ...
|
||||||
|
## Optional
|
||||||
|
include:
|
||||||
|
- <some-other-profile>
|
||||||
|
- ...
|
||||||
|
variables:
|
||||||
|
<name>: <value>
|
||||||
|
dynvariables:
|
||||||
|
<name>: <value>
|
||||||
|
actions:
|
||||||
|
- <some-action>
|
||||||
|
- ...
|
||||||
|
import:
|
||||||
|
- <some-path>
|
||||||
|
- ...
|
||||||
|
```
|
||||||
|
|
||||||
|
* **actions** entry (optional): a list of actions (see [Use actions](usage-actions))
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
actions:
|
||||||
|
<action-key>: <command-to-execute>
|
||||||
|
```
|
||||||
|
|
||||||
|
* **trans_read** entry (optional): a list of transformations (see [Use transformations](usage-transformations))
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
trans_read:
|
||||||
|
<trans-key>: <command-to-execute>
|
||||||
|
```
|
||||||
|
|
||||||
|
* **trans_write** entry (optional): a list of write transformations (see [Use transformations](usage-transformations))
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
trans_write:
|
||||||
|
<trans-key>: <command-to-execute>
|
||||||
|
```
|
||||||
|
|
||||||
|
* **variables** entry (optional): a list of variables (see [Variables](#variables))
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
variables:
|
||||||
|
<variable-name>: <variable-content>
|
||||||
|
```
|
||||||
|
|
||||||
|
* **dynvariables** entry (optional): a list of interpreted variables
|
||||||
|
(see [Interpreted variables](#interpreted-variables))
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
dynvariables:
|
||||||
|
<variable-name>: <shell-oneliner>
|
||||||
|
```
|
||||||
|
|
||||||
|
# Actions
|
||||||
|
|
||||||
|
see [Actions](usage-actions)
|
||||||
|
|
||||||
|
# Transformations
|
||||||
|
|
||||||
|
see [Transformations](usage-transformations)
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
|
||||||
|
see [Variables](config-variables)
|
||||||
|
|
||||||
|
# Interpreted variables
|
||||||
|
|
||||||
|
see [Interpreted variables](config-variables)
|
||||||
|
|
||||||
|
# Symlinking dotfiles
|
||||||
|
|
||||||
|
Dotdrop is able to install dotfiles in three different ways
|
||||||
|
which are controlled by the `link` attribute of each dotfile:
|
||||||
|
|
||||||
|
* `link: nolink`: the dotfile (file or directory) is copied to its destination
|
||||||
|
* `link: link`: the dotfile (file or directory) is symlinked to its destination
|
||||||
|
* `link: link_children`: the files/directories found under the dotfile (directory) are symlinked to their destination
|
||||||
|
|
||||||
|
For more see [this how-to](symlinked-dotfiles)
|
||||||
|
|
||||||
|
# All dotfiles for a profile
|
||||||
|
|
||||||
|
To use all defined dotfiles for a profile, simply use
|
||||||
|
the keyword `ALL`.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
```yaml
|
||||||
|
dotfiles:
|
||||||
|
f_xinitrc:
|
||||||
|
dst: ~/.xinitrc
|
||||||
|
src: xinitrc
|
||||||
|
f_vimrc:
|
||||||
|
dst: ~/.vimrc
|
||||||
|
src: vimrc
|
||||||
|
profiles:
|
||||||
|
host1:
|
||||||
|
dotfiles:
|
||||||
|
- ALL
|
||||||
|
host2:
|
||||||
|
dotfiles:
|
||||||
|
- f_vimrc
|
||||||
|
```
|
||||||
|
|
||||||
|
# Include dotfiles from another profile
|
||||||
|
|
||||||
|
If one profile is using the entire set of another profile, one can use
|
||||||
|
the `include` entry to avoid redundancy.
|
||||||
|
|
||||||
|
Note that everything from the included profile is made available
|
||||||
|
(actions, variables/dynvariables, etc).
|
||||||
|
|
||||||
|
For example:
|
||||||
|
```yaml
|
||||||
|
profiles:
|
||||||
|
host1:
|
||||||
|
dotfiles:
|
||||||
|
- f_xinitrc
|
||||||
|
include:
|
||||||
|
- host2
|
||||||
|
host2:
|
||||||
|
dotfiles:
|
||||||
|
- f_vimrc
|
||||||
|
```
|
||||||
|
Here profile *host1* contains all the dotfiles defined for *host2* plus `f_xinitrc`.
|
||||||
|
|
||||||
|
For more advanced use-cases variables
|
||||||
|
([variables](config-variables) and [dynvariables](config-variables))
|
||||||
|
can be used to specify the profile to include in a profile
|
||||||
|
|
||||||
|
For example:
|
||||||
|
```yaml
|
||||||
|
variables:
|
||||||
|
var1: "john"
|
||||||
|
dynvariables:
|
||||||
|
d_user: "echo $USER"
|
||||||
|
profiles:
|
||||||
|
profile_john:
|
||||||
|
dotfiles:
|
||||||
|
- f_john_dotfile
|
||||||
|
profile_bill:
|
||||||
|
dotfiles:
|
||||||
|
- f_bill_dotfile
|
||||||
|
p1:
|
||||||
|
include:
|
||||||
|
- "profile_{{@@ d_user @@}}"
|
||||||
|
p2:
|
||||||
|
include:
|
||||||
|
- "profile_{{@@ var1 @@}}"
|
||||||
|
```
|
||||||
|
|
||||||
|
# Import profile dotfiles from file
|
||||||
|
|
||||||
|
Profile's dotfiles list can be loaded from external files
|
||||||
|
by specifying their paths in the config entry `import` under the specific profile.
|
||||||
|
|
||||||
|
The paths can be absolute or relative to the config file location.
|
||||||
|
|
||||||
|
`config.yaml`
|
||||||
|
```yaml
|
||||||
|
dotfiles:
|
||||||
|
f_abc:
|
||||||
|
dst: ~/.abc
|
||||||
|
src: abc
|
||||||
|
f_def:
|
||||||
|
dst: ~/.def
|
||||||
|
src: def
|
||||||
|
f_xyz:
|
||||||
|
dst: ~/.xyz
|
||||||
|
src: xyz
|
||||||
|
profiles:
|
||||||
|
p1:
|
||||||
|
dotfiles:
|
||||||
|
- f_abc
|
||||||
|
import:
|
||||||
|
- somedotfiles.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
`somedotfiles.yaml`
|
||||||
|
```
|
||||||
|
dotfiles:
|
||||||
|
- f_def
|
||||||
|
- f_xyz
|
||||||
|
```
|
||||||
|
|
||||||
|
Variables can be used in `import` and would allow to do something like
|
||||||
|
```yaml
|
||||||
|
import:
|
||||||
|
- profiles.d/{{@@ profile @@}}.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
# Import variables from file
|
||||||
|
|
||||||
|
It is possible to load variables/dynvariables from external files by providing their
|
||||||
|
paths in the config entry `import_variables`.
|
||||||
|
|
||||||
|
The paths can be absolute or relative to the config file location.
|
||||||
|
|
||||||
|
`config.yaml`
|
||||||
|
```yaml
|
||||||
|
config:
|
||||||
|
backup: true
|
||||||
|
create: true
|
||||||
|
dotpath: dotfiles
|
||||||
|
import_variables:
|
||||||
|
- variables.d/myvars.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
`variables.d/myvars.yaml`
|
||||||
|
```yaml
|
||||||
|
variables:
|
||||||
|
var1: "extvar1"
|
||||||
|
dynvariables:
|
||||||
|
dvar1: "echo extdvar1"
|
||||||
|
```
|
||||||
|
|
||||||
|
Dotdrop will fail if an imported path points to a non-existing file.
|
||||||
|
It is possible to make non-existing paths not fatal by appending the path with `:optional`
|
||||||
|
```yaml
|
||||||
|
import_variables:
|
||||||
|
- variables.d/myvars.yaml:optional
|
||||||
|
```
|
||||||
|
|
||||||
|
# Import actions from file
|
||||||
|
|
||||||
|
It is possible to load actions from external files by providing their
|
||||||
|
paths in the config entry `import_actions`.
|
||||||
|
|
||||||
|
The paths can be absolute or relative to the config file location.
|
||||||
|
|
||||||
|
`config.yaml`
|
||||||
|
```yaml
|
||||||
|
config:
|
||||||
|
backup: true
|
||||||
|
create: true
|
||||||
|
dotpath: dotfiles
|
||||||
|
import_actions:
|
||||||
|
- actions.d/myactions.yaml
|
||||||
|
dotfiles:
|
||||||
|
f_abc:
|
||||||
|
dst: ~/.abc
|
||||||
|
src: abc
|
||||||
|
actions:
|
||||||
|
- dateme
|
||||||
|
```
|
||||||
|
|
||||||
|
`actions.d/myactions.yaml`
|
||||||
|
```yaml
|
||||||
|
actions:
|
||||||
|
dateme: date > /tmp/timestamp
|
||||||
|
```
|
||||||
|
|
||||||
|
External variables will take precedence over variables defined within
|
||||||
|
the source config file.
|
||||||
|
|
||||||
|
Dotdrop will fail if an imported path points to a non-existing file.
|
||||||
|
It is possible to make non-existing paths not fatal by appending the path with `:optional`
|
||||||
|
```yaml
|
||||||
|
import_actions:
|
||||||
|
- actions.d/myactions.yaml:optional
|
||||||
|
```
|
||||||
|
|
||||||
|
# Import config files
|
||||||
|
|
||||||
|
Entire config files can be imported. This means making the following available
|
||||||
|
from the imported config file in the original config file:
|
||||||
|
|
||||||
|
- dotfiles
|
||||||
|
- profiles
|
||||||
|
- actions
|
||||||
|
- read/write transformations
|
||||||
|
- variables/dynvariables
|
||||||
|
|
||||||
|
Paths to import can be absolute or relative to the importing config file
|
||||||
|
location.
|
||||||
|
|
||||||
|
`config.yaml`
|
||||||
|
```yaml
|
||||||
|
config:
|
||||||
|
backup: true
|
||||||
|
create: true
|
||||||
|
dotpath: dotfiles
|
||||||
|
import_configs:
|
||||||
|
- other-config.yaml
|
||||||
|
dotfiles:
|
||||||
|
f_abc:
|
||||||
|
dst: ~/.abc
|
||||||
|
src: abc
|
||||||
|
actions:
|
||||||
|
- show
|
||||||
|
profiles:
|
||||||
|
my-host:
|
||||||
|
dotfiles:
|
||||||
|
- f_abc
|
||||||
|
- f_def
|
||||||
|
my-haskell:
|
||||||
|
include:
|
||||||
|
- other-host
|
||||||
|
```
|
||||||
|
|
||||||
|
`other-config.yaml`
|
||||||
|
```yaml
|
||||||
|
config:
|
||||||
|
backup: true
|
||||||
|
create: true
|
||||||
|
dotpath: dotfiles-other
|
||||||
|
import_actions:
|
||||||
|
- actions.yaml
|
||||||
|
dotfiles:
|
||||||
|
f_def:
|
||||||
|
dst: ~/.def
|
||||||
|
src: def
|
||||||
|
f_ghci:
|
||||||
|
dst: ~/.ghci
|
||||||
|
src: ghci
|
||||||
|
profiles:
|
||||||
|
other-host:
|
||||||
|
dotfiles:
|
||||||
|
- f_gchi
|
||||||
|
```
|
||||||
|
|
||||||
|
`actions.yaml`
|
||||||
|
```yaml
|
||||||
|
actions:
|
||||||
|
post:
|
||||||
|
show: less
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example `config.yaml` imports `other-config.yaml`. The dotfile `f_def`
|
||||||
|
used in the profile `my-host` is defined in `other-config.yaml`, and so is the
|
||||||
|
profile `other-host` included from `my-haskell`. The action `show` is defined
|
||||||
|
in `actions.yaml`, which is in turn imported by `other-config.yaml`.
|
||||||
|
|
||||||
|
Dotdrop will fail if an imported path points to a non-existing file.
|
||||||
|
It is possible to make non-existing paths not fatal by appending the path with `:optional`
|
||||||
|
```yaml
|
||||||
|
import_configs:
|
||||||
|
- other-config.yaml:optional
|
||||||
|
```
|
||||||
|
|
||||||
|
# Dynamic dotfile paths
|
||||||
|
|
||||||
|
Dotfile source (`src`) and destination (`dst`) can be dynamically constructed using
|
||||||
|
defined variables ([variables and dynvariables](config-variables)).
|
||||||
|
|
||||||
|
For example to have a dotfile deployed on the unique firefox profile where the
|
||||||
|
profile path is dynamically found using a shell oneliner stored in a dynvariable:
|
||||||
|
```yaml
|
||||||
|
dynvariables:
|
||||||
|
mozpath: find ~/.mozilla/firefox -name '*.default'
|
||||||
|
dotfiles:
|
||||||
|
f_somefile:
|
||||||
|
dst: "{{@@ mozpath @@}}/somefile"
|
||||||
|
src: firefox/somefile
|
||||||
|
profiles:
|
||||||
|
home:
|
||||||
|
dotfiles:
|
||||||
|
- f_somefile
|
||||||
|
```
|
||||||
|
|
||||||
|
Make sure to quote the path in the config file.
|
||||||
|
|
||||||
|
# Dynamic actions
|
||||||
|
|
||||||
|
Variables ([config variables and dynvariables](config-variables)
|
||||||
|
and [template variables](templating#template-variables)) can be used
|
||||||
|
in actions for more advanced use-cases.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
dotfiles:
|
||||||
|
f_test:
|
||||||
|
dst: ~/.test
|
||||||
|
src: test
|
||||||
|
actions:
|
||||||
|
- cookie_mv_somewhere "/tmp/moved-cookie"
|
||||||
|
variables:
|
||||||
|
cookie_dir_available: (test -d /tmp/cookiedir || mkdir -p /tmp/cookiedir)
|
||||||
|
cookie_header: "{{@@ cookie_dir_available @@}} && echo 'header' > /tmp/cookiedir/cookie"
|
||||||
|
cookie_mv: "{{@@ cookie_header @@}} && mv /tmp/cookiedir/cookie"
|
||||||
|
actions:
|
||||||
|
cookie_mv_somewhere: "{{@@ cookie_mv @@}} {0}"
|
||||||
|
```
|
||||||
|
|
||||||
|
or even something like this:
|
||||||
|
```yaml
|
||||||
|
actions:
|
||||||
|
log: "echo {0} >> {1}"
|
||||||
|
config:
|
||||||
|
default_actions:
|
||||||
|
- preaction '{{@@ _dotfile_key @@}} installed' "/tmp/log"
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
Make sure to quote the actions using variables.
|
||||||
|
|
||||||
|
# Dynamic transformations
|
||||||
|
|
||||||
|
As for [dynamic actions](#dynamic-actions), transformations support
|
||||||
|
the use of variables ([variables and dynvariables](config-variables)
|
||||||
|
and [template variables](templating#template-variables)).
|
||||||
|
|
||||||
|
A very dumb example:
|
||||||
|
```yaml
|
||||||
|
trans_read:
|
||||||
|
r_echo_abs_src: echo "{0}: {{@@ _dotfile_abs_src @@}}" > {1}
|
||||||
|
r_echo_var: echo "{0}: {{@@ r_var @@}}" > {1}
|
||||||
|
trans_write:
|
||||||
|
w_echo_key: echo "{0}: {{@@ _dotfile_key @@}}" > {1}
|
||||||
|
w_echo_var: echo "{0}: {{@@ w_var @@}}" > {1}
|
||||||
|
variables:
|
||||||
|
r_var: readvar
|
||||||
|
w_var: writevar
|
||||||
|
dotfiles:
|
||||||
|
f_abc:
|
||||||
|
dst: ${tmpd}/abc
|
||||||
|
src: abc
|
||||||
|
trans_read: r_echo_abs_src
|
||||||
|
trans_write: w_echo_key
|
||||||
|
f_def:
|
||||||
|
dst: ${tmpd}/def
|
||||||
|
src: def
|
||||||
|
trans_read: r_echo_var
|
||||||
|
trans_write: w_echo_var
|
||||||
|
```
|
||||||
64
docs/config/ignore-pattern.md
Normal file
64
docs/config/ignore-pattern.md
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
* [ignore patterns](#ignore-patterns)
|
||||||
|
* [examples](#examples)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# ignore patterns
|
||||||
|
|
||||||
|
It is possible to ignore specific patterns when using dotdrop. For example for `compare` when temporary
|
||||||
|
files don't need to appear in the output.
|
||||||
|
|
||||||
|
* for [install](usage#install-dotfiles)
|
||||||
|
* using `instignore` in [the config file](config)
|
||||||
|
* for [compare](usage#compare-dotfiles)
|
||||||
|
* using `cmpignore` in [the config file](config)
|
||||||
|
* using the command line switch `-i --ignore`
|
||||||
|
* for [update](usage#update-dotfiles)
|
||||||
|
* using `upignore` in [the config file](config)
|
||||||
|
* using the command line switch `-i --ignore`
|
||||||
|
|
||||||
|
The ignore pattern must follow Unix shell-style wildcards like for example `*/path/to/file`.
|
||||||
|
Make sure to quote those when using wildcards in the config file.
|
||||||
|
|
||||||
|
Patterns used on a specific dotfile can be specified relative to the dotfile destination (`dst`).
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
config:
|
||||||
|
cmpignore:
|
||||||
|
- '*/README.md'
|
||||||
|
upignore:
|
||||||
|
- '*/README.md'
|
||||||
|
instignore:
|
||||||
|
- '*/README.md'
|
||||||
|
...
|
||||||
|
dotfiles:
|
||||||
|
d_vim
|
||||||
|
dst: ~/.vim
|
||||||
|
src: vim
|
||||||
|
upignore:
|
||||||
|
- "*/undo-dir"
|
||||||
|
- "*/plugged"
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
# examples
|
||||||
|
|
||||||
|
To completely ignore comparison of a specific dotfile:
|
||||||
|
```yaml
|
||||||
|
dotfiles:
|
||||||
|
d_vim
|
||||||
|
dst: ~/.vim
|
||||||
|
src: vim
|
||||||
|
cmpignore:
|
||||||
|
- "*"
|
||||||
|
```
|
||||||
|
|
||||||
|
To ignore specific directory when updating
|
||||||
|
```yaml
|
||||||
|
dotfiles:
|
||||||
|
d_colorpicker:
|
||||||
|
src: config/some_directory
|
||||||
|
dst: ~/.config/some_directory
|
||||||
|
upignore:
|
||||||
|
- '*sub_directory_to_ignore'
|
||||||
|
```
|
||||||
165
docs/config/usage-actions.md
Normal file
165
docs/config/usage-actions.md
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
* [Dotfile actions](#dotfile-actions)
|
||||||
|
* [Default actions](#default-actions)
|
||||||
|
* [Profile actions](#profile-actions)
|
||||||
|
* [Fake dotfile and actions](#fake-dotfile-and-actions)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Note**: any action with a key starting with an underscore (`_`) won't be shown in output.
|
||||||
|
This can be useful when working with sensitive data containing passwords for example.
|
||||||
|
|
||||||
|
# Dotfile actions
|
||||||
|
|
||||||
|
It is sometimes useful to execute some kind of action
|
||||||
|
when deploying a dotfile.
|
||||||
|
|
||||||
|
Note that dotfile actions are only
|
||||||
|
executed when the dotfile is installed.
|
||||||
|
|
||||||
|
For example let's consider
|
||||||
|
[Vundle](https://github.com/VundleVim/Vundle.vim) is used
|
||||||
|
to manage vim's plugins, the following action could
|
||||||
|
be set to update and install the plugins when `vimrc` is
|
||||||
|
deployed:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
actions:
|
||||||
|
vundle: vim +VundleClean! +VundleInstall +VundleInstall! +qall
|
||||||
|
config:
|
||||||
|
backup: true
|
||||||
|
create: true
|
||||||
|
dotpath: dotfiles
|
||||||
|
dotfiles:
|
||||||
|
f_vimrc:
|
||||||
|
dst: ~/.vimrc
|
||||||
|
src: vimrc
|
||||||
|
actions:
|
||||||
|
- vundle
|
||||||
|
profiles:
|
||||||
|
home:
|
||||||
|
dotfiles:
|
||||||
|
- f_vimrc
|
||||||
|
```
|
||||||
|
|
||||||
|
Thus when `f_vimrc` is installed, the command
|
||||||
|
`vim +VundleClean! +VundleInstall +VundleInstall! +qall` will
|
||||||
|
be executed.
|
||||||
|
|
||||||
|
Sometimes, you may even want to execute some action prior to deploying a dotfile.
|
||||||
|
Let's take another example with
|
||||||
|
[vim-plug](https://github.com/junegunn/vim-plug):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
actions:
|
||||||
|
pre:
|
||||||
|
vim-plug-install: test -e ~/.vim/autoload/plug.vim || (mkdir -p ~/.vim/autoload; curl
|
||||||
|
-fLo ~/.vim/autoload/plug.vim https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim)
|
||||||
|
vim-plug: vim +PlugInstall +qall
|
||||||
|
config:
|
||||||
|
backup: true
|
||||||
|
create: true
|
||||||
|
dotpath: dotfiles
|
||||||
|
dotfiles:
|
||||||
|
f_vimrc:
|
||||||
|
dst: ~/.vimrc
|
||||||
|
src: vimrc
|
||||||
|
actions:
|
||||||
|
- vim-plug-install
|
||||||
|
- vim-plug
|
||||||
|
profiles:
|
||||||
|
home:
|
||||||
|
dotfiles:
|
||||||
|
- f_vimrc
|
||||||
|
```
|
||||||
|
|
||||||
|
This way, we make sure [vim-plug](https://github.com/junegunn/vim-plug)
|
||||||
|
is installed prior to deploying the `~/.vimrc` dotfile.
|
||||||
|
|
||||||
|
You can also define `post` actions like this:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
actions:
|
||||||
|
post:
|
||||||
|
some-action: echo "Hello, World!" >/tmp/log
|
||||||
|
```
|
||||||
|
|
||||||
|
If you don't specify neither `post` nor `pre`, the action will be executed
|
||||||
|
after the dotfile deployment (which is equivalent to `post`).
|
||||||
|
Actions cannot obviously be named `pre` or `post`.
|
||||||
|
|
||||||
|
Actions can even be parameterized. For example:
|
||||||
|
```yaml
|
||||||
|
actions:
|
||||||
|
echoaction: echo '{0}' > {1}
|
||||||
|
config:
|
||||||
|
backup: true
|
||||||
|
create: true
|
||||||
|
dotpath: dotfiles
|
||||||
|
dotfiles:
|
||||||
|
f_vimrc:
|
||||||
|
dst: ~/.vimrc
|
||||||
|
src: vimrc
|
||||||
|
actions:
|
||||||
|
- echoaction "vim installed" /tmp/mydotdrop.log
|
||||||
|
f_xinitrc:
|
||||||
|
dst: ~/.xinitrc
|
||||||
|
src: xinitrc
|
||||||
|
actions:
|
||||||
|
- echoaction "xinitrc installed" /tmp/myotherlog.log
|
||||||
|
profiles:
|
||||||
|
home:
|
||||||
|
dotfiles:
|
||||||
|
- f_vimrc
|
||||||
|
- f_xinitrc
|
||||||
|
```
|
||||||
|
|
||||||
|
The above will execute `echo 'vim installed' > /tmp/mydotdrop.log` when
|
||||||
|
vimrc is installed and `echo 'xinitrc installed' > /tmp/myotherlog.log'`
|
||||||
|
when xinitrc is installed.
|
||||||
|
|
||||||
|
# Default actions
|
||||||
|
|
||||||
|
Dotdrop allows to execute an action for any dotfile installation. These actions work as any other action (*pre* or *post*).
|
||||||
|
|
||||||
|
For example, the below action will log each dotfile installation to a file.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
actions:
|
||||||
|
post:
|
||||||
|
loginstall: "echo {{@@ _dotfile_abs_src @@}} installed to {{@@ _dotfile_abs_dst @@}} >> {0}"
|
||||||
|
config:
|
||||||
|
backup: true
|
||||||
|
create: true
|
||||||
|
dotpath: dotfiles
|
||||||
|
default_actions:
|
||||||
|
- loginstall "/tmp/dotdrop-installation.log"
|
||||||
|
dotfiles:
|
||||||
|
f_vimrc:
|
||||||
|
dst: ~/.vimrc
|
||||||
|
src: vimrc
|
||||||
|
profiles:
|
||||||
|
hostname:
|
||||||
|
dotfiles:
|
||||||
|
- f_vimrc
|
||||||
|
```
|
||||||
|
|
||||||
|
# Profile actions
|
||||||
|
|
||||||
|
Profile can be either `pre` or `post` actions. Those are executed before
|
||||||
|
any dotfile installation (for `pre`) and after all dotfiles installation (for `post`)
|
||||||
|
only if at least one dotfile has been installed.
|
||||||
|
|
||||||
|
# Fake dotfile and actions
|
||||||
|
|
||||||
|
*Fake* dotfile can be created by specifying no `dst` and no `src` (see [config format](https://github.com/deadc0de6/dotdrop/wiki/config#format)). By binding an action to such a *fake* dotfile, you make sure the action is always executed since *fake* dotfile are always considered installed.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
actions:
|
||||||
|
always_action: 'date > ~/.dotdrop.log'
|
||||||
|
dotfiles:
|
||||||
|
fake:
|
||||||
|
src:
|
||||||
|
dst:
|
||||||
|
actions:
|
||||||
|
- always_action
|
||||||
|
```
|
||||||
58
docs/config/usage-transformations.md
Normal file
58
docs/config/usage-transformations.md
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
* [Use transformations](#use-transformations)
|
||||||
|
* [Arguments and templating](#arguments-and-templating)
|
||||||
|
* [Examples](#examples)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Note**: any transformation with a key starting with an underscore (`_`) won't be shown in output.
|
||||||
|
This can be useful when working with sensitive data containing passwords for example.
|
||||||
|
|
||||||
|
# Use transformations
|
||||||
|
|
||||||
|
There are two types of transformations available:
|
||||||
|
|
||||||
|
* **read transformations**: used to transform dotfiles before they are installed ([Config](config) key `trans_read`)
|
||||||
|
* Used for commands `install` and `compare`
|
||||||
|
* They have two arguments:
|
||||||
|
* **{0}** will be replaced with the dotfile to process
|
||||||
|
* **{1}** will be replaced with a temporary file to store the result of the transformation
|
||||||
|
* Happens **before** the dotfile is templated with jinja2 (see [templating](templating))
|
||||||
|
|
||||||
|
* **write transformations**: used to transform files before updating a dotfile ([Config](config) key `trans_write`)
|
||||||
|
* Used for command `update`
|
||||||
|
* They have two arguments:
|
||||||
|
* **{0}** will be replaced with the file path to update the dotfile with
|
||||||
|
* **{1}** will be replaced with a temporary file to store the result of the transformation
|
||||||
|
|
||||||
|
A typical use-case for transformations is when dotfiles need to be
|
||||||
|
stored encrypted or compressed. For more see below [examples](#examples).
|
||||||
|
|
||||||
|
Note that transformations cannot be used if the dotfiles is to be linked (when `link: link` or `link: link_children`).
|
||||||
|
|
||||||
|
# Arguments and templating
|
||||||
|
|
||||||
|
Transformations also support additional positional arguments that must start from 2 (since `{0}` and `{1}` are added automatically). The transformations itself as well as its arguments can also be templated.
|
||||||
|
|
||||||
|
For example
|
||||||
|
```yaml
|
||||||
|
trans_read:
|
||||||
|
targ: echo "$(basename {0}); {{@@ _dotfile_key @@}}; {2}; {3}" > {1}
|
||||||
|
dotfiles:
|
||||||
|
f_abc:
|
||||||
|
dst: /tmp/abc
|
||||||
|
src: abc
|
||||||
|
trans_read: targ "{{@@ profile @@}}" lastarg
|
||||||
|
profiles:
|
||||||
|
p1:
|
||||||
|
dotfiles:
|
||||||
|
- f_abc
|
||||||
|
```
|
||||||
|
|
||||||
|
will result in `abc; f_abc; p1; lastarg`
|
||||||
|
|
||||||
|
# Examples
|
||||||
|
|
||||||
|
See
|
||||||
|
|
||||||
|
* [Store compressed directories](store-compressed-directories)
|
||||||
|
* [Sensitive dotfiles](sensitive-dotfiles)
|
||||||
31
docs/howto/append.md
Normal file
31
docs/howto/append.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
Sometimes it might be useful to be able to append some text to a
|
||||||
|
file. Dotdrop is able to do that with the help of
|
||||||
|
[actions](https://github.com/deadc0de6/dotdrop/wiki/usage-actions)
|
||||||
|
and a temporary file.
|
||||||
|
|
||||||
|
Below is a config example to append to a file:
|
||||||
|
```yaml
|
||||||
|
dynvariables:
|
||||||
|
tmpfile: mktemp
|
||||||
|
variables:
|
||||||
|
somefile_final: ~/.somefile
|
||||||
|
dotfiles:
|
||||||
|
f_somefile:
|
||||||
|
dst: "{{@@ tmpfile @@}}"
|
||||||
|
src: somefile
|
||||||
|
actions:
|
||||||
|
- strip "{{@@ somefile_final @@}}"
|
||||||
|
- append "{{@@ tmpfile @@}}" "{{@@ somefile_final @@}}"
|
||||||
|
actions:
|
||||||
|
pre:
|
||||||
|
strip: "sed -i '/^# my pattern$/,$d' {0}"
|
||||||
|
post:
|
||||||
|
append: "cat {0} >> {1}; rm -f {0}"
|
||||||
|
```
|
||||||
|
During installation, the `strip` action is executed before the installation and strips everything from the pattern `# my pattern` to the end of the file. Then the dotfile `somefile` is installed in a temporary location (here `tmpfile`) and finally the post action `append` will append the content of the `tmpfile` to the final dotfile pointed by `somefile_final`
|
||||||
|
|
||||||
|
Obviously the dotfile in the dotpath should start with a unique pattern (here `# my pattern`):
|
||||||
|
```
|
||||||
|
# my pattern
|
||||||
|
this is the end
|
||||||
|
```
|
||||||
54
docs/howto/create-special-files.md
Normal file
54
docs/howto/create-special-files.md
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
One way for creating symlinks (or any other special files) is to use a combination of
|
||||||
|
[actions](usage-actions) and a *fake* dotfile.
|
||||||
|
|
||||||
|
Let's say for example you have a list of directories you want to link
|
||||||
|
from under `~/.original` to `~/symlinks`.
|
||||||
|
```bash
|
||||||
|
$ tree ~/.original
|
||||||
|
/home/user/.original
|
||||||
|
├── dir1
|
||||||
|
├── dir2
|
||||||
|
└── dir3
|
||||||
|
```
|
||||||
|
|
||||||
|
First you would store these directories names in a text file in your `<dotpath>/links.txt`
|
||||||
|
```
|
||||||
|
dir1
|
||||||
|
dir2
|
||||||
|
dir3
|
||||||
|
```
|
||||||
|
|
||||||
|
The config file would contain different elements
|
||||||
|
* a `dynvariables` that will read the above text file
|
||||||
|
* a few `variables` for the source and destination
|
||||||
|
* an action that will create the destination directory and symlink those directories
|
||||||
|
* a *fake* dotfile (with no `src` and no `dst` values) that will be always installed with the above action
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
dynvariables:
|
||||||
|
links_list: "cat {{@@ _dotdrop_dotpath @@}}/links.txt | xargs"
|
||||||
|
...
|
||||||
|
variables:
|
||||||
|
links_dst: "{{@@ env['HOME'] @@}}/.symlinks"
|
||||||
|
links_src: "{{@@ env['HOME'] @@}}/.original"
|
||||||
|
...
|
||||||
|
actions:
|
||||||
|
symlink_them: 'mkdir -p "{1}" && for lnk in {0}; do ln -s "{{@@ links_src @@}}/$lnk" "{1}/$lnk"; done'
|
||||||
|
...
|
||||||
|
fake:
|
||||||
|
src:
|
||||||
|
dst:
|
||||||
|
actions:
|
||||||
|
- symlink_them '{{@@ links_list @@}}' '{{@@ links_dst @@}}'
|
||||||
|
```
|
||||||
|
|
||||||
|
The result would be
|
||||||
|
```bash
|
||||||
|
$ tree ~/.symlinks
|
||||||
|
/home/user/.symlinks
|
||||||
|
├── dir1 -> /home/user/.original/dir1
|
||||||
|
├── dir2 -> /home/user/.original/dir2
|
||||||
|
└── dir3 -> /home/user/.original/dir3
|
||||||
|
```
|
||||||
|
|
||||||
|
For reference, see [issue 243](https://github.com/deadc0de6/dotdrop/issues/243)
|
||||||
26
docs/howto/global-config-files.md
Normal file
26
docs/howto/global-config-files.md
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# How to manage system wide config files with dotdrop
|
||||||
|
|
||||||
|
Dotdrop doesn't allow to handle file rights and permissions (at least not directly). Every operations (`mkdir`, `cp`, `mv`, `ln`, file creation) are executed with the rights of the user calling dotdrop. The rights of the stored dotfile are mirrored on the deployed dotfile (`chmod` like). It works well for local/user dotfiles but doesn't allow to manage global/system config files (`/etc` or `/var` for example) directly.
|
||||||
|
|
||||||
|
Using dotdrop with `sudo` to handle local **and** global dotfiles in the same *session* is a bad idea as the resulting files will all have messed up owners.
|
||||||
|
|
||||||
|
It is therefore recommended to have two different config files (and thus two different *dotpath*) for handling these two uses cases:
|
||||||
|
|
||||||
|
* one `config.yaml` for the local/user dotfiles (with its dedicated *dotpath*)
|
||||||
|
* another config file for the global/system dotfiles (with its dedicated *dotpath*)
|
||||||
|
|
||||||
|
The default config file (`config.yaml`) is used when installing the user dotfiles as usual
|
||||||
|
```bash
|
||||||
|
# default config file is config.yaml
|
||||||
|
$ ./dotdrop.sh import <some-dotfile>
|
||||||
|
$ ./dotdrop.sh install
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
A different config file (for example `global-config.yaml` and its associated *dotpath*) is used when installing/managing global dotfiles and is to be used with `sudo` or directly by the root user
|
||||||
|
```bash
|
||||||
|
# specifying explicitly the config file with the --cfg switch
|
||||||
|
$ sudo ./dotdrop.sh import --cfg=global-config.yaml <some-dotfile>
|
||||||
|
$ sudo ./dotdrop.sh install --cfg=global-config.yaml
|
||||||
|
...
|
||||||
|
```
|
||||||
1
docs/howto/index.md
Normal file
1
docs/howto/index.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
**TODO**
|
||||||
69
docs/howto/merge-files-when-installing.md
Normal file
69
docs/howto/merge-files-when-installing.md
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
Dotdrop allows to merge multiple files into one using the jinja2's `include` directive.
|
||||||
|
|
||||||
|
For example let's consider you want to keep your `vimrc` split into multiple parts in dotdrop
|
||||||
|
* `<dotpath>/vimrc.d/top`: top part of the file
|
||||||
|
* `<dotpath>/vimrc.d/bottom`: bottom part of the file
|
||||||
|
|
||||||
|
And you want dotdrop to merge all those files into `~/.vimrc` whenever you process your vimrc with dotdrop.
|
||||||
|
|
||||||
|
First make sure `~/.vimrc` is present in your config file
|
||||||
|
```yaml
|
||||||
|
...
|
||||||
|
dotfiles:
|
||||||
|
f_vimrc:
|
||||||
|
dst: ~/.vimrc
|
||||||
|
src: vimrc
|
||||||
|
profiles:
|
||||||
|
hostname:
|
||||||
|
dotfiles:
|
||||||
|
- f_vimrc
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that the subfiles (`vimrc.d/top` and `vimrc.d/bottom`)
|
||||||
|
are not known to the config and do not need to be.
|
||||||
|
|
||||||
|
Edit the stored vimrc file to include the other files, for example:
|
||||||
|
```bash
|
||||||
|
$ cat <dotpath>/vimrc
|
||||||
|
{%@@ include 'vimrc.d/top' @@%}
|
||||||
|
filetype on
|
||||||
|
set t_Co=256
|
||||||
|
set tw=0
|
||||||
|
set tabstop=2
|
||||||
|
set shiftwidth=2
|
||||||
|
set expandtab
|
||||||
|
set nocompatible
|
||||||
|
set nomodeline
|
||||||
|
syntax on
|
||||||
|
{%@@ include 'vimrc.d/bottom' @@%}
|
||||||
|
```
|
||||||
|
|
||||||
|
The `include` path parameter needs to be relative to your `dotpath`.
|
||||||
|
|
||||||
|
Dotdrop will then automagically include the files into your vimrc when handling `f_vimrc`.
|
||||||
|
|
||||||
|
# Merge all files in a directory
|
||||||
|
|
||||||
|
To include all files in a directory, a combination of
|
||||||
|
[dynvariables](config-variables#interpreted-variables)
|
||||||
|
and [jinja2 directives](http://jinja.pocoo.org/docs/2.10/) have to be used.
|
||||||
|
|
||||||
|
Let's say all files in `<dotpath>/toinclude` need to be included into a dotfile.
|
||||||
|
|
||||||
|
First define a [dynvariables](config-variables#interpreted-variables)
|
||||||
|
in the config file which will look for files to include in the above directory:
|
||||||
|
```yaml
|
||||||
|
dynvariables:
|
||||||
|
allfiles: "cd {{@@ _dotdrop_dotpath @@}}; find toinclude/ -type f | xargs"
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that `_dotdrop_dotpath` is part of the built-in variables
|
||||||
|
(for more see [template variables](templating#template-variables)).
|
||||||
|
|
||||||
|
And then use the generated list in the dotfile template:
|
||||||
|
```
|
||||||
|
{%@@ for f in allfiles.split() @@%}
|
||||||
|
{%@@ include f @@%}
|
||||||
|
{%@@ endfor @@%}
|
||||||
|
```
|
||||||
71
docs/howto/sensitive-dotfiles.md
Normal file
71
docs/howto/sensitive-dotfiles.md
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
# Sensitive dotfiles
|
||||||
|
|
||||||
|
* [Available solutions](#available-solutions)
|
||||||
|
* [Store encrypted dotfiles](#store-encrypted-dotfiles)
|
||||||
|
* [Load passphrase from file](#load-passphrase-from-file)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Available solutions
|
||||||
|
|
||||||
|
Two solutions exist, the first one using an unversioned file (see [Environment variables](templating#environment-variables))
|
||||||
|
and the second using transformations (see [Store encrypted dotfiles](#store-encrypted-dotfiles)).
|
||||||
|
|
||||||
|
# Store encrypted dotfiles
|
||||||
|
|
||||||
|
Here's an example of part of a config file to use gpg encrypted dotfiles:
|
||||||
|
```yaml
|
||||||
|
dotfiles:
|
||||||
|
f_secret:
|
||||||
|
dst: ~/.secret
|
||||||
|
src: secret
|
||||||
|
trans_read: _gpg
|
||||||
|
trans_read:
|
||||||
|
_gpg: gpg2 -q --for-your-eyes-only --no-tty -d {0} > {1}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above config allows to store the dotfile `~/.secret` encrypted in the *dotpath*
|
||||||
|
directory and uses gpg to decrypt it when `install` is run.
|
||||||
|
|
||||||
|
Here's how to deploy above solution:
|
||||||
|
|
||||||
|
* import the clear dotfile (what creates the correct entries in the config file)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ dotdrop import ~/.secret
|
||||||
|
```
|
||||||
|
|
||||||
|
* encrypt the original dotfile
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ <some-gpg-command> ~/.secret
|
||||||
|
```
|
||||||
|
|
||||||
|
* overwrite the dotfile with the encrypted version
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cp <encrypted-version-of-secret> dotfiles/secret
|
||||||
|
```
|
||||||
|
|
||||||
|
* edit the config file and add the transformation to the dotfile
|
||||||
|
(as shown in the example above)
|
||||||
|
|
||||||
|
* commit and push the changes
|
||||||
|
|
||||||
|
# Load passphrase from file
|
||||||
|
|
||||||
|
Passphrase is retrieved using a script:
|
||||||
|
```yaml
|
||||||
|
variables:
|
||||||
|
gpg_password: "./get-password.sh"
|
||||||
|
trans_read:
|
||||||
|
_gpg: "gpg2 --batch --yes --passphrase-file <({{@@ gpg_password @@}}) -q --for-your-eyes-only --no-tty -d {0} > {1}"
|
||||||
|
```
|
||||||
|
|
||||||
|
Passphrase is stored in a file directly
|
||||||
|
```yaml
|
||||||
|
variables:
|
||||||
|
gpg_password_file: "/tmp/the-password"
|
||||||
|
trans_read:
|
||||||
|
_gpg: "gpg2 --batch --yes --passphrase-file <(cat {{@@ gpg_password_file @@}}) -q --for-your-eyes-only --no-tty -d {0} > {1}"
|
||||||
|
```
|
||||||
216
docs/howto/sharing-content.md
Normal file
216
docs/howto/sharing-content.md
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
There are cases in which two or more dotfiles are very similar. For example,
|
||||||
|
two files exporting environment variables for two projects built with the same
|
||||||
|
technology (eg. two node.js web servers deployed on AWS). In these cases it's
|
||||||
|
nice to share as much code as possible across the dotfiles, by leveraging
|
||||||
|
templating and merging them in the same dotfile in Dotdrop's `dotpath`. Here
|
||||||
|
are a few suggestions about how to achieve this.
|
||||||
|
|
||||||
|
* [Brute force templating](brute-force-templating)
|
||||||
|
* [Profile variables](profile-variables)
|
||||||
|
* [Jinja macros](jinja-macros)
|
||||||
|
|
||||||
|
# Brute force templating
|
||||||
|
|
||||||
|
The first approach is sheer use of templating and Dotdrop
|
||||||
|
[template variables](#template-variables). In order to do this, we need to:
|
||||||
|
|
||||||
|
1. Create the merged dotfile with an arbitrary name somewhere in `dotpath`.
|
||||||
|
2. Create two `dotfile` entries in `config.yaml`, both having the merged
|
||||||
|
dotfile as `src`, but their own `dst`.
|
||||||
|
|
||||||
|
Here we have an example:
|
||||||
|
|
||||||
|
The merged dotfile in `dotpath` (`dotpath/projects/env`):
|
||||||
|
```bash
|
||||||
|
# .env
|
||||||
|
|
||||||
|
{%@@ if _dotfile_key == 'server0-env' @@%}
|
||||||
|
{%@@set aws_db_host = 'super-duper.host' @@%}
|
||||||
|
{%@@set aws_db_port = 4521 @@%}
|
||||||
|
{%@@ elif _dotfile_key == 'server1-env' @@%}
|
||||||
|
{%@@set aws_db_host = 'cheaper.host' @@%}
|
||||||
|
{%@@set aws_db_host = 9632 @@%}
|
||||||
|
{%@@ endif @@%}
|
||||||
|
|
||||||
|
export DB_HOST='{{@@ aws_db_host @@}}'
|
||||||
|
export DB_PORT='{{@@ aws_db_port @@}}'
|
||||||
|
```
|
||||||
|
|
||||||
|
Part of Dotdrop `config.yaml` file:
|
||||||
|
```yaml
|
||||||
|
# config.yaml
|
||||||
|
|
||||||
|
dotfiles:
|
||||||
|
server0-env:
|
||||||
|
src: projects/env
|
||||||
|
dst: ~/projects/server0/.env
|
||||||
|
server1-env:
|
||||||
|
src: projects/env
|
||||||
|
dst: ~/projects/server1/.env
|
||||||
|
```
|
||||||
|
|
||||||
|
Installing the dotfile `server0-env` will create an environment file in
|
||||||
|
`~/projects/server0/.env` with the following content:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# .env
|
||||||
|
|
||||||
|
export DB_HOST='super-duper.host'
|
||||||
|
export DB_PORT='4521'
|
||||||
|
```
|
||||||
|
|
||||||
|
# Profile variables
|
||||||
|
|
||||||
|
Albeit flexible, the previous method is a bit cumbersome for some use cases.
|
||||||
|
For example, when the dotfiles belong to different profiles, the cleanest
|
||||||
|
solution consists in using
|
||||||
|
[profile variables](config-variables#profile-variables). This is achieved by:
|
||||||
|
|
||||||
|
1. Creating the merged dotfile with an arbitrary name somewhere in `dotpath`.
|
||||||
|
2. Adding some variables in the merged dotfile via templating.
|
||||||
|
3. Overriding them with different values in each profile via profile variables.
|
||||||
|
4. Typically, making the dotfile `dst` dynamic, as different profiles need
|
||||||
|
usually to deploy the dotfiles in different locations.
|
||||||
|
|
||||||
|
**NOTE**: This technique does *not* require two different `dotfiles` entry in
|
||||||
|
`config.yaml`.
|
||||||
|
|
||||||
|
An example:
|
||||||
|
|
||||||
|
The merged dotfile (`dotpath/projects/env`)
|
||||||
|
```bash
|
||||||
|
# .env
|
||||||
|
|
||||||
|
export DB_HOST='{{@@ aws_db_host @@}}'
|
||||||
|
export DB_PORT='{{@@ aws_db_port @@}}'
|
||||||
|
```
|
||||||
|
|
||||||
|
Part of Dotdrop `config.yaml` file:
|
||||||
|
```yaml
|
||||||
|
# config.yaml
|
||||||
|
|
||||||
|
dotfiles:
|
||||||
|
env:
|
||||||
|
src: projects/env
|
||||||
|
dst: '{{@@ server_path @@}}/.env'
|
||||||
|
|
||||||
|
profiles:
|
||||||
|
server0:
|
||||||
|
dotfiles:
|
||||||
|
- env
|
||||||
|
variables:
|
||||||
|
aws_db_host: super-duper.host
|
||||||
|
aws_db_port: 4521
|
||||||
|
server_path: ~/projects/server0
|
||||||
|
|
||||||
|
server1:
|
||||||
|
dotfiles:
|
||||||
|
- env
|
||||||
|
variables:
|
||||||
|
aws_db_host: cheaper.host
|
||||||
|
aws_db_port: 9632
|
||||||
|
server_path: ~/projects/server1
|
||||||
|
```
|
||||||
|
|
||||||
|
With this setup, installing the `server1` profile will create an environment
|
||||||
|
file in `~/projects/server1/.env` with the following content:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# .env
|
||||||
|
|
||||||
|
export DB_HOST='cheaper.host'
|
||||||
|
export DB_PORT='9632'
|
||||||
|
```
|
||||||
|
|
||||||
|
# Jinja macros
|
||||||
|
|
||||||
|
Even though it has cleaner dotfiles, the profile-variable-based procedure can't
|
||||||
|
be used in two scenarios: when the dotfiles belong to the same profile, and
|
||||||
|
when variable values require some complex computations. In both cases the brute
|
||||||
|
force templating approach can be used, but in the latter one it also makes the
|
||||||
|
dotfiles bloated with "bookkeeping" logic, thus hard to read.
|
||||||
|
|
||||||
|
A solution for this relies in leveraging Jinja macros. This method is a
|
||||||
|
variation of the brute force templating one, where the merged dotfile is
|
||||||
|
included from many different dotfiles in `dotpath` via jinja macros, rather
|
||||||
|
than via many `dotfile` entries with the same `src` attribute. This way, the
|
||||||
|
merged original dotfiles stays clean as in the profile variables solution,
|
||||||
|
because computations are in other files.
|
||||||
|
|
||||||
|
The steps to achieve this are:
|
||||||
|
|
||||||
|
1. Creating the merged dotfile with an arbitrary name somewhere in `dotpath`.
|
||||||
|
2. Wrapping the whole content of the merged dotfile in a jinja macro, with the
|
||||||
|
necessary parameters.
|
||||||
|
3. Calling the macro in each original dotfiles, computing the parameters there.
|
||||||
|
|
||||||
|
**NOTE**: The merged dotfile will be empty, as it only contains a jinja macro.
|
||||||
|
If it needs not to be deployed, the `ignoreempty` entry can be set to
|
||||||
|
`true` in `config.yaml`.
|
||||||
|
|
||||||
|
As usual, an example:
|
||||||
|
|
||||||
|
The merged dotfile in `dotpath` (`dotpath/projects/env`):
|
||||||
|
```bash
|
||||||
|
{%@@ macro env(db_host, db_port) @@%}
|
||||||
|
# .env
|
||||||
|
|
||||||
|
export DB_HOST='{{@@ db_host @@}}'
|
||||||
|
export DB_PORT='{{@@ db_port @@}}'
|
||||||
|
{%@@ endmacro @@%}
|
||||||
|
```
|
||||||
|
|
||||||
|
Server0's environment file (`projects/server0/.env`)
|
||||||
|
```jinja2
|
||||||
|
{%@@ from projects/env import env @@%}
|
||||||
|
|
||||||
|
{%@@ set keyPieces = _dotfile_key.split('-') @@%}
|
||||||
|
{%@@ if keyPieces[-1] == 'dbg' @@%}
|
||||||
|
{%@@ set isLocal = keyPieces[-2] == 'local' @@%}
|
||||||
|
{%@@ set remote_host = 'super-duper-dbg.host'
|
||||||
|
if not isLocal
|
||||||
|
else 'localhost' @@%}
|
||||||
|
{%@@set aws_db_port = 3333 @@%}
|
||||||
|
|
||||||
|
{%@@ elif keyPieces[-1] == 'dev' @@%}
|
||||||
|
{%@@set aws_db_host = 'localhost' @@%}
|
||||||
|
{%@@set aws_db_host = 4521 @@%}
|
||||||
|
{%@@ endif @@%}
|
||||||
|
|
||||||
|
{{@@ env(db_host, db_port) @@}}
|
||||||
|
```
|
||||||
|
|
||||||
|
Server1's environment file (`projects/server1/.env`)
|
||||||
|
```jinja2
|
||||||
|
{%@@ from projects/env import env @@%}
|
||||||
|
|
||||||
|
{{@@ env('average-host.com', 9632) @@}}
|
||||||
|
```
|
||||||
|
|
||||||
|
Part of Dotdrop `config.yaml` file:
|
||||||
|
```yaml
|
||||||
|
# config.yaml
|
||||||
|
|
||||||
|
dotfiles:
|
||||||
|
server0-env-remote-dbg:
|
||||||
|
src: projects/server0/.env
|
||||||
|
dst: ~/projects/server0/.env.remote.dbg
|
||||||
|
server0-env-local-dbg:
|
||||||
|
src: projects/server0/.env
|
||||||
|
dst: ~/projects/server0/.env.local.dbg
|
||||||
|
server1-env:
|
||||||
|
src: projects/server1/.env
|
||||||
|
dst: ~/projects/server1/.env
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
With this configuration, installing the dotfile `server0-env-local-dbg` will
|
||||||
|
create an environment file in `~/projects/server0/.env.local.dbg` with the
|
||||||
|
following content:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# .env
|
||||||
|
|
||||||
|
export DB_HOST='localhost'
|
||||||
|
export DB_PORT='3333'
|
||||||
|
```
|
||||||
46
docs/howto/special-chars.md
Normal file
46
docs/howto/special-chars.md
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
* [Detect encoding](#detect-encoding)
|
||||||
|
* [Special chars](#special-chars)
|
||||||
|
* [Re-encode](#re-encode)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Detect encoding
|
||||||
|
|
||||||
|
Text file encoding can be identified using for example `file -b <file-path>` or in vim
|
||||||
|
with `:set fileencoding`
|
||||||
|
|
||||||
|
Here's an example of encoding that will fully work with dotdrop:
|
||||||
|
```bash
|
||||||
|
$ file -b <some-file>
|
||||||
|
UTF-8 Unicode text, with escape sequences
|
||||||
|
```
|
||||||
|
|
||||||
|
and another that will mislead the `compare` command and return false/inaccurate results:
|
||||||
|
```bash
|
||||||
|
$ file -b <some-file>
|
||||||
|
ISO-8859 text, with escape sequences
|
||||||
|
```
|
||||||
|
|
||||||
|
# Special chars
|
||||||
|
|
||||||
|
## CRLF
|
||||||
|
|
||||||
|
The use of dotfiles with DOS/Windows line ending (CRLF, `\r\n`) will result in
|
||||||
|
the comparison (`compare`) returning a difference while there is none.
|
||||||
|
This is due to Jinja2 stripping CRLF.
|
||||||
|
|
||||||
|
One solution is to use `dos2unix` to re-format the dotfiles before adding them to dotdrop.
|
||||||
|
|
||||||
|
See https://github.com/deadc0de6/dotdrop/issues/42.
|
||||||
|
|
||||||
|
## Non-unicode chars
|
||||||
|
|
||||||
|
Jinja2 is not able to process non-unicode chars (http://jinja.pocoo.org/docs/2.10/api/). This means that dotfiles using non-unicode chars can still be fully managed by dotdrop however when comparing the local file with the one stored in dotdrop, `compare` will return a difference even if there is none.
|
||||||
|
|
||||||
|
Either replace the non-unicode chars (see below [Re-encode](re-encode)) or accept the fact the comparison shows a difference while there's none.
|
||||||
|
|
||||||
|
See https://github.com/deadc0de6/dotdrop/issues/42.
|
||||||
|
|
||||||
|
# Re-encode
|
||||||
|
|
||||||
|
To change an existing file's encoding, you can use `recode UTF-8 <filename>` (see [recode](https://linux.die.net/man/1/recode)) or in vim `:set fileencoding=utf-8`.
|
||||||
36
docs/howto/store-compressed-directories.md
Normal file
36
docs/howto/store-compressed-directories.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# Store compressed directories
|
||||||
|
|
||||||
|
This is an example on how to use transformations (`trans_read` and `trans_write`) to store
|
||||||
|
compressed directories and deploy them with dotdrop.
|
||||||
|
|
||||||
|
Config file:
|
||||||
|
```yaml
|
||||||
|
trans_read:
|
||||||
|
uncompress: "mkdir -p {1} && tar -xf {0} -C {1}"
|
||||||
|
trans_write:
|
||||||
|
compress: "tar -cf {1} -C {0} ."
|
||||||
|
config:
|
||||||
|
backup: true
|
||||||
|
create: true
|
||||||
|
dotpath: dotfiles
|
||||||
|
dotfiles:
|
||||||
|
d_somedir:
|
||||||
|
dst: ~/.somedir
|
||||||
|
src: somedir
|
||||||
|
trans_read: uncompress
|
||||||
|
trans_write: compress
|
||||||
|
profiles:
|
||||||
|
p1:
|
||||||
|
dotfiles:
|
||||||
|
- d_somedir
|
||||||
|
```
|
||||||
|
|
||||||
|
The *read* transformation `uncompress` is used to execute below command before deploying the dotfile (where `{0}` is the source and `{1}` the destination)
|
||||||
|
```
|
||||||
|
mkdir -p {1} && tar -xf {0} -C {1}
|
||||||
|
```
|
||||||
|
|
||||||
|
And the *write* transformation `compress` is run when updating the dotfile directory by compressing it (where `{0}` is the source and `{1}` the destination)
|
||||||
|
```
|
||||||
|
tar -cf {1} -C {0} .
|
||||||
|
```
|
||||||
102
docs/howto/symlinked-dotfiles.md
Normal file
102
docs/howto/symlinked-dotfiles.md
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
# Symlink dotfiles
|
||||||
|
|
||||||
|
Dotdrop offers two ways to symlink a dotfile through its
|
||||||
|
config entry `link`
|
||||||
|
|
||||||
|
* setting `link: link` for a dotfile will symlink `dst` to `src`
|
||||||
|
* setting `link: link_children` will, for every direct children of `src`, symlink `dst/<childrenX>` to `src/<childrenX>` (see [Link children](#link-children))
|
||||||
|
|
||||||
|
Where `src` is considered as the file stored in your *dotpath* and
|
||||||
|
`dst` as the file located in your `$HOME`.
|
||||||
|
|
||||||
|
Note that if the dotfile is using template directives, it will be symlinked into
|
||||||
|
`~/.config/dotdrop` instead of directly into your *dotpath*
|
||||||
|
(see [Templating symlinked dotfiles](#templating-symlinked-dotfiles))
|
||||||
|
|
||||||
|
* [Link children](#link-children)
|
||||||
|
* [Templating symlinked dotfiles](#templating-symlinked-dotfiles)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Link children
|
||||||
|
|
||||||
|
This feature can be very useful for dotfiles when you don't want the entire
|
||||||
|
directory to be symlink but still want to keep a clean config files (with a
|
||||||
|
limited number of entries).
|
||||||
|
|
||||||
|
*Make sure to do a backup of your dotfiles with something like `cp -r <my-important-dotfile>{,.bak}`*
|
||||||
|
|
||||||
|
A good example of its use is when managing `~/.vim` with dotdrop.
|
||||||
|
|
||||||
|
Here's what it looks like when using `link: link`.
|
||||||
|
```yaml
|
||||||
|
config:
|
||||||
|
dotpath: dotfiles
|
||||||
|
dotfiles:
|
||||||
|
vim:
|
||||||
|
dst: ~/.vim
|
||||||
|
src: vim
|
||||||
|
link: link
|
||||||
|
```
|
||||||
|
|
||||||
|
The top directory `~/.vim` is symlinked to the `<dotpath>/vim` location
|
||||||
|
```bash
|
||||||
|
$ readlink ~/.vim
|
||||||
|
~/.dotfiles/vim/
|
||||||
|
$ ls ~/.dotfiles/vim/
|
||||||
|
after autoload plugged plugin snippets spell swap vimrc
|
||||||
|
```
|
||||||
|
|
||||||
|
As a result, all files under `~/.vim` will be managed by
|
||||||
|
dotdrop (including unwanted directories like `spell`, `swap`, etc).
|
||||||
|
|
||||||
|
A cleaner solution is to use `link_children` which allows to only symlink
|
||||||
|
files under the dotfile directory. Let's say only `after`, `plugin`, `snippets`, and `vimrc`
|
||||||
|
need to be managed in dotdrop. `~/.vim` is imported in dotdrop, cleaned off all unwanted
|
||||||
|
files/directories and then the `link` entry is set to `link_children` in the config file.
|
||||||
|
```yaml
|
||||||
|
config:
|
||||||
|
dotpath: dotfiles
|
||||||
|
dotfiles:
|
||||||
|
vim:
|
||||||
|
dst: ~/.vim/
|
||||||
|
src: vim
|
||||||
|
link: link_children
|
||||||
|
```
|
||||||
|
|
||||||
|
Now all children of the `vim` dotfile's directory in the *dotpath* will be symlinked under `~/.vim/`
|
||||||
|
without affecting the rest of the local files, keeping the config file clean
|
||||||
|
and all unwanted files only on the local system.
|
||||||
|
```bash
|
||||||
|
$ readlink -f ~/.vim
|
||||||
|
~/.vim
|
||||||
|
$ tree -L 1 ~/.vim
|
||||||
|
~/.vim
|
||||||
|
├── after -> ~/.dotfiles/vim/after
|
||||||
|
├── autoload
|
||||||
|
├── plugged
|
||||||
|
├── plugin -> ~/.dotfiles/vim/plugin
|
||||||
|
├── snippets -> ~/.dotfiles/vim/snippets
|
||||||
|
├── spell
|
||||||
|
├── swap
|
||||||
|
└── vimrc -> ~/.dotfiles/vim/vimrc
|
||||||
|
```
|
||||||
|
|
||||||
|
# Templating symlinked dotfiles
|
||||||
|
|
||||||
|
For dotfiles not using any templating directives, those are directly linked
|
||||||
|
to dotdrop's `dotpath` directory (see [Config](config)).
|
||||||
|
|
||||||
|
When using templating directives however the dotfiles are first installed into
|
||||||
|
`workdir` (defaults to *~/.config/dotdrop*, see [Config](config))
|
||||||
|
and then symlinked there.
|
||||||
|
This applies to both dotfiles with `link: link` and `link: link_children`.
|
||||||
|
|
||||||
|
For example
|
||||||
|
```bash
|
||||||
|
# with template
|
||||||
|
/home/user/.xyz -> /home/user/.config/dotdrop/.xyz
|
||||||
|
|
||||||
|
# without template
|
||||||
|
/home/user/.xyz -> /home/user/dotfiles/xyz
|
||||||
|
```
|
||||||
35
docs/index.md
Normal file
35
docs/index.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# Welcome to the dotdrop wiki!
|
||||||
|
|
||||||
|
The idea of dotdrop is to have the ability to store each dotfile only once and deploy them with a different content on different hosts/setups. To achieve this, it uses [jinja2](http://jinja.pocoo.org/) which is a templating engine that allows to specify, during the dotfile installation with dotdrop, based on a selected profile, how (with what content) each dotfile will be installed.
|
||||||
|
|
||||||
|
Most information on using dotdrop are described in this wiki and in the [readme](https://github.com/deadc0de6/dotdrop/blob/master/README.md). For more check
|
||||||
|
|
||||||
|
* [a quick overview of dotdrop features](https://deadc0de.re/dotdrop/)
|
||||||
|
* [the blogpost on dotdrop](https://deadc0de.re/articles/dotfiles.html)
|
||||||
|
* [an example](https://github.com/deadc0de6/dotdrop#getting-started)
|
||||||
|
* [how people are using dotdrop](people-using-dotdrop)
|
||||||
|
|
||||||
|
For more examples of config file, [search github](https://github.com/search?q=filename%3Aconfig.yaml+dotdrop&type=Code).
|
||||||
|
|
||||||
|
# Wiki pages
|
||||||
|
|
||||||
|
* Documentation
|
||||||
|
* [Installation](installation)
|
||||||
|
* [Usage](usage)
|
||||||
|
* [Config file format](config)
|
||||||
|
* [Templating](templating)
|
||||||
|
* How To
|
||||||
|
* [Use actions](usage-actions)
|
||||||
|
* [Use transformations](usage-transformations)
|
||||||
|
* [Store secrets](sensitive-dotfiles)
|
||||||
|
* [Symlink dotfiles](symlinked-dotfiles)
|
||||||
|
* [Store compressed directories](store-compressed-directories)
|
||||||
|
* [Merge files when installing](merge-files-when-installing)
|
||||||
|
* [Append to a dotfile](append)
|
||||||
|
* [Manage system/global config files](global-config-files)
|
||||||
|
* [Handle special chars](special-chars)
|
||||||
|
* [Share content across dotfiles](sharing-content)
|
||||||
|
* [Ignore patterns](ignore-pattern)
|
||||||
|
* [Create special files](create-special-files)
|
||||||
|
* [Related projects](related-projects)
|
||||||
|
* [Troubleshooting](troubleshooting)
|
||||||
172
docs/installation.md
Normal file
172
docs/installation.md
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
# Installation
|
||||||
|
|
||||||
|
Installing dotdrop [as a submodule](#as-a-submodule) is the recommended way.
|
||||||
|
|
||||||
|
If you want to keep your python environment clean, use the virtualenv installation instructions
|
||||||
|
(see [As a submodule in a virtualenv](#as-a-submodule-in-a-virtualenv) and
|
||||||
|
[With pypi in a virtualenv](#with-pypi-in-a-virtualenv)).
|
||||||
|
In that case, the virtualenv environment might need to be loaded before any attempt to use dotdrop.
|
||||||
|
|
||||||
|
Installation instructions
|
||||||
|
|
||||||
|
* Installation
|
||||||
|
* [Install as a submodule](#as-a-submodule)
|
||||||
|
* [Install as a submodule in a virtualenv](#as-a-submodule-in-a-virtualenv)
|
||||||
|
* [Install with pypi](#with-pypi)
|
||||||
|
* [Install with pypi in a virtualenv](#with-pypi-in-a-virtualenv)
|
||||||
|
* [Aur packages](#aur-packages)
|
||||||
|
* [Snap package](#snap-package)
|
||||||
|
* [Setup your repository](#setup-your-repository)
|
||||||
|
* [Shell completion](#shell-completion)
|
||||||
|
* [Dependencies](dependencies)
|
||||||
|
|
||||||
|
# As a submodule
|
||||||
|
|
||||||
|
The following will create a git repository for your dotfiles and
|
||||||
|
keep dotdrop as a submodule:
|
||||||
|
```bash
|
||||||
|
## create the repository
|
||||||
|
$ mkdir dotfiles; cd dotfiles
|
||||||
|
$ git init
|
||||||
|
|
||||||
|
## install dotdrop as a submodule
|
||||||
|
$ git submodule add https://github.com/deadc0de6/dotdrop.git
|
||||||
|
$ pip3 install --user -r dotdrop/requirements.txt
|
||||||
|
$ ./dotdrop/bootstrap.sh
|
||||||
|
|
||||||
|
## use dotdrop
|
||||||
|
$ ./dotdrop.sh --help
|
||||||
|
```
|
||||||
|
|
||||||
|
For MacOS users, make sure to install `realpath` through homebrew
|
||||||
|
(part of *coreutils*).
|
||||||
|
|
||||||
|
Using this solution will need you to work with dotdrop by
|
||||||
|
using the generated script `dotdrop.sh` at the root
|
||||||
|
of your dotfiles repository.
|
||||||
|
|
||||||
|
To ease the use of dotdrop, it is recommended to add an alias to it in your
|
||||||
|
shell with the config file path, for example
|
||||||
|
```
|
||||||
|
alias dotdrop=<absolute-path-to-dotdrop.sh> --cfg=<path-to-your-config.yaml>'
|
||||||
|
```
|
||||||
|
|
||||||
|
# As a submodule in a virtualenv
|
||||||
|
|
||||||
|
To install in a [virtualenv](https://virtualenv.pypa.io):
|
||||||
|
```bash
|
||||||
|
## create the repository
|
||||||
|
$ mkdir dotfiles; cd dotfiles
|
||||||
|
$ git init
|
||||||
|
|
||||||
|
## install dotdrop as a submodule
|
||||||
|
$ git submodule add https://github.com/deadc0de6/dotdrop.git
|
||||||
|
$ virtualenv -p python3 env
|
||||||
|
$ echo 'env' > .gitignore
|
||||||
|
$ source env/bin/activate
|
||||||
|
$ pip install -r dotdrop/requirements.txt
|
||||||
|
$ ./dotdrop/bootstrap.sh
|
||||||
|
|
||||||
|
## use dotdrop
|
||||||
|
$ ./dotdrop.sh --help
|
||||||
|
```
|
||||||
|
|
||||||
|
When using a virtualenv, make sure to source the environment before using dotdrop
|
||||||
|
```bash
|
||||||
|
$ source env/bin/activate
|
||||||
|
$ ./dotdrop.sh --help
|
||||||
|
```
|
||||||
|
|
||||||
|
Then follow the instructions under [As a submodule](#as-a-submodule).
|
||||||
|
|
||||||
|
# With pypi
|
||||||
|
|
||||||
|
Install dotdrop
|
||||||
|
```bash
|
||||||
|
$ pip3 install --user dotdrop
|
||||||
|
```
|
||||||
|
|
||||||
|
and then [setup your repository](#setup-your-repository).
|
||||||
|
|
||||||
|
# With pypi in a virtualenv
|
||||||
|
|
||||||
|
Install dotdrop in a virtualenv from pypi
|
||||||
|
```bash
|
||||||
|
$ virtualenv -p python3 env
|
||||||
|
$ source env/bin/activate
|
||||||
|
$ pip install dotdrop
|
||||||
|
```
|
||||||
|
|
||||||
|
When using a virtualenv, make sure to source the environment
|
||||||
|
before using dotdrop:
|
||||||
|
```bash
|
||||||
|
$ source env/bin/activate
|
||||||
|
$ dotdrop --help
|
||||||
|
```
|
||||||
|
|
||||||
|
Then follow the instructions under [With pypi](#with-pypi).
|
||||||
|
|
||||||
|
# Aur packages
|
||||||
|
|
||||||
|
Dotdrop is available on aur:
|
||||||
|
* stable: https://aur.archlinux.org/packages/dotdrop/
|
||||||
|
* git version: https://aur.archlinux.org/packages/dotdrop-git/
|
||||||
|
|
||||||
|
Then follow the [doc to setup your repository](#setup-your-repository).
|
||||||
|
|
||||||
|
# Snap package
|
||||||
|
|
||||||
|
Dotdrop is available as a snap package: <https://snapcraft.io/dotdrop>
|
||||||
|
|
||||||
|
Install it with
|
||||||
|
```bash
|
||||||
|
snap install dotdrop
|
||||||
|
```
|
||||||
|
|
||||||
|
Then follow the [doc to setup your repository](#setup-your-repository).
|
||||||
|
|
||||||
|
# Setup your repository
|
||||||
|
|
||||||
|
Either create a repository on your prefered platform and clone it or create one locally.
|
||||||
|
This repository will contain two main elements, dotdrop's config file (`config.yaml`)
|
||||||
|
and a directory containing all your dotfiles managed by dotdrop.
|
||||||
|
```bash
|
||||||
|
## clone your repository (my-dotfiles)
|
||||||
|
$ git clone <some-url>/my-dotfiles
|
||||||
|
$ cd my-dotfiles
|
||||||
|
|
||||||
|
## within the repository create a directory to store your dotfiles
|
||||||
|
## (refered by "dotpath" in the config, which defaults to "dotfiles")
|
||||||
|
$ mkdir dotfiles
|
||||||
|
```
|
||||||
|
|
||||||
|
Then add a config file. You can get a
|
||||||
|
[minimal config file](https://github.com/deadc0de6/dotdrop/blob/master/config.yaml)
|
||||||
|
from dotdrop's repository with
|
||||||
|
```bash
|
||||||
|
$ wget https://raw.githubusercontent.com/deadc0de6/dotdrop/master/config.yaml
|
||||||
|
```
|
||||||
|
It is recommended to store your config file directly within your repository
|
||||||
|
(*my-dotfiles* in the example above) but you could save it in different places if you wish,
|
||||||
|
see [this doc](https://github.com/deadc0de6/dotdrop/wiki/config#location) for more.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ tree my-dotfiles
|
||||||
|
my-dotfiles
|
||||||
|
├── config.yaml
|
||||||
|
└── dotfiles
|
||||||
|
```
|
||||||
|
|
||||||
|
If your config file is in an exotic location, you can add an alias
|
||||||
|
in your preferred shell to call dotdrop with the config file path argument.
|
||||||
|
```
|
||||||
|
alias dotdrop='dotdrop --cfg=<path-to-your-config.yaml>'
|
||||||
|
```
|
||||||
|
|
||||||
|
For more info on the config file format, see [the config doc](https://github.com/deadc0de6/dotdrop/wiki/config)
|
||||||
|
|
||||||
|
Finally start using dotdrop with `dotdrop --help`. See the [usage doc](https://github.com/deadc0de6/dotdrop/wiki/usage) and [the example](https://github.com/deadc0de6/dotdrop/blob/master/README.md#getting-started).
|
||||||
|
|
||||||
|
# Shell completion
|
||||||
|
|
||||||
|
Completion scripts exist for `bash`, `zsh` and `fish`, see [the related doc](completion/README.md).
|
||||||
8
docs/meta/dependencies.md
Normal file
8
docs/meta/dependencies.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Beside the python dependencies defined in [requirements.txt](https://github.com/deadc0de6/dotdrop/blob/master/requirements.txt), dotdrop depends on following tools:
|
||||||
|
* `file`
|
||||||
|
* `diff`
|
||||||
|
* `mkdir`
|
||||||
|
* `git` (for the entry point script [dotdrop.sh](https://github.com/deadc0de6/dotdrop/blob/master/dotdrop.sh))
|
||||||
|
* `readlink` or `realpath` (for the entry point script [dotdrop.sh](https://github.com/deadc0de6/dotdrop/blob/master/dotdrop.sh))
|
||||||
|
|
||||||
|
For MacOS users, make sure to install `realpath` (part of `coreutils`) through [homebrew](https://brew.sh/).
|
||||||
12
docs/meta/people-using-dotdrop.md
Normal file
12
docs/meta/people-using-dotdrop.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
For more examples, see how people are using dotdrop
|
||||||
|
|
||||||
|
* [https://github.com/open-dynaMIX/dotfiles](https://github.com/open-dynaMIX/dotfiles)
|
||||||
|
* [https://github.com/moyiz/dotfiles](https://github.com/moyiz/dotfiles)
|
||||||
|
* [https://github.com/japorized/dotfiles](https://github.com/japorized/dotfiles)
|
||||||
|
* [https://gitlab.com/lyze237/dotfiles-public](https://gitlab.com/lyze237/dotfiles-public)
|
||||||
|
* [https://github.com/whitelynx/dotfiles](https://github.com/whitelynx/dotfiles)
|
||||||
|
* [https://github.com/Eluminae/dotfiles](https://github.com/Eluminae/dotfiles)
|
||||||
|
* [https://github.com/davla/dotfiles](https://github.com/davla/dotfiles) and [https://github.com/davla/setup](https://github.com/davla/setup)
|
||||||
|
|
||||||
|
Or search directly on [github](https://github.com/search?q=filename%3Aconfig.yaml+dotdrop&type=Code)
|
||||||
|
for config examples.
|
||||||
70
docs/misc/migrate-from-submodule.md
Normal file
70
docs/misc/migrate-from-submodule.md
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
|
||||||
|
**WARNING**
|
||||||
|
|
||||||
|
Only do the following if you are using dotdrop version `< 0.7.1` or if you encounter an issue when running dotdrop that redirects you here.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Initially dotdrop was only available as a submodule directly in the
|
||||||
|
dotfiles git tree. When updated to work with pypi, some code changed
|
||||||
|
that brought some issues to older versions.
|
||||||
|
|
||||||
|
If you want to keep it as a submodule (recommended), simply do the following
|
||||||
|
```bash
|
||||||
|
$ cd <dotfiles-directory>
|
||||||
|
|
||||||
|
## get latest version of the submodule
|
||||||
|
$ git submodule foreach git pull origin master
|
||||||
|
|
||||||
|
## and stage the changes
|
||||||
|
$ git add dotdrop
|
||||||
|
$ git commit -m 'update dotdrop'
|
||||||
|
|
||||||
|
## update the bash script wrapper
|
||||||
|
$ ./dotdrop/bootstrap.sh
|
||||||
|
|
||||||
|
## and stage the change to the dotdrop.sh script
|
||||||
|
$ git add dotdrop.sh
|
||||||
|
$ git commit -m 'update dotdrop.sh'
|
||||||
|
|
||||||
|
## and finally push the changes upstream
|
||||||
|
$ git push
|
||||||
|
```
|
||||||
|
|
||||||
|
Otherwise, simply install it from pypi as shown below:
|
||||||
|
|
||||||
|
* move to the dotfiles directory where dotdrop is used as a submodule
|
||||||
|
```bash
|
||||||
|
$ cd <dotfiles-repository>
|
||||||
|
```
|
||||||
|
* remove the entire `submodule "dotdrop"` section in `.gitmodules`
|
||||||
|
* stage the changes
|
||||||
|
```bash
|
||||||
|
$ git add .gitmodules
|
||||||
|
```
|
||||||
|
* remove the entire `submodule "dotdrop"` section in `.git/config`
|
||||||
|
* remove the submodule
|
||||||
|
```bash
|
||||||
|
$ git rm --cached dotdrop
|
||||||
|
```
|
||||||
|
* remove the submodule from .git
|
||||||
|
```bash
|
||||||
|
$ rm -rf .git/modules/dotdrop
|
||||||
|
```
|
||||||
|
* commit the changes
|
||||||
|
```bash
|
||||||
|
$ git commit -m 'removing dotdrop submodule'
|
||||||
|
```
|
||||||
|
* remove any remaining files from the dotdrop submodule
|
||||||
|
```bash
|
||||||
|
$ rm -rf dotdrop
|
||||||
|
```
|
||||||
|
* remove `dotdrop.sh`
|
||||||
|
```bash
|
||||||
|
$ git rm dotdrop.sh
|
||||||
|
$ git commit -m 'remove dotdrop.sh script'
|
||||||
|
```
|
||||||
|
* push upstream
|
||||||
|
```bash
|
||||||
|
$ git push
|
||||||
|
```
|
||||||
242
docs/template/templating.md
vendored
Normal file
242
docs/template/templating.md
vendored
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
# Templating
|
||||||
|
|
||||||
|
Dotdrop leverage the power of [jinja2](http://jinja.pocoo.org/) to handle the
|
||||||
|
templating of dotfiles. See [jinja2 template doc](http://jinja.pocoo.org/docs/2.9/templates/)
|
||||||
|
or the below sections for more information on how to template your dotfiles.
|
||||||
|
|
||||||
|
* [Delimiters](#delimiters)
|
||||||
|
* [Template variables](#template-variables)
|
||||||
|
* [Dotfile variables](#dotfile-variables)
|
||||||
|
* [Environment variables](#environment-variables)
|
||||||
|
* [Dotdrop header](#dotdrop-header)
|
||||||
|
* [Available methods](#available-methods)
|
||||||
|
* [Available filters](#available-filters)
|
||||||
|
* [Import macros](#import-macros)
|
||||||
|
* [Ignore empty template](#ignore-empty-template)
|
||||||
|
* [Include file or template in template](#include-file-or-template-in-template)
|
||||||
|
* [Debug templates](#debug-templates)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Delimiters
|
||||||
|
|
||||||
|
Dotdrop uses different delimiters than
|
||||||
|
[jinja2](http://jinja.pocoo.org/)'s defaults:
|
||||||
|
|
||||||
|
* block/statement start = `{%@@`
|
||||||
|
* block/statement end = `@@%}`
|
||||||
|
* variable/expression start = `{{@@`
|
||||||
|
* variable/expression end = `@@}}`
|
||||||
|
* comment start = `{#@@`
|
||||||
|
* comment end = `@@#}`
|
||||||
|
|
||||||
|
More info in [jinja2 templating doc](https://jinja.palletsprojects.com/en/2.11.x/templates/?highlight=delimiter)
|
||||||
|
|
||||||
|
# Template variables
|
||||||
|
|
||||||
|
Following variables are available in templates:
|
||||||
|
|
||||||
|
* `{{@@ profile @@}}` contains the profile provided to dotdrop.
|
||||||
|
* `{{@@ env['MY_VAR'] @@}}` contains environment variables (see [Environment variables](#environment-variables)).
|
||||||
|
* `{{@@ header() @@}}` contains dotdrop header (see [Dotdrop header](#dotdrop-header)).
|
||||||
|
* `{{@@ _dotdrop_dotpath @@}}` contains the [dotpath](https://github.com/deadc0de6/dotdrop/wiki/config) absolute path.
|
||||||
|
* `{{@@ _dotdrop_cfgpath @@}}` contains the absolute path to the [config file](https://github.com/deadc0de6/dotdrop/wiki/config).
|
||||||
|
* `{{@@ _dotdrop_workdir @@}}` contains the [workdir](https://github.com/deadc0de6/dotdrop/wiki/config) absolute path.
|
||||||
|
* dotfile specific variables (see [Dotfile variables](#dotfile-variables))
|
||||||
|
* config variables (see [Variables](config-variables)).
|
||||||
|
* config interpreted variables (see [Interpreted variables](config-variables)).
|
||||||
|
|
||||||
|
# Dotfile variables
|
||||||
|
|
||||||
|
When a dotfile is handled by dotdrop, the following variables are added:
|
||||||
|
|
||||||
|
* `{{@@ _dotfile_abs_src @@}}` contains the processed dotfile absolute source path.
|
||||||
|
* `{{@@ _dotfile_abs_dst @@}}` contains the processed dotfile absolute destination path.
|
||||||
|
* `{{@@ _dotfile_key @@}}` contains the processed dotfile key.
|
||||||
|
* `{{@@ _dotfile_link @@}}` contains the processed dotfile `link` string value.
|
||||||
|
|
||||||
|
Additionally to the above, the following variables are set in each file processed by dotdrop.
|
||||||
|
|
||||||
|
* `{{@@ _dotfile_sub_abs_src @@}}` contains the absolute source path of each file when handled by dotdrop.
|
||||||
|
* `{{@@ _dotfile_sub_abs_dst @@}}` contains the absolute destination path of each file when handled by dotdrop.
|
||||||
|
|
||||||
|
For example a directory dotfile (like `~/.ssh`) would process several files
|
||||||
|
(`~/.ssh/config` and `~/.ssh/authorized_keys` for example). In `~/.ssh/config`:
|
||||||
|
* `_dotfile_abs_dst` would be `/home/user/.ssh`
|
||||||
|
* `_dotfile_sub_abs_dst` would be `/home/user/.ssh/config`
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
|
|
||||||
|
It's possible to access environment variables inside the templates.
|
||||||
|
```
|
||||||
|
{{@@ env['MY_VAR'] @@}}
|
||||||
|
```
|
||||||
|
|
||||||
|
This allows for storing host-specific properties and/or secrets in environment variables.
|
||||||
|
It is recommended to use `variables` (see [Config variables](#config-variables))
|
||||||
|
instead of environment variables unless these contain sensitive information that
|
||||||
|
shouldn't be versioned in git.
|
||||||
|
|
||||||
|
For example you can have a `.env` file in the directory where your `config.yaml` lies:
|
||||||
|
```
|
||||||
|
## Some secrets
|
||||||
|
pass="verysecurepassword"
|
||||||
|
```
|
||||||
|
If this file contains secrets that should not be tracked by git,
|
||||||
|
put it in your `.gitignore`.
|
||||||
|
|
||||||
|
You can then invoke dotdrop with the help of an alias
|
||||||
|
```bash
|
||||||
|
# when dotdrop is installed as a submodule
|
||||||
|
alias dotdrop='eval $(grep -v "^#" ~/dotfiles/.env) ~/dotfiles/dotdrop.sh'
|
||||||
|
|
||||||
|
# when dotdrop is installed from pypi or aur
|
||||||
|
alias dotdrop='eval $(grep -v "^#" ~/dotfiles/.env) /usr/bin/dotdrop --cfg=~/dotfiles/config.yaml'
|
||||||
|
```
|
||||||
|
|
||||||
|
The above aliases load all the variables from `~/dotfiles/.env`
|
||||||
|
(while omitting lines starting with `#`) before calling dotdrop.
|
||||||
|
|
||||||
|
# Dotdrop header
|
||||||
|
|
||||||
|
Dotdrop is able to insert a header in the generated dotfiles. This allows
|
||||||
|
to remind anyone opening the file for editing that this file is managed by dotdrop.
|
||||||
|
|
||||||
|
Here's what it looks like:
|
||||||
|
```
|
||||||
|
This dotfile is managed using dotdrop
|
||||||
|
```
|
||||||
|
|
||||||
|
The header can be automatically added with:
|
||||||
|
```
|
||||||
|
{{@@ header() @@}}
|
||||||
|
```
|
||||||
|
|
||||||
|
Properly commenting the header in templates is the responsibility of the user
|
||||||
|
as [jinja2](http://jinja.pocoo.org/) has no way of knowing what is the proper char(s) used for comments.
|
||||||
|
Either prepend the directive with the commenting char(s) used in the dotfile
|
||||||
|
(for example `# {{@@ header() @@}}`) or provide it as an argument `{{@@ header('# ') @@}}`.
|
||||||
|
The result is equivalent.
|
||||||
|
|
||||||
|
# Available methods
|
||||||
|
|
||||||
|
Beside [jinja2 global functions](http://jinja.pocoo.org/docs/2.10/templates/#list-of-global-functions)
|
||||||
|
the following methods can be used within the templates:
|
||||||
|
|
||||||
|
* `exists(path)`: return true when path exists
|
||||||
|
```
|
||||||
|
{%@@ if exists('/dev/null') @@%}
|
||||||
|
it does exist
|
||||||
|
{%@@ endif @@%}
|
||||||
|
```
|
||||||
|
|
||||||
|
* `exists_in_path(name, path=None)`: return true when executable exists in `$PATH`
|
||||||
|
```
|
||||||
|
{%@@ if exists_in_path('exa') @@%}
|
||||||
|
alias ls='exa --git --color=always'
|
||||||
|
{%@@ endif @@%}
|
||||||
|
```
|
||||||
|
|
||||||
|
* `basename(path)`: return the `basename` of the path argument
|
||||||
|
```
|
||||||
|
{%@@ set dotfile_filename = basename( _dotfile_abs_dst ) @@%}
|
||||||
|
dotfile dst filename: {{@@ dotfile_filename @@}}
|
||||||
|
```
|
||||||
|
|
||||||
|
* `dirname(path)`: return the `dirname` of the path argument
|
||||||
|
```
|
||||||
|
{%@@ set dotfile_dirname = dirname( _dotfile_abs_dst ) @@%}
|
||||||
|
dotfile dst dirname: {{@@ dotfile_dirname @@}}
|
||||||
|
```
|
||||||
|
|
||||||
|
Custom user-defined functions can be loaded with the help of the
|
||||||
|
config entry `func_file`.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
config:
|
||||||
|
func_file:
|
||||||
|
- /tmp/myfuncs_file.py
|
||||||
|
```
|
||||||
|
|
||||||
|
`/tmp/myfuncs_file.py`
|
||||||
|
```python
|
||||||
|
def myfunc(arg):
|
||||||
|
return not arg
|
||||||
|
```
|
||||||
|
|
||||||
|
dotfile content
|
||||||
|
```
|
||||||
|
{%@@ if myfunc(False) @@%}
|
||||||
|
this should exist
|
||||||
|
{%@@ endif @@%}
|
||||||
|
```
|
||||||
|
|
||||||
|
# Available filters
|
||||||
|
|
||||||
|
Beside [jinja2 builtin filters](https://jinja.palletsprojects.com/en/2.10.x/templates/#builtin-filters)
|
||||||
|
custom user-defined filter functions can be loaded using the config entry `filter_file`:
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
config:
|
||||||
|
filter_file:
|
||||||
|
- /tmp/myfilter_file.py
|
||||||
|
```
|
||||||
|
|
||||||
|
`/tmp/myfilter_file.py`
|
||||||
|
```python
|
||||||
|
def myfilter(arg1):
|
||||||
|
return str(int(arg1) - 10)
|
||||||
|
```
|
||||||
|
|
||||||
|
dotfile content
|
||||||
|
```
|
||||||
|
{{@@ "13" | myfilter() @@}}
|
||||||
|
```
|
||||||
|
|
||||||
|
For more information on how to create filters,
|
||||||
|
see [jinja2 official doc](https://jinja.palletsprojects.com/en/2.10.x/api/#writing-filters).
|
||||||
|
|
||||||
|
# Import macros
|
||||||
|
|
||||||
|
Macros must be imported `with context` in order to have access to the variables:
|
||||||
|
```
|
||||||
|
{%@@ from 'macro_file' import macro with context @@%}
|
||||||
|
```
|
||||||
|
|
||||||
|
For more see the [dedicated jinja2 doc](https://jinja.palletsprojects.com/en/2.11.x/templates/#macros).
|
||||||
|
|
||||||
|
# Ignore empty template
|
||||||
|
|
||||||
|
It is possible to avoid having an empty rendered template being
|
||||||
|
deployed by setting the `ignoreempty` entry to *true*. This can be set
|
||||||
|
globally for all dotfiles or only for specific dotfiles.
|
||||||
|
|
||||||
|
For more see the [Config](config).
|
||||||
|
|
||||||
|
# Include file or template in template
|
||||||
|
|
||||||
|
[Jinja2](http://jinja.pocoo.org/docs/2.10/templates/) provides the ability to include an external file/template from within a template with the directive `include`. See the [related doc](http://jinja.pocoo.org/docs/2.10/templates/#include) for more. The path must be relative to the `dotpath`.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
```yaml
|
||||||
|
{%@@ include 'colors/black.colors' @@%}
|
||||||
|
```
|
||||||
|
|
||||||
|
Of course, paths could be also dynamically generated using variables.
|
||||||
|
For example:
|
||||||
|
```yaml
|
||||||
|
{%@@ include colors_path + '/black.colors' @@%}
|
||||||
|
```
|
||||||
|
|
||||||
|
# Debug templates
|
||||||
|
|
||||||
|
To debug the result of a template, one can install the dotfiles to a temporary
|
||||||
|
directory with the `install` command and the `-t` switch:
|
||||||
|
```bash
|
||||||
|
$ dotdrop install -t
|
||||||
|
Installed to tmp /tmp/dotdrop-6ajz7565
|
||||||
|
```
|
||||||
304
docs/usage.md
Normal file
304
docs/usage.md
Normal file
@@ -0,0 +1,304 @@
|
|||||||
|
# Usage
|
||||||
|
|
||||||
|
Run `dotdrop --help` to see all available options.
|
||||||
|
|
||||||
|
* [Basic use](#basic-use)
|
||||||
|
* Commands:
|
||||||
|
* [Install dotfiles](#install-dotfiles)
|
||||||
|
* [Compare dotfiles](#compare-dotfiles)
|
||||||
|
* [Import dotfiles](#import-dotfiles)
|
||||||
|
* [List profiles](#list-profiles)
|
||||||
|
* [List dotfiles](#list-dotfiles)
|
||||||
|
* [Update dotfiles](#update-dotfiles)
|
||||||
|
* [Remove dotfiles](#remove-dotfiles)
|
||||||
|
* Uses
|
||||||
|
* [Use actions](usage-actions)
|
||||||
|
* [Use transformations](usage-transformations)
|
||||||
|
* [Update dotdrop](#update-dotdrop)
|
||||||
|
* [Environment variables](#environment-variables)
|
||||||
|
* [User tricks](#user-tricks)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Basic use
|
||||||
|
|
||||||
|
The basic use of dotdrop is
|
||||||
|
* import a file/directory to manage (this will copy the files from the filesystem to your `dotpath`): `dotdrop import <somefile>`
|
||||||
|
* install the dotfiles (will *copy/link* those from your `dotpath` to the filesystem): `dotdrop install`
|
||||||
|
|
||||||
|
Then if you happen to update the file/directory directly on the filesystem (add new file/dir, edit content, etc) you can use `update` to mirror back those changes in the `dotpath` of dotdrop.
|
||||||
|
|
||||||
|
For more advanced uses:
|
||||||
|
* See [this wiki](https://github.com/deadc0de6/dotdrop/wiki)
|
||||||
|
* `dotdrop --help` for more options.
|
||||||
|
* [the example](https://github.com/deadc0de6/dotdrop#getting-started)
|
||||||
|
|
||||||
|
# Install dotfiles
|
||||||
|
|
||||||
|
Simply run
|
||||||
|
```bash
|
||||||
|
$ dotdrop install
|
||||||
|
```
|
||||||
|
|
||||||
|
options
|
||||||
|
|
||||||
|
* `-t --temp`: install the dotfile(s) to a temporary directory for review (it helps to debug templating issues for example). Note that actions are not executed in that mode.
|
||||||
|
* `-a --force-actions`: force the execution of actions even if the dotfiles are not installed
|
||||||
|
|
||||||
|
For more detail, see the usage with `dotdrop --help`
|
||||||
|
|
||||||
|
To ignore specific pattern during installation see [the dedicated wiki page](ignore-pattern)
|
||||||
|
|
||||||
|
# Compare dotfiles
|
||||||
|
|
||||||
|
Compare local dotfiles with the ones stored in dotdrop:
|
||||||
|
```bash
|
||||||
|
$ dotdrop compare
|
||||||
|
```
|
||||||
|
|
||||||
|
The diffing is done by `diff` in the backend, one can provide its specific
|
||||||
|
diff command using the config option `diff_command`.
|
||||||
|
|
||||||
|
To ignore specific pattern,
|
||||||
|
see [the dedicated wiki page](ignore-pattern)
|
||||||
|
|
||||||
|
It is also possible to install all dotfiles for a specific profile
|
||||||
|
in a temporary directory in order to manually compare them with
|
||||||
|
the local version by using `install` and the `-t` switch.
|
||||||
|
|
||||||
|
# Import dotfiles
|
||||||
|
|
||||||
|
Dotdrop allows to import dotfiles directly from the
|
||||||
|
filesystem. It will copy the dotfile and update the
|
||||||
|
config file automatically.
|
||||||
|
|
||||||
|
Note that dotdrop will dereference all symlinks
|
||||||
|
when importing a file or directory (see [issue #184](https://github.com/deadc0de6/dotdrop/issues/184) for more)
|
||||||
|
|
||||||
|
For example to import `~/.xinitrc`
|
||||||
|
```bash
|
||||||
|
$ dotdrop import ~/.xinitrc
|
||||||
|
```
|
||||||
|
|
||||||
|
You can control how the dotfile key is generated in the config file
|
||||||
|
with the option `longkey` (per default to *false*).
|
||||||
|
|
||||||
|
Two formats are available:
|
||||||
|
|
||||||
|
* *short format* (default): take the shortest unique path
|
||||||
|
* *long format*: take the full path
|
||||||
|
|
||||||
|
For example `~/.config/awesome/rc.lua` gives
|
||||||
|
|
||||||
|
* `f_rc.lua` in the short format
|
||||||
|
* `f_config_awesome_rc.lua` in the long format
|
||||||
|
|
||||||
|
Importing `~/.mutt/colors` and then `~/.vim/colors` will result in
|
||||||
|
|
||||||
|
* `d_colors` and `d_vim_colors` in the short format
|
||||||
|
* `d_mutt_colors` and `d_vim_colors` in the long format
|
||||||
|
|
||||||
|
Dotfile can be imported as a different file with the use
|
||||||
|
of the command line switch `--as`. It is however recommended
|
||||||
|
to use the [[templating]] to avoid duplicates and optimize
|
||||||
|
dotfiles management.
|
||||||
|
```bash
|
||||||
|
$ dotdrop import ~/.zshrc --as=~/.zshrc.test
|
||||||
|
```
|
||||||
|
|
||||||
|
# List profiles
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ dotdrop profiles
|
||||||
|
```
|
||||||
|
|
||||||
|
Dotdrop allows to choose which profile to use
|
||||||
|
with the `--profile` switch if you use something
|
||||||
|
else than the default (the hostname).
|
||||||
|
|
||||||
|
The default profile can also be changed by defining the
|
||||||
|
`DOTDROP_PROFILE` environment variable.
|
||||||
|
|
||||||
|
# List dotfiles
|
||||||
|
|
||||||
|
The following command lists the different dotfiles
|
||||||
|
configured for a specific profile:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ dotdrop files --profile=<some-profile>
|
||||||
|
```
|
||||||
|
|
||||||
|
For example:
|
||||||
|
```
|
||||||
|
Dotfile(s) for profile "some-profile":
|
||||||
|
f_vimrc (file: "vimrc", link: nolink)
|
||||||
|
-> ~/.vimrc
|
||||||
|
f_dunstrc (file: "config/dunst/dunstrc", link: nolink)
|
||||||
|
-> ~/.config/dunst/dunstrc
|
||||||
|
```
|
||||||
|
|
||||||
|
By using the `-T --template` switch, only the dotfiles that
|
||||||
|
are using [jinja2](http://jinja.pocoo.org/) directives are listed.
|
||||||
|
|
||||||
|
It is also possible to list all files related to each dotfile entries
|
||||||
|
by invoking the `detail` command, for example:
|
||||||
|
```bash
|
||||||
|
$ dotdrop detail
|
||||||
|
dotfiles details for profile "some-profile":
|
||||||
|
f_tmux.conf (dst: "~/.tmux.conf", link: nolink)
|
||||||
|
-> /home/user/dotfiles/tmux.conf (template:no)
|
||||||
|
f_vimrc (dst: "~/.vimrc", link: nolink)
|
||||||
|
-> /home/user/dotfiles/vimrc (template:no)
|
||||||
|
```
|
||||||
|
|
||||||
|
This is especially useful when the dotfile entry is a directory
|
||||||
|
and one wants to have information on the different files (is it
|
||||||
|
a templated file, etc).
|
||||||
|
|
||||||
|
# Update dotfiles
|
||||||
|
|
||||||
|
Dotfiles managed by dotdrop can be updated using the `update` command. When updating, only
|
||||||
|
dotfiles that have differences with the stored version are updated.
|
||||||
|
A confirmation is requested from the user before any overwrite/update unless the
|
||||||
|
`-f --force` switch is used.
|
||||||
|
|
||||||
|
Either provide the path of the file containing the new version of the dotfile or
|
||||||
|
provide the dotfile key to update (as found in the config file) along with the `-k --key` switch.
|
||||||
|
When using the `-k --key` switch and no key is provided, all dotfiles for that profile are updated.
|
||||||
|
```bash
|
||||||
|
# update by path
|
||||||
|
$ dotdrop update ~/.vimrc
|
||||||
|
|
||||||
|
# update by key with the --key switch
|
||||||
|
$ dotdrop update --key f_vimrc
|
||||||
|
```
|
||||||
|
|
||||||
|
If not argument is provided, all dotfiles for the selected profile are updated.
|
||||||
|
|
||||||
|
To ignore specific pattern,
|
||||||
|
see [the dedicated wiki page](ignore-pattern)
|
||||||
|
|
||||||
|
There are two cases when updating a dotfile:
|
||||||
|
|
||||||
|
## The dotfile doesn't use [templating](templating)
|
||||||
|
|
||||||
|
The new version of the dotfile is copied to the *dotpath* directory and overwrites
|
||||||
|
the old version. If git is used to version the dotfiles stored by dotdrop, the git command
|
||||||
|
`diff` can be used to view the changes.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ dotdrop update ~/.vimrc
|
||||||
|
$ git diff
|
||||||
|
```
|
||||||
|
|
||||||
|
## The dotfile uses [templating](templating)
|
||||||
|
|
||||||
|
The dotfile must be manually updated, three solutions can be used to identify the
|
||||||
|
changes to apply to the template:
|
||||||
|
|
||||||
|
* Use dotdrop's `compare` command
|
||||||
|
```bash
|
||||||
|
# use compare to identify change(s)
|
||||||
|
$ dotdrop compare --file=~/.vimrc
|
||||||
|
```
|
||||||
|
|
||||||
|
* Call `update` with the `-P --show-patch` switch that will provide with an ad-hoc solution
|
||||||
|
to manually patch the template file using a temporary generated version of the template
|
||||||
|
(this isn't a bullet proof solution and might need manual checking)
|
||||||
|
```bash
|
||||||
|
# get an ad-hoc solution to manually patch the template
|
||||||
|
$ dotdrop update --show-patch ~/.vimrc
|
||||||
|
[WARN] /home/user/dotfiles/vimrc uses template, update manually
|
||||||
|
[WARN] try patching with: "diff -u /tmp/dotdrop-sbx6hw0r /home/user/.vimrc | patch /home/user/dotfiles/vimrc"
|
||||||
|
```
|
||||||
|
|
||||||
|
* Install the dotfiles to a temporary directory (using the `install` command and the
|
||||||
|
`-t` switch) and compare the generated dotfile with the local one.
|
||||||
|
```bash
|
||||||
|
# use install to identify change(s)
|
||||||
|
$ dotdrop install -t
|
||||||
|
Installed to tmp /tmp/dotdrop-6ajz7565
|
||||||
|
$ diff ~/.vimrc /tmp/dotdrop-6ajz7565/home/user/.vimrc
|
||||||
|
```
|
||||||
|
|
||||||
|
It is also possible to install only specific dotfiles by providing their keys
|
||||||
|
in the command line. For example for a dotfile having a key `f_zshrc` in the config file.
|
||||||
|
```bash
|
||||||
|
$ dotdrop install -t f_zshrc
|
||||||
|
```
|
||||||
|
|
||||||
|
# Remove dotfiles
|
||||||
|
|
||||||
|
The command `remove` allows to stop managing a specific dotfile with
|
||||||
|
dotdrop. It will:
|
||||||
|
|
||||||
|
* remove the entry in the config file (under `dotfiles` and `profile`)
|
||||||
|
* remove the file from the `dotpath`
|
||||||
|
|
||||||
|
# Update dotdrop
|
||||||
|
|
||||||
|
If using dotdrop as a submodule, one can control if dotdrop
|
||||||
|
is auto-updated through the [dotdrop.sh](https://github.com/deadc0de6/dotdrop/blob/master/dotdrop.sh)
|
||||||
|
script by defining the environment variable `DOTDROP_AUTOUPDATE=yes`.
|
||||||
|
If undefined, `DOTDROP_AUTOUPDATE` will take the value `yes`.
|
||||||
|
|
||||||
|
If used as a submodule, update it with
|
||||||
|
```bash
|
||||||
|
$ git submodule update --init --recursive
|
||||||
|
$ git submodule update --remote dotdrop
|
||||||
|
```
|
||||||
|
|
||||||
|
You will then need to commit the changes with
|
||||||
|
```bash
|
||||||
|
$ git add dotdrop
|
||||||
|
$ git commit -m 'update dotdrop'
|
||||||
|
$ git push
|
||||||
|
```
|
||||||
|
|
||||||
|
Or if installed through pypi:
|
||||||
|
```bash
|
||||||
|
$ pip3 install --user dotdrop --upgrade
|
||||||
|
```
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
|
|
||||||
|
Following environment variables can be used to specify different CLI options.
|
||||||
|
Note that CLI switches take precedence over environment variables (except for `DOTDROP_FORCE_NODEBUG`)
|
||||||
|
|
||||||
|
* `DOTDROP_PROFILE`: `-p --profile`
|
||||||
|
```bash
|
||||||
|
export DOTDROP_PROFILE="my-fancy-profile"
|
||||||
|
```
|
||||||
|
* `DOTDROP_CONFIG`: `-c --cfg`
|
||||||
|
```bash
|
||||||
|
export DOTDROP_CONFIG="/home/user/dotdrop/config.yaml"
|
||||||
|
```
|
||||||
|
* `DOTDROP_NOBANNER`: `-b --no-banner`
|
||||||
|
```bash
|
||||||
|
export DOTDROP_NOBANNER=
|
||||||
|
```
|
||||||
|
* `DOTDROP_DEBUG`: `-V --verbose`
|
||||||
|
```bash
|
||||||
|
export DOTDROP_DEBUG=
|
||||||
|
```
|
||||||
|
* `DOTDROP_FORCE_NODEBUG`: disable debug outputs even if `-V --verbose` is provided or `DOTDROP_DEBUG` is set
|
||||||
|
```bash
|
||||||
|
export DOTDROP_FORCE_NODEBUG=
|
||||||
|
```
|
||||||
|
|
||||||
|
# User tricks
|
||||||
|
|
||||||
|
## Improve git integration
|
||||||
|
|
||||||
|
The below aliases can help with the process of updating your dotfiles between multiple hosts. Add those to your `~/.zshrc` or `~/.bashrc`. You can then simply run `dotsync` to push or pull from your dotfile repository.
|
||||||
|
|
||||||
|
```
|
||||||
|
# Your dotdrop git repository location
|
||||||
|
export DOTREPO="/path/to/your/dotdrop/repo"
|
||||||
|
|
||||||
|
alias dotdrop="$DOTREPO/dotdrop.sh"
|
||||||
|
alias dotgit="git -C $DOTREPO"
|
||||||
|
alias dotsync="dotgit pull && dotgit add -A && dotgit commit && dotgit push; dotdrop install"
|
||||||
|
```
|
||||||
|
|
||||||
|
Provided by [ReekyMarko](https://github.com/ReekyMarko)
|
||||||
18
mkdocs.yml
Normal file
18
mkdocs.yml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
site_name: dotdrop
|
||||||
|
site_url: https://github.com/deadc0de6/dotdrop
|
||||||
|
repo_url: https://github.com/deadc0de6/dotdrop
|
||||||
|
theme:
|
||||||
|
name: readthedocs
|
||||||
|
highlightjs: true
|
||||||
|
use_directory_urls: true
|
||||||
|
markdown_extensions:
|
||||||
|
- mdx_truly_sane_lists
|
||||||
|
nav:
|
||||||
|
- Home: 'index.md'
|
||||||
|
- Installation: 'installation.md'
|
||||||
|
- Usage: 'usage.md'
|
||||||
|
- Config: 'config/config.md'
|
||||||
|
- Template: 'template/templating.md'
|
||||||
|
- HowTo: 'howto/index.md'
|
||||||
|
- Dependencies: 'meta/dependencies.md'
|
||||||
|
- People using dotdrop: 'meta/people-using-dotdrop.md'
|
||||||
Reference in New Issue
Block a user