dot/profile: Persuade `rsync' not to do silly things to arguments.
[profile] / bin / mdw-sbuild
index 84c24d8..9a9a9d0 100755 (executable)
 prog=${0##*/}
 
 fail () { echo >&2 "$prog: $*"; exit 1; }
-usage () { echo "usage: $prog [-ain] [-k KEYID] [-t TARGET] HOST"; }
+usage () { echo "usage: $prog [-ainT] [-k KEYID] [-p DIR] [-t TARGET] [-A DBPARGS] HOST"; }
 fail_usage () { usage >&2; exit 1; }
 
 ###--------------------------------------------------------------------------
 ### Parse options.
 
-bogusp=nil noactp=nil
-unset buildopts keyid
-while getopts "haik:nt:" opt; do
+bogusp=nil noactp=nil signp=nil
+unset buildopts pkgs dbpargs
+while getopts "haik:np:t:A:T" opt; do
   case $opt in
     h)
       usage
@@ -47,15 +47,24 @@ Options:
        -i              Build only architecture-neutral packages.
        -k KEYID        Sign the result using KEYID.
        -n              Don't actually do the build.
+       -p DIR          Upload additional packages from DIR.
        -t TARGET       Build in TARGET build environment.
+       -A ARGS         Pass ARGS to \`dpkg-buildpackage'.
+       -T              Don't run the tests.
 EOF
       exit 0
       ;;
     a) buildopts="${buildopts+$buildopts }-a" ;;
     i) buildopts="${buildopts+$buildopts }-i" ;;
-    k) keyid=$OPTARG ;;
+    k) signp=t keyid=$OPTARG ;;
     n) buildopts="${buildopts+$buildopts }-n" noactp=t ;;
+    p) pkgs=$OPTARG ;;
     t) buildopts="${buildopts+$buildopts }-t$OPTARG" ;;
+    A)
+      buildopts="${buildopts+$buildopts }-A$OPTARG"
+      dbpargs="${dbpargs+$dbpargs }$OPTARG"
+      ;;
+    T) buildopts="${buildopts+$buildopts }-T" ;;
     *) bogusp=t ;;
   esac
 done
@@ -65,6 +74,8 @@ case $# in
   *) bogusp=t ;;
 esac
 case $bogusp in t) fail_usage ;; esac
+case $noactp in t) signp=nil ;; esac
+case ${pkgs-/hack} in /*) ;; *) pkgs=$(pwd)/$pkgs ;; esac
 
 ###--------------------------------------------------------------------------
 ### Main program.
@@ -82,29 +93,32 @@ EOF
 case ${pkg+t} in t) ;; *) fail "can't figure out the package name" ;; esac
 case ${ver+t} in t) ;; *) fail "can't figure out the package version" ;; esac
 
-## Build a Debian source package.  If we're signing, use `dpkg-buildpackage'
-## for this so that we get an uploadable `_source.changes' file out the end
-## of it.
-case ${keyid+t},$noactp in
-  t,nil)
-    dpkg-buildpackage -S -k"$keyid"
-    cd ..
-    ;;
-  *)
-    dir=$(pwd); base=${dir##*/}
-    cd ..
-    dpkg-source -b "$base"
-    ;;
-esac
+## Build a Debian source package.  Don't sign anything yet.  That will happen
+## at the end, all in one go.
+dpkg-buildpackage -S -uc -us -d -i $dbpargs
+cd ..
 dsc=${pkg}_${ver}.dsc
 [ -f "$dsc" ] || fail "where is my \`.dsc' file?"
 
+## Actually do the build.  Get a build directory assigned by the server,
+## upload the sources, run the build, and collect the results.
 builddir=$(ssh "$host" mdw-sbuild-server dir "$pkg/$ver")
 dcmd rsync -a "$dsc" "$host:$builddir/"
+case ${pkgs+t} in t) rsync -a "$pkgs/" "$host:$builddir/pkgs/" ;; esac
 set +e; ssh "$host" mdw-sbuild-server $buildopts build "$builddir"
 rc=$?; set -e
 rsync -a "$host:$builddir/" ./
 case $rc in 0) ;; *) exit $rc ;; esac
-case $?,${keyid+t},$noactp in
-  0,t,nil) debsign -k"$keyid" "${pkg}_${ver}_"*.changes ;;
+
+## Merge the change files together, and maybe sign the result.
+chchch=${pkg}_${ver}_source.changes
+for i in "${pkg}_${ver}"_*.changes; do
+  case " $chchch " in *" $i "*) ;; *) chchch="$chchch $i" ;; esac
+done
+mergechanges -f $chchch
+rm $chchch
+case $signp in
+  t) debsign -k"$keyid" "${pkg}_${ver}_multi.changes" ;;
 esac
+
+###----- That's all, folks --------------------------------------------------