#!/bin/sh usage() { cat <&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/) 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)) PERSONAL_FOLDER="$HOME/personal" [ -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/games|*/public/videos) for j in "$i"/*; do folder=$(basename $(dirname "$j")) mkdir -p ~/personal/index/"$folder" dataindex "$j" > ~/personal/index/"$folder"/"$(basename "$j")".index unset folder done continue ;; */public) for j in "$i"/*; do dataindex "$j" > ~/personal/index/"$(basename "$j")".index done continue ;; */private) for j in "$i"/*; do mkdir -p ~/personal/index/private ## TODO: Discard empty results? 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 sudo mount -o compress=zstd /dev/mapper/gpg_backup /mnt gpg --import /mnt/public/.gnupg/pubring.gpg sudo btrfs subvolume snapshot -r /mnt/public /mnt/.snapshots/public.${date +%F_%R:%S} && \ rm -rfv /mnt/public/.gnupg && \ cp -a ~/.gnupg /mnt/public/ sudo umount /mnt sudo cryptsetup close gpg_backup fi ## No need for package-list with Guix manifests. # section "$HOME/.package-lists" # package-lister if [ -f ~/.cache/emacs/eshell/history ]; then section "Shell history" mkdir -pv ~/personal/history/ rm -vf ~/personal/history/eshell.gpg gpg --output ~/personal/history/eshell.gpg --recipient mail@ambrevar.xyz --encrypt ~/.cache/emacs/eshell/history fi if [ -e ~/.cache/mail/.notmuch ]; then section "Notmuch tags" notmuch restore --accumulate --input=$HOME/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 ~/dotfiles ~/.password-store ~/personal ~/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