update_copyrights revision 855bda3de3bf5d55288f7a1dc57df58b5ac780b0
843e19887f64dde75055cf8842fc4db2171eff45johnlev#!/usr/local/bin/perl -w
843e19887f64dde75055cf8842fc4db2171eff45johnlev#
843e19887f64dde75055cf8842fc4db2171eff45johnlev# Copyright (C) 1998-2000 Internet Software Consortium.
843e19887f64dde75055cf8842fc4db2171eff45johnlev#
843e19887f64dde75055cf8842fc4db2171eff45johnlev# Permission to use, copy, modify, and distribute this software for any
843e19887f64dde75055cf8842fc4db2171eff45johnlev# purpose with or without fee is hereby granted, provided that the above
843e19887f64dde75055cf8842fc4db2171eff45johnlev# copyright notice and this permission notice appear in all copies.
843e19887f64dde75055cf8842fc4db2171eff45johnlev#
843e19887f64dde75055cf8842fc4db2171eff45johnlev# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
843e19887f64dde75055cf8842fc4db2171eff45johnlev# ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
843e19887f64dde75055cf8842fc4db2171eff45johnlev# OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
843e19887f64dde75055cf8842fc4db2171eff45johnlev# CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
843e19887f64dde75055cf8842fc4db2171eff45johnlev# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
843e19887f64dde75055cf8842fc4db2171eff45johnlev# PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
843e19887f64dde75055cf8842fc4db2171eff45johnlev# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
843e19887f64dde75055cf8842fc4db2171eff45johnlev# SOFTWARE.
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev# $Id: update_copyrights,v 1.16 2000/07/03 17:39:23 gson Exp $
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevrequire 5.002;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev# Map copyright owners to the files containing copyright messages.
b26a64ae582e72d0b4c710cd8eba9c4afd4a9fddjohnlev# The first line of the copyright message is not in the file;
843e19887f64dde75055cf8842fc4db2171eff45johnlev# it is constructed by this script.
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevmy %owner2filename = (
843e19887f64dde75055cf8842fc4db2171eff45johnlev "" => "util/COPYRIGHT",
843e19887f64dde75055cf8842fc4db2171eff45johnlev "NAI" => "util/COPYRIGHT.NAI",
843e19887f64dde75055cf8842fc4db2171eff45johnlev "BSDI" => "util/COPYRIGHT.BSDI",
843e19887f64dde75055cf8842fc4db2171eff45johnlev "BRIEF" => "util/COPYRIGHT.BRIEF",
843e19887f64dde75055cf8842fc4db2171eff45johnlev "PORTION" => "util/COPYRIGHT.PORTION",
843e19887f64dde75055cf8842fc4db2171eff45johnlev);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev# Map each copyright owner name to a reference to an array containing
843e19887f64dde75055cf8842fc4db2171eff45johnlev# the lines of the copyright message.
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevmy %owner2text = ();
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevforeach $owner (keys %owner2filename) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev my $f = $owner2filename{$owner};
843e19887f64dde75055cf8842fc4db2171eff45johnlev open(COPYRIGHT, "<$f") || die "can't open $f: $!";
843e19887f64dde75055cf8842fc4db2171eff45johnlev @copyright_text = <COPYRIGHT>;
843e19887f64dde75055cf8842fc4db2171eff45johnlev close(COPYRIGHT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev $owner2text{$owner} = [ @copyright_text ];
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevwhile (<>) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev ($file, $typeandowner, $years_list) = split(/\s+/);
843e19887f64dde75055cf8842fc4db2171eff45johnlev @years = split(/,/, $years_list);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ( ! -f $file ) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev print "$file: missing\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev next;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev my ($type, $owner) = split(/\./, $typeandowner);
843e19887f64dde75055cf8842fc4db2171eff45johnlev $owner = "" if !defined $owner;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev $textp = $owner2text{$owner};
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (!defined $textp) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev print "$file: unknown copyright owner $owner\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev next;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev next if $type eq "X";
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev $before_copyright = "";
843e19887f64dde75055cf8842fc4db2171eff45johnlev $c_comment = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $shell_comment = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $m4_comment = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $html_comment = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $zone_comment = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $man_comment = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $start_comment = "";
843e19887f64dde75055cf8842fc4db2171eff45johnlev $end_comment = "";
843e19887f64dde75055cf8842fc4db2171eff45johnlev $first = "";
b26a64ae582e72d0b4c710cd8eba9c4afd4a9fddjohnlev if ($type =~ /^(C|YACC|CONF-C)/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $c_comment = 1;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $start_comment = "/*\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev $prefix = " * ";
843e19887f64dde75055cf8842fc4db2171eff45johnlev $end_comment = " */\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev } elsif ($type =~ /^(SH|PERL|MAKE|CONF-SH)/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $shell_comment = 1;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $prefix = "# ";
843e19887f64dde75055cf8842fc4db2171eff45johnlev } elsif ($type eq "ZONE") {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $zone_comment = 1;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $prefix = "; ";
843e19887f64dde75055cf8842fc4db2171eff45johnlev } elsif ($type eq "MAN") {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $man_comment = 1;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $prefix = ".\\\" ";
843e19887f64dde75055cf8842fc4db2171eff45johnlev } elsif ($type eq "M4") {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $m4_comment = 1;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $prefix = "dnl ";
843e19887f64dde75055cf8842fc4db2171eff45johnlev } elsif ($type eq "HTML") {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $html_comment = 1;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $start_comment = "<!--\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev $prefix = " - ";
843e19887f64dde75055cf8842fc4db2171eff45johnlev $end_comment = "-->\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev } elsif ($type eq "TXT") {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $prefix = "";
843e19887f64dde75055cf8842fc4db2171eff45johnlev } else {
843e19887f64dde75055cf8842fc4db2171eff45johnlev print "$file: type '$type' not supported yet; skipping\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev next;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev ($nonspaceprefix = $prefix) =~ s/\s+$//;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev open(SOURCE, "<$file") || die "can't open $file: $!";
843e19887f64dde75055cf8842fc4db2171eff45johnlev $_ = <SOURCE>;
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($type eq "YACC") {
843e19887f64dde75055cf8842fc4db2171eff45johnlev unless ($_ eq "%{\n") {
843e19887f64dde75055cf8842fc4db2171eff45johnlev print "$file: unexpected yacc file start (expected \"%{\\n\")\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev close(SOURCE);
843e19887f64dde75055cf8842fc4db2171eff45johnlev next;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev $before_copyright = "$_";
843e19887f64dde75055cf8842fc4db2171eff45johnlev $_ = <SOURCE>;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($c_comment && /^\/\*/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $_ = <SOURCE>;
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($_ !~ /[Cc]opyright/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev print "$file: non-copyright comment\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev close(SOURCE);
843e19887f64dde75055cf8842fc4db2171eff45johnlev next;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($_ !~ /\*\//) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev while (<SOURCE>) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($_ =~ /\*\//) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev last;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev } elsif ($shell_comment) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (/^\#\!/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $before_copyright = "$_#\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev $_ = <SOURCE>;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $_ = <SOURCE> if $_ eq "#\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (/^\#/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($_ !~ /[Cc]opyright/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev print "$file: non-copyright comment\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev close(SOURCE);
843e19887f64dde75055cf8842fc4db2171eff45johnlev next;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev while (<SOURCE>) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($_ !~ /^\#/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $first = $_;
843e19887f64dde75055cf8842fc4db2171eff45johnlev last;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev } else {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $first = $_;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev } elsif (($m4_comment || $zone_comment || $man_comment) &&
843e19887f64dde75055cf8842fc4db2171eff45johnlev /^\Q$nonspaceprefix\E/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev while (/^\Q$nonspaceprefix\E\s*$/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $_ = <SOURCE>;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($_ !~ /[Cc]opyright/) {
b26a64ae582e72d0b4c710cd8eba9c4afd4a9fddjohnlev print "$file: non-copyright comment\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev close(SOURCE);
843e19887f64dde75055cf8842fc4db2171eff45johnlev next;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev while (<SOURCE>) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($_ !~ /^\Q$nonspaceprefix\E/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $first = $_;
843e19887f64dde75055cf8842fc4db2171eff45johnlev last;
b26a64ae582e72d0b4c710cd8eba9c4afd4a9fddjohnlev }
b26a64ae582e72d0b4c710cd8eba9c4afd4a9fddjohnlev }
b26a64ae582e72d0b4c710cd8eba9c4afd4a9fddjohnlev } elsif ($html_comment) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (/^<!DOCTYPE/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $before_copyright = $_;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $_ = <SOURCE>;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (/^<!/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $_ = <SOURCE> if $_ eq "<!--\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($_ !~ /[Cc]opyright/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev print "$file: non-copyright comment\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev close(SOURCE);
843e19887f64dde75055cf8842fc4db2171eff45johnlev next;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev while (defined($_)) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev last if s/.*-->//;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $_ = <SOURCE>;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev print "$file: unterminated comment\n" unless defined($_);
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($_ ne "\n") {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $first = $_;
843e19887f64dde75055cf8842fc4db2171eff45johnlev } else {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $first = <SOURCE>;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev } else {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $first = $_;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev } elsif ($type eq "TXT") {
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($_ =~ /[Cc]opyright/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $/ = ""; # paragraph at a time
843e19887f64dde75055cf8842fc4db2171eff45johnlev while (<SOURCE>) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev # Not very maintainable, but suitable enough for now.
843e19887f64dde75055cf8842fc4db2171eff45johnlev last unless
843e19887f64dde75055cf8842fc4db2171eff45johnlev /See COPYRIGHT in the source root/ ||
843e19887f64dde75055cf8842fc4db2171eff45johnlev /Permission to use, copy, modify, and distribute / ||
843e19887f64dde75055cf8842fc4db2171eff45johnlev /THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET /;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev $/ = "\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev $first = $_;
843e19887f64dde75055cf8842fc4db2171eff45johnlev } else {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $first = $_;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev $first = "" if ! defined($first);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev open(TARGET, ">$file.new") || die "can't open $file.new: $!";
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($before_copyright ne "") {
843e19887f64dde75055cf8842fc4db2171eff45johnlev print TARGET $before_copyright;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($start_comment) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev print TARGET $start_comment;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev $years = "";
843e19887f64dde75055cf8842fc4db2171eff45johnlev $last_year = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $anchor_year = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev foreach $year (@years) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($last_year != 0 && $year == $last_year + 1) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($year > $anchor_year + 1) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev substr($years, $anchor_end) = "-$year";
843e19887f64dde75055cf8842fc4db2171eff45johnlev } else {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $years .= ", $year";
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev } else {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $years .= $last_year == 0 ? "$year" : ", $year";
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($anchor_year != 0) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev print "$file: noncontiguous year: $year != $last_year + 1\n";
b26a64ae582e72d0b4c710cd8eba9c4afd4a9fddjohnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev $anchor_year = $year;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $anchor_end = length($years);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev $last_year = $year;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev ($firstline, @otherlines) = @$textp;
b26a64ae582e72d0b4c710cd8eba9c4afd4a9fddjohnlev
b26a64ae582e72d0b4c710cd8eba9c4afd4a9fddjohnlev $firstline =~ s/\@YEARS\@/$years/;
b26a64ae582e72d0b4c710cd8eba9c4afd4a9fddjohnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev print TARGET "$prefix$firstline";
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev foreach $_ (@otherlines) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev print TARGET "${prefix}$_";
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($end_comment) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev print TARGET $end_comment;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($first eq "") {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $first = <SOURCE>;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (defined($first)) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev print TARGET "\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev undef $/;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $_ = <SOURCE>;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $/ = "\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev my $pat = '\$(Id|Revision):.*\$';
843e19887f64dde75055cf8842fc4db2171eff45johnlev my ($start, $end);
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($start_comment ne "") {
843e19887f64dde75055cf8842fc4db2171eff45johnlev ($start = $start_comment) =~ s/\s*\n/ /;
843e19887f64dde75055cf8842fc4db2171eff45johnlev ($end = $end_comment) =~ s/^\s*(.*)\n/ $1\n/;
843e19887f64dde75055cf8842fc4db2171eff45johnlev } elsif ($prefix ne "") {
843e19887f64dde75055cf8842fc4db2171eff45johnlev ($start = $prefix) =~ s/\s*\n//;
843e19887f64dde75055cf8842fc4db2171eff45johnlev $end = "\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev } else {
843e19887f64dde75055cf8842fc4db2171eff45johnlev $start = "";
843e19887f64dde75055cf8842fc4db2171eff45johnlev $end = "\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ($first !~ /$pat/ && $_ !~ /$pat/) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev print TARGET "$start\$";
843e19887f64dde75055cf8842fc4db2171eff45johnlev print TARGET "Id: ";
843e19887f64dde75055cf8842fc4db2171eff45johnlev print TARGET "\$$end\n";
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev print TARGET $first if $first !~ /^\s*$/;
843e19887f64dde75055cf8842fc4db2171eff45johnlev print TARGET $_;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev close(TARGET);
843e19887f64dde75055cf8842fc4db2171eff45johnlev close(SOURCE);
843e19887f64dde75055cf8842fc4db2171eff45johnlev $mode = (stat $file)[2]&511;
843e19887f64dde75055cf8842fc4db2171eff45johnlev chmod $mode, "$file.new";
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (system("cmp -s $file.new $file") == 0) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev unlink("$file.new");
843e19887f64dde75055cf8842fc4db2171eff45johnlev } else {
843e19887f64dde75055cf8842fc4db2171eff45johnlev rename("$file", "$file.bak") || die "rename($file, $file.bak): $!";
843e19887f64dde75055cf8842fc4db2171eff45johnlev rename("$file.new", "$file") || die "rename($file.new, $file): $!";
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev