1 #!/usr/bin/perl -0777 -pi 2 3 # Update b4_copyright invocations or b4_copyright_years definitions to 4 # include the current year. 5 6 # Copyright (C) 2009-2012 Free Software Foundation, Inc. 7 8 # This program is free software; you can redistribute it and/or modify 9 # it under the terms of the GNU General Public License as published by 10 # the Free Software Foundation; either version 3, or (at your option) 11 # any later version. 12 # 13 # This program is distributed in the hope that it will be useful, 14 # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 # GNU General Public License for more details. 17 # 18 # You should have received a copy of the GNU General Public License 19 # along with this program. If not, see <http://www.gnu.org/licenses/>. 20 21 use strict; 22 use warnings; 23 24 my $margin = 72; 25 26 my $this_year = $ENV{UPDATE_COPYRIGHT_YEAR}; 27 if (!$this_year || $this_year !~ m/^\d{4}$/) 28 { 29 my ($sec, $min, $hour, $mday, $month, $year) = localtime (time ()); 30 $this_year = $year + 1900; 31 } 32 my $old_re = <<'EOF' 33 ( 34 (?:^|\n) 35 #BEFORE 36 (?: 37 b4_copyright\(\[[^][]*] 38 | m4_(?:push|pop)def\(\[b4_copyright_years] 39 ) 40 #AFTER 41 ) 42 (?: 43 ,\s* 44 ( 45 \[\s* (?:\d{4}(?:,\s*|-))* (\d{4}) \s*] 46 ) 47 )? 48 \) 49 EOF 50 ; 51 52 while (/($old_re)/gx) 53 { 54 my $start = pos() - length ($1); 55 my $b4_copyright_line = $2; 56 my $year_lines = $3; 57 my $final_year = $4; 58 $year_lines .= ')'; 59 60 # If there was a second argument, it contains years, so update them. 61 if ($final_year) 62 { 63 $b4_copyright_line .= ','; 64 if ($final_year != $this_year) 65 { 66 # Update the year. 67 $year_lines =~ s/$final_year/$final_year, $this_year/; 68 } 69 70 # Normalize all whitespace. 71 $year_lines =~ s/\s+/ /g; 72 73 # Put spaces after commas. 74 $year_lines =~ s/, ?/, /g; 75 76 # Compress to intervals. 77 $year_lines =~ 78 s/ 79 (\d{4}) 80 (?: 81 (,\ |-) 82 ((??{ 83 if ($2 eq '-') { '\d{4}'; } 84 elsif (!$3) { $1 + 1; } 85 else { $3 + 1; } 86 })) 87 )+ 88 /$1-$3/gx; 89 90 # Format within margin. 91 my $year_lines_new; 92 my $indent = index ($b4_copyright_line, '['); 93 --$indent if ($b4_copyright_line =~ m/^\n/); 94 while (length $year_lines) 95 { 96 my $text_margin = $margin - $indent; 97 if (($year_lines =~ s/^(.{1,$text_margin})(?: |$)//) 98 || ($year_lines =~ s/^([\S]+)(?: |$)//)) 99 { 100 my $line = "\n" . (' 'x$indent) . $1; 101 ++$indent if (!$year_lines_new); 102 $year_lines_new .= $line; 103 } 104 else 105 { 106 # Should be unreachable, but we don't want an infinite 107 # loop if it can be reached. 108 die; 109 } 110 } 111 112 # Replace the old invocation. Should never die. 113 die if (!s/$old_re\G/$b4_copyright_line$year_lines_new/x); 114 115 # Prepare for the next search. 116 pos () = $start + length ("$b4_copyright_line$year_lines_new"); 117 } 118 } 119 120 while (/(\bb4_copyright\()/g) 121 { 122 my $start = pos () - length ($1); 123 my $end = pos (); 124 my $re = $old_re; 125 pos () = $start; 126 $re =~ s/\#BEFORE/\\G/; 127 if (!/$re/x) 128 { 129 my $line = (substr ($_, 0, $start) =~ s/\n/\n/g) + 1; 130 print STDERR 131 "$ARGV:$line: warning: failed to update a b4_copyright\n"; 132 } 133 pos () = $end; 134 } 135 136 while (/(\[b4_copyright_years])/g) 137 { 138 my $start = pos () - length ($1); 139 my $end = pos (); 140 my $re = $old_re; 141 $re =~ s/\#AFTER/\\G/; 142 if (!/$re/x) 143 { 144 # The substr operation blows away pos (), so restoring pos () 145 # at the end is necessary. 146 my $line = (substr ($_, 0, $start) =~ s/\n/\n/g) + 1; 147 print STDERR 148 "$ARGV:$line: warning: failed to update a" 149 . " b4_copyright_years\n"; 150 } 151 pos () = $end; 152 } 153