merge_copyrights revision f7a6d4f915ce622d988916397f313b33ae954afc
7f007e36bec06aba6b3a0f84a64f2abf99edfcd8gstein#!/usr/local/bin/perl -w
9279bf6c00e1f5d36b8257700f41bfdf4b4a8199coar#
2a6c49cfaef5979a5a06098f3ce987cd76769409manoj# Copyright (C) 2004-2007, 2009-2015 Internet Systems Consortium, Inc. ("ISC")
2a6c49cfaef5979a5a06098f3ce987cd76769409manoj# Copyright (C) 1998-2001, 2003 Internet Software Consortium.
2a6c49cfaef5979a5a06098f3ce987cd76769409manoj#
df14f0d3a5191cdd7c4bb5b03acd135d43a6f51brbb# Permission to use, copy, modify, and/or distribute this software for any
df14f0d3a5191cdd7c4bb5b03acd135d43a6f51brbb# purpose with or without fee is hereby granted, provided that the above
ab71b233b3a36489e44a7b061c48293be0b17788jwoolley# copyright notice and this permission notice appear in all copies.
571760de5e60c0b459cb11be45507b923cd023eejwoolley#
571760de5e60c0b459cb11be45507b923cd023eejwoolley# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9180a5933673ffb1af633c255ceee029340f3b1erbb# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
bcb6e1be6041dfeb549c8ea8d37f97ad4e90a0c3rbb# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
9bd71e35f5d26d26d23fe3a677401828e842ed72wrowe# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
2900ab946a2d76b73a14cebfe2985d253f01c967stoddard# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
a548c09e6a8ca1b059d0e93b5256c6ccb2b3c3cdrbb# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
a548c09e6a8ca1b059d0e93b5256c6ccb2b3c3cdrbb# PERFORMANCE OF THIS SOFTWARE.
a548c09e6a8ca1b059d0e93b5256c6ccb2b3c3cdrbb
b876b7bcf0ce3d232da723246d709e8dbbfe8762rbb# $Id$
cf6bf6c34c936e6a6fe731dbce4a5c3c8bf8e9a3gstein
35330e0d79ceb8027223bbb8330a381b1f989d6etrawickuse strict;
6f6f4a4bca281779d196acbdd5c017bb90858305trawick
8dd4618c4709236b4ea297d7250d282e463ce2d8rbbmy %file_types = ();
09bd86d0db1114ee23eda0a6eb76ca055877a1cftrawickmy %file_years = ();
2deb319e6b3de239f45c16a3e9e836d44f1f7108rbbmy %exists = ();
bd929c73ef04789b7183b840d8db6e01d03a4d86rbb
70f6f32765cfaadd6da8de6f0fea97ddd72d8fadmanojopen(COPYRIGHTS, "<util/copyrights") || die "can't open ./util/copyrights: $!";
2a6c49cfaef5979a5a06098f3ce987cd76769409manojwhile (<COPYRIGHTS>) {
af4c982a7cf4515f124935f99a329744035fc699slive chomp;
af4c982a7cf4515f124935f99a329744035fc699slive my ($file, $type, $years) = split;
af4c982a7cf4515f124935f99a329744035fc699slive $file_types{$file} = $type;
af4c982a7cf4515f124935f99a329744035fc699slive $file_years{$file} = $years;
af4c982a7cf4515f124935f99a329744035fc699slive}
af4c982a7cf4515f124935f99a329744035fc699sliveclose(COPYRIGHTS);
af4c982a7cf4515f124935f99a329744035fc699slive
2a6c49cfaef5979a5a06098f3ce987cd76769409manojmy ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time());
531c23ff01a2489646f0a2029097013b328d935agstein$sec = $min = $hour = $mday = $mon = $wday = $yday = $isdst = 0;
bf9acc131271d18db51d30ace549d3c3b6a2b9fbrbb$year += 1900;
bf9acc131271d18db51d30ace549d3c3b6a2b9fbrbb
bf9acc131271d18db51d30ace549d3c3b6a2b9fbrbbopen(FILES, "git ls-files | sed 's;^;./;' |") || die "git ls-files: $!";
bf9acc131271d18db51d30ace549d3c3b6a2b9fbrbbwhile (<FILES>) {
bf9acc131271d18db51d30ace549d3c3b6a2b9fbrbb chomp;
bf9acc131271d18db51d30ace549d3c3b6a2b9fbrbb $exists{$_} = 1;
bf9acc131271d18db51d30ace549d3c3b6a2b9fbrbb}
79d5106a9b65b956d646f5daae4b94bc79e315b8trawickclose(FILES);
79d5106a9b65b956d646f5daae4b94bc79e315b8trawick
79d5106a9b65b956d646f5daae4b94bc79e315b8trawickopen(CHANGES, "sh util/recent_changes.sh |") || die "recent_changes.sh: $!";
79d5106a9b65b956d646f5daae4b94bc79e315b8trawickwhile (<CHANGES>) {
79d5106a9b65b956d646f5daae4b94bc79e315b8trawick chomp;
79d5106a9b65b956d646f5daae4b94bc79e315b8trawick
ec75f189410513ab8f6e1173a9d9d277ebec9ce7gstein # this file isn't in the repository now
ec75f189410513ab8f6e1173a9d9d277ebec9ce7gstein next unless ($exists{$_});
ec75f189410513ab8f6e1173a9d9d277ebec9ce7gstein
ec75f189410513ab8f6e1173a9d9d277ebec9ce7gstein next if (m%/\.\# | # CVS old conflict file
ec75f189410513ab8f6e1173a9d9d277ebec9ce7gstein /CVS/ | # CVS directory
ec75f189410513ab8f6e1173a9d9d277ebec9ce7gstein /.git/ | # git directory
ec75f189410513ab8f6e1173a9d9d277ebec9ce7gstein util/newcopyrights | # our output
ec75f189410513ab8f6e1173a9d9d277ebec9ce7gstein \.bak$ | # created by update_copyrights
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe /(dnssafe|openssl)/.*\.[ch]$ | # imported
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe doc/(draft|expired|rfc)/ # imported
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe %x);
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe if (!$file_types{$_}) {
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe # Strip any .in extension to find out the file's real type.
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe # .in files are processed by configure to produce the target file.
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe my $base;
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe ($base = $_) =~ s/\.in$//;
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe # Contributed code should maintain its own copyright.
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe if ($base =~ /\.\/contrib\//) {
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe $file_types{$_} = "X";
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe } elsif ($base =~ /\.\/unit\/atf-src\//) {
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard $file_types{$_} = "X";
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard } elsif ($base =~ /\/openssl-[a-z0-9.]*-patch$/) {
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard $file_types{$_} = "X";
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard } elsif ($base =~ /\.(c|h|css)$/) {
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard $file_types{$_} = "C";
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard } elsif ($base =~ /\.y$/) {
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard $file_types{$_} = "YACC";
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard } elsif ($base =~ /\.pl$/i) {
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard $file_types{$_} = "PERL";
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard } elsif ($base =~ /\.py$/i) {
d57551cb28450661e77394ec332cf25b0f63aae1trawick $file_types{$_} = "PYTHON";
c3a2c6ae9a1c7f37d672a54c2c9a1b4f7941085btrawick } elsif ($base =~ /\.sh$/) {
c3a2c6ae9a1c7f37d672a54c2c9a1b4f7941085btrawick $file_types{$_} = "SH";
c3a2c6ae9a1c7f37d672a54c2c9a1b4f7941085btrawick } elsif ($base =~ /\.docbook$/ ||
c3a2c6ae9a1c7f37d672a54c2c9a1b4f7941085btrawick $base =~ /.xsl$/ ||
d57551cb28450661e77394ec332cf25b0f63aae1trawick $base =~ /.xml$/) {
c3a2c6ae9a1c7f37d672a54c2c9a1b4f7941085btrawick $file_types{$_} = "SGML";
2a6c49cfaef5979a5a06098f3ce987cd76769409manoj } elsif ($base =~ /doc\/arm\/.*\.html$/) {
33a70d93b992bbb63b809c24df29451f38f017c1rbb $file_types{$_} = "X";
9279bf6c00e1f5d36b8257700f41bfdf4b4a8199coar } elsif ($base =~ /\.(sty|pdf|eps)$/) {
9279bf6c00e1f5d36b8257700f41bfdf4b4a8199coar $file_types{$_} = "X";
af9f2bd7837c251df865825e03ad192e5c6aee18jim } elsif ($base =~ /\.html$/) {
80f1e1356ad226353dc0c4eadd4d4f66f02684fcbhyde $file_types{$_} = "HTML";
ca21f4d2622a817d3cb3204210afb6c586d5d7acrbb } elsif ($base =~ /\.(man|[0-9])$/) {
809cf6f87f7a07b348f6d69961834923bc16313egstein $file_types{$_} = "MAN";
809cf6f87f7a07b348f6d69961834923bc16313egstein } elsif ($base =~ /\/Makefile$/) {
809cf6f87f7a07b348f6d69961834923bc16313egstein $file_types{$_} = "MAKE";
410912d9cb56a09a74f8655647ed9e81d49023f4gregames } elsif ($base =~ /\/(named|rndc|good|bad).{0,2}\.conf$/) {
410912d9cb56a09a74f8655647ed9e81d49023f4gregames $file_types{$_} = "CONF-C";
410912d9cb56a09a74f8655647ed9e81d49023f4gregames } elsif ($base =~ /\/checkconf\/(good|bad)-.*\.conf$/) {
410912d9cb56a09a74f8655647ed9e81d49023f4gregames $file_types{$_} = "CONF-C";
60d567a0c2aae815ee6fc20c0d65032bea52c92cwrowe } elsif ($base =~ /\/resolv.?\.conf$/) {
60d567a0c2aae815ee6fc20c0d65032bea52c92cwrowe $file_types{$_} = "CONF-SH";
60d567a0c2aae815ee6fc20c0d65032bea52c92cwrowe } elsif ($base =~ /\.(db|hint)$/) {
60d567a0c2aae815ee6fc20c0d65032bea52c92cwrowe $file_types{$_} = "ZONE";
60d567a0c2aae815ee6fc20c0d65032bea52c92cwrowe } elsif ($base =~ /\.mkd$/) {
60d567a0c2aae815ee6fc20c0d65032bea52c92cwrowe $file_types{$_} = "MKD";
60d567a0c2aae815ee6fc20c0d65032bea52c92cwrowe } elsif ($base =~ /(\/\.(gitignore|gitattributes)|Atffile|\.(gif|jpg))$/i) {
60d567a0c2aae815ee6fc20c0d65032bea52c92cwrowe $file_types{$_} = "X";
60d567a0c2aae815ee6fc20c0d65032bea52c92cwrowe } elsif ($base =~ /\.(def|dep|dsp|dsw|mak|sln)$/i) {
7239216999e746bb4fc7671621becea33c5c1c87stoddard $file_types{$_} = "X";
d180ec1b29106f4fec480ef7fcdb04df078010cerse } elsif ($base =~ /\.(vcxproj(|\.(user|filters)))$/i) {
d180ec1b29106f4fec480ef7fcdb04df078010cerse $file_types{$_} = "X";
3913a3b7e7c72ea11d05da36275db39c2dc39b68jwoolley } elsif ($base =~ /\.rnc$/i) {
3913a3b7e7c72ea11d05da36275db39c2dc39b68jwoolley $file_types{$_} = "RNC";
3913a3b7e7c72ea11d05da36275db39c2dc39b68jwoolley } elsif ($base =~ /^\.\/EXCLUDED$/i) {
3913a3b7e7c72ea11d05da36275db39c2dc39b68jwoolley $file_types{$_} = "X";
3913a3b7e7c72ea11d05da36275db39c2dc39b68jwoolley } elsif ($base =~ /\.bat$/i) {
3913a3b7e7c72ea11d05da36275db39c2dc39b68jwoolley $file_types{$_} = "BAT";
3913a3b7e7c72ea11d05da36275db39c2dc39b68jwoolley } elsif ($base =~ /\/named\.args$/i) {
3913a3b7e7c72ea11d05da36275db39c2dc39b68jwoolley $file_types{$_} = "X";
d180ec1b29106f4fec480ef7fcdb04df078010cerse } elsif ($base =~ /\/named\.port$/i) {
e32adabcbf3bf5b69ba2e8b163b971839efc94dbtrawick $file_types{$_} = "X";
e32adabcbf3bf5b69ba2e8b163b971839efc94dbtrawick } elsif ($base =~ /\/named\.dropedns$/i) {
e32adabcbf3bf5b69ba2e8b163b971839efc94dbtrawick $file_types{$_} = "X";
bebc7b9445f95339822c26bfd470349006f9ec40stoddard } elsif ($base =~ /\/named\.notcp$/i) {
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard $file_types{$_} = "X";
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard } elsif ($base =~ /\/README$/i) {
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard $file_types{$_} = "TXT.BRIEF";
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard } else {
49facccad3f5c3e9e49311487b5069699c3bf3fdjwoolley $file_types{$_} = "?";
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard }
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard my $m_year = int(`sh util/file_year.sh $_`);
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard if ($m_year != $year) {
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard print "$_: must set copyright year(s) manually\n";
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard $file_years{$_} = "????";
1b9744b72f26e9a0e935f9c08d49feb1fcce72f9jwoolley } else {
1b9744b72f26e9a0e935f9c08d49feb1fcce72f9jwoolley $file_years{$_} = "$year";
1b9744b72f26e9a0e935f9c08d49feb1fcce72f9jwoolley }
1b9744b72f26e9a0e935f9c08d49feb1fcce72f9jwoolley } else {
1b9744b72f26e9a0e935f9c08d49feb1fcce72f9jwoolley if (! defined($file_years{$_}) || $file_years{$_} eq "????") {
1b9744b72f26e9a0e935f9c08d49feb1fcce72f9jwoolley print "$_: must set copyright year(s) manually\n";
1b9744b72f26e9a0e935f9c08d49feb1fcce72f9jwoolley $file_years{$_} = "????";
1b9744b72f26e9a0e935f9c08d49feb1fcce72f9jwoolley next;
1b9744b72f26e9a0e935f9c08d49feb1fcce72f9jwoolley }
7bce59d998f2e5ca1cb60038ef6c1d0817605d62stoddard
19cbe4d7b7c931723e7249de6829bf965a1fee72stoddard # track the modification years even if we are not going to be
19cbe4d7b7c931723e7249de6829bf965a1fee72stoddard # updating the copyrights.
93db592309ba9e5ab230f67611a2c74fece9cdb2marc # next if $file_types{$_} eq "X";
93db592309ba9e5ab230f67611a2c74fece9cdb2marc next if ($file_years{$_} =~ /^PARENT:/);
93db592309ba9e5ab230f67611a2c74fece9cdb2marc next if ($file_years{$_} eq "DOCBOOK");
93db592309ba9e5ab230f67611a2c74fece9cdb2marc
93db592309ba9e5ab230f67611a2c74fece9cdb2marc my @years = split(/,/, $file_years{$_});
93db592309ba9e5ab230f67611a2c74fece9cdb2marc my $has_current = 0;
93db592309ba9e5ab230f67611a2c74fece9cdb2marc foreach my $fyear (@years) {
b187d568e1507d75139ebc13ca945b38fc05d55cstoddard if ($fyear == $year) {
b187d568e1507d75139ebc13ca945b38fc05d55cstoddard $has_current = 1;
b187d568e1507d75139ebc13ca945b38fc05d55cstoddard }
1c6fb1e726ce22694de0e9a957adb67b929e5d4fstoddard }
1c6fb1e726ce22694de0e9a957adb67b929e5d4fstoddard if (!$has_current) {
8bed76428f56e5c643174a2d6807c3f18016af5cbjh $file_years{$_} .= ",$year";
8bed76428f56e5c643174a2d6807c3f18016af5cbjh }
a5ed555df952c85bc1b179f5981e8a6c54ba16e6stoddard }
d2f8b010487ffa990a9c268df5a25579e7291bcdrbb}
d2f8b010487ffa990a9c268df5a25579e7291bcdrbbclose(CHANGES);
a5ed555df952c85bc1b179f5981e8a6c54ba16e6stoddard
0bff2f28ef945280c17099c142126178a78e1e54manojopen(NEWCOPYRIGHTS, ">util/newcopyrights") ||
0bff2f28ef945280c17099c142126178a78e1e54manoj die "can't open newcopyrights: $!";
0bff2f28ef945280c17099c142126178a78e1e54manojforeach my $file (sort(keys(%file_types))) {
1e585ba09ea32272e63c4c39c35491e975d21d98stoddard print NEWCOPYRIGHTS "$file";
0bff2f28ef945280c17099c142126178a78e1e54manoj my $len = length($file);
35330e0d79ceb8027223bbb8330a381b1f989d6etrawick my $tabs = 0;
0bff2f28ef945280c17099c142126178a78e1e54manoj if ($len >= 48) {
9c09943bad734ebd5c7cc10bd6d63b75c4c6e056stoddard $tabs = 1;
ff849e4163ed879288f0df15f78b6c9d278ec804fanf } else {
ff849e4163ed879288f0df15f78b6c9d278ec804fanf my $needed = int (48 - $len);
447c6ce3ff08073c44f6785d5256271fcb877512wrowe $tabs = int ($needed / 8);
447c6ce3ff08073c44f6785d5256271fcb877512wrowe if ($needed % 8 != 0) {
447c6ce3ff08073c44f6785d5256271fcb877512wrowe $tabs++;
447c6ce3ff08073c44f6785d5256271fcb877512wrowe }
447c6ce3ff08073c44f6785d5256271fcb877512wrowe }
447c6ce3ff08073c44f6785d5256271fcb877512wrowe for (my $i = 0; $i < $tabs; $i++) {
cf6bf6c34c936e6a6fe731dbce4a5c3c8bf8e9a3gstein printf NEWCOPYRIGHTS "\t";
cf6bf6c34c936e6a6fe731dbce4a5c3c8bf8e9a3gstein }
3bb28269556842ebf8888208fd0c7a7f3e343186jerenkrantz printf NEWCOPYRIGHTS "%s\t%s\n", $file_types{$file}, $file_years{$file};
3bb28269556842ebf8888208fd0c7a7f3e343186jerenkrantz
3bb28269556842ebf8888208fd0c7a7f3e343186jerenkrantz if (($file_years{$file} eq "????") || ($file_types{$file} eq "?")) {
c03566fa0156d3a1500a42e4fe539e3e0fc8a11dgstein print "Unknown file type or year: $file\n";
db3ccce11afac4fc1d4f51a65424412f7480c46cgstein }
dd4713dc5b186f4d1be7b88f86608fdb84cbe5d5gstein}
0eb7ca6cf812d98c534661ac474e873a32bf6325gsteinclose(NEWCOPYRIGHTS);
cf6bf6c34c936e6a6fe731dbce4a5c3c8bf8e9a3gstein