#!/usr/bin/env python2 """ A simple script to create a symlinks in your home directory for every filename in this directory. For example: ~/.bashrc -> dot-files/bashrc """ from os import getcwd, listdir, getenv, symlink, remove from os.path import (dirname, basename, join, expanduser, lexists, exists, relpath, normpath, isfile, islink, realpath, abspath) def log(filename, message): """Simple logging function""" name = "'{0}':".format(filename).ljust(30, ' ') print "{0}\t{0}".format(name, message) def dir_filter(file_name): return file_name != basename(__file__) and \ file_name != 'README.md' and \ file_name[0] != '.' def main(): """Create the symlinks""" dir_path = dirname(__file__) base_name = dirname(normpath(join(getenv('PWD'), __file__))) home_dir = expanduser('~') rel_path = normpath(relpath(base_name, home_dir)) for filename in filter(dir_filter, listdir(dirname(abspath(__file__)))): config_path = join(home_dir, ".{0}".format(filename)) file_path = join(rel_path, filename) # If the current file is going to be linked deeper in the # home directory, for example, we want to link # `~/.ssh/config` instead of the whole `~/.ssh` directory. if filename[0] == '_': deep_dirs = filename[1:].split('_') link_file = deep_dirs[-1] dir_name = join(*deep_dirs[:-1]) config_path = join(home_dir, ".{0}".format(dir_name), link_file) file_path = join("..", file_path) if lexists(config_path): if not exists(config_path): # If it does not exists but lexists is true, that means this # is a broken symlink remove(config_path) elif islink(config_path): if realpath(config_path) != file_path: continue elif isfile(config_path): log(config_path, 'existing file, consider merge') continue log(config_path, "now linking to '{0}'".format(file_path)) symlink(file_path, config_path) if __name__ == '__main__': main()