<!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>[149480] 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/149480">149480</a></dd>
<dt>Author</dt> <dd>glenn@skynav.com</dd>
<dt>Date</dt> <dd>2013-05-01 19:10:25 -0700 (Wed, 01 May 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>[webkitpy] Need abstract base class for commands that analyze commit logs
https://bugs.webkit.org/show_bug.cgi?id=115391

Reviewed by Benjamin Poulain.

Move commit log parsing functions into new abstract base class AbstractCommitLogCommand
in preparation for adding two new commands that will reuse this functionality along with
suggest-nominations. See https://bugs.webkit.org/show_bug.cgi?id=115387 and
https://bugs.webkit.org/show_bug.cgi?id=115388.

No new tests as this patch does not change existing functionality or behavior.

* Scripts/webkitpy/tool/commands/suggestnominations.py:
(AbstractCommitLogCommand): Add abstract base class for commands that analyze commit logs.
(AbstractCommitLogCommand.__init__):
(AbstractCommitLogCommand._init_options):
(AbstractCommitLogCommand._parse_commit_message):
(SuggestNominations): Move generic commit log parsing into new base class. Use new base class.
(SuggestNominations.__init__):
(SuggestNominations._init_options):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsScriptswebkitpytoolcommandssuggestnominationspy">trunk/Tools/Scripts/webkitpy/tool/commands/suggestnominations.py</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (149479 => 149480)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2013-05-02 02:01:43 UTC (rev 149479)
+++ trunk/Tools/ChangeLog        2013-05-02 02:10:25 UTC (rev 149480)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2013-05-01  Glenn Adams  &lt;glenn@skynav.com&gt;
+
+        [webkitpy] Need abstract base class for commands that analyze commit logs
+        https://bugs.webkit.org/show_bug.cgi?id=115391
+
+        Reviewed by Benjamin Poulain.
+
+        Move commit log parsing functions into new abstract base class AbstractCommitLogCommand
+        in preparation for adding two new commands that will reuse this functionality along with
+        suggest-nominations. See https://bugs.webkit.org/show_bug.cgi?id=115387 and
+        https://bugs.webkit.org/show_bug.cgi?id=115388.
+
+        No new tests as this patch does not change existing functionality or behavior.
+
+        * Scripts/webkitpy/tool/commands/suggestnominations.py:
+        (AbstractCommitLogCommand): Add abstract base class for commands that analyze commit logs.
+        (AbstractCommitLogCommand.__init__):
+        (AbstractCommitLogCommand._init_options):
+        (AbstractCommitLogCommand._parse_commit_message):
+        (SuggestNominations): Move generic commit log parsing into new base class. Use new base class.
+        (SuggestNominations.__init__): 
+        (SuggestNominations._init_options):
+
</ins><span class="cx"> 2013-05-01  Seokju Kwon  &lt;seokju.kwon@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Fix check-inspector-strings script and fix localized strings
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpytoolcommandssuggestnominationspy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/tool/commands/suggestnominations.py (149479 => 149480)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/tool/commands/suggestnominations.py        2013-05-02 02:01:43 UTC (rev 149479)
+++ trunk/Tools/Scripts/webkitpy/tool/commands/suggestnominations.py        2013-05-02 02:10:25 UTC (rev 149480)
</span><span class="lines">@@ -46,10 +46,7 @@
</span><span class="cx">         CommitLogError.__init__(self)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-class SuggestNominations(Command):
-    name = &quot;suggest-nominations&quot;
-    help_text = &quot;Suggest contributors for committer/reviewer nominations&quot;
-
</del><ins>+class AbstractCommitLogCommand(Command):
</ins><span class="cx">     _leading_indent_regexp = re.compile(r&quot;^[ ]{4}&quot;, re.MULTILINE)
</span><span class="cx">     _reviewed_by_regexp = re.compile(ChangeLogEntry.reviewed_by_regexp, re.MULTILINE)
</span><span class="cx">     _patch_by_regexp = re.compile(r'^Patch by (?P&lt;name&gt;.+?)\s+&lt;(?P&lt;email&gt;[^&lt;&gt;]+)&gt; on (?P&lt;date&gt;\d{4}-\d{2}-\d{2})$', re.MULTILINE)
</span><span class="lines">@@ -57,23 +54,19 @@
</span><span class="cx">     _date_regexp = re.compile(r'^Date:   (?P&lt;date&gt;\d{4}-\d{2}-\d{2}) (?P&lt;time&gt;\d{2}:\d{2}:\d{2}) [\+\-]\d{4}$', re.MULTILINE)
</span><span class="cx">     _revision_regexp = re.compile(r'^git-svn-id: http://svn.webkit.org/repository/webkit/trunk@(?P&lt;svnid&gt;\d+) (?P&lt;gitid&gt;[0-9a-f\-]{36})$', re.MULTILINE)
</span><span class="cx"> 
</span><del>-    def __init__(self):
-        options = [
-            make_option(&quot;--committer-minimum&quot;, action=&quot;store&quot;, dest=&quot;committer_minimum&quot;, type=&quot;int&quot;, default=10, help=&quot;Specify minimum patch count for Committer nominations.&quot;),
-            make_option(&quot;--reviewer-minimum&quot;, action=&quot;store&quot;, dest=&quot;reviewer_minimum&quot;, type=&quot;int&quot;, default=80, help=&quot;Specify minimum patch count for Reviewer nominations.&quot;),
-            make_option(&quot;--max-commit-age&quot;, action=&quot;store&quot;, dest=&quot;max_commit_age&quot;, type=&quot;int&quot;, default=9, help=&quot;Specify max commit age to consider for nominations (in months).&quot;),
-            make_option(&quot;--show-commits&quot;, action=&quot;store_true&quot;, dest=&quot;show_commits&quot;, default=False, help=&quot;Show commit history with nomination suggestions.&quot;),
</del><ins>+    def __init__(self, options=None):
+        options = options or []
+        options += [
+            make_option(&quot;--max-commit-age&quot;, action=&quot;store&quot;, dest=&quot;max_commit_age&quot;, type=&quot;int&quot;, default=9, help=&quot;Specify maximum commit age to consider (in months).&quot;),
</ins><span class="cx">         ]
</span><del>-        super(SuggestNominations, self).__init__(options=options)
</del><ins>+        options = sorted(options, cmp=lambda a, b: cmp(a._long_opts, b._long_opts))
+        super(AbstractCommitLogCommand, self).__init__(options=options)
</ins><span class="cx">         # FIXME: This should probably be on the tool somewhere.
</span><span class="cx">         self._committer_list = CommitterList()
</span><span class="cx"> 
</span><span class="cx">     def _init_options(self, options):
</span><del>-        self.committer_minimum = options.committer_minimum
-        self.reviewer_minimum = options.reviewer_minimum
</del><ins>+        self.verbose = options.verbose
</ins><span class="cx">         self.max_commit_age = options.max_commit_age
</span><del>-        self.show_commits = options.show_commits
-        self.verbose = options.verbose
</del><span class="cx"> 
</span><span class="cx">     # FIXME: This should move to scm.py
</span><span class="cx">     def _recent_commit_messages(self):
</span><span class="lines">@@ -150,6 +143,25 @@
</span><span class="cx">             'reviewers': reviewers,
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+
+class SuggestNominations(AbstractCommitLogCommand):
+    name = &quot;suggest-nominations&quot;
+    help_text = &quot;Suggest contributors for committer/reviewer nominations&quot;
+
+    def __init__(self):
+        options = [
+            make_option(&quot;--committer-minimum&quot;, action=&quot;store&quot;, dest=&quot;committer_minimum&quot;, type=&quot;int&quot;, default=10, help=&quot;Specify minimum patch count for Committer nominations.&quot;),
+            make_option(&quot;--reviewer-minimum&quot;, action=&quot;store&quot;, dest=&quot;reviewer_minimum&quot;, type=&quot;int&quot;, default=80, help=&quot;Specify minimum patch count for Reviewer nominations.&quot;),
+            make_option(&quot;--show-commits&quot;, action=&quot;store_true&quot;, dest=&quot;show_commits&quot;, default=False, help=&quot;Show commit history with nomination suggestions.&quot;),
+        ]
+        super(SuggestNominations, self).__init__(options=options)
+
+    def _init_options(self, options):
+        super(SuggestNominations, self)._init_options(options)
+        self.committer_minimum = options.committer_minimum
+        self.reviewer_minimum = options.reviewer_minimum
+        self.show_commits = options.show_commits
+
</ins><span class="cx">     def _count_commit(self, commit, analysis):
</span><span class="cx">         author_name = commit['author_name']
</span><span class="cx">         author_email = commit['author_email']
</span></span></pre>
</div>
</div>

</body>
</html>