Save your dotfiles once, deploy them everywhere
Project description
DOTDROP
Save your dotfiles once, deploy them everywhere
Dotdrop makes the management of dotfiles between different hosts easy. It allows to store your dotfiles on git and automagically deploy different versions of the same file on different setups.
It also allows to manage different sets of dotfiles. For example you can have a set of dotfiles for your home laptop and a different set for your office desktop. Those sets may overlap and different versions of the same dotfiles can be deployed on different predefined profiles. Or you may have a main set of dotfiles for your everyday’s host and a sub-set you only need to deploy to temporary hosts (cloud VM, etc) that may be using a slightly different version of some of the dotfiles.
Features:
Sync once every dotfile on git for different usages
Allow dotfiles templating by leveraging jinja2
Dynamically generated dotfile contents with pre-defined variables
Comparison between deployed and stored dotfiles
Handling multiple profiles with different sets of dotfiles
Easy import and update dotfiles
Handle files and directories
Support symlink of dotfiles
Associate an action to the deployment of specific dotfiles
Associate transformations for storing encrypted dotfiles
Provide different solutions for handling dotfiles containing sensitive information
Check also the blog post, the example, the wiki or how people are using dotdrop for more.
Quick start:
mkdir dotfiles && cd dotfiles
git init
git submodule add https://github.com/deadc0de6/dotdrop.git
sudo pip3 install -r dotdrop/requirements.txt
./dotdrop/bootstrap.sh
./dotdrop.sh --help
A mirror of this repository is available on gitlab under https://gitlab.com/deadc0de6/dotdrop.
Why dotdrop ?
There exist many tools to manage dotfiles however not many allow to deploy different versions of the same dotfile on different hosts. Moreover dotdrop allows to specify the set of dotfiles that need to be deployed on a specific profile.
See the example for a concrete example on why dotdrop rocks.
Table of Contents
Installation
There are multiple ways to install and use dotdrop. It is recommended to install dotdrop as a submodule to your dotfiles git tree. Having dotdrop as a submodule guarantees that anywhere you are cloning your dotfiles git tree from you’ll have dotdrop shipped with it.
Below instructions show how to install dotdrop as a submodule. For alternative installation instructions (with virtualenv, pypi, aur, snap, etc), see the wiki installation page.
Dotdrop is also available on * pypi: https://pypi.org/project/dotdrop/ * aur (stable): https://aur.archlinux.org/packages/dotdrop/ * aur (git version): https://aur.archlinux.org/packages/dotdrop-git/ * snapcraft: https://snapcraft.io/dotdrop
As a submodule
The following will create a git repository for your dotfiles and keep dotdrop as a submodule:
## create the repository
$ mkdir dotfiles; cd dotfiles
$ git init
## install dotdrop as a submodule
$ git submodule add https://github.com/deadc0de6/dotdrop.git
$ sudo pip3 install -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>'
For bash and zsh completion scripts see the related doc.
Getting started
Create a new repository to store your dotfiles with dotdrop. Init or clone that new repository and install dotdrop.
Then import any dotfiles (file or directory) you want to manage with dotdrop. You can either use the default profile (which resolves to the hostname of the host your running dotdrop on) or provide it specifically using the switch -p --profile.
Import dotfiles on host hostname1
$ dotdrop import ~/.vimrc ~/.xinitrc ~/.config/polybar
Dotdrop does two things:
Copy the dotfiles in the dotpath directory (defined in config.yaml, defaults to dotfiles)
Create the entries in the config.yaml file
Your config file will look something similar to this
config:
backup: true
banner: true
create: true
dotpath: dotfiles
ignoreempty: false
keepdot: false
link_by_default: false
longkey: false
showdiff: false
workdir: ~/.config/dotdrop
dotfiles:
d_polybar:
dst: ~/.config/polybar
src: config/polybar
f_vimrc:
dst: ~/.vimrc
src: vimrc
f_xinitrc:
dst: ~/.xinitrc
src: xinitrc
profiles:
hostname1:
dotfiles:
- f_vimrc
- f_xinitrc
- d_polybar
For a description of the different fields and their use, see the config doc.
Commit and push your changes.
Then go to another host where your dotfiles need to be managed as well, clone the previously setup repository and compare the local dotfiles with the ones stored by dotdrop:
$ dotdrop compare --profile=hostname1
Now you might want to adapt the config.yaml file to your likings on that second host. Let’s say for example that you only want d_polybar and f_xinitrc to be deployed on that second host. You would then change your config to something like this (considering that second host’s hostname is hostname2):
…
profiles:
hostname1:
dotfiles:
- f_vimrc
- f_xinitrc
- d_polybar
hostname2:
dotfiles:
- f_xinitrc
- d_polybar
Then adapt any dotfile using the templating feature (if needed). For example you might want different fonts sizes on polybar for the different hosts:
<dotpath>/config/polybar/config
…
{%@@ if profile == "hostname1" @@%}
font0 = sans:size=10;0
{%@@ elif profile == "hostname2" @@%}
font0 = sans:size=14;0
{%@@ endif @@%}
font1 = "Material Design Icons:style=Regular:size=14;0"
font2 = "unifont:size=6;0"
…
When done, you can install your dotfiles using
$ dotdrop install
If you are unsure, you can always run dotdrop compare to see how your local dotfiles would be updated by dotdrop before running install.
That’s it, a single repository with all your dotfiles for your different hosts.
You can then create actions, use transformations, symlink dotfiles, etc.
For more options see dotdrop --help and the wiki.
Documentation
Dotdrop’s documentation is hosted on its wiki.
Example
Let’s consider two hosts:
home: home computer with hostname home
office: office computer with hostname office
The home computer is running awesomeWM and the office computer bspwm. The .xinitrc file will therefore be different while still sharing some lines. Dotdrop allows to store only one single .xinitrc file but to deploy different versions of it depending on where it is run from.
The following file is the dotfile stored in dotdrop containing jinja2 directives for the deployment based on the profile used.
#!/bin/bash
# load Xresources
userresources=$HOME/.Xresources
if [ -f "$userresources" ]; then
xrdb -merge "$userresources" &
fi
# launch the wm
{%@@ if profile == "home" @@%}
exec awesome
{%@@ elif profile == "office" @@%}
exec bspwm
{%@@ endif @@%}
The if branch will define which part is deployed based on the hostname of the host on which dotdrop is run from.
And here’s how the config file looks like with this setup. Of course any combination of the dotfiles (different sets) can be done if more dotfiles have to be deployed.
config.yaml file:
config:
backup: true
create: true
dotpath: dotfiles
dotfiles:
f_xinitrc:
dst: ~/.xinitrc
src: xinitrc
profiles:
home:
dotfiles:
- f_xinitrc
office:
dotfiles:
- f_xinitrc
Installing the dotfiles (the --profile switch is not needed if the hostname matches the profile entry in the config file):
## on home computer
$ dotdrop install --profile=home
## on office computer
$ dotdrop install --profile=office
Comparing the dotfiles:
$ dotdrop compare
For more see the wiki.
Contribution
If you are having trouble installing or using dotdrop, open an issue.
If you want to contribute, feel free to do a PR (please follow PEP8).
License
This project is licensed under the terms of the GPLv3 license.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file dotdrop-0.26.1.tar.gz
.
File metadata
- Download URL: dotdrop-0.26.1.tar.gz
- Upload date:
- Size: 44.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 72632bbd938fad370d2d359b0c5758c261ff490c253085c8b62a516d94273bb2 |
|
MD5 | 505769f470536e2579d3b5a4756a3341 |
|
BLAKE2b-256 | 10c5987c18d09e3fcffe7bd99e4c4394c82e81e18eabdca5a9d065777752ced1 |
File details
Details for the file dotdrop-0.26.1-py3-none-any.whl
.
File metadata
- Download URL: dotdrop-0.26.1-py3-none-any.whl
- Upload date:
- Size: 44.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 389e71d5f815ad1ce5ae2e64b5f7b9fff913304c603c7ea164b18d7fdf5e4771 |
|
MD5 | 56625b7db0614c0b5835064517277570 |
|
BLAKE2b-256 | e144492f1ee32b0df3866110f4636913fee95c33afeda4738e635977554807e4 |