chiark / gitweb /
* adt-testreport-onepackage: Handling of source packages'
[autopkgtest.git] / runner / adt-testreport-onepackage
index efb869e2d3aa1b7b389b6113790ed14026c386af..3908e7ce9013bb343be1917125456e57567a48b4 100755 (executable)
@@ -2,21 +2,20 @@
 
 set -e
 
-mirror=http://mirror.relativity.greenend.org.uk/mirror/ubuntu.good
-distro=feisty
-suite=main
 salt=''
 tmp=tmp
 var=var
-administrator_email=ian@davenant.greenend.org.uk
-maintainer_email_override="$administrator_email"
-salutation="Ian"
-from="$salutation Jackson <ian@davenant.greenend.org.uk>"
 rsync=rsync
 disable=true
+interactive=true
+target=source
+arch=`dpkg --print-architecture`
 
 for config in "$@"; do
-       . "$config"
+       case "$config" in
+       *=*)    eval "$config"  ;;
+       *)      . "$config"     ;;
+       esac
 done
 
 if $disable; then
@@ -24,14 +23,37 @@ if $disable; then
        exit 1
 fi
 
-destdirtail=autopkgtest-output/$distro
-destrsynchead=ijackson@chiark:public-html/
-desthttphead=http://www.chiark.greenend.org.uk/~ijackson/
+: ${destdirtail:=$distro-$target}
+: ${destdirfin:="$destdircommon$destdirtail"}
+
+case $target in
+source)
+       sources=Sources
+       descx=''
+       ;;
+binary-*)
+       sources=Packages
+       descx="${target#binary-}"
+       ;;
+*)
+       echo >&2 'target must be source or binary-*'
+       exit 1
+esac
+
+exec 3>&1
+printf >&3 "starting "
 
 rm -rf "$tmp"
 mkdir "$tmp"
 
-exec >"$tmp"/log 5>&1
+>"$tmp"/_log
+
+if $interactive; then
+       echo '(log diverted to stdout)' >>"$tmp"/_log
+else
+       exec >>"$tmp"/_log
+fi
+exec 4>&1
 
 progress () {
        echo "++++++ $1 ++++++"
@@ -39,18 +61,21 @@ progress () {
 
 gurl () {
        progress "fetching $1"
-       curl -sS "$1" >"$2"
+       curl -fsS "$1" >"$2"
 }
 
-gurl "$mirror/dists/$distro/$suite/source/Sources.gz" "$tmp"/sources.gz
-zcat "$tmp"/sources.gz >"$tmp"/sources-in
+gurl "$mirror/dists/$distro/$suite/$target/$sources.gz" "$tmp"/_$sources.gz
+zcat "$tmp"/_$sources.gz >"$tmp"/_$sources-in
+
+lastinfo="$var"/lastinfo-$target
 
 now=`date +%s`
->>"$var"/last-info
+>>"$lastinfo"
 
 progress selecting
 
-pkg="`perl -e '
+if [ "x$pkg" = x ]; then
+ pkg="`perl -e '
        use IO::Handle;
 
        $pre= "[-+.0-9a-z]+";
@@ -61,37 +86,58 @@ pkg="`perl -e '
 
        f1();
        while (<F>) {
-               die unless m/^($pre) ($vre) (\d+)$/;
+               die unless m/^($pre) ($vre) (\d+)( .*)?$/;
                $lastver{$1}= $2;
                $lasttime{$1}= $3;
+               $extras{$1}= $4." ";
        }
        f2();
        f1();
        $best_score= -1;
+       sub scorepackage () {
+               return if $skip;
+               return if $score < $best_score
+                    or ($score==$best_score and \
+                        $package gt $best_package);
+#printf STDERR " <----- best score=%s best_score=%s\n", $score, $best_score;
+               $best_score= $score;
+               $best_package= $package;
+       }
+       sub endpackage () {
+               return unless (defined $package
+                               or defined $version
+                               or defined $skip);
+               die unless defined $package;
+               die unless defined $version;
+               scorepackage();
+               undef $package;
+               undef $version;
+               undef $skip;
+       }
        while (<F>) {
                if (m/^Package: ($pre)$/) {
-                       die if length $package or length $version;
+                       die if defined $package;
                        $package= $1;
                } elsif (m/^Version: ($vre)$/) {
-                       die unless length $package;
-                       die if length $version;
+                       die if defined $version;
                        $version= $1;
                        $score= '$now' - $lasttime{$package};
-                       $score= 1e8 if $score>1e8;
+                       $score= 1e7 if $score>1e7;
                        $score *= 5 if $lastver{$package} ne $version;
-                       next if $score < $best_score
-                            or ($score==$best_score and \
-                                $package gt $best_package);
-                       $best_score= $score;
-                       $best_package= $package;
+                       $score *= 10 unless $extras{$package} =~ m/ nt /;
+#print STDERR "$package score $score\n";
+               } elsif (m/^Architecture:.*/ &&
+                        !m/\s(?:'$arch'|all|any)\s/) {
+#printf STDERR " <----- skip %s %s\n", $&, "'$arch'";
+                       $skip= 1;
                } elsif (m/^$/) {
-                       die if length $package and !length $version;
-                       $package= $version= "";
+                       endpackage();
                }
        }
        f2();
+       endpackage();
        die unless length $best_package;
-       open L, ">&5" or die $!;
+       open L, ">&4" or die $!;
        printf L "selected %s (age %s, score %d)\n",
                $best_package,
                exists($lastime{$best_package})
@@ -99,42 +145,60 @@ pkg="`perl -e '
                : "<never-yet>",
                $best_score;
        print "$best_package\n" or die $!;
-' "$var"/last-info "$tmp"/sources-in`"
+ ' "$lastinfo" "$tmp"/_$sources-in`"
+else
+       printf >&4 "package forced: %s\n" "$pkg"
+fi
 
 sed -n "/^Package: $pkg\$/,/^\$/p" \
- <"$tmp"/sources-in >"$tmp"/this-stanza
+ <"$tmp"/_$sources-in >"$tmp"/_this-stanza
 
 echo
-cat "$tmp"/this-stanza
+cat "$tmp"/_this-stanza
 
 getfield () {
        eval 'p'$1'="`
                sed -n '\''s/^'$1': //p'\'' \
-                <"$tmp"/this-stanza
+                <"$tmp"/_this-stanza
        `"'
 }
 
-getfield Directory
-getfield Version
-
-leafnames="`
-       sed -n '/^Files:/,/^([^ ].*)?$/{ /^ /{
-               s/^ [0-9a-z][0-9a-z]*  *[0-9][0-9]* //; p
-               }}' \
-        <"$tmp"/this-stanza
-`"
+printf >&3 "selected \"%s\" " $pkg
 
 tp="$tmp/$pkg"
 mkdir "$tp" "$tp/src" "$tp/tmp" "$tp/out"
 
-for leafname in $leafnames; do
-       df="$tp/src/$leafname"
-       case "$leafname" in
-       */*|.*) echo >&2 "bad leafname: $leafname"; exit 1;;
-       *.dsc) dsc="$df";;
-       esac
-       gurl "$mirror/pool/$suite/$pDirectory/$leafname" "$df"
-done
+getfield Version
+
+if test $target = source; then
+       getfield Directory
+       leafnames="`
+               sed -n '/^Files:/,/^([^ ].*)?$/{ /^ /{
+                       s/^ [0-9a-z][0-9a-z]*  *[0-9][0-9]* //; p
+                       }}' \
+                <"$tmp"/_this-stanza
+       `"
+       for leafname in $leafnames; do
+               df="$tp/src/$leafname"
+               case "$leafname" in
+               */*|.*) echo >&2 "bad leafname: $leafname"; exit 1;;
+               *.dsc) fot="$df";;
+               esac
+               gurl "$mirror/$pDirectory/$leafname" "$df"
+       done
+       testmode=--source
+       testmode2=''
+       desc="$pkg"
+       : ${upload_if_ok:=true}
+else
+       getfield Filename
+       fot="$tp/src/$pkg.deb"
+       gurl "$mirror/$pFilename" "$fot"
+       testmode='--binaries=install --binary'
+       testmode2=--instantiate
+       desc="$pkg $descx"
+       : ${upload_if_ok:=false}
+fi
 
 if [ "x$maintainer_email_override" = x ]; then
        getfield Maintainer
@@ -143,6 +207,8 @@ else
        maintainer_email=maintainer_email_override
 fi
 
+printf >&3 "adt-run "
+
 progress "starting test"
 
 xrc () {
@@ -153,66 +219,95 @@ xrc () {
        set -e
 }
 
+echo 'fatal: adt-run did not start properly' >"$tmp"/_summary
+
 xrc adt-run --tmp-dir "$tp"/tmp                                \
        --output-dir "$tp"/out                          \
        --log-file "$tp"/log                            \
-       --source "$dsc"                                 \
+       --summary "$tmp"/_summary                       \
+       $adtrun_extra_opts                              \
+       $testmode "$fot" $testmode2                     \
  ---                                                   \
  adt-virt-xenlvm                                       \
-       distro="$distro"                                \
- 2>&1
+       $adtvirt_extra_opts                             \
+       --distro="$distro"                              \
+ --                                                    \
+ 2>&1 3>&- 4>&-
+
+printf >&3 "%s " $rc
+
+ourx=0
+upload=true
+: ${upload_if_notests:=false}
+extras=''
 
 case "$rc" in
-0)     summary='all OK';                       email=''                ;;
-2)     summary='OK (some skipped)';            email=''                ;;
-8)     summary='package declares no tests';    email=''                ;;
+0)     summary='all OK';                       email=''
+                                       upload=$upload_if_ok            ;;
+2)     summary='OK (some skipped)';            email=''
+                                       upload=$upload_if_ok            ;;
+8)     summary='package declares no tests';    email=''
+                               upload=$upload_if_notests; extras='nt'  ;;
 4|6)   summary='test(s) failed!';      email="$maintainer_email"       ;;
 12)    summary='erroneous package!';   email="$maintainer_email"       ;;
 16)    summary='testbed failed!';      email="administrator_email"     ;;
-*)     summary='unexpected failure!';  email="administrator_email"     ;;
+*)     summary='unexpected failure!';  email="administrator_email"; ourx=20;;
 esac
 
 progress "RESULTS $summary"
-progress "contacting $email"
-
-for odir in tmp out; do
-       if test -d "$tp"/$odir; then
-               GZIP=-2 tar -f "$tp"/$odir.tar.gz -C "$tp" -zc $odir
-               rm -r "$tp"/$odir
-       fi
-done
 
-$rsync -rltH --safe-links --delete "$tp" "$destrsynchead/$destdirtail/"
+if $upload; then
+       progress "bundling"
+       printf "\n%s\n" "$summary" >>"$tmp"/_summary
+       ln -f "$tmp"/_summary "$tp"/summary
+
+       for odir in tmp out; do
+               if test -d "$tp"/$odir; then
+                       GZIP=-2 tar -f "$tp"/$odir.tar.gz -C "$tp" -zc $odir
+                       rm -r "$tp"/$odir
+               fi
+       done
+
+       progress "uploading"
+       printf >&3 "uploading"
+       $rsync -rltH --safe-links --delete "$tp" "$destrsynchead/$destdirfin/"
+       printf >&3 " "
+fi
 
 if [ "x$email" != x ]; then
+       progress "contacting $email"
        eval "email_addr=\$$email"
-       cat >"$tmp"/email <<END
+       printf >&3 "email \"%s\" " "$email_addr"
+       cat >"$tmp"/_email <<END
 From: $from
 To: $email_addr
-Subject: autopkgtest $distro $pkg: $summary
+Subject: autopkgtest $distro $desc: $summary
 
- Test executed for:  $distro  $pkg
+ Test executed for:  $distro  $target  $pkg
  Outcome: $summary
+END
+       sed -e 's/^/  /' "$tmp"/_summary >>"$tmp"/_email
+       cat >>"$tmp"/_email <<END
 
 This message is automatically generated by the autopkgtest package
 testing system.  You are receiving it because:
 END
        case "$email" in
                pMaintainer)
-                       cat >>"$tmp"/email <<END
+                       cat >>"$tmp"/_email <<END
  You are listed in the Maintainer field of the $pkg package in $distro
   and the test results appear to indicate a problem with the package.
 END
                        ;;
                maintainer_email_override)
-                       cat >>"$tmp"/email <<END
+                       cat >>"$tmp"/_email <<END
  The test results appear to indicate a problem with the package
   and reports for package maintainers for $distro are being directed to
   $maintainer_email_override
 END
                        ;;
                administrator_email)
-                       cat >>"$tmp"/email <<END
+                       cat >>"$tmp"/_email <<END
  You are the administrator for the autopkgtest installation.
 END
                        ;;
@@ -221,13 +316,13 @@ END
                        exit 1
                        ;;
        esac
-       cat >>"$tmp/email" <<END
+       cat >>"$tmp/_email" <<END
 
 The test log, which is intended to be sufficient to diagnose most
 failures, can be found below.  However, in case this is not
 sufficient, another copy can be found along with output files, saved
 temporary files, and so on, at:
- $desthttphead/$destdirtail/
+ $desthttphead/$destdirfin/
 
 If you have any questions about this service please contact me at:
  $from
@@ -237,15 +332,33 @@ $salutation
 
 -8<-
 END
-       cat >>"$tmp"/email 2>&1 "$tmp"/log ||:
-       sendmail -odq -oem -t -oi <"$tmp"/email
 fi
 
-printf >>"$var"/log "package=%s rc=%s emailed='%s'\n" \
-       "$pkg" $rc "$email_addr"
+printf >>"$var"/log "%s=%s rc=%s emailed='%s'\n" \
+       "$target" "$pkg" $rc "$email_addr"
+
+if [ "x$ourx" = x0 ]; then
+       sed -e "/^$pkg /d" <"$lastinfo" >"$lastinfo".new
+       printf "%s %s %s %s\n" "$pkg" "$pVersion" "$now" "$extras" \
+               >>"$lastinfo".new
+       mv "$lastinfo".new "$lastinfo"
+       progress "tested."
+else
+       progress "fault ($ourx)."
+fi
 
-sed -e "/^$pkg /d" <"$var"/last-info >"$var"/last-info.new
-printf "%s %s %s\n" "$pkg" "$pVersion" "$now" >>"$var"/last-info.new
-mv "$var"/last-info.new "$var"/last-info
+if [ "x$email" = x ]; then
+       if $interactive; then
+               cat "$tmp"/_log >&2
+       fi
+else
+       cat >>"$tmp"/_email 2>&1 "$tmp"/_log ||:
+       if $interactive; then
+               cat "$tmp"/_email >&2
+       else
+               sendmail -odi -oem -t -oi <"$tmp"/_email
+       fi
+fi
 
-progress "done."
+printf >&3 "done %s.\n" $ourx
+exit $ourx