You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
2.6 KiB
129 lines
2.6 KiB
#!/bin/sh |
|
|
|
: ${RANGE:=origin/master..origin/seen} ${J:=j32} ${OKNG:="(OK|NG)"} |
|
|
|
test_it () { |
|
type=$1 commit=$2 subject=$3 |
|
log=".Cycle/log.$commit" |
|
rm -f "$log" |
|
git ls-files -x Meta -x .Cycle -o -z | xargs -r -0 rm -rf |
|
|
|
( |
|
echo "*** log for $subject ***" && |
|
case "$type" in |
|
C) |
|
# Single parent commit on a topic |
|
Meta/Make -$J && |
|
Meta/Make -$J -- SPARSE_FLAGS=-Wsparse-error sparse |
|
;; |
|
M) |
|
# Merges on the first-parent chain on seen |
|
Meta/Make -$J -- SPARSE_FLAGS=-Wsparse-error sparse && |
|
Meta/Make -$J -- test |
|
;; |
|
T) |
|
# Commit at the tip of a topic |
|
Meta/Make -$J SANITIZE=address,undefined -- test && |
|
Meta/Make -$J -- doc |
|
;; |
|
esac |
|
|
|
status=$? |
|
|
|
# Does 'distclean' clean them up properly? |
|
Meta/Make -- $D distclean >/dev/null |
|
case $(git ls-files -x Meta -x .Cycle -o | wc -l) in |
|
0) exit "$status" ;; |
|
*) git ls-files -x Meta -x .Cycle -o |
|
exit 1 ;; |
|
esac |
|
) >"$log" 2>&1 |
|
case $? in |
|
0) rm -f "$log" ;; |
|
*) return 1 ;; |
|
esac |
|
} |
|
|
|
tested () { |
|
# sign=$1 commit=$2 |
|
egrep "^$OKNG $1($2|$(git rev-parse "$2^{tree}"))" .Cycle/log >/dev/null |
|
} |
|
|
|
test_them () { |
|
while read merge parent sides |
|
do |
|
case "$parent" in |
|
?*) |
|
tested M $merge && continue |
|
echo "TEST M $merge" |
|
|
|
for tip in $sides |
|
do |
|
git rev-parse --verify --quiet "$tip" || continue |
|
tested T $tip && continue |
|
echo "TEST $tip $merge" |
|
done |
|
;; |
|
'') |
|
commit=$merge |
|
git rev-parse --verify --quiet "$commit" || continue |
|
tested C $commit && continue |
|
echo "TEST C $commit" |
|
esac |
|
done | |
|
sed -n -e 's/^TEST //p' >.Cycle/plan |
|
|
|
count=$(wc -l <.Cycle/plan) |
|
case $count in 0) return ;; esac |
|
|
|
total=$count |
|
echo TEST $count ON $(date) >>.Cycle/log |
|
while read tip merge |
|
do |
|
case "$tip" in |
|
M) |
|
type=M |
|
commit=$merge |
|
subject=$(git show -s --format="%s" "$commit") ;; |
|
C) |
|
type=C |
|
commit=$merge |
|
subject=$(git show -s --format="%s" "$commit") ;; |
|
*) |
|
type=T |
|
commit=$tip |
|
subject=$( |
|
git show -s --format="%s" "$merge" | |
|
sed -e 's/^Merge branch '\''\(.*\)'\'' into .*/\1/' |
|
) ;; |
|
esac |
|
|
|
echo >&2 -n "$count/$total ?? $subject |
|
" |
|
if test_it $type $commit "$subject" |
|
then |
|
OK=OK |
|
else |
|
OK=NG |
|
fi |
|
echo "$OK $type$commit $count" >>.Cycle/log |
|
echo "$OK $type$(git rev-parse $commit^{tree}) $count" >>.Cycle/log |
|
echo >&2 "$count/$total $OK $subject" |
|
count=$(( $count - 1 )) |
|
done <.Cycle/plan |
|
} |
|
|
|
: >>.Cycle/log |
|
git reflog expire --expire=now --expire-unreachable=now --all |
|
git gc |
|
|
|
for l in .Cycle/log.[0-9a-f]* |
|
do |
|
x=${l##*.} |
|
git rev-parse --verify "$x" >/dev/null 2>&1 || rm -f "$l" |
|
done |
|
|
|
git fetch |
|
( |
|
git rev-list --no-merges $RANGE |
|
git rev-list --first-parent --parents $RANGE
) | test_them
|
|
|