cook: Move temporaries one level down
[git] / AT
1 #!/bin/sh
2
3 log=Meta/AT.log
4 >>"$log"
5 buildlog=Meta/AT.build-logs
6 mkdir -p "$buildlog"
7 t="/tmp/AT.$$"
8
9 trap 'rm -f "$t.*"; exit' 0 1 2 3 15
10
11 _x40="[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]"
12 _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
13
14 log_prune () {
15         cp "$log" "$log.bak"
16
17         git for-each-ref --format='%(objectname)' 'refs/heads/*/*' |
18         git rev-list --not ko/maint --not --stdin |
19         while read commit
20         do
21                 git rev-parse --verify "$commit^{tree}"
22         done | sort -u >"$t.tree0"
23         sed -ne "s/A \($_x40\)  .*/\1/p" "$log" | sort -u >"$t.tree1"
24         comm -13 "$t.tree0" "$t.tree1" | sed -e 's|.*|/^A &/d|' >"$t.prune"
25
26         next=$(git rev-parse --verify "refs/heads/next^0")
27         ko_next=$(git rev-parse --verify "refs/remotes/ko/next^0")
28         echo "/^N /{
29                 s/^N $next /&/
30                 t ok
31                 s/^N $ko_next /&/
32                 t ok
33                 d
34                 : ok
35 }" >>"$t.prune"
36
37         sed -f "$t.prune" "$log" >"$t.pruned"
38         cat "$t.pruned" >"$log"
39 }
40
41 check_skip_test () {
42         GIT_SKIP_TESTS=
43         git diff --name-only ko/master "$1" >"$t.d"
44         if ! grep -q -e git-svn "$t.d"
45         then
46                 GIT_SKIP_TESTS="$GIT_SKIP_TESTS t91??"
47         fi
48         if ! grep -q -e git-cvsexportcommit "$t.d"
49         then
50                 GIT_SKIP_TESTS="$GIT_SKIP_TESTS t9200"
51         fi
52         if ! grep -q -e git-cvsimport "$t.d"
53         then
54                 GIT_SKIP_TESTS="$GIT_SKIP_TESTS t9600"
55         fi
56         if test -n "$GIT_SKIP_TESTS"
57         then
58                 export GIT_SKIP_TESTS
59         else
60                 unset GIT_SKIP_TESTS
61         fi
62 }
63
64 autotest () {
65         commit=$(git rev-parse --verify "$1^0") &&
66         tree=$(git rev-parse --verify "$commit^{tree}") || return 1
67         grep -s "^A $tree       " "$log" >/dev/null && return 0
68         o="$buildlog/$tree"
69
70         git reset -q --hard HEAD^0 &&
71         git checkout -q "$commit^0" || return 1
72
73         check_skip_test "$tree"
74
75         PAGER= git show -s --pretty='format:* %h %s%n' "$commit" --
76         if ! Meta/Make -pedantic >"$o" 2>&1
77         then
78                 status="build error"
79         elif ! Meta/Make -pedantic test >>"$o" 2>&1
80         then
81                 status="test error"
82         else
83                 status=ok
84                 rm -f "$o"
85         fi
86         : Meta/Make clean >/dev/null 2>&1
87         echo "A $tree   $status" >>"$log"
88         echo "$status"
89 }
90
91 append_to_status () {
92         if test -z "$status"
93         then
94                 status="$1"
95         else
96                 status="$status; $1"
97         fi
98 }
99
100 nexttest () {
101         mb=$(git merge-base "$commit" "$next") || return 1
102         test "$mb" = "$commit" && return 0
103         grep -s "^N $next $commit       " "$log" >/dev/null && return 0
104
105         branch="${refname#refs/heads/}"
106         git reset -q --hard next^0
107
108         echo "* $branch"
109
110         status= skip_build=
111         if ! git merge "$commit" >/dev/null 2>&1
112         then
113                 conflict_count=$(git ls-files -u |
114                                 sed -e 's/.*    //' |
115                                 sort -u |
116                                 xargs grep -e '^<<<<<<< ' |
117                                 wc -l)
118                 if test $conflict_count = 0
119                 then
120                         append_to_status "rerere ok"
121                 else
122                         skip_build=t
123                         append_to_status "conflict $conflict_count"
124                 fi
125         fi
126         if test -z "$skip_build"
127         then
128                 o="$buildlog/$commit"
129                 check_skip_test "$commit"
130                 if ! Meta/Make -pedantic >"$o" 2>&1
131                 then
132                         append_to_status "build error"
133                 elif ! Meta/Make -pedantic test >>"$o" 2>&1
134                 then
135                         append_to_status "test error"
136                 else
137                         append_to_status "test ok"
138                         rm -f "$o"
139                 fi
140         fi
141         : Meta/Make clean >/dev/null 2>&1
142         echo "N $next $commit   $status" >>"$log"
143         echo "$status"
144 }
145
146 loop () {
147         Meta/Make clean >/dev/null 2>&1
148         git reset --hard -q
149         git checkout -q HEAD^0
150         next=$(git rev-parse --verify "refs/remotes/ko/next^0")
151
152         while :
153         do
154                 log_prune
155
156                 date
157
158                 l0=$(ls -l "$log")
159
160                 git for-each-ref --format='%(objectname)' 'refs/heads/*/*' |
161                 git rev-list --not ko/maint ko/master --not --stdin |
162                 while read commit
163                 do
164                         autotest "$commit" || echo "oops?"
165                 done
166
167                 l1=$(ls -l "$log")
168                 test "$l0" = "$l1" || continue
169
170                 git for-each-ref --format='%(objectname) %(refname)' \
171                                                 'refs/heads/*/*' |
172                 while read commit refname
173                 do
174                         nexttest "$commit" "$refname" || echo "oops?"
175                 done
176
177                 l1=$(ls -l "$log")
178                 test "$l0" = "$l1" || continue
179
180                 sleep 600 || exit
181         done
182 }
183
184 case "$#" in
185 0)
186         loop
187         exit ;;
188 esac
189
190 (
191         git rev-list --no-walk "$@" 2>/dev/null || git rev-list "$@"
192 ) |
193 while read commit
194 do
195         autotest "$commit"
196 done