| #!/usr/bin/perl -0777 -pi |
| |
| # Update b4_copyright invocations or b4_copyright_years definitions to |
| # include the current year. |
| |
| # Copyright (C) 2009-2012 Free Software Foundation, Inc. |
| |
| # This program is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; either version 3, or (at your option) |
| # any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| |
| use strict; |
| use warnings; |
| |
| my $margin = 72; |
| |
| my $this_year = $ENV{UPDATE_COPYRIGHT_YEAR}; |
| if (!$this_year || $this_year !~ m/^\d{4}$/) |
| { |
| my ($sec, $min, $hour, $mday, $month, $year) = localtime (time ()); |
| $this_year = $year + 1900; |
| } |
| my $old_re = <<'EOF' |
| ( |
| (?:^|\n) |
| #BEFORE |
| (?: |
| b4_copyright\(\[[^][]*] |
| | m4_(?:push|pop)def\(\[b4_copyright_years] |
| ) |
| #AFTER |
| ) |
| (?: |
| ,\s* |
| ( |
| \[\s* (?:\d{4}(?:,\s*|-))* (\d{4}) \s*] |
| ) |
| )? |
| \) |
| EOF |
| ; |
| |
| while (/($old_re)/gx) |
| { |
| my $start = pos() - length ($1); |
| my $b4_copyright_line = $2; |
| my $year_lines = $3; |
| my $final_year = $4; |
| $year_lines .= ')'; |
| |
| # If there was a second argument, it contains years, so update them. |
| if ($final_year) |
| { |
| $b4_copyright_line .= ','; |
| if ($final_year != $this_year) |
| { |
| # Update the year. |
| $year_lines =~ s/$final_year/$final_year, $this_year/; |
| } |
| |
| # Normalize all whitespace. |
| $year_lines =~ s/\s+/ /g; |
| |
| # Put spaces after commas. |
| $year_lines =~ s/, ?/, /g; |
| |
| # Compress to intervals. |
| $year_lines =~ |
| s/ |
| (\d{4}) |
| (?: |
| (,\ |-) |
| ((??{ |
| if ($2 eq '-') { '\d{4}'; } |
| elsif (!$3) { $1 + 1; } |
| else { $3 + 1; } |
| })) |
| )+ |
| /$1-$3/gx; |
| |
| # Format within margin. |
| my $year_lines_new; |
| my $indent = index ($b4_copyright_line, '['); |
| --$indent if ($b4_copyright_line =~ m/^\n/); |
| while (length $year_lines) |
| { |
| my $text_margin = $margin - $indent; |
| if (($year_lines =~ s/^(.{1,$text_margin})(?: |$)//) |
| || ($year_lines =~ s/^([\S]+)(?: |$)//)) |
| { |
| my $line = "\n" . (' 'x$indent) . $1; |
| ++$indent if (!$year_lines_new); |
| $year_lines_new .= $line; |
| } |
| else |
| { |
| # Should be unreachable, but we don't want an infinite |
| # loop if it can be reached. |
| die; |
| } |
| } |
| |
| # Replace the old invocation. Should never die. |
| die if (!s/$old_re\G/$b4_copyright_line$year_lines_new/x); |
| |
| # Prepare for the next search. |
| pos () = $start + length ("$b4_copyright_line$year_lines_new"); |
| } |
| } |
| |
| while (/(\bb4_copyright\()/g) |
| { |
| my $start = pos () - length ($1); |
| my $end = pos (); |
| my $re = $old_re; |
| pos () = $start; |
| $re =~ s/\#BEFORE/\\G/; |
| if (!/$re/x) |
| { |
| my $line = (substr ($_, 0, $start) =~ s/\n/\n/g) + 1; |
| print STDERR |
| "$ARGV:$line: warning: failed to update a b4_copyright\n"; |
| } |
| pos () = $end; |
| } |
| |
| while (/(\[b4_copyright_years])/g) |
| { |
| my $start = pos () - length ($1); |
| my $end = pos (); |
| my $re = $old_re; |
| $re =~ s/\#AFTER/\\G/; |
| if (!/$re/x) |
| { |
| # The substr operation blows away pos (), so restoring pos () |
| # at the end is necessary. |
| my $line = (substr ($_, 0, $start) =~ s/\n/\n/g) + 1; |
| print STDERR |
| "$ARGV:$line: warning: failed to update a" |
| . " b4_copyright_years\n"; |
| } |
| pos () = $end; |
| } |