| #!/bin/sh |
| |
| log=Meta/AT.log |
| >>"$log" |
| buildlog=Meta/AT.build-logs |
| mkdir -p "$buildlog" |
| t="/tmp/AT.$$" |
| |
| trap 'rm -f "$t.*"; exit' 0 1 2 3 15 |
| |
| _x40="[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]" |
| _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40" |
| |
| log_prune () { |
| cp "$log" "$log.bak" |
| |
| git for-each-ref --format='%(objectname)' 'refs/heads/*/*' | |
| git rev-list --not ko/maint --not --stdin | |
| while read commit |
| do |
| git rev-parse --verify "$commit^{tree}" |
| done | sort -u >"$t.tree0" |
| sed -ne "s/A \($_x40\) .*/\1/p" "$log" | sort -u >"$t.tree1" |
| comm -13 "$t.tree0" "$t.tree1" | sed -e 's|.*|/^A &/d|' >"$t.prune" |
| |
| next=$(git rev-parse --verify "refs/heads/next^0") |
| ko_next=$(git rev-parse --verify "refs/remotes/ko/next^0") |
| echo "/^N /{ |
| s/^N $next /&/ |
| t ok |
| s/^N $ko_next /&/ |
| t ok |
| d |
| : ok |
| }" >>"$t.prune" |
| |
| sed -f "$t.prune" "$log" >"$t.pruned" |
| cat "$t.pruned" >"$log" |
| } |
| |
| check_skip_test () { |
| GIT_SKIP_TESTS= |
| git diff --name-only ko/master "$1" >"$t.d" |
| if ! grep -q -e git-svn "$t.d" |
| then |
| GIT_SKIP_TESTS="$GIT_SKIP_TESTS t91??" |
| fi |
| if ! grep -q -e git-cvsexportcommit "$t.d" |
| then |
| GIT_SKIP_TESTS="$GIT_SKIP_TESTS t9200" |
| fi |
| if ! grep -q -e git-cvsimport "$t.d" |
| then |
| GIT_SKIP_TESTS="$GIT_SKIP_TESTS t9600" |
| fi |
| if test -n "$GIT_SKIP_TESTS" |
| then |
| export GIT_SKIP_TESTS |
| else |
| unset GIT_SKIP_TESTS |
| fi |
| } |
| |
| autotest () { |
| commit=$(git rev-parse --verify "$1^0") && |
| tree=$(git rev-parse --verify "$commit^{tree}") || return 1 |
| grep -s "^A $tree " "$log" >/dev/null && return 0 |
| o="$buildlog/$tree" |
| |
| git reset -q --hard HEAD^0 && |
| git checkout -q "$commit^0" || return 1 |
| |
| check_skip_test "$tree" |
| |
| PAGER= git show -s --pretty='format:* %h %s%n' "$commit" -- |
| if ! Meta/Make -pedantic >"$o" 2>&1 |
| then |
| status="build error" |
| elif ! Meta/Make -pedantic test >>"$o" 2>&1 |
| then |
| status="test error" |
| else |
| status=ok |
| rm -f "$o" |
| fi |
| : Meta/Make clean >/dev/null 2>&1 |
| echo "A $tree $status" >>"$log" |
| echo "$status" |
| } |
| |
| append_to_status () { |
| if test -z "$status" |
| then |
| status="$1" |
| else |
| status="$status; $1" |
| fi |
| } |
| |
| nexttest () { |
| mb=$(git merge-base "$commit" "$next") || return 1 |
| test "$mb" = "$commit" && return 0 |
| grep -s "^N $next $commit " "$log" >/dev/null && return 0 |
| |
| branch="${refname#refs/heads/}" |
| git reset -q --hard next^0 |
| |
| echo "* $branch" |
| |
| status= skip_build= |
| if ! git merge "$commit" >/dev/null 2>&1 |
| then |
| conflict_count=$(git ls-files -u | |
| sed -e 's/.* //' | |
| sort -u | |
| xargs grep -e '^<<<<<<< ' | |
| wc -l) |
| if test $conflict_count = 0 |
| then |
| append_to_status "rerere ok" |
| else |
| skip_build=t |
| append_to_status "conflict $conflict_count" |
| fi |
| fi |
| if test -z "$skip_build" |
| then |
| o="$buildlog/$commit" |
| check_skip_test "$commit" |
| if ! Meta/Make -pedantic >"$o" 2>&1 |
| then |
| append_to_status "build error" |
| elif ! Meta/Make -pedantic test >>"$o" 2>&1 |
| then |
| append_to_status "test error" |
| else |
| append_to_status "test ok" |
| rm -f "$o" |
| fi |
| fi |
| : Meta/Make clean >/dev/null 2>&1 |
| echo "N $next $commit $status" >>"$log" |
| echo "$status" |
| } |
| |
| loop () { |
| Meta/Make clean >/dev/null 2>&1 |
| git reset --hard -q |
| git checkout -q HEAD^0 |
| next=$(git rev-parse --verify "refs/remotes/ko/next^0") |
| |
| while : |
| do |
| log_prune |
| |
| date |
| |
| l0=$(ls -l "$log") |
| |
| git for-each-ref --format='%(objectname)' 'refs/heads/*/*' | |
| git rev-list --not ko/maint ko/master --not --stdin | |
| while read commit |
| do |
| autotest "$commit" || echo "oops?" |
| done |
| |
| l1=$(ls -l "$log") |
| test "$l0" = "$l1" || continue |
| |
| git for-each-ref --format='%(objectname) %(refname)' \ |
| 'refs/heads/*/*' | |
| while read commit refname |
| do |
| nexttest "$commit" "$refname" || echo "oops?" |
| done |
| |
| l1=$(ls -l "$log") |
| test "$l0" = "$l1" || continue |
| |
| sleep 600 || exit |
| done |
| } |
| |
| case "$#" in |
| 0) |
| loop |
| exit ;; |
| esac |
| |
| ( |
| git rev-list --no-walk "$@" 2>/dev/null || git rev-list "$@" |
| ) | |
| while read commit |
| do |
| autotest "$commit" |
| done |