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
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"; |
|
|
|
|