<!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>[174555] 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/174555">174555</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2014-10-09 20:45:20 -0700 (Thu, 09 Oct 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>New perf dashboard UI tries to fetch commits all the time
https://bugs.webkit.org/show_bug.cgi?id=137592

Reviewed by Andreas Kling.

Added hasReportedCommits boolean to repository meta data in manifest.json, and used that in
the front end to avoid issuing HTTP requests to fetch commit logs for repositories with
no reported commits as they are all going to fail.

Also added an internal cache to FetchCommitsForTimeRange in the front end to avoid fetching
the same commit logs repeatedly. There are two data structures we cache: commitsByRevision
which maps a given commit revision/hash to a commit object; and commitsByTime which is an array
of commits sorted chronologically by time.

* public/include/manifest.php:

* public/v2/app.js:
(App.CommitsViewerComponent.commitsChanged):

* public/v2/data.js:
(FetchCommitsForTimeRange):
(FetchCommitsForTimeRange._cachedCommitsByRepository):

* public/v2/manifest.js:
(App.Repository):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkWebsitesperfwebkitorgChangeLog">trunk/Websites/perf.webkit.org/ChangeLog</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicincludemanifestphp">trunk/Websites/perf.webkit.org/public/include/manifest.php</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2appjs">trunk/Websites/perf.webkit.org/public/v2/app.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2datajs">trunk/Websites/perf.webkit.org/public/v2/data.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2manifestjs">trunk/Websites/perf.webkit.org/public/v2/manifest.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 (174554 => 174555)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/ChangeLog        2014-10-10 03:34:01 UTC (rev 174554)
+++ trunk/Websites/perf.webkit.org/ChangeLog        2014-10-10 03:45:20 UTC (rev 174555)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2014-10-09  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
+        New perf dashboard UI tries to fetch commits all the time
+        https://bugs.webkit.org/show_bug.cgi?id=137592
+
+        Reviewed by Andreas Kling.
+
+        Added hasReportedCommits boolean to repository meta data in manifest.json, and used that in
+        the front end to avoid issuing HTTP requests to fetch commit logs for repositories with
+        no reported commits as they are all going to fail.
+
+        Also added an internal cache to FetchCommitsForTimeRange in the front end to avoid fetching
+        the same commit logs repeatedly. There are two data structures we cache: commitsByRevision
+        which maps a given commit revision/hash to a commit object; and commitsByTime which is an array
+        of commits sorted chronologically by time.
+
+        * public/include/manifest.php:
+
+        * public/v2/app.js:
+        (App.CommitsViewerComponent.commitsChanged):
+
+        * public/v2/data.js:
+        (FetchCommitsForTimeRange):
+        (FetchCommitsForTimeRange._cachedCommitsByRepository):
+
+        * public/v2/manifest.js:
+        (App.Repository):
+
</ins><span class="cx"> 2014-10-08  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Another unreviewed build fix after r174477.
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicincludemanifestphp"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/include/manifest.php (174554 => 174555)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/include/manifest.php        2014-10-10 03:34:01 UTC (rev 174554)
+++ trunk/Websites/perf.webkit.org/public/include/manifest.php        2014-10-10 03:45:20 UTC (rev 174555)
</span><span class="lines">@@ -15,12 +15,18 @@
</span><span class="cx">         $config_table = $this-&gt;db-&gt;fetch_table('test_configurations');
</span><span class="cx">         $platform_table = $this-&gt;db-&gt;fetch_table('platforms');
</span><span class="cx">         $repositories_table = $this-&gt;db-&gt;fetch_table('repositories');
</span><ins>+
+        $repositories_with_commit = $this-&gt;db-&gt;query_and_fetch_all(
+            'SELECT DISTINCT(commit_repository) FROM commits WHERE commit_reported IS TRUE') or array();
+        foreach ($repositories_with_commit as &amp;$row)
+            $row = $row['commit_repository'];
+
</ins><span class="cx">         $this-&gt;manifest = array(
</span><span class="cx">             'tests' =&gt; $this-&gt;tests(),
</span><span class="cx">             'metrics' =&gt; $this-&gt;metrics(),
</span><span class="cx">             'all' =&gt; $this-&gt;platforms($config_table, $platform_table, false),
</span><span class="cx">             'dashboard' =&gt; $this-&gt;platforms($config_table, $platform_table, true),
</span><del>-            'repositories' =&gt; $this-&gt;repositories($repositories_table),
</del><ins>+            'repositories' =&gt; $this-&gt;repositories($repositories_table, $repositories_with_commit),
</ins><span class="cx">             'builders' =&gt; $this-&gt;builders(),
</span><span class="cx">             'bugTrackers' =&gt; $this-&gt;bug_trackers($repositories_table),
</span><span class="cx">         );
</span><span class="lines">@@ -85,12 +91,16 @@
</span><span class="cx">         return $platforms;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    private function repositories($repositories_table) {
</del><ins>+    private function repositories($repositories_table, $repositories_with_commit) {
</ins><span class="cx">         $repositories = array();
</span><span class="cx">         if (!$repositories_table)
</span><span class="cx">             return $repositories;
</span><del>-        foreach ($repositories_table as $row)
-            $repositories[$row['repository_name']] = array('url' =&gt; $row['repository_url'], 'blameUrl' =&gt; $row['repository_blame_url']);
</del><ins>+        foreach ($repositories_table as $row) {
+            $repositories[$row['repository_name']] = array(
+                'url' =&gt; $row['repository_url'],
+                'blameUrl' =&gt; $row['repository_blame_url'],
+                'hasReportedCommits' =&gt; in_array($row['repository_id'], $repositories_with_commit));
+        }
</ins><span class="cx"> 
</span><span class="cx">         return $repositories;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2appjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/app.js (174554 => 174555)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/app.js        2014-10-10 03:34:01 UTC (rev 174554)
+++ trunk/Websites/perf.webkit.org/public/v2/app.js        2014-10-10 03:45:20 UTC (rev 174555)
</span><span class="lines">@@ -1408,7 +1408,7 @@
</span><span class="cx">         var to = revisionInfo.get('currentRevision');
</span><span class="cx">         var from = revisionInfo.get('previousRevision') || to;
</span><span class="cx">         var repository = this.get('repository');
</span><del>-        if (!from || !repository)
</del><ins>+        if (!from || !repository || !repository.get('hasReportedCommits'))
</ins><span class="cx">             return;
</span><span class="cx"> 
</span><span class="cx">         var self = this;
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2datajs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/data.js (174554 => 174555)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/data.js        2014-10-10 03:34:01 UTC (rev 174554)
+++ trunk/Websites/perf.webkit.org/public/v2/data.js        2014-10-10 03:45:20 UTC (rev 174555)
</span><span class="lines">@@ -1,15 +1,44 @@
</span><span class="cx"> // We don't use DS.Model for these object types because we can't afford to process millions of them.
</span><span class="cx"> 
</span><del>-FetchCommitsForTimeRange = function (repository, from, to)
</del><ins>+function FetchCommitsForTimeRange(repository, from, to)
</ins><span class="cx"> {
</span><span class="cx">     var url = '../api/commits/' + repository.get('id') + '/' + from + '-' + to;
</span><del>-    console.log('Fetching ' + url)
</del><ins>+
+    var cachedCommits = FetchCommitsForTimeRange._cachedCommitsByRepository[repository];
+    if (!cachedCommits) {
+        cachedCommits = {commitsByRevision: {}, commitsByTime: []};
+        FetchCommitsForTimeRange._cachedCommitsByRepository[repository] = cachedCommits;
+    }
+
+    if (cachedCommits) {
+        var startCommit = cachedCommits.commitsByRevision[from];
+        var endCommit = cachedCommits.commitsByRevision[to];
+        if (startCommit &amp;&amp; endCommit) {
+            return new Ember.RSVP.Promise(function (resolve) {
+                resolve(cachedCommits.commitsByTime.slice(startCommit.index, endCommit.index + 1)) });
+        }
+    }
+
+    console.log('Fecthing ' + url);
+
</ins><span class="cx">     return new Ember.RSVP.Promise(function (resolve, reject) {
</span><span class="cx">         $.getJSON(url, function (data) {
</span><span class="cx">             if (data.status != 'OK') {
</span><span class="cx">                 reject(data.status);
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><ins>+
+            data.commits.forEach(function (commit) {
+                if (cachedCommits.commitsByRevision[commit.revision])
+                    return;
+                commit.time = new Date(commit.time.replace(' ', 'T'));
+                cachedCommits.commitsByRevision[commit.revision] = commit;
+                cachedCommits.commitsByTime.push(commit);
+            });
+
+            cachedCommits.commitsByTime.sort(function (a, b) { return a.time - b.time; });
+            cachedCommits.commitsByTime.forEach(function (commit, index) { commit.index = index; });
+
</ins><span class="cx">             resolve(data.commits);
</span><span class="cx">         }).fail(function (xhr, status, error) {
</span><span class="cx">             reject(xhr.status + (error ? ', ' + error : ''));
</span><span class="lines">@@ -17,6 +46,8 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+FetchCommitsForTimeRange._cachedCommitsByRepository = {};
+
</ins><span class="cx"> function Measurement(rawData)
</span><span class="cx"> {
</span><span class="cx">     this._raw = rawData;
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2manifestjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/manifest.js (174554 => 174555)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/manifest.js        2014-10-10 03:34:01 UTC (rev 174554)
+++ trunk/Websites/perf.webkit.org/public/v2/manifest.js        2014-10-10 03:45:20 UTC (rev 174555)
</span><span class="lines">@@ -72,6 +72,7 @@
</span><span class="cx"> App.Repository = App.NameLabelModel.extend({
</span><span class="cx">     url: DS.attr('string'),
</span><span class="cx">     blameUrl: DS.attr('string'),
</span><ins>+    hasReportedCommits: DS.attr('boolean'),
</ins><span class="cx">     urlForRevision: function (currentRevision) {
</span><span class="cx">         return (this.get('url') || '').replace(/\$1/g, currentRevision);
</span><span class="cx">     },
</span></span></pre>
</div>
</div>

</body>
</html>