]>
Commit | Line | Data |
---|---|---|
045f82cb JH |
1 | #!/bin/sh |
2 | . git-sh-setup-script || die "Not a git archive" | |
3 | ||
4 | # We want a clean tree and clean index to be able to revert. | |
5 | status=$(git status) | |
6 | case "$status" in | |
7 | 'nothing to commit') ;; | |
8 | *) | |
9 | echo "$status" | |
10 | die "Your working tree is dirty; cannot revert a previous patch." ;; | |
11 | esac | |
12 | ||
13 | rev=$(git-rev-parse --no-flags --verify --revs-only "$@") && | |
14 | commit=$(git-rev-parse --verify "$rev^0") || exit | |
15 | if git-diff-tree -R -M -p $commit | git-apply --index && | |
16 | msg=$(git-rev-list --pretty=oneline --max-count=1 $commit) | |
17 | then | |
18 | { | |
19 | echo "$msg" | sed -e ' | |
20 | s/^[^ ]* /Revert "/ | |
21 | s/$/"/' | |
22 | echo | |
23 | echo "This reverts $commit commit." | |
24 | test "$rev" = "$commit" || | |
25 | echo "(original 'git revert' arguments: $@)" | |
26 | } | git commit -F - | |
27 | else | |
28 | # Now why did it fail? | |
29 | parents=`git-cat-file commit "$commit" 2>/dev/null | | |
30 | sed -ne '/^$/q;/^parent /p' | | |
31 | wc -l` | |
32 | case $parents in | |
33 | 0) die "Cannot revert the root commit nor non commit-ish." ;; | |
34 | 1) die "The patch does not apply." ;; | |
35 | *) die "Cannot revert a merge commit." ;; | |
36 | esac | |
37 | fi |