You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
2.1 KiB
Python

#!/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()