From 82ac34a520c8eaa0b53ef9c23977487b51937d7b Mon Sep 17 00:00:00 2001 From: deadc0de6 Date: Sun, 3 Mar 2019 17:05:42 +0100 Subject: [PATCH] allow importing profile dotfiles from external file --- dotdrop/config.py | 35 +++++++++++++++ tests-ng/import.sh | 109 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100755 tests-ng/import.sh diff --git a/dotdrop/config.py b/dotdrop/config.py index 603acfe..d0085db 100644 --- a/dotdrop/config.py +++ b/dotdrop/config.py @@ -66,6 +66,7 @@ class Cfg: key_profiles = 'profiles' key_profiles_dots = 'dotfiles' key_profiles_incl = 'include' + key_profiles_imp = 'import' # settings defaults default_backup = True @@ -353,10 +354,21 @@ class Cfg: return False self.prodots[k].extend(dots) + # handle "import" for each profile + for k in self.lnk_profiles.keys(): + dots = self._get_imported_dotfiles_keys(k) + for d in dots: + if d not in self.dotfiles: + msg = '(i) unknown dotfile \"{}\" for {}'.format(d, k) + self.log.err(msg) + continue + self.prodots[k].append(self.dotfiles[d]) + # remove duplicates if any for k in self.lnk_profiles.keys(): self.prodots[k] = list(set(self.prodots[k])) + # print dotfiles for each profile if self.debug: for k in self.lnk_profiles.keys(): df = ','.join([d.key for d in self.prodots[k]]) @@ -407,6 +419,29 @@ class Cfg: return os.path.join(d, path) return path + def _get_imported_dotfiles_keys(self, profile): + """import dotfiles from external file""" + keys = [] + if self.key_profiles_imp not in self.lnk_profiles[profile]: + return keys + paths = self.lnk_profiles[profile][self.key_profiles_imp] + for path in paths: + path = self._abs_path(path) + if self.debug: + self.log.dbg('loading dotfiles from {}'.format(path)) + content = self._load_yaml(path) + if not content: + self.log.warn('\"{}\" does not exist'.format(path)) + continue + if self.key_profiles_dots not in content: + self.log.warn('not dotfiles in \"{}\"'.format(path)) + continue + df = content[self.key_profiles_dots] + if self.debug: + self.log.dbg('imported dotfiles keys: {}'.format(df)) + keys.extend(df) + return keys + def _get_included_dotfiles(self, profile, seen=[]): """find all dotfiles for a specific profile when using the include keyword""" diff --git a/tests-ng/import.sh b/tests-ng/import.sh new file mode 100755 index 0000000..b09e13c --- /dev/null +++ b/tests-ng/import.sh @@ -0,0 +1,109 @@ +#!/usr/bin/env bash +# author: deadc0de6 (https://github.com/deadc0de6) +# Copyright (c) 2017, deadc0de6 +# +# test the use of the keyword "import" in profiles +# returns 1 in case of error +# + +# 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 "\e[96m\e[1m==> RUNNING $(basename $BASH_SOURCE) <==\e[0m" + +################################################################ +# this is the test +################################################################ + +# the dotfile source +tmps=`mktemp -d --suffix='-dotdrop-tests'` +mkdir -p ${tmps}/dotfiles +# the dotfile destination +tmpd=`mktemp -d --suffix='-dotdrop-tests'` +extdotfiles="${tmps}/df_p1.yaml" + +# create the config file +cfg="${tmps}/config.yaml" + +cat > ${cfg} << _EOF +config: + backup: true + create: true + dotpath: dotfiles +dotfiles: + f_abc: + dst: ${tmpd}/abc + src: abc + f_def: + dst: ${tmpd}/def + src: def + f_xyz: + dst: ${tmpd}/xyz + src: xyz +profiles: + p1: + dotfiles: + - f_abc + import: + - $(basename ${extdotfiles}) +_EOF + +# create the external dotfile file +cat > ${extdotfiles} << _EOF +dotfiles: + - f_def + - f_xyz +_EOF + +# create the source +mkdir -p ${tmps}/dotfiles/ +echo "abc" > ${tmps}/dotfiles/abc +echo "def" > ${tmps}/dotfiles/def +echo "xyz" > ${tmps}/dotfiles/xyz + +# install +cd ${ddpath} | ${bin} install -f -c ${cfg} -p p1 -V + +# checks +[ ! -e ${tmpd}/abc ] && exit 1 +[ ! -e ${tmpd}/def ] && exit 1 +[ ! -e ${tmpd}/xyz ] && exit 1 +grep 'abc' ${tmpd}/abc +grep 'def' ${tmpd}/def +grep 'xyz' ${tmpd}/xyz + +## CLEANING +rm -rf ${tmps} ${tmpd} + +echo "OK" +exit 0