1
0
Fork 0
mirror of synced 2025-01-02 11:19:00 -05:00

Use git ls-files to list files to encrypt

By using git ls-files instead of bash we can support ** also on macOS where the
included bash version (3) doesn't support globstar.
This commit is contained in:
Erik Flodin 2024-11-24 22:56:07 +01:00
parent 216d49ceef
commit 4511f5d9c6
No known key found for this signature in database
GPG key ID: 420A7C865EE3F85F
3 changed files with 28 additions and 59 deletions

View file

@ -105,7 +105,8 @@ def create_test_encrypt_data(paths):
edata += "dirwild*\n" edata += "dirwild*\n"
paths.work.join("dirwildcard/file1").write("", ensure=True) paths.work.join("dirwildcard/file1").write("", ensure=True)
paths.work.join("dirwildcard/file2").write("", ensure=True) paths.work.join("dirwildcard/file2").write("", ensure=True)
expected.add("dirwildcard") expected.add("dirwildcard/file1")
expected.add("dirwildcard/file2")
# excludes # excludes
edata += "exclude*\n" edata += "exclude*\n"
@ -186,9 +187,7 @@ def run_parse_encrypt(runner, paths, skip_parse=False, twice=False):
YADM_WORK={paths.work} YADM_WORK={paths.work}
export YADM_WORK export YADM_WORK
{parse_cmd} {parse_cmd}
export ENCRYPT_INCLUDE_FILES echo PARSE_ENCRYPT_SHORT=$PARSE_ENCRYPT_SHORT
export PARSE_ENCRYPT_SHORT
env
echo EIF_COUNT:${{#ENCRYPT_INCLUDE_FILES[@]}} echo EIF_COUNT:${{#ENCRYPT_INCLUDE_FILES[@]}}
for value in "${{ENCRYPT_INCLUDE_FILES[@]}}"; do for value in "${{ENCRYPT_INCLUDE_FILES[@]}}"; do
echo "EIF:$value" echo "EIF:$value"

68
yadm
View file

@ -1906,65 +1906,35 @@ function parse_encrypt() {
fi fi
ENCRYPT_INCLUDE_FILES=() ENCRYPT_INCLUDE_FILES=()
ENCRYPT_EXCLUDE_FILES=()
FINAL_INCLUDE=()
[ -f "$YADM_ENCRYPT" ] || return [ -f "$YADM_ENCRYPT" ] || return
cd_work "Parsing encrypt" || return cd_work "Parsing encrypt" || return
# setting globstar to allow ** in encrypt patterns local -a exclude
# (only supported on Bash >= 4) local -a include
local unset_globstar
if ! shopt globstar &> /dev/null; then
unset_globstar=1
fi
shopt -s globstar &> /dev/null
exclude_pattern="^!(.+)" while IFS= read -r pattern; do
# parse both included/excluded case $pattern in
while IFS='' read -r line || [ -n "$line" ]; do \#*)
if [[ ! $line =~ ^# && ! $line =~ ^[[:blank:]]*$ ]] ; then # Ignore comments
local IFS=$'\n' ;;
for pattern in $line; do !*)
if [[ "$pattern" =~ $exclude_pattern ]]; then exclude+=("--exclude=${pattern:1}")
for ex_file in ${BASH_REMATCH[1]}; do ;;
if [ -e "$ex_file" ]; then *)
ENCRYPT_EXCLUDE_FILES+=("$ex_file") if ! [[ $pattern =~ ^[[:blank:]]*$ ]]; then
fi include+=("$pattern")
done
else
for in_file in $pattern; do
if [ -e "$in_file" ]; then
ENCRYPT_INCLUDE_FILES+=("$in_file")
fi
done
fi fi
done ;;
fi esac
done < "$YADM_ENCRYPT" done < "$YADM_ENCRYPT"
# remove excludes from the includes if [[ ${#include} -gt 0 ]]; then
#(SC2068 is disabled because in this case, we desire globbing) while IFS= read -r filename; do
#shellcheck disable=SC2068 ENCRYPT_INCLUDE_FILES+=("${filename%/}")
for included in "${ENCRYPT_INCLUDE_FILES[@]}"; do done <<< "$("$GIT_PROGRAM" ls-files --others "${exclude[@]}" -- "${include[@]}")"
skip=
#shellcheck disable=SC2068
for ex_file in ${ENCRYPT_EXCLUDE_FILES[@]}; do
[ "$included" == "$ex_file" ] && { skip=1; break; }
done
[ -n "$skip" ] || FINAL_INCLUDE+=("$included")
done
# sort the encrypted files
#shellcheck disable=SC2207
IFS=$'\n' ENCRYPT_INCLUDE_FILES=($(LC_ALL=C sort <<<"${FINAL_INCLUDE[*]}"))
unset IFS
if [ "$unset_globstar" = "1" ]; then
shopt -u globstar &> /dev/null
fi fi
} }
function builtin_dirname() { function builtin_dirname() {

12
yadm.1
View file

@ -765,7 +765,8 @@ gpg is used by default, but openssl can be configured with the
.I yadm.cipher .I yadm.cipher
configuration. configuration.
To use this feature, a list of patterns must be created and saved as To use this feature, a list of patterns (one per line) must be created and
saved as
.IR $HOME/.config/yadm/encrypt . .IR $HOME/.config/yadm/encrypt .
This list of patterns should be relative to the configured This list of patterns should be relative to the configured
.IR work-tree \ (usually\ $HOME ). .IR work-tree \ (usually\ $HOME ).
@ -776,11 +777,10 @@ For example:
.gnupg/*.gpg .gnupg/*.gpg
.RE .RE
Standard filename expansions (*, ?, [) are supported. Standard filename expansions (*, ?, [) are supported. Two consecutive asterisks
If you have Bash version 4, you may use "**" to match all subdirectories. "**" can be used to match all subdirectories. Other shell expansions like
Other shell expansions like brace and tilde are not supported. brace and tilde are not supported. Spaces in paths are supported, and should
Spaces in paths are supported, and should not be quoted. not be quoted. If a directory is specified, its contents will be included.
If a directory is specified, its contents will be included, but not recursively.
Paths beginning with a "!" will be excluded. Paths beginning with a "!" will be excluded.
The The