<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[160611] trunk/Tools</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/160611">160611</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2013-12-14 20:47:06 -0800 (Sat, 14 Dec 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>stylebot should warn when FeatureDefines differ
https://bugs.webkit.org/show_bug.cgi?id=125748

Reviewed by Dan Bernstein.

Add a stylebot checker that ensures that FeatureDefines.xcconfig files
are always exactly equal (and warns people adding new FeatureDefines.xcconfig files,
an unlikely occurrance, to add them to the list).

It's a bit nontraditional for stylebot because it will warn on existing errors in the tree,
but that is the most straightforward way to implement it (and we're at zero diffs right now).

* Scripts/webkitpy/style/checker.py:
(_all_categories):
(FileType):
(CheckerDispatcher._file_type):
(CheckerDispatcher._create_checker):
* Scripts/webkitpy/style/checkers/featuredefines.py: Added.
(FeatureDefinesChecker):
(FeatureDefinesChecker.__init__):
(FeatureDefinesChecker.check):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsScriptswebkitpystylecheckerpy">trunk/Tools/Scripts/webkitpy/style/checker.py</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkToolsScriptswebkitpystylecheckersfeaturedefinespy">trunk/Tools/Scripts/webkitpy/style/checkers/featuredefines.py</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (160610 => 160611)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2013-12-15 03:08:50 UTC (rev 160610)
+++ trunk/Tools/ChangeLog        2013-12-15 04:47:06 UTC (rev 160611)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2013-12-14  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+        stylebot should warn when FeatureDefines differ
+        https://bugs.webkit.org/show_bug.cgi?id=125748
+
+        Reviewed by Dan Bernstein.
+
+        Add a stylebot checker that ensures that FeatureDefines.xcconfig files
+        are always exactly equal (and warns people adding new FeatureDefines.xcconfig files,
+        an unlikely occurrance, to add them to the list).
+
+        It's a bit nontraditional for stylebot because it will warn on existing errors in the tree,
+        but that is the most straightforward way to implement it (and we're at zero diffs right now).
+
+        * Scripts/webkitpy/style/checker.py:
+        (_all_categories):
+        (FileType):
+        (CheckerDispatcher._file_type):
+        (CheckerDispatcher._create_checker):
+        * Scripts/webkitpy/style/checkers/featuredefines.py: Added.
+        (FeatureDefinesChecker):
+        (FeatureDefinesChecker.__init__):
+        (FeatureDefinesChecker.check):
+
</ins><span class="cx"> 2013-12-13  Sam Weinig  &lt;sam@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix API tests.
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpystylecheckerpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/style/checker.py (160610 => 160611)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/style/checker.py        2013-12-15 03:08:50 UTC (rev 160610)
+++ trunk/Tools/Scripts/webkitpy/style/checker.py        2013-12-15 04:47:06 UTC (rev 160611)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> from checkers.changelog import ChangeLogChecker
</span><span class="cx"> from checkers.cpp import CppChecker
</span><span class="cx"> from checkers.cmake import CMakeChecker
</span><ins>+from checkers.featuredefines import FeatureDefinesChecker
</ins><span class="cx"> from checkers.js import JSChecker
</span><span class="cx"> from checkers.jsonchecker import JSONChecker
</span><span class="cx"> from checkers.jsonchecker import JSONContributorsChecker
</span><span class="lines">@@ -359,6 +360,7 @@
</span><span class="cx">     categories = categories.union(TestExpectationsChecker.categories)
</span><span class="cx">     categories = categories.union(ChangeLogChecker.categories)
</span><span class="cx">     categories = categories.union(PNGChecker.categories)
</span><ins>+    categories = categories.union(FeatureDefinesChecker.categories)
</ins><span class="cx"> 
</span><span class="cx">     # FIXME: Consider adding all of the pep8 categories.  Since they
</span><span class="cx">     #        are not too meaningful for documentation purposes, for
</span><span class="lines">@@ -508,6 +510,7 @@
</span><span class="cx">     XML = 9
</span><span class="cx">     XCODEPROJ = 10
</span><span class="cx">     CMAKE = 11
</span><ins>+    FEATUREDEFINES = 12
</ins><span class="cx"> 
</span><span class="cx"> class CheckerDispatcher(object):
</span><span class="cx"> 
</span><span class="lines">@@ -592,6 +595,8 @@
</span><span class="cx">         elif ((not file_extension and os.path.join(&quot;Tools&quot;, &quot;Scripts&quot;) in file_path) or
</span><span class="cx">               file_extension in _TEXT_FILE_EXTENSIONS or os.path.basename(file_path) == 'TestExpectations'):
</span><span class="cx">             return FileType.TEXT
</span><ins>+        elif os.path.basename(file_path) == &quot;FeatureDefines.xcconfig&quot;:
+            return FileType.FEATUREDEFINES
</ins><span class="cx">         else:
</span><span class="cx">             return FileType.NONE
</span><span class="cx"> 
</span><span class="lines">@@ -641,6 +646,8 @@
</span><span class="cx">                 checker = TextChecker(file_path, handle_style_error)
</span><span class="cx">         elif file_type == FileType.WATCHLIST:
</span><span class="cx">             checker = WatchListChecker(file_path, handle_style_error)
</span><ins>+        elif file_type == FileType.FEATUREDEFINES:
+            checker = FeatureDefinesChecker(file_path, handle_style_error)
</ins><span class="cx">         else:
</span><span class="cx">             raise ValueError('Invalid file type &quot;%(file_type)s&quot;: the only valid file types '
</span><span class="cx">                              &quot;are %(NONE)s, %(CPP)s, and %(TEXT)s.&quot;
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpystylecheckersfeaturedefinespy"></a>
<div class="addfile"><h4>Added: trunk/Tools/Scripts/webkitpy/style/checkers/featuredefines.py (0 => 160611)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/style/checkers/featuredefines.py                                (rev 0)
+++ trunk/Tools/Scripts/webkitpy/style/checkers/featuredefines.py        2013-12-15 04:47:06 UTC (rev 160611)
</span><span class="lines">@@ -0,0 +1,63 @@
</span><ins>+# Copyright (C) 2013 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+&quot;&quot;&quot;Supports ensuring equality of FeatureDefines.xcconfig files.&quot;&quot;&quot;
+
+import os
+
+from webkitpy.common.system.systemhost import SystemHost
+
+
+class FeatureDefinesChecker(object):
+    categories = set(['featuredefines/new', 'featuredefines/equality'])
+
+    def __init__(self, file_path, handle_style_error):
+        self._file_path = file_path
+        self._handle_style_error = handle_style_error
+        self._handle_style_error.turn_off_line_filtering()
+        self._host = SystemHost()
+        self._fs = self._host.filesystem
+
+    def check(self, inline=None):
+        feature_defines_files = [
+            &quot;Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig&quot;,
+            &quot;Source/WebCore/Configurations/FeatureDefines.xcconfig&quot;,
+            &quot;Source/WebKit/mac/Configurations/FeatureDefines.xcconfig&quot;,
+            &quot;Source/WebKit2/Configurations/FeatureDefines.xcconfig&quot;]
+
+        if self._file_path not in feature_defines_files:
+            self._handle_style_error(0, 'featuredefines/new', 5, &quot;Patch introduces a new FeatureDefines.xcconfig, which check-webkit-style doesn't know about. Please add it to the list in featuredefines.py.&quot;)
+            return
+
+        with self._fs.open_binary_file_for_reading(self._file_path) as filehandle:
+            baseline_content = filehandle.read()
+
+        other_feature_defines_files = feature_defines_files
+        other_feature_defines_files.remove(self._file_path)
+
+        for path in other_feature_defines_files:
+            with self._fs.open_binary_file_for_reading(path) as filehandle:
+                test_content = filehandle.read()
+                if baseline_content != test_content:
+                    self._handle_style_error(0, 'featuredefines/equality', 5, &quot;Any changes made to FeatureDefines should be made to all of them (changed file does not match {0}).&quot;.format(path))
</ins></span></pre>
</div>
</div>

</body>
</html>