#!/bin/bash PATSH_REPO=".patches" PATSH_NAME="patsh" function check_if_unchanged { unset -v LATEST_DIFF for file in "${PATSH_REPO}/${1}"-*.diff; do [[ "$file" -nt "${LATEST_DIFF}" ]] && LATEST_DIFF="$file" done if [ "$LATEST_DIFF" != "" ]; then patch -i "${LATEST_DIFF}" -o - "${PATSH_REPO}/${1}" 2> /dev/null | cmp - "${1}" > /dev/null else cmp "${PATSH_REPO}/${1}" "${1}" > /dev/null fi } function showhelp { cat < "${LATEST_DIFF}" printf "${PATSH_NAME}: changes written to %s\n" "${LATEST_DIFF}" fi shift done ;; restore|co) while [ -e "$2" ]; do unset -v LATEST_DIFF if [ ! -e "${PATSH_REPO}/$2" ]; then printf "${PATSH_NAME}: file ${2} not tracked\n" exit 0 fi cp "${PATSH_REPO}/${2}" "${2}" for file in "${PATSH_REPO}/${2}"-*.diff; do [[ "$file" -nt "${LATEST_DIFF}" ]] && LATEST_DIFF="$file" done if [ "$LATEST_DIFF" != "" ]; then patch "${2}" < "${LATEST_DIFF}" > /dev/null printf "${PATSH_NAME}: reset to ${LATEST_DIFF}\n" else printf "${PATSH_NAME}: reset to original version\n" fi shift done ;; diff) while [ -e "$2" ]; do unset -v LATEST_DIFF printf "${PATSH_NAME}: ${2} working copy changes\n" for file in "${PATSH_REPO}/${2}"-*.diff; do [[ "$file" -nt "${LATEST_DIFF}" ]] && LATEST_DIFF="$file" done if [ "$LATEST_DIFF" != "" ]; then patch -i "${LATEST_DIFF}" -o - "${PATSH_REPO}/${2}" 2> /dev/null | diff --color=always - "${2}" else diff --color=always "${PATSH_REPO}/${2}" "${2}" fi shift done ;; *) if [ "$1" == "" ]; then showhelp; fi printf "${PATSH_NAME}: unknown operation: ${1}\n" ;; esac