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