New directory structure + basilisk

This commit is contained in:
2026-01-12 19:32:18 -07:00
parent 298eb76909
commit ff69bb8284
316 changed files with 2467 additions and 1375 deletions

152
bin/dotf Executable file
View File

@@ -0,0 +1,152 @@
#!/bin/sh
SOURCE="$(realpath "$0")"
STORE_PATH="$(dirname "$SOURCE")/../"
STORE_PATH="$(realpath "$STORE_PATH")"
STORE_ENTRIES_FILE="${STORE_PATH}/paths"
ABS_HOME="$(readlink -f "$HOME")"
method=""
path=""
do_commit=false
commit_message="."
pull_to=""
for arg in "$@"; do
case $arg in
"-c")
do_commit=true
;;
"-m="*)
commit_message="${arg#*=}"
;;
"-pt="*)
pull_to="${arg#*=}"
pull_to="$(realpath "$pull_to")"
;;
*)
if [ -z "$method" ]; then
method="$arg"
else
path="$arg"
fi
;;
esac
done
if [ -z "$path" ]; then
path="."
fi
path="$(realpath --no-symlinks "$path")"
add() {
entry="$path"
check-cyclical-entry
check-duplicate-entry
printf %s\\n "$entry" >> "$STORE_ENTRIES_FILE"
printf %s\\n "Added path: $entry"
}
check-cyclical-entry() {
case "$STORE_PATH" in
"$entry"*)
printf 'Cannot cyclically archive: "%s" contains dotfiles directory'\\n "$path" >&2
exit
;;
esac
}
check-duplicate-entry() {
while IFS='' read -r line || [ -n "$line" ]; do
case $entry in
"$line"*)
printf %s\\n "Item already within path: ${line}" >&2
exit
;;
esac
done < "$STORE_ENTRIES_FILE"
}
update-dest() {
dest="$STORE_PATH/root$entry"
}
push() {
while IFS='' read -r entry || [ -n "$entry" ]; do
check-cyclical-entry
update-dest
dest_dir="$(dirname "$dest")"
rsync -rv --itemize-changes "$entry" "$dest_dir"
done < "$STORE_ENTRIES_FILE"
}
pull() {
printf %s\\n "Diffs:"
show-diff
pull-prompt
}
entry-in-pull-path() {
entry="${pull_to}${entry}"
}
pull-prompt() {
printf "Is this ok? [y/N/d(etails)] "
read -r response
case "$response" in
d*|D*)
show-diff-detail
pull-prompt
;;
y*|Y*)
confirmed-pull
;;
*)
printf %s\\n "No action taken"
exit
;;
esac
}
show-diff() {
while IFS='' read -r entry || [ -n "$entry" ]; do
update-dest
entry-in-pull-path
diff -rq "$entry" "$dest" | awk '
/^Only in/ { print $0 " (this will not be overwritten)"; next }
{ print }
'
done < "$STORE_ENTRIES_FILE"
}
show-diff-detail() {
while IFS='' read -r entry || [ -n "$entry" ]; do
update-dest
entry-in-pull-path
diff -ru "$entry" "$dest"
done < "$STORE_ENTRIES_FILE" | less
}
confirmed-pull() {
while IFS='' read -r entry || [ -n "$entry" ]; do
check-cyclical-entry
update-dest
entry-in-pull-path
entry_dir="$(dirname "$entry")"
mkdir -p "$entry_dir"
rsync -rv --itemize-changes "$dest" "$entry_dir"
done < "$STORE_ENTRIES_FILE"
}
case "$method" in
"add") add ;;
"remove") remove ;;
"push") push ;;
"pull") pull ;;
esac