Author: af
Date: Wed Feb 12 12:00:11 2014
New Revision: 1567607
URL: http://svn.apache.org/r1567607
Log:
124142: Cleanup of data format and implementation.
Modified:
openoffice/trunk/main/solenv/bin/build_release.pl
Modified: openoffice/trunk/main/solenv/bin/build_release.pl
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/solenv/bin/build_release.pl?rev=1567607&r1=1567606&r2=1567607&view=diff
==============================================================================
--- openoffice/trunk/main/solenv/bin/build_release.pl (original)
+++ openoffice/trunk/main/solenv/bin/build_release.pl Wed Feb 12 12:00:11 2014
@@ -21,6 +21,7 @@
#**************************************************************
use strict;
+use warnings;
use XML::LibXML;
use open OUT => ":utf8";
use LWP::Simple;
@@ -219,7 +220,39 @@ my %EnUSBasedLanguages = (
);
-sub GetInstallationPackageName ($$$$$);
+sub ProcessCommandline (@);
+sub PrintUsageAndExit ();
+sub Trim ($);
+sub ReadReleaseDescription ($$);
+sub ProcessBuildDescription ($$$);
+sub ProcessPlatformDescription ($$);
+sub ProcessDownloadDescription ($$);
+sub ProcessPackageDescription ($$);
+sub ProcessWikiPackageDescription ($$$);
+sub ProcessLanguageDescription ($$);
+sub PostprocessLanguageList ($$);
+sub PostprocessPlatformList ($$);
+sub CheckLanguageSet ($@);
+sub WriteMakefile ($$);
+sub Upload ($$);
+sub PrepareUploadArea ($@);
+sub UploadFilesViaRsync ($$@);
+sub CollectDownloadSets ($);
+sub ProvideChecksums ($@);
+sub IsOlderThan ($$);
+sub GetInstallationPackageName ($$$$);
+sub ResolveTemplate ($$$$$);
+sub GetCurrentPlatformDescriptor ($);
+sub Wiki ($$);
+sub GetTableList ($);
+sub GetPackagesForTable ($$);
+sub GetLanguagesForTable ($@);
+sub GetPlatformsForTable ($@);
+sub WriteDownloadLinks ($$$$$$$);
+sub FindDownload ($$$$$);
+sub CreateLink ($$$);
+sub CheckLink ($);
+sub SignFile ($$);
sub ProcessCommandline (@)
{
@@ -286,11 +319,11 @@ sub ProcessCommandline (@)
elsif ( ! defined $command)
{
$command = $argument;
- if ($command eq "build-missing")
- {
- $command = "build";
- $build_only_missing = 1;
- }
+ if ($command eq "build-missing")
+ {
+ $command = "build";
+ $build_only_missing = 1;
+ }
elsif ($command !~ /^(build|build-missing|upload|wiki)$/)
{
printf STDERR "unknown command '%s'\n", $command;
@@ -312,7 +345,12 @@ sub ProcessCommandline (@)
{
$error = 1;
}
- if ($command =~ /^(wiki)$/)
+ if (! defined $command)
+ {
+ printf STDERR "ERROR: no command\n";
+ $error = 1;
+ }
+ elsif ($command =~ /^(wiki)$/)
{
if ( ! defined $output_filename)
{
@@ -398,6 +436,7 @@ sub ReadReleaseDescription ($$)
my $release = {
'name' => $root->getAttribute("name"),
'version' => $root->getAttribute("version"),
+ 'previous-version' => $root->getAttribute("previous-version"),
'builds' => [],
'languages' => {},
'language-ids' => [],
@@ -434,6 +473,15 @@ sub ReadReleaseDescription ($$)
}
printf "%d packages\n", scalar keys %{$release->{'packages'}};
+ # Platform specific the package descriptions.
+ for my $package_element ($root->getChildrenByTagName("platform-package"))
+ {
+ my $package_descriptor =
ProcessPlatformPackageDescription($package_element, $context);
+ my $key = $package_descriptor->{'platform-id'} . "/" .
$package_descriptor->{'package-id'};
+ $release->{'platform-packages'}->{$key} = $package_descriptor;
+ }
+ printf "%d platform packages\n", scalar keys
%{$release->{'platform-packages'}};
+
# Process the download descriptions.
for my $download_element ($root->getChildrenByTagName("download"))
{
@@ -547,9 +595,12 @@ sub ProcessPlatformDescription ($$)
# Optional tags.
foreach my $id ("extension", "add-package-type-to-archive-name")
{
- $descriptor->{$id} = $element->getAttribute($id);
+ my $value = $element->getAttribute($id);
+ $descriptor->{$id} = $value if defined $value;
}
+ $descriptor->{'add-package-type-to-archive-name'} = 0
+ unless defined $descriptor->{'add-package-type-to-archive-name'};
$descriptor->{'package-types'} = [split(/;/,
$descriptor->{'package-types'})];
return $descriptor;
@@ -591,14 +642,14 @@ sub ProcessDownloadDescription ($$)
The corresponding package descriptor is returned as a hash.
=cut
-sub ProcessPackageDescription ($$$)
+sub ProcessPackageDescription ($$)
{
- my ($element, $context, $release_descriptor) = @_;
+ my ($element, $context) = @_;
my $descriptor = {};
# Mandatory tags.
- foreach my $id ("id", "target", "archive-name", "display-name")
+ foreach my $id ("id", "target", "archive-path", "archive-name",
"display-name")
{
$descriptor->{$id} = $element->getAttribute($id);
die "release/package has no attribute $id" unless defined
$descriptor->{$id};
@@ -607,7 +658,45 @@ sub ProcessPackageDescription ($$$)
# Optional tags.
foreach my $id ("link-tooltip", "link-URL", "download-extension")
{
+ my $value = $element->getAttribute($id);
+ $descriptor->{$id} = $value if defined $value;
+ }
+
+ return $descriptor;
+}
+
+
+
+
+=head2 ProcessPlatformPackageDescription ($element, $context)
+
+ Process one <platform-package> element.
+
+ The corresponding package descriptor is returned as a hash.
+
+=cut
+sub ProcessPlatformPackageDescription ($$)
+{
+ my ($element, $context) = @_;
+
+ my $descriptor = {};
+
+ # Mandatory tags.
+ foreach my $id ("platform-id", "package-id")
+ {
$descriptor->{$id} = $element->getAttribute($id);
+ die "release/package has no attribute $id" unless defined
$descriptor->{$id};
+ die "release/package attribute $id is empty" unless $descriptor->{$id}
!~ /^\s*$/;
+ }
+ # Optional tags.
+ foreach my $id ("extension", "package-types")
+ {
+ my $value = $element->getAttribute($id);
+ $descriptor->{$id} = $value if defined $value;
+ }
+ if (defined $descriptor->{'package-types'})
+ {
+ $descriptor->{'package-types'} = [split(/;/,
$descriptor->{'package-types'})];
}
return $descriptor;
@@ -784,7 +873,7 @@ sub CheckLanguageSet ($@)
-=head2 WriteMakefile ($release_description, $context)
+=head2 WriteMakefile ($release_descriptor, $context)
Write a makefile with all targets that match the <build> elements.
@@ -799,7 +888,7 @@ sub CheckLanguageSet ($@)
=cut
sub WriteMakefile ($$)
{
- my ($release_description, $context) = @_;
+ my ($release_descriptor, $context) = @_;
my $filename = $context->{'output-filename'};
if ( ! defined $filename)
@@ -809,13 +898,18 @@ sub WriteMakefile ($$)
# Collect the targets to make.
my @targets = ();
- foreach my $build (@{$release_description->{'builds'}})
+ foreach my $build (@{$release_descriptor->{'builds'}})
{
- my $platform_descriptor =
GetCurrentPlatformDescriptor($release_description);
- my $package_descriptor =
$release_description->{'packages'}->{$build->{'package-id'}};
+ my $platform_descriptor =
GetCurrentPlatformDescriptor($release_descriptor);
+ my $package_descriptor =
$release_descriptor->{'packages'}->{$build->{'package-id'}};
+ my $platform_package_descriptor = GetPlatformPackage(
+ $release_descriptor,
+ $platform_descriptor,
+ $package_descriptor);
+
foreach my $language_id (@{$build->{'language-list'}})
{
- foreach my $package_format
(@{$platform_descriptor->{'package-types'}})
+ foreach my $package_format
(@{$platform_package_descriptor->{'package-types'}})
{
my $full_target = sprintf("%s_%s.%s",
$package_descriptor->{'target'},
@@ -823,22 +917,21 @@ sub WriteMakefile ($$)
$package_format);
if ($context->{'build-only-missing'})
{
- my $source_path = GetInstallationPackagePath(
- $platform_descriptor,
- $package_format,
- $language_id);
- my $archive_name = GetInstallationPackageName(
- $release_description,
- $package_descriptor,
+ my ($archive_path, $archive_name) =
GetInstallationPackageName(
+ $release_descriptor,
+ $platform_package_descriptor,
$package_format,
- $platform_descriptor,
$language_id);
- my $candidate = $source_path . "/" . $archive_name;
+ my $candidate = $archive_path . "/" . $archive_name;
if (-f $candidate)
{
printf "download set for %s already exists,
skipping\n", $full_target;
next;
}
+ else
+ {
+ printf "%s %s\n", $archive_path, $archive_name;
+ }
}
push @targets, $full_target;
}
@@ -892,7 +985,7 @@ sub WriteMakefile ($$)
sub Upload ($$)
{
- my ($release_description, $context) = @_;
+ my ($release_descriptor, $context) = @_;
if ( ! defined $context->{'upload-destination'})
{
@@ -900,7 +993,7 @@ sub Upload ($$)
PrintUsageAndExit();
}
- my @download_sets = CollectDownloadSets($release_description);
+ my @download_sets = CollectDownloadSets($release_descriptor);
ProvideChecksums($context, @download_sets);
my $source_path = PrepareUploadArea($context, @download_sets);
@@ -935,12 +1028,15 @@ sub PrepareUploadArea ($@)
foreach my $extension ("", ".md5", ".sha256", ".asc")
{
my $basename = sprintf("%s%s", $download_set->{'archive-name'},
$extension);
- my $source = sprintf("%s/%s", $download_set->{'source-path'},
$basename);
- my $target_path = sprintf("%s/%s/%s", $tmpdir,
$download_set->{'destination-path'});
+ my $source_path = $download_set->{'source-path'};
+ my $source = sprintf("%s/%s", $source_path, $basename);
+ my $target_path = sprintf("%s/%s", $tmpdir,
$download_set->{'destination-path'});
my $target = sprintf("%s/%s", $target_path, $basename);
if ($context->{'dry-run'})
{
printf "would create link for %s\n", $basename;
+ printf " %s\n", $source_path;
+ printf " to %s\n", $target_path;
}
else
{
@@ -1016,11 +1112,11 @@ sub UploadFilesViaRsync ($$@)
sub CollectDownloadSets ($)
{
- my ($release_description) = @_;
+ my ($release_descriptor) = @_;
my @download_sets = ();
- foreach my $platform_descriptor (values
%{$release_description->{'platforms'}})
+ foreach my $platform_descriptor (values
%{$release_descriptor->{'platforms'}})
{
my $platform_path = sprintf("%s/instsetoo_native/%s",
$ENV{'SOLARSRC'},
@@ -1030,39 +1126,39 @@ sub CollectDownloadSets ($)
printf "ignoring missing %s\n", $platform_path;
next;
}
- for my $package_descriptor (values
%{$release_description->{'packages'}})
+ for my $package_descriptor (values
%{$release_descriptor->{'packages'}})
{
-
+ my $platform_package_descriptor = GetPlatformPackage(
+ $release_descriptor,
+ $platform_descriptor,
+ $package_descriptor);
my @package_formats = @{$platform_descriptor->{'package-types'}};
for my $package_format (@package_formats)
{
- for my $language_id (@{$release_description->{'language-ids'}})
+ for my $language_id (@{$release_descriptor->{'language-ids'}})
{
- my $source_path = GetInstallationPackagePath(
- $platform_descriptor,
+ my ($archive_path, $archive_name) =
GetInstallationPackageName(
+ $release_descriptor,
+ $platform_package_descriptor,
$package_format,
$language_id);
- my $archive_name = GetInstallationPackageName(
- $release_description,
- $package_descriptor,
- $package_format,
- $platform_descriptor,
- $language_id);
- my $candidate = $source_path."/".$archive_name;
+ my $candidate = $archive_path."/".$archive_name;
if ( ! -f $candidate)
{
# printf STDERR "ERROR: can not find download set
'%s'\n", $candidate;
next;
}
printf "adding %s\n", $archive_name;
- push @download_sets, {
- 'source-path' => $source_path,
+ my $download_set = {
+ 'source-path' => $archive_path,
'archive-name' => $archive_name,
- 'platform' => $platform_descriptor->{'pack-platform'},
+ 'platform' =>
$platform_descriptor->{'archive-platform'},
'destination-path' =>
sprintf("developer-snapshots/%s/%s",
- $release_description->{'name'},
- $platform_descriptor->{'pack-platform'})
+ $release_descriptor->{'name'},
+ $platform_descriptor->{'archive-platform'})
};
+ printf " %s\n", $download_set->{'destination-path'};
+ push @download_sets, $download_set;
}
}
}
@@ -1101,12 +1197,12 @@ sub ProvideChecksums ($@)
else
{
my $digest = Digest::MD5->new();
- open my $in, $full_archive_name;
+ open my ($in), $full_archive_name;
$digest->addfile($in);
my $checksum = $digest->hexdigest();
close $in;
- open my $out, ">", $md5_filename;
+ open my ($out), ">", $md5_filename;
printf $out "%s *%s", $checksum,
$download_set->{'archive-name'};
close $out;
@@ -1128,12 +1224,12 @@ sub ProvideChecksums ($@)
else
{
my $digest = Digest::SHA->new("sha256");
- open my $in, $full_archive_name;
+ open my ($in), $full_archive_name;
$digest->addfile($in);
my $checksum = $digest->hexdigest();
close $in;
- open my $out, ">", $sha256_filename;
+ open my ($out), ">", $sha256_filename;
printf $out "%s *%s", $checksum,
$download_set->{'archive-name'};
close $out;
@@ -1190,45 +1286,80 @@ sub IsOlderThan ($$)
-sub GetInstallationPackageName ($$$$$)
+sub GetInstallationPackageName ($$$$)
{
- my ($release_description, $package_descriptor, $package_format,
$platform_descriptor, $language) = @_;
-
- my $name = $package_descriptor->{'archive-name'};
+ my ($release_descriptor, $platform_package_descriptor, $package_format,
$language) = @_;
- my $archive_package_type = "";
- if ($platform_descriptor->{'add-package-type-to-archive-name'} =~
/^(1|true|yes)$/i)
- {
- $archive_package_type = "-".$package_format;
- }
+ my $path = ResolveTemplate(
+ $platform_package_descriptor->{'archive-path'},
+ $release_descriptor,
+ $platform_package_descriptor,
+ $package_format,
+ $language);
+ my $name = ResolveTemplate(
+ $platform_package_descriptor->{'archive-name'},
+ $release_descriptor,
+ $platform_package_descriptor,
+ $package_format,
+ $language);
- $name =~ s/%V/$release_description->{'version'}/g;
- $name =~ s/%P/$platform_descriptor->{'archive-platform'}/g;
- $name =~ s/%T/$archive_package_type/g;
- $name =~ s/%L/$language/g;
- $name =~ s/%E/$platform_descriptor->{'extension'}/g;
- return $name;
+ return ($path, $name);
}
-sub GetInstallationPackagePath ($$$)
+sub ResolveTemplate ($$$$$)
{
- my ($product_descriptor, $package_format, $language) = @_;
-
+ my ($template, $release_descriptor, $platform_package_descriptor,
$package_format, $language) = @_;
+
+ my $archive_package_type = "";
+ if ($platform_package_descriptor->{'add-package-type-to-archive-name'} =~
/^(1|true|yes)$/i)
+ {
+ $archive_package_type = "-".$package_format;
+ }
my $full_language = $language;
if ($EnUSBasedLanguages{$language})
{
$full_language = "en-US_".$language;
}
-
- return
sprintf("%s/instsetoo_native/%s/Apache_OpenOffice%s/%s/install/%s_download",
- $ENV{'SOLARSRC'},
- $ENV{'INPATH'},
- $product_descriptor->{'product-name-tail'},
- $package_format,
- $full_language);
+ my $extension = $platform_package_descriptor->{'download-extension'};
+ if ( ! defined $extension)
+ {
+ $extension = $platform_package_descriptor->{'extension'};
+ }
+
+ my $old_to_new_version_dash = sprintf(
+ "v-%s_v-%s",
+ $release_descriptor->{'previous-version'},
+ $release_descriptor->{'version'});
+ $old_to_new_version_dash =~ s/\./-/g;
+ my $old_to_new_version_dots = sprintf(
+ "%s-%s",
+ $release_descriptor->{'previous-version'},
+ $release_descriptor->{'version'});
+
+
+ my $name = $template;
+
+ # Resolve %? template paramters.
+ $name =~ s/%V/$release_descriptor->{'version'}/g;
+ $name =~ s/%W/$old_to_new_version_dash/g;
+ $name =~ s/%w/$old_to_new_version_dots/g;
+ $name =~ s/%P/$platform_package_descriptor->{'archive-platform'}/g;
+ $name =~ s/%t/$archive_package_type/g;
+ $name =~ s/%T/$package_format/g;
+ $name =~ s/%l/$full_language/g;
+ $name =~ s/%L/$language/g;
+ $name =~ s/%E/$extension/g;
+
+ # Resolve $name environment references.
+ while ($name =~ /^(.*?)\$([a-zA-Z0-9_]+)(.*)$/)
+ {
+ $name = $1 . $ENV{$2} . $3;
+ }
+
+ return $name;
}
@@ -1236,9 +1367,9 @@ sub GetInstallationPackagePath ($$$)
sub GetCurrentPlatformDescriptor ($)
{
- my ($release_description) = @_;
+ my ($release_descriptor) = @_;
- my $platform_descriptor =
$release_description->{'platforms'}->{$ENV{'INPATH'}};
+ my $platform_descriptor =
$release_descriptor->{'platforms'}->{$ENV{'INPATH'}};
if ( ! defined $platform_descriptor)
{
printf STDERR "ERROR: platform '%s' is not supported\n",
$ENV{'INPATH'};
@@ -1249,6 +1380,29 @@ sub GetCurrentPlatformDescriptor ($)
+sub GetPlatformPackage ($$$)
+{
+ my ($release_descriptor, $platform_descriptor, $package_descriptor) = @_;
+ my $key = sprintf("%s/%s", $platform_descriptor->{'id'},
$package_descriptor->{'id'});
+
+ my $platform_package = $release_descriptor->{'platform-packages'}->{$key};
+ $platform_package = {}
+ unless defined $platform_package;
+
+ my $joined_descriptor = {
+ %$platform_descriptor,
+ %$package_descriptor,
+ %$platform_package,
+ 'id' => $key,
+ 'platform-id' => $platform_descriptor->{'id'},
+ 'package-id' => $package_descriptor->{'id'}
+ };
+ return $joined_descriptor;
+}
+
+
+
+
sub Wiki ($$)
{
my ($release_descriptor, $context) = @_;
@@ -1288,7 +1442,7 @@ sub Wiki ($$)
if ($context->{'check-links'})
{
$| = 1;
- printf "%-5%s: ", $language_descriptor->{'id'};
+ printf "%-5s: ", $language_descriptor->{'id'};
}
print $out "|-\n";
@@ -1323,16 +1477,20 @@ sub Wiki ($$)
foreach my $platform_descriptor (@table_platforms)
{
- foreach my $package_type
(@{$platform_descriptor->{'package-types'}})
+ my $platform_package_descriptor = GetPlatformPackage(
+ $release_descriptor,
+ $platform_descriptor,
+ $package_descriptor);
+
+ foreach my $package_type
(@{$platform_package_descriptor->{'package-types'}})
{
WriteDownloadLinks(
$out,
$release_descriptor,
$context,
- $release_descriptor,
$language_descriptor,
$wiki_package_descriptor,
- $platform_descriptor,
+ $platform_package_descriptor,
$package_type);
}
}
@@ -1472,42 +1630,39 @@ sub WriteDownloadLinks ($$$$$$$)
my ($out,
$release_descriptor,
$context,
- $release_descriptor,
$language_descriptor,
$wiki_package_descriptor,
- $platform_descriptor,
+ $platform_package_descriptor,
$package_type) = @_;
- my $package_descriptor = $wiki_package_descriptor->{'package'};
-
# Check if the current language and platform match the package.
- if (defined
$wiki_package_descriptor->{'platforms'}->{$platform_descriptor->{'id'}}
+ my $platform_id = $platform_package_descriptor->{'platform-id'};
+ if (defined $wiki_package_descriptor->{'platforms'}->{$platform_id}
&& defined
$wiki_package_descriptor->{'languages'}->{$language_descriptor->{'id'}})
{
my $archive_package_name = "";
my $extension = $package_type;
- if (defined $platform_descriptor->{'extension'})
+ if (defined $platform_package_descriptor->{'extension'})
{
- $extension = $platform_descriptor->{'extension'};
+ $extension = $platform_package_descriptor->{'extension'};
}
- if (defined $package_descriptor->{'download-extension'})
+ if (defined $platform_package_descriptor->{'download-extension'})
{
- $extension = $package_descriptor->{'download-extension'};
+ $extension = $platform_package_descriptor->{'download-extension'};
}
$archive_package_name = "-".$package_type if ($package_type =~
/deb|rpm/);
- my $archive_name = GetInstallationPackageName(
+ my ($archive_path, $archive_name) = GetInstallationPackageName(
$release_descriptor,
- $package_descriptor,
+ $platform_package_descriptor,
$package_type,
- $platform_descriptor,
$language_descriptor->{'id'});
printf $out "| align=\"center\" | ";
my $download = FindDownload(
$context,
$release_descriptor,
- $platform_descriptor,
+ $platform_package_descriptor,
$package_type,
$archive_name);
if (defined $download)
@@ -1537,14 +1692,14 @@ sub WriteDownloadLinks ($$$$$$$)
sub FindDownload ($$$$$)
{
my ($context,
- $release_descriptor,
- $platform_descriptor,
- $package_type,
+ $release_descriptor,
+ $platform_package_descriptor,
+ $package_type,
$archive_name) = @_;
foreach my $download (@{$release_descriptor->{'downloads'}})
{
- if ($download->{'platform-id'} eq $platform_descriptor->{'id'})
+ if ($download->{'platform-id'} eq
$platform_package_descriptor->{'platform-id'})
{
my $url = $download->{'base-url'} . "/". $archive_name;
if ($context->{'check-links'})
@@ -1629,7 +1784,7 @@ sub CreateLink ($$$)
This is determined by downloading only the header.
=cut
-my $LastCheckedURL = undef;
+my $LastCheckedURL = "";
my $LastCheckedResult = undef;
sub CheckLink ($)
{
@@ -1662,16 +1817,16 @@ sub SignFile ($$)
my $context = ProcessCommandline(@ARGV);
-my $release_description = ReadReleaseDescription($context->{'filename'},
$context);
+my $release_descriptor = ReadReleaseDescription($context->{'filename'},
$context);
if ($context->{'command'} eq "build")
{
- WriteMakefile($release_description, $context);
+ WriteMakefile($release_descriptor, $context);
}
elsif ($context->{'command'} eq "upload")
{
- Upload($release_description, $context);
+ Upload($release_descriptor, $context);
}
elsif ($context->{'command'} eq "wiki")
{
- Wiki($release_description, $context);
+ Wiki($release_descriptor, $context);
}