You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

105 lines
3.3 KiB

#!/usr/opkg/bin/perl
# official upload parameters
my $upload_url = "openpkg-upload\@download.openpkg.org:/";
my $upload_mode = "rsync";
# list of positional arguments
my @spec = (
"openpkg-prefix",
"spec-dir",
"source-dir",
"binary-rpm-file",
"source-rpm-file",
"package-name",
"package-version",
"package-release",
"package-version-old",
"package-release-old",
"commit-message",
"vcs",
"option-force"
);
# convert positional arguments back into names
my $info = {};
for (my $i = 0; $i < @ARGV; $i++) {
$info->{$spec[$i]} = $ARGV[$i];
#printf(STDOUT "%s=\"%s\"\n", $spec[$i], $ARGV[$i]);
}
# sanity check situation
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time());
my $today = sprintf("%04d%02d%02d", $year+1900, $mon+1, $mday);
if ($info->{"package-release"} ne $today) {
print STDERR "openpkg-dev-release: ERROR: package release not matching current date\n";
exit(1);
}
if ($info->{"package-name"} eq "") {
print STDERR "openpkg-dev-release: ERROR: package name not set\n";
exit(1);
}
# commit changeset to Monotone repository
my $stat = `git stat . 2>/dev/null`;
if ($stat !~ m/nothing\s+to\s+commit,\s+working\s+tree\s+clean/s) {
print STDOUT "\033[31m++ committing changeset to OpenPKG VCS repository\033[0m\n";
if ($info->{"vcs"} ne "git") {
print STDERR "openpkg-dev-release: ERROR: Ops, not Git VCS?!\n";
exit(1);
}
if (! -f $info->{"spec-dir"} . "/" . $info->{"package-name"} . ".spec") {
print STDERR "openpkg-dev-release: ERROR: package specification not known\n";
exit(1);
}
print STDOUT "-- local: " . $info->{"spec-dir"} . "\n";
my $cmd = "cd " . $info->{"spec-dir"} . " && ";
$info->{"commit-message"} =~ s/'/\\'/sg;
$cmd .= "git commit -m '" . $info->{"commit-message"} . "' .";
print STDOUT "\$ $cmd\n";
my $rc;
for (my $i = 0; $i < 10; $i++) {
$rc = system($cmd);
last if ($rc == 0);
print STDERR "openpkg-dev-release: WARNING: failed to commit to VCS repository (retrying in 2 seconds)\n";
sleep(2);
}
if ($info->{"option-force"} eq "no") {
if ($rc != 0) {
print STDERR "openpkg-dev-release: ERROR: failed to commit to VCS repository\n";
exit(1);
}
}
}
# upload file to download.openpkg.org
print STDOUT "\033[31m++ uploading source RPM package to OpenPKG download repository\033[0m\n";
print STDOUT "-- local: " . $info->{"source-rpm-file"} . "\n";
print STDOUT "-- remote: " . $upload_url . "\n";
my $cmd;
if ($upload_mode eq "rsync") {
$cmd = "rsync --rsh=\"ssh -o 'Compression no'\" --partial --progress";
$cmd .= " " . $info->{"source-rpm-file"};
$cmd .= " " . $upload_url;
}
elsif ($upload_mode eq "scp") {
$cmd = "scp -o 'Compression no'";
$cmd .= " " . $info->{"source-rpm-file"};
$cmd .= " " . $upload_url;
}
print STDOUT "\$ $cmd\n";
system($cmd);
# schedule VCS synchronization
if (`uname -s` =~ m/^FreeBSD\n?$/s) {
my $jobs = `at -qZ -l 2>/dev/null`;
$jobs =~ s/^[^\n]+\n//s;
foreach my $job ($jobs =~ m/\s+(\d+)[^ \t]*$/mg) {
system("at -r $job >/dev/null 2>&1 || true");
}
system("echo 'git push --quiet >/dev/null 2>&1' | at -qZ '+ 15 minutes'");
}
# final hint
print STDOUT "\033[32m++ PACKAGE RELEASED\033[0m\n";