Skip to content

Instantly share code, notes, and snippets.

@mutantcornholio
Created July 18, 2018 14:49
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 mutantcornholio/f3f048c0e13933489452db69090de499 to your computer and use it in GitHub Desktop.
Save mutantcornholio/f3f048c0e13933489452db69090de499 to your computer and use it in GitHub Desktop.
stash for svn
#!/usr/bin/env bash
set -e
if [[ $(uname) == "Darwin" ]]; then
stat_args="-f%m"
date_args="-r "
elif [[ $(uname) == "Linux" ]]; then
stat_args="-c %Y"
date_args="-d @"
else
echo "Unreachable"; exit 1
fi
stash_dir="$HOME/.svn-stash"
usage() {
echo 'Usage: svn-stash [-h|--help|ls|list|pop] [--keep] [<rev>]'
echo
echo 'git stash for svn'
echo
echo 'Examples:'
echo ' svn-stash Stash your changes'
echo ' svn-stash my-changelist Stash your changes with "my-changelist" name'
echo ' svn-stash ls Show all stashes'
echo ' svn-stash pop Apply last patch'
echo ' svn-stash pop 2018-01-01 Apply patch named 2018-01-01'
echo ' svn-stash pop --keep 2018-01-01 Apply patch named 2018-01-01 and don'\''t delete it'
echo ' svn-stash files Show files in last patch'
echo ' svn-stash files 2018-01-01 Show files in patch named 2018-01-01'
echo ' svn-stash diff Print last patch'
echo ' svn-stash diff 2018-01-01 Print patch named 2018-01-01'
echo
}
stash() {
echo "wat"
}
list() {
if [[ ! -d ~/.svn-stash || -z "$(ls -A ~/.svn-stash)" ]]; then
echo "No stashes found"
exit 1
fi
res="Name§Mtime\n"
for filename in "$stash_dir"/*; do
res+="$(basename "$filename")§$(date $date_args"$(stat "${stat_args[@]}" "$filename")")\n"
done
echo -e "$res" | column -t -s §
}
stash() {
if [[ -z "$1" ]]; then
name="$(date "+%Y-%m-%d_%H:%M:%S")"
else
name="$1"
fi
if [[ -f "$name" ]]; then
echo "Stash named \"$name\" already exists!"
exit 1
fi
if ! svn st |grep -v "^?" > /dev/null; then
echo "No changes detected"
exit 1
fi
svn diff > "$stash_dir/$name"
svn revert . -R && svn status |awk '{print "$2"}' |xargs rm -rf > /dev/null
echo "Stashed as \"$name\""
}
pop() {
keep=false
name="$(_last_patch)"
if [[ "$2" == "--keep" ]]; then
keep=true
if [[ -n "$3" ]]; then
name="$3"
fi
elif [[ -n "$2" ]]; then
name="$2"
fi
echo "Applying \"$name\""
patch -p0 -i "$stash_dir/$name"
if [[ "$keep" == false ]]; then
rm "$stash_dir/$name"
fi
echo "Success!"
}
diff() {
if [[ -z "$2" ]]; then
name="$(_last_patch)"
else
name="$2"
fi
echo "Patch \"$name\":"
echo
if which colordiff > /dev/null; then
cat "$stash_dir/$name" | colordiff
else
cat "$stash_dir/$name"
fi
}
files() {
if [[ -z "$2" ]]; then
name="$(_last_patch)"
else
name="$2"
fi
echo "Patch \"$name\":"
echo
cat "$stash_dir/$name" | grep '+++' |perl -pe 's/\+\+\+ (.*)\t.*/\1/g'
}
_last_patch() {
echo "$(ls -t "$stash_dir"|head -n 1)"
}
case "$1" in
(-h|--help) usage; exit; ;;
(ls|list) list; exit; ;;
(pop) pop "$@"; exit; ;;
(diff) diff "$@"; exit; ;;
(files) files "$@"; exit; ;;
(*) stash "$@"; exit; ;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment