#!/bin/sh
#! -*-perl-*-

# Update an FSF copyright year list to include the current year.

# Copyright (C) 2009-2022 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 <https://www.gnu.org/licenses/>.
#
# Written by Jim Meyering and Joel E. Denny

# This script updates an FSF copyright year list to include the current year.
# Usage: update-copyright [FILE...]
#
# The arguments to this script should be names of files that contain
# copyright statements to be updated.  The copyright holder's name
# defaults to "Free Software Foundation, Inc." but may be changed to
# any other name by using the "UPDATE_COPYRIGHT_HOLDER" environment
# variable.
#
# For example, you might wish to use the update-copyright target rule
# in maint.mk from gnulib's maintainer-makefile module.
#
# Iff a copyright statement is recognized in a file and the final
# year is not the current year, then the statement is updated for the
# new year and it is reformatted to:
#
#   1. Fit within 72 columns.
#   2. Convert 2-digit years to 4-digit years by prepending "19".
#   3. Expand copyright year intervals.  (See "Environment variables"
#      below.)
#
# A warning is printed for every file for which no copyright
# statement is recognized.
#
# Each file's copyright statement must be formatted correctly in
# order to be recognized.  For example, each of these is fine:
#
#   Copyright @copyright{} 1990-2005, 2007-2009 Free Software
#   Foundation, Inc.
#
#   # Copyright (C) 1990-2005, 2007-2009 Free Software
#   # Foundation, Inc.
#
#   /*
#    * Copyright &copy; 90,2005,2007-2009
#    * Free Software Foundation, Inc.
#    */
#
# However, the following format is not recognized because the line
# prefix changes after the first line:
#
#   ## Copyright (C) 1990-2005, 2007-2009 Free Software
#   #  Foundation, Inc.
#
# However, any correctly formatted copyright statement following
# a non-matching copyright statements would be recognized.
#
# The exact conditions that a file's copyright statement must meet
# to be recognized are:
#
#   1. It is the first copyright statement that meets all of the
#      following conditions.  Subsequent copyright statements are
#      ignored.
#   2. Its format is "Copyright (C)", then a list of copyright years,
#      and then the name of the copyright holder.
#   3. The "(C)" takes one of the following forms or is omitted
#      entirely:
#
#        A. (C)
#        B. (c)
#        C. @copyright{}
#        D. &copy;
#        E. ©
#
#   4. The "Copyright" appears at the beginning of a line, except that it
#      may be prefixed by any sequence (e.g., a comment) of no more than
#      5 characters -- including white space.
#   5. Iff such a prefix is present, the same prefix appears at the
#      beginning of each remaining line within the FSF copyright
#      statement.  There is one exception in order to support C-style
#      comments: if the first line's prefix contains nothing but
#      whitespace surrounding a "/*", then the prefix for all subsequent
#      lines is the same as the first line's prefix except with each of
#      "/" and possibly "*" replaced by a " ".  The replacement of "*"
#      by " " is consistent throughout all subsequent lines.
#   6. Blank lines, even if preceded by the prefix, do not appear
#      within the FSF copyright statement.
#   7. Each copyright year is 2 or 4 digits, and years are separated by
#      commas, "-", or "--".  Whitespace may appear after commas.
#
# Environment variables:
#
#   1. If UPDATE_COPYRIGHT_FORCE=1, a recognized FSF copyright statement
#      is reformatted even if it does not need updating for the new
#      year.  If unset or set to 0, only updated FSF copyright
#      statements are reformatted.
#   2. If UPDATE_COPYRIGHT_USE_INTERVALS=1, every series of consecutive
#      copyright years (such as 90, 1991, 1992-2007, 2008) in a
#      reformatted FSF copyright statement is collapsed to a single
#      interval (such as 1990-2008).  If unset or set to 0, all existing
#      copyright year intervals in a reformatted FSF copyright statement
#      are expanded instead.
#      If UPDATE_COPYRIGHT_USE_INTERVALS=2, convert a sequence with gaps
#      to the minimal containing range.  For example, convert
#      2000, 2004-2007, 2009 to 2000-2009.
#   3. For testing purposes, you can set the assumed current year in
#      UPDATE_COPYRIGHT_YEAR.
#   4. The default maximum line length for a copyright line is 72.
#      Set UPDATE_COPYRIGHT_MAX_LINE_LENGTH to use a different length.
#   5. Set UPDATE_COPYRIGHT_HOLDER if the copyright holder is other
#      than "Free Software Foundation, Inc.".

# This is a prologue that allows to run a perl script as an executable
# on systems that are compliant to a POSIX version before POSIX:2017.
# On such systems, the usual invocation of an executable through execlp()
# or execvp() fails with ENOEXEC if it is a script that does not start
# with a #! line.  The script interpreter mentioned in the #! line has
# to be /bin/sh, because on GuixSD systems that is the only program that
# has a fixed file name.  The second line is essential for perl and is
# also useful for editing this file in Emacs.  The next two lines below
# are valid code in both sh and perl.  When executed by sh, they re-execute
# the script through the perl program found in $PATH.  The '-x' option
# is essential as well; without it, perl would re-execute the script
# through /bin/sh.  When executed by perl, the next two lines are a no-op.
eval 'exec perl -wSx -0777 -pi "$0" "$@"'
     if 0;

my $VERSION = '2020-04-04.15:07'; # UTC
# The definition above must lie within the first 8 lines in order
# for the Emacs time-stamp write hook (at end) to update it.
# If you change this file with Emacs, please let the write hook
# do its job.  Otherwise, update this string manually.

use strict;
use warnings;

my $copyright_re = 'Copyright';
my $circle_c_re = '(?:\([cC]\)|@copyright\{}|\\\\\(co|&copy;|©)';
my $holder = $ENV{UPDATE_COPYRIGHT_HOLDER};
$holder ||= 'Free Software Foundation, Inc.';
my $prefix_max = 5;
my $margin = $ENV{UPDATE_COPYRIGHT_MAX_LINE_LENGTH};
!$margin || $margin !~ m/^\d+$/
  and $margin = 72;

my $tab_width = 8;

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;
  }

# Unless the file consistently uses "\r\n" as the EOL, use "\n" instead.
my $eol = /(?:^|[^\r])\n/ ? "\n" : "\r\n";

my $leading;
my $prefix;
my $ws_re;
my $stmt_re;
while (/(^|\n)(.{0,$prefix_max})$copyright_re/g)
  {
    $leading = "$1$2";
    $prefix = $2;
    if ($prefix =~ /^(\s*\/)\*(\s*)$/)
      {
        $prefix =~ s,/, ,;
        my $prefix_ws = $prefix;
        $prefix_ws =~ s/\*/ /; # Only whitespace.
        if (/\G(?:[^*\n]|\*[^\/\n])*\*?\n$prefix_ws/)
          {
            $prefix = $prefix_ws;
          }
      }
    $ws_re = '[ \t\r\f]'; # \s without \n
    $ws_re =
      "(?:$ws_re*(?:$ws_re|\\n" . quotemeta($prefix) . ")$ws_re*)";
    my $holder_re = $holder;
    $holder_re =~ s/\s/$ws_re/g;
    my $stmt_remainder_re =
      "(?:$ws_re$circle_c_re)?"
      . "$ws_re(?:(?:\\d\\d)?\\d\\d(?:,$ws_re?|--?))*"
      . "((?:\\d\\d)?\\d\\d)$ws_re$holder_re";
    if (/\G$stmt_remainder_re/)
      {
        $stmt_re =
          quotemeta($leading) . "($copyright_re$stmt_remainder_re)";
        last;
      }
  }
if (defined $stmt_re)
  {
    /$stmt_re/ or die; # Should never die.
    my $stmt = $1;
    my $final_year_orig = $2;

    # Handle two-digit year numbers like "98" and "99".
    my $final_year = $final_year_orig;
    $final_year <= 99
      and $final_year += 1900;

    if ($final_year != $this_year)
      {
        # Update the year.
        $stmt =~ s/\b$final_year_orig\b/$final_year, $this_year/;
      }
    if ($final_year != $this_year || $ENV{'UPDATE_COPYRIGHT_FORCE'})
      {
        # Normalize all whitespace including newline-prefix sequences.
        $stmt =~ s/$ws_re/ /g;

        # Put spaces after commas.
        $stmt =~ s/, ?/, /g;

        # Convert 2-digit to 4-digit years.
        $stmt =~ s/(\b\d\d\b)/19$1/g;

        # Make the use of intervals consistent.
        if (!$ENV{UPDATE_COPYRIGHT_USE_INTERVALS})
          {
            $stmt =~ s/(\d{4})--?(\d{4})/join(', ', $1..$2)/eg;
          }
        else
          {
            my $ndash = $ARGV =~ /\.tex(i(nfo)?)?$/ ? "--" : "-";

            $stmt =~
              s/
                (\d{4})
                (?:
                  (,\ |--?)
                  ((??{
                    if   ($2 ne ', ') { '\d{4}'; }
                    elsif (!$3)       { $1 + 1;  }
                    else              { $3 + 1;  }
                  }))
                )+
              /$1$ndash$3/gx;

            # When it's 2, emit a single range encompassing all year numbers.
            $ENV{UPDATE_COPYRIGHT_USE_INTERVALS} == 2
              and $stmt =~ s/\b(\d{4})\b.*\b(\d{4})\b/$1$ndash$2/;
          }

        # Format within margin.
        my $stmt_wrapped;
        my $text_margin = $margin - length($prefix);
        if ($prefix =~ /^(\t+)/)
          {
            $text_margin -= length($1) * ($tab_width - 1);
          }
        while (length $stmt)
          {
            if (($stmt =~ s/^(.{1,$text_margin})(?: |$)//)
                || ($stmt =~ s/^([\S]+)(?: |$)//))
              {
                my $line = $1;
                $stmt_wrapped .= $stmt_wrapped ? "$eol$prefix" : $leading;
                $stmt_wrapped .= $line;
              }
            else
              {
                # Should be unreachable, but we don't want an infinite
                # loop if it can be reached.
                die;
              }
          }

        # Replace the old copyright statement.
        s/$stmt_re/$stmt_wrapped/;
      }
  }
else
  {
    print STDERR "$ARGV: warning: copyright statement not found\n";
  }

# Hey Emacs!
# Local variables:
# coding: utf-8
# mode: perl
# indent-tabs-mode: nil
# eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-line-limit: 200
# time-stamp-start: "my $VERSION = '"
# time-stamp-format: "%:y-%02m-%02d.%02H:%02M"
# time-stamp-time-zone: "UTC0"
# time-stamp-end: "'; # UTC"
# End:
