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 (at] 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 41 use FileHandle; 42 43 sub 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 53 my $header_done = 0; 54 my ($target_file,$patch_file) = ('',''); 55 my $source_patch = $ARGV[0]; 56 my $srcdir = $ARGV[1]; 57 my $ed = $ARGV[2]; 58 $srcdir = "$srcdir/" unless $srcdir =~ m|/$|; 59 my $pfh = new FileHandle($source_patch, 'r'); 60 while(<$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 84 do_patch $ed, $target_file, $patch_file, $fh; 85