Index: /locker/update-system/bin/build-update
===================================================================
--- /locker/update-system/bin/build-update	(revision 496)
+++ /locker/update-system/bin/build-update	(revision 497)
@@ -1,3 +1,3 @@
-#!/usr/athena/bin/perl
+#!/usr/bin/env perl
 
 use File::Spec::Functions qw(:ALL);
@@ -6,4 +6,5 @@
 use Data::Dumper;
 use Getopt::Long;
+use Archive::Tar;
 use Cwd;
 use strict;
@@ -33,5 +34,5 @@
 
 (-d $proposaldir) or die "Can't find $proposaldir, did you run propose-update?\n";
-(-d $outdir || mkdir($outdir)) or die "mkdir($outdir) failed: $!";
+((! -e $outdir) && mkdir($outdir)) or die "mkdir($outdir) failed: $!";
 
 my $olddir = catdir($proposaldir,$old);
@@ -63,14 +64,25 @@
 close(DELETE);
 
-my $outfiledir = catdir($outdir, "newfiles");
-(-d $outfiledir || mkdir($outfiledir)) or die "Can't mkdir($outfiledir)\n";
+my $outfiletarball = catfile($outdir, "newfiles.tar.gz");
+my $cwd = getcwd();
 
-foreach my $file (@toadd, @toreplace) {
-  my $filename = $file->[1];
-  my $src = catfile($newdir, $filename);
-  my $dest = catfile($outfiledir, $filename);
-  my (undef, $dir, undef) = splitpath($dest);
-  mkpath($dir);
-  copy($src, $dest) or die "Couldn't copy $filename from $src to $dest: $!";
+chdir($newdir);
+my $tar = Archive::Tar->new;
+$tar->add_files(map { $_->[1] } @toadd, @toreplace);
+$tar->write($outfiletarball, 1);
+chdir($cwd) or die "Couldn't chdir back to $cwd: $!\n";
+
+if (0) {
+    my $outfiledir = catdir($outdir, "newfiles");
+    (-d $outfiledir || mkdir($outfiledir)) or die "Can't mkdir($outfiledir)\n";
+    
+    foreach my $file (@toadd, @toreplace) {
+	my $filename = $file->[1];
+	my $src = catfile($newdir, $filename);
+	my $dest = catfile($outfiledir, $filename);
+	my (undef, $dir, undef) = splitpath($dest);
+	mkpath($dir);
+	copy($src, $dest) or die "Couldn't copy $filename from $src to $dest: $!";
+    }
 }
 
@@ -78,5 +90,5 @@
 
 open (SCRIPT, ">", catfile($outdir, "update")) or die "Couldn't write update: $!";
-printf SCRIPT <<'EOF', $updatename, $new;
+printf SCRIPT <<'EOF', catfile("/mit/scripts/deploy/", $old), catfile("/mit/scripts/deploy/", $new);
 #!/bin/bash
 set -e -o noclobber
@@ -88,6 +100,20 @@
 >.scripts-security-upd-lock || die "error: Unable to obtain update lock."
 
+packages=$(tail -n 1 .scripts-version)
+
 echo "[$PWD] begin dry run"
 
+found=""
+newpackages=""
+for package in $packages; do
+    if [ "$package" = "%s" ]; then
+    found="yes"
+    newpackages="$newpackages%s "
+    else
+    newpackages="$newpackages$package "
+    fi
+done
+
+[ "$found" = "yes" ] || die "error: Correct version not found."
 xargs -n1 test ! -e <"$patchdir/oldfiles.absent" || die "error: Conflicting files exist."
 md5sum -c "$patchdir/check.md5" || die "error: MD5 check failed."
@@ -99,6 +125,6 @@
 patch -stN --no-backup-if-mismatch -p2 <"$patchdir/update.diff" || :
 xargs rm -f <"$patchdir/files.delete"
-cp -a "$patchdir/newfiles/." .
-(cat .scripts-version.old; date; echo "%s"; echo "%s") >>.scripts-version
+tar -xzf "$patchdir/newfiles.tar.gz"
+(cat .scripts-version.old; date "+%%F %%T %%z"; echo "$USER@$(hostname)"; echo "$patchdir"; echo "$newpackages") >>.scripts-version
 rm -f .scripts-version.old
 
Index: /locker/update-system/bin/propose-update
===================================================================
--- /locker/update-system/bin/propose-update	(revision 496)
+++ /locker/update-system/bin/propose-update	(revision 497)
@@ -46,5 +46,6 @@
   my $cwd = cwd();
   chdir($dir) or die $!;
-  `athrun scripts gtar zxf "/mit/scripts/deploy$scriptsdev/$package.tar.gz"`; $? && die "Failed to unpack $package.tar.gz: $?";
+  `athrun scripts gtar zxf "/mit/scripts/deploy$scriptsdev/$package/$package.tar.gz"`;
+  if ($?) { chdir($cwd); system("rmdir", "$dir"); die "Failed to unpack $package.tar.gz: $?"; }
   my @files=`athrun scripts gfind . -mindepth 1 -maxdepth 1 | grep -v .admin`;
   if (@files <= 1) {
@@ -67,5 +68,5 @@
   my @aonly, @bonly, @both;
   $a = $b = 0;
-  my $debug = 1;
+  my $debug = 0;
   local $Data::Dumper::Indent = 0;
   while ($a <= $#a || $b <= $#a) {
