source: locker/update-system/bin/build-update @ 710

Last change on this file since 710 was 710, checked in by acrefoot, 16 years ago
Fixed bug involving build-update. Generated update script would use /mit/scripts for version checking; now uses /afs/athena.mit.edu/contrib/scripts.
  • Property svn:executable set to *
File size: 4.8 KB
Line 
1#!/usr/bin/env perl
2
3use File::Spec::Functions qw(:ALL);
4use File::Copy;
5use File::Path;
6use Data::Dumper;
7use Getopt::Long;
8use Archive::Tar;
9use Cwd;
10use strict;
11use warnings;
12
13my $scriptsdev = "";
14my $force = 0;
15
16GetOptions(
17#"redo-delete" => \$redodelete,
18#          "redo-add" => \$redoadd,
19#          "redo-replace" => \$redoreplace,
20#          "redo-diff" => \$redodiff,
21#          "redo-all" => sub {$redodelete = $redoadd = $redoreplace = $redodiff = 1;},
22           "dev" => sub {$scriptsdev = "dev";},
23           "force" => \$force,
24                  );
25
26if (@ARGV < 3) {
27  print STDERR "Usage: $0 package oldversion newversion\n";
28  exit(1);
29}
30
31my ($package, $oldversion, $newversion) = @ARGV;
32my ($old, $new, $updatename) = ($package.'-'.$oldversion, $package.'-'.$newversion, $package.'-'.$oldversion.'-to-'.$newversion);
33
34my $proposaldir = $updatename.".proposal";
35my $outdir = catdir("/mit/scripts/deploy$scriptsdev/updates/", $updatename);
36
37(-d $proposaldir) or die "Can't find $proposaldir, did you run propose-update?\n";
38if (-e $outdir) {
39    if ($force) {
40        print STDERR "Clobbering $outdir.\n";
41        `rm -rf '$outdir'`;
42    } else {
43        die "Output directory $outdir exists; try --force.\n";
44    }
45}
46((! -e $outdir) && mkdir($outdir)) or die "mkdir($outdir) failed: $!";
47
48my $olddir = catdir($proposaldir,$old);
49my $newdir = catdir($proposaldir,$new);
50(-d $olddir && -d $newdir) or die "Packages not unpacked?\n";
51
52sub readFileList($) {
53  my ($list) = @_;
54  open(LIST, $list) or die "Can't read $list: $!\n";
55  my @files = map { chomp; s|$newdir\/?||g; [split(' ', $_, 2)] } <LIST>;
56  close(LIST);
57  return @files;
58}
59
60my @todelete = readFileList(catfile($proposaldir, "files.delete"));
61my @toadd = readFileList(catfile($proposaldir, "files.add"));
62my @toreplace = readFileList(catfile($proposaldir, "files.replace"));
63
64open(CHECKMD5, ">", catfile($outdir, "check.md5")) or die "Can't open check.md5: $!";
65print CHECKMD5 map { join("  ", @{$_})."\n" } @todelete, @toreplace;
66close(CHECKMD5);
67
68open(ABSENT, ">", catfile($outdir, "oldfiles.absent")) or die "Can't open oldfiles.absent: $!";
69print ABSENT map { $_->[1]."\n" } @toadd;
70close(ABSENT);
71
72open(DELETE, ">", catfile($outdir, "files.delete")) or die "Can't open files.delete: $!";
73print DELETE map { $_->[1]."\n" } @todelete, @toreplace;
74close(DELETE);
75
76my $outfiletarball = catfile($outdir, "newfiles.tar.gz");
77my $cwd = getcwd();
78
79chdir($newdir);
80my $tar = Archive::Tar->new;
81$tar->add_files(map { $_->[1] } @toadd, @toreplace);
82$tar->write($outfiletarball, 1);
83chdir($cwd) or die "Couldn't chdir back to $cwd: $!\n";
84
85if (0) {
86    my $outfiledir = catdir($outdir, "newfiles");
87    (-d $outfiledir || mkdir($outfiledir)) or die "Can't mkdir($outfiledir)\n";
88   
89    foreach my $file (@toadd, @toreplace) {
90        my $filename = $file->[1];
91        my $src = catfile($newdir, $filename);
92        my $dest = catfile($outfiledir, $filename);
93        my (undef, $dir, undef) = splitpath($dest);
94        mkpath($dir);
95        copy($src, $dest) or die "Couldn't copy $filename from $src to $dest: $!";
96    }
97}
98
99copy(catfile($proposaldir, "update.diff"), catfile($outdir, "update.diff")) or die "Couldn't copy update.diff: $!";
100
101if (-d catfile($proposaldir, "extra")) {
102  system('/bin/cp', '-pr', catfile($proposaldir, "extra"), catfile($outdir, "extra"))
103    and die "Couldn't copy extra: $!";
104}
105
106open (SCRIPT, ">", catfile($outdir, "update")) or die "Couldn't write update: $!";
107printf SCRIPT <<'EOF', catfile("/afs/athena.mit.edu/contrib/scripts/deploy/", $old), catfile("/afs/athena.mit.edu/contrib/scripts/deploy/", $new);
108#!/bin/bash
109set -e -o noclobber
110
111die () { echo "$1" >&2; rm .scripts-security-upd-lock; exit 1; }
112
113patchdir=$(dirname "$0")
114
115>.scripts-security-upd-lock || die "error: Unable to obtain update lock."
116
117packages=$(tail -1 .scripts-version)
118
119echo "[$PWD] begin dry run"
120
121found=""
122newpackages=""
123for package in $packages; do
124    if [ "$package" = "%s" ]; then
125    found="yes"
126    newpackages="$newpackages%s "
127    else
128    newpackages="$newpackages$package "
129    fi
130done
131
132[ "$found" = "yes" ] || die "error: Correct version not found."
133xargs -n1 test ! -e <"$patchdir/oldfiles.absent" || die "error: Conflicting files exist."
134[ -s "$patchdir/check.md5" ] && (md5sum -c "$patchdir/check.md5" || die "error: MD5 check failed.")
135patch -stN --dry-run --no-backup-if-mismatch -p2 <"$patchdir/update.diff" || die "error: Patch dry run failed."
136
137echo "[$PWD] dry run OK, applying update"
138
139mv .scripts-version .scripts-version.old
140patch -stN --no-backup-if-mismatch -p2 <"$patchdir/update.diff" || :
141xargs rm -f <"$patchdir/files.delete"
142tar -xzf "$patchdir/newfiles.tar.gz"
143[ -e "$patchdir/extra/postpatch.sh" ] && . "$patchdir/extra/postpatch.sh"
144(
145    cat .scripts-version.old
146    echo
147    date "+%%F %%T %%z"
148    echo "$USER@$(hostname)"
149    echo "$patchdir"
150    echo "$newpackages"
151) >.scripts-version
152rm -f .scripts-version.old
153
154rm -f .scripts-security-upd-lock
155
156echo "[$PWD] done"
157
158exit 0
159EOF
160chmod 0755, catfile($outdir, "update");
Note: See TracBrowser for help on using the repository browser.