diff --git a/dotdrop/cfg_aggregator.py b/dotdrop/cfg_aggregator.py index bdaf8d8..fd340ec 100644 --- a/dotdrop/cfg_aggregator.py +++ b/dotdrop/cfg_aggregator.py @@ -244,12 +244,10 @@ class CfgAggregator: def path_to_dotfile_dst(self, path): """normalize the path to match dotfile dst""" - path = os.path.expanduser(path) - path = os.path.expandvars(path) - path = os.path.abspath(path) - home = os.path.expanduser(TILD) + os.sep + path = self._norm_path(path) - # normalize the path + # use tild for home + home = os.path.expanduser(TILD) + os.sep if path.startswith(home): path = path[len(home):] path = os.path.join(TILD, path) @@ -257,10 +255,12 @@ class CfgAggregator: def get_dotfile_by_dst(self, dst): """get a dotfile by dst""" - try: - return next(d for d in self.dotfiles if d.dst == dst) - except StopIteration: - return None + dst = self._norm_path(dst) + for d in self.dotfiles: + left = self._norm_path(d.dst) + if left == dst: + return d + return None def save(self): """save the config""" @@ -350,3 +350,9 @@ class CfgAggregator: return next(x for x in self.trans_w if x.key == key) except StopIteration: return None + + def _norm_path(self, path): + path = os.path.expanduser(path) + path = os.path.expandvars(path) + path = os.path.abspath(path) + return path diff --git a/tests-ng/re-import.sh b/tests-ng/re-import.sh new file mode 100755 index 0000000..5a95fa7 --- /dev/null +++ b/tests-ng/re-import.sh @@ -0,0 +1,151 @@ +#!/usr/bin/env bash +# author: deadc0de6 (https://github.com/deadc0de6) +# Copyright (c) 2019, deadc0de6 +# +# test re-importing file +# + +# exit on first error +set -e + +# all this crap to get current path +rl="readlink -f" +if ! ${rl} "${0}" >/dev/null 2>&1; then + rl="realpath" + + if ! hash ${rl}; then + echo "\"${rl}\" not found !" && exit 1 + fi +fi +cur=$(dirname "$(${rl} "${0}")") + +#hash dotdrop >/dev/null 2>&1 +#[ "$?" != "0" ] && echo "install dotdrop to run tests" && exit 1 + +#echo "called with ${1}" + +# dotdrop path can be pass as argument +ddpath="${cur}/../" +[ "${1}" != "" ] && ddpath="${1}" +[ ! -d ${ddpath} ] && echo "ddpath \"${ddpath}\" is not a directory" && exit 1 + +export PYTHONPATH="${ddpath}:${PYTHONPATH}" +bin="python3 -m dotdrop.dotdrop" + +echo "dotdrop path: ${ddpath}" +echo "pythonpath: ${PYTHONPATH}" + +# get the helpers +source ${cur}/helpers + +echo -e "$(tput setaf 6)==> RUNNING $(basename $BASH_SOURCE) <==$(tput sgr0)" + +################################################################ +# this is the test +################################################################ + +# the dotfile source +tmps=`mktemp -d --suffix='-dotdrop-tests' || mktemp -d` +mkdir -p ${tmps}/dotfiles +# the dotfile destination +tmpd=`mktemp -d --suffix='-dotdrop-tests' || mktemp -d` +#echo "dotfile destination: ${tmpd}" + +# create the dotfile +echo "original" > ${tmpd}/testfile + +# create the config file +cfg="${tmps}/config.yaml" + +cat > ${cfg} << _EOF +config: + backup: true + create: true + dotpath: dotfiles +dotfiles: +profiles: +_EOF +#cat ${cfg} + +# import +echo "[+] import file" +cd ${ddpath} | ${bin} import -f -c ${cfg} -p p1 -V ${tmpd}/testfile +cat ${cfg} + +# ensure exists and is not link +[ ! -e ${tmps}/dotfiles/${tmpd}/testfile ] && echo "does not exist" && exit 1 +cat ${cfg} | grep ${tmpd}/testfile >/dev/null 2>&1 +grep 'original' ${tmps}/dotfiles/${tmpd}/testfile +nb=`cat ${cfg} | grep ${tmpd}/testfile | wc -l` +[ "${nb}" != "1" ] && echo 'not 1 entry' && exit 1 + +# re-import without changing +echo "[+] re-import without changes" +cd ${ddpath} | ${bin} import -f -c ${cfg} -p p1 -V ${tmpd}/testfile +cat ${cfg} + +# test is only once +[ ! -e ${tmps}/dotfiles/${tmpd}/testfile ] && echo "does not exist" && exit 1 +cat ${cfg} | grep ${tmpd}/testfile >/dev/null 2>&1 +grep 'original' ${tmps}/dotfiles/${tmpd}/testfile +nb=`cat ${cfg} | grep ${tmpd}/testfile | wc -l` +[ "${nb}" != "1" ] && echo 'two entries!' && exit 1 + +# re-import with changes +echo "[+] re-import with changes" +echo 'modified' > ${tmpd}/testfile +cd ${ddpath} | ${bin} import -f -c ${cfg} -p p1 -V ${tmpd}/testfile +cat ${cfg} + +# test is only once +[ ! -e ${tmps}/dotfiles/${tmpd}/testfile ] && echo "does not exist" && exit 1 +cat ${cfg} | grep ${tmpd}/testfile >/dev/null 2>&1 +grep 'modified' ${tmps}/dotfiles/${tmpd}/testfile +nb=`cat ${cfg} | grep ${tmpd}/testfile | wc -l` +[ "${nb}" != "1" ] && echo 'two entries!' && exit 1 + +# ################################################### + +echo 'original' > "${HOME}/.dotdrop.test" +# import in home +echo "[+] import file in home" +cd ${ddpath} | ${bin} import -f -c ${cfg} -p p1 -V ~/.dotdrop.test +cat ${cfg} + +# ensure exists and is not link +[ ! -e "${tmps}/dotfiles/dotdrop.test" ] && echo "does not exist" && exit 1 +cat ${cfg} | grep "~/.dotdrop.test" >/dev/null 2>&1 +grep 'original' ${tmps}/dotfiles/dotdrop.test +nb=`cat ${cfg} | grep "~/.dotdrop.test" | wc -l` +[ "${nb}" != "1" ] && echo 'not 1 entry' && exit 1 + +# re-import without changing +echo "[+] re-import without changes in home" +cd ${ddpath} | ${bin} import -f -c ${cfg} -p p1 -V ~/.dotdrop.test +cat ${cfg} + +# test is only once +[ ! -e "${tmps}/dotfiles/dotdrop.test" ] && echo "does not exist" && exit 1 +cat ${cfg} | grep "~/.dotdrop.test" >/dev/null 2>&1 +grep 'original' ${tmps}/dotfiles/dotdrop.test +nb=`cat ${cfg} | grep "~/.dotdrop.test" | wc -l` +[ "${nb}" != "1" ] && echo 'two entries!' && exit 1 + +# re-import with changes +echo "[+] re-import with changes in home" +echo 'modified' > ~/.dotdrop.test +cd ${ddpath} | ${bin} import -f -c ${cfg} -p p1 -V ~/.dotdrop.test +cat ${cfg} + +# test is only once +[ ! -e "${tmps}/dotfiles/dotdrop.test" ] && echo "does not exist" && exit 1 +cat ${cfg} | grep "~/.dotdrop.test" >/dev/null 2>&1 +grep 'modified' ${tmps}/dotfiles/dotdrop.test +nb=`cat ${cfg} | grep "~/.dotdrop.test" | wc -l` +[ "${nb}" != "1" ] && echo 'two entries!' && exit 1 + +## CLEANING +rm -rf ${tmps} ${tmpd} ~/.dotdrop-test + +echo "OK" +exit 0