]> de.git.xonotic.org Git - xonotic/div0-gittools.git/blob - git-open-reverts
quick exit on exact match
[xonotic/div0-gittools.git] / git-open-reverts
1 #!/bin/sh
2
3 t=`mktemp`
4 git log --pretty=raw "$@" > "$t"
5
6 allreverted=
7 reverts()
8 {
9         commit=$1
10         reverted=$2
11         eval "reverts_in_$commit=\"\$reverts_in_$commit $reverted\""
12         eval "reverts_$reverted=\"\$reverts_$reverted $commit\""
13         allreverted="$allreverted $reverted"
14         #echo >&2 "Found: $commit reverts $reverted"
15 }
16
17 # in the tree of reverters, look for any leaves of even depth
18
19 reverters()
20 {
21         eval "echo \$reverts_$1"
22 }
23
24 whatreverts_inverted()
25 {
26         local status reverter printme
27         status=false
28         printme=true
29         for reverter in `reverters "$1"`; do
30                 if ! whatreverts "$reverter"; then
31                         status=true
32                 fi
33                 printme=false
34         done
35         if $printme; then
36                 echo "$1"
37         fi
38         $status
39 }
40
41 whatreverts()
42 {
43         local status reverter
44         status=false
45         for reverter in `reverters "$1"`; do
46                 if ! whatreverts_inverted "$reverter"; then
47                         status=true
48                 fi
49         done
50         $status
51 }
52
53 # pass 1: find which commit reverts which
54 while IFS= read -r L; do
55         case "$L" in
56                 "commit "*)
57                         commit="${L#commit }"
58                         ;;
59                 "    This reverts commit "*)
60                         reverted=${L#    This reverts commit }
61                         reverted=${reverted%.}
62                         reverts "$commit" "$reverted"
63                         ;;
64         esac
65 done < "$t"
66
67 # pass 2: for all reverted commits, find their status and their latest revert
68 for commit in $allreverted; do
69         if eval "[ -n \"\$seen_$commit\" ]"; then
70                 continue
71         fi
72         eval "seen_$commit=1"
73         if eval "[ -n \"\$reverts_in_$commit\" ]"; then
74                 continue
75         fi
76         if revertedby=`whatreverts "$commit" | grep .`; then
77                 echo "$commit got reverted by $revertedby:"
78                 git log -1 $revertedby
79         fi
80 done
81
82 rm -f "$t"