From 4704569757ff1857a8b970b10f6fea4257daa625 Mon Sep 17 00:00:00 2001 From: deadc0de6 Date: Sat, 16 Sep 2023 14:54:58 +0200 Subject: [PATCH] fix ignore for import and update --- dotdrop/importer.py | 13 +++++- dotdrop/utils.py | 5 ++- tests-ng/import-ignore-in-dotpath.sh | 66 ++++++++++++++++++++++++++++ tests-ng/update-ignore-in-dotpath.sh | 65 +++++++++++++++++++++++++++ 4 files changed, 146 insertions(+), 3 deletions(-) create mode 100755 tests-ng/import-ignore-in-dotpath.sh create mode 100755 tests-ng/update-ignore-in-dotpath.sh diff --git a/dotdrop/importer.py b/dotdrop/importer.py index 5585005..adbac08 100644 --- a/dotdrop/importer.py +++ b/dotdrop/importer.py @@ -50,14 +50,23 @@ class Importer: self.safe = safe self.debug = debug self.keepdot = keepdot - self.ignore = ignore or [] + self.ignore = [] + self.log = Logger(debug=self.debug) + + # patch ignore patterns + for ign in ignore: + if ign.startswith('*/'): + self.ignore.append(ign) + continue + newign = f'*/{ign}' + self.log.dbg(f'patching ignore {ign} to {newign}') + self.ignore.append(newign) self.templater = Templategen(variables=self.variables, base=self.dotpath, debug=self.debug) self.umask = get_umask() - self.log = Logger(debug=self.debug) def import_path(self, path, import_as=None, import_link=LinkTypes.NOLINK, diff --git a/dotdrop/utils.py b/dotdrop/utils.py index 8193678..564e937 100644 --- a/dotdrop/utils.py +++ b/dotdrop/utils.py @@ -288,7 +288,7 @@ def must_ignore(paths, ignores, debug=False): if not ignores: return False if debug: - LOG.dbg(f'must ignore? \"{paths}\" against {ignores}', + LOG.dbg(f'must ignore? \"{paths}\" against pattern(s): {ignores}', force=True) nign, ign = categorize( lambda ign: ign.startswith('!'), ignores) @@ -336,6 +336,9 @@ def copytree_with_ign(src, dst, ignore_func=None, debug=False): for entry in os.listdir(src): srcf = os.path.join(src, entry) dstf = os.path.join(dst, entry) + if ignore_func: + if ignore_func(srcf): + continue if os.path.isdir(srcf): if debug: LOG.dbg(f'mkdir \"{dstf}\"', diff --git a/tests-ng/import-ignore-in-dotpath.sh b/tests-ng/import-ignore-in-dotpath.sh new file mode 100755 index 0000000..f29386b --- /dev/null +++ b/tests-ng/import-ignore-in-dotpath.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +# author: deadc0de6 (https://github.com/deadc0de6) +# Copyright (c) 2023, deadc0de6 +# +# test ignore import in dotpath +# returns 1 in case of error +# + +## start-cookie +set -e +cur=$(cd "$(dirname "${0}")" && pwd) +ddpath="${cur}/../" +export PYTHONPATH="${ddpath}:${PYTHONPATH}" +altbin="python3 -m dotdrop.dotdrop" +if hash coverage 2>/dev/null; then + mkdir -p coverages/ + altbin="coverage run -p --data-file coverages/coverage --source=dotdrop -m dotdrop.dotdrop" +fi +bin="${DT_BIN:-${altbin}}" +# shellcheck source=tests-ng/helpers +source "${cur}"/helpers +echo -e "$(tput setaf 6)==> RUNNING $(basename "${BASH_SOURCE[0]}") <==$(tput sgr0)" +## end-cookie + +################################################################ +# 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) +mkdir -p "${tmpd}" +#echo "dotfile destination: ${tmpd}" + +clear_on_exit "${tmps}" +clear_on_exit "${tmpd}" + +# create to-be-imported files +mkdir -p "${tmpd}"/test +echo 'original' > "${tmpd}"/test/config1 +mkdir -p "${tmpd}"/test/ignoreme +echo 'original' > "${tmpd}"/test/ignoreme/config2 + +# create the config file +cfg="${tmps}/config.yaml" +cat > "${cfg}" << _EOF +config: + backup: false + create: true + dotpath: dotfiles + impignore: + - "ignoreme" +dotfiles: +profiles: +_EOF + +# import +echo "[+] import" +cd "${ddpath}" | ${bin} import -c "${cfg}" -f --verbose --profile=p1 "${tmpd}"/test + +[ -d "${tmps}"/dotfiles/"${tmpd}"/test/ignoreme ] && echo "ignoreme not ignored" && exit 1 + +echo "OK" +exit 0 diff --git a/tests-ng/update-ignore-in-dotpath.sh b/tests-ng/update-ignore-in-dotpath.sh new file mode 100755 index 0000000..8c4f56f --- /dev/null +++ b/tests-ng/update-ignore-in-dotpath.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +# author: deadc0de6 (https://github.com/deadc0de6) +# Copyright (c) 2023, deadc0de6 +# +# test ignore update in dotpath +# returns 1 in case of error +# + +## start-cookie +set -e +cur=$(cd "$(dirname "${0}")" && pwd) +ddpath="${cur}/../" +export PYTHONPATH="${ddpath}:${PYTHONPATH}" +altbin="python3 -m dotdrop.dotdrop" +if hash coverage 2>/dev/null; then + mkdir -p coverages/ + altbin="coverage run -p --data-file coverages/coverage --source=dotdrop -m dotdrop.dotdrop" +fi +bin="${DT_BIN:-${altbin}}" +# shellcheck source=tests-ng/helpers +source "${cur}"/helpers +echo -e "$(tput setaf 6)==> RUNNING $(basename "${BASH_SOURCE[0]}") <==$(tput sgr0)" +## end-cookie + +################################################################ +# this is the test +################################################################ + +# dotdrop directory +tmps=$(mktemp -d --suffix='-dotdrop-tests' || mktemp -d) +# fs dotfiles +tmpd=$(mktemp -d --suffix='-dotdrop-tests' || mktemp -d) +dt="${tmps}/dotfiles" +mkdir -p "${dt}" + +clear_on_exit "${tmps}" +clear_on_exit "${tmpd}" + +# create to-be-imported files +mkdir -p "${tmpd}"/test +echo 'original' > "${tmpd}"/test/config1 +mkdir -p "${tmpd}"/test/ignoreme +echo 'original' > "${tmpd}"/test/ignoreme/config2 + +# create the config file +cfg="${tmps}/config.yaml" +create_conf "${cfg}" # sets token + +# import +echo "[+] import" +cd "${ddpath}" | ${bin} import -c "${cfg}" -f --verbose --profile=p1 "${tmpd}"/test + +# remove ignoreme +echo "[+] remove ignoreme" +rm -r "${tmpd}"/test/ignoreme + +# update +echo "[+] update" +cd "${ddpath}" | ${bin} update -f -c "${cfg}" --verbose --profile=p1 --key d_test + +# check files haven't been updated +[ -d "${dt}"/"${tmpd}"/test/ignoreme ] && echo "ignoreme should have been removed" && exit 1 + +echo "OK" +exit 0