Return-Path: X-Original-To: apmail-openoffice-commits-archive@www.apache.org Delivered-To: apmail-openoffice-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 1682010BB4 for ; Wed, 12 Feb 2014 12:00:43 +0000 (UTC) Received: (qmail 15367 invoked by uid 500); 12 Feb 2014 12:00:42 -0000 Delivered-To: apmail-openoffice-commits-archive@openoffice.apache.org Received: (qmail 15254 invoked by uid 500); 12 Feb 2014 12:00:39 -0000 Mailing-List: contact commits-help@openoffice.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openoffice.apache.org Delivered-To: mailing list commits@openoffice.apache.org Received: (qmail 15247 invoked by uid 99); 12 Feb 2014 12:00:38 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 12 Feb 2014 12:00:38 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 12 Feb 2014 12:00:33 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 000412388A5E; Wed, 12 Feb 2014 12:00:11 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1567607 - /openoffice/trunk/main/solenv/bin/build_release.pl Date: Wed, 12 Feb 2014 12:00:11 -0000 To: commits@openoffice.apache.org From: af@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20140212120012.000412388A5E@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 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 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); }