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