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