123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- #!/bin/sh
- usage() {
- cat <<EOF>&2
- Usage: ${0##*/}
- Sync home folder.
- Data is indexed to \$PERSONAL/index.
- The '~/.gnupg' folder can be backup up to a LUKS encrypted device.
- Options:
- -d PATH: where the data is looked up for indexing.
- -g DEVICE: Device where to sync ~/.gnupg.
- -p: Push upstream.
- EOF
- exit
- }
- OPT_UPDATE=false
- OPT_DEVICE=""
- OPT_DATAROOT=$(findmnt -n --fstab --output TARGET | grep ^/media/)
- [ -z "$OPT_DATAROOT" ] && OPT_DATAROOT=$(findmnt -n --list --output TARGET | grep ^/media/)
- while getopts ":hd:g:p" opt; do
- case $opt in
- h)
- usage
- exit ;;
- d)
- OPT_DATAROOT="$OPTARG" ;;
- p)
- OPT_UPDATE=true ;;
- g)
- OPT_DEVICE="$OPTARG" ;;
- \?)
- usage
- exit 1 ;;
- esac
- done
- shift $(($OPTIND - 1))
- [ -z "$PERSONAL" ] && echo >&2 'Set $PERSONAL to project directory.' && exit 1
- [ -z "$XDG_CONFIG_HOME" ] && XDG_CONFIG_HOME="$HOME/.config"
- [ -z "$XDG_DATA_HOME" ] && XDG_DATA_HOME="$HOME/.local/share"
- RED='\033[0;31m\033[1m'
- GREEN='\033[0;32m\033[1m'
- YELLOW='\033[0;33m\033[1m'
- BOLD='\033[0m\033[1m'
- NORMAL='\033[0m'
- section() {
- echo -e "$GREEN==> $@$NORMAL"
- }
- message() {
- echo -e "$YELLOW:: $@$NORMAL"
- }
- if [ -n "$OPT_DATAROOT" ]; then
- section Data index
- for i in "$OPT_DATAROOT"/*; do
- mkdir -p "$PERSONAL"/index/
- case "$i" in
- */locate.db|*/lost+found|*/Sync*)
- continue ;;
- */public)
- for j in "$i"/*; do
- case "$j" in
- */games|*/videos)
- for k in "$j"/*; do
- folder=$(basename $(dirname "$k"))
- mkdir -p "$PERSONAL"/index/"$folder"
- dataindex "$k" > "$PERSONAL"/index/"$folder"/"$(basename "$k")".index
- unset folder
- done ;;
- *)
- dataindex "$j" > "$PERSONAL"/index/"$(basename "$j")".index ;;
- esac
- done
- continue ;;
- */private)
- for j in "$i"/*; do
- mkdir -p "$PERSONAL"/index/private
- [ -e "$j"/.encfs*.xml ] && continue
- dataindex "$j" | gpg --encrypt --recipient mail@ambrevar.xyz \
- --output - > "$PERSONAL"/index/private/"$(basename "$j")".index.gpg
- done
- continue ;;
- esac
- done
- fi
- if [ -n "$OPT_DEVICE" ]; then
- section "GnuPG"
- sudo cryptsetup open "$OPT_DEVICE" gpg_backup
- MOUNT_POINT=/mnt
- # MOUNT_POINT=/media/ambrevar/gpg_backup
- sudo mount -o compress=zstd /dev/mapper/gpg_backup "$MOUNT_POINT"
- gpg --import "$MOUNT_POINT"/public/.gnupg/pubring.gpg
- sudo btrfs subvolume snapshot -r "$MOUNT_POINT"/public "$MOUNT_POINT"/.snapshots/public.$(date +%F_%R:%S) && \
- rm -rfv "$MOUNT_POINT"/public/.gnupg && \
- cp -av ~/.gnupg "$MOUNT_POINT"/public/
- sudo umount "$MOUNT_POINT"
- sudo cryptsetup close gpg_backup
- unset MOUNT_POINT
- fi
- if [ -e ~/.cache/mail/.notmuch ]; then
- section "Notmuch tags"
- notmuch restore --accumulate --input="$PERSONAL"/mail/notmuch.dump
- emacs --quick --batch --load=$HOME/.emacs.d/lisp/init-notmuch-sync.el \
- -f notmuch-dump-important-tags
- fi
- for i in "$PERSONAL"/games/stowed-saves/*; do
- section "Stowing '$i'"
- stow -t ~ -d "$(dirname "$i")" "$(basename "$i")"
- done
- project_status() {
- local path=$1
- local title=$2
- local body=$3
- [ -z "$body" ] && return
- if $CHANGED; then
- section "$path"
- CHANGED=false
- fi
- message "$title"
- echo "$body"
- }
- for i in ~/.password-store ~/common-lisp/* ~/projects/* ~/.local/share/emacs/site-lisp/* "$@"; do
- [ ! -d "$i/.git" ] && continue
- CHANGED=true
- push=$(git -C "$i" rev-parse --abbrev-ref --symbolic-full-name @{push} 2>&1)
- if [ $? -eq 0 ]; then
- unmerged=$(git -C "$i" log --oneline "$push"..)
- project_status "$i" "Unpushed commits" "$unmerged"
- else
- project_status "$i" "Unpushed commits" "No 'push' remote"
- fi
- project_status "$i" "Unstaged files" "$(git -C "$i" diff --name-only)"
- project_status "$i" "Staged files" "$(git -C "$i" diff --name-only --cached)"
- if $OPT_UPDATE && [ -n "$unmerged" ]; then
- message "Pushing"
- git -C "$i" push
- fi
- done
|