#!/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";