d13e27ad90b1bf69b5c660c4f091c6f4d574eb8e
[WebKit-https.git] / Websites / perf.webkit.org / ChangeLog
1 2017-12-13  Dewei Zhu  <dewei_zhu@apple.com>
2
3         Add a test freshness page.
4         https://bugs.webkit.org/show_bug.cgi?id=180126
5
6         Reviewed by Ryosuke Niwa.
7
8         Added a page to show freshness of a test.
9         The test freshness page reports on the same set of tests as the one shown in the summary page.
10         Use a logistic function to evaluate the freshness of the data points.
11         This function has the desired property which increase dramatically when it close to the center of the graph.
12         'acceptableLastDataPointDurationInHour' configs the center of the graph.
13
14         * public/include/manifest-generator.php:
15         * public/v3/components/freshness-indicator.js: Added.
16         (FreshnessIndicator): A cell of the test freshness table, color will transit from green to red.
17         (FreshnessIndicator.prototype.update): Update the the data point information and triggers
18         the cell to re-render if anything changes.
19         (FreshnessIndicator.prototype._renderIndicator): Re-render the indicator.
20         (FreshnessIndicator.prototype.render): Render the box color base on a logistic function.
21         (FreshnessIndicator.prototype._createIndicator):
22         (FreshnessIndicator.htmlTemplate):
23         (FreshnessIndicator.cssTemplate):
24         * public/v3/index.html:
25         * public/v3/main.js: Added test freshness page.
26         (main):
27         * public/v3/models/build-request.js: Refactored waitingTime function to make it reusable.
28         (BuildRequest.formatTimeInterval): Format time interval in million seconds to more user friendly text.
29         (BuildRequest.prototype.waitingTime):
30         * public/v3/pages/test-freshness-page.js: Added.
31         (TestFreshnessPage):
32         (TestFreshnessPage.prototype.name):
33         (TestFreshnessPage.prototype._loadConfig): Load config from summary page configurations.
34         (TestFreshnessPage.prototype.open):
35         (TestFreshnessPage.prototype._fetchTestResults):
36         (TestFreshnessPage.prototype.render):
37         (TestFreshnessPage.prototype._renderTable):
38         (TestFreshnessPage.prototype._isValidPlatformMetricCombination): Return whether a platform
39         and metric combination is valid.
40         (TestFreshnessPage.prototype._constructTableCell):
41         (TestFreshnessPage.cssTemplate):
42         (TestFreshnessPage.prototype.routeName):
43         * server-tests/api-manifest-tests.js: Added 'warningHourBaseline' so that we can config the
44         parameter of logistic funciton.
45         * unit-tests/build-request-tests.js: Added unit tests for formatTimeInterval.
46
47 2017-11-02  Dewei Zhu  <dewei_zhu@apple.com>
48
49         Add platform argument for syncing script.
50         https://bugs.webkit.org/show_bug.cgi?id=179162
51
52         Reviewed by Ryosuke Niwa.
53
54         Syncing script should pass platform name to buildbot if platform argument is specified in configuration.
55
56         * server-tests/tools-sync-buildbot-integration-tests.js:
57         (return.createTriggerable.configWithPlatformName.then): Added unit test for platform argument.
58         * tools/js/buildbot-syncer.js:
59         (BuildbotSyncer): Add '_platformPropertyName' property.
60         (BuildbotSyncer.prototype.scheduleRequest): Add '_platformPropertyName' to build property if specified.
61         (BuildbotSyncer._loadConfig): Read '_plaformPropertyName' from config.
62
63 2017-10-30  Dewei Zhu  <dewei_zhu@apple.com>
64
65         Limit the number of results to be submitted in one submission.
66         https://bugs.webkit.org/show_bug.cgi?id=179045
67
68         Reviewed by Ryosuke Niwa.
69
70         Submitting results for a large number of builds with owned commit information may exceed the size limit of php.
71         Added a way to split the results into groups of certain sizes, and submit them one by one.
72
73         * server-tests/tools-os-build-fetcher-tests.js: Updated the unit tests.
74         * tools/js/os-build-fetcher.js: Added '_maxNumberOfResultsPerSubmit' which can be specified by a configuration but also use 20 as default value.
75         (prototype.fetchAndReportNewBuilds): Instead of submitting all results once, split them into groups and submit them one by one.
76         (prototype._fetchAvailableBuilds): 'label' is already quoted, should remove unnecessary quotes.
77         (prototype._addOwnedCommitsForBuild): Added logging to log the size of owned commits.
78
79 2017-10-31  Dewei Zhu  <dewei_zhu@apple.com>
80
81         OwnedCommitViewer should include the preceding commit.
82         https://bugs.webkit.org/show_bug.cgi?id=179047
83
84         Reviewed by Ryosuke Niwa.
85
86         OwnedCommitViewer shows the difference between owned commits.
87         To show changes made by first owned commit, we need to have the preceding commit information.
88
89         * public/v3/components/commit-log-viewer.js:
90         (CommitLogViewer):
91         (CommitLogViewer.prototype._fetchCommitLogs): Fetch preceding commit if the commits fetched is not a single commit.
92         (CommitLogViewer.prototype.render):
93         (CommitLogViewer.prototype._renderCommitList): Conditionally rendering preceding commit in commit list.
94
95 2017-10-24  Dewei Zhu  <dewei_zhu@apple.com>
96
97         Fix a bug in syncing script that test/build syncer is never set.
98         https://bugs.webkit.org/show_bug.cgi?id=178772
99
100         Reviewed by Ryosuke Niwa.
101
102         Neither 'buildSyncer' nor 'testSyncer' is ever set.
103         Added a unit test to cover this case.
104
105         * server-tests/tools-sync-buildbot-integration-tests.js:
106         (createTriggerable): Refactor it to allow customized name.
107         * tools/js/buildbot-triggerable.js:
108         (BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers): Update syncer info accordingly.
109         (BuildbotTriggerable._testGroupMapForBuildRequests): Initialize build and test syncer to null.
110
111 2017-10-24  Dewei Zhu  <dewei_zhu@apple.com>
112
113         Owner commit does not necessarily exist in the same commit set for an owned commit.
114         https://bugs.webkit.org/show_bug.cgi?id=178763
115
116         Reviewed by Ryosuke Niwa.
117
118         Remove the check based on previous incorrect assumption.
119         Added unit tests to cover this change.
120
121         * public/privileged-api/create-test-group.php:
122         * server-tests/privileged-api-create-test-group-tests.js:
123         (return.addTriggerableAndCreateTask.string_appeared_here.then.id.taskId.id.then):
124
125 2017-10-20  Dewei Zhu  <dewei_zhu@apple.com>
126
127         Update perf dashboard upload logic to support uploading binaries from owned commits.
128         https://bugs.webkit.org/show_bug.cgi?id=178610
129
130         Reviewed by Ryosuke Niwa.
131
132         Update build requests to 'completed' only when all commit set items are satisfied.
133         Extend 'repositoryList' parameter to be able to specified own commit information.
134         Items in 'repositoryList' can either be a string for top level repository,
135         or a dictionary with two keys: 'ownerRepository' and 'ownedRepository'.
136
137         * public/api/upload-root.php: Extend upload logic for support uploading binaries from owned commits.
138         * server-tests/api-upload-root-tests.js: Added unit tests.
139         * server-tests/tools-sync-buildbot-integration-tests.js: Added unit tests.
140
141 2017-10-05  Dewei Zhu  <dewei_zhu@apple.com>
142
143         Add try-bot button on perf analysis status page.
144         https://bugs.webkit.org/show_bug.cgi?id=177995
145
146         Reviewed by Ryosuke Niwa.
147
148         Add 'Create' button on analysis status top-left corner to create trybot analysis task.
149
150         * public/v3/pages/analysis-category-toolbar.js:
151         (AnalysisCategoryToolbar.cssTemplate):
152
153 2017-09-28  Dewei Zhu  <dewei_zhu@apple.com>
154
155         Update syncing script to be able to build binary for commit set with owned commits.
156         https://bugs.webkit.org/show_bug.cgi?id=177225
157
158         Reviewed by Ryosuke Niwa.
159
160         Added support for syncing script to be able to schedule builds to build binary for owned commits.
161         Introduces 'ifRepositorySet' and 'ownedRevisions' in 'buildProperties'.
162         'ifRepositorySet' will conditionaly set a build property if at least one of the repositories it specified requires build.
163         'ownedRevisions' specifies owned commits revision informations.
164
165         * public/v3/models/commit-set.js:
166         (CommitSet): Added '_ownerRepositoryToOwnedRepositoriesMap'.
167         (CommitSet.prototype.updateSingleton): Reset '_ownerRepositoryToOwnedRepositoriesMap'.
168         (CommitSet.prototype._updateFromObject): Only update '_repositoryToCommitOwnerMap' and '_ownerRepositoryToOwnedRepositoriesMap' when 'commitOwner' exists.
169         (CommitSet.prototype.ownerCommitForRepository): Returns a sorted list of top level repositories.
170         (CommitSet.prototype.ownedRepositoriesForOwnerRepository): Returns owned repositories given a owner repository.
171         (CustomCommitSet.prototype.ownerCommitForRepository): Returns a sorted list of top level repositories.
172         * public/v3/models/triggerable.js:
173         (prototype.accepts): It should only check against top-level repositories. Removed a deprecated 'FIXME'.
174         * server-tests/tools-sync-buildbot-integration-tests.js: Added unit test for building owned commits binary.
175         (createTriggerable): Added conditional 'ifRepositorySet' and 'ownedRevisions' in the repository groups.
176         * tools/js/buildbot-syncer.js:
177         (BuildbotSyncer.prototype._propertiesForBuildRequest):
178             Added logic to conditionaly create build property for 'ifRepositorySet'.
179             Added logic to create 'ownedRevisions' based on the owner repositories it specified.
180         (BuildbotSyncer._parseRepositoryGroup): Build property template should be able to handle 'ifRepositorySet' and 'ownedRevisions'.
181         * unit-tests/buildbot-syncer-tests.js: Added unit tests for 'ifRepositorySet' and 'ownedRevisions'.
182         * unit-tests/commit-set-tests.js: Added unit tests for 'topLevelRepositoriesSortedByNamePreferringOnesWithURL'.
183         * unit-tests/resources/mock-v3-models.js: Added a repository group contains 'ios', 'webkit' and 'ownerRepository'.
184
185 2017-09-19  Dewei Zhu  <dewei_zhu@apple.com>
186
187         Use 'owned commit' instead of 'sub commit' whenever refers to a commit owned by another commit.
188         https://bugs.webkit.org/show_bug.cgi?id=177178
189
190         Reviewed by Ryosuke Niwa.
191
192         We use both 'owned commit' and 'sub commit' to refer to a commit owned by an another commit. We should use one term instead of two.
193         Renaming 'subCommit' to 'ownedCommit', 'ownsSubCommit' to 'ownsCommit' and 'sub-commit' to 'owned-commit'.
194
195         * browser-tests/commit-log-viewer-tests.js:
196         * public/api/commits.php:
197         * public/api/report-commits.php:
198         * public/include/commit-log-fetcher.php:
199         * public/v3/components/commit-log-viewer.js:
200         (CommitLogViewer.prototype._renderCommitList):
201         * public/v3/components/owned-commit-viewer.js: Renamed from Websites/perf.webkit.org/public/v3/components/sub-commit-viewer.js.
202         (OwnedCommitViewer):
203         (OwnedCommitViewer.prototype.didConstructShadowTree):
204         (OwnedCommitViewer.prototype._toggleVisibility):
205         (OwnedCommitViewer.prototype.render):
206         (OwnedCommitViewer.prototype._renderOwnedCommitTable):
207         (OwnedCommitViewer.htmlTemplate):
208         (OwnedCommitViewer.cssTemplate):
209         * public/v3/index.html:
210         * public/v3/models/commit-log.js:
211         (CommitLog):
212         (CommitLog.prototype.updateSingleton):
213         (CommitLog.prototype.ownsCommits):
214         (CommitLog.prototype.fetchOwnedCommits):
215         (CommitLog.prototype._buildOwnedCommitMap):
216         (CommitLog.diffOwnedCommits):
217         (CommitLog.prototype.ownsSubCommits): Deleted.
218         (CommitLog.prototype.fetchSubCommits): Deleted.
219         (CommitLog.prototype._buildSubCommitMap): Deleted.
220         (CommitLog.diffSubCommits): Deleted.
221         * server-tests/api-commits-tests.js:
222         * server-tests/api-report-commits-tests.js:
223         * server-tests/tools-os-build-fetcher-tests.js:
224         (return.waitForInvocationPromise.then):
225         (string_appeared_here.return.waitForInvocationPromise.then):
226         * tools/js/os-build-fetcher.js:
227         (prototype._fetchAvailableBuilds):
228         (prototype._addOwnedCommitsForBuild):
229         (prototype._addSubCommitsForBuild): Deleted.
230         * unit-tests/commit-log-tests.js:
231         (return.commit.fetchOwnedCommits.then):
232         (return.fetchingPromise.then):
233         (return.commit.fetchSubCommits.then): Deleted.
234
235 2017-09-12  Dewei Zhu  <dewei_zhu@apple.com>
236
237         Performance Dashboard backend should support A/B testing for owned components.
238         https://bugs.webkit.org/show_bug.cgi?id=175978
239
240         Reviewed by Ryosuke Niwa.
241
242         Add backend change for Performance Dashboard to support A/B testing for owned components.
243         Added 'commitset_commit_owner' and 'commitset_requires_build' columns to 'commit_set_items' table.
244         'commitset_commit_owner' referrs to determine a commit with owner.
245         'commitset_requires_build' indicates whether a root build is required.
246         This will be set true whenever commit_set_item specifies a patch file,
247         or commit_set_item is commit with owner commit,
248         or any other commit from same repository and in same build-request group requires build.
249         SQL for updating existing database:
250             'BEGIN;
251                 ALTER TABLE commit_set_items ADD COLUMN commitset_commit_owner integer REFERENCES commits DEFAULT NULL, ADD COLUMN commitset_requires_build boolean DEFAULT FALSE;
252                 UPDATE commit_set_items SET commitset_requires_build = TRUE WHERE commitset_patch_file IS NOT NULL;
253                 UPDATE commit_set_items SET commitset_requires_build = TRUE WHERE commitset_set IN (SELECT requests1.request_commit_set FROM build_requests as requests1 JOIN build_requests as requests2 ON requests1.request_group = requests2.request_group JOIN commit_set_items as item ON item.commitset_set = requests2.request_commit_set  WHERE item.commitset_patch_file IS NOT NULL);
254                 ALTER TABLE commit_set_items ADD CONSTRAINT commitset_item_with_patch_must_requires_build CHECK (commitset_patch_file IS NULL OR commitset_requires_build = TRUE),
255                     ADD CONSTRAINT commitset_item_with_owned_commit_must_requires_build CHECK (commitset_commit_owner IS NULL OR commitset_requires_build = TRUE);
256             END;'
257
258         * init-database.sql: Updated 'commit_set_items' table.
259         * public/admin/triggerables.php: Only top level repository should show on triggerables page.
260         * public/include/build-requests-fetcher.php: Added 'commitOwner' and 'requireBuild' to 'revision_items'. Added 'commitOwner' field to a commit.
261         * public/include/db.php: Should be able to insert boolean value to database without explicted convert to 't' or 'f'.
262         * public/privileged-api/create-test-group.php:
263             Added logic to process 'commitOwner' and 'requireBuild' in 'commit_set_items'.
264             Removed a 'FIXME' that has been addressed before this commit.
265         * public/v3/models/build-request.js:
266         (BuildRequest.constructBuildRequestsFromData): Set 'commitOwner' field for a commit set item.
267         * public/v3/models/commit-set.js:
268         (CommitSet): Added maps for repository to commit owner and whether a repository requires builds.
269         (CommitSet.prototype.updateSingleton):
270         (CommitSet.prototype._updateFromObject):
271         (CommitSet.prototype.ownerRevisionForRepository): Returns owner revision for a given repository in current commit set.
272         (CommitSet.prototype.requiresBuildForRepository): Returns whether a repository need to build.
273         (CommitSet.prototype.equals): Equality check should include 2 new maps.
274         (CustomCommitSet): CustomCommitSet should be able to store commit with an owner commit.
275         (CustomCommitSet.prototype.setRevisionForRepository): Added each revision list entry should have 'ownerRevision'(null by default).
276         (CustomCommitSet.prototype.equals): Equality check should also check the equality of 'ownerRevision'.
277         (CustomCommitSet.prototype.ownerRevisionForRepository): Returns a owner revision for a given repository.
278         * public/v3/models/repository.js:
279         (Repository.prototype.findOwnedRepositoryByName): Return an repository owned by current repository with a given name.
280         * public/v3/models/test-group.js: Added 'ownerRevision' field in each entry of revisionSet.
281         * server-tests/api-build-requests-tests.js: Added tests.
282         * server-tests/privileged-api-create-test-group-tests.js: Added tests.
283         * server-tests/privileged-api-upload-file-tests.js: Fix unit tests by setting'requires_build' field to be true when updating commit_set_item which has a patch..
284         * server-tests/resources/mock-data.js: Added mock build requests with commit sets contain owned commits.
285         (MockData.jscRepositoryId): Returns id for JavaScriptsCore repository.
286         (MockData.addMockConfiguration): Added mock JavaScriptCore and owned JavaScriptCore repositories and commits associated with them.
287         (MockData.ownedJSCRepositoryId): Added a JavaScriptCore repository with WebKit as owner.
288         (MockData.addMockConfiguration): Added mock data for test cases those require a commit with a owner commit.
289         (MockData.addTestGroupWithOwnedCommits): Added mock data for analysis tasks, the build requires of which contains owned commits.
290         (MockData.set addAnotherTriggerable): Added another triggerable which has mac, webkit and javascript core repositories as triggerable repository group.
291         (MockData.set addAnotherMockTestGroup): Added another mock test group.
292         * tools/js/v3-models.js: Import CustomCommitSet.
293         * unit-tests/resources/mock-v3-models.js: Added an owned webkit repository.
294         * unit-tests/commit-set-tests.js: Added unit tests CustomCommitSet.
295
296 2017-09-15  Dewei Zhu  <dewei_zhu@apple.com>
297
298         Should not mark a platform as missing in summary page if all expecting metrics are exlucded.
299         https://bugs.webkit.org/show_bug.cgi?id=176970
300
301         Reviewed by Ryosuke Niwa.
302
303         In summary page, if all metrics for a test are excluded in excludedConfigurations for a platform, this platform should not be marked as missing.
304
305         * public/v3/pages/summary-page.js:
306         (SummaryPageConfigurationGroup):
307
308 2017-09-11  Ryosuke Niwa  <rniwa@webkit.org>
309
310         Analysis task page shows an empty results for an irrelevant top-level test
311         https://bugs.webkit.org/show_bug.cgi?id=175252
312
313         Reviewed by Antti Koivisto.
314
315         The bug was caused by TestGroupResultsViewer always listing every top-level test which has a result for the
316         entire analysis task. Since a custom analysis task (perf try bots) allows multiple tests to be tested in each
317         group, we have to only list the tests which contains results in a particular test group.
318
319         * public/v3/components/test-group-results-viewer.js:
320         (TestGroupResultsViewer.prototype.render): Find the tests that have results for the current test group instead
321         of for any test group in this analysis task.
322         any test 
323         * public/v3/models/analysis-results.js:
324         (AnalysisResults):
325         (AnalysisResults.prototype.topLevelTestsForTestGroup): Renamed from highestTests. Now takes a test group
326         as an argument.
327         (AnalysisResults.prototype._computedTopLevelTests): Renamed from _computeHighestTests. Filters the results
328         with the specified test group.
329
330 2017-09-06  Aakash Jain  <aakash_jain@apple.com>
331
332         Add initSyncers method in BuildbotTriggerable
333         https://bugs.webkit.org/show_bug.cgi?id=176125
334
335         Reviewed by Ryosuke Niwa.
336
337         * tools/sync-buildbot.js:
338         (syncLoop): Use initSyncers() which returns a promise. Modified to handle the promise.
339         * tools/js/buildbot-triggerable.js:
340         (BuildbotTriggerable): Invokes initSyncers() appropriately.
341         (BuildbotTriggerable.prototype.initSyncers): Returns a promise which initialize all the syncers.
342         * server-tests/tools-buildbot-triggerable-tests.js: Updated tests to handle initSyncers().
343         * server-tests/tools-sync-buildbot-integration-tests.js: Ditto.
344
345 2017-09-05  Ryosuke Niwa  <rniwa@webkit.org>
346
347         Add a button to show two weeks of data to perf dashboard
348         https://bugs.webkit.org/show_bug.cgi?id=176438
349
350         Reviewed by Saam Barati.
351
352         Add "2W" button to show 14 days of data on dashboard pages.
353
354         * public/v3/pages/dashboard-toolbar.js:
355         (DashboardToolbar):
356
357 2017-08-29  Ryosuke Niwa  <rniwa@webkit.org>
358
359         Build fix. OS X "revision" can have a space.
360
361         * public/include/commit-log-fetcher.php:
362
363 2017-08-29  Ryosuke Niwa  <rniwa@webkit.org>
364
365         Make it possible to specify A/B testing revision with a partial hash
366         https://bugs.webkit.org/show_bug.cgi?id=176047
367
368         Rubber-stamped by Chris Dumez.
369
370         Added the support for specifying a partial hash in A/B testing instead of the full hash.
371
372         * public/include/commit-log-fetcher.php:
373         (CommitLogFetcher::find_commit_id_by_revision): Extracted from associate-commit.php.
374         * public/privileged-api/associate-commit.php:
375         (main): 
376         * public/privileged-api/create-test-group.php:
377         (main): Use find_commit_id_by_revision here to support scheduling an A/B testing with a partial hash.
378         * server-tests/privileged-api-create-test-group-tests.js:
379         (createAnalysisTask): Make it possible to customize revision string in some test cases.
380         * server-tests/resources/test-server.js:
381         (TestServer.prototype._stopApache): Fixed the bug that cleanup step always fails whenever the test file
382         runs more than 8s.
383
384 2017-08-26  Ryosuke Niwa  <rniwa@webkit.org>
385
386         Build fix. Creating trying a test group no longer updates the page.
387
388         * public/v3/models/test-group.js:
389         (TestGroup.createWithCustomConfiguration): Added the missing ignoreCache=true.
390
391 2017-08-21  Dewei Zhu  <dewei_zhu@apple.com>
392
393         Performance Dashboard should be compatible with PHP 7.
394         https://bugs.webkit.org/show_bug.cgi?id=175813
395
396         Reviewed by Ryosuke Niwa.
397
398         Use `file_get_contents('php://input')` instead of '$HTTP_RAW_POST_DATA'.
399         Update test harness script to load right php module in httpd.
400
401         * ReadMe.md: JSON example format fix.
402         * public/api/report-commits.php: Stop using '$HTTP_RAW_POST_DATA'.
403         * public/api/report.php: Stop using '$HTTP_RAW_POST_DATA'.
404         * public/api/update-triggerable.php: Stop using '$HTTP_RAW_POST_DATA'.
405         * public/include/json-header.php: Stop using '$HTTP_RAW_POST_DATA'.
406         * public/include/report-processor.php: Stop using '$HTTP_RAW_POST_DATA'.
407         * server-tests/resources/test-server.conf: Load php5 or php7 module conditionally.
408         * server-tests/resources/test-server.js: Pass PHP version info while launching httpd.
409         (TestServer.prototype._startApache):
410         * tools/remote-cache-server.py: Pass PHP version info while launching httpd.
411         (start_httpd):
412         * tools/remote-server-relay.conf: Load php5 or php7 module conditionally.
413         * tools/sync-buildbot.js:
414         (syncLoop.const.makeTriggerable):
415         (syncLoop):
416
417 2017-08-17  Ryosuke Niwa  <rniwa@webkit.org>
418
419         Number each section in ReadMe.md and add more clarifications
420         https://bugs.webkit.org/show_bug.cgi?id=175687
421
422         Rubber-stamped by Joseph Pecoraro.
423
424         Numbered each section and added more clarifications per issues Aakash encountered.
425
426         * ReadMe.md:
427
428 2017-08-17  Ryosuke Niwa  <rniwa@webkit.org>
429
430         Build fix. Make the test work with the latest versions of node modules.
431
432         * server-tests/privileged-api-upload-file-tests.js:
433
434 2017-07-27  Ryosuke Niwa  <rniwa@webkit.org>
435
436         Build fix. Fixed a typo. task.id() isn't a thing in this function.
437
438         * public/v3/models/test-group.js:
439         (TestGroup.createWithCustomConfiguration):
440
441 2017-07-11  Ryosuke Niwa  <rniwa@webkit.org>
442
443         Another build fix.
444
445         * public/v3/components/chart-pane-base.js:
446         (ChartPaneBase.prototype._updateCommitLogViewer):
447
448 2017-07-11  Ryosuke Niwa  <rniwa@webkit.org>
449
450         Build fix. It looks like the code here is racy.
451
452         * public/v3/components/chart-pane-base.js:
453         (ChartPaneBase.prototype.configure):
454         (ChartPaneBase.prototype.setOpenRepository):
455
456 2017-07-11  Ryosuke Niwa  <rniwa@webkit.org>
457
458         Show the roots built by perf try bots on results page
459         https://bugs.webkit.org/show_bug.cgi?id=174305
460
461         Reviewed by Joseph Pecoraro.
462
463         Show build products created by a perf try bots so that we can download them for local testing.
464
465         * public/v3/components/test-group-revision-table.js:
466         (TestGroupRevisionTable.prototype._renderTable): Find the set of repositories for which a patch is applied.
467         Show build products for all commit sets for such a repository since when WebKit is built with a patch in
468         one configuration, the other configuration also needs to be built for consistency.
469         (TestGroupRevisionTable.prototype._buildCommitCell): Added the hyperlink for build products.
470         (TestGroupRevisionTable.prototype._buildFileInfo): Takes a string to override the file's label. Since all
471         build products made by bots tend to have the same filename, we show the label of "Build product" instead.
472         (TestGroupRevisionTable.prototype._mergeCellsWithSameCommitsAcrossRows): Fixed a bug that any entry with
473         a patch wasn't getting merged since it was comparing against the result commit set, which does not contain
474         the patch (only requested commit set contains a patch).
475
476 2017-07-10  Ryosuke Niwa  <rniwa@webkit.org>
477
478         Address Antti's review comment.
479
480         * public/v3/models/analysis-results.js:
481         (AnalysisResults.prototype.containsTest):
482
483 2017-07-10  Ryosuke Niwa  <rniwa@webkit.org>
484
485         A/B testing results page show results for the top-level tests instead of the one being analyzed
486         https://bugs.webkit.org/show_bug.cgi?id=174304
487
488         Reviewed by Antti Koivisto.
489
490         When a specific subtest is analyzed (e.g. Images subtest of MotionMark), then TestGroupResultsViewer
491         should expand and highlight that specific subtest instead of simply showing the top-level test's score.
492         This is especially misleading since AnalysisResultsViewer (stacking bars for each test group) uses
493         the score of the specific subtest being analyzed.
494
495         Fixed the bug by passing in the metric associated with the analysis task from AnalysisTaskPage to
496         TestGroupResultsViewer via AnalysisTaskTestGroupPane. Also made TestGroupResultsViewer.setAnalysisResults
497         auto-expand the tests that are ancestors of the specified metric. Without that, the test won't be shown
498         to the user until the ancestor tests are expanded by the user.
499
500         Also fixed the bug that we were always listing sub-tests regardless of whether they have results or not.
501         Since tests tend to change over time, we shouldn't show a test if it doesn't have any results associated.
502
503         * public/v3/components/test-group-results-viewer.js:
504         (TestGroupResultsViewer.prototype.setAnalysisResults): Expand the ancestor tests of the metric.
505         (TestGroupResultsViewer.prototype._buildRowsForTest): Exit early if this test doesn't have any results.
506         * public/v3/models/analysis-results.js:
507         (AnalysisResults.prototype.containsTest): Added.
508         * public/v3/pages/analysis-task-page.js:
509         (AnalysisTaskTestGroupPane.prototype.setAnalysisResults): Takes a metric to pass it to the results viewer.
510         (AnalysisTaskPage.prototype._assignTestResultsIfPossible):
511
512 2017-07-06  Ryosuke Niwa  <rniwa@webkit.org>
513
514         Safari 10.1 fails to upload a patch on perf try bots page
515         https://bugs.webkit.org/show_bug.cgi?id=174214
516
517         Reviewed by Chris Dumez.
518
519         Added the workaround to make the analysis task page work on Safari 10.1
520
521         * public/v3/components/instant-file-uploader.js:
522         (InstantFileUploader.prototype._uploadFiles): Convert files to an array since for-of doesn't work otherwise on Safari 10.1.
523         * public/v3/models/uploaded-file.js:
524         (UploadedFile._computeSHA256Hash): Fallback to crypto.webkitSubtle since crypto.subtle isn't available on Safari 10.1 or 11.
525
526 2017-07-03  Ryosuke Niwa  <rniwa@webkit.org>
527
528         Fix a typo pointed out by Andreas Kling.
529
530         * public/v3/components/instant-file-uploader.js:
531         (InstantFileUploader.prototype._uploadFiles):
532         * public/v3/models/uploaded-file.js:
533         (UploadedFile.fetchUploadedFileWithIdenticalHash): Renamed from fetchUnloadedFileWithIdenticalHash.
534
535 2017-07-03  Ryosuke Niwa  <rniwa@webkit.org>
536
537         Add an admin page to manage uploaded files
538         https://bugs.webkit.org/show_bug.cgi?id=174089
539
540         Reviewed by Andreas Kling.
541
542         Add an admin page to see the disk usage per user as well as the total, and to prune any zombie files (ones marked
543         as deleted but aren't actually deleted in the filesystem).
544
545         * public/admin/files.php: Added.
546         (format_size): Added.
547         * public/include/admin-header.php:
548
549 2017-07-03  Ryosuke Niwa  <rniwa@webkit.org>
550
551         Roots uploaded by bots don't get author specified properly
552         https://bugs.webkit.org/show_bug.cgi?id=174087
553
554         Reviewed by Andreas Kling.
555
556         When a root file is uploaded from the bot, we manually specify the remote user to upload_file_in_transaction.
557         However, this was getting ignored by create_uploaded_file_from_form_data since it was always calling
558         remote_user_name to get the user name off of $_SERVER.
559
560         Fixed the bug by passing in the user name from upload_file_in_transaction to create_uploaded_file_from_form_data.
561
562         * public/include/uploaded-file-helpers.php:
563         (create_uploaded_file_from_form_data): Take the remote user as an argument instead of calling remote_user_name.
564         (upload_file_in_transaction):
565         * server-tests/api-upload-root-tests.js: Updated an existing test cases to make sure root files' author is set.
566         (createTestGroupWihPatch): Manually override the author of a test group for testing.
567
568 2017-07-03  Ryosuke Niwa  <rniwa@webkit.org>
569
570         Prune unused uploaded files when the file quota is reached
571         https://bugs.webkit.org/show_bug.cgi?id=174086
572
573         Reviewed by Andreas Kling.
574
575         Made /privileged-api/uploaded-file and /api/upload-root automatically delete old uploaded files when
576         uploading a new file results in the file quota to be exceeded. Also added the notion of the total quota
577         to avoid running out of a disk when there are hundreds of users each uploading near their quota.
578
579         * config.json: Added a sample total disk quota of 100GB.
580         * public/include/uploaded-file-helpers.php:
581         (query_file_usage_for_user): Renamed from query_total_file_size.
582         (query_total_file_usage): Added.
583         (upload_file_in_transaction):
584         (delete_file): Added.
585         (prune_old_files): Added.
586         * server-tests/privileged-api-upload-file-tests.js: Added tests for deleting old uploaded files as well as
587         tests for the total quota.
588         * server-tests/resources/test-server.js:
589         (TestServer.prototype.testConfig): Added uploadTotalQuotaInMB to the test configuration.
590
591 2017-06-29  Ryosuke Niwa  <rniwa@webkit.org>
592
593         UploadedFile should include the file extension in its url
594         https://bugs.webkit.org/show_bug.cgi?id=174009
595
596         Reviewed by Chris Dumez.
597
598         Some command line tools such as darwinup use the file extension to determine the file type.
599         Include the file extension in the URL of an uploaded file to make it work with these tools.
600
601         * public/include/uploaded-file-helpers.php:
602         (format_uploaded_file): Include the file extension.
603         * public/v3/models/uploaded-file.js:
604         (UploadedFile):
605         (UploadedFile.prototype.url): Return the URL with hthe file extension specified. /api/uploaded-file
606         already supports having the file extension specified.
607         * server-tests/tools-sync-buildbot-integration-tests.js: Updated test cases.
608         * unit-tests/buildbot-syncer-tests.js: Ditto.
609
610 2017-05-31  Ryosuke Niwa  <rniwa@webkit.org>
611
612         Don't shouldn't create a request to build a patch if there is no patch to build
613         https://bugs.webkit.org/show_bug.cgi?id=172791
614
615         Reviewed by Chris Dumez.
616
617         When a commit set doesn't have a patch specified, don't create a request to build. For example, when we're comparing
618         WebKit in the system to WebKit with a patch, there is nothing to build for the first commit set.
619
620         However, when conducting an A/B testing, it's advisible to compare WebKit built with and without a patch on a single
621         machine with the same version of Xcode, etc... For this reason, we still create a request to build for a commit set
622         if there is another commit set with a patch which uses the same repository group.
623
624         * public/privileged-api/create-test-group.php:
625         (main): Fixed the bug. Only create a build request to build if there is a matching repository group with a patch.
626         * server-tests/privileged-api-create-test-group-tests.js: Added a test case.
627
628 2017-05-31  Ryosuke Niwa  <rniwa@webkit.org>
629
630         Allow sync-buildbot.js to set a buildbot property only when patches are built
631         https://bugs.webkit.org/show_bug.cgi?id=172743
632
633         Rubber-stamped by Chris Dumez.
634
635         Added the ability to specify a buildbot property only when there are build requests to build a patch.
636
637         * tools/js/buildbot-syncer.js:
638         (BuildbotSyncer.prototype.scheduleRequest): Pass in the list of build requests that belong to the same test group.
639         (BuildbotSyncer.prototype.scheduleRequestInGroupIfAvailable): Ditto.
640         (BuildbotSyncer.prototype._propertiesForBuildRequest): Added the support for specifying a conditional property.
641         For the condition type of "built", we check if there was any other 
642         (BuildbotSyncer._parseRepositoryGroup): Added the support for "ifBuilt" conditional.
643
644         * tools/js/buildbot-triggerable.js:
645         (BuildbotTriggerable.prototype._scheduleRequestIfSlaveIsAvailable): Pass in the list of build requests that
646         belong to the same test group.
647         (BuildbotTriggerable.prototype._scheduleRequestWithLog): Ditto.
648
649         * unit-tests/buildbot-syncer-tests.js:  Added test case for newly added "ifBuilt" as well as specifying a patch.
650         Updated the various test cases per the addition of new argument to scheduleRequest, _propertiesForBuildRequest,
651         and scheduleRequestInGroupIfAvailable.
652         (createSampleBuildRequestWithPatch): Added.
653
654         * unit-tests/resources/mock-v3-models.js:
655         (MockModels.inject): Made "ios-svn-webkit" accept a WebKit patch and roots to allow new testing.
656
657 2017-05-30  Ryosuke Niwa  <rniwa@webkit.org>
658
659         sync-builedbot.js fails to schedule the second request to test with a patch
660         https://bugs.webkit.org/show_bug.cgi?id=172701
661
662         Reviewed by Antti Koivisto.
663
664         The bug was caused by an assertion failure in BuildbotTriggerable's _pullBuildbotOnAllSyncers failing to
665         take into account that for a test group with a patch could be associated with two syncers, one to build
666         a patch and another to run tests. Fixed the bug by differentiating the two types of syncers by buildSyncer
667         and testSyncer per test group.
668
669         * server-tests/tools-sync-buildbot-integration-tests.js: Extended a test case so that it would hit the
670         assertion without the fix.
671
672         * tools/js/buildbot-triggerable.js:
673         (BuildbotTriggerable.prototype.syncOnce): Use the right kind of the syncer to schedule a build or a test.
674         (BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers): Associate a given syncer based on the kind of
675         the build request it processed, and assert accordingly.
676
677 2017-05-29  Ryosuke Niwa  <rniwa@webkit.org>
678
679         Fix UI glitches with a custom analysis test group with a patch
680         https://bugs.webkit.org/show_bug.cgi?id=172694
681
682         Reviewed by Sam Weinig.
683
684         Fix the following UI glitches with perf try bots:
685          - Retrying an A/B testing with a patch fails.
686          - A patch specified in an test group does not get specified in the configurator.
687          - Drag & dropping a patch doesn't work.
688          - Results for custom analysis tasks don't get shown.
689
690         * public/api/test-groups.php:
691         (main): Fix a bug that test group's platform does not match that of the request'ed platform. Since each test
692         group is associated with platform, just use that instead of querying test_configurations. This resulted in
693         the configurator not being able to find a triggerable in some cases.
694
695         * public/v3/components/custom-analysis-task-configurator.js:
696         (CustomAnalysisTaskConfigurator):
697         (CustomAnalysisTaskConfigurator.prototype.setCommitSets): Add patches in the commit set.
698         (CustomAnalysisTaskConfigurator.prototype._setUploadedFilesToUploader): Now clears the exiting uploaded files
699         Also renamed from _setUploadedFilesIfEmpty.
700         (CustomAnalysisTaskConfigurator.prototype._setPatchFiles): Added.
701         (CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree): We no longer update the list of roots
702         for the comparsion when a new root is added to the baseline.
703         (CustomAnalysisTaskConfigurator.prototype._configureComparison): Copy over the list of patches and roots when
704         starting to configure the comparsion.
705
706         * public/v3/components/instant-file-uploader.js:
707         (InstantFileUploader.prototype.clear): Added.
708         (InstantFileUploader.prototype.didConstructShadowTree): Added event handlers for dragover & drop events to
709         allow specifying a patch and root using drag & drop. Unfortunately, this still doesn't work in WebKit due to
710         a bug in our shadow DOM implementation.
711         (InstantFileUploader.prototype._didFileInputChange):
712         (InstantFileUploader.prototype._uploadFiles): Extracted from _didFileInputChange.
713
714         * public/v3/pages/analysis-task-page.js:
715         (AnalysisTaskTestGroupPane.prototype.setAnalysisResults): No longer takes metric.
716         (AnalysisTaskTestGroupPane.cssTemplate): Removed unused rules. Also disallow flexing on the list of test groups
717         to avoid the name of a test froup from overflowing on top of the results pane.
718         (AnalysisTaskPage.prototype._assignTestResultsIfPossible): Set setAnalysisResults even when metric is not set
719         as is the case for a custom analysis task.
720         (AnalysisTaskPage.prototype._retryCurrentTestGroup): Use createWithCustomConfiguration to allow retrying of
721         an A/B testing with a patch in a custom analysis task.
722         (AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList):
723
724 2017-05-26  Ryosuke Niwa  <rniwa@webkit.org>
725
726         Show patches applied in each A/B testing build requests
727         https://bugs.webkit.org/show_bug.cgi?id=172636
728
729         Reviewed by Antti Koivisto.
730
731         List patches applied along side revisions inn the list of revisions for an A/B tesing build requests if there
732         are any patches applied.
733
734         * public/v3/components/test-group-revision-table.js:
735         (TestGroupRevisionTable.prototype._renderTable): Indicate which request is to build a patch and which one is
736         to run tests.
737         (TestGroupRevisionTable.prototype._buildCommitCell): Include the patch file's information when there is one.
738         We need to use the requested commit set instead of the one reported by testers or builders since they don't
739         include patch or root information.
740         (TestGroupRevisionTable.prototype._buildCustomRootsCell):
741         (TestGroupRevisionTable.prototype._buildFileInfo): Extracted from _buildCustomRootsCell.
742
743 2017-05-26  Ryosuke Niwa  <rniwa@webkit.org>
744
745         The queue page is broke when there is a custom analysis task
746         https://bugs.webkit.org/show_bug.cgi?id=172631
747
748         Reviewed by Antti Koivisto.
749
750         Fix the bug that we were always assuming each build request to have a test associated.
751
752         * public/v3/models/test-group.js:
753         (TestGroup.createAndRefetchTestGroups): Fixed the bug that we were referring to a non-existent variable task.
754         * public/v3/pages/build-request-queue-page.js:
755         (BuildRequestQueuePage.prototype._constructBuildRequestTable): Fixed the bug. Collect every request in the group
756         and then find the first test request's test name. Make it clear that we're waiting for a build as needed.
757
758 2017-05-25  Ryosuke Niwa  <rniwa@webkit.org>
759
760         Syncing script shouldn't schedule a build request when there is a build from another test group in progress
761         https://bugs.webkit.org/show_bug.cgi?id=172577
762         <rdar://problem/32395049>
763
764         Reviewed by Chris Dumez.
765
766         When a buildbot master gets restarted while there is an in-progress build and a pending build, the master will
767         re-schedule the currently running build, and this can result in multiple build requests from different test
768         groups being scheduled simultaneously.
769
770         sync-buildbot.js was supposed to recover from this state by only processing build requests from one test group
771         at a time and eventually come back to a state where only a single test group is running per buildbot slave.
772
773         We had a test for this particular case but it wasn't testing what it claimed to test. Rewriten the test case
774         and fixed the bug by explicitly checking this condition and treating it as if there is a pending build already
775         scheduled in the builder in this case.
776
777         * public/api/test-groups.php:
778         (main): Fixed a regression from r217397. Return the platform ID of the first request when none of the requets
779         have been processed yet or all of them had failed.
780         * server-tests/tools-buildbot-triggerable-tests.js: Rewritten a test case intended to cover this bug.
781         (.assertRequestAndResolve): Added.
782         * tools/js/buildbot-syncer.js:
783         (BuildbotSyncer.prototype.scheduleRequestInGroupIfAvailable): Fixed the bug. Avoid scheduling a new request on
784         this syncer if there is a build in progress for a test group different from that of the new request. Reuse the
785         code we had to deal with a pending build for this purpose.
786
787 2017-05-24  Ryosuke Niwa  <rniwa@webkit.org>
788
789         Opening an analysis task from the queue page is broken
790         https://bugs.webkit.org/show_bug.cgi?id=172559
791         <rdar://problem/32389708>
792
793         Rubber-stamped by Chris Dumez.
794
795         Fix the bug that opening the analysis task page from the queue page results in multiple assertion failures
796         as well as the list of test groups in the analysis task page not getting updated.
797
798         * public/v3/models/build-request.js:
799         (BuildRequest.prototype.updateSingleton): Because /api/build-requests/ do not include test groups, it's
800         possible for testGroup to be dynamically updated upon loading an analysis task page. Update _testGroup in
801         such instances instead of asserting that it doesn't happen.
802
803         * public/v3/models/data-model.js:
804         (DataModelObject.cachedFetch): Because various code to create model objects from the result of a JSON API
805         modify the fetched content in irreversible manner, e.g. `object.platform = Platform.findById(object.platform)`
806         we must return a fresh new content each time even if the result had been cached.
807
808         * public/v3/models/test-group.js:
809         (TestGroup.prototype.platform): Return this._platform as that's not available.
810
811         * public/v3/pages/analysis-task-page.js:
812         (AnalysisTaskPage):
813         (AnalysisTaskPage.prototype._resetVariables): Extracted from the constructor.
814         (AnalysisTaskPage.prototype.updateFromSerializedState): Reset all instance variables when opening a new
815         analysis task page. This would avoid showing the stale result even when fetching new test groups had failed.
816
817         * unit-tests/test-groups-tests.js: Added a test case for fetching the same test group twice. This used to hit
818         a problem in BuildRequest.constructBuildRequestsFromData which overrode platform property of each raw content
819         with a Platform model object because in the case of a cached fetch, we end up trying to look up the platform
820         again using the result of stringifying the Platform object instead of the platform ID included in the original
821         fetched content.
822         (sampleTestGroup): Added "platform" as included in the JSON API's response now.
823
824 2017-05-24  Ryosuke Niwa  <rniwa@webkit.org>
825
826         The commit log viewer can overlap the analysis results viewer
827         https://bugs.webkit.org/show_bug.cgi?id=172534
828
829         Rubber-stamped by Chris Dumez.
830
831         Allocate the padding on the right for the commit log viewer, and add a horizontal scrollbar
832         to the analysis results viewer instead of letting it expand beneath the commit log viewer.
833
834         * public/v3/pages/analysis-task-page.js:
835         (AnalysisTaskResultsPane.htmlTemplate):
836         (AnalysisTaskResultsPane.cssTemplate):
837
838 2017-05-24  Ryosuke Niwa  <rniwa@webkit.org>
839
840         Sycning script build fix after r217378.
841
842         * tools/sync-buildbot.js:
843         (syncLoop):
844
845 2017-05-23  Ryosuke Niwa  <rniwa@webkit.org>
846
847         Add the support for perf try bots to sync-buildbot.js
848         https://bugs.webkit.org/show_bug.cgi?id=172529
849
850         Rubber-stamped by Chris Dumez.
851
852         Make sync-buildbot.js schedule an A/B testing job with a patch or roots to buildbot.
853
854         Change the buildbot property format in the syncing script's configuration again to use a dictionary
855         with a single key of "revision", "patch", or "roots" to specify a revision, a patch, or a set of roots,
856         and simplified the structure of the configuration by always having "types" and "builders", and
857         make each entry in "configurations" refer to a list of types, platforms, and builders.
858
859         Since now there are build requests to build patches and run tests, "configurations" has been renamed to
860         "testConfigurations" and "buildConfigurations" have been added. Each entry in "buildConfigurations"
861         specifies a list of platforms and builders. Similarly in repository group configurations, the buildbot
862         properties for testing is now specified as "testProperties" and ones for building a patch is specified
863         in newly introduced "buildProperties".
864
865         * public/api/build-requests.php:
866         (update_builds): When a build request to build a patch fails, mark all subsequent requests as failed
867         since there is no way to run tests without a successful build.
868
869         * public/api/update-triggerable.php:
870         (main): Re-generate manifest.json after updating the triggerable. The lack of this re-generation was
871         the reason we had to manually GET /api/manifest in api-update-triggerable-tests.js.
872
873         * public/v3/models/build-request.js:
874         (BuildRequest.prototype.hasCompleted): Added.
875
876         * public/v3/models/manifest.js:
877         (Manifest.reset): Added. Extracted from MockData.resetV3Models in unit-tests/mock-data.js and
878         syncLoop in tools/sync-buildbot.js
879         (Manifest.fetch): Reset V3 models before fetching the manifest. This eliminates the need to manually
880         reset V3 models in syncLoop.
881
882         * public/v3/models/uploaded-file.js:
883         (UploadedFile.prototype.url): Use RemoteAPI.url to get the full URL instead of just a path.
884
885         * public/v3/remote.js:
886         (BrowserRemoteAPI.prototype.url): Added. Constructs the full URL.
887
888         * server-tests/api-update-triggerable-tests.js:
889         (.refetchManifest): Deleted. Now that /api/manifest re-generates manifest.json, we can simply call
890         Manifest.fetch instead.
891
892         * server-tests/resources/mock-data.js:
893         (MockData.resetV3Models): Calls Manifest.reset().
894         (MockData.addMockConfiguration): Extracted from addMockData.
895         (MockData.addMockData): Updated per the format change.
896         (MockData.mockTestSyncConfigWithSingleBuilder): Ditto.
897         (MockData.mockTestSyncConfigWithTwoBuilders): Ditto.
898         (MockData.runningBuild): Make buildNumber specifiable.
899         (MockData.finishedBuild): Ditto.
900
901         * server-tests/tools-buildbot-triggerable-tests.js: Updated configurations per the format change.
902         Now that now acceptsCustomRoots() for "system-and-webkit" must be true since we can't have a
903         repository group that which accepts a patch and not take roots.
904
905         * server-tests/tools-sync-buildbot-integration-tests.js: Added.
906         (createTriggerable): Added.
907         (createTestGroupWihPatch): Added.
908         (uploadRoot): Added.
909         (.assertAndResolveRequest): Added.
910         (.assertTestBuildHasFailed): Added.
911
912         * tools/js/buildbot-syncer.js:
913         (BuildbotSyncer): Added. _type as an instance variable to identify whether this buildbot builder
914         is a "builder" which builds a patch, builder, or a "tester" which runs a test. Also renamed
915         _testConfigurations to _configurations.
916         (BuildbotSyncer.prototype.addTestConfiguration): Assert that either the type of this syncer hasn't
917         been set or it's a tester.
918         (BuildbotSyncer.prototype.testConfigurations): Return [] when it's a builder.
919         (BuildbotSyncer.prototype.addBuildConfiguration): Added. Adds a platform to a builder.
920         (BuildbotSyncer.prototype.buildConfigurations): Added. Returns the list of configurations if this
921         syncer is a builder. Otherwise returns [].
922         (BuildbotSyncer.prototype.isTester): Added.
923         (BuildbotSyncer.prototype.matchesConfiguration):
924         (BuildbotSyncer.prototype._propertiesForBuildRequest): Updated to support the new format.
925         (BuildbotSyncer._loadConfig): Ditto. Optionally parse buildConfigurations.
926         (BuildbotSyncer._resolveBuildersWithPlatforms): Added. For each test or build configuration entry,
927         creates the list of configurations per builder and platform.
928         (BuildbotSyncer._parseRepositoryGroup): Added the support for parsing the new format with revision,
929         roots, and patch option types with a lot of validations as we're seeing a bit of combinatorial
930         explosion in the number of things that can go wrong. Also parse buildProperties optionally.
931         (BuildbotSyncer._parseRepositoryGroupPropertyTemplate): Added. A helper function to parse a set of
932         buildbot properties, validates its content, and invokes a callback if it's an dynamically resolved
933         type such as "revision" and "patch".
934         (BuildbotSyncer._validateAndMergeConfig): Updated per the format change. No longer allows "types",
935         "type", "platforms", and "platform" as they're explicity resolved in _resolveBuildersWithPlatforms.
936
937         * tools/js/buildbot-triggerable.js:
938         (BuildbotTriggerable.prototype.syncOnce):
939         (BuildbotTriggerable.prototype._validateRequests): Handle the case when a build request is not
940         associated with any test.
941         (BuildbotTriggerable.prototype._nextRequestInGroup): Return null when there is a build request to
942         build a patch which has not been completed (pending, scheduled, running, or failed). Since all
943         requests to build a patch has a negative order, those requests should all show up at the beginning.
944         (BuildbotTriggerable.prototype._scheduleRequestIfSlaveIsAvailable): Pick a new buildbot syncer when
945         scheduling the first request to build a patch or the first request to run a test. The first request
946         to run a test will always have order of 0, so it's a sufficient condition to find such a request.
947         On the other hand, the first request to build a patch can have a negative order number so we must
948         explicitly check if it's the first item in the ordered list of requests in the test group.
949
950         * tools/remote-server-relay.log: Added.
951
952         * tools/sync-buildbot.js:
953         (syncLoop): Fixed a bug we were not re-fetching the triggerable after updating the triggerable so
954         that Triggerable and related objects we have in the memory may not reflect what we just synced to
955         the perf dashboard. Also, we don't reset V3 models manually any more since Manifest.fetch does that.
956
957         * unit-tests/buildbot-syncer-tests.js: Added more test cases and updated existing test cases to test
958         exception messages explicitly since allowing any exception was resulting in some tests passing a
959         result of unrelated parsing error being thrown, etc...
960         (sampleiOSConfig): Updated per the format change.
961         (sampleiOSConfigWithExpansions): Ditto.
962         (smallConfiguration): Ditto.
963
964 2017-05-22  Dewei Zhu  <dewei_zhu@apple.com>
965
966         Fix the bug that sometimes analysis task results pane is missing.
967         https://bugs.webkit.org/show_bug.cgi?id=172404
968
969         Reviewed by Ryosuke Niwa.
970
971         AnalysisTaskPage._didFetchTask and AnalaysisTaskPage._fetchRelatedInfoForTaskId should be called in order.
972         The race between those two functions causes the analysis task results pane sometimes missing.
973
974         * public/v3/components/analysis-results-viewer.js:
975         (AnalysisResultsViewer.prototype.render): Fix the bug in r217173 that commitSet can be undefined.
976         * public/v3/pages/analysis-task-page.js:
977         (AnalysisTaskPage.prototype.updateFromSerializedState): Use arrow function to get rid of self variable.
978         Use `const` instead of var for constant variable. And call _didFetchTask before calling _fetchRelatedInfoForTaskId.
979         (AnalysisTaskPage.prototype._renderTaskNameAndStatus):
980         (AnalysisTaskPage.cssTemplate):
981
982 2017-05-19  Ryosuke Niwa  <rniwa@webkit.org>
983
984         Add a commit log viewer next to the analysis results viewer
985         https://bugs.webkit.org/show_bug.cgi?id=172399
986
987         Reviewed by Chris Dumez.
988
989         Add a commit log viewer next to the analysis results viewer, which visualizes the A/B testing results.
990
991         Also linkify the revisions in the table that shows the status of each A/B testing job,
992         and allow the prefix of "r" when associating a Subversion revision.
993
994         Finally, Fixed a bug that the list of commits associated with the analysis task were not re-rendered
995         when the list was updated by the user.
996
997         * public/v3/components/analysis-results-viewer.js:
998         (AnalysisResultsViewer): Added _selectorRadioButtonList as an instance variable. It's a list of radio
999         buttons to select a configuration (A/B) with a commit set. It's added to update the checked status of
1000         radio buttons upon changing the currently selected test group.
1001         (AnalysisResultsViewer.prototype.setTestGroups): Update the selected range to that of the currently
1002         selected group.
1003         (AnalysisResultsViewer.prototype.render): Fill _selectorRadioButtonList with radio buttons.
1004
1005         * public/v3/components/commit-log-viewer.js:
1006         (CommitLogViewer): Added _showRepositoryName as an instance variable.
1007         (CommitLogViewer.prototype.setShowRepositoryName): Added.
1008         (CommitLogViewer.prototype.render): Hide the repository name when _showRepositoryName is false. This
1009         is used in the newly added commit log viewer for the analysis results since we're showing a select
1010         element with all the names of repositories above this component.
1011
1012         * public/v3/components/test-group-revision-table.js:
1013         (TestGroupRevisionTable.prototype._buildCommitCell): Linkify the revisions if possible.
1014
1015         * public/v3/models/analysis-task.js:
1016         (AnalysisTask.prototype.associateCommit): Strip "r" at the beginning for a Subversion like r12345
1017         since that's the format we use to show to the user. This makes copy & paste easier.
1018
1019         * public/v3/pages/analysis-task-page.js:
1020         (AnalysisTaskResultsPane): Added a bunch of new instance variables to show and update the commit log
1021         viewer next to the analysis results viewer.
1022         (AnalysisTaskResultsPane.prototype.setPoints): Create the list of repositories to show details.
1023         (AnalysisTaskResultsPane.prototype.didConstructShadowTree): Re-render when the current selected test
1024         group changes since that may have updated the selected range for A/B testing. Also re-render when
1025         a new repository is selected to show details.
1026         (AnalysisTaskResultsPane.prototype.render): Update the list of repositories and the commit log viewer.
1027         (AnalysisTaskResultsPane.prototype._renderRepositoryList): Renders the list of repositories.
1028         (AnalysisTaskResultsPane.prototype._updateCommitViewer): Updates the commit log viewer given the range
1029         selected in the analysis results viewer.
1030         (AnalysisTaskResultsPane.htmlTemplate): Updated the template.
1031         (AnalysisTaskResultsPane.cssTemplate): Ditto.
1032         (AnalysisTaskTestGroupPane.cssTemplate): Add a little space between the list of results and the table
1033         of A/B testing jobs with revisions.
1034         (AnalysisTaskPage.prototype.render): Fixed the bug that the list of commits associated with the task
1035         is not updated when the list changes the task or the start point never changed when the list of commits
1036         associated with the task changed. Make the lazily evaluated function compare the actual list of commits
1037         so that it will invoke _renderCauseAndFixes when the list changes.
1038         (AnalysisTaskPage.prototype._renderCauseAndFixes): Now renders a specific list.
1039
1040 2017-05-16  Ryosuke Niwa  <rniwa@webkit.org>
1041
1042         Another build fix. Added a missing null check.
1043
1044         * public/v3/components/custom-analysis-task-configurator.js:
1045         (CustomAnalysisTaskConfigurator.prototype._setUploadedFilesIfEmpty):
1046
1047 2017-05-14  Ryosuke Niwa  <rniwa@webkit.org>
1048
1049         Build fix. Added a missing null check.
1050
1051         * public/v3/pages/analysis-task-page.js:
1052         (AnalysisTaskConfiguratorPane.prototype.setTestGroups):
1053
1054 2017-05-11  Ryosuke Niwa  <rniwa@webkit.org>
1055
1056         Remove the code for old syncing script configuration in BuildbotSyncer
1057         https://bugs.webkit.org/show_bug.cgi?id=171963
1058
1059         Reviewed by Chris Dumez.
1060
1061         Removed the code for specifying {"root": ~}, {"rootOptions": [~]}, and {"rootsExcluding": [~]} in buildbot
1062         properties in the syncing script's configurations since they are no longer used after r215061.
1063
1064         Also removed the support for using "arguments" as an alias to "properties", and updated the tests accordingly.
1065
1066         * tools/js/buildbot-syncer.js:
1067         (BuildbotSyncer._parseRepositoryGroup): Removed the unused code.
1068         (BuildbotSyncer._validateAndMergeConfig): Just allow string values in properties.
1069         (BuildbotSyncer._validateAndMergeProperties): Deleted.
1070
1071         * unit-tests/buildbot-syncer-tests.js:
1072         (sampleiOSConfig): Use "properties" instead of "arguments" to specify the buildbot properties.
1073         (sampleiOSConfigWithExpansions): Ditto.
1074
1075 2017-05-10  Ryosuke Niwa  <rniwa@webkit.org>
1076
1077         Another build fix after r215633 to make the bar graphs render even when the confidence intervals aren't available.
1078
1079         * public/v3/components/bar-graph-group.js:
1080         (BarGraphGroup.prototype._computeRange):
1081
1082 2017-05-10  Ryosuke Niwa  <rniwa@webkit.org>
1083
1084         Build fix after r215633.
1085
1086         * public/v3/models/test-group.js:
1087         (TestGroup.prototype._computeRequestedCommitSets):
1088         (TestGroup.prototype.requestsForCommitSet):
1089
1090 2017-05-10  Ryosuke Niwa  <rniwa@webkit.org>
1091
1092         Add API to upload a patched build for a custom A/B testing
1093         https://bugs.webkit.org/show_bug.cgi?id=171956
1094
1095         Reviewed by Chris Dumez.
1096
1097         Added /api/upload-root to upload a root file, the build product of a patch associated with a commit set.
1098
1099         Extracted more functions out of privileged-api/upload-file.php to uploaded-file-helpers.php to share code
1100         with /api/upload-root.php.
1101
1102         * public/api/upload-root.php: Added.
1103         (main):
1104         (compute_commit_set_items_to_update): Find the list of commit set items to associate this root with.
1105         A root can be associated with multiple repositories and there fore commit set items; e.g. if a software
1106         is built from multiple repositories and there is a patch associated with one of them, the built product
1107         must be associated with all those repositories.
1108
1109         * public/include/build-requests-fetcher.php:
1110         (BuildRequestsFetcher::fetch_commits_for_set_if_needed): Include the root file is there is one.
1111
1112         * public/include/json-header.php:
1113         (validate_arguments): Added the support for validating json string.
1114         (verify_slave): Return the slave ID found.
1115
1116         * public/include/uploaded-file-helpers.php:
1117         (validate_uploaded_file): Extracted from /privileged-api/upload-file to be shared with /api/upload-root.
1118         (query_total_file_size): Ditto.
1119         (create_uploaded_file_from_form_data): Ditto.
1120         (upload_file_in_transaction): Ditto. Takes a lambda to do the extra work inside the transaction.
1121
1122         * public/privileged-api/upload-file.php:
1123         (main):
1124
1125         * public/v3/models/build-request.js:
1126         (BuildRequest.constructBuildRequestsFromData): Resolve the rootFIle of each commit set item.
1127
1128         * public/v3/models/commit-set.js:
1129         (CommitSet): Added _repositoryToRootMap and _allRootFiles as instance variables.
1130         (CommitSet.prototype.updateSingleton): Added. Previously, each commit set's states never changed after
1131         its creation. After this patch, each item can be newly associated with a root so we must update its
1132         _repositoryToRootMap and _allRootFiles. For simplicity, we update all states.
1133         (CommitSet.prototype._updateFromObject): Extracted from the constructor.
1134         (CommitSet.prototype.allRootFiles): Added. Includes custom roots and roots created for patches.
1135         (CommitSet.prototype.rootForRepository): Added.
1136         (CommitSet.prototype.equals): Fixed the bug that we were comparing _repositoryToPatchMap to
1137         _repositoryToCommitMap, and added a check for _repositoryToRootMap.
1138
1139         * public/v3/models/test-group.js:
1140         (TestGroup.prototype.task): Added.
1141         (TestGroup.createWithTask):
1142         (TestGroup.createWithCustomConfiguration):
1143         (TestGroup.createAndRefetchTestGroups):
1144         (TestGroup._fetchTestGroupsForTask): Deleted. Now fetchForTask takes a boolean argument: ignoreCache.
1145         (TestGroup.findAllByTask): Added.
1146         (TestGroup.fetchForTask): Renamed from fetchByTask.
1147
1148         * public/v3/pages/analysis-task-page.js:
1149         (AnalysisTaskPage.prototype._fetchRelatedInfoForTaskId):
1150
1151         * server-tests/api-build-requests-tests.js:
1152
1153         * server-tests/api-upload-root-tests.js: Added. Added tests for /api/upload-root.
1154         (makeReport): Added.
1155         (addSlaveAndCreateRootFile): Added.
1156         (createTestGroupWihPatch): Added.
1157
1158         * server-tests/privileged-api-create-test-group-tests.js:
1159
1160         * server-tests/resources/mock-data.js:
1161         (MockData.sharedRepositoryId): Added.
1162         (MockData.addMockData): Added "Shared" repository along with commits.
1163
1164 2017-05-10  Ryosuke Niwa  <rniwa@webkit.org>
1165
1166         Rename server-tests/api-update-triggerable.js to server-tests/api-update-triggerable-tests.js
1167         https://bugs.webkit.org/show_bug.cgi?id=171905
1168
1169         Reviewed by Chris Dumez.
1170
1171         * server-tests/api-update-triggerable-tests.js: Renamed from server-tests/api-update-triggerable.js.
1172
1173 2017-04-30  Ryosuke Niwa  <rniwa@webkit.org>
1174
1175         Add the support for scheduling a A/B testing with a patch.
1176         https://bugs.webkit.org/show_bug.cgi?id=171209
1177
1178         Reviewed by Chris Dumez.
1179
1180         Added the support for creating a custom test group with a patch applied.
1181
1182         First, each repository in a repository group has a boolean indicating whether a given repository can have
1183         a patch applied or not. When any configuration in a test group contains a patch, we create build requests
1184         without a test specified in order to "build" those patches. These build requests have negative order numbers
1185         to differentiate them from regular build requests. We can't simply build ones with patches since there could
1186         be differences in SDK, build options, etc... when patches are applied.
1187
1188         The JSON format for commit sets returned by /api/build-requests have been changed from using an array of
1189         commit IDs to an array of dictionaries indicate commit and acceptsPatch boolean. /api/update-triggerable now
1190         uses a dictionary with two keys: repository and acceptsPatch to specify a set of repositories associated with
1191         a repository group, and /privileged-api-create-test-group uses a dictionary with two keys: revision and patch
1192         instead of a revision string to specify commit sets.
1193
1194         Furthermore, the syncing script's configuration have been updated to use a dictionary of repository names to
1195         an options dictionary instead of an array of repositories names. For now, the only supported option is
1196         acceptsPatch but will be extended when we add the support for rolling back system components.
1197         e.g. {"WebKit": {acceptsPatch: true}, "macOS": {}} instead of ["WebKit", "macOS"]
1198
1199         On the UI side, InstantFileUploader has been changed to accept only one file by default, and added a new method
1200         allowMultipleFiles() to allow multiple files to be selected for custom roots. Also replaced the input element
1201         with type=file by a button with a custom label to show labels such as "Apply a patch" or "Add a new root"
1202         instead of the generic label like "choose a file".
1203
1204
1205         * init-database.sql: Added trigrepo_accepts_patch to triggerable_repositories to indicate whether a given
1206         repository can have a patch applied or not. Made request_test optional in build_requests for when a build
1207         request is created to build patches. Such a build request have a negative request_order. Updated the related
1208         constraints accordingly.
1209
1210         * public/admin/triggerables.php: Added the support for updating whether a given repository can have a patch
1211         applied in each repository group. Only show the repositories in the repository group for this purpose since
1212         there is no way to accept a patch on a repository without it being a part of the group.
1213         (generate_repository_form): Now takes the markup for checkboxes instead of generating one itself.
1214         (generate_repository_checkboxes): Now takes an array of repositories to generate checkboxes. The checkbox is
1215         shown when the repository ID exists as a key in this array, and is checked when its value is true. The new
1216         capability to skip repositories not in the array is used to hide repositories not associated with the group
1217         in the list of checkboxes to indicate a repository accepts a patch.
1218
1219         * public/api/update-triggerable.php:
1220         (main): Now updates the description and acceptsRoots states of each repository group, and sets acceptsPatch
1221         boolean for each repository in the group if set in the update.
1222         (validate_repository_groups): Use a reference to $repository_groups in order to set repository_id_list, which
1223         contains an array of repository IDs to find the existing repository group that matches the set via
1224         RepositoryGroupFinder's find_by_repositories. Also added a various validations for acceptsRoots, a dictionary
1225         specifying repository and acceptsPatch.
1226
1227         * public/include/build-requests-fetcher.php:
1228         (BuildRequestsFetcher::fetch_commits_for_set_if_needed): Instead of returning an array of commit IDs as
1229         "commits", it now returns an array of dictionaries with "commit" and "patch" keys specifying the commit ID
1230         and the patch file's ID respectively as "revisionItems". 
1231         (BuildRequestsFetcher::add_uploaded_file): Added. Extracted from fetch_commits_for_set_if_needed. Used to
1232         add either a patch file or a custom root file in the list of uploaded files in the result.
1233
1234         * public/include/manifest-generator.php:
1235         (fetch_triggerables): Each element in repository group's "repositories" field is now an array of dictionaries
1236         with "repository" and "acceptsPatch" as keys.
1237
1238         * public/include/repository-group-finder.php:
1239         (RepositoryGroupFinder::__construct): Added a map for boolean indicating whether a given repository group
1240         allows a patch on a repository. Used in /privileged-api/create-test-group.
1241         (RepositoryGroupFinder::accepts_patch): Added.
1242         (RepositoryGroupFinder::populate_map): Build up the map for acceptsPatch boolean per repository per group.
1243
1244         * public/privileged-api/create-test-group.php:
1245         (main): Fixed a bug that we were not explicitly checking for a duplicate test group name (with a test). Create
1246         build requests to "build" patches if there is any patch file specified.
1247         (commit_sets_from_revision_sets): Updated to take a dictionary with "revision" and "patch" as keys to specify
1248         a revision and a patch if any instead of just a revision string for each repository. Also validate that each
1249         repository is allowed to have a patch once the repository group has been found for the set of repositories.
1250         (ensure_commit_sets):
1251
1252         * public/v3/components/custom-analysis-task-configurator.js:
1253         (CustomAnalysisTaskConfigurator): Added _patchUploaders as an instance variable, which is a dictionary of
1254         configuration names to a map of InstantFileUploader's used to upload a patch. Also renamed _fileUploaders to
1255         _customRootUploaders for clarity.
1256         (CustomAnalysisTaskConfigurator.prototype.setCommitSets):
1257         (CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree.createRootUploader): Added.
1258         (CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree):
1259         (CustomAnalysisTaskConfigurator.prototype._ensurePatchUploader): Added. Creates an instant file uploader for
1260         patches. We only allow a single patch per repository.
1261         (CustomAnalysisTaskConfigurator.prototype._computeCommitSet): Include a patch in the commit set as needed.
1262         (CustomAnalysisTaskConfigurator.prototype._buildRevisionTable): Show the patch file uploader for repositories
1263         which can have patches in the current repository group.
1264         (CustomAnalysisTaskConfigurator.cssTemplate): Show borders between every rows instead of just between tbody's
1265         now that each row can have a patch file uploader.
1266
1267         * public/v3/components/instant-file-uploader.js:
1268         (InstantFileUploader): Added _fileInput and _allowMultipleFiles as instance variables. We now show a button
1269         in the UI instead of an input with type=file. _fileInput is a hidden input with type=file used inside a click
1270         event of the button to let the user pick a file.
1271         (InstantFileUploader.prototype.allowMultipleFiles): Added. Allows this instance to accept multiple files.
1272         (InstantFileUploader.prototype.didConstructShadowTree): Synthetically click on the hidden input element when
1273         the newly added button element is clicked to open the browser's file picker.
1274         (InstantFileUploader.prototype.render): Hide the button to add a file if this instance can only select one file
1275         and there is already some file being uploaded in this instance.
1276         (InstantFileUploader.htmlTemplate): Replaced the input element with type=file with a button. Its label comes
1277         from the default slot content.
1278
1279         * public/v3/models/build-request.js:
1280         (BuildRequest): Made the test optional.
1281         (BuildRequest.prototype.isBuild): Returns true if this is a build request for building a patch.
1282         (BuildRequest.prototype.isTest): Returns true if this is a build request for running tests.
1283         (BuildRequest.constructBuildRequestsFromData): Create each commit log here instead of relying on CommitSet's
1284         constructor to construct its commit logs. Also updated per the replacement of an array of commit IDs by
1285         an array of dictionaries with commit and patch properties.
1286
1287         * public/v3/models/commit-set.js:
1288         (CommitSet): Made _repositoryToCommitMap a real Map object. Also added _repositoryToPatchMap. Also got rid of
1289         the code to instantiate commit logs since that's now done in BuildRequest.constructBuildRequestsFromData.
1290         (CommitSet.prototype.commitForRepository):
1291         (CommitSet.prototype.revisionForRepository):
1292         (CommitSet.prototype.patchForRepository): Added.
1293         (CommitSet.prototype.latestCommitTime): Modernized the code.
1294         (CommitSet.prototype.equals): Modernized the code. Also added the check for patches.
1295         (MeasurementCommitSet): Updated per the change to make _repositoryToCommitMap a real Map.
1296         (CustomCommitSet.prototype.setRevisionForRepository):
1297         (CustomCommitSet.prototype.equals): Added the check for patches.
1298         (CustomCommitSet.prototype.revisionForRepository):
1299         (CustomCommitSet.prototype.patchForRepository): Added.
1300
1301         * public/v3/models/manifest.js:
1302         (Manifest._didFetchManifest): Updated per the replacement of an array of commit IDs by an array of dictionaries
1303         with commit and patch properties.
1304
1305         * public/v3/models/repository.js:
1306         (Repository.prototype.ownerId): Renamed from owner for clarity.
1307
1308         * public/v3/models/test-group.js:
1309         (TestGroup): Modernized the code by using LazilyEvaluatedFunction. Removed _requestsAreInOrder since it's not
1310         necessary anymore with LazilyEvaluatedFunction.
1311         (TestGroup.prototype.addBuildRequest):
1312         (TestGroup.prototype.test): Use the last build request's test since the first few requests could be requests to
1313         build patches.
1314         (TestGroup.prototype.platform): Ditto.
1315         (TestGroup.prototype._lastRequest): Added.
1316         (TestGroup.prototype._orderedBuildRequests): Added.
1317         (TestGroup.prototype.repetitionCount): Only count the build requests for testing (skipping any requests to
1318         build patches).
1319         (TestGroup.prototype.requestedCommitSets): Simply call _computeRequestedCommitSetsLazily.
1320         (TestGroup.prototype._computeRequestedCommitSets): Extracted from requestedCommitSets.
1321         (TestGroup.prototype.requestsForCommitSet):
1322         (TestGroup.prototype.labelForCommitSet): Rewritten. Just compute the label here instead of relying on
1323         _commitSetToLabel since requestedSets is always of the length two at the moment.
1324         (TestGroup._revisionSetsFromCommitSets): Specify both the revision and the patch in the revision set.        
1325
1326         * public/v3/models/triggerable.js:
1327         (TriggerableRepositoryGroup): Added _patchAcceptingSet as an instance variable. Use
1328         sortByNamePreferringOnesWithURL to sort repositories instead of simple sortByName.
1329         (TriggerableRepositoryGroup.prototype.accepts): Added checks for the custom roots and patches.
1330         (TriggerableRepositoryGroup.prototype.acceptsPatchForRepository): Added.
1331
1332         * server-tests/api-build-requests-tests.js: Updated the test cases per the replacement of an array of commit
1333         IDs by an array of dictionaries with commit and patch properties.
1334
1335         * server-tests/api-manifest-tests.js: Updated the test case per the name of Repository's owner to ownerId.
1336
1337         * server-tests/api-update-triggerable.js: Updated the test case per the name of Repository's owner to ownerId,
1338         and added a test case for updating whether a given repository group allows custom roots as well as patches
1339         on repositories via /api/update-triggerable. 
1340         (.updateWithOSXRepositoryGroup): Updated the sample syncing script configuration per the format change.
1341         (.refetchManifest): Added.
1342
1343         * server-tests/privileged-api-create-test-group-tests.js: Updated per the syncing script configuration format
1344         change. Also added a test for creating a test group with a duplicate name, which is expected to fail with 
1345         DuplicateTestGroupName, and creating a test group with a patch both when it's allowed and when it's not allowed
1346         in the matching repository group.
1347         (.addTriggerableAndCreateTask): Updated per the format change.
1348
1349         * server-tests/resources/mock-data.js:
1350         (MockData.addEmptyTriggerable): Added a metric and its configuration to make it appear in the manifest file.
1351         The new test case in api-update-triggerable.js requires this.
1352         (MockData.mockTestSyncConfigWithSingleBuilder): Updated per the syncing script configuration format change.
1353         (MockData.mockTestSyncConfigWithTwoBuilders): Ditto.
1354
1355         * server-tests/tools-buildbot-triggerable-tests.js: Removed the useless assertions about test configurations,
1356         and added assertions about custom roots and patches in the test case for updateTriggerables.
1357
1358         * tools/js/buildbot-syncer.js:
1359         (BuildbotSyncer._parseRepositoryGroup): Made each assertion explicitly refer to the specific repository group
1360         to make it more user friendly. Now each repository group uses a dictionary of repository names to its options
1361         in the syncing script configurations. When parsed, we insert it as an array of dictionaries with repository ID
1362         and acceptsPatch boolean specified separately since this is the format /api/update-triggerable expects.
1363
1364         * tools/js/buildbot-triggerable.js:
1365         (BuildbotTriggerable.prototype.updateTriggerable):
1366
1367         * unit-tests/build-request-tests.js:
1368         (sampleBuildRequestData): Updated per the commit sets format change in /api/build-requests.
1369
1370         * unit-tests/buildbot-syncer-tests.js: Updated the existing tests per various format changes and added a couple
1371         of new test cases for the syncing script's configuration validation.
1372         (sampleiOSConfig):
1373         (smallConfiguration):
1374         (createSampleBuildRequest):
1375
1376         * unit-tests/resources/mock-v3-models.js:
1377         (MockModels.inject): Updated per the repository group format change.
1378
1379         * unit-tests/test-groups-tests.js:
1380         (sampleTestGroup): Updated per the commit sets format change in /api/build-requests. 
1381
1382 2017-04-21  Ryosuke Niwa  <rniwa@webkit.org>
1383
1384         Rename commit_set_relationships to commit_set_items
1385         https://bugs.webkit.org/show_bug.cgi?id=171143
1386
1387         Reviewed by Joseph Pecoraro.
1388
1389         Renamed commit_set_relationships to commit_set_items. Also added commitset_patch_file in the preparation to add
1390         the support for applying patches in custom test groups. To migrate an existing database, run:
1391
1392         ```sql
1393         BEGIN;
1394         ALTER TABLE commit_set_relationships RENAME TO commit_set_items;
1395         ALTER TABLE commit_set_items ADD COLUMN commitset_patch_file integer REFERENCES uploaded_files;
1396         ALTER TABLE commit_set_items ADD CONSTRAINT commitset_with_patch_must_have_commit
1397             CHECK (commitset_patch_file IS NULL OR commitset_commit IS NOT NULL);
1398         END;
1399         ```
1400
1401         * init-database.sql:
1402         * public/include/build-requests-fetcher.php:
1403         * public/privileged-api/create-test-group.php:
1404         * server-tests/resources/mock-data.js:
1405         (MockData.addMockData):
1406         (MockData.addMockTestGroupWithGitWebKit):
1407         * tools/js/database.js:
1408
1409 2017-04-21  Ryosuke Niwa  <rniwa@webkit.org>
1410
1411         Add the support for creating a custom test group in the analysis task page
1412
1413         Make it possible to create more custom test groups in the analysis task page
1414         https://bugs.webkit.org/show_bug.cgi?id=171138
1415
1416         Rubber-stamped by Chris Dumez.
1417
1418         Extracted CustomConfigurationTestGroupForm out of CreateAnalysisTaskPage and added it to AnalysisTaskPage inside
1419         AnalysisTaskConfiguratorPane. This allows configuration of a new test group within a custom analysis task.
1420
1421         * public/privileged-api/create-test-group.php:
1422         (main): Fixed the bug that the triggerable wasn't resolved when creating a test group in a custom analysis task.
1423
1424         * public/v3/components/custom-analysis-task-configurator.js:
1425         (CustomAnalysisTaskConfigurator.prototype.selectTests): Added. Used by CustomConfigurationTestGroupForm's
1426         setConfigurations.
1427         (CustomAnalysisTaskConfigurator.prototype.selectPlatform): Ditto.
1428         (CustomAnalysisTaskConfigurator.prototype.setCommitSets): Ditto. 
1429         (CustomAnalysisTaskConfigurator.prototype._setUploadedFilesIfEmpty): Added.
1430         (CustomAnalysisTaskConfigurator.prototype._revisionMapFromCommitSet): Added.
1431         (CustomAnalysisTaskConfigurator.prototype.render): Update the currently selected platforms and tests now that
1432         they can be set externally via selectTests and selectPlatform.
1433         (CustomAnalysisTaskConfigurator.prototype._renderTriggerableTests): Return the result of _renderRadioButtonList
1434         so that the caller can update the currently selected tests without having to reconstruct the list.
1435         (CustomAnalysisTaskConfigurator.prototype._renderTriggerablePlatforms): Ditto.
1436         (CustomAnalysisTaskConfigurator.prototype._renderRadioButtonList): Renamed from _buildCheckboxList. Now returns
1437         a function which updates the currently selected items. We still pretend that multiple items can be selected to
1438         make it future-proof.
1439
1440         * public/v3/components/custom-configuration-test-group-form.js: Added.
1441         (CustomConfigurationTestGroupForm): Added. Inherits from TestGroupForm. Extracted from CreateAnalysisTaskPage.
1442         (CustomConfigurationTestGroupForm.prototype.setHasTask): Added.
1443         (CustomConfigurationTestGroupForm.prototype.hasCommitSets): Added.
1444         (CustomConfigurationTestGroupForm.prototype.setConfigurations): Added. Used by AnalysisTaskConfiguratorPane to
1445         set the default configuration to what the latest test group used.
1446         (CustomConfigurationTestGroupForm.prototype.startTesting): Added. Dispatches "startTesting" action with
1447         platform, test, taskName in addition to what CustomizedTestGroupForm emits.
1448         (CustomConfigurationTestGroupForm.prototype.didConstructShadowTree): Added.
1449         (CustomConfigurationTestGroupForm.prototype.render): Added.
1450         (CustomConfigurationTestGroupForm.prototype._updateTestGroupName): Added.
1451         (CustomConfigurationTestGroupForm.cssTemplate): Added.
1452         (CustomConfigurationTestGroupForm.htmlTemplate): Added.
1453
1454         * public/v3/components/test-group-form.js:
1455         (TestGroupForm.cssTemplate): Make the form display: block.
1456
1457         * public/v3/index.html:
1458
1459         * public/v3/models/test-group.js:
1460         (TestGroup.prototype.test): Added.
1461         (TestGroup.prototype.platform): Added.
1462         (TestGroup.createWithCustomConfiguration): Added. Creates a custom test group with an existing analysis task.
1463
1464         * public/v3/models/uploaded-file.js:
1465         (UploadedFile): Fixed a bug that _deletedAt was set to a Date object even when object.deletedAt is null.
1466
1467         * public/v3/pages/analysis-task-page.js:
1468         (AnalysisTaskConfiguratorPane): Added.
1469         (AnalysisTaskConfiguratorPane.prototype.didConstructShadowTree): Added. Dispatch createCustomTestGroup action
1470         in turn when receiving startTesting from CustomConfigurationTestGroupForm.
1471         (AnalysisTaskConfiguratorPane.prototype.setTestGroups): Added.
1472         (AnalysisTaskConfiguratorPane.prototype.render): Added.
1473         (AnalysisTaskConfiguratorPane.htmlTemplate): Added. We override this instead of formContent to display the
1474         "Start" button at the end instead of at the beginnning.
1475         (AnalysisTaskConfiguratorPane.cssTemplate): Added.
1476         (AnalysisTaskPage.prototype.didConstructShadowTree): Listen to createCustomTestGroup.
1477         (AnalysisTaskPage.prototype.render): Hide AnalysisTaskConfiguratorPane when the analysis task is not custom.
1478         (AnalysisTaskPage.prototype._showTestGroup): Let AnalysisTaskConfiguratorPane know of the current test group
1479         so that it can update the default configuration if the user hasn't modified yet.
1480         (AnalysisTaskPage.prototype._createCustomTestGroup): Added. 
1481
1482         * public/v3/pages/create-analysis-task-page.js:
1483         (CreateAnalysisTaskPage.prototype.didConstructShadowTree):
1484         (CreateAnalysisTaskPage.prototype._createAnalysisTaskWithGroup):
1485         (CreateAnalysisTaskPage.prototype.render):
1486         (CreateAnalysisTaskPage.prototype._renderMessage):
1487         (CreateAnalysisTaskPage.htmlTemplate):
1488         (CreateAnalysisTaskPage.cssTemplate):
1489
1490         * server-tests/privileged-api-create-test-group-tests.js: Added a test case for creating a custom test group for
1491         an existing analysis task.
1492
1493         * server-tests/resources/mock-data.js:
1494         (MockData.otherPlatformId): Added.
1495         (MockData.addMockData): Added a test configuration for otherPlatformId.
1496
1497 2017-04-21  Ryosuke Niwa  <rniwa@webkit.org>
1498
1499         Make it possible to view results for sub tests and metrics in A/B testing
1500         https://bugs.webkit.org/show_bug.cgi?id=170975
1501
1502         Reviewed by Chris Dumez.
1503
1504         Replaced TestGroupResultsTable, which was a single table that presented the test results with a set of revisions
1505         each build request used, with TestGroupResultsViewer and TestGroupRevisionTable. TestGroupResultsViewer provides
1506         an UI to look the results of sub-tests and sub-metrics and TestGroupRevisionTable provides an UI to display
1507         the set of revisions each build request used. TestGroupRevisionTable can also show the list of custom roots now
1508         that we've added UI to schedule an analysis task with a custom test group.
1509
1510         This patch extends BarGraphGroup to show multiple bars per SingleBarGraph using a canvas with bars indicating
1511         their mean and confidence interval.
1512
1513         * browser-tests/index.html:
1514         (ChartTest.importChartScripts): Include lazily-evaluated-function.js now that Test model object uses
1515         LazilyEvaluatedFunction.
1516
1517         * public/v3/components/analysis-results-viewer.js:
1518         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._valuesForCommitSet):
1519         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
1520
1521         * public/v3/components/bar-graph-group.js:
1522         (BarGraphGroup): No longer takes formatter. Added _computeRangeLazily and _showLabels as instance variables.
1523         (BarGraphGroup.prototype.addBar): Now takes a list of values, their labels, mean, confidence interval, and
1524         the colors of bar graphs shown for each value and the mean indicator.
1525         (BarGraphGroup.prototype.showLabels): Added.
1526         (BarGraphGroup.prototype.setShowLabels): Added.
1527         (BarGraphGroup.prototype.range): Added.
1528         (BarGraphGroup.prototype._computeRange): Renamed from updateGroupRendering. Now returns the range instead off
1529         setting it to each bar, and each SingleBarGraph's render function uses the value via BarGraphGroup's range.
1530         (BarGraph): Renamed from SingleBarGraph. Added various arguments introduced in addBar, and now stores various
1531         lazily evaluated functions used for rendering.
1532         (BarGraph.prototype.render): Rewritten to use canvas to draw bar graphs and show a label when group's
1533         showLabels() returns true.
1534         (BarGraph.prototype._resizeCanvas): Added.
1535         (BarGraph.prototype._renderCanvas): Added.
1536         (BarGraph.prototype._renderLabels): Added. We align the top of each label to the middle of each bar and shift it
1537         back up by half the height of the label (0.4rem) using margin-top in css.
1538         (BarGraph.htmlTemplate): Uses a canvas now.
1539         (BarGraph.cssTemplate):
1540
1541         * public/v3/components/results-table.js:
1542         (ResultsTable.prototype.renderTable): Updated per code changes to BarGraphGroup.
1543         (ResultsTableRow.prototype.resultContent): Ditto.
1544
1545         * public/v3/components/test-group-results-table.js: Removed.
1546         * public/v3/components/test-group-results-viewer.js: Added.
1547         (TestGroupResultsViewer): Added. Shows a list of test results with bar graphs with mean and confidence interval
1548         indicators. The results of sub tests and metrics can be expanded via "(Breakdown)" link shown below each test. 
1549         (TestGroupResultsViewer.prototype.setTestGroup): Added.
1550         (TestGroupResultsViewer.prototype.setAnalysisResults): Added.
1551         (TestGroupResultsViewer.prototype.render): Added.
1552         (TestGroupResultsViewer.prototype._renderResultsTable): Compute the depth of the test tree we show, and construct
1553         the header rows. Each sub test is "indented" by a new column.
1554         (TestGroupResultsViewer.prototype._buildRowForTest): Added. Build rows for metrics of the given test. Expand the
1555         list of its child tests if it's in expandedTests. Otherwise add a link to "Breakdown" if it has any child tests.
1556         (TestGroupResultsViewer.prototype._buildRowForMetric): Added. Builds rows of table cells to show the results for
1557         the given metric for each configuration.
1558         (TestGroupResultsViewer.prototype._buildRowForMetric.createConfigurationRow): Added. A helper to build cells for
1559         a given configuration represented by a requested commit set.
1560         (TestGroupResultsViewer.prototype._buildValueMap): Added. Creates a mappting between a requested commit set, and
1561         the list of values, mean, etc... associated with the results for the commit set.
1562         (TestGroupResultsViewer.prototype._buildEmptyCells): Added. A helper to create empty cells to indent sub tests.
1563         (TestGroupResultsViewer.prototype._expandCurrentMetrics): Added. Highlights the current metrics and renders the
1564         label for each bar in the results.
1565         (TestGroupResultsViewer.htmlTemplate): Added.
1566         (TestGroupResultsViewer.cssTemplate): Added.
1567
1568         * public/v3/components/test-group-revision-table.js: Added.
1569         (TestGroupRevisionTable): Added. Renders the list of revisions requested for each test configuration as well as
1570         ones used in actual testing, and additional repositories being reported (e.g. repositories for helper scripts).
1571         (TestGroupRevisionTable.prototype.setTestGroup): Added.
1572         (TestGroupRevisionTable.prototype.setAnalysisResults): Added.
1573         (TestGroupRevisionTable.prototype.render): Added.
1574         (TestGroupRevisionTable.prototype._renderTable): Added. The basic algorithm here is to first create a row entry
1575         object for each build request, merge cells that use the same revision of the same repository, and then render
1576         the entire table.
1577         (TestGroupRevisionTable.prototype._buildCommitCell): Added.
1578         (TestGroupRevisionTable.prototype._buildCustomRootsCell): Added.
1579         (TestGroupRevisionTable.prototype._mergeCellsWithSameCommitsAcrossRows): Added. Compute rowspan for each cell
1580         by traversing the rows that use the same revision per repository, and store it in rowCountByRepository while
1581         adding the repository to each succeeding row's repositoriesToSkip.
1582         (TestGroupRevisionTable.htmlTemplate): Added.
1583         (TestGroupRevisionTable.cssTemplate): Added.
1584
1585         * public/v3/index.html:
1586         * public/v3/models/analysis-results.js:
1587         (AnalysisResults): Added _metricIds and _lazilyComputedHighestTests as instance variables.
1588         (AnalysisResults.prototype.findResult): Renamed from find.
1589         (AnalysisResults.prototype.highestTests): Added.
1590         (AnalysisResults.prototype._computeHighestTests): Added. Finds the root tests for this analysis result.
1591         (AnalysisResults.prototype.add): Update _metricIds.
1592         (AnalysisResults.prototype.commitSetForRequest): Added. Returns the reported commit set for the build request.
1593         This commit set contains the set of revisions reported to /api/report by A/B testers.
1594         (AnalysisResultsView.prototype.resultForRequest): Renamed from resultForBuildId.
1595
1596         * public/v3/models/metric.js:
1597         (Metric.prototype.relativeName): Added. Computes the relative name given the test/metric path. This function is
1598         used to determine the label for each test/metric in TestGroupResultsViewer.
1599         (Metric.prototype.aggregatorLabel): Extracted from label.
1600         (Metric.prototype.label):
1601         (Metric.makeFormatter): Added the default value of false to alwaysShowSign.
1602
1603         * public/v3/models/test-group.js:
1604         (TestGroup.prototype.compareTestResults): Now takes a metric instead of retrieving it from the analysis task
1605         since a custom analysis task may not have a metric associated with it.
1606
1607         * public/v3/models/test.js:
1608         (Test): Added _computePathLazily as an instance variable.
1609         (Test.prototype.path): Lazily computes the path now that this function can be called on the same test for many
1610         times in TestGroupResultsViewer while computing relative names of tests and metrics.
1611         (Test.prototype._computePath): Extracted path.
1612         (Test.prototype.fullName): Modernized the code.
1613         (Test.prototype.relativeName): Added.
1614
1615         * public/v3/models/uploaded-file.js:
1616         (UploadedFile):
1617         (UploadedFile.prototype.deletedAt): Added.
1618         (UploadedFile.prototype.label): Added.
1619         (UploadedFile.prototype.url): Added.
1620
1621         * public/v3/pages/analysis-task-page.js:
1622         (AnalysisTaskTestGroupPane.prototype.setTestGroups):
1623         (AnalysisTaskTestGroupPane.prototype.setAnalysisResults): Replaced setAnalysisResultsView. Now takes an
1624         analysisResults instead of its view.
1625         (AnalysisTaskTestGroupPane.prototype.render): No longer enqueues the results table and the retry form to render
1626         since the results table no longer exists, and the retry form re-renders itself as needed.
1627         (AnalysisTaskTestGroupPane.htmlTemplate): Now uses test-group-results-viewer and test-group-revision-table
1628         instead of test-group-results-table, which has been removed.
1629         (AnalysisTaskTestGroupPane.cssTemplate):
1630         (AnalysisTaskPage.prototype._assignTestResultsIfPossible):
1631
1632         * public/v3/pages/create-analysis-task-page.js:
1633         (CreateAnalysisTaskPage.prototype._createAnalysisTaskWithGroup): Removed superflous console.log's.
1634
1635         * tools/js/v3-models.js: Import LazilyEvaluatedFunction now that it's used in the Test model.
1636
1637         * unit-tests/test-model-tests.js: Added.
1638
1639 2017-04-19  Ryosuke Niwa  <rniwa@webkit.org>
1640
1641         Another build fix after r215061. Clear TriggerableRepositoryGroup's static map in each iteration.
1642
1643         * tools/sync-buildbot.js:
1644         (syncLoop):
1645
1646 2017-04-18  Ryosuke Niwa  <rniwa@webkit.org>
1647
1648         Build fix after r215061.
1649
1650         There was a mismatch between the format updateTriggerable and /api/update-triggerable were using.
1651         Namely, each repository group was assumed to contain a name field in /api/update-triggerable
1652         but updateTriggerable was not including that at all.
1653
1654         We didn't catch this because the test for updateTriggerable also used the wrong format :(
1655
1656         * server-tests/tools-buildbot-triggerable-tests.js:
1657         * tools/js/buildbot-triggerable.js:
1658         (BuildbotTriggerable.prototype.updateTriggerable):
1659
1660 2017-04-14  Dewei Zhu  <dewei_zhu@apple.com>
1661
1662         Add sub-commit UI in commit log viewer.
1663         https://bugs.webkit.org/show_bug.cgi?id=170379
1664
1665         Reviewed by Ryosuke Niwa.
1666
1667         Add an API to return sub-commits for a given commit.
1668         Add sub-commit difference viewer into commit log viewer to show changed sub-commits between two commits.
1669         Add 'ownsSubCommits' info in 'api/commits' return values.
1670         Extend 'api/manifest' to include whether a repositories owns other repositories.
1671         Only show this sub-commit difference viewer when a repository owns other repositories and both commits owns sub-commits.
1672         Add unit tests for those new features.
1673
1674         * browser-tests/commit-log-viewer-tests.js: Updated test cases.
1675         * public/api/commits.php: Added 'sub-commits' to provide sub-commit for a given commit.
1676         * public/include/commit-log-fetcher.php: Added function to query sub-commit from database. Added 'repository' and 'ownsSubCommits' fields in returning commits.
1677         * public/v3/components/expand-collapse-button.js: Added.
1678         (ExpandCollapseButton):
1679         (ExpandCollapseButton.prototype.didConstructShadowTree): Changes state on click and dispatches 'toggle' event.
1680         (ExpandCollapseButton.sizeFactor):
1681         (ExpandCollapseButton.buttonContent):
1682         (ExpandCollapseButton.cssTemplate):
1683         * public/v3/components/commit-log-viewer.js:
1684         (CommitLogViewer.prototype._renderCommitList): Added sub-commit viewer if two adjacent commits both have sub-commits.
1685         (CommitLogViewer.cssTemplate):
1686         * public/v3/components/sub-commit-viewer.js: Added.
1687         (SubCommitViewer): Added 'SubCommitViewer' class to represent the sub-commit differences between two given commits.`
1688         (SubCommitViewer.prototype.didConstructShadowTree): Makes 'expand-collapse' button listen to 'toggle' event.
1689         (SubCommitViewer.prototype._toggleVisibility): Updates UI once 'expand-collapse' button is clicked.
1690         (SubCommitViewer.prototype.render): Render sub-commit view based on the state.
1691         (SubCommitViewer.prototype._renderSubcommitTable): Generates sub-commits difference table entries.
1692         (SubCommitViewer.htmlTemplate):
1693         (SubCommitViewer.cssTemplate):
1694         * public/v3/index.html: Added 'sub-commit-viewer.js' and 'expand-collapse-button.js'.
1695         * public/v3/models/commit-log.js:
1696         (CommitLog): Added '_subCommits'.
1697         (CommitLog.prototype.updateSingleton): Updates 'rawData.ownsSubCommits' as well.
1698         (CommitLog.prototype.ownsSubCommits):
1699         (CommitLog.prototype.subCommits): Added. Returns sub-commits.
1700         (CommitLog.prototype.fetchSubCommits): Added. Fetches sub-commits if haven't fetched them before.
1701         (CommitLog.prototype._buildSubCommitMap): Added. Creates a map which maps repositories to commits.
1702         (CommitLog.diffSubCommits): Added. Finds difference between two given commits.
1703         (CommitLog.fetchBetweenRevisions): Updated due to '_constructFromRawData' change.
1704         (CommitLog.fetchForSingleRevision): Updated due to '_constructFromRawData' change.
1705         (CommitLog._constructFromRawData): Removed first argument 'repository' as it can be determined by calling 'Repository.findById'.
1706         * public/v3/models/repository.js:
1707         (Repository):
1708         (Repository.prototype.owner): Returns the owner id.
1709         (Repository.prototype.ownedRepositories): Returns a list of repositories owned by this repository.
1710         * server-tests/api-commits-tests.js: Added tests for 'sub-commits' filter.
1711         * server-tests/api-manifest-tests.js: Added a test.
1712         * unit-tests/commit-log-tests.js: Added tests for 'fetchSubCommits' and 'diffSubCommits'.
1713         * unit-tests/resources/mock-v3-models.js: Added 'ownerRepository' and 'ownedRepository'.
1714
1715 2017-04-11  Ryosuke Niwa  <rniwa@webkit.org>
1716
1717         Retrying an A/B testing does not set the repetition count in some cases
1718         https://bugs.webkit.org/show_bug.cgi?id=170695
1719
1720         Reviewed by Joseph Pecoraro.
1721
1722         When selecting an existing A/B test group, the analysis task page automatically sets the repetition count
1723         of its retry to be that of the original test group. However, this information wasn't being passed correctly
1724         to the code that actually created a test group. As a result, the retried test group's repetition count does
1725         not match that of the original group or the number shown to the user on UI.
1726
1727         Fixed the bug by updating this._repetitionCount in setRepetitionCount.
1728
1729         * browser-tests/index.html:
1730         * browser-tests/test-group-form-tests.js: Added. Added tests.
1731         (.createTestGroupFormWithContext): Added.
1732         * public/v3/components/test-group-form.js:
1733         (TestGroupForm.prototype.setRepetitionCount):
1734         (TestGroupForm.formContent):
1735         (TestGroupForm):
1736
1737 2017-04-10  Ryosuke Niwa  <rniwa@webkit.org>
1738
1739         Add the UI for scheduling a A/B testing with a custom root
1740         https://bugs.webkit.org/show_bug.cgi?id=170622
1741
1742         Reviewed by Anders Carlsson.
1743
1744         This patch adds the support for creating a new analysis task with a custom darwinup roots. A follow up patch
1745         would update the syncing script to schedule such an A/B testing job to a buildbot instance.
1746
1747
1748         * ReadMe.md: Updated instructions for backing up and restoring the database so that it's easier to replace
1749         the file path for the backup.
1750
1751         * init-database.sql: Make task_platform and task_metric optional in each analysis task. Also added a column
1752         to store the root file in commit_set_relationships.
1753
1754         * public/api/build-requests.php:
1755         (main): Include the uploaded files.
1756
1757         * public/api/commits.php:
1758         (main): Added the support for querying the latest commits for a given platform. This is used in a new page
1759         to create a custom analysis task to autofill the latest revisions for a given platform.
1760
1761         * public/api/test-groups.php:
1762         (main): Include the uploaded files.
1763
1764         * public/include/build-requests-fetcher.php:
1765         (BuildRequestsFetcher::__construct): Added a list of uploaded_files and a map from its id.
1766         (BuildRequestsFetcher::uploaded_files): Added.
1767         (BuildRequestsFetcher::fetch_commits_for_set_if_needed): Added the support for including custom roots' id in
1768         each commit set, and inserting its meta data in the list of uplaoded files.
1769
1770         * public/include/commit-log-fetcher.php:
1771         (CommitLogFetcher::fetch_latest_for_platform): Added. Finds the latest commit for a given platform. Ideally,
1772         we should be finding the latest commit for a given platform, but this is very slow so instead find the commit
1773         of the latest build for a given platform.
1774
1775         * public/privileged-api/create-test-group.php:
1776         (main): Added the support for creating an analysis task along with a group.
1777         (commit_sets_from_revision_sets): Added the support for custom roots. Verify the specified uploaded file exists
1778         and include it in commit_set_relationships. Because commits and upload files are stored in a different column
1779         in commit_set_relationships, this function now stores the information for each row of commit_set_relationships
1780         except the commit set ID, which is unknown until the set is created, instead of a commit ID.
1781         (ensure_commit_sets): Made the each entry in a commit set a row instead of a commit ID as done. As this format
1782         is only by v2 UI and detect-changes.js, we don't add the support for specifying custom roots here.
1783
1784         * public/privileged-api/upload-file.php:
1785         (main): Fixed a typo. Also added one more error check.
1786
1787         * public/v3/components/custom-analysis-task-configurator.js: Added. The UI for selecting a test, a platform,
1788         and a set of revisions, as well as custom roots for a custom A/B testing job. The first set of revision with
1789         custom roots is referred as "baseline", and the second configuration is referred as "comparison" in this class.
1790         (CustomAnalysisTaskConfigurator):
1791         (CustomAnalysisTaskConfigurator.prototype.tests): Added.
1792         (CustomAnalysisTaskConfigurator.prototype.platform): Added.
1793         (CustomAnalysisTaskConfigurator.prototype.commitSets): Added. Returns a pair of baseline and comparsion if both
1794         have been configured by the user.
1795         (CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree): Added.
1796         (CustomAnalysisTaskConfigurator.prototype._configureComparison): Added. Called when the user is to configu the
1797         "comparison" configuration.
1798         (CustomAnalysisTaskConfigurator.prototype.render): Added.
1799         (CustomAnalysisTaskConfigurator.prototype._renderTriggerableTests): Added. Renders the list of top-level tests
1800         that can be scheduled by a triggerable.
1801         (CustomAnalysisTaskConfigurator.prototype._renderTriggerablePlatforms): Added. Renders the list of platforms
1802         that can be schedule with the currently selected list of tests by a triggerable. Note that the current UI only
1803         lets the user select a single test but the intent is to allow multiple tests to be selected in the near future.
1804         (CustomAnalysisTaskConfigurator.prototype._buildCheckboxList): Added. Creates a list of radio boxes to select
1805         an item with a callback for each. It automatically sets "selected" class on the selected item. It's used to
1806         render both the list of tests and platforms.
1807         (CustomAnalysisTaskConfigurator.prototype._updateTriggerable): Added. Finds the triggerable for a given list of
1808         tests and platforms. Returns an error when some tests belong to another triggearalbe.
1809         (CustomAnalysisTaskConfigurator.prototype._updateRepositoryGroups): Added. Finds a repository group to use when
1810         the current triggerable has changed. We try to use the repository group of the same name if there is any, and
1811         defaults to the first repository group if there is none. This allows the set of repositories to be specified to
1812         more or less persist across different triggerables. For example, if iOS platforms and Mac platforms use two
1813         distinct triggerables , and both triggerables have two repository groups: one that only specify the OS and the
1814         other that specifies both teh OS and WebKit revision, then this code allows the choice the user had made to
1815         specify either just the OS or the OS and WebKit will be preserved when the user switches from an iOS platform
1816         to a Mac platform.
1817         (CustomAnalysisTaskConfigurator.prototype._updateCommitSetMap): Added. Create a commit set map, the format that
1818         TestGroup.createWithTask accepts given "baseline" and "comparison" commit sets. Pretend "comparison" is not set
1819         if two sets are identical since it makes no sense to schedule an A/B testing job when A and B are identical.
1820         (CustomAnalysisTaskConfigurator.prototype._computeCommitSet): Added. Creates a commit set using the revisions
1821         and the csutom roots the user had specified.
1822         (CustomAnalysisTaskConfigurator.prototype._renderRepositoryPanes): Added. Renders the pane to specify revisions
1823         and custom roots for "baseline" and "comparison".
1824         (CustomAnalysisTaskConfigurator.prototype._renderBaselineRevisionTable): Added.
1825         (CustomAnalysisTaskConfigurator.prototype._renderComparisonRevisionTable): Added.
1826         (CustomAnalysisTaskConfigurator.prototype._optionalRepositoryList): Added.
1827         (CustomAnalysisTaskConfigurator.prototype._buildRevisionTable): Added. Creates a table for specifying revisions
1828         and custom roots along with a list of repository groups to pick. The set of repositories and custom roots are
1829         shown at the all if all repository groups require them. Otherwise, they are grouped at the bottom as optional.
1830         (CustomAnalysisTaskConfigurator.prototype._buildRepositoryGroupList): Added.
1831         (CustomAnalysisTaskConfigurator.prototype._selectRepositoryGroup): Added.
1832         (CustomAnalysisTaskConfigurator.prototype._buildRevisionInput): Added. Creates an input element to specify
1833         a revision for a given repository. Autofills it with the latest commit for the currently selected platform if
1834         the user had not modified the field by the time the revisions are fetched.
1835         (CustomAnalysisTaskConfigurator.htmlTemplate): Added.
1836         (CustomAnalysisTaskConfigurator.cssTemplate): Added.
1837
1838         * public/v3/components/instant-file-uploader.js: Added. A form to upload a custom darwinup root in "baseline"
1839         or "comparison" configurations of CustomAnalysisTaskConfigurator. It's "instant" because it auto-detects when a
1840         file to be uploaded had already been uploaded elsewhere by checking its SHA-256 hash.
1841         (InstantFileUploader):
1842         (InstantFileUploader.prototype.hasFileToUpload): Added.
1843         (InstantFileUploader.prototype.uploadedFiles): Added.
1844         (InstantFileUploader.prototype.addUploadedFile): Added. It's called on the uploader for "comparison"
1845         configuration when the uploader for "baseline" configuration dipsatches "uploadedFile" action to automatically
1846         mirror the newly uploaded custom root to "comparision" configuration.
1847         (InstantFileUploader.prototype.didConstructShadowTree): Added.
1848         (InstantFileUploader.prototype.render): Added.
1849         (InstantFileUploader.prototype._renderUploadedFiles): Added. Renders the list of the uploaded files.
1850         (InstantFileUploader.prototype._renderPreuploadFiles): Added. Renders the list of the files to be uploaded with
1851         a progress bar.
1852         (InstantFileUploader.prototype._updateUploadStatus): Added. Updates the progress bar for uploading the file.
1853         (InstantFileUploader.prototype._formatUploadError): Added.
1854         (InstantFileUploader.prototype._didFileInputChange): Added. Called when the user picks a file to uploaded on
1855         the input element. Fetch the meta data for the uploaded file with the same SHA-256 hash if there is any, and
1856         start uploading the file if there isn't one.
1857         (InstantFileUploader.prototype._removeUploadedFile): Added.
1858         (InstantFileUploader.prototype._didUploadFile): Added. Move a file from the list of files to be uploaded to
1859         the list of uploaded files.
1860         (InstantFileUploader.htmlTemplate): Added.
1861         (InstantFileUploader.cssTemplate): Added.
1862
1863         * public/v3/index.html:
1864
1865         * public/v3/models/analysis-task.js:
1866         (AnalysisTask): Made platform and metric optional as it is now.
1867         (AnalysisTask.findByPlatformAndMetric): Skip analysis tasks without a platform or a metric.
1868         (AnalysisTask.prototype.isCustom): Added. Returns true for a custom analysis task.
1869         (AnalysisTask.fetchRelatedTasks): Skip custom analysis tasks.
1870         (AnalysisTask._constructAnalysisTasksFromRawData): Construct analysis tasks even if they were missing a metric
1871         or a platform instead of silently skipping them.
1872
1873         * public/v3/models/build-request.js:
1874         (BuildRequest.constructBuildRequestsFromData): Construct uploaded file objects returned by /api/build-requests.
1875
1876         * public/v3/models/commit-log.js:
1877         (CommitLog.fetchLatestCommitForPlatform): Added.
1878
1879         * public/v3/models/commit-set.js:
1880         (CommitSet): Added this._customRoots.
1881         (CommitSet.prototype.customRoots): Returns this._customRoots.
1882         (CommitSet.prototype.equals): Returns false when the set of custom roots are not equal.
1883         (CommitSet.areCustomRootsEqual): Added.
1884         (CustomCommitSet):
1885         (CustomCommitSet.prototype.equals): Added.
1886         (CustomCommitSet.prototype.customRoots): Added.
1887         (CustomCommitSet.prototype.addCustomRoot): Added.
1888
1889         * public/v3/models/manifest.js:
1890         (Manifest._didFetchManifest): Store fileUploadSizeLimit in the manifest as UploadedFile.fileUploadSizeLimit.
1891         This allows a file size check in the client size instead of uploading it to the server and receiving an error.
1892
1893         * public/v3/models/metric.js:
1894         (Metric.formatTime): Moved from ChartPaneStatusView to be also used by InstantFileUploader._renderUploadedFiles.
1895
1896         * public/v3/models/test-group.js:
1897         (TestGroup.prototype.createWithTask): Added.
1898         (TestGroup.prototype.createAndRefetchTestGroups):
1899         (TestGroup.prototype._revisionSetsFromCommitSets): Added. Extracted from createAndRefetchTestGroups.
1900         (TestGroup.prototype._fetchTestGroupsForTask): Added. Extracted from createAndRefetchTestGroups.
1901
1902         * public/v3/models/triggerable.js:
1903         (Triggerable.triggerablePlatformsForTests): Added.
1904         (Triggerable.sortByNamePreferringSmallerRepositories): Added.
1905
1906         * public/v3/models/uploaded-file.js:
1907         (UploadedFile.prototype.createdAt): Added.
1908         (UploadedFile.prototype.filename): Added.
1909         (UploadedFile.prototype.author): Added.
1910         (UploadedFile.prototype.size): Added.
1911         (UploadedFile.uploadFile): Added a client-side check for the file size using UploadedFile.fileUploadSizeLimit.
1912         (UploadedFile.fetchUnloadedFileWithIdenticalHash): Ditto. Also fixed a bug that 404 was resulting in a rejected
1913         promise instead of a resolved promise with null.
1914
1915         * public/v3/pages/analysis-category-page.js:
1916         (AnalysisCategoryPage.prototype._reconstructTaskList): Modernized the code. Added the support for platform and
1917         metric being null for some analysis tasks.
1918
1919         * public/v3/pages/analysis-task-page.js:
1920         (AnalysisTaskPage.prototype._didFetchTask): Don't fetch the measurement set or create a chart for custom tasks.
1921         (AnalysisTaskPage.prototype.render): Don't display the charts or the stacking table for custom tasks.
1922         (AnalysisTaskPage.prototype._renderTaskNameAndStatus): Don't try to show the full test name for custom tasks
1923         since it's not associated with exactly one pair.
1924
1925         * public/v3/pages/chart-pane-status-view.js:
1926         (ChartPaneStatusView.prototype._renderBuildRevisionTable):
1927         (ChartPaneStatusView.prototype._formatTime): Moved to Metric.formatTime.
1928
1929         * public/v3/pages/chart-pane.js:
1930         (ChartPane.prototype._analyzeRange): Set inProgress to true to hide CustomAnalysisTaskConfigurator in
1931         CreateAnalysisTaskPage when creating a non-custom analysis task for a specific range.
1932
1933         * public/v3/pages/create-analysis-task-page.js:
1934         (CreateAnalysisTaskPage): This page now shows CustomAnalysisTaskConfigurator by default, and lets a user create
1935         a custom analysis task by picking a test, a platform, and a set of revisions and custom darwinup roots.
1936         (CreateAnalysisTaskPage.prototype.updateFromSerializedState): Show a message when inProgress is set. This is
1937         the old behavior of this page.
1938         (CreateAnalysisTaskPage.prototype.didConstructShadowTree): Added.
1939         (CreateAnalysisTaskPage.prototype._createAnalysisTaskWithGroup): Added.
1940         (CreateAnalysisTaskPage.prototype.render):
1941         (CreateAnalysisTaskPage.prototype._renderMessage): Added. Hides CustomAnalysisTaskConfigurator and the select
1942         element to specify the numebr of iterations when a message is set.
1943         (CreateAnalysisTaskPage.htmlTemplate):
1944         (CreateAnalysisTaskPage.cssTemplate):
1945
1946         * public/v3/pages/page-router.js:
1947         (PageRouter.prototype.route): Always enqueue the page to re-render when the route has changed.
1948
1949         * server-tests/api-build-requests-tests.js: Updated test cases now that the response contains a list of
1950         uploaded files associated with build requests.
1951
1952         * server-tests/privileged-api-create-test-group-tests.js: Added test cases for creating a custom analysis task
1953         and a test group with custom roots. 
1954
1955         * server-tests/resources/mock-data.js:
1956         (MockData.addMockData): Updated the mock data to satisfy new constraint on analysis-tasks table.
1957
1958         * tools/js/remote.js: Include global.FormData from form-data.js.
1959
1960         * unit-tests/build-request-tests.js:
1961         (sampleBuildRequestData): Updated the mock response.
1962         * unit-tests/buildbot-syncer-tests.js:
1963         (createSampleBuildRequest): Ditto.
1964         * unit-tests/test-groups-tests.js:
1965         (sampleTestGroup): Ditto.
1966
1967 2017-04-10  Commit Queue  <commit-queue@webkit.org>
1968
1969         Unreviewed, rolling out r215202.
1970         https://bugs.webkit.org/show_bug.cgi?id=170694
1971
1972         Committed incorrectly (Requested by rniwa on #webkit).
1973
1974         Reverted changeset:
1975
1976         "Add the UI for scheduling a A/B testing with a custom root"
1977         https://bugs.webkit.org/show_bug.cgi?id=170622
1978         http://trac.webkit.org/changeset/215202
1979
1980 2017-04-10  Ryosuke Niwa  <rniwa@webkit.org>
1981
1982         Add the UI for scheduling a A/B testing with a custom root
1983         https://bugs.webkit.org/show_bug.cgi?id=170622
1984
1985         Reviewed by Anders Carlsson.
1986
1987         This patch adds the support for creating a new analysis task with a custom darwinup roots. A follow up patch
1988         would update the syncing script to schedule such an A/B testing job to a buildbot instance.
1989
1990
1991         * ReadMe.md: Updated instructions for backing up and restoring the database so that it's easier to replace
1992         the file path for the backup.
1993
1994         * init-database.sql: Make task_platform and task_metric optional in each analysis task. Also added a column
1995         to store the root file in commit_set_relationships.
1996
1997         * public/api/build-requests.php:
1998         (main): Include the uploaded files.
1999
2000         * public/api/commits.php:
2001         (main): Added the support for querying the latest commits for a given platform. This is used in a new page
2002         to create a custom analysis task to autofill the latest revisions for a given platform.
2003
2004         * public/api/test-groups.php:
2005         (main): Include the uploaded files.
2006
2007         * public/include/build-requests-fetcher.php:
2008         (BuildRequestsFetcher::__construct): Added a list of uploaded_files and a map from its id.
2009         (BuildRequestsFetcher::uploaded_files): Added.
2010         (BuildRequestsFetcher::fetch_commits_for_set_if_needed): Added the support for including custom roots' id in
2011         each commit set, and inserting its meta data in the list of uplaoded files.
2012
2013         * public/include/commit-log-fetcher.php:
2014         (CommitLogFetcher::fetch_latest_for_platform): Added. Finds the latest commit for a given platform. Ideally,
2015         we should be finding the latest commit for a given platform, but this is very slow so instead find the commit
2016         of the latest build for a given platform.
2017
2018         * public/privileged-api/create-test-group.php:
2019         (main): Added the support for creating an analysis task along with a group.
2020         (commit_sets_from_revision_sets): Added the support for custom roots. Verify the specified uploaded file exists
2021         and include it in commit_set_relationships. Because commits and upload files are stored in a different column
2022         in commit_set_relationships, this function now stores the information for each row of commit_set_relationships
2023         except the commit set ID, which is unknown until the set is created, instead of a commit ID.
2024         (ensure_commit_sets): Made the each entry in a commit set a row instead of a commit ID as done. As this format
2025         is only by v2 UI and detect-changes.js, we don't add the support for specifying custom roots here.
2026
2027         * public/privileged-api/upload-file.php:
2028         (main): Fixed a typo. Also added one more error check.
2029
2030         * public/v3/components/custom-analysis-task-configurator.js: Added. The UI for selecting a test, a platform,
2031         and a set of revisions, as well as custom roots for a custom A/B testing job. The first set of revision with
2032         custom roots is referred as "baseline", and the second configuration is referred as "comparison" in this class.
2033         (CustomAnalysisTaskConfigurator):
2034         (CustomAnalysisTaskConfigurator.prototype.tests): Added.
2035         (CustomAnalysisTaskConfigurator.prototype.platform): Added.
2036         (CustomAnalysisTaskConfigurator.prototype.commitSets): Added. Returns a pair of baseline and comparsion if both
2037         have been configured by the user.
2038         (CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree): Added.
2039         (CustomAnalysisTaskConfigurator.prototype._configureComparison): Added. Called when the user is to configu the
2040         "comparison" configuration.
2041         (CustomAnalysisTaskConfigurator.prototype.render): Added.
2042         (CustomAnalysisTaskConfigurator.prototype._renderTriggerableTests): Added. Renders the list of top-level tests
2043         that can be scheduled by a triggerable.
2044         (CustomAnalysisTaskConfigurator.prototype._renderTriggerablePlatforms): Added. Renders the list of platforms
2045         that can be schedule with the currently selected list of tests by a triggerable. Note that the current UI only
2046         lets the user select a single test but the intent is to allow multiple tests to be selected in the near future.
2047         (CustomAnalysisTaskConfigurator.prototype._buildCheckboxList): Added. Creates a list of radio boxes to select
2048         an item with a callback for each. It automatically sets "selected" class on the selected item. It's used to
2049         render both the list of tests and platforms.
2050         (CustomAnalysisTaskConfigurator.prototype._updateTriggerable): Added. Finds the triggerable for a given list of
2051         tests and platforms. Returns an error when some tests belong to another triggearalbe.
2052         (CustomAnalysisTaskConfigurator.prototype._updateRepositoryGroups): Added. Finds a repository group to use when
2053         the current triggerable has changed. We try to use the repository group of the same name if there is any, and
2054         defaults to the first repository group if there is none. This allows the set of repositories to be specified to
2055         more or less persist across different triggerables. For example, if iOS platforms and Mac platforms use two
2056         distinct triggerables , and both triggerables have two repository groups: one that only specify the OS and the
2057         other that specifies both teh OS and WebKit revision, then this code allows the choice the user had made to
2058         specify either just the OS or the OS and WebKit will be preserved when the user switches from an iOS platform
2059         to a Mac platform.
2060         (CustomAnalysisTaskConfigurator.prototype._updateCommitSetMap): Added. Create a commit set map, the format that
2061         TestGroup.createWithTask accepts given "baseline" and "comparison" commit sets. Pretend "comparison" is not set
2062         if two sets are identical since it makes no sense to schedule an A/B testing job when A and B are identical.
2063         (CustomAnalysisTaskConfigurator.prototype._computeCommitSet): Added. Creates a commit set using the revisions
2064         and the csutom roots the user had specified.
2065         (CustomAnalysisTaskConfigurator.prototype._renderRepositoryPanes): Added. Renders the pane to specify revisions
2066         and custom roots for "baseline" and "comparison".
2067         (CustomAnalysisTaskConfigurator.prototype._renderBaselineRevisionTable): Added.
2068         (CustomAnalysisTaskConfigurator.prototype._renderComparisonRevisionTable): Added.
2069         (CustomAnalysisTaskConfigurator.prototype._optionalRepositoryList): Added.
2070         (CustomAnalysisTaskConfigurator.prototype._buildRevisionTable): Added. Creates a table for specifying revisions
2071         and custom roots along with a list of repository groups to pick. The set of repositories and custom roots are
2072         shown at the all if all repository groups require them. Otherwise, they are grouped at the bottom as optional.
2073         (CustomAnalysisTaskConfigurator.prototype._buildRepositoryGroupList): Added.
2074         (CustomAnalysisTaskConfigurator.prototype._selectRepositoryGroup): Added.
2075         (CustomAnalysisTaskConfigurator.prototype._buildRevisionInput): Added. Creates an input element to specify
2076         a revision for a given repository. Autofills it with the latest commit for the currently selected platform if
2077         the user had not modified the field by the time the revisions are fetched.
2078         (CustomAnalysisTaskConfigurator.htmlTemplate): Added.
2079         (CustomAnalysisTaskConfigurator.cssTemplate): Added.
2080
2081         * public/v3/components/instant-file-uploader.js: Added. A form to upload a custom darwinup root in "baseline"
2082         or "comparison" configurations of CustomAnalysisTaskConfigurator. It's "instant" because it auto-detects when a
2083         file to be uploaded had already been uploaded elsewhere by checking its SHA-256 hash.
2084         (InstantFileUploader):
2085         (InstantFileUploader.prototype.hasFileToUpload): Added.
2086         (InstantFileUploader.prototype.uploadedFiles): Added.
2087         (InstantFileUploader.prototype.addUploadedFile): Added. It's called on the uploader for "comparison"
2088         configuration when the uploader for "baseline" configuration dipsatches "uploadedFile" action to automatically
2089         mirror the newly uploaded custom root to "comparision" configuration.
2090         (InstantFileUploader.prototype.didConstructShadowTree): Added.
2091         (InstantFileUploader.prototype.render): Added.
2092         (InstantFileUploader.prototype._renderUploadedFiles): Added. Renders the list of the uploaded files.
2093         (InstantFileUploader.prototype._renderPreuploadFiles): Added. Renders the list of the files to be uploaded with
2094         a progress bar.
2095         (InstantFileUploader.prototype._updateUploadStatus): Added. Updates the progress bar for uploading the file.
2096         (InstantFileUploader.prototype._formatUploadError): Added.
2097         (InstantFileUploader.prototype._didFileInputChange): Added. Called when the user picks a file to uploaded on
2098         the input element. Fetch the meta data for the uploaded file with the same SHA-256 hash if there is any, and
2099         start uploading the file if there isn't one.
2100         (InstantFileUploader.prototype._removeUploadedFile): Added.
2101         (InstantFileUploader.prototype._didUploadFile): Added. Move a file from the list of files to be uploaded to
2102         the list of uploaded files.
2103         (InstantFileUploader.htmlTemplate): Added.
2104         (InstantFileUploader.cssTemplate): Added.
2105
2106         * public/v3/index.html:
2107
2108         * public/v3/models/analysis-task.js:
2109         (AnalysisTask): Made platform and metric optional as it is now.
2110         (AnalysisTask.findByPlatformAndMetric): Skip analysis tasks without a platform or a metric.
2111         (AnalysisTask.prototype.isCustom): Added. Returns true for a custom analysis task.
2112         (AnalysisTask.fetchRelatedTasks): Skip custom analysis tasks.
2113         (AnalysisTask._constructAnalysisTasksFromRawData): Construct analysis tasks even if they were missing a metric
2114         or a platform instead of silently skipping them.
2115
2116         * public/v3/models/build-request.js:
2117         (BuildRequest.constructBuildRequestsFromData): Construct uploaded file objects returned by /api/build-requests.
2118
2119         * public/v3/models/commit-log.js:
2120         (CommitLog.fetchLatestCommitForPlatform): Added.
2121
2122         * public/v3/models/commit-set.js:
2123         (CommitSet): Added this._customRoots.
2124         (CommitSet.prototype.customRoots): Returns this._customRoots.
2125         (CommitSet.prototype.equals): Returns false when the set of custom roots are not equal.
2126         (CommitSet.areCustomRootsEqual): Added.
2127         (CustomCommitSet):
2128         (CustomCommitSet.prototype.equals): Added.
2129         (CustomCommitSet.prototype.customRoots): Added.
2130         (CustomCommitSet.prototype.addCustomRoot): Added.
2131
2132         * public/v3/models/manifest.js:
2133         (Manifest._didFetchManifest): Store fileUploadSizeLimit in the manifest as UploadedFile.fileUploadSizeLimit.
2134         This allows a file size check in the client size instead of uploading it to the server and receiving an error.
2135
2136         * public/v3/models/metric.js:
2137         (Metric.formatTime): Moved from ChartPaneStatusView to be also used by InstantFileUploader._renderUploadedFiles.
2138
2139         * public/v3/models/test-group.js:
2140         (TestGroup.prototype.createWithTask): Added.
2141         (TestGroup.prototype.createAndRefetchTestGroups):
2142         (TestGroup.prototype._revisionSetsFromCommitSets): Added. Extracted from createAndRefetchTestGroups.
2143         (TestGroup.prototype._fetchTestGroupsForTask): Added. Extracted from createAndRefetchTestGroups.
2144
2145         * public/v3/models/triggerable.js:
2146         (Triggerable.triggerablePlatformsForTests): Added.
2147         (Triggerable.sortByNamePreferringSmallerRepositories): Added.
2148
2149         * public/v3/models/uploaded-file.js:
2150         (UploadedFile.prototype.createdAt): Added.
2151         (UploadedFile.prototype.filename): Added.
2152         (UploadedFile.prototype.author): Added.
2153         (UploadedFile.prototype.size): Added.
2154         (UploadedFile.uploadFile): Added a client-side check for the file size using UploadedFile.fileUploadSizeLimit.
2155         (UploadedFile.fetchUnloadedFileWithIdenticalHash): Ditto. Also fixed a bug that 404 was resulting in a rejected
2156         promise instead of a resolved promise with null.
2157
2158         * public/v3/pages/analysis-category-page.js:
2159         (AnalysisCategoryPage.prototype._reconstructTaskList): Modernized the code. Added the support for platform and
2160         metric being null for some analysis tasks.
2161
2162         * public/v3/pages/analysis-task-page.js:
2163         (AnalysisTaskPage.prototype._didFetchTask): Don't fetch the measurement set or create a chart for custom tasks.
2164         (AnalysisTaskPage.prototype.render): Don't display the charts or the stacking table for custom tasks.
2165         (AnalysisTaskPage.prototype._renderTaskNameAndStatus): Don't try to show the full test name for custom tasks
2166         since it's not associated with exactly one pair.
2167
2168         * public/v3/pages/chart-pane-status-view.js:
2169         (ChartPaneStatusView.prototype._renderBuildRevisionTable):
2170         (ChartPaneStatusView.prototype._formatTime): Moved to Metric.formatTime.
2171
2172         * public/v3/pages/chart-pane.js:
2173         (ChartPane.prototype._analyzeRange): Set inProgress to true to hide CustomAnalysisTaskConfigurator in
2174         CreateAnalysisTaskPage when creating a non-custom analysis task for a specific range.
2175
2176         * public/v3/pages/create-analysis-task-page.js:
2177         (CreateAnalysisTaskPage): This page now shows CustomAnalysisTaskConfigurator by default, and lets a user create
2178         a custom analysis task by picking a test, a platform, and a set of revisions and custom darwinup roots.
2179         (CreateAnalysisTaskPage.prototype.updateFromSerializedState): Show a message when inProgress is set. This is
2180         the old behavior of this page.
2181         (CreateAnalysisTaskPage.prototype.didConstructShadowTree): Added.
2182         (CreateAnalysisTaskPage.prototype._createAnalysisTaskWithGroup): Added.
2183         (CreateAnalysisTaskPage.prototype.render):
2184         (CreateAnalysisTaskPage.prototype._renderMessage): Added. Hides CustomAnalysisTaskConfigurator and the select
2185         element to specify the numebr of iterations when a message is set.
2186         (CreateAnalysisTaskPage.htmlTemplate):
2187         (CreateAnalysisTaskPage.cssTemplate):
2188
2189         * public/v3/pages/page-router.js:
2190         (PageRouter.prototype.route): Always enqueue the page to re-render when the route has changed.
2191
2192         * server-tests/api-build-requests-tests.js: Updated test cases now that the response contains a list of
2193         uploaded files associated with build requests.
2194         *server-tests/api-commits-tests.js: Added a test case for /api/commits/<repository-name>/latest?platform=X.
2195         * server-tests/privileged-api-create-test-group-tests.js: Added test cases for creating a custom analysis task
2196         and a test group with custom roots. 
2197         * server-tests/resources/mock-data.js:
2198         (MockData.addMockData): Updated the mock data to satisfy new constraint on analysis-tasks table. Also inserted
2199         more commits, builds, and build_commits rows for testing /api/commits/<repository-name>/latest?platform=X.
2200
2201         * tools/js/remote.js: Include global.FormData from form-data.js.
2202
2203         * unit-tests/analysis-task-tests.js: Added a test for calling findByPlatformAndMetric when there is a custom
2204         analysis task.
2205         (sampleAnalysisTask): Removed the category since /api/analysis-tasks/ no longer generate this property.
2206         (sampleCustomAnalysisTask): Added.
2207         * unit-tests/build-request-tests.js:
2208         (sampleBuildRequestData): Updated the mock response. Added a test case for fetcing custom roots.
2209         * unit-tests/buildbot-syncer-tests.js:
2210         (createSampleBuildRequest): Ditto.
2211         * unit-tests/test-groups-tests.js:
2212         (sampleTestGroup): Ditto.
2213
2214 2017-04-07  Ryosuke Niwa  <rniwa@webkit.org>
2215
2216         Make cycler page scroll down when a dashboard is too tall for the current viewport size
2217         https://bugs.webkit.org/show_bug.cgi?id=170588
2218
2219         Rubber-stamped by Chris Dumez.
2220
2221         Updated the cycler page to scroll down smoothly over 500ms and scroll up again before moving to the next page
2222         when a dashboard page is too tall to be shown at once. For now, we assume that each dashboard's height is no
2223         more than 2x the height of the viewport.
2224
2225         * public/cycler.html:
2226
2227 2017-04-06  Ryosuke Niwa  <rniwa@webkit.org>
2228
2229         Each build request should be associated with a repository group
2230         https://bugs.webkit.org/show_bug.cgi?id=170528
2231
2232         Rubber-stamped by Chris Dumez.
2233
2234         Make the buildbot syncing script use the concept of repository groups so that each repository group can post
2235         a different set of properties to buildbot. In order to do this, we associate each build request with
2236         a repository group to use. Each triggerable's repository groups is now updated by the syncing scripts via
2237         /api/update-triggerable just the same way the set of the supported platform, test pairs are updated.
2238
2239         Each repository group specifies the list of repositories, a dictionary that maps the buildbot property name
2240         to either a string value or a repository name enclosed in < and >:
2241
2242         ```js
2243         "repositoryGroups": {
2244             "webkit-svn": {
2245                 "repositories": ["WebKit", "macOS"],
2246                 "properties": {"os": "<macOS>", "wk": "<WebKit>"}
2247             }
2248         }
2249         ```
2250
2251         With this, removed the support for specifying a repository to use in generic dictionary of properties via
2252         a dictionary with a single key of "root", "rootOptions", and "rootsExcluding". We now validate that the list of
2253         repositories in each repository group matches exactly the ones used in buildbot properties as well as ones in
2254         build requests.
2255
2256         After this patch, sync-with-buildbot.js will no longer schedule a build request without a repository group.
2257         Run the appropriate database queries to set the repository group on each build request. Because of this change,
2258         this patch also makes BuildbotTriggerable.prototype.syncOnce more robust against invalid build requests.
2259         Instead of throwing an exception and exiting early, it simply skips all build requests that belong to the same
2260         test group if the next build request to be scheduled does not specify a repository group.
2261
2262         * init-database.sql: Add request_repository_group column to build_requests table, and a unique constraint for
2263         repository and group pair in triggerable_repositories table.
2264
2265         * public/api/update-triggerable.php:
2266         (main): Validate and insert repository groups.
2267         (validate_configurations): Extracted from main.
2268         (validate_repository_groups): Added.
2269
2270         * public/v3/models/repository.js:
2271         (Repository.findTopLevelByName): Added.
2272
2273         * public/include/build-requests-fetcher.php:
2274         (BuildRequestsFetcher::results_internal): Include the repository group of each request in the JSON response.
2275
2276         * public/include/repository-group-finder.php: Added. A helper class to find the repository group for a given
2277         triggerable for a list of repositories.
2278         (RepositoryGroupFinder): Added. 
2279         (RepositoryGroupFinder::__construct): Added.
2280         (RepositoryGroupFinder::find_by_repositories): Added.
2281         (RepositoryGroupFinder::populate_map): Added.
2282
2283         * public/privileged-api/create-test-group.php:
2284         (main): Each element in an array returned by ensure_commit_sets and commit_sets_from_revision_sets now contains
2285         "set", the list of commit IDs, and "repository_group", the repository group identified for each commit set.
2286         Use that to set the repository group in each new build request. 
2287         (commit_sets_from_revision_sets): Use RepositoryGroupFinder to find the right repository group.
2288         (ensure_commit_sets): Ditto. There is no need to find a repository group for each commit set here since its
2289         argument is keyed by the repository name. e.g. {"WebKit": [123, 456], "macOS": ["16A323", "16A323"]}
2290
2291         * public/v3/models/build-request.js:
2292         (BuildRequest):
2293         (BuildRequest.prototype.triggerable): Added.
2294         (BuildRequest.prototype.repositoryGroup): Added.
2295         (BuildRequest.constructBuildRequestsFromData): Resolve the triggerable and the repository group.
2296
2297         * public/v3/models/triggerable.js:
2298         (Triggerable.prototype.name): Added.
2299         (Triggerable.prototype.acceptedRepositories): Deleted.
2300         (TriggerableRepositoryGroup):
2301         (TriggerableRepositoryGroup.prototype.accepts): Added. Retruns true if the repository group
2302
2303         * server-tests/api-build-requests-tests.js: Added a test for getting the repository group of a build request.
2304         * server-tests/api-manifest-tests.js: Added assertions for the repository groups.
2305         * server-tests/api-report-tests.js:
2306         (.emptyReport):
2307         (.reportWithTwoLevelsOfAggregations):
2308         * server-tests/api-update-triggerable.js: Added test cases for updating the repository groups associated with
2309         a triggerable.
2310         (.updateWithOSXRepositoryGroup):
2311         (.mapRepositoriesByGroup):
2312         * server-tests/privileged-api-create-test-group-tests.js:
2313         (addTriggerableAndCreateTask): Add two repository groups for testing. Added assertions for repository groups
2314         in existing test cases, and added a test case for creating a test group with two different repository groups.
2315
2316         * server-tests/resources/mock-data.js:
2317         (MockData.resetV3Models): Reset TriggerableRepositoryGroup's static maps.
2318         (MockData.emptyTriggeragbleId): Added.
2319         (MockData.macosRepositoryId): Added.
2320         (MockData.webkitRepositoryId): Added.
2321         (MockData.gitWebkitRepositoryId): Added.
2322         (MockData.addMockData): Create repository groups as needed. Renamed the "OS X" repository to "macOS" since some
2323         tests were using the latter, and now we need mock data to be consistent across tests due to stricter checks.
2324         (MockData.addEmptyTriggerable): Added. Used in api-update-triggerable.js.
2325         (MockData.addMockTestGroupWithGitWebKit): Added. Used in api-build-requests-tests.js.
2326         (MockData.addAnotherMockTestGroup): Cleanup.
2327         (MockData.mockTestSyncConfigWithSingleBuilder): Updated the mock configuration per code changes.
2328         (MockData.mockTestSyncConfigWithTwoBuilders): Ditto.
2329
2330         * server-tests/tools-buildbot-triggerable-tests.js: Updated a test case testing /api/update-triggerable to test
2331         updating the set of repository groups in addition to the set of test, platform pairs.
2332         (.refetchManifest): Added.
2333
2334         * tools/js/buildbot-syncer.js:
2335         (BuildbotSyncer): Now takes a set of configurations shared across syncers: repositoryGroups, slaveArgument,
2336         and buildRequestArgument as the third argument.
2337         (BuildbotSyncer.prototype.repositoryGroups): Added.
2338         (BuildbotSyncer.prototype._testGroupMapForBuildRequests): Cleaned up the code to use Array.prototype.find.
2339         Also added an assertion that the build request is associated with a repository group.
2340         (BuildbotSyncer.prototype._propertiesForBuildRequest): Removed the support for using an arbitary property to
2341         specify a revision in favor of explicity listing each property and repository name in a repository group.
2342         (BuildbotSyncer._loadConfig): Removed the support for "shared", which specified the set of buildbot properties
2343         shared across syncers, the name of properties which specifies the build slave name and build request ID. These
2344         values are not stored as top-level properties and superseded by the concept of repository groups.
2345         (BuildbotSyncer._parseRepositoryGroup): Parses and validates repository groups.
2346         (BuildbotSyncer._createTestConfiguration): We no longer expect each configuration to specify a dictionary of
2347         properties or buildRequestArgument (often inherited from shared).
2348         (BuildbotSyncer._validateAndMergeConfig): Removed "slaveArgument" and "buildRequestArgument" from the list of
2349         allowed proeprties in each configuration now that they're specified as top-level properties.
2350
2351         * tools/js/buildbot-triggerable.js:
2352         (BuildbotTriggerable.prototype.updateTriggerable): Update the associated repository groups.
2353         (BuildbotTriggerable.prototype.syncOnce): Skip test groups for which the next build request to be scheduled is
2354         not included in the list of valid build requests.
2355         (BuildbotTriggerable.prototype._validateRequests): Now returns the list of valid build requests, which excludes
2356         those that lack a repository group set.
2357         (BuildbotTriggerable.prototype._nextRequestInGroup): Extracted from _scheduleRequestIfSlaveIsAvailable. Finds
2358         the next build request to be scheduled for the test group.
2359         (BuildbotTriggerable.prototype._scheduleRequestIfSlaveIsAvailable): Renamed from
2360         _scheduleNextRequestInGroupIfSlaveIsAvailable. Now takes the syncer and the slave name as arguments instead of
2361         a test group information since syncOnce now calls _nextRequestInGroup to find the next build request.
2362
2363         * tools/js/v3-models.js:
2364
2365         * unit-tests/build-request-tests.js: Fixed the test name.
2366
2367         * unit-tests/buildbot-syncer-tests.js: Removed tests for "rootOptions" and "rootsExcluding", and added tests
2368         for parsing repository groups.
2369         (sampleiOSConfig): Updated the mock configuration per code changes.
2370         (sampleiOSConfigWithExpansions): Ditto.
2371         (smallConfiguration): Ditto. Now returns the entire configuration instead of a single builder configuration.
2372         Various test cases have been updated to reflect this.
2373         (createSampleBuildRequest): Removed the git hash of WebKit to match the repository groups listed in the mock
2374         configurations. The git hash was there to test "rootOptions", which this patch removed.
2375         (samplePendingBuild): Removed "root_dict" from the list of properties. This was used to test "rootsExcluding"
2376         which, again, this patch removed.
2377         (sampleInProgressBuild): Ditto.
2378         (sampleFinishedBuild): Ditto.
2379
2380         * unit-tests/resources/mock-v3-models.js:
2381         (MockModels.inject): Added ock repository groups so that existing tests will continue to function.
2382
2383 2017-04-05  Ryosuke Niwa  <rniwa@webkit.org>
2384
2385         Introduce the notion of repository groups to triggerables
2386         https://bugs.webkit.org/show_bug.cgi?id=170228
2387
2388         Reviewed by Chris Dumez.
2389
2390         On some triggerable, it's desirable to specify multiple sets of repositories that are accepted.
2391
2392         For example, if a repository X transitioned from Subversion to Git, and if a triggerable accepted X and
2393         some other repository Y, then it's desirable to two sets: (X-Subversion, Y) and (X-Git, Y) since neither
2394         (X-Subversion, X-Git) nor (X-Subversion, X-Git, Y) makes sense as a set.
2395
2396         This patch introduces triggerable_repository_groups table to represent a set of repositories accepted by
2397         a triggerable. It has many to one relationship to build_triggerables and triggerable_repositories in turn
2398         now has many to one relationship to triggerable_repository_groups instead of build_triggerables.
2399
2400         Also make it possible to disable a triggerable e.g. a set of tests and platforms are no longer supported.
2401         We don't want to delete the triggerable completely from the database since it would result in the associated
2402         A/B testing results being purged, which is not desirale.
2403
2404         To migrate an existing database, run the following transaction:
2405         ```sql
2406         BEGIN;
2407         ALTER TABLE build_triggerables ADD COLUMN triggerable_disabled boolean NOT NULL DEFAULT FALSE;
2408
2409         CREATE TABLE triggerable_repository_groups (
2410             repositorygroup_id serial PRIMARY KEY,
2411             repositorygroup_triggerable integer REFERENCES build_triggerables NOT NULL,
2412             repositorygroup_name varchar(256) NOT NULL,
2413             repositorygroup_description varchar(256),
2414             repositorygroup_accepts_roots boolean NOT NULL DEFAULT FALSE,
2415             CONSTRAINT repository_group_name_must_be_unique_for_triggerable
2416                 UNIQUE(repositorygroup_triggerable, repositorygroup_name));
2417         INSERT INTO triggerable_repository_groups (repositorygroup_triggerable, repositorygroup_name)
2418             SELECT triggerable_id, 'default' FROM build_triggerables;
2419
2420         ALTER TABLE triggerable_repositories ADD COLUMN trigrepo_group integer REFERENCES triggerable_repository_groups;
2421         UPDATE triggerable_repositories SET trigrepo_group = repositorygroup_id FROM triggerable_repository_groups
2422             WHERE trigrepo_triggerable = repositorygroup_triggerable;
2423         ALTER TABLE triggerable_repositories ALTER COLUMN trigrepo_group SET NOT NULL;
2424
2425         ALTER TABLE triggerable_repositories DROP COLUMN trigrepo_triggerable;
2426         ALTER TABLE triggerable_repositories DROP COLUMN trigrepo_sub_roots;
2427         END;
2428         ```
2429
2430         * init-database.sql:
2431         * public/admin/triggerables.php: Use a custom column to make forms to add and configure repository groups.
2432         (insert_triggerable_repositories): Added.
2433         (generate_repository_list): Added.
2434         (generate_repository_form): Added.
2435         (generate_repository_checkboxes): Now generates checkboxes for a repository group instead of a triggerable.
2436
2437         * public/include/manifest-generator.php:
2438         (fetch_triggerables): Fixed the bug that we were not filtering results with query in /api/triggerable.
2439         Rewrote it to include an array of repository groups, which in turn contains an array of repositories along
2440         with its name and a description, and a boolean indicating whether it accepts a custom root file or not.
2441         The boolean will be used when we're adding the support for perf try bots. We will keep acceptedRepositories
2442         since it's still used by detect-changes.js.
2443
2444         * public/v3/models/manifest.js:
2445         (Manifest._didFetchManifest): Resolve repositoriy, test, and platform IDs to their respective objects.
2446
2447         * public/v3/models/triggerable.js:
2448         (Triggerable):
2449         (Triggerable.prototype.isDisabled): Added.
2450         (Triggerable.prototype.repositoryGroups): Added.
2451         (Triggerable.prototype.acceptsTest): Added.
2452         (TriggerableRepositoryGroup): Added.
2453         (TriggerableRepositoryGroup.prototype.description): Added.
2454         (TriggerableRepositoryGroup.prototype.acceptsCustomRoots): Added.
2455         (TriggerableRepositoryGroup.prototype.repositories): Added.
2456
2457         * public/v3/pages/analysis-task-page.js:
2458         (AnalysisTaskPage.prototype._didFetchTask): Don't use a disabled triggerable.
2459
2460         * server-tests/api-manifest-tests.js: Updated a test case to test repository groups.
2461
2462         * tools/js/database.js:
2463         (tableToPrefixMap): Added triggerable_repository_groups.
2464
2465         * tools/js/v3-models.js: Imported TriggerableRepositoryGroup from triggerable.js.
2466
2467 2017-03-31  Ryosuke Niwa  <rniwa@webkit.org>
2468
2469         Build fix. For OS versions, we can end up with non-alphanumeric revision.
2470         Delete the code path only used by the v2 UI since nobody uses that now.
2471
2472         * public/api/commits.php:
2473         (main):
2474
2475 2017-03-30  Ryosuke Niwa  <rniwa@webkit.org>
2476
2477         sync-buildbot.js can schedule more than one build per builder
2478         https://bugs.webkit.org/show_bug.cgi?id=170318
2479
2480         Reviewed by Saam Barati.
2481
2482         The bug was caused by _scheduleNextRequestInGroupIfSlaveIsAvailable not returning a promise when
2483         scheduling the first build request of a test group. This resulted in _pullBuildbotOnAllSyncers
2484         to prematurely resolve before POST'ing new build had finished. That in turn could result in the
2485         next cycle of syncing to occur before POST'ing has actually taken place.
2486
2487         More precisely, when the nextRequest was the first request or its associated syncer object could
2488         not be identified, we were supposed to find the first available syncer, schedule the request,
2489         and then return the promise returned by scheduleRequestInGroupIfAvailable. However, the for loop
2490         which called scheduleRequestInGroupIfAvailable on every syncer was declaring its own variable
2491         named "promise" thereby shadowing the outer variable, which is returned to the caller.
2492
2493         Fixed the bug by not declaring a shadowing variable, and refactored the code. Namely, the only
2494         reason we had such a complicated logic with two local variables, promise and syncer, was so that
2495         we could log that we're scheduling a build. Extracted this code as _scheduleRequestWithLog.
2496
2497         _scheduleNextRequestInGroupIfSlaveIsAvailable can now simply exit early with a call to
2498         _scheduleRequestWithLog when the syncer is readily identified. When looping over syncers, it can
2499         simply return the first non-null result of _scheduleNextRequestInGroupIfSlaveIsAvailable.
2500
2501         * server-tests/tools-buildbot-triggerable-tests.js: Added a test case where we wait 10ms after
2502         receiving the request to POST a build. There should be no new network request until we resolve
2503         this request.
2504
2505         * tools/js/buildbot-triggerable.js:
2506         (BuildbotTriggerable.prototype._scheduleNextRequestInGroupIfSlaveIsAvailable): Fixed the bug.
2507         (BuildbotTriggerable.prototype._scheduleRequestWithLog): Extracted.
2508
2509 2017-03-30  Ryosuke Niwa  <rniwa@webkit.org>
2510
2511         Modernize BuildbotSyncer and BuildbotTriggerable
2512         https://bugs.webkit.org/show_bug.cgi?id=170310
2513
2514         Reviewed by Chris Dumez.
2515
2516         Modernized the code to use arrow functions and other modern idoms in ES2016.
2517
2518         * ReadMe.md: Added instructions on how to run tests, and moved the steps to configure postgres
2519         above the steps to configure Apache since only the former is needed to run tests.
2520         * tools/js/buildbot-syncer.js:
2521         * tools/js/buildbot-triggerable.js:
2522
2523 2017-03-30  Ryosuke Niwa  <rniwa@webkit.org>
2524
2525         Yet another build fix after r214502. Workaround webkit.org/b/169907 for now.
2526
2527         * public/v3/pages/analysis-task-page.js:
2528         (AnalysisTaskPage.cssTemplate):
2529
2530 2017-03-30  Ryosuke Niwa  <rniwa@webkit.org>
2531
2532         Revert an erronously change in the previous commit.
2533
2534         * public/v3/components/base.js:
2535
2536 2017-03-30  Ryosuke Niwa  <rniwa@webkit.org>
2537
2538         Build fix after r214280. Don't render components until its element is inserted into a document.
2539
2540         * public/v3/components/base.js:
2541         (ComponentBase):
2542
2543 2017-03-29  Ryosuke Niwa  <rniwa@webkit.org>
2544
2545         Another build fix after r214502.
2546
2547         * public/v3/components/analysis-results-viewer.js:
2548         (AnalysisResultsViewer.prototype.render): this._groupToCellMap.get may not contain the cell when startPoint
2549         or metric had not been fetched yet even if currentTestGroup is set.
2550
2551 2017-03-29  Ryosuke Niwa  <rniwa@webkit.org>
2552
2553         Build fix after r214502. Analysis tasks without any test groups are throwing exceptions.
2554
2555         * public/v3/components/results-table.js:
2556         (ResultsTable.prototype.renderTable): Don't show the header row when there are no content to show. 
2557         (ResultsTable.prototype._computeRepositoryList): Return a pair of arrays. The caller expects the repository
2558         list to be an array, not undefined.
2559
2560 2017-03-28  Ryosuke Niwa  <rniwa@webkit.org>
2561
2562         Modernize AnalysisTaskPage
2563         https://bugs.webkit.org/show_bug.cgi?id=170165
2564
2565         Reviewed by Antti Koivisto.
2566
2567         Modernized AnalysisTaskPage and related components. The main refactoring happened in AnalysisTaskPage
2568         from which AnalysisTaskResultsPane and AnalysisTaskTestGroupPane have been extracted.
2569
2570         Decoupled BuildRequest from its results. AnalysisResultsViewer and TestGroupResultsTable now stores
2571         a reference to AnalysisResultsView and Metric to find the results for each build request.
2572         This refactoring is necessary in order to view results of an arbitrary metric in the future.
2573
2574         Also refactored ResultsTable and its subclasses extensively. Instead of making its render() to invoke
2575         subclass' methods such as buildRowGroups, heading, and additionalHeading, rely on each subclass call
2576         to invoke renderTable(), renamed from render(), with callbacks to add extra headers and columns.
2577
2578         This patch also fixes a number of usability issues found by the user such as changing the test name
2579         resets the customized revisions by the virtue of the modern code being naturally more correct.
2580
2581         * public/v3/components/analysis-results-viewer.js:
2582         (AnalysisResultsViewer):
2583         (AnalysisResultsViewer.prototype.setTestGroupCallback): Deleted. Replaced by "testGroupClick" action.
2584         (AnalysisResultsViewer.prototype.setRangeSelectorLabels): Moved here from ResultsTable since it's
2585         never used in ResultsTable or TestGroupResultsTable.
2586         (AnalysisResultsViewer.prototype.selectedRange): Ditto.
2587         (AnalysisResultsViewer.prototype.setPoints): Now takes metric as the third argument.
2588         (AnalysisResultsViewer.prototype.setTestGroups): Now takes the current test group.
2589         (AnalysisResultsViewer.prototype.didUpdateResults): Deleted.
2590         (AnalysisResultsViewer.prototype.setAnalysisResultsView): Added.
2591         (AnalysisResultsViewer.prototype.render): Invoke _renderTestGroups lazily. Also simplified the logic
2592         to find the selected list item. Since we always use a shadow DOM now, we can simply look for an element
2593         with ".seleted" instead of crafting a unique class name.
2594         (AnalysisResultsViewer.prototype.renderTestGroups): Renamed from buildRowGroups. Specify callbacks to
2595         insert headers for A/B radio buttons, which has been moved from ResultsTable.prototype.render, and the
2596         stacked blocks of testing results.
2597         (AnalysisResultsViewer.prototype._classForTestGroup): Deleted.
2598         (AnalysisResultsViewer.prototype._openStackingBlock): Deleted.
2599         (AnalysisResultsViewer.prototype._expandBetween): Create a new set for expandedPoints to make
2600         _renderTestGroupsLazily.evaluate do the work.
2601         (AnalysisResultsViewer._layoutBlocks): Moved from TestGroupStackingGrid.layout.
2602         (AnalysisResultsViewer._sortBlocksByRow): Moved from AnalysisResultsViewer.TestGroupStackingGrid.
2603         (AnalysisResultsViewer._insertAfterBlockWithSameRange): Ditto.
2604         (AnalysisResultsViewer._insertBlockInFirstAvailableColumn): Ditto.
2605         (AnalysisResultsViewer._createCellsForRow): Ditto.
2606
2607         (AnalysisResultsViewer.TestGroupStackingBlock):
2608         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.addRowIndex):
2609         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.createStackingCell): No longer creates a unique
2610         class name here. See the inline comment for AnalysisResultsViewer.prototype.render.
2611         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.isThin): Deleted. We used to collapse "failed"
2612         test groups as a thin vertical line, and we wanted to show them next to each other in _layoutBlock but
2613         we don't do that anymore.
2614         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._valuesForCommitSet): Added. Uses
2615         this._analysisResultsView to extract the results for the current metrics.
2616         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
2617
2618         * public/v3/components/analysis-task-bug-list.js: Added.
2619         (AnalysisTaskBugList): Added. Extracted from AnalysisTaskChartPane.
2620         (AnalysisTaskBugList.prototype.setTask): Added.
2621         (AnalysisTaskBugList.prototype.didConstructShadowTree): Added.
2622         (AnalysisTaskBugList.prototype.render): Added.
2623         (AnalysisTaskBugList.prototype._associateBug): Added.
2624         (AnalysisTaskBugList.prototype._dissociateBug): Added.
2625         (AnalysisTaskBugList.htmlTemplate): Added.
2626
2627         * public/v3/components/chart-pane-base.js:
2628         (ChartPaneBase.htmlTemplate): Added a hook to insert more content at the end in AnalysisTaskChartPane.
2629         (ChartPaneBase.paneFooterTemplate): Added.
2630
2631         * public/v3/components/customizable-test-group-form.js:
2632         (CustomizableTestGroupForm):
2633         (CustomizableTestGroupForm.prototype.setCommitSetMap):
2634         (CustomizableTestGroupForm.prototype.startTesting): Renamed from _submitted. Now dispatches an action
2635         by the name of "startTesting" instead of calling this._startCallback.
2636         (CustomizableTestGroupForm.prototype.didConstructShadowTree): Added. Moved the logic to attach event
2637         handlers here to avoid eagerly creating the shadow tree in the constructor.
2638         (CustomizableTestGroupForm.prototype._computeCommitSetMap): Use the newly added this._revisionEditorMap
2639         to find the relevant input element instead of running a querySelector.
2640         (CustomizableTestGroupForm.prototype.render): Lazily invoke _renderCustomRevisionTable. This avoids
2641         overriding the customized revisions when the user finally types in the test group name.
2642         (CustomizableTestGroupForm.prototype._renderCustomRevisionTable): Extracted from render.
2643         (CustomizableTestGroupForm.prototype._constructRevisionRadioButtons): Made this a non-static method
2644         since it needs to update this._revisionEditorMap now. Merged _constructRevisionRadioButtons.
2645         (CustomizableTestGroupForm.prototype._createRadioButton): Deleted. See above.
2646         (CustomizableTestGroupForm.cssTemplate):
2647         (CustomizableTestGroupForm.formContent): Use IDs instead of classes to make this.content(ID) work.
2648
2649         * public/v3/components/mutable-list-view.js:
2650         (MutableListView.prototype.setList):
2651         (MutableListView.prototype.setKindList):
2652         (MutableListView.prototype.setAddCallback): Deleted. Replaced by "addItem" action.
2653         (MutableListView.prototype.render):
2654         (MutableListItem.prototype.content):
2655
2656         * public/v3/components/results-table.js:
2657         (ResultsTable): Removed this._rangeSelectorLabels, this._rangeSelectorCallback, and this._selectedRange
2658         as they are only used by AnalysisResultsViewer. Also replaced this._valueFormatter by
2659         this._analysisResultsView which knows a metric.
2660         (ResultsTable.prototype.setValueFormatter): Deleted.
2661         (ResultsTable.prototype.setRangeSelectorLabels): Deleted.
2662         (ResultsTable.prototype.setRangeSelectorCallback): Deleted.
2663         (ResultsTable.prototype.selectedRange): Deleted.
2664         (ResultsTable.prototype._rangeSelectorClicked): Deleted.
2665         (ResultsTable.prototype.setAnalysisResultsView): Added.
2666         (ResultsTable.prototype.renderTable): Added. Removed the logic to add _rangeSelectorLabels since it has
2667         been moved to AnalysisResultsViewer.prototype.render inside buildColumns, which also inserts additional
2668         columns which used to be stored on each ResultsTableRow. Use the same technique to insert additional
2669         headers. Also take the name (thead tr th) of row header (tbody tr td) as an argument and automatically
2670         create a table cell of an appropriate colspan.
2671         (ResultsTable.prototype._createRevisionListCells):
2672         (ResultsTable.prototype.heading): Deleted. Superseded by buildHeaders callback.
2673         (ResultsTable.prototype.additionalHeading): Ditto.
2674         (ResultsTable.prototype.buildRowGroups): Deleted. It is now the responsibility of each subclass to call
2675         ResultsTable's renderTable() in the subclass' render() function.
2676         (ResultsTable.prototype._computeRepositoryList): No longer takes extraRepositories as an argument.
2677         Instead, this function now returns a pair of the repository list and the list of constant commits.
2678         (ResultsTable.htmlTemplate):
2679         (ResultsTable.cssTemplate):
2680
2681         * public/v3/components/test-group-form.js:
2682         (TestGroupForm): Avoid eagerly creating the shadow tree. Also removed the removed the dead code.
2683         (TestGroupForm.prototype.setRepetitionCount): Simply override the value of the select element.
2684         (TestGroupForm.prototype.didConstructShadowTree): Added. Attach event handlers here to avoid eagerly
2685         creating the shadow tree in the constructor.
2686         (TestGroupForm.prototype.startTesting): Renamed from _submitted. Dispatch "startTesting" action instead
2687         of invoking _startCallback which has been removed.
2688         (TestGroupForm.htmlTemplate):
2689         (TestGroupForm.formContent):
2690
2691         * public/v3/components/test-group-results-table.js:
2692         (TestGroupResultsTable):
2693         (TestGroupResultsTable.prototype.didUpdateResults): Deleted. No longer neeed per setAnalysisResultsView
2694         in ResultsTable.
2695         (TestGroupResultsTable.prototype.setTestGroup):
2696         (TestGroupResultsTable.prototype.heading): Deleted.
2697         (TestGroupResultsTable.prototype.render):
2698         (TestGroupResultsTable.prototype._renderTestGroup): Extracted from render.
2699         (TestGroupResultsTable.prototype._buildRowGroups): Renamed from buildRowGroups.
2700         (TestGroupResultsTable.prototype._buildRowGroupForCommitSet): Extracted from buildRowGroups.
2701         (TestGroupResultsTable.prototype._buildComparisonRow): Extracted from buildRowGroups.buildRowGroups
2702
2703         * public/v3/index.html: Include analysis-task-bug-list.js.
2704
2705         * public/v3/models/analysis-results.js:
2706         (AnalysisResults): Inverted the map so that we can easily create a view based on metric.
2707         (AnalysisResults.prototype.find): Ditto.
2708         (AnalysisResults.prototype.add): Ditto.
2709         (AnalysisResults.prototype.viewForMetric): Added.
2710         (AnalysisResults.fetch):
2711         (AnalysisResultsView): Added.
2712         (AnalysisResultsView.prototype.metric): Added.
2713         (AnalysisResultsView.prototype.resultForBuildId): Added.
2714
2715         * public/v3/models/build-request.js:
2716         (BuildRequest.result): Deleted.
2717         (BuildRequest.setResult): Deleted.
2718
2719         * public/v3/models/test-group.js:
2720         (TestGroup): Removed this._allCommitSets since it was never used.
2721         (TestGroup.prototype.didSetResult): Deleted since it was never used.
2722         (TestGroup.prototype.compareTestResults): Now takes an array of measurement set values.
2723         (TestGroup.prototype._valuesForCommitSet): Deleted.
2724
2725         * public/v3/pages/analysis-task-page.js:
2726         (AnalysisTaskChartPane): This class now includes the form to cutomize the revisions.
2727         (AnalysisTaskChartPane.prototype.setShowForm): Added.
2728         (AnalysisTaskChartPane.prototype._mainSelectionDidChange):
2729         (AnalysisTaskChartPane.prototype.didConstructShadowTree): Added. Dispatches "newTestGroup" action when
2730         the user presses the button to start a new A/B testing from the chart.
2731         (AnalysisTaskChartPane.prototype.render): Added.
2732         (AnalysisTaskChartPane.prototype.paneFooterTemplate): Added.
2733         (AnalysisTaskChartPane.cssTemplate):
2734
2735         (AnalysisTaskResultsPane): Added. Encapsulates AnalysisResultsViewer and CustomizableTestGroupForm.
2736         (AnalysisTaskResultsPane.prototype.setPoints): Added.
2737         (AnalysisTaskResultsPane.prototype.setTestGroups): Added.
2738         (AnalysisTaskResultsPane.prototype.setAnalysisResultsView): Added.
2739         (AnalysisTaskResultsPane.prototype.setShowForm): Added.
2740         (AnalysisTaskResultsPane.prototype.didConstructShadowTree): Added. Dispatches "newTestGroup" action
2741         when the user presses the button to start a new A/B testing from the chart.
2742         (AnalysisTaskResultsPane.prototype.render): Added.
2743         (AnalysisTaskResultsPane.htmlTemplate): Added.
2744         (AnalysisTaskResultsPane.cssTemplate): Added.
2745
2746         (AnalysisTaskTestGroupPane): Added. Encapsulates TestGroupResultsTable and CustomizableTestGroupForm.
2747         (AnalysisTaskTestGroupPane.prototype.didConstructShadowTree): Added.
2748         (AnalysisTaskTestGroupPane.prototype.setTestGroups): Added.
2749         (AnalysisTaskTestGroupPane.prototype.setAnalysisResultsView): Added.
2750         (AnalysisTaskTestGroupPane.prototype.render): Added.
2751         (AnalysisTaskTestGroupPane.prototype._renderTestGroups): Added. Updates the list of test groups. Hide
2752         the hidden groups unless showHiddenGroups is set. Updates this._testGroupMap so that the visibility of
2753         groups and their names can be updated without having to re-render the entire list.
2754         (AnalysisTaskTestGroupPane.prototype._renderTestGroupVisibility): Added.
2755         (AnalysisTaskTestGroupPane.prototype._renderTestGroupNames): Added.
2756         (AnalysisTaskTestGroupPane.prototype._renderCurrentTestGroup): Added. Update TestGroupResultsTable with
2757         the selected test group. Also highlight the list view, and update the hide-unhide toggle button's label
2758         as needed.
2759         (AnalysisTaskTestGroupPane.htmlTemplate): Added.
2760         (AnalysisTaskTestGroupPane.cssTemplate): Added.
2761
2762         (AnalysisTaskPage): Deleted a massive number of instance variables. They are now manged by newly added
2763         AnalysisTaskChartPane, AnalysisTaskResultsPane, and AnalysisTaskTestGroupPane
2764         (AnalysisTaskPage.prototype.didConstructShadowTree): Added. Attach various event handlers here to avoid
2765         eagerly creating the shadow tree in the constructor.
2766         (AnalysisTaskPage.prototype._fetchRelatedInfoForTaskId):
2767         (AnalysisTaskPage.prototype._didFetchTask): No longer sets the value formatter to the results viewer
2768         and the results table as they now recieve AnalysisResultsView later in _assignTestResultsIfPossible.
2769         (AnalysisTaskPage.prototype._didFetchMeasurement): Set the metric to the results viewer.
2770         (AnalysisTaskPage.prototype._didUpdateTestGroupHiddenState):
2771         (AnalysisTaskPage.prototype._assignTestResultsIfPossible): Create AnalysisResultsView from the newly
2772         retrieved AnalysisResults and pass it to AnalysisTaskResultsPane and AnalysisTaskTestGroupPane.
2773         (AnalysisTaskPage.prototype.render): Dramatically simplified.
2774         (AnalysisTaskPage.prototype._renderTaskNameAndStatus): Extracted from render.
2775         (AnalysisTaskPage.prototype._renderRelatedTasks): Ditto.
2776         (AnalysisTaskPage.prototype._renderCauseAndFixes): Ditto.
2777         (AnalysisTaskPage.prototype._showTestGroup):
2778         (AnalysisTaskPage.prototype._updateTaskName): Now takes the new name as an argument.
2779         (AnalysisTaskPage.prototype._updateTestGroupName): Now takes the new name as the second argument.
2780         (AnalysisTaskPage.prototype._hideCurrentTestGroup): Now takes the test group to hide.
2781         (AnalysisTaskPage.prototype._associateCommit): Moved to AnalysisTaskBugList.
2782         (AnalysisTaskPage.prototype._dissociateCommit): Ditto.
2783         (AnalysisTaskPage.prototype._retryCurrentTestGroup): Now takes the test group as the first argument.
2784         (AnalysisTaskPage.prototype._chartSelectionDidChange): Deleted.
2785         (AnalysisTaskPage.prototype._createNewTestGroupFromChart): Deleted.
2786         (AnalysisTaskPage.prototype._selectedRowInAnalysisResultsViewer): Deleted.
2787         (AnalysisTaskPage.prototype._createNewTestGroupFromViewer): Deleted.
2788         (AnalysisTaskPage.htmlTemplate):
2789         (AnalysisTaskPage.cssTemplate):
2790
2791         * unit-tests/test-groups-tests.js: Updated a test case which was expecting BuildReqeust's result, which
2792         has been removed, to exist.
2793
2794 2017-03-23  Ryosuke Niwa  <rniwa@webkit.org>
2795
2796         Share more code between ManifestGenerator and /api/triggerables
2797         https://bugs.webkit.org/show_bug.cgi?id=169993
2798
2799         Reviewed by Chris Dumez.
2800
2801         Shared the code to fetch the list of triggerables from the database between ManifestGenerator
2802         and /api/triggerables.
2803
2804         * public/api/triggerables.php:
2805         (main):
2806         * public/include/manifest-generator.php:
2807         (ManifestGenerator::fetch_triggerables): Extracted as a static function. Also include the ID
2808         in the triggerable data.
2809
2810 2017-03-23  Ryosuke Niwa  <rniwa@webkit.org>
2811
2812         create-test-group should allow a different set of repositories to be used in each configuration
2813         https://bugs.webkit.org/show_bug.cgi?id=169992
2814
2815         Rubber-stamped by Antti Koivisto.
2816
2817         Added the support for new POST parameter, revisionSets, to /privileged-api/create-test-group.
2818         This new parameter now specifies an array of repository id to revision dictionaries, and allows
2819         different set of repositories' revisions to be specified in each dictionary.
2820
2821         We keep the old API for v2 UI and detect-changes.js compatibility for now.
2822
2823         * public/privileged-api/create-test-group.php:
2824         (main):
2825         (commit_sets_from_revision_sets): Added.
2826         (ensure_commit_sets): Only fetch the top-level repository per r213788 and r213976.
2827
2828         * public/v3/models/test-group.js:
2829         (TestGroup.createAndRefetchTestGroups): Use the newly added revisionSets parameter instead of
2830         the now depreacted commitSets parameter.
2831
2832         * public/v3/pages/analysis-task-page.js:
2833         (AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList): Simplified this code
2834         by simply verifying the consistency of commit sets now that createAndRefetchTestGroups takes
2835         an array of commit sets instead of a dictionary of repository name to a list of revisions.
2836
2837         * server-tests/privileged-api-create-test-group-tests.js: Added test cases for new parameter.
2838
2839 2017-03-22  Ryosuke Niwa  <rniwa@webkit.org>
2840
2841         /api/uploaded-file should return createdAt as a POSIX timestamp
2842         https://bugs.webkit.org/show_bug.cgi?id=169980
2843
2844         Rubber-stamped by Antti Koivisto.
2845
2846         Call Database::to_js_time on createdAt to return it as a POSIX timestamp.
2847
2848         * public/include/uploaded-file-helpers.php:
2849         (format_uploaded_file): Fixed the bug.
2850         * server-tests/api-manifest-tests.js: Renamed from api-manifest.js.
2851         * server-tests/api-uploaded-file-tests.js: Renamed from api-uploaded-file.js. Added a test case.
2852
2853 2017-03-22  Ryosuke Niwa  <rniwa@webkit.org>
2854
2855         UploadedFile should support a callback for upload progress
2856         https://bugs.webkit.org/show_bug.cgi?id=169977
2857
2858         Reviewed by Andreas Kling.
2859
2860         Added a new option dictionary to CommonRemoteAPI.sendHttpRequest with uploadProgressCallback
2861
2862         Moved request headers and responseHandler callback in NodeRemoteAPI to this dictionary,
2863         and updated the tests which relied on this code.
2864
2865         * public/shared/common-remote.js:
2866         (CommonRemoteAPI.prototype.postJSON):
2867         (CommonRemoteAPI.prototype.postJSONWithStatus):
2868         (CommonRemoteAPI.prototype.postFormData):
2869         (CommonRemoteAPI.prototype.postFormDataWithStatus):
2870         * public/v3/privileged-api.js:
2871         (PrivilegedAPI.prototype.sendRequest):
2872         * public/v3/remote.js:
2873         (BrowserRemoteAPI.prototype.sendHttpRequest):
2874         (BrowserRemoteAPI.prototype.sendHttpRequestWithFormData):
2875         (BrowserRemoteAPI):
2876         * server-tests/api-uploaded-file.js:
2877         * tools/js/remote.js:
2878         (NodeRemoteAPI.prototype.sendHttpRequest):
2879         (NodeRemoteAPI.prototype.sendHttpRequestWithFormData):
2880         (NodeRemoteAPI):
2881
2882 2017-03-22  Ryosuke Niwa  <rniwa@webkit.org>
2883
2884         ComponentBase should enqueue itself to render when it becomes connected
2885         https://bugs.webkit.org/show_bug.cgi?id=169905
2886
2887         Reviewed by Antti Koivisto.
2888
2889         When a component becomes connected to a document, enqueue itself to render automatically.
2890         Also added the support for boolean attribute to ComponentBase.createElement.
2891
2892         * ReadMe.md: Added an instruction to raise the upload limit per r214065.
2893         * browser-tests/component-base-tests.js: Added tests for the new behavior and createElement. Also moved
2894         the tests related to enqueueToRenderOnResize out of defineElement tests.
2895
2896         * browser-tests/index.html:
2897         (BrowsingContext.prototype.constructor): Override requestAnimationFrame so that the callback would be
2898         involved immediately durign testing.
2899
2900         * public/v3/components/base.js:
2901         (ComponentBase): Enqueue itself to render during construction if custom elements is not available.
2902         (ComponentBase.defineElement):
2903         (ComponentBase.defineElement.elementClass.prototype.connectedCallback): Enqueue itself to render when
2904         the component's element became connected.
2905         (ComponentBase.createElement): Use Array.isArray instead of instanceof to make it work with arrays made
2906         in other realms (global objects) during testing. Added the support for boolean attributes. Setting an
2907         attribute value to true would set the attribute, and setting it to false would not set the attribute.
2908         (ComponentBase.useNativeCustomElements): Added. True iff window.customElements is defined.
2909
2910         * public/v3/components/chart-pane-base.js:
2911         (ChartPaneBase.prototype.render): No longer need to call enqueueToRender on the commit log viewer.
2912
2913         * public/v3/components/commit-log-viewer.js:
2914         (CommitLogViewer.prototype.render): No longer need to call enqueueToRender on the spinner icon.
2915
2916         * public/v3/models/time-series.js:
2917         (TimeSeries): Made this a proper class declaration now that we don't include data.js after r213300.
2918
2919         * public/v3/pages/chart-pane.js:
2920         (ChartPane.prototype._renderActionToolbar): No longer need to call enqueueToRender on the close icon.
2921
2922         * public/v3/pages/summary-page.js:
2923         (SummaryPage.prototype._renderCell): No longer need to call enqueueToRender on the spinner icon.
2924
2925 2017-03-20  Ryosuke Niwa  <rniwa@webkit.org>
2926
2927         Delete another function that was supposed to be removed in the previous commit.
2928
2929         * public/v3/models/build-request.js:
2930         (BuildRequest.cachedRequestsForTriggerableID): Deleted.
2931
2932 2017-03-20  Ryosuke Niwa  <rniwa@webkit.org>
2933
2934         Modernize BuildRequestQueuePage
2935         https://bugs.webkit.org/show_bug.cgi?id=169903
2936
2937         Reviewed by Antti Koivisto.
2938
2939         Modernized the code for /v3/#/analysis/queue.
2940
2941         * public/v3/models/build-request.js:
2942         (BuildRequest.fetchTriggerables): Deleted since the manifest JSON now contains all the triggerables.
2943
2944         * public/v3/pages/build-request-queue-page.js:
2945         (BuildRequestQueuePage): Deleted this._triggerables. Added this._buildRequestsByTriggerable.
2946         (BuildRequestQueuePage.prototype.open): Modernized the code.
2947         (BuildRequestQueuePage.prototype.render): Ditto.
2948         (BuildRequestQueuePage.prototype._constructBuildRequestTable): Ditto.
2949
2950 2017-03-19  Ryosuke Niwa  <rniwa@webkit.org>
2951
2952         Charts page show an inconsistent list of revisions for Git and Subversion
2953         https://bugs.webkit.org/show_bug.cgi?id=169888
2954
2955         Reviewed by Andreas Kling.
2956
2957         With Git, CommitLogViewer was showing the list of revisions including the starting hash,
2958         which was the last data point's revision instead of all revisions after the last data point.
2959
2960         Fixed the bug by always specifying the revision at the last data point in both Subversion
2961         and Git and then making /api/commits/<repository>/?from=X&to=Y exclude the first revision.
2962         For clarity, "from" and "to" query parameters have been renamed to "precedingRevision" and
2963         "lastRevision" respectively.
2964
2965         We also no longer adds 1 to the starting revision of Subversion-like starting revisions. e.g.
2966         when the last data point was at r1234, new data point is at r1250, the label is now "r1234-r1250"
2967         instead of "r1235-r1250".
2968
2969         * browser-tests/chart-revision-range-tests.js: Fixed the tests since revisionList no longer
2970         specifies from/to revisions.
2971         * browser-tests/commit-log-viewer-tests.js: Added. Added tests for CommitLogViewer.
2972         * browser-tests/index.html: Include the new test. Also use a local copy of mocha.js/css.
2973
2974         * public/api/commits.php:
2975         (main): Renamed "from" and "to" query parameters.
2976
2977         * public/include/commit-log-fetcher.php:
2978         (CommitLogFetcher::fetch_between): Added a check that commit time should either be specified
2979         in both rows or not specified in either. Also reject when before_first_revision is identical
2980         or after last_revision instead of re-ordering them since it no longer makes sense to do so with
2981         new query parameter names.
2982
2983         * public/v3/components/base.js:
2984         (ComponentBase._addContentToElement): Use Array.isArray instead of instanceof. It's resilient
2985         againt realm (global object) differences.
2986
2987         * public/v3/components/chart-pane-base.js:
2988         (ChartPaneBase.prototype._updateCommitLogViewer): No longer calls enqueueToRender on this since
2989         CommitLogViewer does that on its own now.
2990         (ChartPaneBase.prototype.render): Juse use this._openRepository instead of relying on CommitLogViewer
2991         to remember which repository is current. This was the only use of currentRepository.
2992
2993         * public/v3/components/commit-log-viewer.js:
2994         (CommitLogViewer):
2995         (CommitLogViewer.prototype.currentRepository): Deleted.
2996         (CommitLogViewer.prototype.view):
2997         (CommitLogViewer.prototype._fetchCommitLogs): Modernized and extracted from view to make it lazy.
2998         Call fetchForSingleRevision when precedingRevision is not specified or it's identical to lastRevision
2999         since the generic JSON API no longer supports being called with the identical revisions.
3000         (CommitLogViewer.prototype.render): Modernized & simplified the code.
3001         (CommitLogViewer.prototype._renderCommitList): Extracted from render to make it lazy.
3002         (CommitLogViewer.htmlTemplate): Add ID on caption & tbody so that they're more easily addressable.
3003         (CommitLogViewer.cssTemplate):
3004
3005         * public/v3/models/commit-log.js:
3006         (CommitLog.prototype.diff): No longer includes from/to revisions in the result. Also avoid adding
3007         1 to a Subversion-like starting revision for creating the label. See above. But we still do this
3008         for forming URLs due to the way tools like Trac work with Subversion revisions.
3009         (CommitLog.fetchBetweenRevisions): Rewritten using DataModel.prototype.cachedFetch with FIXME for
3010         what this function is supposed to be doing.
3011         (CommitLog._cachedCommitLogs): Deleted.
3012         (CommitLog.fetchForSingleRevision): Added.
3013         (CommitLog._constructFromRawData): Added.
3014
3015         * public/v3/models/data-model.js:
3016         (DataModelObject.cachedFetch): Don't parse query values as an integer. Just URL-escape them.
3017
3018         * public/v3/remote.js:
3019         (BrowserRemoteAPI.prototype.sendHttpRequest): Fixed a typo.
3020
3021         * server-tests/api-commits-tests.js: Renamed from api-commits.js. Updated the existing tests to
3022         use new query parameters and added more test cases.
3023
3024         * unit-tests/commit-log-tests.js: Updated the test cases now that CommitLog.prototype.diff no longer
3025         includes from/to values. They're computed in ChartRevisionRange instead.
3026
3027 2017-03-20  Ryosuke Niwa  <rniwa@webkit.org>
3028
3029         Fix os-build-fetcher.js and subprocess.js to make them work
3030         https://bugs.webkit.org/show_bug.cgi?id=169844
3031
3032         Reviewed by Antti Koivisto.
3033
3034         The script added in r213976 has a bug that it can execute commands to fetch subcommits in parallel.
3035         Some commands to poll the lsit of system components is not desirable to be ran in parallel.
3036
3037         * server-tests/resources/mock-subprocess.js:
3038         (MockSubprocess): Use const declaration.
3039         (MockSubprocess.resetAndWaitForInvocation): Added.
3040         (MockSubprocess.waitForInvocation): Renamed from waitingForInvocation. A function name must be a verb.
3041         See https://webkit.org/code-style-guidelines/#names-verb
3042         (MockSubprocess.reset): Set invocations.length to 0 so that tests can store a reference to the array
3043         regardless of whether reset is called or when it's called.
3044
3045         * server-tests/tools-os-build-fetcher-tests.js: Updated tests per the code change. Most of codes now
3046         expect each command to be ran seprately. e.g. if there were two commands to run, instead of expecting
3047         them to be both ran, and resolving invocation promises, we'd wait for one command to run, resolve,
3048         its subcommand to run, and then move onto the second top-level command. Also use a local reference
3049         to MockSubprocess.invocations instead of using the fully qualified name.
3050
3051         * tools/js/os-build-fetcher.js:
3052         (mapInSerialPromiseChain): Added. Calling a closure that returns a promise on each item in an array
3053         in serial (not asynchronous) is a very common pattern in this class.
3054         (OSBuildFetcher.fetchAndReportAllInOrder): Added.
3055         (OSBuildFetcher.prototype.fetchAndReportNewBuilds): Log what the number of builds being submitted.
3056         (OSBuildFetcher.prototype._fetchAvailableBuilds): Fixed the main bug. Using Promise.all would result
3057         in each top-level command to be execued in parallel. Since each subcommand is executed as soon as
3058         its parent command is executed, this results in commands to be executed in parallel.
3059         Added a whole bunch of logging so that we can at least detect a bug like this in the future.
3060         (OSBuildFetcher.prototype._commitsForAvailableBuilds): Cleanup the coding style.
3061         (OSBuildFetcher.prototype._addSubCommitsForBuild): Use mapInSerialPromiseChain. Tightened the assertion
3062         about the content returned by a subcommand.
3063
3064         * tools/js/subprocess.js: Fixed the bug that we were importing require('child_process').ChildProcess.
3065         execFile is defined on require('child_process') itself.
3066         (Subprocess.prototype.execute): Fixed a typo. this._childProcess doesn't exist.
3067         (Subprocess):
3068
3069         * tools/sync-os-versions.js: Renamed from tools/pull-os-versions.js.
3070         (syncLoop): Cleaned up the coding style a little. Also added logging about how long we're about to sleep.
3071
3072 2017-03-16  Ryosuke Niwa  <rniwa@webkit.org>
3073
3074         Add the file uploading capability to the perf dashboard.
3075         https://bugs.webkit.org/show_bug.cgi?id=169737
3076
3077         Reviewed by Chris Dumez.
3078
3079         Added /privileged-api/upload-file to upload a file, and /api/uploaded-file/ to download the file
3080         and retrieve its meta data based on its SHA256. We treat two files with the identical SHA256 as
3081         identical since anyone who can upload a file using this mechanism can execute arbitrary code in
3082         our bots anyway. This is important for avoiding uploading a large darwinup roots multiple times
3083         to the server, saving both user's time/bandwidth and server's disk space.
3084
3085         * config.json: Added uploadDirectory, uploadFileLimitInMB, and uploadUserQuotaInMB as options.
3086         * init-database.sql: Added uploaded_files table.
3087
3088         * public/api/uploaded-file.php: Added.
3089         (main): /api/uploaded-file/N would download uploaded_file with id=N. /api/uploaded-file/?sha256=X
3090         would return the meta data for uploaded_file with sha256=X.
3091         (stream_file_content): Streams the file content in 64KB chunks. We support Range & If-Range HTTP
3092         request headers so that browsers can pause and resume downloading of a large root file.
3093         (parse_range_header): Parses Range HTTP request header.
3094
3095         * public/include/json-header.php:
3096         (remote_user_name): Use the default argument of NULL.
3097
3098         * public/include/manifest-generator.php:
3099         (ManifestGenerator::generate): Include the maximum upload size in the manifest file to let the
3100         frontend code preemptively check the file size before attempting to submit a file.
3101
3102         * public/include/uploaded-file-helpers.php: Added.
3103         (format_uploaded_file):
3104         (uploaded_file_path_for_row):
3105
3106         * public/privileged-api/upload-file-form.html: Added. For debugging purposes.
3107         (fetchCSRFfToken):
3108         (upload):
3109
3110         * public/privileged-api/upload-file.php: Added.
3111         (main):
3112         (query_total_file_size):
3113         (create_uploaded_file_from_form_data):
3114
3115         * public/shared/common-remote.js:
3116         (CommonRemoteAPI.prototype.postFormData): Added.
3117         (CommonRemoteAPI.prototype.postFormDataWithStatus): Added.
3118         (CommonRemoteAPI.prototype.sendHttpRequestWithFormData): Added.
3119         (CommonRemoteAPI.prototype._asJSON): Throw an exception instead of calling a non-existent reject.
3120
3121         * public/v3/models/uploaded-file.js: Added.
3122         (UploadedFile): Added.
3123         (UploadedFile.uploadFile): Added.
3124         (UploadedFile.fetchUnloadedFileWithIdenticalHash): Added. Finds the file with the same SHA256 in
3125         the server to avoid uploading a large custom root multiple times.
3126         (UploadedFile._computeSHA256Hash): Added.
3127
3128         * public/v3/privileged-api.js:
3129         (PrivilegedAPI.prototype.sendRequest): Added the options dictionary as a third argument. For now,
3130         only support useFormData boolean.
3131
3132         * public/v3/remote.js:
3133         (BrowserRemoteAPI.prototype.sendHttpRequestWithFormData): Added.
3134
3135         * server-tests/api-manifest.js: Updated per the inclusion of fileUploadSizeLimit in the manifest.
3136         * server-tests/api-uploaded-file.js: Added.
3137         * server-tests/privileged-api-upload-file-tests.js: Added.
3138
3139         * server-tests/resources/temporary-file.js: Added.
3140         (TemporaryFile): Added. A helper class for creating a temporary file to upload.
3141         (TemporaryFile.makeTemporaryFileOfSizeInMB):
3142         (TemporaryFile.makeTemporaryFile):
3143         (TemporaryFile.inject):
3144
3145         * server-tests/resources/test-server.conf: Set upload_max_filesize and post_max_size for testing.
3146         * server-tests/resources/test-server.js:
3147         (TestServer.prototype.testConfig): Use uploadFileLimitInMB and uploadUserQuotaInMB of 2MB and 5MB.
3148         (TestServer.prototype._ensureDataDirectory): Create a directory to store uploaded files inside
3149         the data directory. In a production server, we can place it outside ServerRoot / DocumentRoot.
3150         (TestServer.prototype.cleanDataDirectory): Delete the aforementioned directory as needed.
3151
3152         * tools/js/database.js:
3153         (tableToPrefixMap): Added uploaded_files.
3154
3155         * tools/js/remote.js:
3156         (NodeRemoteAPI.prototype.sendHttpRequest): Added a dictionary to specify request headers and
3157         a callback to process the response as arguments. Fixed the bug that any 2xx code other than 200
3158         was resulting in a rejected promise. Also include the response headers in the result for tests.
3159         Finally, when content is a function, call that instead of writing the content since FormData
3160         requires a custom logic.
3161         (NodeRemoteAPI.prototype.sendHttpRequestWithFormData): Added.
3162
3163         * tools/js/v3-models.js: Include uploaded-file.js.
3164
3165         * tools/run-tests.py:
3166         (main): Add form-data as a new dependency.
3167
3168 2017-03-15  Dewei Zhu  <dewei_zhu@apple.com>
3169
3170         Fix unit test and bug fix for 'pull-os-versions.js' script.
3171         https://bugs.webkit.org/show_bug.cgi?id=169701
3172
3173         Reviewed by Ryosuke Niwa.
3174
3175         Fix unit tests warnings on node-6.10.0.
3176         Fix 'pull-os-versions.js' does not fetch new builds and report.
3177
3178         * server-tests/tools-os-build-fetcher-tests.js:
3179         (then):
3180         (beforeEach):
3181         (afterEach):
3182         * tools/pull-os-versions.js:
3183         (syncLoop):
3184
3185 2017-03-15  Ryosuke Niwa  <rniwa@webkit.org>
3186
3187         In-browser and node.js implementations of RemoteAPI should share some code
3188         https://bugs.webkit.org/show_bug.cgi?id=169695
3189
3190         Rubber-stamped by Antti Koivisto.
3191
3192         Extracted CommonRemoteAPI out of RemoteAPI implementations for node.js and browser. 
3193
3194         * public/shared/common-remote.js: Added.
3195         (CommonRemoteAPI): Added.
3196         (CommonRemoteAPI.prototype.postJSON): Extracted from RemoteAPI.
3197         (CommonRemoteAPI.prototype.postJSONWithStatus): Ditto.
3198         (CommonRemoteAPI.prototype.getJSON): Ditto.
3199         (CommonRemoteAPI.prototype.getJSONWithStatus): Ditto.
3200         (CommonRemoteAPI.prototype.sendHttpRequest): Added. Needs to implemented by a subclass.
3201         (CommonRemoteAPI.prototype._asJSON): Added.
3202         (CommonRemoteAPI.prototype._checkStatus): Added.
3203
3204         * public/v3/index.html: Include common-remote.js.
3205
3206         * public/v3/privileged-api.js:
3207         (PrivilegedAPI): Use class now that we don't include data.js.
3208         (PrivilegedAPI.sendRequest): Modernized the code.
3209         (PrivilegedAPI.requestCSRFToken): Ditto.
3210
3211         * public/v3/remote.js:
3212         (BrowserRemoteAPI): Renamed from RemoteAPI. window.RemoteAPI is now an instance of this class.
3213         (BrowserRemoteAPI.prototype.sendHttpRequest): Moved from RemoteAPI.sendHttpRequest.
3214         (BrowserRemoteAPI.prototype.sendHttpRequest):
3215
3216         * server-tests/privileged-api-create-analysis-task-tests.js: Updated tests since NodeJSRemoteAPI
3217         now throws the JSON status as an error to be consistent with BrowserRemoteAPI.
3218         * server-tests/privileged-api-create-test-group-tests.js: Ditto.
3219         * server-tests/privileged-api-upate-run-status.js: Ditto.
3220
3221         * tools/js/buildbot-triggerable.js:
3222         (BuildbotTriggerable.prototype.syncOnce): Just use postJSONWithStatus instead of manually
3223         checking the status.
3224
3225         * tools/js/remote.js:
3226         (NodeRemoteAPI): Renamed from RemoteAPI. Still exported as RemoteAPI.
3227         (NodeRemoteAPI.prototype.constructor):
3228         (NodeRemoteAPI.prototype.sendHttpRequest): Modernized the code.
3229
3230 2017-03-15  Ryosuke Niwa  <rniwa@webkit.org>
3231
3232         Fix server tests after r213998 and r213969
3233         https://bugs.webkit.org/show_bug.cgi?id=169690
3234
3235         Reviewed by Antti Koivisto.
3236
3237         Fixed the existing server tests.
3238
3239         * public/v3/models/analysis-task.js:
3240         (AnalysisTask.prototype._updateRemoteState): Use the relative path from the root so that it works inside tests.
3241         (AnalysisTask.prototype.associateBug): Ditto.
3242         (AnalysisTask.prototype.dissociateBug): Ditto.
3243         (AnalysisTask.prototype.associateCommit): Ditto.
3244         (AnalysisTask.prototype.dissociateCommit): Ditto.
3245         (AnalysisTask._fetchSubset): Ditto.
3246         (AnalysisTask.fetchAll): Ditto.
3247         * public/v3/models/test-group.js:
3248         (TestGroup.prototype.updateName): Ditto.
3249         (TestGroup.prototype.updateHiddenFlag): Ditto.
3250         (TestGroup.createAndRefetchTestGroups): Ditto.
3251         (TestGroup.cachedFetch): Ditto.
3252         * server-tests/api-manifest.js: Reverted an inadvertant change in r213969.
3253         * tools/js/database.js:
3254         (tableToPrefixMap): Added analysis_strategies.
3255         * unit-tests/analysis-task-tests.js: Updated expectations per changes to AnalysisTask.
3256
3257 2017-03-15  Ryosuke Niwa  <rniwa@webkit.org>
3258
3259         Add tests for privileged-api/create-analysis-task and privileged-api/create-test-group
3260         https://bugs.webkit.org/show_bug.cgi?id=169688
3261
3262         Rubber-stamped by Antti Koivisto.
3263
3264         Added tests for privileged-api/create-analysis-task and privileged-api/create-test-group, and fixed newly found bugs.
3265
3266         * public/privileged-api/create-analysis-task.php:
3267         (main): Fixed the bug that we were not explicitly checking whether start_run and end_run were integers or not.
3268         Also return InvalidTimeRange when start and end times are identical as that makes no sense for an analysis task.
3269
3270         * public/privileged-api/create-test-group.php:
3271         (main): Fixed a bug that we were not explicitly checking task and repetitionCount to be an integer.
3272         (ensure_commit_sets): Fixed the bug that the number of commit sets weren't checked. 
3273
3274         * server-tests/privileged-api-create-analysis-task-tests.js: Added.
3275         * server-tests/privileged-api-create-test-group-tests.js: Added.
3276
3277         * server-tests/resources/common-operations.js:
3278         (prepareServerTest): Increase the timeout from 1s to 5s.
3279
3280         * server-tests/resources/mock-data.js:
3281         (MockData.addMockData): Use a higher database ID of 20 for a mock build_slave to avoid a conflict with auto-generated IDs.
3282
3283 2017-03-15  Ryosuke Niwa  <rniwa@webkit.org>
3284
3285         Make unit tests return a promise instead of manually calling done
3286         https://bugs.webkit.org/show_bug.cgi?id=169663
3287
3288         Reviewed by Antti Koivisto.
3289
3290         Make the existing unit tests always reutrn a promise instead of manually calling "done" callback as done
3291         in r213969. The promise tests are a lot more stable and less error prone.
3292
3293         Also use MockRemoteAPI.waitForRequest() instead of chaining two resolved promises where appropriate.
3294
3295         * unit-tests/analysis-task-tests.js:
3296         * unit-tests/buildbot-syncer-tests.js:
3297         * unit-tests/checkconfig.js:
3298         * unit-tests/privileged-api-tests.js:
3299
3300 2017-03-15  Dewei Zhu  <dewei_zhu@apple.com>
3301
3302         Rewrite 'pull-os-versions' script in Javascript to add support for reporting os revisions with sub commits.
3303         https://bugs.webkit.org/show_bug.cgi?id=169542
3304
3305         Reviewed by Ryosuke Niwa.
3306
3307         Extend '/api/commits/<repository>/last-reported' to accept a range and return last reported commits in given range.
3308         Rewrite 'pull-os-versions' in JavaScript and add unit tests for it.
3309         Instead of writing query manually while searching criteria contains null columns, use the methods provided in 'db.php'.
3310         Add '.gitignore' file to ommit files generated by while running tests/instances locally.
3311
3312         * .gitignore: Added.
3313         * public/api/commits.php:
3314         * public/api/report-commits.php:
3315         * public/include/commit-log-fetcher.php:
3316         * public/include/db.php: 'null_columns' of prepare_params should be a reference.
3317         * public/include/report-processor.php:
3318         * server-tests/api-commits.js:
3319         (then):
3320         * server-tests/api-report-commits-tests.js:
3321         * server-tests/resources/mock-logger.js: Added.
3322         (MockLogger):
3323         (MockLogger.prototype.log):
3324         (MockLogger.prototype.error):
3325         * server-tests/resources/mock-subprocess.js: Added.
3326         (MockSubprocess.call):
3327         (MockSubprocess.waitingForInvocation):
3328         (MockSubprocess.inject):
3329         (MockSubprocess.reset):
3330         * server-tests/tools-buildbot-triggerable-tests.js:
3331         (MockLogger): Deleted.
3332         (MockLogger.prototype.log): Deleted.
3333         (MockLogger.prototype.error): Deleted.
3334         * server-tests/tools-os-build-fetcher-tests.js: Added.
3335         (beforeEach):
3336         (return.waitingForInvocationPromise.then):
3337         (then):
3338         (string_appeared_here.return.waitingForInvocationPromise.then):
3339         (return.addSlaveForReport.emptyReport.then):
3340         * tools/js/os-build-fetcher.js: Added.
3341         (OSBuildFetcher):
3342         (OSBuildFetcher.prototype._fetchAvailableBuilds):
3343         (OSBuildFetcher.prototype._computeOrder):
3344         (OSBuildFetcher.prototype._commitsForAvailableBuilds.return.this._subprocess.call.then.):
3345         (OSBuildFetcher.prototype._commitsForAvailableBuilds):
3346         (OSBuildFetcher.prototype._addSubCommitsForBuild):
3347         (OSBuildFetcher.prototype._submitCommits):
3348         (OSBuildFetcher.prototype.fetchAndReportNewBuilds):
3349         * tools/js/subprocess.js: Added.
3350         (const.childProcess.require.string_appeared_here.Subprocess.prototype.call):
3351         (const.childProcess.require.string_appeared_here.Subprocess):
3352         * tools/pull-os-versions.js: Added.
3353         (main):
3354         (syncLoop):
3355         * tools/sync-commits.py:
3356         (Repository.fetch_commits_and_submit):
3357
3358 2017-03-14  Ryosuke Niwa  <rniwa@webkit.org>
3359
3360         Make server tests return a promise instead of manually calling done
3361         https://bugs.webkit.org/show_bug.cgi?id=169648
3362
3363         Rubber-stamped by Chris Dumez.
3364
3365         Make the existing server tests always reutrn a promise instead of manually calling "done" callback.
3366         The promise tests are a lot more stable and less error prone.
3367
3368         Also use arrow functions everywhere and use prepareServerTest, renamed from connectToDatabaseInEveryTest,
3369         in more tests instead of manually connecting to database in every test, and reset v3 models.
3370
3371         * server-tests/admin-platforms-tests.js:
3372         * server-tests/admin-reprocess-report-tests.js:
3373         * server-tests/api-build-requests-tests.js:
3374         * server-tests/api-manifest.js:
3375         * server-tests/api-measurement-set-tests.js:
3376         (.postReports): Deleted. Not used in any test.
3377         * server-tests/api-report-commits-tests.js:
3378         * server-tests/api-report-tests.js:
3379         * server-tests/api-update-triggerable.js:
3380         * server-tests/privileged-api-upate-run-status.js:
3381         * server-tests/resources/common-operations.js:
3382         (prepareServerTest): Renamed from connectToDatabaseInEveryTest. Increase the timeout and reset v3 models.
3383         * server-tests/tools-buildbot-triggerable-tests.js:
3384
3385 2017-03-12  Ryosuke Niwa  <rniwa@webkit.org>
3386
3387         Rename RootSet to CommitSet
3388         https://bugs.webkit.org/show_bug.cgi?id=169580
3389
3390         Rubber-stamped by Chris Dumez.
3391
3392         Renamed root_sets to commit_sets and roots to commit_set_relationships in the database schema, and renamed
3393         related classes in public/v3/ and tools accordingly.
3394
3395         RootSet, MeasurementRootSet, and CustomRootSet are respectively renamed to CommitSet, MeasurementCommitSet,
3396         and CustomCommitSet.
3397
3398         In order to migrate the database, run:
3399         ```
3400         BEGIN;
3401         ALTER TABLE root_sets RENAME TO commit_sets;
3402         ALTER TABLE commit_sets RENAME COLUMN rootset_id TO commitset_id;
3403         ALTER TABLE roots RENAME TO commit_set_relationships;
3404         ALTER TABLE commit_set_relationships RENAME COLUMN root_set TO commitset_set;
3405         ALTER TABLE commit_set_relationships RENAME COLUMN root_commit TO commitset_commit;
3406         ALTER TABLE build_requests RENAME COLUMN request_root_set TO request_commit_set;
3407         END;
3408         ```
3409
3410         * browser-tests/index.html:
3411         * init-database.sql:
3412         * public/api/build-requests.php:
3413         (main):
3414         * public/api/test-groups.php:
3415         (main):
3416         (format_test_group):
3417         * public/include/build-requests-fetcher.php:
3418         (BuildRequestsFetcher::__construct):
3419         (BuildRequestsFetcher::results_internal):
3420         (BuildRequestsFetcher::commit_sets): Renamed from root_sets.
3421         (BuildRequestsFetcher::commits): Renamed from roots.
3422         (BuildRequestsFetcher::fetch_commits_for_set_if_needed): Renamed from fetch_roots_for_set_if_needed.
3423         * public/privileged-api/create-test-group.php:
3424         (main):
3425         (ensure_commit_sets): Renamed from commit_sets_from_root_sets.
3426         * public/v3/components/analysis-results-viewer.js:
3427         (AnalysisResultsViewer.prototype.buildRowGroups):
3428         (AnalysisResultsViewer.prototype._collectCommitSetsInTestGroups): Renamed from _collectRootSetsInTestGroups.
3429         (AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups):
3430         (AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups):
3431         (AnalysisResultsViewer.CommitSetInTestGroup): Renamed from RootSetInTestGroup.
3432         (AnalysisResultsViewer.CommitSetInTestGroup.prototype.constructor):
3433         (AnalysisResultsViewer.CommitSetInTestGroup.prototype.commitSet): Renamed from rootSet.
3434         (AnalysisResultsViewer.CommitSetInTestGroup.prototype.succeedingCommitSet): Renamed from succeedingRootSet.
3435         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.constructor):
3436         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.addRowIndex):
3437         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.isComplete):
3438         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.startRowIndex):
3439         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.endRowIndex):
3440         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
3441         * public/v3/components/chart-revision-range.js:
3442         (ChartRevisionRange.prototype._revisionForPoint):
3443         (ChartRevisionRange.prototype._computeRevisionList):
3444         * public/v3/components/customizable-test-group-form.js:
3445         (CustomizableTestGroupForm.prototype.constructor):
3446         (CustomizableTestGroupForm.prototype.setCommitSetMap): Renamed from setRootSetMap.
3447         (CustomizableTestGroupForm.prototype._submitted):
3448         (CustomizableTestGroupForm.prototype._computeCommitSetMap): Renamed from _computeRootSetMap.
3449         (CustomizableTestGroupForm.prototype.render): Renamed from render.
3450         (CustomizableTestGroupForm.prototype._constructRevisionRadioButtons):
3451         * public/v3/components/results-table.js:
3452         (ResultsTable.prototype.render):
3453         (ResultsTable.prototype._createRevisionListCells):
3454         (ResultsTable.prototype._computeRepositoryList):
3455         (ResultsTableRow.prototype.constructor):
3456         (ResultsTableRow.prototype.commitSet): Renamed from rootSet.
3457         * public/v3/components/test-group-results-table.js:
3458         (TestGroupResultsTable.prototype.buildRowGroups):
3459         * public/v3/index.html:
3460         * public/v3/models/build-request.js:
3461         (BuildRequest.prototype.constructor):
3462         (BuildRequest.prototype.updateSingleton):
3463         (BuildRequest.prototype.commitSet): Renamed from rootSet.
3464         (BuildRequest.constructBuildRequestsFromData):
3465         * public/v3/models/commit-set.js: Renamed from public/v3/models/root-set.js.
3466         (CommitSet): Renamed from RootSet.
3467         (CommitSet.containsMultipleCommitsForRepository):
3468         (MeasurementCommitSet): Renamed from MeasurementRootSet.
3469         (MeasurementCommitSet.prototype.namedStaticMap):
3470         (MeasurementCommitSet.prototype.ensureNamedStaticMap):
3471         (MeasurementCommitSet.namedStaticMap):
3472         (MeasurementCommitSet.ensureNamedStaticMap):
3473         (MeasurementCommitSet.ensureSingleton):
3474         (CustomCommitSet): Renamed from CustomRootSet.
3475         * public/v3/models/measurement-adaptor.js:
3476         (MeasurementAdaptor.prototype.applyTo):
3477         * public/v3/models/test-group.js:
3478         (TestGroup.prototype.constructor):
3479         (TestGroup.prototype.addBuildRequest):
3480         (TestGroup.prototype.repetitionCount):
3481         (TestGroup.prototype.requestedCommitSets): Renamed from requestedRootSets.
3482         (TestGroup.prototype.requestsForCommitSet): Renamed from requestsForRootSet.
3483         (TestGroup.prototype.labelForCommitSet): Renamed from labelForRootSet.
3484         (TestGroup.prototype.didSetResult):
3485         (TestGroup.prototype.compareTestResults):
3486         (TestGroup.prototype._valuesForCommitSet): Renamed from _valuesForRootSet.
3487         (TestGroup.prototype.createAndRefetchTestGroups):
3488         * public/v3/pages/analysis-task-page.js:
3489         (AnalysisTaskPage.prototype.render):
3490         (AnalysisTaskPage.prototype._retryCurrentTestGroup):
3491         (AnalysisTaskPage.prototype._createNewTestGroupFromChart):
3492         (AnalysisTaskPage.prototype._createNewTestGroupFromViewer):
3493         (AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList):
3494         * server-tests/api-build-requests-tests.js:
3495         * server-tests/resources/mock-data.js:
3496         (MockData.resetV3Models):
3497         (MockData.addMockData):
3498         (MockData.addAnotherMockTestGroup):
3499         * tools/detect-changes.js:
3500         (createAnalysisTaskAndNotify):
3501         * tools/js/buildbot-syncer.js:
3502         (BuildbotSyncer.prototype._propertiesForBuildRequest):
3503         (BuildbotSyncer.prototype._revisionSetFromCommitSetWithExclusionList):
3504         * tools/js/database.js:
3505         (tableToPrefixMap):
3506         * tools/js/v3-models.js:
3507         * tools/sync-buildbot.js:
3508         (syncLoop):
3509         * tools/sync-with-buildbot.py: Deleted. No longer used.
3510         * unit-tests/analysis-task-tests.js:
3511         * unit-tests/build-request-tests.js:
3512         (sampleBuildRequestData):
3513         * unit-tests/buildbot-syncer-tests.js:
3514         (sampleCommitSetData):
3515         * unit-tests/measurement-adaptor-tests.js:
3516         * unit-tests/measurement-set-tests.js:
3517         * unit-tests/resources/mock-v3-models.js:
3518         (MockModels.inject):
3519         * unit-tests/test-groups-tests.js:
3520         (sampleTestGroup):
3521
3522 2017-03-13  Ryosuke Niwa  <rniwa@webkit.org>
3523
3524         Database's query functions should support querying for a row with NULL value
3525         https://bugs.webkit.org/show_bug.cgi?id=169504
3526
3527         Reviewed by Antti Koivisto.
3528
3529         Add the support for calling select_* with one of column values set to NULL.
3530         This feature is useful in webkit.org/b/146374 and webkit.org/b/168962.
3531
3532         * public/include/db.php:
3533         (Database::prepare_params): Added $null_columns as an optional argument.
3534         (Database::select_conditions_with_null_columns): Added. Builds up a query string by appending AND x is NULL
3535         to match columns whose value must be NULL.
3536         (Database::_select_update_or_insert_row):
3537         (Database::select_rows):
3538
3539 2017-03-13  Dewei Zhu  <dewei_zhu@apple.com>
3540
3541         Add the ability to report a commit with sub-commits.
3542         https://bugs.webkit.org/show_bug.cgi?id=168962
3543
3544         Reviewed by Ryosuke Niwa.
3545
3546         Introduce 'commit_ownerships' which records ownership between commits.
3547         On existing production server, run ```
3548             CREATE TABLE commit_ownerships (
3549                 commit_owner integer NOT NULL REFERENCES commits ON DELETE CASCADE,
3550                 commit_ownee integer NOT NULL REFERENCES commits ON DELETE CASCADE,