Files
bind9/util/merge_copyrights
Ondřej Surý 9fb6d11abb Convert the documentation to Sphinx documentation format
The ARM and the manpages have been converted into Sphinx documentation
format.

Sphinx uses reStructuredText as its markup language, and many of its
strengths come from the power and straightforwardness of
reStructuredText and its parsing and translating suite, the Docutils.
2020-05-07 16:02:56 +02:00

204 lines
6.4 KiB
Perl

#!/usr/local/bin/perl -w
#
# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# See the COPYRIGHT file distributed with this work for additional
# information regarding copyright ownership.
use strict;
my %file_types = ();
my %file_years = ();
open(COPYRIGHTS, "<util/copyrights") || die "can't open ./util/copyrights: $!";
while (<COPYRIGHTS>) {
chomp;
my ($file, $type, $years) = split;
$file_types{$file} = $type;
$file_years{$file} = $years;
}
close(COPYRIGHTS);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time());
$sec = $min = $hour = $mday = $mon = $wday = $yday = $isdst = 0;
$year += 1900;
open(CHANGES, "git ls-files | sed 's;^;./;' | sort |") || die "git ls-files: $!";
while (<CHANGES>) {
chomp;
next if (m%/\. | # just ignore all hidden files
/ChangeLog | #
Makefile.(am|in) | # build system doesn't need to have copyright
/m4/ | # build system doesn't need to have copyright
/configure | # build system doesn't need to have copyright
/fuzz/.*\.in/ | # ignore fuzz corpus
util/newcopyrights | # our output
\.bak$ | # created by update_copyrights
\.md$ | # READMEs and such
\.data$ | # zone files
\.data[0-9]$ | # zone files
\.data\.in$ | # zone files
\.db$ | # zone files
\.db\.in$ | # zone files
/db\.[^/]*$ | # zone files
/[^/]*\.db\.[^/]* | # zone files
\.hints?$ | # zone files
\.hints?\.in$ | # zone files
/hints$ | # zone files
\.zone$ | # zone files
/cocci/.* | # coccinelle spatch files
\.conf$ | # configuration files
\.conf\.in$ | # configuration files
/(dnssafe|openssl)/.*\.[ch]$ | # imported
doc/(draft|expired|rfc)/ | # imported
\.*in$ | # the generated documentation doesn't really need copyright
grammar\.rst$ | # -"-
zoneopt\.rst$ | # -"-
zoneopt$ | # -"-
\.txt$ # text files don't really need copyright
%x);
if (!$file_types{$_}) {
# Strip any .in extension to find out the file's real type.
# .in files are processed by configure to produce the target file.
my $base;
($base = $_) =~ s/\.in$//;
# Contributed code should maintain its own copyright.
if ($base =~ /\.\/contrib\//) {
$file_types{$_} = "X";
} elsif ($base =~ /\/openssl-[a-z0-9.]*-patch$/) {
$file_types{$_} = "X";
} elsif ($base =~ /\.(c|h|css)$/) {
$file_types{$_} = "C";
} elsif ($base =~ /\.y$/) {
$file_types{$_} = "YACC";
} elsif ($base =~ /\.pl$/i) {
$file_types{$_} = "PERL";
} elsif ($base =~ /\.py$/i) {
$file_types{$_} = "PYTHON";
if (open(PYTHON, $_)) {
my $line = <PYTHON>;
$file_types{$_} = "PYTHON-BIN" if ($line && $line =~ /^#!/);
close(PYTHON);
}
} elsif ($base =~ /\.sh$/) {
$file_types{$_} = "SH";
} elsif ($base =~ /\.docbook$/ ||
$base =~ /\.xsl$/ ||
$base =~ /\.xml$/) {
$file_types{$_} = "SGML";
} elsif ($base =~ /\.rst$/ ||
$base =~ /\.inc$/) {
$file_types{$_} = "RST";
} elsif ($base =~ /doc\/arm\/.*\.html$/) {
$file_types{$_} = "X";
} elsif ($base =~ /\.(sty|pdf|eps)$/) {
$file_types{$_} = "X";
} elsif ($base =~ /\.html$/) {
$file_types{$_} = "HTML";
$base =~ s/\.html$//;
$base = $base . ".docbook";
} elsif ($base =~ /\.(man|[0-9])$/) {
$file_types{$_} = "MAN";
$base =~ s/\.[0-9]$//;
$base = $base . ".docbook";
} elsif ($base =~ /\/Makefile$/) {
$file_types{$_} = "MAKE";
} elsif ($base =~ /\/resolv.?\.conf$/) {
$file_types{$_} = "CONF-SH";
} elsif ($base =~ /\.md$/) {
$file_types{$_} = "MKD";
} elsif ($base =~ /(\/\.(gitignore|gitattributes)|\.(gif|jpg))$/i) {
$file_types{$_} = "X";
} elsif ($base =~ /\.(def|dep|dsp|dsw|mak|sln)$/i) {
$file_types{$_} = "X";
} elsif ($base =~ /\.(vcxproj(|\.(user|filters)))$/i) {
$file_types{$_} = "X";
} elsif ($base =~ /\.rnc$/i) {
$file_types{$_} = "RNC";
} elsif ($base =~ /^\.\/EXCLUDED$/i) {
$file_types{$_} = "X";
} elsif ($base =~ /\.bat$/i) {
$file_types{$_} = "BAT";
} elsif ($base =~ /\.(key|private)$/i) {
$file_types{$_} = "X";
} elsif ($base =~ /\/named\d{0,2}\.args$/i) {
$file_types{$_} = "X";
} elsif ($base =~ /\/named\.port$/i) {
$file_types{$_} = "X";
} elsif ($base =~ /\/named\.dropedns$/i) {
$file_types{$_} = "X";
} elsif ($base =~ /\/named\.notcp$/i) {
$file_types{$_} = "X";
} elsif ($base =~ /\/doc\/misc\/[-a-z]*\.zoneopt$/i) {
$file_types{$_} = "X";
} elsif ($base =~ /\/README$/i) {
$file_types{$_} = "TXT.BRIEF";
} else {
$file_types{$_} = "?";
}
if (($file_types{$_} eq "MAN" || $file_types{$_} eq "HTML") &&
$base =~ /\.docbook$/ && -e $base) {
$file_years{$_} = "DOCBOOK";
} else {
$file_years{$_} = "$year";
}
} else {
if (! defined($file_years{$_}) || $file_years{$_} eq "????") {
print "$_: must set copyright year(s) manually\n";
$file_years{$_} = "????";
next;
}
# track the modification years even if we are not going to be
# updating the copyrights.
# next if $file_types{$_} eq "X";
next if ($file_years{$_} =~ /^PARENT:/);
next if ($file_years{$_} eq "DOCBOOK");
my @years = split(/,/, $file_years{$_});
my $has_current = 0;
foreach my $fyear (@years) {
if ($fyear == $year) {
$has_current = 1;
}
}
if (!$has_current) {
$file_years{$_} .= ",$year";
}
}
}
close(CHANGES);
open(NEWCOPYRIGHTS, ">util/newcopyrights") ||
die "can't open newcopyrights: $!";
foreach my $file (sort(keys(%file_types))) {
print NEWCOPYRIGHTS "$file";
my $len = length($file);
my $tabs = 0;
if ($len >= 48) {
$tabs = 1;
} else {
my $needed = int (48 - $len);
$tabs = int ($needed / 8);
if ($needed % 8 != 0) {
$tabs++;
}
}
for (my $i = 0; $i < $tabs; $i++) {
printf NEWCOPYRIGHTS "\t";
}
printf NEWCOPYRIGHTS "%s\t%s\n", $file_types{$file}, $file_years{$file};
if (($file_years{$file} eq "????") || ($file_types{$file} eq "?")) {
print "Unknown file type or year: $file\n";
}
}
close(NEWCOPYRIGHTS);