Skip to content

Commit

Permalink
Use git ls-files to list files to encrypt
Browse files Browse the repository at this point in the history
By using git ls-files instead of bash we can support ** also on macOS where the
included bash version (3) doesn't support globstar.
  • Loading branch information
erijo committed Nov 25, 2024
1 parent 5b44afa commit c1ce345
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 60 deletions.
7 changes: 3 additions & 4 deletions test/test_unit_parse_encrypt.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ def create_test_encrypt_data(paths):
edata += "dirwild*\n"
paths.work.join("dirwildcard/file1").write("", ensure=True)
paths.work.join("dirwildcard/file2").write("", ensure=True)
expected.add("dirwildcard")
expected.add("dirwildcard/file1")
expected.add("dirwildcard/file2")

# excludes
edata += "exclude*\n"
Expand Down Expand Up @@ -186,9 +187,7 @@ def run_parse_encrypt(runner, paths, skip_parse=False, twice=False):
YADM_WORK={paths.work}
export YADM_WORK
{parse_cmd}
export ENCRYPT_INCLUDE_FILES
export PARSE_ENCRYPT_SHORT
env
echo PARSE_ENCRYPT_SHORT=$PARSE_ENCRYPT_SHORT
echo EIF_COUNT:${{#ENCRYPT_INCLUDE_FILES[@]}}
for value in "${{ENCRYPT_INCLUDE_FILES[@]}}"; do
echo "EIF:$value"
Expand Down
65 changes: 15 additions & 50 deletions yadm
Original file line number Diff line number Diff line change
Expand Up @@ -1940,65 +1940,30 @@ function parse_encrypt() {
fi

ENCRYPT_INCLUDE_FILES=()
ENCRYPT_EXCLUDE_FILES=()
FINAL_INCLUDE=()

[ -f "$YADM_ENCRYPT" ] || return

cd_work "Parsing encrypt" || return

# setting globstar to allow ** in encrypt patterns
# (only supported on Bash >= 4)
local unset_globstar
if ! shopt globstar &> /dev/null; then
unset_globstar=1
fi
shopt -s globstar &> /dev/null
local -a exclude
local -a include

exclude_pattern="^!(.+)"
# parse both included/excluded
while IFS='' read -r line || [ -n "$line" ]; do
if [[ ! $line =~ ^# && ! $line =~ ^[[:blank:]]*$ ]] ; then
local IFS=$'\n'
for pattern in $line; do
if [[ "$pattern" =~ $exclude_pattern ]]; then
for ex_file in ${BASH_REMATCH[1]}; do
if [ -e "$ex_file" ]; then
ENCRYPT_EXCLUDE_FILES+=("$ex_file")
fi
done
else
for in_file in $pattern; do
if [ -e "$in_file" ]; then
ENCRYPT_INCLUDE_FILES+=("$in_file")
fi
done
fi
done
fi
while IFS= read -r pattern; do
if [[ $pattern =~ ^# || $pattern =~ ^[[:blank:]]*$ ]]; then
continue
fi
if [[ $pattern =~ ^!(.*)$ ]]; then
exclude+=(--exclude "${pattern:1}")
else
include+=("$pattern")
fi
done < "$YADM_ENCRYPT"

# remove excludes from the includes
#(SC2068 is disabled because in this case, we desire globbing)
#shellcheck disable=SC2068
for included in "${ENCRYPT_INCLUDE_FILES[@]}"; do
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
if [[ ${#include} -gt 0 ]]; then
while IFS= read -r filename; do
ENCRYPT_INCLUDE_FILES+=("$filename")
done <<< "$("$GIT_PROGRAM" ls-files --others "${exclude[@]}" -- "${include[@]}")"
fi

}

function builtin_dirname() {
Expand Down
12 changes: 6 additions & 6 deletions yadm.1
Original file line number Diff line number Diff line change
Expand Up @@ -750,7 +750,8 @@ gpg is used by default, but openssl can be configured with the
.I yadm.cipher
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 .
This list of patterns should be relative to the configured
.IR work-tree \ (usually\ $HOME ).
Expand All @@ -761,11 +762,10 @@ For example:
.gnupg/*.gpg
.RE

Standard filename expansions (*, ?, [) are supported.
If you have Bash version 4, you may use "**" to match all subdirectories.
Other shell expansions like brace and tilde are not supported.
Spaces in paths are supported, and should not be quoted.
If a directory is specified, its contents will be included, but not recursively.
Standard filename expansions (*, ?, [) are supported. Two consecutive asterisks
"**" can be used to match all subdirectories. Other shell expansions like
brace and tilde are not supported. Spaces in paths are supported, and should
not be quoted. If a directory is specified, its contents will be included.
Paths beginning with a "!" will be excluded.

The
Expand Down

0 comments on commit c1ce345

Please sign in to comment.