instsetoo_native/util/aoo-410-release.xml | 258 ++++++ solenv/bin/build_release.pl | 1116 ++++++++++++++++++++++++++++++ 2 files changed, 1374 insertions(+)
New commits: commit 0746de95538d71c4f5cc531e77bbd4e367ca17b8 Author: Andre Fischer <a...@apache.org> Date: Wed Jan 29 10:51:35 2014 +0000 124142: Added initial version of PERL script for building releases in a batch process. diff --git a/instsetoo_native/util/aoo-410-release.xml b/instsetoo_native/util/aoo-410-release.xml new file mode 100644 index 0000000..c87107e --- /dev/null +++ b/instsetoo_native/util/aoo-410-release.xml @@ -0,0 +1,258 @@ +<release + name="snapshot" + version="4.1.0"> + <language + id="ast" + english-name="Asturian" + local-name="Asturianu" + /> + <language + id="eu" + english-name="Basque" + local-name="Euskara" + /> + <language + id="zh-CN" + english-name="Chinese (simplified)" + local-name="ç®ä½ä¸æ" + /> + <language + id="zh-TW" + english-name="Chinese (traditional)" + local-name="æ£é«ä¸æ" + /> + <language + id="cs" + english-name="Czech" + local-name="ÄeÅ¡tina" + /> + <language + id="nl" + english-name="Dutch" + local-name="Nederlands" + /> + <language + id="en-GB" + english-name="English (GB)" + local-name="English (British)" + /> + <language + id="en-US" + english-name="English (US)" + local-name="English (US)" + /> + <language + id="fi" + english-name="Finnish" + local-name="Suomi" + /> + <language + id="fr" + english-name="French" + local-name="Français" + /> + <language + id="gd" + english-name="Gaelic (Scottish)" + local-name="Gà idhlig" + /> + <language + id="gl" + english-name="Galician" + local-name="Galego" + /> + <language + id="de" + english-name="German" + local-name="Deutsch" + /> + <language + id="el" + english-name="Greek" + local-name="Îλληνικά" + /> + <language + id="hu" + english-name="Hungarian" + local-name="Magyar" + /> + <language + id="it" + english-name="Italian" + local-name="Italiano" + /> + <language + id="ja" + english-name="Japanese" + local-name="æ¥æ¬èª" + /> + <language + id="km" + english-name="Khmer" + local-name="áá¶áá¶ááááá" + /> + <language + id="ko" + english-name="Korean" + local-name="íêµì´" + /> + <language + id="lt" + english-name="Lithuanian" + local-name="Lietuvių" + /> + <language + id="pl" + english-name="Polish" + local-name="Polski" + /> + <language + id="pt-BR" + english-name="Portuguese (Brazilian)" + local-name="Português (do Brasil)" + /> + <language + id="pt" + english-name="Portuguese (European)" + local-name="Português (Europeu)" + /> + <language + id="ru" + english-name="Russian" + local-name="Ð ÑÑÑкий" + /> + <language + id="sr" + english-name="Serbian (Cyrillic)" + local-name="CÑпÑки (ÑиÑилиÑом)" + /> + <language + id="sk" + english-name="Slovak" + local-name="Slovenský jazyk (slovenÄina)" + /> + <language + id="sl" + english-name="Slovenian" + local-name="Slovenski jezik (slovenÅ¡Äina)" + /> + <language + id="es" + english-name="Spanish" + local-name="Español" + /> + <language + id="sv" + english-name="Swedish" + local-name="Svenska" + /> + <language + id="ta" + english-name="Tamil" + local-name="தமிழà¯" + /> + <language + id="tr" + english-name="Turkish" + local-name="Türkçe" + /> + <language + id="vi" + english-name="Vietnamese" + local-name="Tiếng Viá»t" + /> + + <language + id="kid" + english-name="English (US) with support<br>for resource debugging" + local-name="kid" + /> + + <platform + id="wntmsci12.pro" + display-name="Windows" + base-url="http://people.apache.org/~hdu/developer-snapshots/snapshot/win32" + archive-platform="Win_x86" + word-size="32" + package-types="exe" + /> + <platform + id="unxlngi6.pro" + display-name="Linux" + base-url="http://people.apache.org/~hdu/developer-snapshots/snapshot/linux_x86" + archive-platform="Linux_x86" + word-size="32" + package-types="rpm;deb" + extension="tar.gz" + /> + <platform + id="unxlngix6.pro" + display-name="Linux" + base-url="http://people.apache.org/~hdu/developer-snapshots/snapshot/linux_x86-64" + archive-platform="Linux_x86-64" + word-size="64" + package-types="rpm;deb" + extension="tar.gz" + /> + <platform + id="unxmaccx.pro" + display-name="OS X" + base-url="http://people.apache.org/~hdu/developer-snapshots/snapshot/osx_x86-64" + archive-platform="unxmaccx_x86-64" + word-size="64" + package-types="dmg" + /> + + <build + target="openoffice" + platform-list="all" + language-list="all"> + </build> + + <build + target="oolanguagepack" + platform-list="all" + language-list="all"> + </build> + + <wiki> + <package + display-name="Full Install" + archive-name1="" + archive-name2="install" + language-list="all" + platform-list="all" + table="main" + /> + <package + display-name="Langpack" + archive-name1="" + archive-name2="langpack" + language-list="all" + platform-list="all" + table="main" + /> + + <package + display-name="Patch" + archive-name1="" + archive-name2="patch" + language-list="all" + platform-list="wntmsci12.pro" + table="main" + download-extension="msp" + /> + + <package + display-name="SDK" + archive-name1="-SDK" + archive-name2="install" + link-tooltip="What is an SDK?" + link-URL="http://www.openoffice.org/download/other.html#notes" + language-list="en-US" + platform-list="all" + table="secondary" + /> + + </wiki> +</release> diff --git a/solenv/bin/build_release.pl b/solenv/bin/build_release.pl new file mode 100755 index 0000000..a2ae5fe --- /dev/null +++ b/solenv/bin/build_release.pl @@ -0,0 +1,1116 @@ +#!/usr/bin/perl +#************************************************************** +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +#************************************************************** + +use strict; +use XML::LibXML; +use open OUT => ":utf8"; +use LWP::Simple; +use Digest; +use Digest::MD5; +use Digest::SHA; + +use Carp::always; + +=head1 NAME + + build_release.pl - Tool for batch release builds and uploads and the creation of wiki pages that list install sets. + +=head1 SYNOPSIS + + build_release.pl <command> {option} <release-description.xml> + + comands: + build builds all install sets as requested by the XML file and supported by the platform. + upload upload install sets to a local or remote (via ssh with public/private key) + directory structure. Uploads install sets that where build on other platforms. + wiki create a wiki (MediaWiki syntax) snippet that references all install sets at the upload + location. Includes install sets that where built and/or uploaded from other + platforms and machines. + options: + -j <count> maximum number of build processes + -k keep going if there are recoverable errors + -u <path> upload destination + -l check links on wiki page, write broken links as plain text + -ld check links on wiki page, mark broken links + -o <filename> filename of the output (wiki: wiki page, build: makefile) + +=head1 XML file format + +<release + name="snapshot" + version="4.1.0"> + + <language + id="ast" # As specified by 'configure --with-lang' + english-name="Asturian" + local-name="Asturianu" + /> + ... more languages + + <platform + id="wntmsci12.pro" + display-name="Windows" + base-url="http://people.apache.org/~hdu/developer-snapshots/snapshot/win32" + archive-platform="Win_x86" + word-size="32" + package-types="exe" + /> + ... more platforms + + <build + target="openoffice" + platform-list="all" + language-list="all"> + </build> + ... more build entries + + <wiki> + + # Each wiki package will generate one row per language. + # For each language there will be one package block. + <package + display-name="Full Install" + archive-name1="" + archive-name2="install" + language-list="all" + platform-list="all" + table="main" + /> + ... more packages + </wiki> + +</release> + +=cut + + + +my %PlatformDescriptors = ( + "wntmsci12" => { + 'name' => "windows", + 'extension' => "exe", + 'pack-platform' => "Win_x86", + 'package-formats' => ["msi"] + }, + "unxmaccxi" => { + 'name' => "unxmaccx_x86-64", + 'extension' => "dmg", + 'pack-platform' => "MacOS_x86", + 'package-formats' => ["dmg"] + }, + "unxlngi6" => { + 'name' => "Linux_x86", + 'extension' => "tar.gz", + 'pack-platform' => "Linux_x86", + 'package-formats' => ["deb", "rpm"] + }, + "unxlngx6" => { + 'name' => "Linux_x86-64", + 'extension' => "tar.gz", + 'pack-platform' => "Linux_x86-64", + 'package-formats' => ["deb", "rpm"] + } +); +my %ProductDescriptors = ( + "openoffice" => { + 'pack-name' => "install", + 'product-name-tail' => "" + }, + "oolanguagepack" => { + 'pack-name' => "langpack", + 'product-name-tail' => "_languagepack" + } +); +my %EnUSBasedLanguages = ( + 'ast' => 1 + ); + + + +sub ProcessCommandline (@) +{ + my @arguments = @_; + + my $command = undef; + my $description_filename = undef; + my $max_process_count = 1; + my $keep_going = 0; + my $upload_destination = undef; + my $check_links = 0; + my $mark_broken_links = 0; + my $output_filename = undef; + + my $error = 0; + while (scalar @arguments > 0) + { + my $argument = shift @arguments; + if ($argument =~ /^-/) + { + if ($argument eq "-j") + { + $max_process_count = shift @arguments; + } + elsif ($argument eq "-u") + { + $upload_destination = shift @arguments; + $upload_destination =~ s/(\\|\/)$//; + } + elsif ($argument eq "-k") + { + $keep_going = 1; + } + elsif ($argument eq "-l") + { + $check_links = 1; + } + elsif ($argument eq "-ld") + { + $check_links = 1; + $mark_broken_links = 1; + } + elsif ($argument eq "-o") + { + $output_filename = shift @arguments; + } + else + { + printf STDERR "unknown option $argument %s\n", $argument; + $error = 1; + } + } + elsif ( ! defined $command) + { + $command = $argument; + if ($command !~ /^(build|upload|wiki)$/) + { + printf STDERR "unknown command '%s'\n", $command; + $error = 1; + } + } + else + { + $description_filename = $argument; + if ( ! -f $description_filename) + { + print STDERR "can not open release description '%s'\n", $description_filename; + $error = 1; + } + } + } + + if ( ! defined $description_filename) + { + $error = 1; + } + if ($command =~ /^(build|wiki)$/) + { + if ( ! defined $output_filename) + { + printf STDERR "ERROR: no output filename\n", + $error = 1; + } + } + + if ($error) + { + PrintUsageAndExit(); + } + + return { + 'command' => $command, + 'filename' => $description_filename, + 'max-process-count' => $max_process_count, + 'keep-going' => $keep_going, + 'upload-destination' => $upload_destination, + 'check-links' => $check_links, + 'mark-broken-links' => $mark_broken_links, + 'output-filename' => $output_filename + }; +} + + + + +sub PrintUsageAndExit () +{ + print STDERR "usage: $0 <command> {option} <release-description.xml>\n"; + print STDERR " comands:\n"; + print STDERR " build\n"; + print STDERR " upload\n"; + print STDERR " wiki create a download page in MediaWiki syntax\n"; + print STDERR " options:\n"; + print STDERR " -j <count> maximum number of build processes\n"; + print STDERR " -k keep going if there are recoverable errors\n"; + print STDERR " -u <path> upload destination\n"; + print STDERR " -l check links on wiki page, write broken links as plain text\n"; + print STDERR " -ld check links on wiki page, mark broken links\n"; + print STDERR " -o <filename> filename of the output (wiki: wiki page, build: makefile)\n"; + exit(1); +} + + + + +sub Trim ($) +{ + my ($text) = @_; + $text =~ s/^\s+|\s+$//g; + return $text; +} + + + + +sub ReadReleaseDescription ($$) +{ + my ($filename, $context) = @_; + + my $document = XML::LibXML->load_xml('location' => $filename); + my $root = $document->documentElement(); + + # Initialize the release description. + my $release = { + 'name' => $root->getAttribute("name"), + 'version' => $root->getAttribute("version"), + 'builds' => [], + 'languages' => {}, + 'language-ids' => [], + 'platforms' => {}, + 'platform-ids' => [], + 'wiki-packages' => [], + }; + + # Process the language descriptions. + for my $language_element ($root->getChildrenByTagName("language")) + { + my $language_descriptor = ProcessLanguageDescription($language_element, $context); + $release->{'languages'}->{$language_descriptor->{'id'}} = $language_descriptor; + push @{$release->{'language-ids'}}, $language_descriptor->{'id'}; + } + printf "%d languages\n", scalar keys %{$release->{'languages'}}; + + # Process the platform descriptions. + for my $platform_element ($root->getChildrenByTagName("platform")) + { + foreach my $platform_descriptor (ProcessPlatformDescription($platform_element, $context)) + { + $release->{'platforms'}->{$platform_descriptor->{'id'}} = $platform_descriptor; + push @{$release->{'platform-ids'}}, $platform_descriptor->{'id'}; + } + } + printf "%d platforms\n", scalar keys %{$release->{'platforms'}}; + + if ($context->{'command'} =~ /^(build|upload)$/) + { + # Process the build descriptions. + for my $build_element ($root->getChildrenByTagName("build")) + { + push @{$release->{'builds'}}, ProcessBuildDescription($build_element, $context, $release); + } + printf "%d build targets\n", scalar @{$release->{'builds'}}; + } + + if ($context->{'command'} eq "wiki") + { + for my $wiki_element ($root->getChildrenByTagName("wiki")) + { + for my $wiki_package_element ($wiki_element->getChildrenByTagName("package")) + { + my $wiki_package = ProcessWikiPackageDescription( + $wiki_package_element, + $context, + $release); + push @{$release->{'wiki-packages'}}, $wiki_package; + } + } + printf "%d wiki packages\n", scalar @{$release->{'wiki-packages'}}; + } + + return $release; +} + + + + +sub ProcessBuildDescription ($$$) +{ + my ($build_element, $context, $release_descriptor) = @_; + + my $target_name = $build_element->getAttribute("target"); + my $languages = PostprocessLanguageList($build_element->getAttribute("language-list"), $release_descriptor); + my $platforms = PostprocessPlatformList($build_element->getAttribute("platform-list"), $release_descriptor); + + # Check if the platform matches any for which the product shall be built. + my $current_platform = $ENV{'INPATH'}; + my $is_platform_match = 0; + foreach my $platform_id (@$platforms) + { + if ($platform_id eq $current_platform) + { + $is_platform_match=1; + last; + } + } + if ($is_platform_match) + { + printf "including build %s\n", $target_name; + } + else + { + printf "skipping build %s: no platform match\n", $target_name; + printf "none of the platforms %s matches %s\n", + join(", ", keys %{$release_descriptor->{'platforms'}}), + $current_platform; + return; + } + + my @languages = CheckLanguageSet($context, @$languages); + + return { + 'target' => $target_name, + 'language-list' => \@languages + }; +} + + + + +sub ProcessPlatformDescription ($$) +{ + my ($element, $context) = @_; + + my $descriptor = {}; + # Mandatory tags. + foreach my $id ("id", "display-name", "base-url", "archive-platform", "word-size", "package-types") + { + $descriptor->{$id} = $element->getAttribute($id); + die "wiki/platform has no attribute $id" unless defined $descriptor->{$id}; + } + $descriptor->{"extension"} = $element->getAttribute("extension"); + + # Split package-types at ';' into single package-type entries. + my @descriptors = (); + foreach my $package_type (split(/;/, $descriptor->{'package-types'})) + { + push @descriptors, { + %$descriptor, + 'package-type' => $package_type + }; + } + + return @descriptors; +} + + + + +sub ProcessWikiPackageDescription ($$$) +{ + my ($element, $context, $release_descriptor) = @_; + + my $descriptor = {}; + # Mandatory tags. + foreach my $id ("archive-name2", "display-name", "table") + { + $descriptor->{$id} = $element->getAttribute($id); + die "wiki/package has no attribute $id" unless defined $descriptor->{$id}; + die "wiki/package attribute $id is empty" unless $descriptor->{$id} !~ /^\s*$/; + } + # Optional tags. + foreach my $id ("archive-name1", "link-tooltip", "link-URL", "download-extension") + { + $descriptor->{$id} = $element->getAttribute($id); + } + + $descriptor->{'language-list'} = PostprocessLanguageList( + $element->getAttribute("language-list"), + $release_descriptor); + $descriptor->{'platform-list'} = PostprocessPlatformList( + $element->getAttribute("platform-list"), + $release_descriptor); + + $descriptor->{'languages'} = {map{$_=>1} @{$descriptor->{'language-list'}}}; + $descriptor->{'platforms'} = {map{$_=>1} @{$descriptor->{'platform-list'}}}; + + return $descriptor; +} + + + + +sub ProcessLanguageDescription ($$) +{ + my ($element, $context) = @_; + + my $descriptor = {}; + foreach my $id ("id", "english-name", "local-name") + { + $descriptor->{$id} = $element->getAttribute($id); + die "wiki/language has no attribute $id" unless defined $descriptor->{$id}; + } + + return $descriptor; +} + + + + +sub PostprocessLanguageList ($$) +{ + my ($language_list, $release_descriptor) = @_; + + my @matching_languages = (); + if ( ! defined $language_list + || $language_list eq "all") + { + @matching_languages = sort keys %{$release_descriptor->{'languages'}}; + } + else + { + @matching_languages = split(/;/, $language_list); + } + + return \@matching_languages; +} + + + + +sub PostprocessPlatformList ($$) +{ + my ($platform_list, $release_descriptor) = @_; + + my @matching_platforms = (); + if ( ! defined $platform_list + || $platform_list eq "all") + { + @matching_platforms = sort keys %{$release_descriptor->{'platforms'}}; + } + else + { + @matching_platforms = split(/;/, $platform_list); + } + + return \@matching_platforms; +} + + + + +sub CheckLanguageSet ($@) +{ + my ($context, @languages) = @_; + my %configured_languages = map{$_=>1} split(/\s+/, $ENV{'WITH_LANG'}); + + my @missing_languages = (); + my @present_languages = (); + for my $language (@languages) + { + if (defined $configured_languages{$language}) + { + push @present_languages, $language; + } + else + { + push @missing_languages, $language; + } + } + + if (scalar @missing_languages > 0) + { + printf STDERR " there are languages that where not configured via --with-lang:\n"; + printf STDERR " %s\n", join(", ", @missing_languages); + if ($context->{'keep-going'}) + { + printf " available languages:\n"; + printf " %s\n", join(", ", @present_languages); + } + else + { + die; + } + } + + return @present_languages; +} + + + + +sub WriteMakefile ($$) +{ + my ($release_description, $output_filename) = @_; + + my $path = $ENV{'SRC_ROOT'} . "/instsetoo_native/util"; + open my $make, ">", $output_filename; + + # Write dependencies of 'all' on the products in all languages. + print $make "all .PHONY : \\\n"; + for my $build (@{$release_description->{'builds'}}) + { + for my $language_id (@{$build->{'language-list'}}) + { + printf $make " %s_%s \\\n", $build->{'target'}, $language_id; + } + } + printf $make "\n\n"; + + # Write rules that chain dmake in instsetoo_native/util. + for my $build (@{$release_description->{'builds'}}) + { + for my $language_id (@{$build->{'language-list'}}) + { + printf $make "%s_%s :\n", $build->{'target'}, $language_id; + printf $make "\tdmake \$@ release=t\n"; + } + } + + close $make; +} + + + + +sub Upload ($$) +{ + my ($release_description, $context) = @_; + + if ( ! defined $context->{'upload-destination'}) + { + printf STDERR "ERROR: upload destination is missing\n"; + PrintUsageAndExit(); + } + + my @download_sets = CollectDownloadSets($release_description); + my @actions = GetCopyActions($release_description, @download_sets); + foreach my $action (@actions) + { + printf "uploading %s to %s/%s\n", + $action->{'basename'}, + $context->{'upload-destination'}, + $action->{'to'}; + + + ProvideChecksums($action); + if ($context->{'upload-destination'} =~ /@/) + { + my $destination = $action->{'to'}; + my $server = $context->{'upload-destination'}; + if ($server =~ /^(.*):(.*)$/) + { + $server = $1; + $destination = $2 . "/" . $destination; + } + + my @path_parts = split(/\//, $destination); + my @paths = (); + my $path = undef; + foreach my $part (@path_parts) + { + if (defined $path) + { + $path .= "/" . $part; + } + else + { + $path = $part; + } + push @paths, $path; + } + my $command = sprintf("ssh %s mkdir \"%s\"", + $server, + join("\" \"", @paths)); + printf "running command '%s'\n", $command; + system($command); + + my $command = sprintf("scp %s %s/%s/", + qx(cygpath -u \"$action->{'from'}\"), + $context->{'upload-destination'}, + $action->{'to'}); + printf "running command '%s'\n", $command; + system($command); + + my $command = sprintf("ssh %s md5 \"%s/%s\"", + $server, + $destination, + $action->{'basename'}); + printf "running command '%s'\n", $command; + system($command); + } + } +} + + + + +sub CollectDownloadSets ($) +{ + my ($release_description) = @_; + + my @download_sets = (); + my $platform_descriptor = GetPlatformDescriptor(); + + for my $build (@{$release_description->{'builds'}}) + { + my $product_descriptor = GetProductDescriptor($build->{'target'}); + print $build->{'target'}."\n"; + my @package_formats = @{$platform_descriptor->{'package-formats'}}; + for my $package_format (@package_formats) + { + for my $language (@{$build->{'language-list'}}) + { + my $full_language = $language; + if ($EnUSBasedLanguages{$language}) + { + $full_language = "en-US_".$language; + } + my $archive_name = GetInstallationPackageName($build, $language); + + my $source_path = 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); + if ( ! -f $source_path."/".$archive_name) + { + printf STDERR "ERROR: can not find download set '%s'\n", $source_path; + next; + } + push @download_sets, { + 'source-path' => $source_path, + 'archive-name' => $archive_name, + 'platform' => $platform_descriptor->{'pack-platform'} + }; + } + } + } + + return @download_sets; +} + + + + +sub ProvideChecksums ($) +{ + my ($action) = @_; + + printf "creating checksums for %s\n", $action->{'basename'}; + my $full_archive_name = $action->{'from'} . "/" . $action->{'basename'}; + + my $digest = Digest::MD5->new(); + open my $in, $full_archive_name; + $digest->addfile($in); + $action->{"MD5"} = $digest->hexdigest(); + close $in; + + my $digest = Digest::SHA->new("sha256"); + open my $in, $full_archive_name; + $digest->addfile($in); + $action->{"SHA256"} = $digest->hexdigest(); + close $in; +} + + + + +sub GetCopyActions ($@) +{ + my ($release_description, @download_sets) = @_; + + my $platform_descriptor = GetPlatformDescriptor(); + + my @actions = (); + + for my $download_set (@download_sets) + { + my $destination_path = sprintf("developer-snapshots/%s/%s", + $release_description->{'name'}, + $platform_descriptor->{'pack-platform'}); + + push @actions, { + 'action'=>'copy', + 'from' => $download_set->{'source-path'}, + 'to' => $destination_path, + 'basename' => $download_set->{'archive-name'} + }; + } + + return @actions; +} + + + + +sub GetInstallationPackageName ($$) +{ + my ($build, $language) = @_; + + my $platform_descriptor = GetPlatformDescriptor(); + my $build_descriptor = GetProductDescriptor($build->{'target'}); + my $name = sprintf ("Apache_OpenOffice_%s_%s_%s_%s.%s", + "4.1.0", + $platform_descriptor->{'pack-platform'}, + $build_descriptor->{'pack-name'}, + $language, + $platform_descriptor->{'extension'}); + return $name; +} + + + + +sub GetPlatformDescriptor () +{ + if ( ! defined $ENV{'OUTPATH'}) + { + printf STDERR "ERROR: solar environment not loaded or broken (OUTPATH not defined)\n"; + die; + } + my $descriptor = $PlatformDescriptors{$ENV{'OUTPATH'}}; + if ( ! defined $descriptor) + { + printf STDERR "ERROR: platform '%s' is not yet supported\n", $ENV{'OUTPATH'}; + die; + } + return $descriptor; +} + + + + +sub GetProductDescriptor ($) +{ + my ($product_name) = @_; + my $descriptor = $ProductDescriptors{$product_name}; + if ( ! defined $descriptor) + { + printf STDERR "ERROR: product '%s' is not supported\n", $product_name; + } + return $descriptor; +} + + + + +sub Wiki ($$) +{ + my ($release_descriptor, $context) = @_; + + open my $out, ">", $context->{'output-filename'}; + + my @table_list = GetTableList($release_descriptor); + foreach my $table_name (@table_list) + { + my @table_packages = GetPackagesForTable($release_descriptor, $table_name); + my @table_languages = GetLanguagesForTable($release_descriptor, @table_packages); + my @table_platforms = GetPlatformsForTable($release_descriptor, @table_packages); + + printf "packages: %s\n", join(", ", map {$_->{'display-name'}} @table_packages); + printf "languages: %s\n", join(", ", map {$_->{'english-name'}} @table_languages); + printf "platforms: %s\n", join(", ", map {$_->{'id'}} @table_platforms); + + print $out "{| class=\"wikitable\"\n"; + print $out "|-\n"; + print $out "! colspan=\"2\" | Language<br>The names do not refer to countries\n"; + print $out "! Type\n"; + foreach my $platform_descriptor (@table_platforms) + { + printf $out "! %s<br>%s bit<br>%s\n", + $platform_descriptor->{'display-name'}, + $platform_descriptor->{'word-size'}, + uc($platform_descriptor->{'package-type'}); + } + + foreach my $language_descriptor (@table_languages) + { + if ($context->{'check-links'}) + { + $| = 1; + printf "%s: ", $language_descriptor->{'id'}; + } + + print $out "|-\n"; + printf $out "| rowspan=\"%d\" | %s\n", scalar @table_packages, $language_descriptor->{'english-name'}; + printf $out "| rowspan=\"%d\" | %s\n", scalar @table_packages, $language_descriptor->{'local-name'}; + + my $is_first = 1; + foreach my $package_descriptor (@table_packages) + { + if ($is_first) + { + $is_first = 0; + } + else + { + printf $out "|-\n"; + } + + # Write the name of the package, e.g. Full Install or Langpack. + if (defined $package_descriptor->{'link-URL'}) + { + printf $out "| [%s %s]\n", + $package_descriptor->{'link-URL'}, + $package_descriptor->{'display-name'}; + } + else + { + printf $out "| %s\n", $package_descriptor->{'display-name'}; + } + + foreach my $platform_descriptor (@table_platforms) + { + WriteDownloadLinks( + $out, + $context, + $release_descriptor, + $language_descriptor, + $package_descriptor, + $platform_descriptor); + } + } + + if ($context->{'check-links'}) + { + printf "\n"; + } + } + + print $out "|}\n"; + } + close $out; +} + + + + +sub GetTableList ($) +{ + my ($release_descriptor) = @_; + + my %seen_table_names = (); + my @table_names = (); + foreach my $package_descriptor (@{$release_descriptor->{'wiki-packages'}}) + { + my $table_name = $package_descriptor->{'table'}; + if ( ! $seen_table_names{$table_name}) + { + push @table_names, $table_name; + $seen_table_names{$table_name} = 1; + } + } + return @table_names; +} + + + + +sub GetPackagesForTable ($$) +{ + my ($release_descriptor, $table_name) = @_; + + my @packages = (); + foreach my $package_descriptor (@{$release_descriptor->{'wiki-packages'}}) + { + if ($package_descriptor->{'table'} eq $table_name) + { + push @packages, $package_descriptor; + } + } + return @packages; +} + + + + +sub GetLanguagesForTable ($@) +{ + my ($release_descriptor, @packages) = @_; + + # Find the languages that are reference by at least one package. + my %matching_languages = (); + foreach my $package_descriptor (@packages) + { + foreach my $language_id (@{$package_descriptor->{'language-list'}}) + { + $matching_languages{$language_id} = 1; + } + } + + # Retrieve the language descriptors for the language ids. + my @matching_language_descriptors = (); + foreach my $language_id (@{$release_descriptor->{'language-ids'}}) + { + if (defined $matching_languages{$language_id}) + { + my $language_descriptor = $release_descriptor->{'languages'}->{$language_id}; + if (defined $language_descriptor) + { + push @matching_language_descriptors, $language_descriptor; + } + } + } + + return @matching_language_descriptors; +} + + + + +sub GetPlatformsForTable ($@) +{ + my ($release_descriptor, @packages) = @_; + + # Find the platforms that are reference by at least one package. + my %matching_platform_ids = (); + foreach my $package_descriptor (@packages) + { + foreach my $platform_id (@{$package_descriptor->{'platform-list'}}) + { + $matching_platform_ids{$platform_id} = 1; + } + } + + # Retrieve the platform descriptors for the plaform ids. + my @matching_platform_descriptors = (); + foreach my $platform_id (@{$release_descriptor->{'platform-ids'}}) + { + if ($matching_platform_ids{$platform_id}) + { + push @matching_platform_descriptors, $release_descriptor->{'platforms'}->{$platform_id}; + } + } + + return @matching_platform_descriptors; +} + + + + +my $bold_text_start = "<b>"; +my $bold_text_end = "</b>"; +my $small_text_start = "<span style=\"font-size:80%\">"; +my $small_text_end = "</span>"; +my $broken_link_start = "<span style=\"color:#FF0000\">"; +my $broken_link_end = "</span>"; + + +sub WriteDownloadLinks ($$$$$) +{ + my ($out, + $context, + $release_descriptor, + $language_descriptor, + $package_descriptor, + $platform_descriptor) = @_; + + # Check if the current language and platform match the package. + if (defined $package_descriptor->{'platforms'}->{$platform_descriptor->{'id'}} + && defined $package_descriptor->{'languages'}->{$language_descriptor->{'id'}}) + { + my $archive_package_name = ""; + my $package_type = $platform_descriptor->{'package-type'}; + my $extension = $package_type; + if (defined $platform_descriptor->{'extension'}) + { + $extension = $platform_descriptor->{'extension'}; + } + if (defined $package_descriptor->{'download-extension'}) + { + $extension = $package_descriptor->{'download-extension'}; + } + $archive_package_name = "-".$package_type if ($package_type =~ /deb|rpm/); + my $archive_name = sprintf("Apache_OpenOffice%s_%s_%s_%s%s_%s.%s", + $package_descriptor->{'archive-name1'}, + $release_descriptor->{'version'}, + $platform_descriptor->{'archive-platform'}, + $package_descriptor->{'archive-name2'}, + $archive_package_name, + $language_descriptor->{'id'}, + $extension); + + my $url = $platform_descriptor->{'base-url'} . "/". $archive_name; + printf $out + "| align=\"center\" | %s%s%s<br><br>%s%s %s<br>%s%s\n", + $bold_text_start, + CreateLink($url, $extension, $context), + $bold_text_end, + $small_text_start, + CreateLink($url.".asc", "ASC", $context), + CreateLink($url.".md5", "MD5", $context), + CreateLink($url.".sha256", "SHA256", $context), + $small_text_end; + } + else + { + printf $out "|\n"; + } +} + + + + +sub CreateLink ($$$) +{ + my ($url, $text, $context) = @_; + + my $is_link_broken = 0; + if ($context->{'check-links'}) + { + my $head = LWP::Simple::head($url); + $is_link_broken = ! $head; + printf "."; + } + + if ( ! $is_link_broken) + { + return sprintf ("[%s %s]", $url, $text); + } + elsif ($context->{'mark-broken-links'}) + { + return sprintf ("%sbroken%s[%s %s]", $broken_link_start, $broken_link_end, $url, $text); + } + else + { + return sprintf ("%s", $text); + } +} + + + + +my $context = ProcessCommandline(@ARGV); +my $release_description = ReadReleaseDescription($context->{'filename'}, $context); +if ($context->{'command'} eq "build") +{ + WriteMakefile($release_description, $context->{'output-filename'}); +# open my $make, "|-", sprintf("make -C \"%s\" -j%d -f -", $path, $max_process_count); +} +elsif ($context->{'command'} eq "upload") +{ + Upload($release_description, $context); +} +elsif ($context->{'command'} eq "wiki") +{ + Wiki($release_description, $context); +}
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits