<!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>[70117] trunk/WebKitTools</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/70117">70117</a></dd>
<dt>Author</dt> <dd>eric@webkit.org</dd>
<dt>Date</dt> <dd>2010-10-19 18:26:21 -0700 (Tue, 19 Oct 2010)</dd>
</dl>

<h3>Log Message</h3>
<pre>2010-10-19  Eric Seidel  &lt;eric@webkit.org&gt;

        Reviewed by Adam Barth.

        Teach feeder-queue how to feed the EWS bots
        https://bugs.webkit.org/show_bug.cgi?id=47943

        queues.webkit.org already knew how to accept EWS submissions
        via /submit-to-ews.  This teaches the feeder queue how to post
        to that page with any new r? patches it sees.

        * QueueStatusServer/model/activeworkitems_unitest.py: Added.
         - More unit testing is always a good thing.
        * Scripts/webkitpy/common/net/bugzilla.py:
        * Scripts/webkitpy/common/net/statusserver.py:
        * Scripts/webkitpy/tool/bot/feeders.py:
        * Scripts/webkitpy/tool/commands/queues.py:
        * Scripts/webkitpy/tool/commands/queues_unittest.py:
        * Scripts/webkitpy/tool/mocktool.py:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkWebKitToolsChangeLog">trunk/WebKitTools/ChangeLog</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpycommonnetbugzillapy">trunk/WebKitTools/Scripts/webkitpy/common/net/bugzilla.py</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpycommonnetstatusserverpy">trunk/WebKitTools/Scripts/webkitpy/common/net/statusserver.py</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpytoolbotfeederspy">trunk/WebKitTools/Scripts/webkitpy/tool/bot/feeders.py</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpytoolcommandsqueuespy">trunk/WebKitTools/Scripts/webkitpy/tool/commands/queues.py</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpytoolcommandsqueues_unittestpy">trunk/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpytoolmocktoolpy">trunk/WebKitTools/Scripts/webkitpy/tool/mocktool.py</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkWebKitToolsQueueStatusServermodelactiveworkitems_unitestpy">trunk/WebKitTools/QueueStatusServer/model/activeworkitems_unitest.py</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkWebKitToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/ChangeLog (70116 => 70117)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/ChangeLog        2010-10-20 01:25:09 UTC (rev 70116)
+++ trunk/WebKitTools/ChangeLog        2010-10-20 01:26:21 UTC (rev 70117)
</span><span class="lines">@@ -1,5 +1,25 @@
</span><span class="cx"> 2010-10-19  Eric Seidel  &lt;eric@webkit.org&gt;
</span><span class="cx"> 
</span><ins>+        Reviewed by Adam Barth.
+
+        Teach feeder-queue how to feed the EWS bots
+        https://bugs.webkit.org/show_bug.cgi?id=47943
+
+        queues.webkit.org already knew how to accept EWS submissions
+        via /submit-to-ews.  This teaches the feeder queue how to post
+        to that page with any new r? patches it sees.
+
+        * QueueStatusServer/model/activeworkitems_unitest.py: Added.
+         - More unit testing is always a good thing.
+        * Scripts/webkitpy/common/net/bugzilla.py:
+        * Scripts/webkitpy/common/net/statusserver.py:
+        * Scripts/webkitpy/tool/bot/feeders.py:
+        * Scripts/webkitpy/tool/commands/queues.py:
+        * Scripts/webkitpy/tool/commands/queues_unittest.py:
+        * Scripts/webkitpy/tool/mocktool.py:
+
+2010-10-19  Eric Seidel  &lt;eric@webkit.org&gt;
+
</ins><span class="cx">         Unreviewed, just fixing test-webkitpy.  I'm really on a roll today.
</span><span class="cx"> 
</span><span class="cx">         commit-queue gets stuck when release-patch returns 404
</span></span></pre></div>
<a id="trunkWebKitToolsQueueStatusServermodelactiveworkitems_unitestpy"></a>
<div class="addfile"><h4>Added: trunk/WebKitTools/QueueStatusServer/model/activeworkitems_unitest.py (0 => 70117)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/QueueStatusServer/model/activeworkitems_unitest.py                                (rev 0)
+++ trunk/WebKitTools/QueueStatusServer/model/activeworkitems_unitest.py        2010-10-20 01:26:21 UTC (rev 70117)
</span><span class="lines">@@ -0,0 +1,52 @@
</span><ins>+# Copyright (C) 2010 Google, 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:
+#
+#    * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#    * 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.
+#    * Neither the name of Research in Motion Ltd. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# 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.
+
+import unittest
+from datetime import datetime
+
+from model.activeworkitems import ActiveWorkItems
+
+
+class ActiveWorkItemsTest(unittest.TestCase):
+    def test_basic(self):
+        items = ActiveWorkItems()
+        queued_items = [1, 2]
+        time = datetime.now()
+        self.assertEqual(items.next_item(queued_items, time), 1)
+        self.assertEqual(items.next_item([1], time), None)
+        self.assertEqual(items.next_item([], time), None)
+
+        self.assertEqual(items.time_for_item(1), time)
+        self.assertEqual(items.time_for_item(2), None)
+
+        items.expire_item(1)
+        self.assertEqual(items.time_for_item(1), None)
+
+
+if __name__ == '__main__':
+    unittest.main()
</ins></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpycommonnetbugzillapy"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/webkitpy/common/net/bugzilla.py (70116 => 70117)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/common/net/bugzilla.py        2010-10-20 01:25:09 UTC (rev 70116)
+++ trunk/WebKitTools/Scripts/webkitpy/common/net/bugzilla.py        2010-10-20 01:26:21 UTC (rev 70117)
</span><span class="lines">@@ -301,15 +301,14 @@
</span><span class="cx">         review_queue_url = &quot;buglist.cgi?query_format=advanced&amp;bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;field0-0-0=flagtypes.name&amp;type0-0-0=equals&amp;value0-0-0=review?&quot;
</span><span class="cx">         return self._fetch_bug_ids_advanced_query(review_queue_url)
</span><span class="cx"> 
</span><ins>+    # This method will make several requests to bugzilla.
</ins><span class="cx">     def fetch_patches_from_review_queue(self, limit=None):
</span><span class="cx">         # [:None] returns the whole array.
</span><span class="cx">         return sum([self._fetch_bug(bug_id).unreviewed_patches()
</span><span class="cx">             for bug_id in self._fetch_bug_ids_from_review_queue()[:limit]], [])
</span><span class="cx"> 
</span><del>-    # FIXME: Why do we have both fetch_patches_from_review_queue and
-    # fetch_attachment_ids_from_review_queue??
-    # NOTE: This is also the only client of _fetch_attachment_ids_request_query
-
</del><ins>+    # NOTE: This is the only client of _fetch_attachment_ids_request_query
+    # This method only makes one request to bugzilla.
</ins><span class="cx">     def fetch_attachment_ids_from_review_queue(self):
</span><span class="cx">         review_queue_url = &quot;request.cgi?action=queue&amp;type=review&amp;group=type&quot;
</span><span class="cx">         return self._fetch_attachment_ids_request_query(review_queue_url)
</span></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpycommonnetstatusserverpy"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/webkitpy/common/net/statusserver.py (70116 => 70117)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/common/net/statusserver.py        2010-10-20 01:25:09 UTC (rev 70116)
+++ trunk/WebKitTools/Scripts/webkitpy/common/net/statusserver.py        2010-10-20 01:26:21 UTC (rev 70117)
</span><span class="lines">@@ -102,6 +102,17 @@
</span><span class="cx">         self._browser[&quot;work_items&quot;] = &quot; &quot;.join(work_items)
</span><span class="cx">         return self._browser.submit().read()
</span><span class="cx"> 
</span><ins>+    def _post_work_item_to_ews(self, attachment_id):
+        submit_to_ews_url = &quot;%s/submit-to-ews&quot; % self.url
+        self._browser.open(submit_to_ews_url)
+        self._browser.select_form(name=&quot;submit_to_ews&quot;)
+        self._browser[&quot;attachment_id&quot;] = unicode(attachment_id)
+        self._browser.submit()
+
+    def submit_to_ews(self, attachment_id):
+        _log.info(&quot;Submitting attachment %s to EWS queues&quot; % attachment_id)
+        return NetworkTransaction().run(lambda: self._post_work_item_to_ews(attachment_id))
+
</ins><span class="cx">     def next_work_item(self, queue_name):
</span><span class="cx">         _log.debug(&quot;Fetching next work item for %s&quot; % queue_name)
</span><span class="cx">         patch_status_url = &quot;%s/next-patch/%s&quot; % (self.url, queue_name)
</span></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpytoolbotfeederspy"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/webkitpy/tool/bot/feeders.py (70116 => 70117)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/tool/bot/feeders.py        2010-10-20 01:25:09 UTC (rev 70116)
+++ trunk/WebKitTools/Scripts/webkitpy/tool/bot/feeders.py        2010-10-20 01:26:21 UTC (rev 70117)
</span><span class="lines">@@ -28,20 +28,17 @@
</span><span class="cx"> 
</span><span class="cx"> from webkitpy.common.system.deprecated_logging import log
</span><span class="cx"> from webkitpy.common.net.bugzilla import CommitterValidator
</span><ins>+from webkitpy.tool.grammar import pluralize
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> class AbstractFeeder(object):
</span><span class="cx">     def __init__(self, tool):
</span><span class="cx">         self._tool = tool
</span><span class="cx"> 
</span><del>-    def feed(tool):
-        raise NotImplementedError, &quot;subclasses must implement&quot;
</del><ins>+    def feed(self):
+        raise NotImplementedError(&quot;subclasses must implement&quot;)
</ins><span class="cx"> 
</span><del>-    def update_work_items(self, item_ids):
-        self._tool.status_server.update_work_items(self.queue_name, item_ids)
-        log(&quot;Feeding %s items %s&quot; % (self.queue_name, item_ids))
</del><span class="cx"> 
</span><del>-
</del><span class="cx"> class CommitQueueFeeder(AbstractFeeder):
</span><span class="cx">     queue_name = &quot;commit-queue&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -49,11 +46,15 @@
</span><span class="cx">         AbstractFeeder.__init__(self, tool)
</span><span class="cx">         self.committer_validator = CommitterValidator(self._tool.bugs)
</span><span class="cx"> 
</span><ins>+    def _update_work_items(self, item_ids):
+        self._tool.status_server.update_work_items(self.queue_name, item_ids)
+        log(&quot;Feeding %s items %s&quot; % (self.queue_name, item_ids))
+
</ins><span class="cx">     def feed(self):
</span><span class="cx">         patches = self._validate_patches()
</span><span class="cx">         patches = sorted(patches, self._patch_cmp)
</span><span class="cx">         patch_ids = [patch.id() for patch in patches]
</span><del>-        self.update_work_items(patch_ids)
</del><ins>+        self._update_work_items(patch_ids)
</ins><span class="cx"> 
</span><span class="cx">     def _patches_for_bug(self, bug_id):
</span><span class="cx">         return self._tool.bugs.fetch_bug(bug_id).commit_queued_patches(include_invalid=True)
</span><span class="lines">@@ -71,3 +72,17 @@
</span><span class="cx">         if rollout_cmp != 0:
</span><span class="cx">             return rollout_cmp
</span><span class="cx">         return cmp(a.attach_date(), b.attach_date())
</span><ins>+
+
+class EWSFeeder(AbstractFeeder):
+    def __init__(self, tool):
+        self._ids_sent_to_server = set()
+        AbstractFeeder.__init__(self, tool)
+
+    def feed(self):
+        ids_needing_review = set(self._tool.bugs.queries.fetch_attachment_ids_from_review_queue())
+        new_ids = ids_needing_review.difference(self._ids_sent_to_server)
+        log(&quot;Feeding EWS (%s, %s new)&quot; % (pluralize(&quot;r? patch&quot;, len(ids_needing_review)), len(new_ids)))
+        for attachment_id in new_ids:  # Order doesn't really matter for the EWS.
+            self._tool.status_server.submit_to_ews(attachment_id)
+            self._ids_sent_to_server.add(attachment_id)
</ins></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpytoolcommandsqueuespy"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/webkitpy/tool/commands/queues.py (70116 => 70117)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/tool/commands/queues.py        2010-10-20 01:25:09 UTC (rev 70116)
+++ trunk/WebKitTools/Scripts/webkitpy/tool/commands/queues.py        2010-10-20 01:26:21 UTC (rev 70117)
</span><span class="lines">@@ -45,7 +45,7 @@
</span><span class="cx"> from webkitpy.common.system.deprecated_logging import error, log
</span><span class="cx"> from webkitpy.tool.commands.stepsequence import StepSequenceErrorHandler
</span><span class="cx"> from webkitpy.tool.bot.commitqueuetask import CommitQueueTask, CommitQueueTaskDelegate
</span><del>-from webkitpy.tool.bot.feeders import CommitQueueFeeder
</del><ins>+from webkitpy.tool.bot.feeders import CommitQueueFeeder, EWSFeeder
</ins><span class="cx"> from webkitpy.tool.bot.patchcollection import PersistentPatchCollection, PersistentPatchCollectionDelegate
</span><span class="cx"> from webkitpy.tool.bot.queueengine import QueueEngine, QueueEngineDelegate
</span><span class="cx"> from webkitpy.tool.grammar import pluralize
</span><span class="lines">@@ -167,6 +167,7 @@
</span><span class="cx">         AbstractQueue.begin_work_queue(self)
</span><span class="cx">         self.feeders = [
</span><span class="cx">             CommitQueueFeeder(self._tool),
</span><ins>+            EWSFeeder(self._tool),
</ins><span class="cx">         ]
</span><span class="cx"> 
</span><span class="cx">     def next_work_item(self):
</span><span class="lines">@@ -372,6 +373,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> class AbstractReviewQueue(AbstractPatchQueue, PersistentPatchCollectionDelegate, StepSequenceErrorHandler):
</span><ins>+    &quot;&quot;&quot;This is the base-class for the EWS queues and the style-queue.&quot;&quot;&quot;
</ins><span class="cx">     def __init__(self, options=None):
</span><span class="cx">         AbstractPatchQueue.__init__(self, options)
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpytoolcommandsqueues_unittestpy"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py (70116 => 70117)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py        2010-10-20 01:25:09 UTC (rev 70116)
+++ trunk/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py        2010-10-20 01:26:21 UTC (rev 70117)
</span><span class="lines">@@ -135,6 +135,8 @@
</span><span class="cx"> - If you have committer rights please correct the error in WebKitTools/Scripts/webkitpy/common/config/committers.py by adding yourself to the file (no review needed).  The commit-queue restarts itself every 2 hours.  After restart the commit-queue will correctly respect your committer rights.'
</span><span class="cx"> MOCK: update_work_items: commit-queue [106, 197]
</span><span class="cx"> Feeding commit-queue items [106, 197]
</span><ins>+Feeding EWS (1 r? patch, 1 new)
+MOCK: submit_to_ews: 103
</ins><span class="cx"> &quot;&quot;&quot;,
</span><span class="cx">             &quot;handle_unexpected_error&quot;: &quot;Mock error message\n&quot;,
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpytoolmocktoolpy"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/webkitpy/tool/mocktool.py (70116 => 70117)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/tool/mocktool.py        2010-10-20 01:25:09 UTC (rev 70116)
+++ trunk/WebKitTools/Scripts/webkitpy/tool/mocktool.py        2010-10-20 01:26:21 UTC (rev 70117)
</span><span class="lines">@@ -554,6 +554,9 @@
</span><span class="cx">         self._work_items = work_items
</span><span class="cx">         log(&quot;MOCK: update_work_items: %s %s&quot; % (queue_name, work_items))
</span><span class="cx"> 
</span><ins>+    def submit_to_ews(self, patch_id):
+        log(&quot;MOCK: submit_to_ews: %s&quot; % (patch_id))
+
</ins><span class="cx">     def update_status(self, queue_name, status, patch=None, results_file=None):
</span><span class="cx">         log(&quot;MOCK: update_status: %s %s&quot; % (queue_name, status))
</span><span class="cx">         return 187
</span></span></pre>
</div>
</div>

</body>
</html>