Skip to content

Commit

Permalink
Merge pull request #850 from vr8hub/newundo
Browse files Browse the repository at this point in the history
Modify to work when only a single commit, add parameter checks
  • Loading branch information
spacewander authored Jun 21, 2020
2 parents 90495d0 + 27f42be commit 5a79873
Showing 1 changed file with 46 additions and 11 deletions.
57 changes: 46 additions & 11 deletions bin/git-undo
Original file line number Diff line number Diff line change
@@ -1,6 +1,27 @@
#!/usr/bin/env bash

back="^"
cstr="commits"
ccnt=$(git rev-list --count HEAD)
if [ $ccnt -eq 1 ]; then cstr="commit"; fi
parm3=""

function _undo()
{
type=${1:-soft}
undo_cnt=${2:-1}
reset=${3:-""}

if [ $undo_cnt -gt $ccnt ]; then
echo "Only $ccnt $cstr, cannot undo $undo_cnt"
elif [ "$type" = "hard" ] && [ $ccnt -eq $undo_cnt ]; then
echo "Cannot hard undo all commits"
elif [ "$type" = "soft" ] && [ $ccnt -eq 1 ]; then
git update-ref -d HEAD
else
git reset --$type HEAD~$undo_cnt
fi
if [ "$reset" != "" ]; then git reset; fi
}

case "$1" in
-h)
Expand All @@ -12,26 +33,40 @@ EOL
read -r res
case "${res}" in
"Y" | "y")
test $2 -gt 1 > /dev/null 2>&1 && back="~$2"
git reset --hard HEAD$back
exit $?
parm1=hard
parm2=${2:-1}
;;
* )
exit 0
;;
esac
;;
--hard)
test $2 -gt 1 > /dev/null 2>&1 && back="~$2"
git reset --hard HEAD$back
parm1=hard
parm2=${2:-1}
;;
-s|--soft)
test $2 -gt 1 > /dev/null 2>&1 && back="~$2"
git reset --soft HEAD$back
parm1=soft
parm2=${2:-1}
parm3=reset
;;
"")
parm1=soft
parm2=1
;;
*[!0-9]*)
echo "Invalid parameter: $1"
exit 1
;;
*)
test $1 -gt 1 > /dev/null 2>&1 && back="~$1"
git reset --soft HEAD$back
git reset
parm1=soft
parm2="$1"
;;
esac

if [[ ! $parm2 =~ ^[1-9][0-9]*$ ]]; then
echo "Invalid undo count: $parm2"
exit 1
fi

_undo $parm1 $parm2 $parm3

0 comments on commit 5a79873

Please sign in to comment.