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

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