#!/usr/bin/perl
# A simple system for making software releases
-# (c) 2003--2006 Martin Mares <mj@ucw.cz>
+# (c) 2003--2010 Martin Mares <mj@ucw.cz>
package UCW::Release;
use strict;
# p=preprocess, s=subst, -=discard
'(^|/)(CVS|\.arch-ids|{arch}|\.git|tmp)/' => '-',
'\.(lsm|spec)$' => 'ps',
- '(^|/)README$' => 's'
+ '(^|/)README$' => 's',
+ '\.swp$' => '-',
],
"directories" => [
],
"archivedir" => "/home/mj/tmp/archives/$basename",
"uploads" => [
],
+ "notifiers" => [
+ ],
+ "test_cmd" => "make",
# Options
"do_test" => 1,
"do_patch" => 1,
"diff_against" => "",
- "do_upload" => 1
+ "do_upload" => 1,
+ "do_git_tag" => 0,
+ "force_git_tag" => 0,
+ "do_notify" => 0,
};
bless $s;
return $s;
push @{$s->{"distfiles"}}, $df;
}
+sub Usage($) {
+ my ($s) = @_;
+ my $usage = <<FOE ;
+Usage: $0 <options>
+
+Options:
+--[no]verbose Be chatty about the inner workings of the release system {verbose}
+--[no]test Test the package before uploading {do_test}
+--[no]patch Make a patch against the previous version {do_patch}
+--diff-against=<ver> Set which version we create the patch against
+--[no]upload Upload released files {do_upload}
+--[no]git-tag Tag the Git repository with "v<version>" {do_git_tag}
+--force-git-tag Rewrite the Git tag if it already exists {force_git_tag}
+--[no]notify Call scripts to notify the world about the release {do_notify}
+FOE
+ sub state($) {
+ return "(default: " . ($_[0] ? "on" : "off") . ")";
+ }
+ $usage =~ s[{(\w+)}][state($s->{$1})]ge;
+ die $usage;
+}
+
sub ParseOptions($) {
my ($s) = @_;
+ $s->{"do_git_tag"} = 1 if (-d ".git");
+ $s->{"do_notify"} = 1 if @{$s->{"notifiers"}};
GetOptions(
"verbose!" => \$verbose,
"test!" => \$s->{"do_test"},
"patch!" => \$s->{"do_patch"},
"diff-against=s" => \$s->{"diff_against"},
- "upload!" => \$s->{"do_upload"}
- ) || die "Syntax: release [--verbose] [--test] [--nopatch] [--diff-against=<version>] [--noupload]";
+ "upload!" => \$s->{"do_upload"},
+ 'git-tag!' => \$s->{"do_git_tag"},
+ 'force-git-tag!' => \$s->{"force_git_tag"},
+ 'notify!' => \$s->{"do_notify"},
+ ) || $s->Usage;
}
sub Test($) {
my $dd = $s->{"DISTDIR"};
my $pkg = $s->{"PKG"};
my $log = "$dd/$pkg.log";
+ my $test_cmd = $s->{"test_cmd"};
print "Doing a test compilation\n";
- `( cd $dd/$pkg && make ) >$log 2>&1`;
+ `( cd $dd/$pkg && $test_cmd ) >$log 2>&1`;
die "There were errors. Please inspect $log" if $?;
`grep -q [Ww]arning $log`;
$? or print "There were warnings! Please inspect $log.\n";
}
}
+sub GitTag($) {
+ my ($s) = @_;
+ my $tag = 'v' . $s->{'VERSION'};
+ my $force = ($s->{'force_git_tag'} ? '--force' : '');
+ print "Tagging Git repository with $tag\n";
+ `git tag $tag $force`; die if $?;
+ print "Pushing the tags upstream\n";
+ `git push --tags`; die if $?;
+}
+
+sub AddUcwNotifier($) {
+ my ($r) = @_;
+ push @{$r->{"notifiers"}}, sub {
+ my ($s) = @_;
+ print "Updating web pages\n";
+ my $pkg = $s->{'PACKAGE'};
+ my $ver = $s->{'VERSION'};
+ `ssh jw 'cd web && bin/release-prog $pkg $ver'`; die if $?;
+ };
+};
+
sub Dispatch($) {
my ($s) = @_;
$s->Test if $s->{"do_test"};
$s->MakePatch if $s->{"do_patch"};
+ $s->GitTag if $s->{"do_git_tag"};
$s->Upload if $s->{"do_upload"};
+ if ($s->{"do_notify"}) {
+ for my $f (@{$s->{"notifiers"}}) {
+ &$f($s);
+ }
+ }
}
1;