Dotfiles manager utility
Go to file
Sean Hammond ec76c782c6 Expand args to absolute paths before checking their validity.
This fixes a bug in which the validity of FROM_DIR and TO_DIR were
checked before ~ and relative paths in those arguments were expanded,
sometimes this could cause dotfilemanager to complain that a valid path
was invalid. Expand the paths and _then_ check their validity.

You can now just do `dotfilemanager tidy` (with no further arguments) to
tidy up symlinks in your homedir, and `dotfilemanager report` or
`dotfilemanager link` to report on or make links from ~ into
~/.dotfiles.
2010-05-01 00:34:45 +01:00
.gitignore Initial commit. Feature-complete except for recursing into 2009-11-11 15:09:37 +00:00
dotfilemanager.py Expand args to absolute paths before checking their validity. 2010-05-01 00:34:45 +01:00
README.markdown Move the gian docstring into a README file. 2010-03-08 00:06:46 +00:00

dotfilemanager.py - a dotfiles manager script.

This is similar to Steve Kemp's dotfile manager but I rewrote it in Python and tweaked the behaviour a bit.

The idea is that you have some folder called the TO_DIR (defaults to ~/.dotfiles), where you move all the dotfiles that you want to manage, e.g.

~/.dotfiles/
~/.dotfiles/_muttrc
~/.dotfiles/_nanorc
...

You can backup and synchronise this directory between multiple hosts using rsync, unison, a version-control system, Dropbox, or whatever you want. When you run dotfilemanager link it will create symlinks in a folder called the FROM_DIR (defaults to ~), e.g.

~/.muttrc -> ~/.dotfiles/_muttrc 
~/.nanorc -> ~/.dotfiles/_nanorc
...

Leading underscores in the filenames in TO_DIR will be converted to leading dots for the symlinks. You can also link files without leading underscores, and you can link directories too, just place them in TO_DIR and run dotfilemanager link.

Per-host configuration is supported by putting __hostname at the end of file and directory names in TO_DIR. For example if TO_DIR contains files named:

_muttrc
_muttrc__kisimul
_muttrc__dulip

Then on the host dulip a symlink FROM_DIR/.muttrc will be created to TO_DIR/_muttrc__dulip. On a host named kisimul _muttrc__kisimul will be linked to. On other hosts _muttrc will be linked to.

(To discover the hostname of your machine run uname -n.)

dotfilemanager tidy will remove any dangling symlinks in FROM_DIR, and dotfilemanager report will just report on what link and tidy would do without actually making any changes to the filesystem.

Tip: handle directories like ~/.config separately

On my system a lot of config files are stored in ~/.config. I want to manage some of the files in ~/.config but not all of them. I have host-specific versions of some files in ~/.config but not others. I wouldn't want to move ~/.config to ~/.dotfiles/_config and have dotfilemanager make a symlink ~/.config -> ~/.dotfiles/_config because that would be putting all the files in ~/.config into ~/.dotfiles, and dotfilemanager would make the same symlink for every host, if I wanted a host-specific version of a file in ~/.config I'd have to put another complete copy of the directory into ~/.dotfiles with a __hostname at the end.

What you can do instead is have a ~/config directory separate from ~/.dotfiles, move the files from ~/.config that you want to manage into ~/config, make host-specific versions if you want, then run both commands:

dotfilemanager.py link ~ ~/.dotfiles
dotfilemanager.py link ~/.config ~/config

Tip: override hostname with DOTFILEMANAGER_HOSTNAME environment variable

If the DOTFILEMANAGER_HOSTNAME environment variable is set then it is used instead of your real hostname to resolve hostname-specific files in TO_DIR. This is useful for accounts on networked systems where you login to the same user account from different computers, the system hostname will be different each time you switch computers but you want to use the same config files whenever you login to this account. So just make up a name for the account and set it as the value of DOTFILEMANAGER_HOSTNAME.