#!/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;
"do_test" => 1,
"do_patch" => 1,
"diff_against" => "",
- "do_upload" => 1
+ "do_upload" => 1,
+ "do_git_tag" => 0,
+ "force_git_tag" => 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}
+FOE
+ sub state($) {
+ return "(default: " . ($_ ? "on" : "off") . ")";
+ }
+ $usage =~ s[{(\w+)}][state($s->{$1})]ge;
+ die $usage;
+}
+
sub ParseOptions($) {
my ($s) = @_;
+ $s->{"do_git_tag"} = 1 if (-d ".git");
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"},
+ ) || $s->Usage;
}
sub Test($) {
}
}
+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 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"};
}