#!/usr/bin/env python3 import os import sys import glob import tty import termios import shutil def getchar(): fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) try: tty.setraw(sys.stdin.fileno()) ch = sys.stdin.read(1) sys.stdout.write(ch) finally: termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) return ch def make_link(filename, target, prefix='.'): orig = os.path.abspath(filename) dest = os.path.join(target, '%s%s' % (prefix, filename)) create_link(filename, orig, dest) def make_firefox_link(filename, target): orig = os.path.abspath(filename) profiles = glob.glob(os.path.join(target, '.mozilla/firefox/*.default')) if len(profiles) != 1: print("Could not find Firefox default profile") return dest = os.path.join(profiles[0], os.path.basename(filename)) create_link(filename, orig, dest) def create_link(filename, orig, dest): needs_removal = False if os.path.islink(dest): if os.readlink(dest) == orig: # print('%s already exists.' % dest) return else: print('%s points to: %s' % (dest, os.readlink(dest))) needs_removal = True elif os.path.isdir(dest): print('%s exists and is a directory.' % dest) needs_removal = True elif os.path.exists(dest): print('%s exists and is not a link.' % dest) needs_removal = True if needs_removal: print('Replace? y/[n] ', end='', flush=True) chr = getchar() print("") if (chr == 'y') or (chr == 'Y'): if os.path.isdir(dest): shutil.rmtree(dest) else: os.unlink(dest) else: return else: print("%s does not exist" % dest) try: print("%s -> %s" % (dest, orig)) os.symlink(orig, dest) except OSError as e: print('Could not create link for: %s (%s)' % (filename, e)) if __name__ == '__main__': if len(sys.argv) > 1: ROOT = sys.argv[1] else: ROOT = os.environ["HOME"] IGNORE_FILES = ["make-links.py"] for f in os.listdir('.'): if f.startswith('.'): continue if f in IGNORE_FILES: continue if f == 'config': for cf in os.listdir(f): if f.startswith('.'): continue make_link(os.path.join('config', cf), ROOT) elif f == 'firefox': for cf in os.listdir(f): make_firefox_link(os.path.join('firefox', cf), ROOT) else: make_link(f, ROOT, '.')