<!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>[199266] trunk/Websites/perf.webkit.org</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/199266">199266</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2016-04-08 21:56:42 -0700 (Fri, 08 Apr 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Escape builder names in url* and pathFor* methods of BuildbotSyncer
https://bugs.webkit.org/show_bug.cgi?id=156427

Reviewed by Darin Adler.

The build fix in <a href="http://trac.webkit.org/projects/webkit/changeset/199251">r199251</a> breaks other usage of RemoteAPI. Fix it properly by escaping builder names in
various methods of BuildbotSyncer.

Also fixed a typo in the logging and a bug that the new syncing script never updated &quot;scheduled&quot; to &quot;running&quot;.

* server-tests/resources/mock-data.js:
(MockData.mockTestSyncConfigWithTwoBuilders): Renamed &quot;some-builder-2&quot; to &quot;some builder 2&quot; to test the
new escaping behavior in tools-buildbot-triggerable-tests.js and buildbot-syncer-tests.js.

* server-tests/tools-buildbot-triggerable-tests.js: Added tests for status url, and added a new test case
for updating &quot;scheduled&quot; to &quot;running&quot;.

* tools/js/buildbot-syncer.js:
(BuildbotBuildEntry.buildRequestStatusIfUpdateIsNeeded): Update the status to &quot;running&quot; when the request's
status is &quot;scheduled&quot; and the buildbot's build is currently in progress.
(BuildbotSyncer.prototype.pathForPendingBuildsJSON): Escape the builder name.
(BuildbotSyncer.prototype.pathForBuildJSON): Ditto.
(BuildbotSyncer.prototype.pathForForceBuild): Ditto.
(BuildbotSyncer.prototype.url): Ditto.
(BuildbotSyncer.prototype.urlForBuildNumber): Ditto.

* tools/js/buildbot-triggerable.js:
(BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers):
(BuildbotTriggerable.prototype._scheduleNextRequestInGroupIfSlaveIsAvailable): Fixed a typo. We are
scheduling new build requests, not syncing them.
* tools/js/remote.js:
(RemoteAPI.sendHttpRequest): Reverted <a href="http://trac.webkit.org/projects/webkit/changeset/199251">r199251</a>.
* unit-tests/buildbot-syncer-tests.js:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkWebsitesperfwebkitorgChangeLog">trunk/Websites/perf.webkit.org/ChangeLog</a></li>
<li><a href="#trunkWebsitesperfwebkitorgservertestsresourcesmockdatajs">trunk/Websites/perf.webkit.org/server-tests/resources/mock-data.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgserverteststoolsbuildbottriggerabletestsjs">trunk/Websites/perf.webkit.org/server-tests/tools-buildbot-triggerable-tests.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgtoolsjsbuildbotsyncerjs">trunk/Websites/perf.webkit.org/tools/js/buildbot-syncer.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgtoolsjsbuildbottriggerablejs">trunk/Websites/perf.webkit.org/tools/js/buildbot-triggerable.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgtoolsjsremotejs">trunk/Websites/perf.webkit.org/tools/js/remote.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgunittestsbuildbotsyncertestsjs">trunk/Websites/perf.webkit.org/unit-tests/buildbot-syncer-tests.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkWebsitesperfwebkitorgChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/ChangeLog (199265 => 199266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/ChangeLog        2016-04-09 03:46:25 UTC (rev 199265)
+++ trunk/Websites/perf.webkit.org/ChangeLog        2016-04-09 04:56:42 UTC (rev 199266)
</span><span class="lines">@@ -1,5 +1,41 @@
</span><span class="cx"> 2016-04-08  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><ins>+        Escape builder names in url* and pathFor* methods of BuildbotSyncer
+        https://bugs.webkit.org/show_bug.cgi?id=156427
+
+        Reviewed by Darin Adler.
+
+        The build fix in r199251 breaks other usage of RemoteAPI. Fix it properly by escaping builder names in
+        various methods of BuildbotSyncer.
+
+        Also fixed a typo in the logging and a bug that the new syncing script never updated &quot;scheduled&quot; to &quot;running&quot;.
+
+        * server-tests/resources/mock-data.js:
+        (MockData.mockTestSyncConfigWithTwoBuilders): Renamed &quot;some-builder-2&quot; to &quot;some builder 2&quot; to test the
+        new escaping behavior in tools-buildbot-triggerable-tests.js and buildbot-syncer-tests.js.
+
+        * server-tests/tools-buildbot-triggerable-tests.js: Added tests for status url, and added a new test case
+        for updating &quot;scheduled&quot; to &quot;running&quot;.
+
+        * tools/js/buildbot-syncer.js:
+        (BuildbotBuildEntry.buildRequestStatusIfUpdateIsNeeded): Update the status to &quot;running&quot; when the request's
+        status is &quot;scheduled&quot; and the buildbot's build is currently in progress.
+        (BuildbotSyncer.prototype.pathForPendingBuildsJSON): Escape the builder name.
+        (BuildbotSyncer.prototype.pathForBuildJSON): Ditto.
+        (BuildbotSyncer.prototype.pathForForceBuild): Ditto.
+        (BuildbotSyncer.prototype.url): Ditto.
+        (BuildbotSyncer.prototype.urlForBuildNumber): Ditto.
+
+        * tools/js/buildbot-triggerable.js:
+        (BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers):
+        (BuildbotTriggerable.prototype._scheduleNextRequestInGroupIfSlaveIsAvailable): Fixed a typo. We are
+        scheduling new build requests, not syncing them.
+        * tools/js/remote.js:
+        (RemoteAPI.sendHttpRequest): Reverted r199251.
+        * unit-tests/buildbot-syncer-tests.js:
+
+2016-04-08  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
</ins><span class="cx">         Build fix. We need to escape the path or http.request would fail.
</span><span class="cx"> 
</span><span class="cx">         * tools/js/remote.js:
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgservertestsresourcesmockdatajs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/server-tests/resources/mock-data.js (199265 => 199266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/server-tests/resources/mock-data.js        2016-04-09 03:46:25 UTC (rev 199265)
+++ trunk/Websites/perf.webkit.org/server-tests/resources/mock-data.js        2016-04-09 04:56:42 UTC (rev 199266)
</span><span class="lines">@@ -96,7 +96,7 @@
</span><span class="cx">                 {
</span><span class="cx">                     'platform': 'some platform',
</span><span class="cx">                     'test': ['some test'],
</span><del>-                    'builder': 'some-builder-2',
</del><ins>+                    'builder': 'some builder 2',
</ins><span class="cx">                     'arguments': {
</span><span class="cx">                         'wk': {'root': 'WebKit'},
</span><span class="cx">                         'os': {'root': 'OS X'},
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgserverteststoolsbuildbottriggerabletestsjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/server-tests/tools-buildbot-triggerable-tests.js (199265 => 199266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/server-tests/tools-buildbot-triggerable-tests.js        2016-04-09 03:46:25 UTC (rev 199265)
+++ trunk/Websites/perf.webkit.org/server-tests/tools-buildbot-triggerable-tests.js        2016-04-09 04:56:42 UTC (rev 199266)
</span><span class="lines">@@ -158,7 +158,7 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[0].url, '/json/builders/some-builder-1/pendingBuilds');
</span><span class="cx">                 MockRemoteAPI.requests[0].resolve([MockData.pendingBuild({buildRequestId: 999})]);
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[1].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some-builder-2/pendingBuilds');
</del><ins>+                assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some%20builder%202/pendingBuilds');
</ins><span class="cx">                 MockRemoteAPI.requests[1].resolve([]);
</span><span class="cx">                 return MockRemoteAPI.waitForRequest();
</span><span class="cx">             }).then(function () {
</span><span class="lines">@@ -167,13 +167,13 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[2].url, '/json/builders/some-builder-1/builds/?select=-1&amp;select=-2');
</span><span class="cx">                 MockRemoteAPI.requests[2].resolve({});
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[3].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some-builder-2/builds/?select=-1&amp;select=-2');
</del><ins>+                assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some%20builder%202/builds/?select=-1&amp;select=-2');
</ins><span class="cx">                 MockRemoteAPI.requests[3].resolve({});
</span><span class="cx">                 return MockRemoteAPI.waitForRequest();
</span><span class="cx">             }).then(function () {
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests.length, 5);
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[4].method, 'POST');
</span><del>-                assert.equal(MockRemoteAPI.requests[4].url, '/builders/some-builder-2/force');
</del><ins>+                assert.equal(MockRemoteAPI.requests[4].url, '/builders/some%20builder%202/force');
</ins><span class="cx">                 assert.deepEqual(MockRemoteAPI.requests[4].data, {'wk': '191622', 'os': '10.11 15A284', 'build-request-id': '700'});
</span><span class="cx">                 MockRemoteAPI.requests[4].resolve('OK');
</span><span class="cx">                 return MockRemoteAPI.waitForRequest();
</span><span class="lines">@@ -183,8 +183,8 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[5].url, '/json/builders/some-builder-1/pendingBuilds');
</span><span class="cx">                 MockRemoteAPI.requests[5].resolve([MockData.pendingBuild({buildRequestId: 999})]);
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[6].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[6].url, '/json/builders/some-builder-2/pendingBuilds');
-                MockRemoteAPI.requests[6].resolve([MockData.pendingBuild({builder: 'some-builder-2', buildRequestId: 700})]);
</del><ins>+                assert.equal(MockRemoteAPI.requests[6].url, '/json/builders/some%20builder%202/pendingBuilds');
+                MockRemoteAPI.requests[6].resolve([MockData.pendingBuild({builder: 'some builder 2', buildRequestId: 700})]);
</ins><span class="cx">                 return MockRemoteAPI.waitForRequest();
</span><span class="cx">             }).then(function () {
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests.length, 9);
</span><span class="lines">@@ -192,22 +192,30 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[7].url, '/json/builders/some-builder-1/builds/?select=-1&amp;select=-2');
</span><span class="cx">                 MockRemoteAPI.requests[7].resolve({});
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[8].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[8].url, '/json/builders/some-builder-2/builds/?select=-1&amp;select=-2');
</del><ins>+                assert.equal(MockRemoteAPI.requests[8].url, '/json/builders/some%20builder%202/builds/?select=-1&amp;select=-2');
</ins><span class="cx">                 MockRemoteAPI.requests[8].resolve({});
</span><span class="cx">                 return syncPromise;
</span><span class="cx">             }).then(function () {
</span><span class="cx">                 assert.equal(BuildRequest.all().length, 4);
</span><span class="cx">                 assert.equal(BuildRequest.findById(700).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(700).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(701).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(701).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(702).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(702).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(703).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(703).statusUrl(), null);
</ins><span class="cx">                 return BuildRequest.fetchForTriggerable(MockData.mockTestSyncConfigWithTwoBuilders().triggerableName);
</span><span class="cx">             }).then(function () {
</span><span class="cx">                 assert.equal(BuildRequest.all().length, 4);
</span><span class="cx">                 assert.equal(BuildRequest.findById(700).status(), 'scheduled');
</span><ins>+                assert.equal(BuildRequest.findById(700).statusUrl(), 'http://build.webkit.org/builders/some%20builder%202/');
</ins><span class="cx">                 assert.equal(BuildRequest.findById(701).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(701).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(702).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(702).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(703).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(703).statusUrl(), null);
</ins><span class="cx">                 done();
</span><span class="cx">             }).catch(done);
</span><span class="cx">         });
</span><span class="lines">@@ -233,7 +241,7 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[0].url, '/json/builders/some-builder-1/pendingBuilds');
</span><span class="cx">                 MockRemoteAPI.requests[0].resolve([MockData.pendingBuild({buildRequestId: 700})]);
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[1].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some-builder-2/pendingBuilds');
</del><ins>+                assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some%20builder%202/pendingBuilds');
</ins><span class="cx">                 MockRemoteAPI.requests[1].resolve([]);
</span><span class="cx">                 return MockRemoteAPI.waitForRequest();
</span><span class="cx">             }).then(function () {
</span><span class="lines">@@ -242,7 +250,7 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[2].url, '/json/builders/some-builder-1/builds/?select=-1&amp;select=-2');
</span><span class="cx">                 MockRemoteAPI.requests[2].resolve({});
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[3].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some-builder-2/builds/?select=-1&amp;select=-2');
</del><ins>+                assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some%20builder%202/builds/?select=-1&amp;select=-2');
</ins><span class="cx">                 MockRemoteAPI.requests[3].resolve({});
</span><span class="cx">                 return MockRemoteAPI.waitForRequest();
</span><span class="cx">             }).then(function () {
</span><span class="lines">@@ -251,7 +259,7 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[4].url, '/json/builders/some-builder-1/pendingBuilds');
</span><span class="cx">                 MockRemoteAPI.requests[4].resolve([MockData.pendingBuild({buildRequestId: 700})]);
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[5].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[5].url, '/json/builders/some-builder-2/pendingBuilds');
</del><ins>+                assert.equal(MockRemoteAPI.requests[5].url, '/json/builders/some%20builder%202/pendingBuilds');
</ins><span class="cx">                 MockRemoteAPI.requests[5].resolve([]);
</span><span class="cx">                 return MockRemoteAPI.waitForRequest();
</span><span class="cx">             }).then(function () {
</span><span class="lines">@@ -260,22 +268,30 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[6].url, '/json/builders/some-builder-1/builds/?select=-1&amp;select=-2');
</span><span class="cx">                 MockRemoteAPI.requests[6].resolve({});
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[7].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[7].url, '/json/builders/some-builder-2/builds/?select=-1&amp;select=-2');
</del><ins>+                assert.equal(MockRemoteAPI.requests[7].url, '/json/builders/some%20builder%202/builds/?select=-1&amp;select=-2');
</ins><span class="cx">                 MockRemoteAPI.requests[7].resolve({});
</span><span class="cx">                 return syncPromise;
</span><span class="cx">             }).then(function () {
</span><span class="cx">                 assert.equal(BuildRequest.all().length, 4);
</span><span class="cx">                 assert.equal(BuildRequest.findById(700).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(700).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(701).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(701).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(702).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(702).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(703).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(703).statusUrl(), null);
</ins><span class="cx">                 return BuildRequest.fetchForTriggerable(MockData.mockTestSyncConfigWithTwoBuilders().triggerableName);
</span><span class="cx">             }).then(function () {
</span><span class="cx">                 assert.equal(BuildRequest.all().length, 4);
</span><span class="cx">                 assert.equal(BuildRequest.findById(700).status(), 'scheduled');
</span><ins>+                assert.equal(BuildRequest.findById(700).statusUrl(), 'http://build.webkit.org/builders/some-builder-1/');
</ins><span class="cx">                 assert.equal(BuildRequest.findById(701).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(701).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(702).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(702).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(703).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(703).statusUrl(), null);
</ins><span class="cx">                 done();
</span><span class="cx">             }).catch(done);
</span><span class="cx">         });
</span><span class="lines">@@ -301,7 +317,7 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[0].url, '/json/builders/some-builder-1/pendingBuilds');
</span><span class="cx">                 MockRemoteAPI.requests[0].resolve([]);
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[1].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some-builder-2/pendingBuilds');
</del><ins>+                assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some%20builder%202/pendingBuilds');
</ins><span class="cx">                 MockRemoteAPI.requests[1].resolve([]);
</span><span class="cx">                 return MockRemoteAPI.waitForRequest();
</span><span class="cx">             }).then(function () {
</span><span class="lines">@@ -310,7 +326,7 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[2].url, '/json/builders/some-builder-1/builds/?select=-1&amp;select=-2');
</span><span class="cx">                 MockRemoteAPI.requests[2].resolve({[-1]: MockData.runningBuild({buildRequestId: 701}), [-2]: MockData.finishedBuild({buildRequestId: 700})});
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[3].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some-builder-2/builds/?select=-1&amp;select=-2');
</del><ins>+                assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some%20builder%202/builds/?select=-1&amp;select=-2');
</ins><span class="cx">                 MockRemoteAPI.requests[3].resolve({});
</span><span class="cx">                 return MockRemoteAPI.waitForRequest();
</span><span class="cx">             }).then(function () {
</span><span class="lines">@@ -326,7 +342,7 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[5].url, '/json/builders/some-builder-1/pendingBuilds');
</span><span class="cx">                 MockRemoteAPI.requests[5].resolve([MockData.pendingBuild({buildRequestId: 702})]);
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[6].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[6].url, '/json/builders/some-builder-2/pendingBuilds');
</del><ins>+                assert.equal(MockRemoteAPI.requests[6].url, '/json/builders/some%20builder%202/pendingBuilds');
</ins><span class="cx">                 MockRemoteAPI.requests[6].resolve([]);
</span><span class="cx">                 return MockRemoteAPI.waitForRequest();
</span><span class="cx">             }).then(function () {
</span><span class="lines">@@ -335,26 +351,98 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[7].url, '/json/builders/some-builder-1/builds/?select=-1&amp;select=-2');
</span><span class="cx">                 MockRemoteAPI.requests[7].resolve({[-1]: MockData.runningBuild({buildRequestId: 701}), [-2]: MockData.finishedBuild({buildRequestId: 700})});
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[8].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[8].url, '/json/builders/some-builder-2/builds/?select=-1&amp;select=-2');
</del><ins>+                assert.equal(MockRemoteAPI.requests[8].url, '/json/builders/some%20builder%202/builds/?select=-1&amp;select=-2');
</ins><span class="cx">                 MockRemoteAPI.requests[8].resolve({});
</span><span class="cx">                 return syncPromise;
</span><span class="cx">             }).then(function () {
</span><span class="cx">                 assert.equal(BuildRequest.all().length, 4);
</span><span class="cx">                 assert.equal(BuildRequest.findById(700).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(700).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(701).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(701).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(702).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(702).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(703).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(703).statusUrl(), null);
</ins><span class="cx">                 return BuildRequest.fetchForTriggerable(MockData.mockTestSyncConfigWithTwoBuilders().triggerableName);
</span><span class="cx">             }).then(function () {
</span><span class="cx">                 assert.equal(BuildRequest.all().length, 4);
</span><span class="cx">                 assert.equal(BuildRequest.findById(700).status(), 'failed');
</span><ins>+                assert.equal(BuildRequest.findById(700).statusUrl(), 'http://build.webkit.org/builders/some-builder-1/builds/123');
</ins><span class="cx">                 assert.equal(BuildRequest.findById(701).status(), 'running');
</span><ins>+                assert.equal(BuildRequest.findById(701).statusUrl(), 'http://build.webkit.org/builders/some-builder-1/builds/124');
</ins><span class="cx">                 assert.equal(BuildRequest.findById(702).status(), 'scheduled');
</span><ins>+                assert.equal(BuildRequest.findById(702).statusUrl(), 'http://build.webkit.org/builders/some-builder-1/');
</ins><span class="cx">                 assert.equal(BuildRequest.findById(703).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(703).statusUrl(), null);
</ins><span class="cx">                 done();
</span><span class="cx">             }).catch(done);
</span><span class="cx">         });
</span><span class="cx"> 
</span><ins>+        it('should update the status of a scheduled build if the pending build had started running', function (done) {
+            let db = TestServer.database();
+            let syncPromise;
+            db.connect().then(function () {
+                return MockData.addMockData(db, ['scheduled', 'pending', 'pending', 'pending']);
+            }).then(function () {
+                return Manifest.fetch();
+            }).then(function () {
+                let config = MockData.mockTestSyncConfigWithSingleBuilder();
+                let logger = new MockLogger;
+                let slaveInfo = {name: 'sync-slave', password: 'password'};
+                let triggerable = new BuildbotTriggerable(config, TestServer.remoteAPI(), MockRemoteAPI, slaveInfo, logger);
+                syncPromise = triggerable.syncOnce();
+                syncPromise.catch(done);
+                return MockRemoteAPI.waitForRequest();
+            }).then(function () {
+                assert.equal(MockRemoteAPI.requests.length, 1);
+                assert.equal(MockRemoteAPI.requests[0].method, 'GET');
+                assert.equal(MockRemoteAPI.requests[0].url, '/json/builders/some-builder-1/pendingBuilds');
+                MockRemoteAPI.requests[0].resolve([MockData.pendingBuild({buildRequestId: 700})]);
+                return MockRemoteAPI.waitForRequest();
+            }).then(function () {
+                assert.equal(MockRemoteAPI.requests.length, 2);
+                assert.equal(MockRemoteAPI.requests[1].method, 'GET');
+                assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some-builder-1/builds/?select=-1&amp;select=-2');
+                MockRemoteAPI.requests[1].resolve({});
+                return MockRemoteAPI.waitForRequest();
+            }).then(function () {
+                assert.equal(MockRemoteAPI.requests.length, 3);
+                assert.equal(MockRemoteAPI.requests[2].method, 'GET');
+                assert.equal(MockRemoteAPI.requests[2].url, '/json/builders/some-builder-1/pendingBuilds');
+                MockRemoteAPI.requests[2].resolve([]);
+                return MockRemoteAPI.waitForRequest();
+            }).then(function () {
+                assert.equal(MockRemoteAPI.requests.length, 4);
+                assert.equal(MockRemoteAPI.requests[3].method, 'GET');
+                assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some-builder-1/builds/?select=-1&amp;select=-2');
+                MockRemoteAPI.requests[3].resolve({[-1]: MockData.runningBuild({buildRequestId: 700})});
+                return syncPromise;
+            }).then(function () {
+                assert.equal(BuildRequest.all().length, 4);
+                assert.equal(BuildRequest.findById(700).status(), 'scheduled');
+                assert.equal(BuildRequest.findById(700).statusUrl(), null);
+                assert.equal(BuildRequest.findById(701).status(), 'pending');
+                assert.equal(BuildRequest.findById(701).statusUrl(), null);
+                assert.equal(BuildRequest.findById(702).status(), 'pending');
+                assert.equal(BuildRequest.findById(702).statusUrl(), null);
+                assert.equal(BuildRequest.findById(703).status(), 'pending');
+                assert.equal(BuildRequest.findById(703).statusUrl(), null);
+                return BuildRequest.fetchForTriggerable(MockData.mockTestSyncConfigWithTwoBuilders().triggerableName);
+            }).then(function () {
+                assert.equal(BuildRequest.all().length, 4);
+                assert.equal(BuildRequest.findById(700).status(), 'running');
+                assert.equal(BuildRequest.findById(700).statusUrl(), 'http://build.webkit.org/builders/some-builder-1/builds/124');
+                assert.equal(BuildRequest.findById(701).status(), 'pending');
+                assert.equal(BuildRequest.findById(701).statusUrl(), null);
+                assert.equal(BuildRequest.findById(702).status(), 'pending');
+                assert.equal(BuildRequest.findById(702).statusUrl(), null);
+                assert.equal(BuildRequest.findById(703).status(), 'pending');
+                assert.equal(BuildRequest.findById(703).statusUrl(), null);
+                done();
+            }).catch(done);
+        });
+
</ins><span class="cx">         it('should schedule a build request on a builder without pending builds if the request belongs to a new test group', function (done) {
</span><span class="cx">             let db = TestServer.database();
</span><span class="cx">             let syncPromise;
</span><span class="lines">@@ -379,7 +467,7 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[0].url, '/json/builders/some-builder-1/pendingBuilds');
</span><span class="cx">                 MockRemoteAPI.requests[0].resolve([MockData.pendingBuild({buildRequestId: 702})]);
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[1].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some-builder-2/pendingBuilds');
</del><ins>+                assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some%20builder%202/pendingBuilds');
</ins><span class="cx">                 MockRemoteAPI.requests[1].resolve([]);
</span><span class="cx">                 return MockRemoteAPI.waitForRequest();
</span><span class="cx">             }).then(function () {
</span><span class="lines">@@ -388,13 +476,13 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[2].url, '/json/builders/some-builder-1/builds/?select=-1&amp;select=-2');
</span><span class="cx">                 MockRemoteAPI.requests[2].resolve({[-1]: MockData.runningBuild({buildRequestId: 701}), [-2]: MockData.finishedBuild({buildRequestId: 700})});
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[3].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some-builder-2/builds/?select=-1&amp;select=-2');
</del><ins>+                assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some%20builder%202/builds/?select=-1&amp;select=-2');
</ins><span class="cx">                 MockRemoteAPI.requests[3].resolve({});
</span><span class="cx">                 return MockRemoteAPI.waitForRequest();
</span><span class="cx">             }).then(function () {
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests.length, 5);
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[4].method, 'POST');
</span><del>-                assert.equal(MockRemoteAPI.requests[4].url, '/builders/some-builder-2/force');
</del><ins>+                assert.equal(MockRemoteAPI.requests[4].url, '/builders/some%20builder%202/force');
</ins><span class="cx">                 assert.deepEqual(MockRemoteAPI.requests[4].data, {'wk': '191622', 'os': '10.11 15A284', 'build-request-id': '710'});
</span><span class="cx">                 MockRemoteAPI.requests[4].resolve('OK');
</span><span class="cx">                 return MockRemoteAPI.waitForRequest();
</span><span class="lines">@@ -404,8 +492,8 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[5].url, '/json/builders/some-builder-1/pendingBuilds');
</span><span class="cx">                 MockRemoteAPI.requests[5].resolve([MockData.pendingBuild({buildRequestId: 702})]);
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[6].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[6].url, '/json/builders/some-builder-2/pendingBuilds');
-                MockRemoteAPI.requests[6].resolve([MockData.pendingBuild({builder: 'some-builder-2', buildRequestId: 710})]);
</del><ins>+                assert.equal(MockRemoteAPI.requests[6].url, '/json/builders/some%20builder%202/pendingBuilds');
+                MockRemoteAPI.requests[6].resolve([MockData.pendingBuild({builder: 'some builder 2', buildRequestId: 710})]);
</ins><span class="cx">                 return MockRemoteAPI.waitForRequest();
</span><span class="cx">             }).then(function () {
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests.length, 9);
</span><span class="lines">@@ -413,30 +501,46 @@
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[7].url, '/json/builders/some-builder-1/builds/?select=-1&amp;select=-2');
</span><span class="cx">                 MockRemoteAPI.requests[7].resolve({[-1]: MockData.runningBuild({buildRequestId: 701}), [-2]: MockData.finishedBuild({buildRequestId: 700})});
</span><span class="cx">                 assert.equal(MockRemoteAPI.requests[8].method, 'GET');
</span><del>-                assert.equal(MockRemoteAPI.requests[8].url, '/json/builders/some-builder-2/builds/?select=-1&amp;select=-2');
</del><ins>+                assert.equal(MockRemoteAPI.requests[8].url, '/json/builders/some%20builder%202/builds/?select=-1&amp;select=-2');
</ins><span class="cx">                 MockRemoteAPI.requests[8].resolve({});
</span><span class="cx">                 return syncPromise;
</span><span class="cx">             }).then(function () {
</span><span class="cx">                 assert.equal(BuildRequest.all().length, 8);
</span><span class="cx">                 assert.equal(BuildRequest.findById(700).status(), 'completed');
</span><ins>+                assert.equal(BuildRequest.findById(700).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(701).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(701).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(702).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(702).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(703).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(703).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(710).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(710).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(711).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(711).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(712).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(712).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(713).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(713).statusUrl(), null);
</ins><span class="cx">                 return BuildRequest.fetchForTriggerable(MockData.mockTestSyncConfigWithTwoBuilders().triggerableName);
</span><span class="cx">             }).then(function () {
</span><span class="cx">                 assert.equal(BuildRequest.all().length, 8);
</span><span class="cx">                 assert.equal(BuildRequest.findById(700).status(), 'completed');
</span><ins>+                assert.equal(BuildRequest.findById(700).statusUrl(), 'http://build.webkit.org/builders/some-builder-1/builds/123');
</ins><span class="cx">                 assert.equal(BuildRequest.findById(701).status(), 'running');
</span><ins>+                assert.equal(BuildRequest.findById(701).statusUrl(), 'http://build.webkit.org/builders/some-builder-1/builds/124');
</ins><span class="cx">                 assert.equal(BuildRequest.findById(702).status(), 'scheduled');
</span><ins>+                assert.equal(BuildRequest.findById(702).statusUrl(), 'http://build.webkit.org/builders/some-builder-1/');
</ins><span class="cx">                 assert.equal(BuildRequest.findById(703).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(703).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(710).status(), 'scheduled');
</span><ins>+                assert.equal(BuildRequest.findById(710).statusUrl(), 'http://build.webkit.org/builders/some%20builder%202/');
</ins><span class="cx">                 assert.equal(BuildRequest.findById(711).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(711).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(712).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(712).statusUrl(), null);
</ins><span class="cx">                 assert.equal(BuildRequest.findById(713).status(), 'pending');
</span><ins>+                assert.equal(BuildRequest.findById(713).statusUrl(), null);
</ins><span class="cx">                 done();
</span><span class="cx">             }).catch(done);
</span><span class="cx">         });
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgtoolsjsbuildbotsyncerjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/tools/js/buildbot-syncer.js (199265 => 199266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/tools/js/buildbot-syncer.js        2016-04-09 03:46:25 UTC (rev 199265)
+++ trunk/Websites/perf.webkit.org/tools/js/buildbot-syncer.js        2016-04-09 04:56:42 UTC (rev 199266)
</span><span class="lines">@@ -44,7 +44,7 @@
</span><span class="cx">             if (request.isPending())
</span><span class="cx">                 return 'scheduled';
</span><span class="cx">         } else if (this.isInProgress()) {
</span><del>-            if (!request.hasStarted())
</del><ins>+            if (!request.hasStarted() || request.isScheduled())
</ins><span class="cx">                 return 'running';
</span><span class="cx">         } else if (this.hasFinished()) {
</span><span class="cx">             if (!request.hasFinished())
</span><span class="lines">@@ -179,16 +179,16 @@
</span><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    pathForPendingBuildsJSON() { return `/json/builders/${this._builderName}/pendingBuilds`; }
</del><ins>+    pathForPendingBuildsJSON() { return `/json/builders/${escape(this._builderName)}/pendingBuilds`; }
</ins><span class="cx">     pathForBuildJSON(selectedBuilds)
</span><span class="cx">     {
</span><del>-        return `/json/builders/${this._builderName}/builds/?`
</del><ins>+        return `/json/builders/${escape(this._builderName)}/builds/?`
</ins><span class="cx">             + selectedBuilds.map(function (number) { return 'select=' + number; }).join('&amp;');
</span><span class="cx">     }
</span><del>-    pathForForceBuild() { return `/builders/${this._builderName}/force`; }
</del><ins>+    pathForForceBuild() { return `/builders/${escape(this._builderName)}/force`; }
</ins><span class="cx"> 
</span><del>-    url() { return this._remote.url(`/builders/${this._builderName}/`); }
-    urlForBuildNumber(number) { return this._remote.url(`/builders/${this._builderName}/builds/${number}`); }
</del><ins>+    url() { return this._remote.url(`/builders/${escape(this._builderName)}/`); }
+    urlForBuildNumber(number) { return this._remote.url(`/builders/${escape(this._builderName)}/builds/${number}`); }
</ins><span class="cx"> 
</span><span class="cx">     _propertiesForBuildRequest(buildRequest)
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgtoolsjsbuildbottriggerablejs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/tools/js/buildbot-triggerable.js (199265 => 199266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/tools/js/buildbot-triggerable.js        2016-04-09 03:46:25 UTC (rev 199265)
+++ trunk/Websites/perf.webkit.org/tools/js/buildbot-triggerable.js        2016-04-09 04:56:42 UTC (rev 199266)
</span><span class="lines">@@ -102,12 +102,16 @@
</span><span class="cx">                     if (newStatus) {
</span><span class="cx">                         self._logger.log(`Updating the status of build request ${request.id()} from ${request.status()} to ${newStatus}`);
</span><span class="cx">                         updates[entry.buildRequestId()] = {status: newStatus, url: entry.url()};
</span><ins>+                    } else if (!request.statusUrl()) {
+                        self._logger.log(`Setting the status URL of build request ${request.id()} to ${entry.url()}`);
+                        updates[entry.buildRequestId()] = {status: request.status(), url: entry.url()};
</ins><span class="cx">                     }
</span><span class="cx">                 }
</span><span class="cx">             });
</span><span class="cx">         })).then(function () {
</span><span class="cx">             for (let request of BuildRequest.all()) {
</span><span class="cx">                 if (request.hasStarted() &amp;&amp; !request.hasFinished() &amp;&amp; !associatedRequests.has(request)) {
</span><ins>+                    self._logger.log(`Updating the status of build request ${request.id()} from ${request.status()} to failedIfNotCompleted`);
</ins><span class="cx">                     assert(!(request.id() in updates));
</span><span class="cx">                     updates[request.id()] = {status: 'failedIfNotCompleted'};
</span><span class="cx">                 }
</span><span class="lines">@@ -132,7 +136,7 @@
</span><span class="cx"> 
</span><span class="cx">         let firstRequest = !nextRequest.order();
</span><span class="cx">         if (firstRequest) {
</span><del>-            this._logger.log(`Syncing build request ${nextRequest.id()} on ${groupInfo.slaveName} in ${groupInfo.syncer.builderName()}`);
</del><ins>+            this._logger.log(`Scheduling build request ${nextRequest.id()} on ${groupInfo.slaveName} in ${groupInfo.syncer.builderName()}`);
</ins><span class="cx">             return groupInfo.syncer.scheduleRequest(request, groupInfo.slaveName);
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -140,7 +144,7 @@
</span><span class="cx">             let promise = syncer.scheduleFirstRequestInGroupIfAvailable(nextRequest);
</span><span class="cx">             if (promise) {
</span><span class="cx">                 let slaveName = groupInfo.slaveName ? ` on ${groupInfo.slaveName}` : '';
</span><del>-                this._logger.log(`Syncing build request ${nextRequest.id()}${slaveName} in ${syncer.builderName()}`);
</del><ins>+                this._logger.log(`Scheduling build request ${nextRequest.id()}${slaveName} in ${syncer.builderName()}`);
</ins><span class="cx">                 return promise;
</span><span class="cx">             }
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgtoolsjsremotejs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/tools/js/remote.js (199265 => 199266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/tools/js/remote.js        2016-04-09 03:46:25 UTC (rev 199265)
+++ trunk/Websites/perf.webkit.org/tools/js/remote.js        2016-04-09 04:56:42 UTC (rev 199266)
</span><span class="lines">@@ -93,7 +93,7 @@
</span><span class="cx">                 port: server.port,
</span><span class="cx">                 auth: server.auth ? server.auth.username + ':' + server.auth.password : null,
</span><span class="cx">                 method: method,
</span><del>-                path: escape(path),
</del><ins>+                path: path,
</ins><span class="cx">             };
</span><span class="cx"> 
</span><span class="cx">             let request = (server.scheme == 'http' ? http : https).request(options, function (response) {
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgunittestsbuildbotsyncertestsjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/unit-tests/buildbot-syncer-tests.js (199265 => 199266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/unit-tests/buildbot-syncer-tests.js        2016-04-09 03:46:25 UTC (rev 199265)
+++ trunk/Websites/perf.webkit.org/unit-tests/buildbot-syncer-tests.js        2016-04-09 04:56:42 UTC (rev 199266)
</span><span class="lines">@@ -850,7 +850,7 @@
</span><span class="cx">                 syncer.scheduleFirstRequestInGroupIfAvailable(createSampleBuildRequest(MockModels.somePlatform, MockModels.someTest));
</span><span class="cx">             }).then(function () {
</span><span class="cx">                 assert.equal(requests.length, 1);
</span><del>-                assert.equal(requests[0].url, '/builders/some builder/force');
</del><ins>+                assert.equal(requests[0].url, '/builders/some%20builder/force');
</ins><span class="cx">                 assert.equal(requests[0].method, 'POST');
</span><span class="cx">                 assert.deepEqual(requests[0].data, {id: '16733-' + MockModels.somePlatform.id()});
</span><span class="cx">                 done();
</span><span class="lines">@@ -864,7 +864,7 @@
</span><span class="cx">                 syncer.scheduleFirstRequestInGroupIfAvailable(createSampleBuildRequest(MockModels.somePlatform, MockModels.someTest));
</span><span class="cx">             }).then(function () {
</span><span class="cx">                 assert.equal(requests.length, 1);
</span><del>-                assert.equal(requests[0].url, '/builders/some builder/force');
</del><ins>+                assert.equal(requests[0].url, '/builders/some%20builder/force');
</ins><span class="cx">                 assert.equal(requests[0].method, 'POST');
</span><span class="cx">                 assert.deepEqual(requests[0].data, {id: '16733-' + MockModels.somePlatform.id()});
</span><span class="cx">                 done();
</span></span></pre>
</div>
</div>

</body>
</html>