diff --git a/README.markdown b/README.markdown new file mode 100644 index 0000000..c0631c6 --- /dev/null +++ b/README.markdown @@ -0,0 +1,81 @@ +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. + +[Steve Kemp's dotfile manager]: http://blog.steve.org.uk/i_ve_got_a_sick_friend__i_need_her_help_.html + +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`. diff --git a/dotfilemanager.py b/dotfilemanager.py index 3e55948..b0ede0e 100755 --- a/dotfilemanager.py +++ b/dotfilemanager.py @@ -2,80 +2,6 @@ """dotfilemanager.py - a dotfiles manager script. See --help for usage and command-line arguments. -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 version of some files in ~/.config but not others. I -wouldn't want to move ~/.config to ~/.dotfiles/_config and have -dotfilemanager.py make a symlink ~/.config -> ~/.dotfiles/_config -because that would be putting _all_ the files in ~/config into -~/.dotfiles, and dotfilemanager.py would make the same symlink for every -host, if I wanted a host-specific version of ~/.config I'd have to put -_another_ complete copy of the directory into ~/.dotfiles with a -__hostname at the end. - -What you can to do 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. - """ import os,sys,platform