Created
July 18, 2018 14:49
-
-
Save mutantcornholio/f3f048c0e13933489452db69090de499 to your computer and use it in GitHub Desktop.
stash for svn
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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