diff --git a/dotdrop/installer.py b/dotdrop/installer.py index 4596c52..74ccad6 100644 --- a/dotdrop/installer.py +++ b/dotdrop/installer.py @@ -10,7 +10,6 @@ import errno # local imports from dotdrop.logger import Logger -from dotdrop.comparator import Comparator from dotdrop.templategen import Templategen import dotdrop.utils as utils @@ -275,7 +274,8 @@ class Installer: content = templater.generate(src) templater.restore_vars(saved) if noempty and utils.content_empty(content): - self.log.dbg('ignoring empty template: {}'.format(src)) + if self.debug: + self.log.dbg('ignoring empty template: {}'.format(src)) return False, None if content is None: err = 'empty template {}'.format(src) @@ -373,7 +373,7 @@ class Installer: if self.debug: self.log.dbg('change detected for {}'.format(dst)) if self.showdiff: - self._diff_before_write(src, dst) + self._diff_before_write(src, dst, content=content) if not self.log.ask('Overwrite \"{}\"'.format(dst)): self.log.warn('ignoring {}'.format(dst)) return 1, None @@ -404,11 +404,15 @@ class Installer: os.chmod(dst, rights) return 0, None - def _diff_before_write(self, src, dst): + def _diff_before_write(self, src, dst, content=None): """diff before writing when using --showdiff - not efficient""" - # create tmp to diff for templates - comp = Comparator(debug=self.debug) - diff = comp.compare(src, dst) + tmp = None + if content: + tmp = utils.write_to_tmpfile(content) + src = tmp + diff = utils.diff(src, dst, raw=False) + utils.remove(tmp, quiet=True) + # fake the output for readability if not diff: return diff --git a/dotdrop/utils.py b/dotdrop/utils.py index 6825bd6..49b03a9 100644 --- a/dotdrop/utils.py +++ b/dotdrop/utils.py @@ -92,11 +92,15 @@ def get_unique_tmp_name(): return os.path.join(tempfile.gettempdir(), unique) -def remove(path): +def remove(path, quiet=False): """remove a file/directory/symlink""" if not os.path.lexists(path): + if quiet: + return raise OSError("File not found: {}".format(path)) if os.path.normpath(os.path.expanduser(path)) in NOREMOVE: + if quiet: + return err = 'Dotdrop refuses to remove {}'.format(path) LOG.err(err) raise OSError(err) @@ -105,6 +109,8 @@ def remove(path): elif os.path.isdir(path): rmtree(path) else: + if quiet: + return raise OSError("Unsupported file type for deletion: {}".format(path))