- Revision
- 185574
- Author
- rn...@webkit.org
- Date
- 2015-06-15 18:40:56 -0700 (Mon, 15 Jun 2015)
Log Message
Analysis task should show all possible revisions for A/B testing
https://bugs.webkit.org/show_bug.cgi?id=145996
Reviewed by Chris Dumez.
* public/api/commits.php:
(fetch_commits_between): When the time stamp is not available for commits, use revision numbers
to find revisions between two ranges. This is necessary for OS X and iOS versions since they don't
have a "commit time".
* public/v2/app.js:
(App.AnalysisTaskController.updateRootConfigurations): Fetch commits between two end points.
(App.AnalysisTaskController._createConfiguration): Extracted from updateRootConfigurations. List
the fetched list of commits if available.
(App.AnalysisTaskController._serializeNumbersSkippingConsecutiveEntries): Added. Serializes an list
of numbers intelligently. For example, [1, 2, 4, 5] turns into "1-2, 4-5". Without this, some lists
of points shown in the A/B testing configurations become too long.
* public/v2/commits-viewer.js:
(App.CommitsViewerComponent.commitsChanged):
* public/v2/data.js:
(CommitLogs.fetchCommits): Renamed from fetchForTimeRange.
Modified Paths
Diff
Modified: trunk/Websites/perf.webkit.org/ChangeLog (185573 => 185574)
--- trunk/Websites/perf.webkit.org/ChangeLog 2015-06-16 00:40:29 UTC (rev 185573)
+++ trunk/Websites/perf.webkit.org/ChangeLog 2015-06-16 01:40:56 UTC (rev 185574)
@@ -1,3 +1,29 @@
+2015-06-15 Ryosuke Niwa <rn...@webkit.org>
+
+ Analysis task should show all possible revisions for A/B testing
+ https://bugs.webkit.org/show_bug.cgi?id=145996
+
+ Reviewed by Chris Dumez.
+
+ * public/api/commits.php:
+ (fetch_commits_between): When the time stamp is not available for commits, use revision numbers
+ to find revisions between two ranges. This is necessary for OS X and iOS versions since they don't
+ have a "commit time".
+
+ * public/v2/app.js:
+ (App.AnalysisTaskController.updateRootConfigurations): Fetch commits between two end points.
+ (App.AnalysisTaskController._createConfiguration): Extracted from updateRootConfigurations. List
+ the fetched list of commits if available.
+ (App.AnalysisTaskController._serializeNumbersSkippingConsecutiveEntries): Added. Serializes an list
+ of numbers intelligently. For example, [1, 2, 4, 5] turns into "1-2, 4-5". Without this, some lists
+ of points shown in the A/B testing configurations become too long.
+
+ * public/v2/commits-viewer.js:
+ (App.CommitsViewerComponent.commitsChanged):
+
+ * public/v2/data.js:
+ (CommitLogs.fetchCommits): Renamed from fetchForTimeRange.
+
2015-06-13 Ryosuke Niwa <rn...@webkit.org>
Add a script to post new OS X builds to perf dashboard
Modified: trunk/Websites/perf.webkit.org/public/api/commits.php (185573 => 185574)
--- trunk/Websites/perf.webkit.org/public/api/commits.php 2015-06-16 00:40:29 UTC (rev 185573)
+++ trunk/Websites/perf.webkit.org/public/api/commits.php 2015-06-16 01:40:56 UTC (rev 185574)
@@ -70,20 +70,26 @@
committer_name as "authorName",
committer_account as "authorEmail",
commit_message as "message"
- FROM commits JOIN committers ON commit_committer = committer_id
+ FROM commits LEFT OUTER JOIN committers ON commit_committer = committer_id
WHERE commit_repository = $1 AND commit_reported = true';
$values = array($repository_id);
if ($first && $second) {
- $fitrt_commit = commit_from_revision($db, $repository_id, $first);
+ $first_commit = commit_from_revision($db, $repository_id, $first);
$second_commit = commit_from_revision($db, $repository_id, $second);
- $first = $fitrt_commit['commit_time'];
+ $first = $first_commit['commit_time'];
$second = $second_commit['commit_time'];
+ $column = 'commit_time';
+ if (!$first && !$second) {
+ $first = $first_commit['commit_revision'];
+ $second = $second_commit['commit_revision'];
+ $column = 'commit_revision';
+ }
$in_order = $first < $second;
array_push($values, $in_order ? $first : $second);
- $statements .= ' AND commit_time >= $' . count($values);
+ $statements .= ' AND ' . $column . ' >= $' . count($values);
array_push($values, $in_order ? $second : $first);
- $statements .= ' AND commit_time <= $' . count($values);
+ $statements .= ' AND ' . $column . ' <= $' . count($values);
}
if ($keyword) {
Modified: trunk/Websites/perf.webkit.org/public/v2/app.js (185573 => 185574)
--- trunk/Websites/perf.webkit.org/public/v2/app.js 2015-06-16 00:40:29 UTC (rev 185573)
+++ trunk/Websites/perf.webkit.org/public/v2/app.js 2015-06-16 01:40:56 UTC (rev 185574)
@@ -1250,43 +1250,92 @@
var revisions = point.measurement.formattedRevisions();
for (var repositoryId in revisions) {
if (!repositoryToRevisions[repositoryId])
- repositoryToRevisions[repositoryId] = new Array(analysisPoints.length);
+ repositoryToRevisions[repositoryId] = {commits: null, revisions: []};
var revision = revisions[repositoryId];
- repositoryToRevisions[repositoryId][pointIndex] = {
+ repositoryToRevisions[repositoryId].revisions[pointIndex] = {
label: point.label + ': ' + revision.label,
value: revision.currentRevision,
};
}
});
+ var commitsPromises = [];
+ var repositoryToIndex = {};
+ for (var repositoryId in repositoryToRevisions) {
+ var revisions = repositoryToRevisions[repositoryId].revisions;
+ repositoryToIndex[repositoryId] = commitsPromises.length;
+ console.log(repositoryId)
+ commitsPromises.push(CommitLogs.fetchCommits(repositoryId, revisions[0].value, revisions[revisions.length - 1].value));
+ }
+
var self = this;
this.get('model').get('triggerable').then(function (triggerable) {
if (!triggerable)
return;
-
- self.set('configurations', ['A', 'B']);
- self.set('rootConfigurations', triggerable.get('acceptedRepositories').map(function (repository) {
- var repositoryId = repository.get('id');
- var options = [{label: 'None'}].concat((repositoryToRevisions[repositoryId] || []).map(function (option, index) {
- if (!option || !option['value'])
- return {value: '', label: analysisPoints[index].label + ': None'};
- return option;
+ Ember.RSVP.Promise.all(commitsPromises).then(function (commitsList) {
+ self.set('configurations', ['A', 'B']);
+ self.set('rootConfigurations', triggerable.get('acceptedRepositories').map(function (repository) {
+ return self._createConfiguration(repository, commitsList[repositoryToIndex[repository.get('id')]], analysisPoints);
}));
- return Ember.Object.create({
- repository: repository,
- name: repository.get('name'),
- sets: [
- Ember.Object.create({name: 'A[' + repositoryId + ']',
- options: options,
- selection: options[1]}),
- Ember.Object.create({name: 'B[' + repositoryId + ']',
- options: options,
- selection: options[options.length - 1]}),
- ],
- });
- }));
+ });
});
}.observes('analysisPoints'),
+ _createConfiguration: function(repository, commits, analysisPoints) {
+ var repositoryId = repository.get('id');
+
+ var options = [{label: 'None'}];
+ var revisionToPoints = {};
+ analysisPoints.forEach(function (point, pointIndex) {
+ var revision = point.measurement.revisionForRepository(repositoryId);
+ if (!revision)
+ return;
+ if (!revisionToPoints[revision])
+ revisionToPoints[revision] = [];
+ revisionToPoints[revision].push(pointIndex);
+ });
+
+ if (!commits || !commits.length) {
+ commits = [];
+ for (var revision in revisionToPoints)
+ commits.push({revision: revision});
+ }
+
+ for (var commit of commits) {
+ var revision = commit.revision;
+ var label = Measurement.formatRevisionRange(revision).label;
+ var points = revisionToPoints[revision];
+ if (points) {
+ var serializedPoints = this._serializeNumbersSkippingConsecutiveEntries(revisionToPoints[revision]);
+ label += ' ' + ['(', points.length > 1 ? 'points' : 'point', serializedPoints, ')'].join(' ');
+ }
+ options.push({value: revision, label: label});
+ }
+
+ return Ember.Object.create({
+ repository: repository,
+ name: repository.get('name'),
+ sets: [
+ Ember.Object.create({name: 'A[' + repositoryId + ']',
+ options: options,
+ selection: options[1]}),
+ Ember.Object.create({name: 'B[' + repositoryId + ']',
+ options: options,
+ selection: options[options.length - 1]}),
+ ]});
+ },
+ _serializeNumbersSkippingConsecutiveEntries: function (numbers) {
+ var result = numbers[0];
+ for (var i = 1; i < numbers.length; i++) {
+ if (numbers[i - 1] + 1 == numbers[i]) {
+ while (numbers[i] + 1 == numbers[i + 1])
+ i++;
+ result += '-' + numbers[i];
+ continue;
+ }
+ result += ', ' + numbers[i]
+ }
+ return result;
+ },
actions: {
addBug: function (bugTracker, bugNumber)
{
Modified: trunk/Websites/perf.webkit.org/public/v2/commits-viewer.js (185573 => 185574)
--- trunk/Websites/perf.webkit.org/public/v2/commits-viewer.js 2015-06-16 00:40:29 UTC (rev 185573)
+++ trunk/Websites/perf.webkit.org/public/v2/commits-viewer.js 2015-06-16 01:40:56 UTC (rev 185574)
@@ -14,7 +14,7 @@
return;
var self = this;
- CommitLogs.fetchForTimeRange(repository.get('id'), from, to).then(function (commits) {
+ CommitLogs.fetchCommits(repository.get('id'), from, to).then(function (commits) {
if (self.isDestroyed)
return;
self.set('commits', commits.map(function (commit) {
Modified: trunk/Websites/perf.webkit.org/public/v2/data.js (185573 => 185574)
--- trunk/Websites/perf.webkit.org/public/v2/data.js 2015-06-16 00:40:29 UTC (rev 185573)
+++ trunk/Websites/perf.webkit.org/public/v2/data.js 2015-06-16 01:40:56 UTC (rev 185574)
@@ -64,7 +64,7 @@
_cachedCommitsByRepository: {}
};
-CommitLogs.fetchForTimeRange = function (repository, from, to, keyword)
+CommitLogs.fetchCommits = function (repository, from, to, keyword)
{
var params = [];
if (from && to) {