Skip to content

Instantly share code, notes, and snippets.

@kjdev
Created October 4, 2012 01:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kjdev/3830930 to your computer and use it in GitHub Desktop.
Save kjdev/3830930 to your computer and use it in GitHub Desktop.
snapshot scripts
;;; snapshot
(defun snapshot ()
(interactive)
(let ((msg (read-from-minibuffer "comment: ")))
(if (> (length msg) 0)
(shell-command (concat "~/bin/snapshot -m \"" msg "\" " (buffer-file-name)))
(shell-command (concat "~/bin/snapshot " (buffer-file-name))))))
#!/bin/sh
usage() {
echo "Usage: ${0##*/} [-l] [-c] [-d] [-n NUM] [-m MESSAGE] ARGS ..."
echo "Options:"
echo " l: list viewer"
echo " c: clean"
echo " d: diff"
echo " n: diff target"
echo " m: save to message"
exit 1
}
DIFF_COMMAND="colordiff -s -u"
GREP_COMMAND="grep"
CLEAN=0
DIFF=0
HEAD=1
LIST=0
MESSAGE=
while getopts "hcdln:m:" OPTION; do
case "${OPTION}" in
"c")
CLEAN=1
;;
"d")
DIFF=1
;;
"n")
HEAD="${OPTARG}"
;;
"l")
LIST=1
;;
"m")
MESSAGE="${OPTARG}"
;;
?)
usage
;;
esac
done
shift $((${OPTIND}-1))
DIR=`pwd`
SNAPSHOT_DIRNAME=.snapshot
SNAPSHOT_DIR=${DIR}/${SNAPSHOT_DIRNAME}
SNAPSHOT_LIST=${SNAPSHOT_DIR}/.lists
if [ ! -d ${SNAPSHOT_DIR} ]; then
mkdir -p ${SNAPSHOT_DIR}
fi
if [ ! -f ${SNAPSHOT_LIST} ]; then
touch ${SNAPSHOT_LIST}
fi
# clean
if [ "${CLEAN}" = "1" ]; then
if [ $# -eq 0 ]; then
rm -rf ${SNAPSHOT_DIR}
else
for SOURCE in "$@"; do
ORIGIN=`basename ${SOURCE}`
grep -v "${ORIGIN}" ${SNAPSHOT_LIST} > ${SNAPSHOT_LIST}.new
mv ${SNAPSHOT_LIST}.new ${SNAPSHOT_LIST}
for FILE in `ls ${SNAPSHOT_DIR}/${ORIGIN}* 2> /dev/null`; do
if [ -f ${FILE} ]; then
rm -f ${FILE}
fi
done
done
fi
exit 0
fi
# list viewer
if [ "${LIST}" = "1" ]; then
if [ $# -eq 0 ]; then
cat ${SNAPSHOT_LIST}
else
for SOURCE in "$@"; do
${GREP_COMMAND} "${SOURCE}" ${SNAPSHOT_LIST}
done
fi
exit 0
fi
# args
if [ $# -eq 0 ]; then
usage
fi
# diff
if [ "${DIFF}" = "1" ]; then
NUM=`echo -n ${HEAD} | sed 's/[0-9]//g'`
if [ -n "${NUM}" ]; then
echo "WARN: Non numeric: head to 1"
HEAD=1
fi
for SOURCE in "$@"; do
ORIGIN=`basename ${SOURCE}`
if [ -f ${ORIGIN} ]; then
TARGET=`ls -t -1 ./${SNAPSHOT_DIRNAME}/${ORIGIN}* 2> /dev/null | head -${HEAD} | tail -1`
if [ ! "${TARGET}" = "" ]; then
${DIFF_COMMAND} ${TARGET} ${ORIGIN}
else
echo "ERR: No snapshot file: ${ORIGIN}"
fi
else
echo "ERR: Current file: ${SOURCE}"
fi
done
exit 0
fi
# copy
if [ ! "${MESSAGE}" = "" ]; then
MESSAGE=" :${MESSAGE}"
fi
SUFFIX=.`date '+%Y%m%d%H%M%S'`
DATE=`date '+%Y-%m-%d %H:%M:%S'`
for SOURCE in "$@"; do
ORIGIN=`basename ${SOURCE}`
if [ -f ${ORIGIN} ]; then
cp ${SOURCE} ${SNAPSHOT_DIR}/${ORIGIN}${SUFFIX}
echo "[${DATE}] ${ORIGIN}${MESSAGE}" >> ${SNAPSHOT_LIST}
else
echo "ERR: Current file: ${SOURCE}"
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment