instsetoo_native/util/makefile.mk                     |   18 -
 solenv/bin/deliver.pl                                 |    5 
 solenv/bin/macosx-change-install-names.pl             |    8 
 solenv/bin/macosx-dylib-link-list.pl                  |    2 
 solenv/bin/modules/installer/patch/InstallationSet.pm |   53 ++-
 solenv/bin/modules/installer/patch/ReleasesList.pm    |  237 ++++++++++++---
 solenv/bin/modules/macosxotoolhelper.pm               |    4 
 solenv/bin/patch_tool.pl                              |  284 +++++++++++++++++-
 solenv/inc/_tg_app.mk                                 |   43 +-
 solenv/inc/tg_app.mk                                  |    6 
 10 files changed, 565 insertions(+), 95 deletions(-)

New commits:
commit c3ff86d01d4a862f036914243663f40e6dcf9172
Author: Andre Fischer <a...@apache.org>
Date:   Thu Dec 5 09:10:55 2013 +0000

    123531: patch_tool.pl can now extend releases.xml.

diff --git a/instsetoo_native/util/makefile.mk 
b/instsetoo_native/util/makefile.mk
index 5e6cc6e..67272a7 100644
--- a/instsetoo_native/util/makefile.mk
+++ b/instsetoo_native/util/makefile.mk
@@ -75,6 +75,7 @@ help .PHONY :
     @echo "experimental targets:"
     @echo "    patch_create           create a patch for updating an installed 
office (Windows only)"
     @echo "    patch_apply            apply a previously created patch"
+    @echo "    patch_update_releases_xml"
     @echo 
     @echo "Most targets (all except aoo_srcrelease and updatepack) accept 
suffixes"
     @echo "    add _<language> to build a target for one language only"
@@ -307,14 +308,25 @@ $(BIN)$/dev$/intro.zip : 
$(SOLARCOMMONPCKDIR)$/openoffice_dev$/intro.zip
 
 .IF "$(OS)" == "WNT"
 patch_create .PHONY : $(PRJ)$/data
-    perl -I $(SOLARENV)$/bin/modules $(SOLARENV)$/bin$/patch_create.pl \
+    perl -I $(SOLARENV)$/bin/modules $(SOLARENV)$/bin$/patch_tool.pl   \
+        create                                                         \
         --product-name Apache_OpenOffice                               \
         --output-path $(OUT)                                           \
         --data-path $(PRJ)$/data                                       \
         --lst-file $(PRJ)$/util$/openoffice.lst
 patch_apply .PHONY :
-    perl -I $(SOLARENV)$/bin/modules $(SOLARENV)$/bin$/patch_apply.pl \
-        
../wntmsci12.pro/Apache_OpenOffice/msp/v-4-0-1_v-4-1-0/en-US/openoffice.msp
+    perl -I $(SOLARENV)$/bin/modules $(SOLARENV)$/bin$/patch_tool.pl   \
+        apply                                                          \
+        --product-name Apache_OpenOffice                               \
+        --output-path $(OUT)                                           \
+        --lst-file $(PRJ)$/util$/openoffice.lst
+patch_update_releases_xml .PHONY:
+    perl -I $(SOLARENV)$/bin/modules $(SOLARENV)$/bin$/patch_tool.pl   \
+        update-releases-xml                                            \
+        --product-name Apache_OpenOffice                               \
+        --output-path $(OUT)                                           \
+        --lst-file $(PRJ)$/util$/openoffice.lst\
+        --target-version 4.0.1
 
 $(PRJ)$/data :
     mkdir $@
diff --git a/solenv/bin/modules/installer/patch/InstallationSet.pm 
b/solenv/bin/modules/installer/patch/InstallationSet.pm
index 7d6647d..e30adc4 100644
--- a/solenv/bin/modules/installer/patch/InstallationSet.pm
+++ b/solenv/bin/modules/installer/patch/InstallationSet.pm
@@ -304,21 +304,27 @@ sub Download ($$$)
     $installer::logger::Info->printf("downloading %s\n", $basename);
     $installer::logger::Info->printf("    from '%s'\n", $location);
     my $filesize = $release_data->{'file-size'};
-    $installer::logger::Info->printf("    expected size is %d\n", $filesize);
-    my $temporary_filename = $filename . ".part";
-    my $resume_size = 0;
-    if ( -f $temporary_filename)
+    if (defined $filesize)
+    {
+        $installer::logger::Info->printf("    expected size is %d\n", 
$filesize);
+    }
+    else
     {
-        $resume_size = -s $temporary_filename;
-        $installer::logger::Info->printf(" trying to resume at %d/%d bytes\n", 
$resume_size, $filesize);
+        $installer::logger::Info->printf("    file size is not yet known\n");
     }
+    my $temporary_filename = $filename . ".part";
+    my $resume_size = 0;
 
     # Prepare checksum.
     my $checksum = undef;
     my $checksum_type = $release_data->{'checksum-type'};
     my $checksum_value = $release_data->{'checksum-value'};
     my $digest = undef;
-    if ($checksum_type eq "sha256")
+    if ( ! defined $checksum_value)
+    {
+        # No checksum available.  Skip test.
+    }
+    elsif ($checksum_type eq "sha256")
     {
         $digest = Digest->new("SHA-256");
     }
@@ -335,7 +341,7 @@ sub Download ($$$)
     }
 
     # Download the extension.
-    open my $out, ">>$temporary_filename";
+    open my $out, ">$temporary_filename";
     binmode($out);
 
     my $mode = $|;
@@ -359,21 +365,28 @@ sub Download ($$$)
             {
                 $last_was_redirect = 0;
                 # Throw away the data we got so far.
-                $digest->reset();
+                $digest->reset() if defined $digest;
                 close $out;
                 open $out, ">$temporary_filename";
                 binmode($out);
             }
             my($response,$agent,$h,$data)=@_;
             print $out $data;
-            $digest->add($data);
+            $digest->add($data) if defined $digest;
             $bytes_read += length($data);
-            printf("read %*d / %d  %d%%  \r",
-                length($filesize),
-                $bytes_read,
-                $filesize,
-                $bytes_read*100/$filesize);
-        });
+            if (defined $filesize)
+            {
+                printf("read %*d / %d  %d%%  \r",
+                    length($filesize),
+                    $bytes_read,
+                    $filesize,
+                    $bytes_read*100/$filesize);
+            }
+            else
+            {
+                printf("read %6.2f MB\r", $bytes_read/(1024.0*1024.0));
+            }
+            });
     my $response;
     if ($resume_size > 0)
     {
@@ -393,9 +406,10 @@ sub Download ($$$)
 
     if ($response->is_success())
     {
-        if ($digest->hexdigest() eq $checksum_value)
+        if ( ! defined $digest
+            || $digest->hexdigest() eq $checksum_value)
         {
-            $installer::logger::Info->PrintInfo("download was successfull\n");
+            $installer::logger::Info->print("download was successfull\n");
             if ( ! rename($temporary_filename, $filename))
             {
                 installer::logger::PrintError("can not rename '%s' to '%s'\n", 
$temporary_filename, $filename);
@@ -453,7 +467,8 @@ sub ProvideDownloadSet ($$$)
     else
     {
         $installer::logger::Info->printf("download set exists at '%s'\n", 
$ext_sources_filename);
-        if ($release_item->{'checksum-type'} eq 'sha256')
+        if (defined $release_item->{'checksum-value'}
+            && $release_item->{'checksum-type'} eq 'sha256')
         {
             $installer::logger::Info->printf("checking SHA256 checksum\n");
             my $digest = Digest->new("SHA-256");
diff --git a/solenv/bin/modules/installer/patch/ReleasesList.pm 
b/solenv/bin/modules/installer/patch/ReleasesList.pm
index e0648eb..011e4bc 100644
--- a/solenv/bin/modules/installer/patch/ReleasesList.pm
+++ b/solenv/bin/modules/installer/patch/ReleasesList.pm
@@ -157,6 +157,17 @@ sub GetAttribute ($$)
 
 
 sub PrintNode($$);
+
+=head2 ReadDomTree ($filename)
+
+    Read the dom tree for the XML in $filename.
+
+    Note that
+    a) this was initially written for another XML library that provided the 
dom tree directly.
+    b) the dom tree creation is basic and simple but good enough for the 
current format.
+       When the format should change substantially, then we may need a better 
parser.
+
+=cut
 sub ReadDomTree ($)
 {
     my ($filename) = @_;
@@ -182,6 +193,81 @@ sub ReadDomTree ($)
 
 
 
+=head HandleStartTag ($data, $expat, $element_name, @attributes)
+
+    Callback for start tags.
+
+    A new hash is appended to the array that is referenced by the parent by 
$element_name.
+    That means that when this function ends there the new hash can be 
referenced by
+        my $parent = $data->{'node_stack'}->[-1];
+        my $new_hash = $parent->{$element_name}->[-1];
+
+    Note that, just like in other implementations of dom trees,
+    $parent->{$element_name} is an array, even when there is only one
+    element.
+
+    The new hash is empty or contains the given @attributes as hash.
+    When fully read (ie its end tag has been processed) then it can contain 
two special keys:
+    __attributes__ for the attributes
+    __text__ for the concatenated text parts
+
+=cut
+sub HandleStartTag ($$$@)
+{
+    my ($data, $expat, $element_name, @attributes) = @_;
+
+    # Create new node with attributes.
+    my $node = {'__attributes__' => {@attributes}};
+
+    # Append it to the list of $element_name objects.
+    my $current_node = $data->{'current_node'};
+    $current_node->{$element_name} = [] unless defined 
$current_node->{$element_name};
+    push @{$current_node->{$element_name}}, $node;
+
+    # Make the new node the current node.
+    push @{$data->{'node_stack'}}, $current_node;
+    $data->{'current_node'} = $node;
+}
+
+=head HandleEndTag ($data, $expat, $element_name, @attributes)
+
+    Callback for end tags.
+
+=cut
+sub HandleEndTag ($$$)
+{
+    my ($data, $expat, $element) = @_;
+
+    # Restore the parent node as current node.
+    $data->{'current_node'} = pop @{$data->{'node_stack'}};
+}
+
+=head2 HandleText ($data, $expat, $text)
+
+    Callback for text.
+
+    $text is appended to the __text__ member of the current node in
+    the dom tree.
+
+=cut
+sub HandleText ($$$)
+{
+    my ($data, $expat, $text) = @_;
+    if ($text !~ /^\s*$/)
+    {
+        $data->{'current_node'}->{'__text__'} .= $text;
+    }
+}
+
+
+
+
+=head2 PrintNode ($indentation, $node)
+
+    For debugging.
+    Print $node recursively with initial $indentation.
+
+=cut
 sub PrintNode($$)
 {
     my ($indentation, $node) = @_;
@@ -223,39 +309,7 @@ sub PrintNode($$)
 }
 
 
-sub HandleStartTag ($$$@)
-{
-    my ($data, $expat, $element, @attributes) = @_;
 
-    # Create new node with attributes.
-    my $node = {'__attributes__' => {@attributes}};
-
-    # Append it to the list of $element objects.
-    my $current_node = $data->{'current_node'};
-    $current_node->{$element} = [] unless defined $current_node->{$element};
-    push @{$current_node->{$element}}, $node;
-
-    # Make the new node the current node.
-    push @{$data->{'node_stack'}}, $current_node;
-    $data->{'current_node'} = $node;
-}
-
-sub HandleEndTag ($$$)
-{
-    my ($data, $expat, $element) = @_;
-
-    # Restore the parent node as current node.
-    $data->{'current_node'} = pop @{$data->{'node_stack'}};
-}
-
-sub HandleText ($$$)
-{
-    my ($data, $expat, $text) = @_;
-    if ($text !~ /^\s*$/)
-    {
-        $data->{'current_node'}->{'__text__'} .= $text;
-    }
-}
 
 =head2 Read($self, $filename)
 
@@ -287,22 +341,26 @@ sub Read ($$)
 
         $self->{$version}->{$package_format}->{'upgrade-code'} = $upgrade_code;
         $self->{$version}->{$package_format}->{'build-id'} = $build_id;
+        $self->{$version}->{$package_format}->{'url-template'} = $url_template;
 
+        my @languages = ();
         foreach my $item_node (@{$download_node->{'item'}})
         {
             my ($language, $download_data) = ParseDownloadData($item_node, 
$url_template);
             if (defined $download_data && defined $language)
             {
+                push @languages, $language;
                 $self->{$version}->{$package_format}->{$language} = 
$download_data;
             }
         }
+        $self->{$version}->{$package_format}->{'languages'} = \@languages;
     }
 }
 
 
 
 
-=head2 ParseDownloadData ($download_node)
+=head2 ParseDownloadData ($item_node, $url_template)
 
     Parse the data for one set of download data (there is one per release and 
package format).
 
@@ -339,6 +397,119 @@ sub ParseDownloadData ($$)
 
 
 
+=head2 Write($self, $filename)
+
+    Write the content of the releases data to a file named $filename.
+
+=cut
+sub Write ($$)
+{
+    my ($self, $filename) = @_;
+
+    open my $out, ">", $filename || die "can not write releases data to 
".$filename;
+    $self->WriteHeader($out);
+    $self->WriteContent($out);
+    close $out;
+}
+
+
+
+
+=head2 WriteContent ($self, $out)
+
+    Write the content of the releases.xml list.
+
+=cut
+sub WriteContent ($$)
+{
+    my ($self, $out) = @_;
+
+    print $out "<releases>\n";
+    # Write the data sets for each releases with the same sort order as 
@{$self->{'releases'}}
+    foreach my $version (@{$self->{'releases'}})
+    {
+        print $out "  <release>\n";
+
+        my @version_array = split(/\./, $version);
+        printf $out "    <version>\n";
+        printf $out "      <major>%s</major>\n", $version_array[0];
+        printf $out "      <minor>%s</minor>\n", $version_array[1];
+        printf $out "      <micro>%s</micro>\n", $version_array[2];
+        printf $out "    </version>\n";
+
+        # Write one download data set per package format.
+        while (my ($package_format, $data) = each %{$self->{$version}})
+        {
+            print $out "    <download>\n";
+            printf $out "      <package-format>%s</package-format>\n", 
$package_format;
+            print $out "      <url-template>\n";
+            printf $out "        %s\n", $data->{'url-template'};
+            print $out "      </url-template>\n";
+            printf $out "      <upgrade-code>%s</upgrade-code>\n", 
$data->{'upgrade-code'};
+            printf $out "      <build-id>%s</build-id>\n", $data->{'build-id'};
+
+            foreach my $language (@{$data->{'languages'}})
+            {
+                my $language_data = $data->{$language};
+                print $out "      <item>\n";
+                printf $out "        <language>%s</language>\n", $language;
+                printf $out "        <checksum type=\"%s\">%s</checksum>\n",
+                    $language_data->{'checksum-type'},
+                    $language_data->{'checksum-value'};
+                printf $out "        <size>%s</size>\n", 
$language_data->{'file-size'};
+                printf $out "        <product-code>%s</product-code>\n", 
$language_data->{'product-code'};
+                print $out "      </item>\n";
+            }
+
+            print $out "    </download>\n";
+        }
+
+        print $out "    </release>\n";
+    }
+
+    print $out "</releases>\n";
+}
+
+
+
+
+=head2 WriteHeader ($self, $out)
+
+    Write the header for the releases.xml list.
+
+=cut
+sub WriteHeader ($$)
+{
+    my ($self, $out) = @_;
+
+print $out <<EOT;
+<?xml version='1.0' encoding='UTF-8'?>
+<!--***********************************************************
+ *
+ * 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.
+ *
+ ***********************************************************-->
+EOT
+}
+
+
+
+
 =head2 GetPreviousVersion($version)
 
     Look up $version in the sorted list of released versions.  Return
diff --git a/solenv/bin/patch_tool.pl b/solenv/bin/patch_tool.pl
index e75fcc5..e490df5 100644
--- a/solenv/bin/patch_tool.pl
+++ b/solenv/bin/patch_tool.pl
@@ -255,7 +255,10 @@ sub ProvideSourceInstallationSet ($$$)
         }
         else
         {
-            return 0 if ! installer::patch::Download($language, $release_data, 
$location, $basename, $filename);
+            return 0 if ! installer::patch::InstallationSet::Download(
+                $language,
+                $release_data,
+                $filename);
             return 0 if ! -f $filename;
         }
 
@@ -1121,6 +1124,12 @@ sub SetupPropertiesTable ($$)
     $table->SetRow(
         "*Name", "SEQUENCE_DATA_GENERATION_DISABLED",
         "Value", 1);
+
+    # We don't provide file size and hash values.
+    # This value is set to make this fact explicit (0 should be the default).
+    $table->SetRow(
+        "*Name", "TrustMsi",
+        "Value", 0);
 }
 
 
@@ -1357,6 +1366,19 @@ sub CreateMsp ($)
 
 
 
+
+=head CreatePatch($context, $variables)
+
+    Create MSP patch files for all relevant languages.
+    The different steps are:
+    1. Determine the set of languages for which both the source and target 
installation sets are present.
+    Per language:
+        2. Unpack CAB files (for source and target).
+        3. Check if source and target releases are compatible.
+        4. Create the PCP driver file.
+        5. Create the MSP patch file.
+
+=cut
 sub CreatePatch ($$)
 {
     my ($context, $variables) = @_;
@@ -1377,7 +1399,7 @@ sub CreatePatch ($$)
         ->{$context->{'source-version'}}
         ->{$context->{'package-format'}};
 
-    # Create a patch for each language.
+    # 1. Determine the set of languages for which we can create patches.
     my @requested_languages = GetLanguages();
     my @valid_languages = FindValidLanguages($context, $release_data, 
\@requested_languages);
     $installer::logger::Info->printf("of the requested languages '%s' are 
valid: '%s'\n",
@@ -1388,7 +1410,7 @@ sub CreatePatch ($$)
         $installer::logger::Info->printf("processing language '%s'\n", 
$language);
         $installer::logger::Info->increase_indentation();
 
-        # Provide .msi and .cab files and unpacke .cab for the source release.
+        # 2a. Provide .msi and .cab files and unpacke .cab for the source 
release.
         $installer::logger::Info->printf("locating source package (%s)\n", 
$context->{'source-version'});
         $installer::logger::Info->increase_indentation();
         if ( ! installer::patch::InstallationSet::ProvideUnpackedCab(
@@ -1409,7 +1431,7 @@ sub CreatePatch ($$)
 
         $installer::logger::Info->decrease_indentation();
 
-        # Provide .msi and .cab files and unpacke .cab for the target release.
+        # 2b. Provide .msi and .cab files and unpacke .cab for the target 
release.
         $installer::logger::Info->printf("locating target package (%s)\n", 
$context->{'target-version'});
         $installer::logger::Info->increase_indentation();
         if ( ! installer::patch::InstallationSet::ProvideUnpackedCab(
@@ -1438,7 +1460,7 @@ sub CreatePatch ($$)
             $installer::logger::Info->printf("read %s table (source and 
target\n", $table_name);
         }
 
-        # Check if the source and target msis fullfil all necessary 
requirements.
+        # 3. Check if the source and target msis fullfil all necessary 
requirements.
         if ( ! Check($source_msi, $target_msi, $variables, 
$context->{'product-name'}))
         {
             $installer::logger::Info->printf("Error: Source and target 
releases are not compatible.\n");
@@ -1467,7 +1489,7 @@ sub CreatePatch ($$)
             );
         File::Path::make_path($msp_path) unless -d $msp_path;
 
-        # Create the .pcp file that drives the msimsp.exe command.
+        # 4. Create the .pcp file that drives the msimsp.exe command.
         my $pcp = CreatePcp(
             $source_msi,
             $target_msi,
@@ -1475,12 +1497,9 @@ sub CreatePatch ($$)
             $context,
             $msp_path,
             $pcp_schema_filename,
-            "Properties/Name:DontRemoveTempFolderWhenFinished" => "Value:1",
-            "Properties/Name:SEQUENCE_DATA_GENERATION_DISABLED" => "Value:1",
-            "Properties/Name:TrustMsi" => "Value:0",
-            "Properties/Name:ProductName" => "Value:OOO341");
+            "Properties/Name:DontRemoveTempFolderWhenFinished" => "Value:1");
 
-        # Finally create the msp.
+        # 5. Finally create the msp.
         CreateMsp($pcp);
 
         $installer::logger::Info->decrease_indentation();
@@ -1489,7 +1508,12 @@ sub CreatePatch ($$)
 
 
 
+=cut ApplyPatch ($context, $variables)
 
+    This is for testing only.
+    The patch is applied and (extensive) log information is created and 
transformed into HTML format.
+
+=cut
 sub ApplyPatch ($$)
 {
     my ($context, $variables) = @_;
@@ -1547,10 +1571,244 @@ sub ApplyPatch ($$)
 
 
 
+=head2 DownloadFile ($url)
+
+    A simpler version of InstallationSet::Download().  It is simple because it 
is used to
+    setup the $release_data structure that is used by 
InstallationSet::Download().
+
+=cut
+sub DownloadFile ($)
+{
+    my ($url) = shift;
+
+    my $agent = LWP::UserAgent->new();
+    $agent->timeout(120);
+    $agent->show_progress(0);
+
+    my $file_content = "";
+    my $last_was_redirect = 0;
+    my $bytes_read = 0;
+    $agent->add_handler('response_redirect'
+        => sub{
+            $last_was_redirect = 1;
+            return;
+        });
+    $agent->add_handler('response_data'
+        => sub{
+            if ($last_was_redirect)
+            {
+                $last_was_redirect = 0;
+                # Throw away the data we got so far.
+        $file_content = "";
+            }
+            my($response,$agent,$h,$data)=@_;
+        $file_content .= $data;
+        });
+    $agent->get($url);
+
+    return $file_content;
+}
+
+
+
+
+sub CreateReleaseItem ($$$)
+{
+    my ($language, $exe_filename, $msi) = @_;
+
+    die "can not open installation set at ".$exe_filename unless -f 
$exe_filename;
+
+    open my $in, "<", $exe_filename;
+    my $sha256_checksum = new Digest("SHA-256")->addfile($in)->hexdigest();
+    close $in;
+
+    my $filesize = -s $exe_filename;
+
+    # Get the product code property from the msi and strip the enclosing 
braces.
+    my $product_code = $msi->GetTable("Property")->GetValue("Property", 
"ProductCode", "Value");
+    $product_code =~ s/(^{|}$)//g;
+    my $upgrade_code = $msi->GetTable("Property")->GetValue("Property", 
"UpgradeCode", "Value");
+    $upgrade_code =~ s/(^{|}$)//g;
+    my $build_id = $msi->GetTable("Property")->GetValue("Property", 
"PRODUCTBUILDID", "Value");
+
+    return {
+        'language' => $language,
+        'checksum-type' => "sha256",
+        'checksum-value' => $sha256_checksum,
+        'file-size' => $filesize,
+        'product-code' => $product_code,
+        'upgrade-code' => $upgrade_code,
+        'build-id' => $build_id
+    };
+}
+
+
+
+
+sub GetReleaseItemForCurrentBuild ($$$)
+{
+    my ($context, $language, $exe_basename) = @_;
+
+    # Target version is the current version.
+    # Search instsetoo_native for the installation set.
+    my $filename = File::Spec->catfile(
+        $context->{'output-path'},
+        $context->{'product-name'},
+        $context->{'package-format'},
+        "install",
+        $language."_download",
+        $exe_basename);
+
+    printf("        current : %s\n", $filename);
+    if ( ! -f $filename)
+    {
+        printf("ERROR: can not find %s\n", $filename);
+        return undef;
+    }
+    else
+    {
+        my $msi = installer::patch::Msi->FindAndCreate(
+            $context->{'target-version'},
+            1,
+            $language,
+            $context->{'product-name'});
+        return CreateReleaseItem($language, $filename, $msi);
+    }
+}
+
+
+
+sub GetReleaseItemForOldBuild ($$$$)
+{
+    my ($context, $language, $exe_basename, $url_template) = @_;
+
+    # Use ext_sources/ as local cache for archive.apache.org
+    # and search these for the installation set.
+
+    my $version = $context->{'target-version'};
+    my $package_format =  $context->{'package-format'};
+    my $releases_list = installer::patch::ReleasesList::Instance();
+
+    my $url = $url_template;
+    $url =~ s/%L/$language/g;
+    $releases_list->{$version}->{$package_format}->{$language}->{'URL'} = $url;
+
+    if ( ! installer::patch::InstallationSet::ProvideUnpackedExe(
+               $version,
+               0,
+               $language,
+               $package_format,
+               $context->{'product-name'}))
+    {
+        # Can not provide unpacked EXE.
+        return undef;
+    }
+    else
+    {
+        my $exe_filename = File::Spec->catfile(
+            $ENV{'TARFILE_LOCATION'},
+            $exe_basename);
+        my $msi = installer::patch::Msi->FindAndCreate(
+            $version,
+            0,
+            $language,
+            $context->{'product-name'});
+        return CreateReleaseItem($language, $exe_filename, $msi);
+    }
+}
+
+
+
+
+sub UpdateReleasesXML($$)
+{
+    my ($context, $variables) = @_;
+
+    my $releases_list = installer::patch::ReleasesList::Instance();
+    my $output_filename = File::Spec->catfile(
+        $context->{'output-path'},
+        "misc",
+        "releases.xml");
+
+    my $target_version = $context->{'target-version'};
+    my %version_hash = map {$_=>1} @{$releases_list->{'releases'}};
+    my $item_hash = undef;
+    if ( ! defined $version_hash{$context->{'target-version'}})
+    {
+        # Target version is not yet present.  Add it and print message that 
asks caller to check order.
+        push @{$releases_list->{'releases'}}, $target_version;
+        printf("adding data for new version %s to list of released 
versions.\n", $target_version);
+        printf("please check order of releases in $output_filename\n");
+        $item_hash = {};
+    }
+    else
+    {
+        printf("adding data for existing version %s to releases.xml\n", 
$target_version);
+        $item_hash = 
$releases_list->{$target_version}->{$context->{'package-format'}};
+    }
+    $releases_list->{$target_version} = {$context->{'package-format'} => 
$item_hash};
+
+    my @languages = GetLanguages();
+    my %language_items = ();
+    foreach my $language (@languages)
+    {
+        # There are three different sources where to find the downloadable 
installation sets.
+        # 1. archive.apache.org for previously released versions.
+        # 2. A local cache or repository directory that conceptually is a 
local copy of archive.apache.org
+        # 3. The downloadable installation sets built in instsetoo_native/.
+
+        my $exe_basename = sprintf(
+            "%s_%s_Win_x86_install_%s.exe",
+            $context->{'product-name'},
+            $target_version,
+            $language);
+        my $url_template = sprintf(
+            
"http://archive.apache.org/dist/openoffice/%s/binaries/%%L/%s_%s_Win_x86_install_%%L.exe";,
+            $target_version,
+            $context->{'product-name'},
+            $target_version);
+
+        my $item = undef;
+        if ($target_version eq $variables->{PRODUCTVERSION})
+        {
+            $item = GetReleaseItemForCurrentBuild($context, $language, 
$exe_basename);
+        }
+        else
+        {
+            $item = GetReleaseItemForOldBuild($context, $language, 
$exe_basename, $url_template);
+        }
+
+        next unless defined $item;
+
+        $language_items{$language} = $item;
+        $item_hash->{$language} = $item;
+        $item_hash->{'upgrade-code'} = $item->{'upgrade-code'};
+        $item_hash->{'build-id'} = $item->{'build-id'};
+        $item_hash->{'url-template'} = $url_template;
+    }
+
+    my @valid_languages = sort keys %language_items;
+    $item_hash->{'languages'} = \@valid_languages;
+
+    $releases_list->Write($output_filename);
+
+    printf("\n\n");
+    printf("please copy '%s' to main/instsetoo_native/data\n", 
$output_filename);
+    printf("and check in the modified file to the version control system\n");
+}
+
+
+
+
 sub main ()
 {
     installer::logger::SetupSimpleLogging(undef);
     my $context = ProcessCommandline();
+    die "ERROR: list file is not defined, please use --lst-file option"
+        unless defined $context->{'lst-file'};
+    die "ERROR: product name is not defined, please use --product-name option"
+        unless defined $context->{'product-name'};
+
     my ($variables, undef, undef) = 
installer::ziplist::read_openoffice_lst_file(
         $context->{'lst-file'},
         $context->{'product-name'},
@@ -1565,6 +1823,10 @@ sub main ()
     {
         ApplyPatch($context, $variables);
     }
+    elsif ($context->{'command'} eq "update-releases-xml")
+    {
+        UpdateReleasesXML($context, $variables);
+    }
 }
 
 
commit 5b1ff7a2b76d3eb7cf0760a7f424df34ebb99420
Author: Herbert Dürr <h...@apache.org>
Date:   Thu Dec 5 08:24:26 2013 +0000

    #i123808# support alternative build tool locations on Mac
    
    by setting the CC_PATH variable the compatibility of
    build tools with the active compiler can be enforced

diff --git a/solenv/bin/deliver.pl b/solenv/bin/deliver.pl
index ecb1453..801afd6 100755
--- a/solenv/bin/deliver.pl
+++ b/solenv/bin/deliver.pl
@@ -136,6 +136,7 @@ use sigtrap 'handler' => \&cleanup_and_die, 
'normal-signals';
 #### main ####
 
 parse_options();
+init_globals();
 
 print "$script_name -- version: $script_rev\n" if !$opt_silent;
 
@@ -149,7 +150,6 @@ if ( ! $opt_delete ) {
     }
 }
 
-init_globals();
 push_default_actions();
 parse_dlst();
 check_dlst() if $opt_checkdlst;
@@ -464,6 +464,8 @@ sub init_globals
     my $updminorext   = $ENV{'UPDMINOREXT'};
     my $work_stamp    = $ENV{'WORK_STAMP'};
 
+    $::CC_PATH=(fileparse( $ENV{"CC"}))[1];
+
     # special security check for release engineers
     if ( defined($updater) && !defined($build_sosl) && !$opt_force) {
         my $path = getcwd();
@@ -735,6 +737,7 @@ sub is_unstripped {
 sub initialize_strip {
     if ((!defined $ENV{DISABLE_STRIP}) || ($ENV{DISABLE_STRIP} eq "")) {
         $strip .= 'guw ' if ($^O eq 'cygwin');
+        $strip .= $::CC_PATH if (-e $::CC_PATH.'/strip');
         $strip .= 'strip';
         $strip .= " -x" if ($ENV{OS} eq 'MACOSX');
         $strip .= " -R '.comment' -s" if ($ENV{OS} eq 'LINUX');
diff --git a/solenv/bin/macosx-change-install-names.pl 
b/solenv/bin/macosx-change-install-names.pl
index 09ec20a..dd661d9 100644
--- a/solenv/bin/macosx-change-install-names.pl
+++ b/solenv/bin/macosx-change-install-names.pl
@@ -106,7 +106,7 @@ if ($type eq "extshl")
     {
         foreach $file (@ARGV)
         {
-            my $call = "install_name_tool$change -id 
\@loader_path/$inames{$file} $file";
+            my $call = "${::CC_PATH}install_name_tool$change -id 
\@loader_path/$inames{$file} $file";
             system($call) == 0 or die "cannot $call";
         }
     }
@@ -114,14 +114,14 @@ if ($type eq "extshl")
     {
         foreach $file (@ARGV)
         {
-            my $call = "install_name_tool$change -id 
\@__________________________________________________$loc/$inames{$file} $file";
+            my $call = "${::CC_PATH}install_name_tool$change -id 
\@__________________________________________________$loc/$inames{$file} $file";
             system($call) == 0 or die "cannot $call";
         }
     }
 }
 foreach $file (@ARGV)
 {
-    my $call = "otool -L $file";
+    my $call = "${::CC_PATH}otool -L $file";
     open(IN, "-|", $call) or die "cannot $call";
     my $change = "";
     while (<IN>)
@@ -132,7 +132,7 @@ foreach $file (@ARGV)
     close(IN);
     if ($change ne "")
     {
-        $call = "install_name_tool$change $file";
+        $call = "${::CC_PATH}install_name_tool$change $file";
         system($call) == 0 or die "cannot $call";
     }
 }
diff --git a/solenv/bin/macosx-dylib-link-list.pl 
b/solenv/bin/macosx-dylib-link-list.pl
index 469ba74..1580caa 100644
--- a/solenv/bin/macosx-dylib-link-list.pl
+++ b/solenv/bin/macosx-dylib-link-list.pl
@@ -64,7 +64,7 @@ foreach (@ARGV)
 }
 foreach $file (@todo)
 {
-    my $call = "otool -L $file";
+    my $call = "${::CC_PATH}otool -L $file";
     open(IN, "-|", $call) or die "cannot $call";
     while (<IN>)
     {
diff --git a/solenv/bin/modules/macosxotoolhelper.pm 
b/solenv/bin/modules/macosxotoolhelper.pm
index 4cf9019..fa2e9c0 100644
--- a/solenv/bin/modules/macosxotoolhelper.pm
+++ b/solenv/bin/modules/macosxotoolhelper.pm
@@ -26,6 +26,9 @@ require Exporter;
 our @ISA = Exporter;
 our @EXPORT = otoolD;
 
+use File::Basename;
+$::CC_PATH=(fileparse( $ENV{"CC"}))[1];
+
 sub otoolD($) {
     my ($file) = @_;
     my $call = "otool -D $file";
@@ -39,3 +42,4 @@ sub otoolD($) {
     close(IN);
     return $line;
 }
+
diff --git a/solenv/inc/_tg_app.mk b/solenv/inc/_tg_app.mk
index 5afa56c..c375edf 100644
--- a/solenv/inc/_tg_app.mk
+++ b/solenv/inc/_tg_app.mk
@@ -18,6 +18,9 @@
 #  under the License.
 #  
 # *************************************************************
+
+CC_PATH*=""
+
 # unroll begin
 
 .IF "$(GUI)" == "OS2" && "$(TARGETTYPE)" == "GUI" 
@@ -117,8 +120,8 @@ $(APP1TARGETN): $(APP1OBJS) $(APP1LIBS) \
     @+source $(MISC)/$(TARGET).$(@:b)_1.cmd
 # Need to strip __objcInit symbol to avoid duplicate symbols when loading
 # libraries at runtime
-    @-nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
-    @strip -i -R $(MISC)/$(@:b).strip -X $@
+    @-$(CC_PATH)nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
+    @$(CC_PATH)strip -i -R $(MISC)/$(@:b).strip -X $@
     @ls -l $@
     @$(PERL) $(SOLARENV)/bin/macosx-change-install-names.pl \
         app $(APP1RPATH) $@
@@ -377,8 +380,8 @@ $(APP2TARGETN): $(APP2OBJS) $(APP2LIBS) \
     @+source $(MISC)/$(TARGET).$(@:b)_2.cmd
 # Need to strip __objcInit symbol to avoid duplicate symbols when loading
 # libraries at runtime
-    @-nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
-    @strip -i -R $(MISC)/$(@:b).strip -X $@
+    @-$(CC_PATH)nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
+    @$(CC_PATH)strip -i -R $(MISC)/$(@:b).strip -X $@
     @ls -l $@
     @$(PERL) $(SOLARENV)/bin/macosx-change-install-names.pl \
         app $(APP2RPATH) $@
@@ -637,8 +640,8 @@ $(APP3TARGETN): $(APP3OBJS) $(APP3LIBS) \
     @+source $(MISC)/$(TARGET).$(@:b)_3.cmd
 # Need to strip __objcInit symbol to avoid duplicate symbols when loading
 # libraries at runtime
-    @-nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
-    @strip -i -R $(MISC)/$(@:b).strip -X $@
+    @-$(CC_PATH)nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
+    @$(CC_PATH)strip -i -R $(MISC)/$(@:b).strip -X $@
     @ls -l $@
     @$(PERL) $(SOLARENV)/bin/macosx-change-install-names.pl \
         app $(APP3RPATH) $@
@@ -897,8 +900,8 @@ $(APP4TARGETN): $(APP4OBJS) $(APP4LIBS) \
     @+source $(MISC)/$(TARGET).$(@:b)_4.cmd
 # Need to strip __objcInit symbol to avoid duplicate symbols when loading
 # libraries at runtime
-    @-nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
-    @strip -i -R $(MISC)/$(@:b).strip -X $@
+    @-$(CC_PATH)nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
+    @$(CC_PATH)strip -i -R $(MISC)/$(@:b).strip -X $@
     @ls -l $@
     @$(PERL) $(SOLARENV)/bin/macosx-change-install-names.pl \
         app $(APP4RPATH) $@
@@ -1157,8 +1160,8 @@ $(APP5TARGETN): $(APP5OBJS) $(APP5LIBS) \
     @+source $(MISC)/$(TARGET).$(@:b)_5.cmd
 # Need to strip __objcInit symbol to avoid duplicate symbols when loading
 # libraries at runtime
-    @-nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
-    @strip -i -R $(MISC)/$(@:b).strip -X $@
+    @-$(CC_PATH)nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
+    @$(CC_PATH)strip -i -R $(MISC)/$(@:b).strip -X $@
     @ls -l $@
     @$(PERL) $(SOLARENV)/bin/macosx-change-install-names.pl \
         app $(APP5RPATH) $@
@@ -1417,8 +1420,8 @@ $(APP6TARGETN): $(APP6OBJS) $(APP6LIBS) \
     @+source $(MISC)/$(TARGET).$(@:b)_6.cmd
 # Need to strip __objcInit symbol to avoid duplicate symbols when loading
 # libraries at runtime
-    @-nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
-    @strip -i -R $(MISC)/$(@:b).strip -X $@
+    @-$(CC_PATH)nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
+    @$(CC_PATH)strip -i -R $(MISC)/$(@:b).strip -X $@
     @ls -l $@
     @$(PERL) $(SOLARENV)/bin/macosx-change-install-names.pl \
         app $(APP6RPATH) $@
@@ -1677,8 +1680,8 @@ $(APP7TARGETN): $(APP7OBJS) $(APP7LIBS) \
     @+source $(MISC)/$(TARGET).$(@:b)_7.cmd
 # Need to strip __objcInit symbol to avoid duplicate symbols when loading
 # libraries at runtime
-    @-nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
-    @strip -i -R $(MISC)/$(@:b).strip -X $@
+    @-$(CC_PATH)nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
+    @$(CC_PATH)strip -i -R $(MISC)/$(@:b).strip -X $@
     @ls -l $@
     @$(PERL) $(SOLARENV)/bin/macosx-change-install-names.pl \
         app $(APP7RPATH) $@
@@ -1937,8 +1940,8 @@ $(APP8TARGETN): $(APP8OBJS) $(APP8LIBS) \
     @+source $(MISC)/$(TARGET).$(@:b)_8.cmd
 # Need to strip __objcInit symbol to avoid duplicate symbols when loading
 # libraries at runtime
-    @-nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
-    @strip -i -R $(MISC)/$(@:b).strip -X $@
+    @-$(CC_PATH)nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
+    @$(CC_PATH)strip -i -R $(MISC)/$(@:b).strip -X $@
     @ls -l $@
     @$(PERL) $(SOLARENV)/bin/macosx-change-install-names.pl \
         app $(APP8RPATH) $@
@@ -2197,8 +2200,8 @@ $(APP9TARGETN): $(APP9OBJS) $(APP9LIBS) \
     @+source $(MISC)/$(TARGET).$(@:b)_9.cmd
 # Need to strip __objcInit symbol to avoid duplicate symbols when loading
 # libraries at runtime
-    @-nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
-    @strip -i -R $(MISC)/$(@:b).strip -X $@
+    @-$(CC_PATH)nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
+    @$(CC_PATH)strip -i -R $(MISC)/$(@:b).strip -X $@
     @ls -l $@
     @$(PERL) $(SOLARENV)/bin/macosx-change-install-names.pl \
         app $(APP9RPATH) $@
@@ -2457,8 +2460,8 @@ $(APP10TARGETN): $(APP10OBJS) $(APP10LIBS) \
     @+source $(MISC)/$(TARGET).$(@:b)_10.cmd
 # Need to strip __objcInit symbol to avoid duplicate symbols when loading
 # libraries at runtime
-    @-nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
-    @strip -i -R $(MISC)/$(@:b).strip -X $@
+    @-$(CC_PATH)nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
+    @$(CC_PATH)strip -i -R $(MISC)/$(@:b).strip -X $@
     @ls -l $@
     @$(PERL) $(SOLARENV)/bin/macosx-change-install-names.pl \
         app $(APP10RPATH) $@
diff --git a/solenv/inc/tg_app.mk b/solenv/inc/tg_app.mk
index a35acee..3c0768e 100644
--- a/solenv/inc/tg_app.mk
+++ b/solenv/inc/tg_app.mk
@@ -19,7 +19,7 @@
 #  
 #**************************************************************
 
-
+CC_PATH*=""
 
 #######################################################
 # instructions for linking
@@ -122,8 +122,8 @@ $(APP$(TNR)TARGETN): $(APP$(TNR)OBJS) $(APP$(TNR)LIBS) \
     @+source $(MISC)/$(TARGET).$(@:b)_$(TNR).cmd
 # Need to strip __objcInit symbol to avoid duplicate symbols when loading
 # libraries at runtime
-    @-nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
-    @strip -i -R $(MISC)/$(@:b).strip -X $@
+    @-$(CC_PATH)nm $@ | grep -v ' U ' | $(AWK) '{ print $$NF }' | grep -F -x 
'__objcInit' > $(MISC)/$(@:b).strip
+    @$(CC_PATH)strip -i -R $(MISC)/$(@:b).strip -X $@
     @ls -l $@
     @$(PERL) $(SOLARENV)/bin/macosx-change-install-names.pl \
         app $(APP$(TNR)RPATH) $@
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to