mirror of
https://github.com/deadc0de6/dotdrop.git
synced 2026-02-08 11:59:16 +00:00
handle bad diff_command
This commit is contained in:
@@ -6,10 +6,12 @@ settings block
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
from dotdrop.exceptions import YamlException
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from dotdrop.linktypes import LinkTypes
|
from dotdrop.linktypes import LinkTypes
|
||||||
from dotdrop.dictparser import DictParser
|
from dotdrop.dictparser import DictParser
|
||||||
|
from dotdrop.utils import is_bin_in_path
|
||||||
|
|
||||||
|
|
||||||
ENV_WORKDIR = 'DOTDROP_WORKDIR'
|
ENV_WORKDIR = 'DOTDROP_WORKDIR'
|
||||||
@@ -56,6 +58,9 @@ class Settings(DictParser):
|
|||||||
key_import_configs = 'import_configs'
|
key_import_configs = 'import_configs'
|
||||||
key_import_variables = 'import_variables'
|
key_import_variables = 'import_variables'
|
||||||
|
|
||||||
|
# defaults
|
||||||
|
default_diff_command = 'diff -r -u {0} {1}'
|
||||||
|
|
||||||
def __init__(self, backup=True, banner=True,
|
def __init__(self, backup=True, banner=True,
|
||||||
create=True, default_actions=None, dotpath='dotfiles',
|
create=True, default_actions=None, dotpath='dotfiles',
|
||||||
ignoreempty=False, import_actions=None, import_configs=None,
|
ignoreempty=False, import_actions=None, import_configs=None,
|
||||||
@@ -66,7 +71,7 @@ class Settings(DictParser):
|
|||||||
impignore=None, workdir='~/.config/dotdrop',
|
impignore=None, workdir='~/.config/dotdrop',
|
||||||
showdiff=False, minversion=None,
|
showdiff=False, minversion=None,
|
||||||
func_file=None, filter_file=None,
|
func_file=None, filter_file=None,
|
||||||
diff_command='diff -r -u {0} {1}',
|
diff_command=default_diff_command,
|
||||||
template_dotfile_default=True,
|
template_dotfile_default=True,
|
||||||
ignore_missing_in_dotdrop=False,
|
ignore_missing_in_dotdrop=False,
|
||||||
force_chmod=False, chmod_on_import=False,
|
force_chmod=False, chmod_on_import=False,
|
||||||
@@ -108,6 +113,11 @@ class Settings(DictParser):
|
|||||||
self.key_prefix = key_prefix
|
self.key_prefix = key_prefix
|
||||||
self.key_separator = key_separator
|
self.key_separator = key_separator
|
||||||
|
|
||||||
|
# check diff command
|
||||||
|
if not is_bin_in_path(self.diff_command):
|
||||||
|
err = 'bad diff_command: {}'.format(self.diff_command)
|
||||||
|
raise YamlException(err)
|
||||||
|
|
||||||
def _serialize_seq(self, name, dic):
|
def _serialize_seq(self, name, dic):
|
||||||
"""serialize attribute 'name' into 'dic'"""
|
"""serialize attribute 'name' into 'dic'"""
|
||||||
seq = getattr(self, name)
|
seq = getattr(self, name)
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import inspect
|
|||||||
import importlib
|
import importlib
|
||||||
import filecmp
|
import filecmp
|
||||||
import itertools
|
import itertools
|
||||||
from shutil import rmtree, which
|
import shutil
|
||||||
import json
|
import json
|
||||||
import requests
|
import requests
|
||||||
from packaging import version
|
from packaging import version
|
||||||
@@ -176,7 +176,7 @@ def removepath(path, logger=None):
|
|||||||
if os.path.islink(path) or os.path.isfile(path):
|
if os.path.islink(path) or os.path.isfile(path):
|
||||||
os.unlink(path)
|
os.unlink(path)
|
||||||
elif os.path.isdir(path):
|
elif os.path.isdir(path):
|
||||||
rmtree(path)
|
shutil.rmtree(path)
|
||||||
else:
|
else:
|
||||||
err = 'Unsupported file type for deletion: {}'.format(path)
|
err = 'Unsupported file type for deletion: {}'.format(path)
|
||||||
raise OSError(err)
|
raise OSError(err)
|
||||||
@@ -343,10 +343,11 @@ def get_module_from_path(path):
|
|||||||
def dependencies_met():
|
def dependencies_met():
|
||||||
"""make sure all dependencies are met"""
|
"""make sure all dependencies are met"""
|
||||||
# check unix tools deps
|
# check unix tools deps
|
||||||
deps = ['file', 'diff']
|
# diff command is checked in settings.py
|
||||||
|
deps = ['file']
|
||||||
err = 'The tool \"{}\" was not found in the PATH!'
|
err = 'The tool \"{}\" was not found in the PATH!'
|
||||||
for dep in deps:
|
for dep in deps:
|
||||||
if not which(dep):
|
if not shutil.which(dep):
|
||||||
raise UnmetDependency(err.format(dep))
|
raise UnmetDependency(err.format(dep))
|
||||||
# check python deps
|
# check python deps
|
||||||
err = 'missing python module \"{}\"'
|
err = 'missing python module \"{}\"'
|
||||||
@@ -381,6 +382,13 @@ def dependencies_met():
|
|||||||
assert YAML
|
assert YAML
|
||||||
except ImportError as exc:
|
except ImportError as exc:
|
||||||
raise Exception(err.format('ruamel.yaml')) from exc
|
raise Exception(err.format('ruamel.yaml')) from exc
|
||||||
|
|
||||||
|
# toml
|
||||||
|
try:
|
||||||
|
import toml
|
||||||
|
assert toml
|
||||||
|
except ImportError as exc:
|
||||||
|
raise Exception(err.format('toml')) from exc
|
||||||
# pylint: enable=C0415
|
# pylint: enable=C0415
|
||||||
|
|
||||||
|
|
||||||
@@ -494,3 +502,25 @@ def pivot_path(path, newdir, striphome=False, logger=None):
|
|||||||
if logger:
|
if logger:
|
||||||
logger.dbg('pivot \"{}\" to \"{}\"'.format(path, new))
|
logger.dbg('pivot \"{}\" to \"{}\"'.format(path, new))
|
||||||
return new
|
return new
|
||||||
|
|
||||||
|
|
||||||
|
def is_bin_in_path(command):
|
||||||
|
"""
|
||||||
|
check binary from command is in path
|
||||||
|
"""
|
||||||
|
bpath = ""
|
||||||
|
if not command:
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
binary = command.split(" ")[0]
|
||||||
|
except ValueError:
|
||||||
|
return False
|
||||||
|
if not binary:
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
bpath = shutil.which(binary)
|
||||||
|
except shutil.Error:
|
||||||
|
return False
|
||||||
|
if not bpath:
|
||||||
|
return False
|
||||||
|
return os.path.exists(bpath)
|
||||||
|
|||||||
90
tests-ng/bad-diff-cmd.sh
Executable file
90
tests-ng/bad-diff-cmd.sh
Executable file
@@ -0,0 +1,90 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# author: deadc0de6 (https://github.com/deadc0de6)
|
||||||
|
# Copyright (c) 2022, deadc0de6
|
||||||
|
#
|
||||||
|
# test bad diff cmd
|
||||||
|
# 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"
|
||||||
|
hash coverage 2>/dev/null && bin="coverage run -a --source=dotdrop -m dotdrop.dotdrop" || true
|
||||||
|
|
||||||
|
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
|
||||||
|
################################################################
|
||||||
|
basedir=`mktemp -d --suffix='-dotdrop-tests' || mktemp -d`
|
||||||
|
echo "[+] dotdrop dir: ${basedir}"
|
||||||
|
|
||||||
|
clear_on_exit "${basedir}"
|
||||||
|
|
||||||
|
# create the config file
|
||||||
|
cfg="${basedir}/config.yaml"
|
||||||
|
cat > ${cfg} << _EOF
|
||||||
|
config:
|
||||||
|
backup: true
|
||||||
|
create: true
|
||||||
|
dotpath: dotfiles
|
||||||
|
diff_command: xxxxxxxxx {0} {1}
|
||||||
|
dotfiles:
|
||||||
|
profiles:
|
||||||
|
_EOF
|
||||||
|
|
||||||
|
set +e
|
||||||
|
cd ${ddpath} | ${bin} compare -c ${cfg}
|
||||||
|
[ "$?" = "0" ] && exit 1
|
||||||
|
|
||||||
|
out=$(cd ${ddpath} | ${bin} compare -c ${cfg})
|
||||||
|
echo "${out}" | grep -i 'traceback' && exit 1
|
||||||
|
|
||||||
|
cat > ${cfg} << _EOF
|
||||||
|
config:
|
||||||
|
backup: true
|
||||||
|
create: true
|
||||||
|
dotpath: dotfiles
|
||||||
|
diff_command:
|
||||||
|
dotfiles:
|
||||||
|
profiles:
|
||||||
|
_EOF
|
||||||
|
|
||||||
|
set +e
|
||||||
|
cd ${ddpath} | ${bin} compare -c ${cfg}
|
||||||
|
[ "$?" = "0" ] && exit 1
|
||||||
|
|
||||||
|
out=$(cd ${ddpath} | ${bin} compare -c ${cfg})
|
||||||
|
echo "${out}" | grep -i 'traceback' && exit 1
|
||||||
|
|
||||||
|
echo "OK"
|
||||||
|
exit 0
|
||||||
Reference in New Issue
Block a user