mirror of
https://github.com/TheLocehiliosan/yadm
synced 2025-06-13 13:03:58 +00:00
Add yadm ignore
to ignore encrypted files
The new ignore command does the following: 1. Scans ~/.yadm/encrypt and adds its entries to ~/.gitignore. If ~/.gitignore doesn't exist, it's created. Any lines that begin with # or ! are skipped, as well. If the entry is already in ~/.gitignore (either as /file, !/file, file, or !file), it's skipped. While 'file' and '!file' could lead to unintended skips, not including them would more likely lead to unintended skips. 2. Scans the list of actual files found that match ~/.yadm/encrypt entries, and adds them to ~/.gitignore. For example, if ~/.yadm/encrypt contains .ssh/config##Linux, and .ssh/config exists, it adds .ssh/config to ~/.gitignore, unless the entry is already in ~/.gitignore (either as /file, !/file, file, or !file). - Since ~/.yadm/encrypt entries are rooted in $YADM_WORK without a leading slash, a leading slash is added to the ~/.gitignore entries to provide matching equivalency. - A new option --yadm-ignore allows the user to override the location of ~/.gitignore. - Uses sed to trim any leading or trailing whitespace when reading ~/.yadm/encrypt and ~/.gitignore.
This commit is contained in:
parent
09a018ea5a
commit
ec873d1ecd
152
yadm
152
yadm
@ -29,6 +29,7 @@ YADM_CONFIG="config"
|
||||
YADM_ENCRYPT="encrypt"
|
||||
YADM_ARCHIVE="files.gpg"
|
||||
YADM_BOOTSTRAP="bootstrap"
|
||||
YADM_GITIGNORE=".gitignore"
|
||||
|
||||
HOOK_COMMAND=""
|
||||
FULL_COMMAND=""
|
||||
@ -42,6 +43,7 @@ PROC_VERSION="/proc/version"
|
||||
OPERATING_SYSTEM="Unknown"
|
||||
|
||||
ENCRYPT_INCLUDE_FILES="unparsed"
|
||||
IGNORE_LINES="unparsed"
|
||||
|
||||
#; flag causing path translations with cygpath
|
||||
USE_CYGPATH=0
|
||||
@ -65,7 +67,7 @@ function main() {
|
||||
|
||||
#; parse command line arguments
|
||||
local retval=0
|
||||
internal_commands="^(alt|bootstrap|clean|clone|config|decrypt|encrypt|enter|help|init|introspect|list|perms|version)$"
|
||||
internal_commands="^(alt|bootstrap|clean|clone|config|decrypt|encrypt|enter|help|ignore|init|introspect|list|perms|version)$"
|
||||
if [ -z "$*" ] ; then
|
||||
#; no argumnts will result in help()
|
||||
help
|
||||
@ -527,6 +529,7 @@ Commands:
|
||||
yadm encrypt - Encrypt files
|
||||
yadm decrypt [-l] - Decrypt files
|
||||
yadm perms - Fix perms for private files
|
||||
yadm ignore - Add ~/.yadm/encrypt entries to ~/.gitignore
|
||||
|
||||
Files:
|
||||
\$HOME/.yadm/config - yadm's configuration file
|
||||
@ -541,6 +544,112 @@ EOF
|
||||
|
||||
}
|
||||
|
||||
function ignore() {
|
||||
|
||||
require_repo
|
||||
require_encrypt
|
||||
parse_encrypt
|
||||
parse_ignore
|
||||
|
||||
if [[ "${#ENCRYPT_INCLUDE_FILES[@]}" -eq 0 ]]; then
|
||||
error_out "No files were found to encrypt"
|
||||
return
|
||||
fi
|
||||
|
||||
local loud
|
||||
[[ "$YADM_COMMAND" = "ignore" ]] && loud="YES"
|
||||
|
||||
cd_work "Ignore" || return
|
||||
|
||||
local new_ignores
|
||||
new_ignores=()
|
||||
|
||||
# ignore specifications listed in ~/.yadm/encrypt
|
||||
local line eline iline found
|
||||
local IFS
|
||||
while IFS='' read -r line || [ -n "$line" ]; do
|
||||
# trim leading and trailing whitespace
|
||||
line="$(sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//' <<<"$line")"
|
||||
if [[ -z "$line" || "$line" =~ ^# ]]; then
|
||||
continue
|
||||
fi
|
||||
# don't ignore non-encrypted files
|
||||
if [[ "$line" =~ ^! ]]; then
|
||||
continue
|
||||
fi
|
||||
eline="$line"
|
||||
if [[ "$eline" =~ ^/ ]]; then
|
||||
eline="${eline:1}"
|
||||
fi
|
||||
found=0
|
||||
for iline in "${IGNORE_LINES[@]}"; do
|
||||
if [[ "$iline" = "$line" ]]; then
|
||||
found=1
|
||||
break
|
||||
fi
|
||||
if [[ "$iline" =~ ^/ ]]; then
|
||||
iline="${iline:1}"
|
||||
if [[ "$iline" = "$eline" ]]; then
|
||||
found=1
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
# skip files that have already been ignored
|
||||
if [[ "$found" -eq 1 ]]; then
|
||||
continue
|
||||
fi
|
||||
debug "Adding /$eline to $YADM_GITIGNORE"
|
||||
[[ -n "$loud" ]] && echo "Adding /$eline to $YADM_GITIGNORE"
|
||||
# add a / to anchor the search in the home directory.
|
||||
new_ignores+=("/$eline")
|
||||
IGNORE_LINES+=("/$eline")
|
||||
done < "$YADM_ENCRYPT"
|
||||
|
||||
# ignore template files used to generate the files listed in ~/.yadm/encrypt
|
||||
# this will match ##yadm.j2 files as well.
|
||||
local match="^(.+)##"
|
||||
local file
|
||||
for file in "${ENCRYPT_INCLUDE_FILES[@]}"; do
|
||||
if [[ ! "$file" =~ $match ]]; then
|
||||
continue
|
||||
fi
|
||||
file="${BASH_REMATCH[1]}"
|
||||
found=0
|
||||
for iline in "${IGNORE_LINES[@]}"; do
|
||||
if [[ "$iline" = "$file" ]]; then
|
||||
found=1
|
||||
break
|
||||
fi
|
||||
if [[ "${iline:0:1}" = "/" ]]; then
|
||||
iline="${iline:1}"
|
||||
if [[ "$iline" = "$file" ]]; then
|
||||
found=1
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
# skip files that have already been ignored
|
||||
if [[ "$found" -eq 1 ]]; then
|
||||
continue
|
||||
fi
|
||||
debug "Adding /$file to $YADM_GITIGNORE."
|
||||
[[ -n "$loud" ]] && echo "Adding /$file to $YADM_GITIGNORE."
|
||||
# add a / to anchor the search in the home directory.
|
||||
new_ignores+=("/$file")
|
||||
IGNORE_LINES+=("/$file")
|
||||
done
|
||||
|
||||
if [[ "${#new_ignores[@]}" -eq 0 ]]; then
|
||||
echo_e "$YADM_GITIGNORE already has all the entries from $YADM_ENCRYPT"
|
||||
return 0
|
||||
fi
|
||||
|
||||
printf "\n# Added by 'yadm ignore' on %s:\n" "$(date)" >> "$YADM_GITIGNORE"
|
||||
printf "%s\n" "${new_ignores[@]}" >> "$YADM_GITIGNORE"
|
||||
|
||||
}
|
||||
|
||||
function init() {
|
||||
|
||||
#; safety check, don't attempt to init when the repo is already present
|
||||
@ -582,6 +691,7 @@ encrypt
|
||||
enter
|
||||
gitconfig
|
||||
help
|
||||
ignore
|
||||
init
|
||||
introspect
|
||||
list
|
||||
@ -619,6 +729,7 @@ function introspect_switches() {
|
||||
--yadm-config
|
||||
--yadm-dir
|
||||
--yadm-encrypt
|
||||
--yadm-ignore
|
||||
--yadm-repo
|
||||
-Y
|
||||
EOF
|
||||
@ -738,6 +849,13 @@ function process_global_args() {
|
||||
YADM_OVERRIDE_BOOTSTRAP="$2"
|
||||
shift
|
||||
;;
|
||||
--yadm-gitignore) #; override the standard YADM_GITIGNORE
|
||||
if [[ ! "$2" =~ ^/ ]] ; then
|
||||
error_out "You must specify a fully qualified encrypt path"
|
||||
fi
|
||||
YADM_OVERRIDE_GITIGNORE="$2"
|
||||
shift
|
||||
;;
|
||||
*) #; main arguments are kept intact
|
||||
MAIN_ARGS+=("$1")
|
||||
;;
|
||||
@ -755,6 +873,7 @@ function configure_paths() {
|
||||
YADM_ENCRYPT="$YADM_DIR/$YADM_ENCRYPT"
|
||||
YADM_ARCHIVE="$YADM_DIR/$YADM_ARCHIVE"
|
||||
YADM_BOOTSTRAP="$YADM_DIR/$YADM_BOOTSTRAP"
|
||||
YADM_GITIGNORE="$YADM_WORK/$YADM_GITIGNORE"
|
||||
|
||||
#; independent overrides for paths
|
||||
if [ -n "$YADM_OVERRIDE_REPO" ]; then
|
||||
@ -772,6 +891,9 @@ function configure_paths() {
|
||||
if [ -n "$YADM_OVERRIDE_BOOTSTRAP" ]; then
|
||||
YADM_BOOTSTRAP="$YADM_OVERRIDE_BOOTSTRAP"
|
||||
fi
|
||||
if [ -n "$YADM_OVERRIDE_GITIGNORE" ]; then
|
||||
YADM_GITIGNORE="$YADM_OVERRIDE_GITIGNORE"
|
||||
fi
|
||||
|
||||
#; use the yadm repo for all git operations
|
||||
GIT_DIR=$(mixed_path "$YADM_REPO")
|
||||
@ -960,6 +1082,34 @@ function parse_encrypt() {
|
||||
|
||||
}
|
||||
|
||||
function parse_ignore() {
|
||||
|
||||
IGNORE_LINES=()
|
||||
|
||||
if [ ! -e "$YADM_GITIGNORE" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
cd_work "Parsing $YADM_GITIGNORE" || return
|
||||
|
||||
#; parse both included/excluded
|
||||
local IFS
|
||||
local line
|
||||
local match="^!(.+)"
|
||||
while IFS=$'\n' read -r line; do
|
||||
# trim leading and trailing whitespace
|
||||
line="$(sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//' <<<"$line")"
|
||||
if [[ -z "$line" || "$line" =~ ^# ]]; then
|
||||
continue
|
||||
fi
|
||||
if [[ "$line" =~ $match ]]; then
|
||||
line="${BASH_REMATCH[1]}"
|
||||
fi
|
||||
IGNORE_LINES+=("$line")
|
||||
done < "$YADM_GITIGNORE"
|
||||
|
||||
}
|
||||
|
||||
#; ****** Auto Functions ******
|
||||
|
||||
function auto_alt() {
|
||||
|
Loading…
Reference in New Issue
Block a user