xref: /aoo42x/main/solenv/bin/replace_in_zip.pl (revision c667dd47)
1bf28f449SAndre Fischer#**************************************************************
2bf28f449SAndre Fischer#
3bf28f449SAndre Fischer#  Licensed to the Apache Software Foundation (ASF) under one
4bf28f449SAndre Fischer#  or more contributor license agreements.  See the NOTICE file
5bf28f449SAndre Fischer#  distributed with this work for additional information
6bf28f449SAndre Fischer#  regarding copyright ownership.  The ASF licenses this file
7bf28f449SAndre Fischer#  to you under the Apache License, Version 2.0 (the
8bf28f449SAndre Fischer#  "License"); you may not use this file except in compliance
9bf28f449SAndre Fischer#  with the License.  You may obtain a copy of the License at
10bf28f449SAndre Fischer#
11bf28f449SAndre Fischer#    http://www.apache.org/licenses/LICENSE-2.0
12bf28f449SAndre Fischer#
13bf28f449SAndre Fischer#  Unless required by applicable law or agreed to in writing,
14bf28f449SAndre Fischer#  software distributed under the License is distributed on an
15bf28f449SAndre Fischer#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16bf28f449SAndre Fischer#  KIND, either express or implied.  See the License for the
17bf28f449SAndre Fischer#  specific language governing permissions and limitations
18bf28f449SAndre Fischer#  under the License.
19bf28f449SAndre Fischer#
20bf28f449SAndre Fischer#**************************************************************
21bf28f449SAndre Fischer
22*c667dd47SPedro Giffuni#!/usr/bin/env perl
23bf28f449SAndre Fischer
24bf28f449SAndre Fischeruse Archive::Zip;
25bf28f449SAndre Fischer
26bf28f449SAndre Fischeruse strict;
27bf28f449SAndre Fischeruse warnings;
28bf28f449SAndre Fischer
29bf28f449SAndre Fischer=head NAME
30bf28f449SAndre Fischer
31bf28f449SAndre Fischer    replace_in_zip.pl  -  Replace a file in a zip file with another file on disk.
32bf28f449SAndre Fischer
33bf28f449SAndre Fischer=head SYNOPSIS
34bf28f449SAndre Fischer
35bf28f449SAndre Fischer    replace_in_zip.pl <zip-file> <zip-entry-path> <replacement-path> <image-name>+
36bf28f449SAndre Fischer
37bf28f449SAndre Fischer=cut
38bf28f449SAndre Fischer
39bf28f449SAndre Fischer
40bf28f449SAndre Fischersub main (@)
41bf28f449SAndre Fischer{
42bf28f449SAndre Fischer    my ($zip_filename, $entry_path, $replacement_path, @image_names) = @_;
43bf28f449SAndre Fischer
44bf28f449SAndre Fischer    if (scalar @image_names == 0)
45bf28f449SAndre Fischer    {
46bf28f449SAndre Fischer        die "usage: replace_in_zip.pl <zip-file> <zip-entry-path> <replacement-path> <image-name>+";
47bf28f449SAndre Fischer    }
48bf28f449SAndre Fischer
49bf28f449SAndre Fischer    # Open the archive.
50bf28f449SAndre Fischer    my $zip = Archive::Zip->new();
51bf28f449SAndre Fischer    if ( ! -f $zip_filename || $zip->read($zip_filename) != Archive::Zip::AZ_OK)
52bf28f449SAndre Fischer    {
53bf28f449SAndre Fischer        die "can not open zip file $zip_filename";
54bf28f449SAndre Fischer    }
55bf28f449SAndre Fischer
56bf28f449SAndre Fischer    $entry_path .= "/" unless $entry_path =~ /\/$/;
57bf28f449SAndre Fischer    $replacement_path .= "/" unless $replacement_path =~ /\/$/;
58bf28f449SAndre Fischer
59bf28f449SAndre Fischer    foreach my $image_basename (@image_names)
60bf28f449SAndre Fischer    {
61bf28f449SAndre Fischer        printf "replacing %s\n", $image_basename;
62bf28f449SAndre Fischer
63bf28f449SAndre Fischer        # Get access to the entry.
64bf28f449SAndre Fischer        my $entry_name = $entry_path . $image_basename;
65bf28f449SAndre Fischer        my $member = $zip->memberNamed($entry_name);
66bf28f449SAndre Fischer        die "can not access entry $entry_name" unless defined $member;
67bf28f449SAndre Fischer
68bf28f449SAndre Fischer        # Check the replacement file.
69bf28f449SAndre Fischer        my $replacement_filename = $replacement_path . $image_basename;
70bf28f449SAndre Fischer        die "can not read the replacement $replacement_filename"
71bf28f449SAndre Fischer            unless -f $replacement_filename;
72bf28f449SAndre Fischer
73bf28f449SAndre Fischer        # Make the replacement.
74bf28f449SAndre Fischer        $zip->removeMember($member);
75bf28f449SAndre Fischer        my $new_member = $zip->addFile($replacement_filename, $entry_name);
76bf28f449SAndre Fischer        die "replacing failed" unless defined $new_member;
77bf28f449SAndre Fischer    }
78bf28f449SAndre Fischer
79bf28f449SAndre Fischer    # Write zip back to file.
80bf28f449SAndre Fischer    printf "writing archive back to disk\n";
81bf28f449SAndre Fischer    if ($zip->overwrite() != Archive::Zip::AZ_OK)
82bf28f449SAndre Fischer    {
83bf28f449SAndre Fischer        die "writing zip back to disk failed";
84bf28f449SAndre Fischer    }
85bf28f449SAndre Fischer}
86bf28f449SAndre Fischer
87bf28f449SAndre Fischermain(@ARGV);
88