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