| 
									
										
										
										
											2016-01-15 14:47:40 +01:00
										 |  |  | #!/usr/bin/perl -w | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-15 14:52:30 +01:00
										 |  |  | ############################################################################ | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Copyright (C) 2016 The Qt Company Ltd. | 
					
						
							|  |  |  | # Contact: https://www.qt.io/licensing/ | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This file is part of Qt Creator. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Commercial License Usage | 
					
						
							|  |  |  | # Licensees holding valid commercial Qt licenses may use this file in | 
					
						
							|  |  |  | # accordance with the commercial license agreement provided with the | 
					
						
							|  |  |  | # Software or, alternatively, in accordance with the terms contained in | 
					
						
							|  |  |  | # a written agreement between you and The Qt Company. For licensing terms | 
					
						
							|  |  |  | # and conditions see https://www.qt.io/terms-conditions. For further | 
					
						
							|  |  |  | # information use the contact form at https://www.qt.io/contact-us. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # GNU General Public License Usage | 
					
						
							|  |  |  | # Alternatively, this file may be used under the terms of the GNU | 
					
						
							|  |  |  | # General Public License version 3 as published by the Free Software | 
					
						
							|  |  |  | # Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT | 
					
						
							|  |  |  | # included in the packaging of this file. Please review the following | 
					
						
							|  |  |  | # information to ensure the GNU General Public License requirements will | 
					
						
							|  |  |  | # be met: https://www.gnu.org/licenses/gpl-3.0.html. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | ############################################################################ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-15 14:47:40 +01:00
										 |  |  | use strict; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | my $old_template = shift @ARGV; | 
					
						
							|  |  |  | my $new_template = shift @ARGV; | 
					
						
							|  |  |  | my $file = shift @ARGV; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Usage: git grep "(C) " | cut -d':' -f1 | sort -u | xargs -L 1 scripts/updateCopyright.pl old.header new.header | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # This will remove a verbatim copy of old.header from the file | 
					
						
							|  |  |  | # given as the last argument and then inserts the new.header | 
					
						
							|  |  |  | # instead. It may retain copyright year, copyright holder, author | 
					
						
							|  |  |  | # lines or "this file is part of" information. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # All lines of the old.header are compared to the lines in the file. | 
					
						
							|  |  |  | # Exceptions are lines matching "Copyright (C) (\d+) ", "Author: " or | 
					
						
							|  |  |  | # "file is part of" which will must also match both the old.template | 
					
						
							|  |  |  | # as well as the file-line to be considered a match. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # If there is no match between old.header and the start of file, then | 
					
						
							|  |  |  | # the file is skipped. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Set which information to keep from the file here: | 
					
						
							|  |  |  | my $keepYear = 0; | 
					
						
							|  |  |  | my $keepHolder = 1; | 
					
						
							|  |  |  | my $keepContact = 1; | 
					
						
							|  |  |  | my $keepPartOf = 1; | 
					
						
							|  |  |  | my $keepAuthors = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Do not edit below this line... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | die "Usage: $0 /path/to/oldtemplate /path/to/newtemplate /path/to/file\n" unless $file; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | open TEMPLATE, "<$old_template" or die $!; | 
					
						
							|  |  |  | my @oldT = <TEMPLATE>; | 
					
						
							|  |  |  | close TEMPLATE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | open TEMPLATE, "<$new_template" or die $!; | 
					
						
							|  |  |  | my @newT = <TEMPLATE>; | 
					
						
							|  |  |  | close TEMPLATE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | open FILE, "<$file" or die $!; | 
					
						
							|  |  |  | my @contents = <FILE>; | 
					
						
							|  |  |  | close FILE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | my $currentLineNo = -1; | 
					
						
							|  |  |  | my $oldLineNo = -1; | 
					
						
							|  |  |  | my @copyrightYear; | 
					
						
							|  |  |  | my @copyrightHolder; | 
					
						
							|  |  |  | my @authors; | 
					
						
							|  |  |  | my $contactInfo = ""; | 
					
						
							|  |  |  | my $partOf = ""; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | my $matched = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | my $hadCopyright = 0; | 
					
						
							|  |  |  | my $hadAuthors = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | foreach (@contents) { | 
					
						
							|  |  |  |     last unless $matched; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     my $currentLine = $_; | 
					
						
							|  |  |  |     ++$currentLineNo; | 
					
						
							|  |  |  |     ++$oldLineNo unless $hadCopyright or $hadAuthors; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     last if $oldLineNo == @oldT; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     my $oldLine = $oldT[$oldLineNo]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # print "$currentLineNo: $currentLine"; | 
					
						
							|  |  |  |     # print "old: $oldLine"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($currentLine =~ / Copyright .C. (\d+) (.*)$/i) { | 
					
						
							|  |  |  |         $hadAuthors = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         push(@copyrightYear, $1); | 
					
						
							|  |  |  |         my $holder = $2; | 
					
						
							|  |  |  |         # sanitize "Copyright (C) 2014 - 2016 whoever" | 
					
						
							|  |  |  |         if ($holder =~ /^- \d\d\d\d (.*)$/) { $holder = $1; } | 
					
						
							|  |  |  |         push(@copyrightHolder, $holder); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ## print "  Found copyright ($1, $2)...\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!$hadCopyright) { | 
					
						
							|  |  |  |             $hadCopyright = 1; | 
					
						
							|  |  |  |             ++$oldLineNo; | 
					
						
							|  |  |  |             $matched = 0 unless $oldLine =~ / Copyright .C. \d+ /i; | 
					
						
							|  |  |  |             ### print "    matched copyright: $matched\n"; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         next; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     $hadCopyright = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($currentLine =~ / Author: (.*)$/i) { | 
					
						
							|  |  |  |         push(@authors, $1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ## print "  Found author...\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!$hadAuthors) { | 
					
						
							|  |  |  |             $hadAuthors = 1; | 
					
						
							|  |  |  |             ++$oldLineNo; | 
					
						
							|  |  |  |             $matched = 0 unless $oldLine =~ / Author: /i; | 
					
						
							|  |  |  |             ### print "    matched author: $matched\n"; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         next; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     $hadAuthors = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($currentLine =~ / Contact: (.*)$/i) { | 
					
						
							|  |  |  |         $contactInfo = $1; | 
					
						
							|  |  |  |         ## print "  Found contact...\n"; | 
					
						
							|  |  |  |         $matched = 0 unless $oldLine =~ / Contact: /i; | 
					
						
							|  |  |  |         ### print "    matched contact: $matched\n"; | 
					
						
							|  |  |  |         next; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if ($currentLine =~ / file is part of (.*)$/) { | 
					
						
							|  |  |  |         $partOf = $1; | 
					
						
							|  |  |  |         ## print "  Found part of...\n"; | 
					
						
							|  |  |  |         $matched = 0 unless $oldLine =~ / file is part of /; | 
					
						
							|  |  |  |         ### print "    matched partOf: $matched\n"; | 
					
						
							|  |  |  |         next; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     $matched = 0 unless $oldLine eq $currentLine; | 
					
						
							|  |  |  |     ### print "    GENERIC: $matched\n"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!$matched) { | 
					
						
							|  |  |  |     print "$file: did not match input template. Skipping.\n"; | 
					
						
							|  |  |  |     exit 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # remove empty lines... | 
					
						
							|  |  |  | ++$currentLineNo while ($currentLineNo < @contents and $contents[$currentLineNo] =~ /^\s*$/); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | splice @contents, 0, $currentLineNo; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | print "Contents found in $file:\n"; | 
					
						
							|  |  |  | print "Copyright:\n"; | 
					
						
							|  |  |  | for (my $i = 0; $i < @copyrightYear; ++$i) { | 
					
						
							|  |  |  |     print "    " . $copyrightYear[$i] . " - " . $copyrightHolder[$i] . ".\n"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | print "Authors:\n"; | 
					
						
							|  |  |  | foreach (@authors) { print "    $_...\n"; } | 
					
						
							|  |  |  | print "Contact: $contactInfo...\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Write file: | 
					
						
							|  |  |  | my $hasEmptyLine = 0; | 
					
						
							|  |  |  | open FILE, ">$file" or die "Failed to write into $file: $!.\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | foreach (@newT) { | 
					
						
							|  |  |  |     my $currentLine = $_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $hasEmptyLine = ($currentLine =~ /^\s*$/); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($currentLine =~ /^(.* Copyright .C.) (\d+) (.*)$/i) { | 
					
						
							|  |  |  |         my $prefix = $1; | 
					
						
							|  |  |  |         my $year = $2; | 
					
						
							|  |  |  |         my $holder = $3; | 
					
						
							|  |  |  |         if ($keepYear || $keepHolder) { | 
					
						
							|  |  |  |             for (my $i = 0; $i < @copyrightYear; ++$i) { | 
					
						
							|  |  |  |                 my $y = $year; | 
					
						
							|  |  |  |                 $y = $copyrightYear[$i] if $keepYear; | 
					
						
							|  |  |  |                 my $h = $holder; | 
					
						
							|  |  |  |                 $h = $copyrightHolder[$i] if $keepHolder; | 
					
						
							|  |  |  |                 print FILE "$prefix $y $h\n"; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             next; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($currentLine =~ /^(.* Author:) (.*)$/i) { | 
					
						
							|  |  |  |         my $prefix = $1; | 
					
						
							|  |  |  |         my $author = $2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($keepAuthors) { | 
					
						
							|  |  |  |             foreach (@authors) { print FILE "$prefix $_\n"; } | 
					
						
							|  |  |  |             next; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($currentLine =~ /^(.* Contact:) (.*)$/i) { | 
					
						
							|  |  |  |         my $prefix = $1; | 
					
						
							|  |  |  |         $contactInfo = $2 unless $contactInfo; | 
					
						
							|  |  |  |         if ($keepContact) { | 
					
						
							|  |  |  |             print FILE "$prefix $contactInfo\n"; | 
					
						
							|  |  |  |             next; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($currentLine =~ /^(.* file is part of) (.*)$/) { | 
					
						
							|  |  |  |         my $prefix = $1; | 
					
						
							|  |  |  |         if ($keepPartOf) { | 
					
						
							|  |  |  |             $partOf = $2 unless $partOf; | 
					
						
							|  |  |  |             print FILE "$prefix $partOf\n"; | 
					
						
							|  |  |  |             next; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     print FILE $currentLine; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | print FILE "\n" unless ($hasEmptyLine); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | foreach (@contents) { print FILE $_; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | close FILE; |