#!/bin/bash ################################################################################ ## Home Config Backup Script ## 2012-09-01 ################################################################################ ## Note for Zsh: because of the Ksh-style arrays (index starting at 0), you ## cannot use array index to append elements to arrays -- otherwise the ## KSH_ARRAYS option for zsh must be used. ##============================================================================== ## Options ##============================================================================== ## Set Debug mode on DEBUG=no if [ "$DEBUG" = "yes" ]; then set -x fi ## Variables OLDPATH="$(pwd)" cd "$HOME" SCRIPTPATH="$(readlink -f $(dirname "$0"))" COMPRESSION="gz" ARCHIVENAME="$HOME/home-config-$(date "+%y-%m-%d-%H%M%S")" ARCEXT="tar.gz" ARCOPT="cvzf" print_help() { echo "Synopsis:" echo " $1 [-o ARCHIVENAME] [-m COMPRESSION]" echo echo "Usage:" echo " default: " echo " -h:\t\tDisplay this help." echo " -m: compression method among" echo " * gz (default)" echo " * xz" echo " -o: output archive name (without extension)." echo "" echo "Note: xz is not available on older Unices." } while getopts ":hm:o:" opt; do case $opt in h) print_help "$0" exit 1 ;; m) COMPRESSION="$OPTARG" ;; o) ARCHIVENAME="${OLDPATH}/$OPTARG" ;; ?) print_help "$0" exit 1 ;; :) echo "Missing argument." echo "Use $0 -h for help." exit 1 ;; esac done shift $(($OPTIND - 1)) case $COMPRESSION in "gz") ARCEXT="tar.gz" ARCOPT="cvzf" ;; "xz") ARCEXT="tar.xz" ARCOPT="cvJf" ;; *) ARCEXT="tar.gz" ARCOPT="cvzf" ;; esac if [ "${DEBUG}" = "yes" ]; then echo "COMPRESSION=[$COMPRESSION]" echo "ARCHIVENAME=[$ARCHIVENAME]" echo "ARCEXT=[$ARCEXT]" echo "ARCOPT=[$ARCOPT]" fi if [ -e "${ARCHIVENAME}.${ARCEXT}" ]; then echo "Error: ${ARCHIVENAME}.${ARCEXT} already exists!">&2 exit 0 fi ##============================================================================== ## Packages list ##============================================================================== ## Arch Linux if [ -e "/usr/bin/pacman" ]; then HOST=$(hostname) ARCH_PKG_OFFICIAL="$HOME/.pkg-arch-official" ARCH_PKG_EXPLICIT="$HOME/.pkg-arch-explicit" ARCH_PKG_AUR="$HOME/.pkg-arch-aur" PKG_LOCAL='pacman -Qq | sort' PKG_FOREIGN='pacman -Qmq | sort' PKG_EXPLICIT='pacman -Qeq | sort' diff <(eval "${PKG_LOCAL}") <(eval "${PKG_FOREIGN}") --new-line-format='' --unchanged-group-format='%>' >"${ARCH_PKG_OFFICIAL}-${HOST}" eval "${PKG_EXPLICIT}" >"${ARCH_PKG_EXPLICIT}-${HOST}" eval "${PKG_FOREIGN}" >"${ARCH_PKG_AUR}-${HOST}" fi ## TeXlive if type tlmgr >/dev/null 2>&1; then HOST=$(hostname) TEXLIVE_BASIC="$(tlmgr info collection-basic --list | sed -n '/^\s\+/{s/\s\+//g;p}' | sort)" TEXLIVE_ALL="$(tlmgr info --only-installed | grep -v 'x86_64' | cut -d' ' -f2 | cut -f1 -d':' | sort)" comm -3 <(echo "$TEXLIVE_BASIC") <(echo "$TEXLIVE_ALL") | sed 's/\s\+//g' >"$HOME/.pkg-texlive-${HOST}" fi ##============================================================================== ## Let's fill the file list: ##============================================================================== FILELIST=() ## Distro + TeXlive Package list for i in $(find . -maxdepth 1 -name '.pkg*' -exec basename {} \;) do FILELIST=(${FILELIST[*]} "$i") done ## Awesome FILELIST=(${FILELIST[*]} ".config/awesome/rc.lua") FILELIST=(${FILELIST[*]} ".config/awesome/themes/custom/theme.lua") ## cmus FILELIST=(${FILELIST[*]} ".cmus/autosave") ## Emacs FILELIST=(${FILELIST[*]} ".emacs") FILELIST=(${FILELIST[*]} ".emacs.d/plugins") FILELIST=(${FILELIST[*]} ".emacs.d/snippets") FILELIST=(${FILELIST[*]} ".emacs.d/abbrev_defs") ## GTK FILELIST=(${FILELIST[*]} ".gtkrc-2.0") # FILELIST=(${FILELIST[*]} ".config/gtk-3.0/settings.ini") ## Git FILELIST=(${FILELIST[*]} ".gitconfig") ## Homeinit FILELIST=(${FILELIST[*]} ".homeinit") ## Luakit FILELIST=(${FILELIST[*]} ".config/luakit/rc.lua") FILELIST=(${FILELIST[*]} ".config/luakit/binds.lua") FILELIST=(${FILELIST[*]} ".config/luakit/globals.lua") FILELIST=(${FILELIST[*]} ".luakit_bookmarks_converter.lua") ## Mutt FILELIST=(${FILELIST[*]} ".muttrc") for i in $(ls -ad --indicator-style=none .mutt.d/* | grep -vi 'cache') do FILELIST=(${FILELIST[*]} "$i") done ## Netinit FILELIST=(${FILELIST[*]} ".netinit") ## Ranger for i in $(ls -ad --indicator-style=none .config/ranger/* | grep -vi 'pycache\|bookmarks\|history\|tagged') do FILELIST=(${FILELIST[*]} "$i") done ## README FILELIST=(${FILELIST[*]} "README") ## rtorrent FILELIST=(${FILELIST[*]} ".rtorrent.rc") ## Shells FILELIST=(${FILELIST[*]} ".bash_profile") FILELIST=(${FILELIST[*]} ".zshrc") for i in $(ls -a .shell.d/*|grep -vi 'bhistory') do FILELIST=(${FILELIST[*]} "$i") done ## Taskwarrior FILELIST=(${FILELIST[*]} ".taskrc") ## Terminfo # FILELIST=(${FILELIST[*]} ".terminfo/x/xterm") ## TeXlive # for i in $(find texmf -type f|grep -vi 'moderncv/examples\|moderncv/manual\|.bzr') # do # FILELIST=(${FILELIST[*]} "$i") # done ## Vim FILELIST=(${FILELIST[*]} ".vimrc") ## Xinit FILELIST=(${FILELIST[*]} ".xinitrc") ## Xresource FILELIST=(${FILELIST[*]} ".Xresources") ##============================================================================== ## Archiving ##============================================================================== if [ "$DEBUG" = "yes" ]; then tar ${ARCOPT} "${ARCHIVENAME}.${ARCEXT}" -C "$HOME" ${FILELIST[*]} -C "$SCRIPTPATH" "$(basename "$0")" --exclude-vcs else tar ${ARCOPT} "${ARCHIVENAME}.${ARCEXT}" -C "$HOME" ${FILELIST[*]} -C "$SCRIPTPATH" "$(basename "$0")" --exclude-vcs >/dev/null fi ##============================================================================== ## Cleaning ##============================================================================== cd "${OLDPATH}" ## Set Debug mode off if [ "$DEBUG" = "yes" ]; then set +x fi