summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--setup.py68
1 files changed, 48 insertions, 20 deletions
diff --git a/setup.py b/setup.py
index 14f4d0e..b1d2d47 100644
--- a/setup.py
+++ b/setup.py
@@ -23,31 +23,50 @@ class Usage(Exception):
self.msg = msg
""" Create links to dotfiles """
-def makeDots(home, nice = False, pretend = False):
+def makeDots(base, home, nice = False, pretend = False):
# First make a map of dot files to files in the repository.
- dotfiles = getMap("base/")
+ dotfiles = getMap(base + "/base/")
# Get host specific overrides
hostname = socket.getfqdn().split(".")
for i in range(len(hostname)):
name = string.join(hostname[-(i+1):], ".")
- dotfiles = dotfiles + getMap("host-overrides/" + name)
+ directory = base + "/host-overrides/" + name
+ if os.path.isdir(directory):
+ mergeDicts(dotfiles, getMap(directory))
if pretend:
print "I would make these links:"
else:
print "I am making these links:"
- for dst, src in dotfiles:
- realDest = home + "/." + dst
- success = True
- if not pretend:
- success = makeLink(src, realDest, nice)
+ makeLinks(dotfiles, home + "/.", nice, pretend)
+
+def makeLinks(dotfiles, prefix, nice, pretend):
+ keys = dotfiles.keys()
+ keys.sort()
+ for dst in keys:
+ src = dotfiles[dst]
+ realDest = prefix + dst
+
+ if type(src) is dict:
+ try:
+ if not pretend and not os.path.isdir(realDest):
+ os.mkdir(realDest)
+ print "%50s => <NEW DIRECTORY>" % (realDest)
+ makeLinks(src, realDest + "/", nice, pretend)
+ except OSError,e:
+ print "Could not mkdir %s. Will not link subitems: %s" % (realDest, str(e))
- if success:
- print "%s => %s" % (realDest, dst, src)
else:
- print "Not linking %s to %s because file exists" % (realDest, src)
+ try:
+ if not pretend:
+ success = makeLink(src, realDest, nice)
+
+ print "%50s => %s" % (realDest, src)
+
+ except IOError,e
+ print "Not linking %s to %s because IOError: %s" % (realDest, src, str(e))
""" Return a map of dest => source dotfiles """
def getMap(baseDirectory, directory=""):
@@ -66,29 +85,34 @@ def getMap(baseDirectory, directory=""):
if os.path.isdir(fullPath) and os.path.exists(fullPath + "/.nolink"):
# We will not make a link but will make sure this directory exists.
- dots[directory + filename] = ""
- dots += getMap(baseDirectory, directory + filename)
+ dots[directory + filename] = getMap(baseDirectory + directory + filename)
else:
dots[directory + filename] = fullPath
+ return dots
+
""" Make a link from src to realDest.
If nice is true, don't overwrite realDest.
If src is an empty string, just create a directory. """
def makeLink(src, realDest, nice = False):
- if os.path.exists(realDest):
+ if os.path.lexists(realDest):
if nice:
return False
else:
shutil.rmtree(realDest)
- if src == "":
- os.mkdir(realDest)
-
os.symlink(src, realDest)
return True
+""" Recursively merge the second dictionary into the first. The latter takes precedence."""
+def mergeDicts(a, b):
+ for key, value in b.items():
+ if key in a and type(value) is dict and type(a[key]) is dict:
+ mergeDicts(a[key], value)
+ else:
+ a[key] = value
""" Main Method """
def main(argv=None):
@@ -97,12 +121,13 @@ def main(argv=None):
try:
try:
opts, args = getopt.getopt(argv[1:],
- "hnd", ["help", "nice", "home"])
+ "hnd:p", ["help", "nice", "home=", "pretend"])
except getopt.error, msg:
raise Usage(msg)
# Settings:
nice = False
+ pretend = False
home = os.environ["HOME"]
for o, a in opts:
@@ -113,10 +138,13 @@ def main(argv=None):
if o in ("-n", "--nice"):
nice = True
- else if o in ("-d", "--home"):
+ elif o in ("-p", "--pretend"):
+ pretend = True
+
+ elif o in ("-d", "--home"):
home = a
- makeDots(home, nice)
+ makeDots(os.getcwd(), home, nice, pretend)
except Usage, err:
print >>sys.stderr, err.msg