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