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