New flakiness dashboard's test pane should show the latest WebKit revision for each...
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 23 Oct 2013 00:44:20 +0000 (00:44 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 23 Oct 2013 00:44:20 +0000 (00:44 +0000)
https://bugs.webkit.org/show_bug.cgi?id=123189

Reviewed by Simon Fraser.

* index.html:
(TestResultsView._populateTestPane): Call _createTestResultHeader and _createTestResultRow with
a list of repository information.
(TestResultsView._createTestResultHeader): Optionally creates headers for a list of repositories.
(TestResultsView._createTestResultRow): Add a hyperlinked revision information for each builder.
Also add a hyperlink to file a Bugzilla bug when there is no bug associated with the test already.
* js/build.js:
(Build.formattedRevision): Extracted from Build.formattedRevisions.
(Build.formattedRevisions):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@157838 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Websites/test-results/ChangeLog
Websites/test-results/index.html
Websites/test-results/js/build.js

index c90c013..179baff 100644 (file)
@@ -1,5 +1,22 @@
 2013-10-22  Ryosuke Niwa  <rniwa@webkit.org>
 
+        New flakiness dashboard's test pane should show the latest WebKit revision for each builder
+        https://bugs.webkit.org/show_bug.cgi?id=123189
+
+        Reviewed by Simon Fraser.
+
+        * index.html:
+        (TestResultsView._populateTestPane): Call _createTestResultHeader and _createTestResultRow with
+        a list of repository information.
+        (TestResultsView._createTestResultHeader): Optionally creates headers for a list of repositories.
+        (TestResultsView._createTestResultRow): Add a hyperlinked revision information for each builder.
+        Also add a hyperlink to file a Bugzilla bug when there is no bug associated with the test already.
+        * js/build.js:
+        (Build.formattedRevision): Extracted from Build.formattedRevisions.
+        (Build.formattedRevisions):
+
+2013-10-22  Ryosuke Niwa  <rniwa@webkit.org>
+
         Make tables on the new flakiness dashboard sortable
         https://bugs.webkit.org/show_bug.cgi?id=123141
 
index d41c7ec..d381821 100644 (file)
@@ -154,7 +154,6 @@ TestResultsView._createResultCell = function (master, builder, result, previousR
 TestResultsView._populateTestPane = function(testName, results, section) {
     var test = {name: testName, category: 'LayoutTest'}; // FIXME: Use the real test object.
     var table = element('table', {'class': 'resultsTable tablesorter'}, [element('caption', [this._linkifiedTestName(test)])]);
-    table.appendChild(this._createTestResultHeader('Builder'));
 
     var resultsByBuilder = results['builders'];
     var buildTimes = new Array();
@@ -169,11 +168,17 @@ TestResultsView._populateTestPane = function(testName, results, section) {
     }
     buildTimes.sort(function (a, b) { return b - a; });
 
+    var repositories = [];
+    for (var repositoryId in this._repositories)
+        repositories.push(this._repositories[repositoryId]);
+
+    table.appendChild(this._createTestResultHeader('Builder', repositories));
+
     var tbody = element('tbody');
     for (var builderId in resultsByBuilder) {
         var builder = this._builders[builderId];
         // FIXME: Add a master name if there is more than one.
-        tbody.appendChild(this._createTestResultRow(builder.name, resultsByBuilder[builderId], builder, buildTimes));
+        tbody.appendChild(this._createTestResultRow(builder.name, resultsByBuilder[builderId], builder, buildTimes, repositories));
     }
     table.appendChild(tbody);
     section.appendChild(table);
@@ -188,12 +193,14 @@ TestResultsView._linkifiedTestName = function (test) {
     return element('a', {'href': category.url.replace(/\$testName/g, test.name)}, [test.name]);
 }
 
-TestResultsView._createTestResultHeader = function (labelForFirstColumn) {
+TestResultsView._createTestResultHeader = function (labelForFirstColumn, repositories) {
     return element('thead', [element('tr', [
         element('th', [labelForFirstColumn]),
         element('th', ['Bug']),
         element('th', ['Expectations']),
-        element('th', ['Slowest'])])]);
+        element('th', ['Slowest'])]
+        .concat(repositories ? repositories.map(function (repository) { return element('th', [repository.name]); }) : [])
+        .concat([element('th')]))]);
 }
 
 TestResultsView._createBuildsAndComputeSlownessOfResults = function (builderId, results) {
@@ -206,7 +213,7 @@ TestResultsView._createBuildsAndComputeSlownessOfResults = function (builderId,
     }
 }
 
-TestResultsView._createTestResultRow = function (title, results, builder, buildTimes) {
+TestResultsView._createTestResultRow = function (title, results, builder, buildTimes, repositories) {
     var sortedResults = results.sort(function (result1, result2) { return result2.build.time() - result1.build.time(); });
     var cells = new Array();
 
@@ -232,24 +239,47 @@ TestResultsView._createTestResultRow = function (title, results, builder, buildT
         }
     }
 
+    var seenBugLink = false;
     var formattedModifiers = sortedResults[0].modifiers.split(' ').map(function (modifier) {
-        if (modifier.indexOf('/') > 0)
+        if (modifier.indexOf('/') > 0) {
+            seenBugLink = true;
             return element('a', {'href': (modifier.indexOf('http') == 0 ? '' : 'http://') + modifier}, [modifier]);
+        }
         return modifier;
     });
 
+    if (!seenBugLink) {
+        // FIXME: Make bug tracker configurable.
+        formattedModifiers.push(element('a',
+            {'href': 'https://bugs.webkit.org/enter_bug.cgi?product=WebKit&component=Tools%20/%20Tests&form_name=enter_bug&keywords=LayoutTestFailure'},
+            ['File a bug']));
+    }
+
     var slowestTime = Math.max.apply(Math, results.map(function (result) { return result.roundedTime; }));
     if (slowestTime >= 1)
         slowestTime += 's';
     else
         slowestTime = '';
 
+    var formattedRevisionCells = [];
+    if (repositories) {
+        var build = sortedResults[0].build;
+        for (var i = 0; i < repositories.length; i++) {
+            var revisionInfo = build.formattedRevision(repositories[i].id);
+            if (revisionInfo.url)
+                formattedRevisionCells.push(element('a', {'href': revisionInfo.url}, [revisionInfo.label]));
+            else
+                formattedRevisionCells.push(revisionInfo.label);
+        }
+    }
+
     return element('tr', [
         element('th', [title]),
         element('td', {'class': 'modifiers'}, formattedModifiers),
         element('td', {'class': 'expected'}, [sortedResults[0].expected]),
-        element('td', {'class': 'slowestTime'}, [slowestTime]),
-        element('td', cells)]);
+        element('td', {'class': 'slowestTime'}, [slowestTime])]
+        .concat(formattedRevisionCells)
+        .concat([element('td', cells)]));
 }
 
 TestResultsView.fetchTest = function (testName) {
index 29a81dd..fa46a51 100644 (file)
@@ -28,45 +28,50 @@ function TestBuild(repositories, builders, rawRun) {
         var repository = revisions[repositoryId];
         return repository ? repository[0] : null;
     }
-    this.formattedRevisions = function (previousBuild) {
-        var result = {};
-        for (var repositoryId in revisions) {
-            var repository = repositories[repositoryId];
-            var repositoryName = repository ? repository.name : 'Unknown repository ' + repositoryId;
-            var previousRevision = previousBuild ? previousBuild.revision(repositoryId) : undefined;
-            var currentRevision = this.revision(repositoryId);
-            if (previousRevision === currentRevision)
-                previousRevision = undefined;
+    this.formattedRevision = function (repositoryId, previousBuild, shouldIncludeNameInLabel) {
+        var repository = repositories[repositoryId];
+        var repositoryName = repository ? repository.name : 'Unknown repository ' + repositoryId;
+        var previousRevision = previousBuild ? previousBuild.revision(repositoryId) : undefined;
+        var currentRevision = this.revision(repositoryId);
+        if (previousRevision === currentRevision)
+            previousRevision = undefined;
 
-            var revisionPrefix = '';
-            if (currentRevision.length < 10) { // SVN-like revision.
-                revisionPrefix = 'r';
-                if (previousRevision)
-                    previousRevision = (parseInt(previousRevision) + 1);
-            }
+        var revisionPrefix = '';
+        if (currentRevision.length < 10) { // SVN-like revision.
+            revisionPrefix = 'r';
+            if (previousRevision)
+                previousRevision = (parseInt(previousRevision) + 1);
+        }
 
-            var labelForThisRepository = revisionCount ? repositoryName : '';
-            if (previousRevision) {
-                if (labelForThisRepository)
-                    labelForThisRepository += ' ';
-                labelForThisRepository += revisionPrefix + previousRevision + '-' + revisionPrefix + currentRevision;
-            } else
-                labelForThisRepository += ' @ ' + revisionPrefix + currentRevision;
+        var labelForThisRepository = shouldIncludeNameInLabel ? repositoryName : '';
+        if (previousRevision) {
+            if (labelForThisRepository)
+                labelForThisRepository += ' ';
+            labelForThisRepository += revisionPrefix + previousRevision + '-' + revisionPrefix + currentRevision;
+        } else
+            labelForThisRepository += ' @' + revisionPrefix + currentRevision;
 
-            var url;
-            if (repository) {
-                if (previousRevision)
-                    url = (repository['blameUrl'] || '').replace(/\$1/g, previousRevision).replace(/\$2/g, currentRevision);
-                else
-                    url = (repository['url'] || '').replace(/\$1/g, currentRevision);
-            }
+        var url;
+        if (repository) {
+            if (previousRevision)
+                url = (repository['blameUrl'] || '').replace(/\$1/g, previousRevision).replace(/\$2/g, currentRevision);
+            else
+                url = (repository['url'] || '').replace(/\$1/g, currentRevision);
+        }
 
-            result[repositoryName] = {
-                'label': labelForThisRepository,
-                'currentRevision': currentRevision,
-                'previousRevision': previousRevision,
-                'url': url,
-            };
+        return {
+            'name': repositoryName,
+            'label': labelForThisRepository,
+            'currentRevision': currentRevision,
+            'previousRevision': previousRevision,
+            'url': url,
+        };
+    }
+    this.formattedRevisions = function (previousBuild) {
+        var result = {};
+        for (var repositoryId in revisions) {
+            var info = this.formattedRevision(repositoryId, previousBuild, !!revisionCount);
+            result[info.name] = info;
         }
         return result;
     }