105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#!/usr/bin/perl -0777 -pi 205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Update b4_copyright invocations or b4_copyright_years definitions to 405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include the current year. 505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Copyright (C) 2009-2012 Free Software Foundation, Inc. 705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This program is free software; you can redistribute it and/or modify 905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# it under the terms of the GNU General Public License as published by 1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the Free Software Foundation; either version 3, or (at your option) 1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# any later version. 1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# 1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This program is distributed in the hope that it will be useful, 1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# but WITHOUT ANY WARRANTY; without even the implied warranty of 1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# GNU General Public License for more details. 1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# 1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# You should have received a copy of the GNU General Public License 1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# along with this program. If not, see <http://www.gnu.org/licenses/>. 2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2105436638acc7c010349a69c3395f1a57c642dc62Ying Wanguse strict; 2205436638acc7c010349a69c3395f1a57c642dc62Ying Wanguse warnings; 2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2405436638acc7c010349a69c3395f1a57c642dc62Ying Wangmy $margin = 72; 2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2605436638acc7c010349a69c3395f1a57c642dc62Ying Wangmy $this_year = $ENV{UPDATE_COPYRIGHT_YEAR}; 2705436638acc7c010349a69c3395f1a57c642dc62Ying Wangif (!$this_year || $this_year !~ m/^\d{4}$/) 2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang my ($sec, $min, $hour, $mday, $month, $year) = localtime (time ()); 3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang $this_year = $year + 1900; 3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 3205436638acc7c010349a69c3395f1a57c642dc62Ying Wangmy $old_re = <<'EOF' 3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang ( 3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang (?:^|\n) 3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang #BEFORE 3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang (?: 3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang b4_copyright\(\[[^][]*] 3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang | m4_(?:push|pop)def\(\[b4_copyright_years] 3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang ) 4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang #AFTER 4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang ) 4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang (?: 4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang ,\s* 4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang ( 4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang \[\s* (?:\d{4}(?:,\s*|-))* (\d{4}) \s*] 4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang ) 4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang )? 4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang \) 4905436638acc7c010349a69c3395f1a57c642dc62Ying WangEOF 5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang ; 5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 5205436638acc7c010349a69c3395f1a57c642dc62Ying Wangwhile (/($old_re)/gx) 5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $start = pos() - length ($1); 5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $b4_copyright_line = $2; 5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $year_lines = $3; 5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $final_year = $4; 5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang $year_lines .= ')'; 5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang # If there was a second argument, it contains years, so update them. 6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang if ($final_year) 6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang $b4_copyright_line .= ','; 6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if ($final_year != $this_year) 6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang # Update the year. 6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang $year_lines =~ s/$final_year/$final_year, $this_year/; 6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang # Normalize all whitespace. 7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang $year_lines =~ s/\s+/ /g; 7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang # Put spaces after commas. 7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang $year_lines =~ s/, ?/, /g; 7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang # Compress to intervals. 7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang $year_lines =~ 7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang s/ 7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang (\d{4}) 8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang (?: 8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang (,\ |-) 8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang ((??{ 8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if ($2 eq '-') { '\d{4}'; } 8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang elsif (!$3) { $1 + 1; } 8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang else { $3 + 1; } 8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang })) 8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang )+ 8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /$1-$3/gx; 8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang # Format within margin. 9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $year_lines_new; 9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $indent = index ($b4_copyright_line, '['); 9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang --$indent if ($b4_copyright_line =~ m/^\n/); 9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang while (length $year_lines) 9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $text_margin = $margin - $indent; 9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (($year_lines =~ s/^(.{1,$text_margin})(?: |$)//) 9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang || ($year_lines =~ s/^([\S]+)(?: |$)//)) 9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $line = "\n" . (' 'x$indent) . $1; 10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang ++$indent if (!$year_lines_new); 10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang $year_lines_new .= $line; 10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang # Should be unreachable, but we don't want an infinite 10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang # loop if it can be reached. 10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang die; 10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang # Replace the old invocation. Should never die. 11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang die if (!s/$old_re\G/$b4_copyright_line$year_lines_new/x); 11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang # Prepare for the next search. 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang pos () = $start + length ("$b4_copyright_line$year_lines_new"); 11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wangwhile (/(\bb4_copyright\()/g) 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $start = pos () - length ($1); 12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $end = pos (); 12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $re = $old_re; 12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang pos () = $start; 12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang $re =~ s/\#BEFORE/\\G/; 12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!/$re/x) 12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $line = (substr ($_, 0, $start) =~ s/\n/\n/g) + 1; 13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang print STDERR 13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang "$ARGV:$line: warning: failed to update a b4_copyright\n"; 13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang pos () = $end; 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13605436638acc7c010349a69c3395f1a57c642dc62Ying Wangwhile (/(\[b4_copyright_years])/g) 13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $start = pos () - length ($1); 13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $end = pos (); 14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $re = $old_re; 14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang $re =~ s/\#AFTER/\\G/; 14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!/$re/x) 14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang # The substr operation blows away pos (), so restoring pos () 14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang # at the end is necessary. 14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang my $line = (substr ($_, 0, $start) =~ s/\n/\n/g) + 1; 14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang print STDERR 14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang "$ARGV:$line: warning: failed to update a" 14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang . " b4_copyright_years\n"; 15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang pos () = $end; 15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 153