1#!/bin/perl 2# ***** BEGIN LICENSE BLOCK ***** 3# Version: MPL 1.1/GPL 2.0/LGPL 2.1 4# 5# The contents of this file are subject to the Mozilla Public License Version 6# 1.1 (the "License"); you may not use this file except in compliance with 7# the License. You may obtain a copy of the License at 8# http://www.mozilla.org/MPL/ 9# 10# Software distributed under the License is distributed on an "AS IS" basis, 11# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 12# for the specific language governing rights and limitations under the 13# License. 14# 15# The Original Code is Mozilla build system. 16# 17# The Initial Developer of the Original Code is 18# Mozilla Foundation. 19# Portions created by the Initial Developer are Copyright (C) 2008 20# the Initial Developer. All Rights Reserved. 21# 22# Contributor(s): 23# Ted Mielczarek <ted.mielczarek@gmail.com> 24# 25# Alternatively, the contents of this file may be used under the terms of 26# either the GNU General Public License Version 2 or later (the "GPL"), or 27# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 28# in which case the provisions of the GPL or the LGPL are applicable instead 29# of those above. If you wish to allow use of your version of this file only 30# under the terms of either the GPL or the LGPL, and not to allow others to 31# use your version of this file under the terms of the MPL, indicate your 32# decision by deleting the provisions above and replace them with the notice 33# and other provisions required by the GPL or the LGPL. If you do not delete 34# the provisions above, a recipient may use your version of this file under 35# the terms of any one of the MPL, the GPL or the LGPL. 36# 37# ***** END LICENSE BLOCK ***** 38 39# Usage: apply-ed-patches.pl <source patch> <target directory> <path to ed> 40 41use FileHandle; 42 43sub do_patch { 44 my ($ed, $target_file, $patch_file, $fh) = @_; 45 # these keep winding up read only for me 46 chmod 0666, $target_file; 47 print $fh "w\n"; 48 $fh->close(); 49 print "$ed -s $target_file < $patch_file\n"; 50 system "$ed -s $target_file < $patch_file\n"; 51} 52 53my $header_done = 0; 54my ($target_file,$patch_file) = ('',''); 55my $source_patch = $ARGV[0]; 56my $srcdir = $ARGV[1]; 57my $ed = $ARGV[2]; 58$srcdir = "$srcdir/" unless $srcdir =~ m|/$|; 59my $pfh = new FileHandle($source_patch, 'r'); 60while(<$pfh>) { 61 # skip initial comment header 62 next if !$header_done && /^#/; 63 $header_done = 1; 64 65 next if /^Only in/; 66 if (/^diff -re (\S+)/) { 67 my $new_file = $1; 68 $new_file =~ s|^crt/src/||; 69 $new_file = "$srcdir$new_file"; 70 my $new_patch_file = "$new_file.patch"; 71 72 if ($target_file ne '') { 73 do_patch $ed, $target_file, $patch_file, $fh; 74 } 75 $target_file = $new_file; 76 $patch_file = $new_patch_file; 77 $fh = new FileHandle($patch_file, 'w'); 78 next; 79 } 80 81 print $fh $_ if $fh; 82} 83 84do_patch $ed, $target_file, $patch_file, $fh; 85