merge_copyrights revision 247bf378605811d695e968dbe930a7fc45c0038e
7cb128dc4cae2a03a742f63ba7afee23c78e3af0Phil Carmody#!/usr/local/bin/perl -w
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen; Copyright (C) 2004-2007, 2009-2012 Internet Systems Consortium, Inc. ("ISC")
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen; Copyright (C) 1998-2001, 2003 Internet Software Consortium.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen; Permission to use, copy, modify, and/or distribute this software for any
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen; purpose with or without fee is hereby granted, provided that the above
a24f5976e9c6154ff58291634647a22a363c3198Timo Sirainen; copyright notice and this permission notice appear in all copies.
0f833d18af36bf307cd69f235eb3fb779245b478Timo Sirainen;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen; PERFORMANCE OF THIS SOFTWARE.
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen# $Id$
1d3f7c1278168d5b1cbfa9a2cc9929a0909056b4Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenuse strict;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenmy %file_types = ();
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenmy %file_years = ();
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainenmy %exists = ();
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainenopen(COPYRIGHTS, "<util/copyrights") || die "can't open ./util/copyrights: $!";
f6ae4001e33637ad80ebb8f5716ca2020e718625Timo Sirainenwhile (<COPYRIGHTS>) {
f6ae4001e33637ad80ebb8f5716ca2020e718625Timo Sirainen chomp;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen my ($file, $type, $years) = split;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen $file_types{$file} = $type;
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen $file_years{$file} = $years;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainenclose(COPYRIGHTS);
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainenmy ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen$sec = $min = $hour = $mday = $mon = $wday = $yday = $isdst = 0;
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen$year += 1900;
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen
aa0647f2debf0d48d504a321186f66c85596aaf4Timo Sirainenopen(FILES, "git ls-files | sed 's;^;./;' |") || die "git ls-files: $!";
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainenwhile (<FILES>) {
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen chomp;
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen $exists{$_} = 1;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen}
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenclose(FILES);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenopen(CHANGES, "sh util/recent_changes.sh |") || die "recent_changes.sh: $!";
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenwhile (<CHANGES>) {
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen chomp;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen # this file isn't in the repository now
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen next unless ($exists{$_});
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen next if (m%/\.\# | # CVS old conflict file
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen /CVS/ | # CVS directory
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen /.git/ | # git directory
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen util/newcopyrights | # our output
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen \.bak$ | # created by update_copyrights
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen /(dnssafe|openssl)/.*\.[ch]$ | # imported
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen doc/(draft|expired|rfc)/ # imported
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen %x);
aa0647f2debf0d48d504a321186f66c85596aaf4Timo Sirainen
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen if (!$file_types{$_}) {
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen # Strip any .in extension to find out the file's real type.
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen # .in files are processed by configure to produce the target file.
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen my $base;
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen ($base = $_) =~ s/\.in$//;
aa0647f2debf0d48d504a321186f66c85596aaf4Timo Sirainen
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen # Contributed code should maintain its own copyright.
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen if ($base =~ /\.\/contrib\//) {
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen $file_types{$_} = "X";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } elsif ($base =~ /\.\/unit\/atf-src\//) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen $file_types{$_} = "X";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } elsif ($base =~ /\/openssl-[a-z0-9.]*-patch$/) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen $file_types{$_} = "X";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen } elsif ($base =~ /\.(c|h|css)$/) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "C";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen } elsif ($base =~ /\.y$/) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "YACC";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen } elsif ($base =~ /\.pl$/i) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "PERL";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen } elsif ($base =~ /\.py$/i) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "PYTHON";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen } elsif ($base =~ /\.sh$/) {
d200ae87140a1985fe527e6527bc4bd3035189b1Timo Sirainen $file_types{$_} = "SH";
d200ae87140a1985fe527e6527bc4bd3035189b1Timo Sirainen } elsif ($base =~ /\.docbook$/ ||
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $base =~ /.xsl$/ ||
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $base =~ /.xml$/) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "SGML";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen } elsif ($base =~ /\.html$/) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "HTML";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen } elsif ($base =~ /\.(man|[0-9])$/) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "MAN";
61f5256ef248d35459b53534ae428bf6d016e1c5Timo Sirainen } elsif ($base =~ /\/Makefile$/) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "MAKE";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen } elsif ($base =~ /\/(named|rndc|good|bad).{0,2}\.conf$/) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "CONF-C";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen } elsif ($base =~ /\/resolv.?\.conf$/) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "CONF-SH";
aa0647f2debf0d48d504a321186f66c85596aaf4Timo Sirainen } elsif ($base =~ /\.(db|hint)$/) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "ZONE";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen } elsif ($base =~ /(\/\.gitignore|\.gif|\.jpg|\.dsp|\.dsw|\.mak)$/i) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "X";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen } elsif ($base =~ /\.rnc$/i) {
84ed9f8f3d0e5ed47607ef417618e49e4f865557Timo Sirainen $file_types{$_} = "RNC";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen } elsif ($base =~ /^\.\/EXCLUDED$/i) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "X";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen } elsif ($base =~ /\.bat$/i) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "BAT";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen } elsif ($base =~ /\/named\.args$/i) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "X";
ad8841dddd672659d0bc6985718a6e59e545e473Timo Sirainen } else {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_types{$_} = "?";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen }
61f5256ef248d35459b53534ae428bf6d016e1c5Timo Sirainen my $m_year = int(`sh util/file_year.sh $_`);
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen if ($m_year != $year) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen print "$_: must set copyright year(s) manually\n";
aa0647f2debf0d48d504a321186f66c85596aaf4Timo Sirainen $file_years{$_} = "????";
ad8841dddd672659d0bc6985718a6e59e545e473Timo Sirainen } else {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $file_years{$_} = "$year";
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen }
84ed9f8f3d0e5ed47607ef417618e49e4f865557Timo Sirainen } else {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen if (! defined($file_years{$_}) || $file_years{$_} eq "????") {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen print "$_: must set copyright year(s) manually\n";
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen $file_years{$_} = "????";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen next;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen # track the modification years even if we are not going to be
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # updating the copyrights.
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen # next if $file_types{$_} eq "X";
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen next if ($file_years{$_} =~ /^PARENT:/);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen next if ($file_years{$_} eq "DOCBOOK");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen my @years = split(/,/, $file_years{$_});
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen my $has_current = 0;
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen foreach my $fyear (@years) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen if ($fyear == $year) {
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen $has_current = 1;
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen }
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen }
b87a4156eca6dcf6b29c504eb0cb9be2fdb11b63Timo Sirainen if (!$has_current) {
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen $file_years{$_} .= ",$year";
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenclose(CHANGES);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenopen(NEWCOPYRIGHTS, ">util/newcopyrights") ||
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen die "can't open newcopyrights: $!";
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainenforeach my $file (sort(keys(%file_types))) {
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen print NEWCOPYRIGHTS "$file";
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen my $len = length($file);
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen my $tabs = 0;
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen if ($len >= 48) {
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen $tabs = 1;
df4018ae2f0a95be602f724ca70df7e0e3bd6a7dTimo Sirainen } else {
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen my $needed = int (48 - $len);
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen $tabs = int ($needed / 8);
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen if ($needed % 8 != 0) {
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen $tabs++;
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen }
aa0647f2debf0d48d504a321186f66c85596aaf4Timo Sirainen }
e8acc691a14a6d0884c5ca9aa4d8507f1e082040Timo Sirainen for (my $i = 0; $i < $tabs; $i++) {
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen printf NEWCOPYRIGHTS "\t";
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen }
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen printf NEWCOPYRIGHTS "%s\t%s\n", $file_types{$file}, $file_years{$file};
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen if (($file_years{$file} eq "????") || ($file_types{$file} eq "?")) {
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen print "Unknown file type or year: $file\n";
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen }
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen}
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenclose(NEWCOPYRIGHTS);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen