aboutsummaryrefslogtreecommitdiffstats
path: root/dotfiles/dotfile.py
diff options
context:
space:
mode:
Diffstat (limited to 'dotfiles/dotfile.py')
-rw-r--r--dotfiles/dotfile.py51
1 files changed, 32 insertions, 19 deletions
diff --git a/dotfiles/dotfile.py b/dotfiles/dotfile.py
index e539c68..3932d2a 100644
--- a/dotfiles/dotfile.py
+++ b/dotfiles/dotfile.py
@@ -1,4 +1,5 @@
from click import echo
+from hashlib import md5
from pathlib import Path
from .exceptions import \
@@ -33,7 +34,7 @@ class Dotfile(object):
if debug:
echo('MKDIR %s' % dir)
else:
- dir.mkdir()
+ dir.mkdir(parents=True)
ensure(self.name.parent, debug)
ensure(self.target.parent, debug)
@@ -42,20 +43,20 @@ class Dotfile(object):
"""Create a symlink from name to target, no error checking."""
source = self.name
target = self.target
- if self.name.islink():
+ if self.name.is_symlink():
source = self.target
target = self.name.realpath()
if debug:
echo('LINK %s -> %s' % (source, target))
else:
- source.mksymlinkto(target, absolute=0)
+ source.symlink_to(target)
def _unlink(self, debug):
"""Remove a symlink in the home directory, no error checking."""
if debug:
echo('UNLINK %s' % self.name)
else:
- self.name.remove()
+ self.name.unlink()
def short_name(self, homedir):
"""A shorter, more readable name given a home directory."""
@@ -64,24 +65,29 @@ class Dotfile(object):
def is_present(self):
"""Is this dotfile present in the repository?"""
- return self.name.islink() and (self.name.realpath() == self.target)
+ # return self.name.islink() and (self.name.realpath() == self.target)
+ return self.name.is_symlink() and (self.name.resolve() == self.target)
@property
def state(self):
"""The current state of this dotfile."""
- if self.target.check(exists=0):
+ if not self.target.exists():
# only for testing, cli should never reach this state
return 'error'
- elif self.name.check(exists=0):
+ # elif self.name.check(exists=0):
+ elif not self.name.exists():
# no $HOME file or symlink
return 'missing'
- elif self.name.islink():
+ # elif self.name.islink():
+ elif self.name.is_symlink():
# name exists, is a link, but isn't a link to the target
if not self.name.samefile(self.target):
return 'conflict'
else:
# name exists, is a file, but differs from the target
- if self.name.computehash() != self.target.computehash():
+ # if self.name.computehash() != self.target.computehash():
+ if md5(self.name.read_bytes()).hexdigest() != \
+ md5(self.target.read_bytes()).hexdigest():
return 'conflict'
return 'ok'
@@ -89,42 +95,49 @@ class Dotfile(object):
"""Move a dotfile to it's target and create a symlink."""
if self.is_present():
raise IsSymlink(self.name)
- if self.target.check(exists=1):
+ # if self.target.check(exists=1):
+ if self.target.exists():
raise TargetExists(self.name)
self._ensure_dirs(debug)
- if not self.name.islink():
+ if not self.name.is_symlink():
if debug:
echo('MOVE %s -> %s' % (self.name, self.target))
else:
- self.name.move(self.target)
+ # self.name.move(self.target)
+ self.name.replace(self.target)
self._link(debug)
def remove(self, debug=False):
"""Remove a symlink and move the target back to its name."""
- if self.name.check(link=0):
+ # if self.name.check(link=0):
+ if not self.name.is_symlink():
raise NotASymlink(self.name)
- if self.target.check(exists=0):
+ # if self.target.check(exists=0):
+ if not self.target.is_file():
raise TargetMissing(self.name)
self._unlink(debug)
if debug:
echo('MOVE %s -> %s' % (self.target, self.name))
else:
- self.target.move(self.name)
+ self.target.replace(self.name)
def link(self, debug=False):
"""Create a symlink from name to target."""
- if self.name.check(exists=1):
+ # if self.name.check(exists=1):
+ if self.name.exists():
raise Exists(self.name)
- if self.target.check(exists=0):
+ # if self.target.check(exists=0):
+ if not self.target.exists():
raise TargetMissing(self.name)
self._ensure_dirs(debug)
self._link(debug)
def unlink(self, debug=False):
"""Remove a symlink from name to target."""
- if self.name.check(link=0):
+ # if self.name.check(link=0):
+ if not self.name.is_symlink():
raise NotASymlink(self.name)
- if self.target.check(exists=0):
+ if not self.target.exists():
raise TargetMissing(self.name)
if not self.name.samefile(self.target):
raise RuntimeError