#!/usr/local/bin/perl -w use strict; #use Cwd; use File::Copy; #use File::Basename; #use File::Find; use Getopt::Std; # This script updates (a) file(s) from the pure LGPL header version # to the one mentionning the commercial license too. # The precondition is that is has a valid (old) header. sub usage() { print STDERR<<"EOF"; usage: $0 [-h] [-q owner] file1 ... -h show this message and quit -q owner (default: LGPL, otherwise it's QPL, with choices among : UU, INRIA, ETHZ, FUB, MPI, RISC, TAU, TRIER, HW, which will be expanded) EOF } my $lgpl_owner="Utrecht University (The Netherlands), // ETH Zurich (Switzerland), Freie Universitaet Berlin (Germany), // INRIA Sophia-Antipolis (France), Martin-Luther-University Halle-Wittenberg // (Germany), Max-Planck-Institute Saarbrucken (Germany), RISC Linz (Austria), // and Tel-Aviv University (Israel)."; my %qpl_owners=("UU" => "Utrecht University (The Netherlands)", "INRIA" => "INRIA Sophia-Antipolis (France)", "ETHZ" => "ETH Zurich (Switzerland)", "FUB" => "Freie Universitaet Berlin (Germany)", "MPI" => "Max-Planck-Institute Saarbrucken (Germany)", "RISC" => "RISC Linz (Austria)", "TAU" => "Tel-Aviv University (Israel)", "TRIER" => "University of Trier (Germany)", "HW" => "Martin-Luther-University Halle-Wittenberg (Germany)" ); sub gjmove($$) { return 1 if rename($_[0], $_[1] ); return (system('mv', "$_[0]", "$_[1]") == 0); } #----------------------------------------------------------------# # initialization # #----------------------------------------------------------------# my $TEMPFILE; sub print_qpl_license() { print TEMPFILE <<'END_OF_LICENSE'; // This file is part of CGAL (www.cgal.org); you may redistribute it under // the terms of the Q Public License version 1.0. // See the file LICENSE.QPL distributed with CGAL. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. END_OF_LICENSE } sub print_lgpl_license() { print TEMPFILE <<'END_OF_LICENSE'; // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation; version 2.1 of the License. // See the file LICENSE.LGPL distributed with CGAL. END_OF_LICENSE } #----------------------------------------------------------------# # check_and_update_2 # #----------------------------------------------------------------# sub check_and_update_2($$) { # my ($filename, $owner) = @_; # my $header_position = 1; # 1:before header; 2: in first part; 3: in second part 4: after header. my $old_sentence="See the file LICENSE.LGPL distributed with CGAL."; my $new_sentence=$old_sentence."\n"."//\n"."// Licensees holding a valid commercial license may use this file in\n"."// accordance with the commercial license agreement provided with the software."; # while ( ) { s/$old_sentence/$new_sentence/; print TEMPFILE $_; } # my $text_before_header = 0; # while ( ) { # if ( m|^\s*//\s*={10,}\s*$| ) { # $header_position = 2; # last; # } # if ( $_ !~ m|^\s*$| ) { # $text_before_header = 1; # } # print TEMPFILE $_; # } # if ($header_position != 2) { # print FILE_CHECKS "$filename has no header.\n"; # return 0; # } # if ($text_before_header) { # print FILE_CHECKS "$filename has text before the header.\n"; # } # $_ = ; # $_ = while (m|^\s*//\s*$|); # if ($_ !~ m<^\s*//\s*Copyright\s*\(c\)\s*\d{4}([-,]\s?\d{4})*\s+(t|T)he CGAL Consortium\s*$> ) { # print FILE_CHECKS "$filename has no valid copyright notice.\n"; # return 0; # } # # if (defined($owner)) { # # QPL case. # my $qpl_owner=$qpl_owners{$owner}; # s/(t|T)he CGAL Consortium\s*$/ $qpl_owner/; # print TEMPFILE $_; # print TEMPFILE ".\n// All rights reserved.\n//\n"; # print_qpl_license; # } else { # # LGPL case. # s/(t|T)he CGAL Consortium\s*$/ $lgpl_owner/; # print TEMPFILE $_; # print TEMPFILE " All rights reserved.\n//\n"; # print_lgpl_license; # } # # print TEMPFILE <<'END_OF_DISCLAIMER'; #// #// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE #// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. #// #// $URL$ #// $Id$ #// #// #END_OF_DISCLAIMER # # my ($authors_seen) = (0); # while ( ) { # next if ($_ !~ m|^\s*//| ); # ++$authors_seen if m<^\s*//\s*author(s|\(s\))?\s*:>; # if ($authors_seen > 0) { # if (m<^\s*//\s*(coordinator|package|release|maintainer)(s|\(s\))?\s*:>) { # --$authors_seen; # } else { # if (! m|//\s*$|) { # s/author/Author/; # print TEMPFILE $_; # we keep the authors # } # } # } # last if /======/; # } # # while ( ) { # print TEMPFILE $_; # } # return 0; } sub check_and_update_file($$) { my ($filename, $owner) = @_; open SOURCE_FILE, "<$filename" || die "Error opening $filename: $!\n"; open TEMPFILE, ">$TEMPFILE" || die; check_and_update_2($filename, $owner); close SOURCE_FILE || die "Error closing $filename: $!"; close TEMPFILE || die "Error closing temporary file: $!\n"; gjmove($TEMPFILE, $filename ) || warn "Could not update file $filename\n"; } #$::PARENT_DIR=cwd(); sub main() { umask(002); getopts('hq:'); if ($::opt_h ) { usage; return; } $::opt_h = 0; if ($::opt_q and not $qpl_owners{$::opt_q}) { print "Unknown QPL owner\n"; return; } $TEMPFILE="tmp.$$"; open FILE_CHECKS, ">-"; my $filename; foreach $filename (@ARGV) { print "new_headers acting on $filename.\n"; check_and_update_file($filename, $::opt_q); } close FILE_CHECKS; } main;