summaryrefslogtreecommitdiff
path: root/git-revert-script
blob: dc2dea48987dce1e266cdb8da2086293b4811d68 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/sh
. git-sh-setup-script || die "Not a git archive"

# We want a clean tree and clean index to be able to revert.
status=$(git status)
case "$status" in
'nothing to commit') ;;
*)
	echo "$status"
	die "Your working tree is dirty; cannot revert a previous patch." ;;
esac

rev=$(git-rev-parse --no-flags --verify --revs-only "$@") &&
commit=$(git-rev-parse --verify "$rev^0") || exit
if git-diff-tree -R -M -p $commit | git-apply --index &&
   msg=$(git-rev-list --pretty=oneline --max-count=1 $commit)
then
        {
                echo "$msg" | sed -e '
			s/^[^ ]* /Revert "/
			s/$/"/'
                echo
                echo "This reverts $commit commit."
                test "$rev" = "$commit" ||
                echo "(original 'git revert' arguments: $@)"
        } | git commit -F -
else
        # Now why did it fail?
        parents=`git-cat-file commit "$commit" 2>/dev/null |
                sed -ne '/^$/q;/^parent /p' |
                wc -l`
        case $parents in
        0) die "Cannot revert the root commit nor non commit-ish." ;;
        1) die "The patch does not apply." ;;
        *) die "Cannot revert a merge commit." ;;
        esac
fi