* Scripts/commit-log-editor: Added missing "close" call. Oops!
[WebKit-https.git] / WebKitTools / Scripts / commit-log-editor
1 #!/usr/bin/perl -w
2
3 # Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 #
9 # 1.  Redistributions of source code must retain the above copyright
10 #     notice, this list of conditions and the following disclaimer. 
11 # 2.  Redistributions in binary form must reproduce the above copyright
12 #     notice, this list of conditions and the following disclaimer in the
13 #     documentation and/or other materials provided with the distribution. 
14 # 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15 #     its contributors may be used to endorse or promote products derived
16 #     from this software without specific prior written permission. 
17 #
18 # THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 # DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 # Script to put change log comments in as default check-in comment.
30
31 use strict;
32
33 my $log = $ARGV[0];
34
35 my $symroots = $ENV{SYMROOTS} || "$ENV{HOME}/symroots";
36
37 my $editor = $ENV{SVN_LOG_EDITOR};
38 if (!$editor) {
39     $editor = $ENV{CVS_LOG_EDITOR};
40 }
41 if (!$editor) {
42     my $builtEditorApplication = "$symroots/Release/Commit Log Editor.app/Contents/MacOS/Commit Log Editor";
43     $editor = $builtEditorApplication if -x $builtEditorApplication;
44 }
45 if (!$editor) {
46     my $builtEditorApplication = "$symroots/Debug/Commit Log Editor.app/Contents/MacOS/Commit Log Editor";
47     $editor = $builtEditorApplication if -x $builtEditorApplication;
48 }
49 if (!$editor) {
50     my $installedEditorApplication = "$ENV{HOME}/Applications/Commit Log Editor.app/Contents/MacOS/Commit Log Editor";
51     $editor = $installedEditorApplication if -x $installedEditorApplication;
52 }
53 if (!$editor) {
54     $editor = $ENV{EDITOR} || "/usr/bin/vi";
55 }
56
57 my $breakPoint = 0;
58 my @changeLogs = ();
59 my $logContents = "";
60 open LOG, $log or die;
61 while (<LOG>) {
62     $breakPoint = /^--This line, and those below, will be ignored--$/ unless $breakPoint;
63     $logContents .= $_;
64     push @changeLogs, $1 if /^M....(.*ChangeLog)$/ && !/-ChangeLog/;
65 }
66 close LOG;
67
68 my %changeLogSort;
69 my %changeLogContents;
70 for my $changeLog (@changeLogs) {
71     open CHANGELOG, $changeLog or die "Can't open $changeLog";
72     my $contents = "";
73     my $blankLines = "";
74     while (<CHANGELOG>) {
75         if (/^\S/) {
76             last if $contents;
77             next;
78         } elsif (/\S/) {
79             $contents .= $blankLines if $contents;
80             $blankLines = "";
81             $contents .= $_;
82         } else {
83             $blankLines .= $_;
84         }
85     }
86     close CHANGELOG;
87
88     my $label;
89     if ($changeLog =~ m-^(.*/)?([^/]+)/ChangeLog$-) {
90         $label = $2;
91     } else {
92         $label = "top level";
93     }
94
95     my $sortKey = lc $label;
96     if ($label eq "top level") {
97         $sortKey = "";
98     } elsif ($label eq "Tools") {
99         $sortKey = "-, just after top level";
100     } elsif ($label eq "WebBrowser") {
101         $sortKey = lc "WebKit, WebBrowser after";
102     } elsif ($label eq "WebCore") {
103         $sortKey = lc "WebFoundation, WebCore after";
104     }
105
106     $changeLogSort{$sortKey} = $label;
107     $changeLogContents{$label} = $contents;
108 }
109
110 my $first = 1;
111 open NEWLOG, ">$log.edit" or die;
112 for my $sortKey (sort keys %changeLogSort) {
113     my $label = $changeLogSort{$sortKey};
114     if (keys %changeLogSort > 1) {
115         print NEWLOG "\n" if !$first;
116         $first = 0;
117         print NEWLOG "$label:\n\n";
118     }
119     print NEWLOG $changeLogContents{$label};
120 }
121 print NEWLOG $logContents;
122 close NEWLOG;
123
124 system $editor, "$log.edit";
125
126 open NEWLOG, "$log.edit" or exit;
127 my $foundComment = 0;
128 while (<NEWLOG>) {
129     $foundComment = 1 if (/\S/ && !/^CVS:/);
130 }
131 close NEWLOG;
132
133 if ($foundComment) {
134     open NEWLOG, "$log.edit" or die;
135     open LOG, ">$log" or die;
136     while (<NEWLOG>) {
137         print LOG;
138     }
139     close LOG;
140     close NEWLOG;
141 }
142
143 unlink "$log.edit";