15198 lines
800 KiB
Plaintext
15198 lines
800 KiB
Plaintext
2017-12-26 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Test freshness page should use build time instead of commit time to determine the freshness of the data point.
|
||
https://bugs.webkit.org/show_bug.cgi?id=181156
|
||
|
||
Reviewed by Alexey Proskuryakov.
|
||
|
||
Build time is a better data point freshness indicator. Test freshness page is designed to highlight test failures.
|
||
Using commit time will result in including the compiling and test running time which does not quite match the
|
||
definition of data point fresshness.
|
||
|
||
* public/v3/pages/test-freshness-page.js:
|
||
(TestFreshnessPage.prototype._fetchTestResults): Use build time instead of commit time.
|
||
|
||
2017-12-21 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Add UI for A/B testing on owned commits.
|
||
https://bugs.webkit.org/show_bug.cgi?id=177993
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Customizable test group form should support specifying and A/B testing owned commits.
|
||
Introduce 'IntermediateCommitSet' to achieve the goal of specifying owned commits for A/B test.
|
||
In order to support configure A/B testing that may need to add/remove owned commits, CommitSet may be the
|
||
closest thing we can get. However, it is a subclass of DataModelObject, which means CommitSet is a representation
|
||
of 'commit_sets' table and can only be updated from server data. Thus, we want something like CustomCommitSet that
|
||
is not a representation of database table, but unlike CustomCommitSet, it should store information about commits
|
||
rather than a revision. As a result, IntermediateCommitSet is introduced. For a longer term, we may replace
|
||
CustomCommitSet with IntermediateCommitSet as it carries more information and could potentially simplify some
|
||
CustomCommitSet related APIs by using commit id instead of commit revision.
|
||
Extend ButtonBase class so that we can enable/disable a button.
|
||
|
||
* public/v3/components/button-base.js:
|
||
(ButtonBase):
|
||
(ButtonBase.prototype.setDisabled): Enable/disable a button.
|
||
(ButtonBase.prototype.render):
|
||
(ButtonBase.cssTemplate): Added css rule for disabled button.
|
||
* public/v3/components/combo-box.js: Added.
|
||
(ComboBox):
|
||
(ComboBox.prototype.didConstructShadowTree): Setup text field.
|
||
(ComboBox.prototype.render):
|
||
(ComboBox.prototype._candidateNameForCurrentIndex): Returns candidate name based on current index.
|
||
(ComboBox.prototype._candidateElementForCurrentIndex): Returns a list element based on current index.
|
||
(ComboBox.prototype._autoCompleteIfOnlyOneMatchingItem): Supports auto completion.
|
||
(ComboBox.prototype._moveCandidate): Supports arrow up/down.
|
||
(ComboBox.prototype._updateCandidateList): Hide/unhide candidate list and high-light selected candidate.
|
||
(ComboBox.prototype._renderCandidateList): Render candidate list base on value on text field.
|
||
(ComboBox.htmlTemplate):
|
||
(ComboBox.cssTemplate):
|
||
* public/v3/components/customizable-test-group-form.js:
|
||
(CustomizableTestGroupForm):
|
||
(CustomizableTestGroupForm.prototype.didConstructShadowTree): Only fetch the full commits when we about to create a customized A/B tests.
|
||
(CustomizableTestGroupForm.prototype._computeCommitSetMap): Compute the CustomCommitSet based on IntermediateCommitSet and
|
||
other revision related information in some map.
|
||
(CustomizableTestGroupForm.prototype.render):
|
||
(CustomizableTestGroupForm.prototype._renderCustomRevisionTable):
|
||
(CustomizableTestGroupForm.prototype._constructTableBodyList): This function builds table body for each highest level repository.
|
||
It will also include the owned repository rows in the same table body if the commits for highest level repository owns other commits.
|
||
(CustomizableTestGroupForm.prototype._constructTableRowForCommitsWithoutOwner): Build a table row for a highest level repository.
|
||
(CustomizableTestGroupForm.prototype._constructTableRowForCommitsWithOwner): Build a table row for repository with owner.
|
||
(CustomizableTestGroupForm.prototype._constructTableRowForIncompleteOwnedCommits): Build a table row for an unspecified repository.
|
||
(CustomizableTestGroupForm.prototype._constructRevisionRadioButtons): Update the logic to support build radio buttons for the owned repository rows.
|
||
(CustomizableTestGroupForm.cssTemplate):
|
||
* public/v3/components/minus-button.js: Added.
|
||
(MinusButton):
|
||
(MinusButton.buttonContent):
|
||
* public/v3/components/owned-commit-viewer.js:
|
||
(OwnedCommitViewer.prototype._renderOwnedCommitTable):
|
||
* public/v3/components/plus-button.js: Added.
|
||
(PlusButton):
|
||
(PlusButton.buttonContent):
|
||
* public/v3/index.html: Added new components.
|
||
* public/v3/models/commit-log.js: Added owner and owned commit information.
|
||
(CommitLog):
|
||
(CommitLog.prototype.ownedCommits): Returns a list of commits owned by current commit.
|
||
(CommitLog.prototype.ownerCommit): Return owner commit of current commit.
|
||
(CommitLog.prototype.setOwnerCommits): Set owner commit of current commit.
|
||
(CommitLog.prototype.label): Remove unnecessary 'else'.
|
||
(CommitLog.prototype.diff): Remove unused 'fromRevisionForURL' and tiny code cleanup.
|
||
(CommitLog.prototype.ownedCommitForOwnedRepository):
|
||
(CommitLog.prototype.fetchOwnedCommits): Sets the owner for those owned commits. The owner of a commit with multiple owner
|
||
commits will be overwritten by each time this function is called.
|
||
(CommitLog.ownedCommitDifferenceForOwnerCommits): A more generic version of diffOwnedCommits. diffOwnedCommits only accepts 2 commits,
|
||
but ownedCommitDifferenceForOwnerCommits supports multiple commits.
|
||
(CommitLog.diffOwnedCommits): Deleted and should use 'CommitLog.ownedCommitDifferenceForOwnerCommits' instead.
|
||
* public/v3/models/commit-set.js:
|
||
(CommitSet.prototype.topLevelRepositories):
|
||
(CommitSet.prototype.commitForRepository):
|
||
(IntermediateCommitSet): Take CommitSet as argument, note the commit from CommitSet doesn't contains full information of the commit.
|
||
Always call 'fetchFullCommits' once before any further usages.
|
||
(IntermediateCommitSet.prototype.fetchCommitLogs): Fetch all commits information in current commit set.
|
||
(IntermediateCommitSet.prototype._fetchCommitLogAndOwnedCommits): Fetch commit log and owned commits if necessary.
|
||
(IntermediateCommitSet.prototype.updateRevisionForOwnerRepository): Updates a commit for a repository by given a revision of the repository.
|
||
(IntermediateCommitSet.prototype.setCommitForRepository): Sets a commit for a repository in commit set.
|
||
(IntermediateCommitSet.prototype.removeCommitForRepository): Removes a commit for a repository in commit set.
|
||
(IntermediateCommitSet.prototype.ownsCommitsForRepository): Returns whether the commit for repository owns commits.
|
||
(IntermediateCommitSet.prototype.repositories): Returns all repositories in the commit set.
|
||
(IntermediateCommitSet.prototype.highestLevelRepositories): Returns all repositories those don't have an owner.
|
||
(IntermediateCommitSet.prototype.commitForRepository): Returns a commit for a given repository.
|
||
(IntermediateCommitSet.prototype.ownedRepositoriesForOwnerRepository): Returns all repositories owned by a given repository in current commit set.
|
||
(IntermediateCommitSet.prototype.ownerCommitForRepository): Returns owner commit for a given owned repository.
|
||
* tools/js/v3-models.js: Added import for 'IntermediateCommitSet'.
|
||
* unit-tests/commit-log-tests.js: Updated unittest which tests 'ownerCommit' function.
|
||
* unit-tests/commit-set-tests.js: Added unit tests for IntermediateCommitSet.
|
||
|
||
2017-12-13 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Add a test freshness page.
|
||
https://bugs.webkit.org/show_bug.cgi?id=180126
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Added a page to show freshness of a test.
|
||
The test freshness page reports on the same set of tests as the one shown in the summary page.
|
||
Use a logistic function to evaluate the freshness of the data points.
|
||
This function has the desired property which increase dramatically when it close to the center of the graph.
|
||
'acceptableLastDataPointDurationInHour' configs the center of the graph.
|
||
|
||
* public/include/manifest-generator.php:
|
||
* public/v3/components/freshness-indicator.js: Added.
|
||
(FreshnessIndicator): A cell of the test freshness table, color will transit from green to red.
|
||
(FreshnessIndicator.prototype.update): Update the the data point information and triggers
|
||
the cell to re-render if anything changes.
|
||
(FreshnessIndicator.prototype._renderIndicator): Re-render the indicator.
|
||
(FreshnessIndicator.prototype.render): Render the box color base on a logistic function.
|
||
(FreshnessIndicator.prototype._createIndicator):
|
||
(FreshnessIndicator.htmlTemplate):
|
||
(FreshnessIndicator.cssTemplate):
|
||
* public/v3/index.html:
|
||
* public/v3/main.js: Added test freshness page.
|
||
(main):
|
||
* public/v3/models/build-request.js: Refactored waitingTime function to make it reusable.
|
||
(BuildRequest.formatTimeInterval): Format time interval in million seconds to more user friendly text.
|
||
(BuildRequest.prototype.waitingTime):
|
||
* public/v3/pages/test-freshness-page.js: Added.
|
||
(TestFreshnessPage):
|
||
(TestFreshnessPage.prototype.name):
|
||
(TestFreshnessPage.prototype._loadConfig): Load config from summary page configurations.
|
||
(TestFreshnessPage.prototype.open):
|
||
(TestFreshnessPage.prototype._fetchTestResults):
|
||
(TestFreshnessPage.prototype.render):
|
||
(TestFreshnessPage.prototype._renderTable):
|
||
(TestFreshnessPage.prototype._isValidPlatformMetricCombination): Return whether a platform
|
||
and metric combination is valid.
|
||
(TestFreshnessPage.prototype._constructTableCell):
|
||
(TestFreshnessPage.cssTemplate):
|
||
(TestFreshnessPage.prototype.routeName):
|
||
* server-tests/api-manifest-tests.js: Added 'warningHourBaseline' so that we can config the
|
||
parameter of logistic funciton.
|
||
* unit-tests/build-request-tests.js: Added unit tests for formatTimeInterval.
|
||
|
||
2017-11-02 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Add platform argument for syncing script.
|
||
https://bugs.webkit.org/show_bug.cgi?id=179162
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Syncing script should pass platform name to buildbot if platform argument is specified in configuration.
|
||
|
||
* server-tests/tools-sync-buildbot-integration-tests.js:
|
||
(return.createTriggerable.configWithPlatformName.then): Added unit test for platform argument.
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotSyncer): Add '_platformPropertyName' property.
|
||
(BuildbotSyncer.prototype.scheduleRequest): Add '_platformPropertyName' to build property if specified.
|
||
(BuildbotSyncer._loadConfig): Read '_plaformPropertyName' from config.
|
||
|
||
2017-10-30 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Limit the number of results to be submitted in one submission.
|
||
https://bugs.webkit.org/show_bug.cgi?id=179045
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Submitting results for a large number of builds with owned commit information may exceed the size limit of php.
|
||
Added a way to split the results into groups of certain sizes, and submit them one by one.
|
||
|
||
* server-tests/tools-os-build-fetcher-tests.js: Updated the unit tests.
|
||
* tools/js/os-build-fetcher.js: Added '_maxNumberOfResultsPerSubmit' which can be specified by a configuration but also use 20 as default value.
|
||
(prototype.fetchAndReportNewBuilds): Instead of submitting all results once, split them into groups and submit them one by one.
|
||
(prototype._fetchAvailableBuilds): 'label' is already quoted, should remove unnecessary quotes.
|
||
(prototype._addOwnedCommitsForBuild): Added logging to log the size of owned commits.
|
||
|
||
2017-10-31 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
OwnedCommitViewer should include the preceding commit.
|
||
https://bugs.webkit.org/show_bug.cgi?id=179047
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
OwnedCommitViewer shows the difference between owned commits.
|
||
To show changes made by first owned commit, we need to have the preceding commit information.
|
||
|
||
* public/v3/components/commit-log-viewer.js:
|
||
(CommitLogViewer):
|
||
(CommitLogViewer.prototype._fetchCommitLogs): Fetch preceding commit if the commits fetched is not a single commit.
|
||
(CommitLogViewer.prototype.render):
|
||
(CommitLogViewer.prototype._renderCommitList): Conditionally rendering preceding commit in commit list.
|
||
|
||
2017-10-24 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Fix a bug in syncing script that test/build syncer is never set.
|
||
https://bugs.webkit.org/show_bug.cgi?id=178772
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Neither 'buildSyncer' nor 'testSyncer' is ever set.
|
||
Added a unit test to cover this case.
|
||
|
||
* server-tests/tools-sync-buildbot-integration-tests.js:
|
||
(createTriggerable): Refactor it to allow customized name.
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers): Update syncer info accordingly.
|
||
(BuildbotTriggerable._testGroupMapForBuildRequests): Initialize build and test syncer to null.
|
||
|
||
2017-10-24 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Owner commit does not necessarily exist in the same commit set for an owned commit.
|
||
https://bugs.webkit.org/show_bug.cgi?id=178763
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Remove the check based on previous incorrect assumption.
|
||
Added unit tests to cover this change.
|
||
|
||
* public/privileged-api/create-test-group.php:
|
||
* server-tests/privileged-api-create-test-group-tests.js:
|
||
(return.addTriggerableAndCreateTask.string_appeared_here.then.id.taskId.id.then):
|
||
|
||
2017-10-20 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Update perf dashboard upload logic to support uploading binaries from owned commits.
|
||
https://bugs.webkit.org/show_bug.cgi?id=178610
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Update build requests to 'completed' only when all commit set items are satisfied.
|
||
Extend 'repositoryList' parameter to be able to specified own commit information.
|
||
Items in 'repositoryList' can either be a string for top level repository,
|
||
or a dictionary with two keys: 'ownerRepository' and 'ownedRepository'.
|
||
|
||
* public/api/upload-root.php: Extend upload logic for support uploading binaries from owned commits.
|
||
* server-tests/api-upload-root-tests.js: Added unit tests.
|
||
* server-tests/tools-sync-buildbot-integration-tests.js: Added unit tests.
|
||
|
||
2017-10-05 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Add try-bot button on perf analysis status page.
|
||
https://bugs.webkit.org/show_bug.cgi?id=177995
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Add 'Create' button on analysis status top-left corner to create trybot analysis task.
|
||
|
||
* public/v3/pages/analysis-category-toolbar.js:
|
||
(AnalysisCategoryToolbar.cssTemplate):
|
||
|
||
2017-09-28 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Update syncing script to be able to build binary for commit set with owned commits.
|
||
https://bugs.webkit.org/show_bug.cgi?id=177225
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Added support for syncing script to be able to schedule builds to build binary for owned commits.
|
||
Introduces 'ifRepositorySet' and 'ownedRevisions' in 'buildProperties'.
|
||
'ifRepositorySet' will conditionaly set a build property if at least one of the repositories it specified requires build.
|
||
'ownedRevisions' specifies owned commits revision informations.
|
||
|
||
* public/v3/models/commit-set.js:
|
||
(CommitSet): Added '_ownerRepositoryToOwnedRepositoriesMap'.
|
||
(CommitSet.prototype.updateSingleton): Reset '_ownerRepositoryToOwnedRepositoriesMap'.
|
||
(CommitSet.prototype._updateFromObject): Only update '_repositoryToCommitOwnerMap' and '_ownerRepositoryToOwnedRepositoriesMap' when 'commitOwner' exists.
|
||
(CommitSet.prototype.ownerCommitForRepository): Returns a sorted list of top level repositories.
|
||
(CommitSet.prototype.ownedRepositoriesForOwnerRepository): Returns owned repositories given a owner repository.
|
||
(CustomCommitSet.prototype.ownerCommitForRepository): Returns a sorted list of top level repositories.
|
||
* public/v3/models/triggerable.js:
|
||
(prototype.accepts): It should only check against top-level repositories. Removed a deprecated 'FIXME'.
|
||
* server-tests/tools-sync-buildbot-integration-tests.js: Added unit test for building owned commits binary.
|
||
(createTriggerable): Added conditional 'ifRepositorySet' and 'ownedRevisions' in the repository groups.
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotSyncer.prototype._propertiesForBuildRequest):
|
||
Added logic to conditionaly create build property for 'ifRepositorySet'.
|
||
Added logic to create 'ownedRevisions' based on the owner repositories it specified.
|
||
(BuildbotSyncer._parseRepositoryGroup): Build property template should be able to handle 'ifRepositorySet' and 'ownedRevisions'.
|
||
* unit-tests/buildbot-syncer-tests.js: Added unit tests for 'ifRepositorySet' and 'ownedRevisions'.
|
||
* unit-tests/commit-set-tests.js: Added unit tests for 'topLevelRepositoriesSortedByNamePreferringOnesWithURL'.
|
||
* unit-tests/resources/mock-v3-models.js: Added a repository group contains 'ios', 'webkit' and 'ownerRepository'.
|
||
|
||
2017-09-19 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Use 'owned commit' instead of 'sub commit' whenever refers to a commit owned by another commit.
|
||
https://bugs.webkit.org/show_bug.cgi?id=177178
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
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.
|
||
Renaming 'subCommit' to 'ownedCommit', 'ownsSubCommit' to 'ownsCommit' and 'sub-commit' to 'owned-commit'.
|
||
|
||
* browser-tests/commit-log-viewer-tests.js:
|
||
* public/api/commits.php:
|
||
* public/api/report-commits.php:
|
||
* public/include/commit-log-fetcher.php:
|
||
* public/v3/components/commit-log-viewer.js:
|
||
(CommitLogViewer.prototype._renderCommitList):
|
||
* public/v3/components/owned-commit-viewer.js: Renamed from Websites/perf.webkit.org/public/v3/components/sub-commit-viewer.js.
|
||
(OwnedCommitViewer):
|
||
(OwnedCommitViewer.prototype.didConstructShadowTree):
|
||
(OwnedCommitViewer.prototype._toggleVisibility):
|
||
(OwnedCommitViewer.prototype.render):
|
||
(OwnedCommitViewer.prototype._renderOwnedCommitTable):
|
||
(OwnedCommitViewer.htmlTemplate):
|
||
(OwnedCommitViewer.cssTemplate):
|
||
* public/v3/index.html:
|
||
* public/v3/models/commit-log.js:
|
||
(CommitLog):
|
||
(CommitLog.prototype.updateSingleton):
|
||
(CommitLog.prototype.ownsCommits):
|
||
(CommitLog.prototype.fetchOwnedCommits):
|
||
(CommitLog.prototype._buildOwnedCommitMap):
|
||
(CommitLog.diffOwnedCommits):
|
||
(CommitLog.prototype.ownsSubCommits): Deleted.
|
||
(CommitLog.prototype.fetchSubCommits): Deleted.
|
||
(CommitLog.prototype._buildSubCommitMap): Deleted.
|
||
(CommitLog.diffSubCommits): Deleted.
|
||
* server-tests/api-commits-tests.js:
|
||
* server-tests/api-report-commits-tests.js:
|
||
* server-tests/tools-os-build-fetcher-tests.js:
|
||
(return.waitForInvocationPromise.then):
|
||
(string_appeared_here.return.waitForInvocationPromise.then):
|
||
* tools/js/os-build-fetcher.js:
|
||
(prototype._fetchAvailableBuilds):
|
||
(prototype._addOwnedCommitsForBuild):
|
||
(prototype._addSubCommitsForBuild): Deleted.
|
||
* unit-tests/commit-log-tests.js:
|
||
(return.commit.fetchOwnedCommits.then):
|
||
(return.fetchingPromise.then):
|
||
(return.commit.fetchSubCommits.then): Deleted.
|
||
|
||
2017-09-12 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Performance Dashboard backend should support A/B testing for owned components.
|
||
https://bugs.webkit.org/show_bug.cgi?id=175978
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Add backend change for Performance Dashboard to support A/B testing for owned components.
|
||
Added 'commitset_commit_owner' and 'commitset_requires_build' columns to 'commit_set_items' table.
|
||
'commitset_commit_owner' referrs to determine a commit with owner.
|
||
'commitset_requires_build' indicates whether a root build is required.
|
||
This will be set true whenever commit_set_item specifies a patch file,
|
||
or commit_set_item is commit with owner commit,
|
||
or any other commit from same repository and in same build-request group requires build.
|
||
SQL for updating existing database:
|
||
'BEGIN;
|
||
ALTER TABLE commit_set_items ADD COLUMN commitset_commit_owner integer REFERENCES commits DEFAULT NULL, ADD COLUMN commitset_requires_build boolean DEFAULT FALSE;
|
||
UPDATE commit_set_items SET commitset_requires_build = TRUE WHERE commitset_patch_file IS NOT NULL;
|
||
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);
|
||
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),
|
||
ADD CONSTRAINT commitset_item_with_owned_commit_must_requires_build CHECK (commitset_commit_owner IS NULL OR commitset_requires_build = TRUE);
|
||
END;'
|
||
|
||
* init-database.sql: Updated 'commit_set_items' table.
|
||
* public/admin/triggerables.php: Only top level repository should show on triggerables page.
|
||
* public/include/build-requests-fetcher.php: Added 'commitOwner' and 'requireBuild' to 'revision_items'. Added 'commitOwner' field to a commit.
|
||
* public/include/db.php: Should be able to insert boolean value to database without explicted convert to 't' or 'f'.
|
||
* public/privileged-api/create-test-group.php:
|
||
Added logic to process 'commitOwner' and 'requireBuild' in 'commit_set_items'.
|
||
Removed a 'FIXME' that has been addressed before this commit.
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.constructBuildRequestsFromData): Set 'commitOwner' field for a commit set item.
|
||
* public/v3/models/commit-set.js:
|
||
(CommitSet): Added maps for repository to commit owner and whether a repository requires builds.
|
||
(CommitSet.prototype.updateSingleton):
|
||
(CommitSet.prototype._updateFromObject):
|
||
(CommitSet.prototype.ownerRevisionForRepository): Returns owner revision for a given repository in current commit set.
|
||
(CommitSet.prototype.requiresBuildForRepository): Returns whether a repository need to build.
|
||
(CommitSet.prototype.equals): Equality check should include 2 new maps.
|
||
(CustomCommitSet): CustomCommitSet should be able to store commit with an owner commit.
|
||
(CustomCommitSet.prototype.setRevisionForRepository): Added each revision list entry should have 'ownerRevision'(null by default).
|
||
(CustomCommitSet.prototype.equals): Equality check should also check the equality of 'ownerRevision'.
|
||
(CustomCommitSet.prototype.ownerRevisionForRepository): Returns a owner revision for a given repository.
|
||
* public/v3/models/repository.js:
|
||
(Repository.prototype.findOwnedRepositoryByName): Return an repository owned by current repository with a given name.
|
||
* public/v3/models/test-group.js: Added 'ownerRevision' field in each entry of revisionSet.
|
||
* server-tests/api-build-requests-tests.js: Added tests.
|
||
* server-tests/privileged-api-create-test-group-tests.js: Added tests.
|
||
* 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..
|
||
* server-tests/resources/mock-data.js: Added mock build requests with commit sets contain owned commits.
|
||
(MockData.jscRepositoryId): Returns id for JavaScriptsCore repository.
|
||
(MockData.addMockConfiguration): Added mock JavaScriptCore and owned JavaScriptCore repositories and commits associated with them.
|
||
(MockData.ownedJSCRepositoryId): Added a JavaScriptCore repository with WebKit as owner.
|
||
(MockData.addMockConfiguration): Added mock data for test cases those require a commit with a owner commit.
|
||
(MockData.addTestGroupWithOwnedCommits): Added mock data for analysis tasks, the build requires of which contains owned commits.
|
||
(MockData.set addAnotherTriggerable): Added another triggerable which has mac, webkit and javascript core repositories as triggerable repository group.
|
||
(MockData.set addAnotherMockTestGroup): Added another mock test group.
|
||
* tools/js/v3-models.js: Import CustomCommitSet.
|
||
* unit-tests/resources/mock-v3-models.js: Added an owned webkit repository.
|
||
* unit-tests/commit-set-tests.js: Added unit tests CustomCommitSet.
|
||
|
||
2017-09-15 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Should not mark a platform as missing in summary page if all expecting metrics are exlucded.
|
||
https://bugs.webkit.org/show_bug.cgi?id=176970
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
In summary page, if all metrics for a test are excluded in excludedConfigurations for a platform, this platform should not be marked as missing.
|
||
|
||
* public/v3/pages/summary-page.js:
|
||
(SummaryPageConfigurationGroup):
|
||
|
||
2017-09-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Analysis task page shows an empty results for an irrelevant top-level test
|
||
https://bugs.webkit.org/show_bug.cgi?id=175252
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
The bug was caused by TestGroupResultsViewer always listing every top-level test which has a result for the
|
||
entire analysis task. Since a custom analysis task (perf try bots) allows multiple tests to be tested in each
|
||
group, we have to only list the tests which contains results in a particular test group.
|
||
|
||
* public/v3/components/test-group-results-viewer.js:
|
||
(TestGroupResultsViewer.prototype.render): Find the tests that have results for the current test group instead
|
||
of for any test group in this analysis task.
|
||
any test
|
||
* public/v3/models/analysis-results.js:
|
||
(AnalysisResults):
|
||
(AnalysisResults.prototype.topLevelTestsForTestGroup): Renamed from highestTests. Now takes a test group
|
||
as an argument.
|
||
(AnalysisResults.prototype._computedTopLevelTests): Renamed from _computeHighestTests. Filters the results
|
||
with the specified test group.
|
||
|
||
2017-09-06 Aakash Jain <aakash_jain@apple.com>
|
||
|
||
Add initSyncers method in BuildbotTriggerable
|
||
https://bugs.webkit.org/show_bug.cgi?id=176125
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
* tools/sync-buildbot.js:
|
||
(syncLoop): Use initSyncers() which returns a promise. Modified to handle the promise.
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable): Invokes initSyncers() appropriately.
|
||
(BuildbotTriggerable.prototype.initSyncers): Returns a promise which initialize all the syncers.
|
||
* server-tests/tools-buildbot-triggerable-tests.js: Updated tests to handle initSyncers().
|
||
* server-tests/tools-sync-buildbot-integration-tests.js: Ditto.
|
||
|
||
2017-09-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add a button to show two weeks of data to perf dashboard
|
||
https://bugs.webkit.org/show_bug.cgi?id=176438
|
||
|
||
Reviewed by Saam Barati.
|
||
|
||
Add "2W" button to show 14 days of data on dashboard pages.
|
||
|
||
* public/v3/pages/dashboard-toolbar.js:
|
||
(DashboardToolbar):
|
||
|
||
2017-08-29 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. OS X "revision" can have a space.
|
||
|
||
* public/include/commit-log-fetcher.php:
|
||
|
||
2017-08-29 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make it possible to specify A/B testing revision with a partial hash
|
||
https://bugs.webkit.org/show_bug.cgi?id=176047
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Added the support for specifying a partial hash in A/B testing instead of the full hash.
|
||
|
||
* public/include/commit-log-fetcher.php:
|
||
(CommitLogFetcher::find_commit_id_by_revision): Extracted from associate-commit.php.
|
||
* public/privileged-api/associate-commit.php:
|
||
(main):
|
||
* public/privileged-api/create-test-group.php:
|
||
(main): Use find_commit_id_by_revision here to support scheduling an A/B testing with a partial hash.
|
||
* server-tests/privileged-api-create-test-group-tests.js:
|
||
(createAnalysisTask): Make it possible to customize revision string in some test cases.
|
||
* server-tests/resources/test-server.js:
|
||
(TestServer.prototype._stopApache): Fixed the bug that cleanup step always fails whenever the test file
|
||
runs more than 8s.
|
||
|
||
2017-08-26 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Creating trying a test group no longer updates the page.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.createWithCustomConfiguration): Added the missing ignoreCache=true.
|
||
|
||
2017-08-21 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Performance Dashboard should be compatible with PHP 7.
|
||
https://bugs.webkit.org/show_bug.cgi?id=175813
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Use `file_get_contents('php://input')` instead of '$HTTP_RAW_POST_DATA'.
|
||
Update test harness script to load right php module in httpd.
|
||
|
||
* ReadMe.md: JSON example format fix.
|
||
* public/api/report-commits.php: Stop using '$HTTP_RAW_POST_DATA'.
|
||
* public/api/report.php: Stop using '$HTTP_RAW_POST_DATA'.
|
||
* public/api/update-triggerable.php: Stop using '$HTTP_RAW_POST_DATA'.
|
||
* public/include/json-header.php: Stop using '$HTTP_RAW_POST_DATA'.
|
||
* public/include/report-processor.php: Stop using '$HTTP_RAW_POST_DATA'.
|
||
* server-tests/resources/test-server.conf: Load php5 or php7 module conditionally.
|
||
* server-tests/resources/test-server.js: Pass PHP version info while launching httpd.
|
||
(TestServer.prototype._startApache):
|
||
* tools/remote-cache-server.py: Pass PHP version info while launching httpd.
|
||
(start_httpd):
|
||
* tools/remote-server-relay.conf: Load php5 or php7 module conditionally.
|
||
* tools/sync-buildbot.js:
|
||
(syncLoop.const.makeTriggerable):
|
||
(syncLoop):
|
||
|
||
2017-08-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Number each section in ReadMe.md and add more clarifications
|
||
https://bugs.webkit.org/show_bug.cgi?id=175687
|
||
|
||
Rubber-stamped by Joseph Pecoraro.
|
||
|
||
Numbered each section and added more clarifications per issues Aakash encountered.
|
||
|
||
* ReadMe.md:
|
||
|
||
2017-08-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Make the test work with the latest versions of node modules.
|
||
|
||
* server-tests/privileged-api-upload-file-tests.js:
|
||
|
||
2017-07-27 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Fixed a typo. task.id() isn't a thing in this function.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.createWithCustomConfiguration):
|
||
|
||
2017-07-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Another build fix.
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase.prototype._updateCommitLogViewer):
|
||
|
||
2017-07-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. It looks like the code here is racy.
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase.prototype.configure):
|
||
(ChartPaneBase.prototype.setOpenRepository):
|
||
|
||
2017-07-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Show the roots built by perf try bots on results page
|
||
https://bugs.webkit.org/show_bug.cgi?id=174305
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Show build products created by a perf try bots so that we can download them for local testing.
|
||
|
||
* public/v3/components/test-group-revision-table.js:
|
||
(TestGroupRevisionTable.prototype._renderTable): Find the set of repositories for which a patch is applied.
|
||
Show build products for all commit sets for such a repository since when WebKit is built with a patch in
|
||
one configuration, the other configuration also needs to be built for consistency.
|
||
(TestGroupRevisionTable.prototype._buildCommitCell): Added the hyperlink for build products.
|
||
(TestGroupRevisionTable.prototype._buildFileInfo): Takes a string to override the file's label. Since all
|
||
build products made by bots tend to have the same filename, we show the label of "Build product" instead.
|
||
(TestGroupRevisionTable.prototype._mergeCellsWithSameCommitsAcrossRows): Fixed a bug that any entry with
|
||
a patch wasn't getting merged since it was comparing against the result commit set, which does not contain
|
||
the patch (only requested commit set contains a patch).
|
||
|
||
2017-07-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Address Antti's review comment.
|
||
|
||
* public/v3/models/analysis-results.js:
|
||
(AnalysisResults.prototype.containsTest):
|
||
|
||
2017-07-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
A/B testing results page show results for the top-level tests instead of the one being analyzed
|
||
https://bugs.webkit.org/show_bug.cgi?id=174304
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
When a specific subtest is analyzed (e.g. Images subtest of MotionMark), then TestGroupResultsViewer
|
||
should expand and highlight that specific subtest instead of simply showing the top-level test's score.
|
||
This is especially misleading since AnalysisResultsViewer (stacking bars for each test group) uses
|
||
the score of the specific subtest being analyzed.
|
||
|
||
Fixed the bug by passing in the metric associated with the analysis task from AnalysisTaskPage to
|
||
TestGroupResultsViewer via AnalysisTaskTestGroupPane. Also made TestGroupResultsViewer.setAnalysisResults
|
||
auto-expand the tests that are ancestors of the specified metric. Without that, the test won't be shown
|
||
to the user until the ancestor tests are expanded by the user.
|
||
|
||
Also fixed the bug that we were always listing sub-tests regardless of whether they have results or not.
|
||
Since tests tend to change over time, we shouldn't show a test if it doesn't have any results associated.
|
||
|
||
* public/v3/components/test-group-results-viewer.js:
|
||
(TestGroupResultsViewer.prototype.setAnalysisResults): Expand the ancestor tests of the metric.
|
||
(TestGroupResultsViewer.prototype._buildRowsForTest): Exit early if this test doesn't have any results.
|
||
* public/v3/models/analysis-results.js:
|
||
(AnalysisResults.prototype.containsTest): Added.
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskTestGroupPane.prototype.setAnalysisResults): Takes a metric to pass it to the results viewer.
|
||
(AnalysisTaskPage.prototype._assignTestResultsIfPossible):
|
||
|
||
2017-07-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Safari 10.1 fails to upload a patch on perf try bots page
|
||
https://bugs.webkit.org/show_bug.cgi?id=174214
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added the workaround to make the analysis task page work on Safari 10.1
|
||
|
||
* public/v3/components/instant-file-uploader.js:
|
||
(InstantFileUploader.prototype._uploadFiles): Convert files to an array since for-of doesn't work otherwise on Safari 10.1.
|
||
* public/v3/models/uploaded-file.js:
|
||
(UploadedFile._computeSHA256Hash): Fallback to crypto.webkitSubtle since crypto.subtle isn't available on Safari 10.1 or 11.
|
||
|
||
2017-07-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix a typo pointed out by Andreas Kling.
|
||
|
||
* public/v3/components/instant-file-uploader.js:
|
||
(InstantFileUploader.prototype._uploadFiles):
|
||
* public/v3/models/uploaded-file.js:
|
||
(UploadedFile.fetchUploadedFileWithIdenticalHash): Renamed from fetchUnloadedFileWithIdenticalHash.
|
||
|
||
2017-07-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add an admin page to manage uploaded files
|
||
https://bugs.webkit.org/show_bug.cgi?id=174089
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Add an admin page to see the disk usage per user as well as the total, and to prune any zombie files (ones marked
|
||
as deleted but aren't actually deleted in the filesystem).
|
||
|
||
* public/admin/files.php: Added.
|
||
(format_size): Added.
|
||
* public/include/admin-header.php:
|
||
|
||
2017-07-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Roots uploaded by bots don't get author specified properly
|
||
https://bugs.webkit.org/show_bug.cgi?id=174087
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
When a root file is uploaded from the bot, we manually specify the remote user to upload_file_in_transaction.
|
||
However, this was getting ignored by create_uploaded_file_from_form_data since it was always calling
|
||
remote_user_name to get the user name off of $_SERVER.
|
||
|
||
Fixed the bug by passing in the user name from upload_file_in_transaction to create_uploaded_file_from_form_data.
|
||
|
||
* public/include/uploaded-file-helpers.php:
|
||
(create_uploaded_file_from_form_data): Take the remote user as an argument instead of calling remote_user_name.
|
||
(upload_file_in_transaction):
|
||
* server-tests/api-upload-root-tests.js: Updated an existing test cases to make sure root files' author is set.
|
||
(createTestGroupWihPatch): Manually override the author of a test group for testing.
|
||
|
||
2017-07-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Prune unused uploaded files when the file quota is reached
|
||
https://bugs.webkit.org/show_bug.cgi?id=174086
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Made /privileged-api/uploaded-file and /api/upload-root automatically delete old uploaded files when
|
||
uploading a new file results in the file quota to be exceeded. Also added the notion of the total quota
|
||
to avoid running out of a disk when there are hundreds of users each uploading near their quota.
|
||
|
||
* config.json: Added a sample total disk quota of 100GB.
|
||
* public/include/uploaded-file-helpers.php:
|
||
(query_file_usage_for_user): Renamed from query_total_file_size.
|
||
(query_total_file_usage): Added.
|
||
(upload_file_in_transaction):
|
||
(delete_file): Added.
|
||
(prune_old_files): Added.
|
||
* server-tests/privileged-api-upload-file-tests.js: Added tests for deleting old uploaded files as well as
|
||
tests for the total quota.
|
||
* server-tests/resources/test-server.js:
|
||
(TestServer.prototype.testConfig): Added uploadTotalQuotaInMB to the test configuration.
|
||
|
||
2017-06-29 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
UploadedFile should include the file extension in its url
|
||
https://bugs.webkit.org/show_bug.cgi?id=174009
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Some command line tools such as darwinup use the file extension to determine the file type.
|
||
Include the file extension in the URL of an uploaded file to make it work with these tools.
|
||
|
||
* public/include/uploaded-file-helpers.php:
|
||
(format_uploaded_file): Include the file extension.
|
||
* public/v3/models/uploaded-file.js:
|
||
(UploadedFile):
|
||
(UploadedFile.prototype.url): Return the URL with hthe file extension specified. /api/uploaded-file
|
||
already supports having the file extension specified.
|
||
* server-tests/tools-sync-buildbot-integration-tests.js: Updated test cases.
|
||
* unit-tests/buildbot-syncer-tests.js: Ditto.
|
||
|
||
2017-05-31 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Don't shouldn't create a request to build a patch if there is no patch to build
|
||
https://bugs.webkit.org/show_bug.cgi?id=172791
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
When a commit set doesn't have a patch specified, don't create a request to build. For example, when we're comparing
|
||
WebKit in the system to WebKit with a patch, there is nothing to build for the first commit set.
|
||
|
||
However, when conducting an A/B testing, it's advisible to compare WebKit built with and without a patch on a single
|
||
machine with the same version of Xcode, etc... For this reason, we still create a request to build for a commit set
|
||
if there is another commit set with a patch which uses the same repository group.
|
||
|
||
* public/privileged-api/create-test-group.php:
|
||
(main): Fixed the bug. Only create a build request to build if there is a matching repository group with a patch.
|
||
* server-tests/privileged-api-create-test-group-tests.js: Added a test case.
|
||
|
||
2017-05-31 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Allow sync-buildbot.js to set a buildbot property only when patches are built
|
||
https://bugs.webkit.org/show_bug.cgi?id=172743
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Added the ability to specify a buildbot property only when there are build requests to build a patch.
|
||
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotSyncer.prototype.scheduleRequest): Pass in the list of build requests that belong to the same test group.
|
||
(BuildbotSyncer.prototype.scheduleRequestInGroupIfAvailable): Ditto.
|
||
(BuildbotSyncer.prototype._propertiesForBuildRequest): Added the support for specifying a conditional property.
|
||
For the condition type of "built", we check if there was any other
|
||
(BuildbotSyncer._parseRepositoryGroup): Added the support for "ifBuilt" conditional.
|
||
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype._scheduleRequestIfSlaveIsAvailable): Pass in the list of build requests that
|
||
belong to the same test group.
|
||
(BuildbotTriggerable.prototype._scheduleRequestWithLog): Ditto.
|
||
|
||
* unit-tests/buildbot-syncer-tests.js: Added test case for newly added "ifBuilt" as well as specifying a patch.
|
||
Updated the various test cases per the addition of new argument to scheduleRequest, _propertiesForBuildRequest,
|
||
and scheduleRequestInGroupIfAvailable.
|
||
(createSampleBuildRequestWithPatch): Added.
|
||
|
||
* unit-tests/resources/mock-v3-models.js:
|
||
(MockModels.inject): Made "ios-svn-webkit" accept a WebKit patch and roots to allow new testing.
|
||
|
||
2017-05-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
sync-builedbot.js fails to schedule the second request to test with a patch
|
||
https://bugs.webkit.org/show_bug.cgi?id=172701
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
The bug was caused by an assertion failure in BuildbotTriggerable's _pullBuildbotOnAllSyncers failing to
|
||
take into account that for a test group with a patch could be associated with two syncers, one to build
|
||
a patch and another to run tests. Fixed the bug by differentiating the two types of syncers by buildSyncer
|
||
and testSyncer per test group.
|
||
|
||
* server-tests/tools-sync-buildbot-integration-tests.js: Extended a test case so that it would hit the
|
||
assertion without the fix.
|
||
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype.syncOnce): Use the right kind of the syncer to schedule a build or a test.
|
||
(BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers): Associate a given syncer based on the kind of
|
||
the build request it processed, and assert accordingly.
|
||
|
||
2017-05-29 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix UI glitches with a custom analysis test group with a patch
|
||
https://bugs.webkit.org/show_bug.cgi?id=172694
|
||
|
||
Reviewed by Sam Weinig.
|
||
|
||
Fix the following UI glitches with perf try bots:
|
||
- Retrying an A/B testing with a patch fails.
|
||
- A patch specified in an test group does not get specified in the configurator.
|
||
- Drag & dropping a patch doesn't work.
|
||
- Results for custom analysis tasks don't get shown.
|
||
|
||
* public/api/test-groups.php:
|
||
(main): Fix a bug that test group's platform does not match that of the request'ed platform. Since each test
|
||
group is associated with platform, just use that instead of querying test_configurations. This resulted in
|
||
the configurator not being able to find a triggerable in some cases.
|
||
|
||
* public/v3/components/custom-analysis-task-configurator.js:
|
||
(CustomAnalysisTaskConfigurator):
|
||
(CustomAnalysisTaskConfigurator.prototype.setCommitSets): Add patches in the commit set.
|
||
(CustomAnalysisTaskConfigurator.prototype._setUploadedFilesToUploader): Now clears the exiting uploaded files
|
||
Also renamed from _setUploadedFilesIfEmpty.
|
||
(CustomAnalysisTaskConfigurator.prototype._setPatchFiles): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree): We no longer update the list of roots
|
||
for the comparsion when a new root is added to the baseline.
|
||
(CustomAnalysisTaskConfigurator.prototype._configureComparison): Copy over the list of patches and roots when
|
||
starting to configure the comparsion.
|
||
|
||
* public/v3/components/instant-file-uploader.js:
|
||
(InstantFileUploader.prototype.clear): Added.
|
||
(InstantFileUploader.prototype.didConstructShadowTree): Added event handlers for dragover & drop events to
|
||
allow specifying a patch and root using drag & drop. Unfortunately, this still doesn't work in WebKit due to
|
||
a bug in our shadow DOM implementation.
|
||
(InstantFileUploader.prototype._didFileInputChange):
|
||
(InstantFileUploader.prototype._uploadFiles): Extracted from _didFileInputChange.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskTestGroupPane.prototype.setAnalysisResults): No longer takes metric.
|
||
(AnalysisTaskTestGroupPane.cssTemplate): Removed unused rules. Also disallow flexing on the list of test groups
|
||
to avoid the name of a test froup from overflowing on top of the results pane.
|
||
(AnalysisTaskPage.prototype._assignTestResultsIfPossible): Set setAnalysisResults even when metric is not set
|
||
as is the case for a custom analysis task.
|
||
(AnalysisTaskPage.prototype._retryCurrentTestGroup): Use createWithCustomConfiguration to allow retrying of
|
||
an A/B testing with a patch in a custom analysis task.
|
||
(AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList):
|
||
|
||
2017-05-26 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Show patches applied in each A/B testing build requests
|
||
https://bugs.webkit.org/show_bug.cgi?id=172636
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
List patches applied along side revisions inn the list of revisions for an A/B tesing build requests if there
|
||
are any patches applied.
|
||
|
||
* public/v3/components/test-group-revision-table.js:
|
||
(TestGroupRevisionTable.prototype._renderTable): Indicate which request is to build a patch and which one is
|
||
to run tests.
|
||
(TestGroupRevisionTable.prototype._buildCommitCell): Include the patch file's information when there is one.
|
||
We need to use the requested commit set instead of the one reported by testers or builders since they don't
|
||
include patch or root information.
|
||
(TestGroupRevisionTable.prototype._buildCustomRootsCell):
|
||
(TestGroupRevisionTable.prototype._buildFileInfo): Extracted from _buildCustomRootsCell.
|
||
|
||
2017-05-26 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
The queue page is broke when there is a custom analysis task
|
||
https://bugs.webkit.org/show_bug.cgi?id=172631
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Fix the bug that we were always assuming each build request to have a test associated.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.createAndRefetchTestGroups): Fixed the bug that we were referring to a non-existent variable task.
|
||
* public/v3/pages/build-request-queue-page.js:
|
||
(BuildRequestQueuePage.prototype._constructBuildRequestTable): Fixed the bug. Collect every request in the group
|
||
and then find the first test request's test name. Make it clear that we're waiting for a build as needed.
|
||
|
||
2017-05-25 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Syncing script shouldn't schedule a build request when there is a build from another test group in progress
|
||
https://bugs.webkit.org/show_bug.cgi?id=172577
|
||
<rdar://problem/32395049>
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
When a buildbot master gets restarted while there is an in-progress build and a pending build, the master will
|
||
re-schedule the currently running build, and this can result in multiple build requests from different test
|
||
groups being scheduled simultaneously.
|
||
|
||
sync-buildbot.js was supposed to recover from this state by only processing build requests from one test group
|
||
at a time and eventually come back to a state where only a single test group is running per buildbot slave.
|
||
|
||
We had a test for this particular case but it wasn't testing what it claimed to test. Rewriten the test case
|
||
and fixed the bug by explicitly checking this condition and treating it as if there is a pending build already
|
||
scheduled in the builder in this case.
|
||
|
||
* public/api/test-groups.php:
|
||
(main): Fixed a regression from r217397. Return the platform ID of the first request when none of the requets
|
||
have been processed yet or all of them had failed.
|
||
* server-tests/tools-buildbot-triggerable-tests.js: Rewritten a test case intended to cover this bug.
|
||
(.assertRequestAndResolve): Added.
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotSyncer.prototype.scheduleRequestInGroupIfAvailable): Fixed the bug. Avoid scheduling a new request on
|
||
this syncer if there is a build in progress for a test group different from that of the new request. Reuse the
|
||
code we had to deal with a pending build for this purpose.
|
||
|
||
2017-05-24 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Opening an analysis task from the queue page is broken
|
||
https://bugs.webkit.org/show_bug.cgi?id=172559
|
||
<rdar://problem/32389708>
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Fix the bug that opening the analysis task page from the queue page results in multiple assertion failures
|
||
as well as the list of test groups in the analysis task page not getting updated.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.prototype.updateSingleton): Because /api/build-requests/ do not include test groups, it's
|
||
possible for testGroup to be dynamically updated upon loading an analysis task page. Update _testGroup in
|
||
such instances instead of asserting that it doesn't happen.
|
||
|
||
* public/v3/models/data-model.js:
|
||
(DataModelObject.cachedFetch): Because various code to create model objects from the result of a JSON API
|
||
modify the fetched content in irreversible manner, e.g. `object.platform = Platform.findById(object.platform)`
|
||
we must return a fresh new content each time even if the result had been cached.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.prototype.platform): Return this._platform as that's not available.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage):
|
||
(AnalysisTaskPage.prototype._resetVariables): Extracted from the constructor.
|
||
(AnalysisTaskPage.prototype.updateFromSerializedState): Reset all instance variables when opening a new
|
||
analysis task page. This would avoid showing the stale result even when fetching new test groups had failed.
|
||
|
||
* unit-tests/test-groups-tests.js: Added a test case for fetching the same test group twice. This used to hit
|
||
a problem in BuildRequest.constructBuildRequestsFromData which overrode platform property of each raw content
|
||
with a Platform model object because in the case of a cached fetch, we end up trying to look up the platform
|
||
again using the result of stringifying the Platform object instead of the platform ID included in the original
|
||
fetched content.
|
||
(sampleTestGroup): Added "platform" as included in the JSON API's response now.
|
||
|
||
2017-05-24 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
The commit log viewer can overlap the analysis results viewer
|
||
https://bugs.webkit.org/show_bug.cgi?id=172534
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Allocate the padding on the right for the commit log viewer, and add a horizontal scrollbar
|
||
to the analysis results viewer instead of letting it expand beneath the commit log viewer.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskResultsPane.htmlTemplate):
|
||
(AnalysisTaskResultsPane.cssTemplate):
|
||
|
||
2017-05-24 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Sycning script build fix after r217378.
|
||
|
||
* tools/sync-buildbot.js:
|
||
(syncLoop):
|
||
|
||
2017-05-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add the support for perf try bots to sync-buildbot.js
|
||
https://bugs.webkit.org/show_bug.cgi?id=172529
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Make sync-buildbot.js schedule an A/B testing job with a patch or roots to buildbot.
|
||
|
||
Change the buildbot property format in the syncing script's configuration again to use a dictionary
|
||
with a single key of "revision", "patch", or "roots" to specify a revision, a patch, or a set of roots,
|
||
and simplified the structure of the configuration by always having "types" and "builders", and
|
||
make each entry in "configurations" refer to a list of types, platforms, and builders.
|
||
|
||
Since now there are build requests to build patches and run tests, "configurations" has been renamed to
|
||
"testConfigurations" and "buildConfigurations" have been added. Each entry in "buildConfigurations"
|
||
specifies a list of platforms and builders. Similarly in repository group configurations, the buildbot
|
||
properties for testing is now specified as "testProperties" and ones for building a patch is specified
|
||
in newly introduced "buildProperties".
|
||
|
||
* public/api/build-requests.php:
|
||
(update_builds): When a build request to build a patch fails, mark all subsequent requests as failed
|
||
since there is no way to run tests without a successful build.
|
||
|
||
* public/api/update-triggerable.php:
|
||
(main): Re-generate manifest.json after updating the triggerable. The lack of this re-generation was
|
||
the reason we had to manually GET /api/manifest in api-update-triggerable-tests.js.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.prototype.hasCompleted): Added.
|
||
|
||
* public/v3/models/manifest.js:
|
||
(Manifest.reset): Added. Extracted from MockData.resetV3Models in unit-tests/mock-data.js and
|
||
syncLoop in tools/sync-buildbot.js
|
||
(Manifest.fetch): Reset V3 models before fetching the manifest. This eliminates the need to manually
|
||
reset V3 models in syncLoop.
|
||
|
||
* public/v3/models/uploaded-file.js:
|
||
(UploadedFile.prototype.url): Use RemoteAPI.url to get the full URL instead of just a path.
|
||
|
||
* public/v3/remote.js:
|
||
(BrowserRemoteAPI.prototype.url): Added. Constructs the full URL.
|
||
|
||
* server-tests/api-update-triggerable-tests.js:
|
||
(.refetchManifest): Deleted. Now that /api/manifest re-generates manifest.json, we can simply call
|
||
Manifest.fetch instead.
|
||
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.resetV3Models): Calls Manifest.reset().
|
||
(MockData.addMockConfiguration): Extracted from addMockData.
|
||
(MockData.addMockData): Updated per the format change.
|
||
(MockData.mockTestSyncConfigWithSingleBuilder): Ditto.
|
||
(MockData.mockTestSyncConfigWithTwoBuilders): Ditto.
|
||
(MockData.runningBuild): Make buildNumber specifiable.
|
||
(MockData.finishedBuild): Ditto.
|
||
|
||
* server-tests/tools-buildbot-triggerable-tests.js: Updated configurations per the format change.
|
||
Now that now acceptsCustomRoots() for "system-and-webkit" must be true since we can't have a
|
||
repository group that which accepts a patch and not take roots.
|
||
|
||
* server-tests/tools-sync-buildbot-integration-tests.js: Added.
|
||
(createTriggerable): Added.
|
||
(createTestGroupWihPatch): Added.
|
||
(uploadRoot): Added.
|
||
(.assertAndResolveRequest): Added.
|
||
(.assertTestBuildHasFailed): Added.
|
||
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotSyncer): Added. _type as an instance variable to identify whether this buildbot builder
|
||
is a "builder" which builds a patch, builder, or a "tester" which runs a test. Also renamed
|
||
_testConfigurations to _configurations.
|
||
(BuildbotSyncer.prototype.addTestConfiguration): Assert that either the type of this syncer hasn't
|
||
been set or it's a tester.
|
||
(BuildbotSyncer.prototype.testConfigurations): Return [] when it's a builder.
|
||
(BuildbotSyncer.prototype.addBuildConfiguration): Added. Adds a platform to a builder.
|
||
(BuildbotSyncer.prototype.buildConfigurations): Added. Returns the list of configurations if this
|
||
syncer is a builder. Otherwise returns [].
|
||
(BuildbotSyncer.prototype.isTester): Added.
|
||
(BuildbotSyncer.prototype.matchesConfiguration):
|
||
(BuildbotSyncer.prototype._propertiesForBuildRequest): Updated to support the new format.
|
||
(BuildbotSyncer._loadConfig): Ditto. Optionally parse buildConfigurations.
|
||
(BuildbotSyncer._resolveBuildersWithPlatforms): Added. For each test or build configuration entry,
|
||
creates the list of configurations per builder and platform.
|
||
(BuildbotSyncer._parseRepositoryGroup): Added the support for parsing the new format with revision,
|
||
roots, and patch option types with a lot of validations as we're seeing a bit of combinatorial
|
||
explosion in the number of things that can go wrong. Also parse buildProperties optionally.
|
||
(BuildbotSyncer._parseRepositoryGroupPropertyTemplate): Added. A helper function to parse a set of
|
||
buildbot properties, validates its content, and invokes a callback if it's an dynamically resolved
|
||
type such as "revision" and "patch".
|
||
(BuildbotSyncer._validateAndMergeConfig): Updated per the format change. No longer allows "types",
|
||
"type", "platforms", and "platform" as they're explicity resolved in _resolveBuildersWithPlatforms.
|
||
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype.syncOnce):
|
||
(BuildbotTriggerable.prototype._validateRequests): Handle the case when a build request is not
|
||
associated with any test.
|
||
(BuildbotTriggerable.prototype._nextRequestInGroup): Return null when there is a build request to
|
||
build a patch which has not been completed (pending, scheduled, running, or failed). Since all
|
||
requests to build a patch has a negative order, those requests should all show up at the beginning.
|
||
(BuildbotTriggerable.prototype._scheduleRequestIfSlaveIsAvailable): Pick a new buildbot syncer when
|
||
scheduling the first request to build a patch or the first request to run a test. The first request
|
||
to run a test will always have order of 0, so it's a sufficient condition to find such a request.
|
||
On the other hand, the first request to build a patch can have a negative order number so we must
|
||
explicitly check if it's the first item in the ordered list of requests in the test group.
|
||
|
||
* tools/remote-server-relay.log: Added.
|
||
|
||
* tools/sync-buildbot.js:
|
||
(syncLoop): Fixed a bug we were not re-fetching the triggerable after updating the triggerable so
|
||
that Triggerable and related objects we have in the memory may not reflect what we just synced to
|
||
the perf dashboard. Also, we don't reset V3 models manually any more since Manifest.fetch does that.
|
||
|
||
* unit-tests/buildbot-syncer-tests.js: Added more test cases and updated existing test cases to test
|
||
exception messages explicitly since allowing any exception was resulting in some tests passing a
|
||
result of unrelated parsing error being thrown, etc...
|
||
(sampleiOSConfig): Updated per the format change.
|
||
(sampleiOSConfigWithExpansions): Ditto.
|
||
(smallConfiguration): Ditto.
|
||
|
||
2017-05-22 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Fix the bug that sometimes analysis task results pane is missing.
|
||
https://bugs.webkit.org/show_bug.cgi?id=172404
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
AnalysisTaskPage._didFetchTask and AnalaysisTaskPage._fetchRelatedInfoForTaskId should be called in order.
|
||
The race between those two functions causes the analysis task results pane sometimes missing.
|
||
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer.prototype.render): Fix the bug in r217173 that commitSet can be undefined.
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype.updateFromSerializedState): Use arrow function to get rid of self variable.
|
||
Use `const` instead of var for constant variable. And call _didFetchTask before calling _fetchRelatedInfoForTaskId.
|
||
(AnalysisTaskPage.prototype._renderTaskNameAndStatus):
|
||
(AnalysisTaskPage.cssTemplate):
|
||
|
||
2017-05-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add a commit log viewer next to the analysis results viewer
|
||
https://bugs.webkit.org/show_bug.cgi?id=172399
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Add a commit log viewer next to the analysis results viewer, which visualizes the A/B testing results.
|
||
|
||
Also linkify the revisions in the table that shows the status of each A/B testing job,
|
||
and allow the prefix of "r" when associating a Subversion revision.
|
||
|
||
Finally, Fixed a bug that the list of commits associated with the analysis task were not re-rendered
|
||
when the list was updated by the user.
|
||
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer): Added _selectorRadioButtonList as an instance variable. It's a list of radio
|
||
buttons to select a configuration (A/B) with a commit set. It's added to update the checked status of
|
||
radio buttons upon changing the currently selected test group.
|
||
(AnalysisResultsViewer.prototype.setTestGroups): Update the selected range to that of the currently
|
||
selected group.
|
||
(AnalysisResultsViewer.prototype.render): Fill _selectorRadioButtonList with radio buttons.
|
||
|
||
* public/v3/components/commit-log-viewer.js:
|
||
(CommitLogViewer): Added _showRepositoryName as an instance variable.
|
||
(CommitLogViewer.prototype.setShowRepositoryName): Added.
|
||
(CommitLogViewer.prototype.render): Hide the repository name when _showRepositoryName is false. This
|
||
is used in the newly added commit log viewer for the analysis results since we're showing a select
|
||
element with all the names of repositories above this component.
|
||
|
||
* public/v3/components/test-group-revision-table.js:
|
||
(TestGroupRevisionTable.prototype._buildCommitCell): Linkify the revisions if possible.
|
||
|
||
* public/v3/models/analysis-task.js:
|
||
(AnalysisTask.prototype.associateCommit): Strip "r" at the beginning for a Subversion like r12345
|
||
since that's the format we use to show to the user. This makes copy & paste easier.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskResultsPane): Added a bunch of new instance variables to show and update the commit log
|
||
viewer next to the analysis results viewer.
|
||
(AnalysisTaskResultsPane.prototype.setPoints): Create the list of repositories to show details.
|
||
(AnalysisTaskResultsPane.prototype.didConstructShadowTree): Re-render when the current selected test
|
||
group changes since that may have updated the selected range for A/B testing. Also re-render when
|
||
a new repository is selected to show details.
|
||
(AnalysisTaskResultsPane.prototype.render): Update the list of repositories and the commit log viewer.
|
||
(AnalysisTaskResultsPane.prototype._renderRepositoryList): Renders the list of repositories.
|
||
(AnalysisTaskResultsPane.prototype._updateCommitViewer): Updates the commit log viewer given the range
|
||
selected in the analysis results viewer.
|
||
(AnalysisTaskResultsPane.htmlTemplate): Updated the template.
|
||
(AnalysisTaskResultsPane.cssTemplate): Ditto.
|
||
(AnalysisTaskTestGroupPane.cssTemplate): Add a little space between the list of results and the table
|
||
of A/B testing jobs with revisions.
|
||
(AnalysisTaskPage.prototype.render): Fixed the bug that the list of commits associated with the task
|
||
is not updated when the list changes the task or the start point never changed when the list of commits
|
||
associated with the task changed. Make the lazily evaluated function compare the actual list of commits
|
||
so that it will invoke _renderCauseAndFixes when the list changes.
|
||
(AnalysisTaskPage.prototype._renderCauseAndFixes): Now renders a specific list.
|
||
|
||
2017-05-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Another build fix. Added a missing null check.
|
||
|
||
* public/v3/components/custom-analysis-task-configurator.js:
|
||
(CustomAnalysisTaskConfigurator.prototype._setUploadedFilesIfEmpty):
|
||
|
||
2017-05-14 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Added a missing null check.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskConfiguratorPane.prototype.setTestGroups):
|
||
|
||
2017-05-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Remove the code for old syncing script configuration in BuildbotSyncer
|
||
https://bugs.webkit.org/show_bug.cgi?id=171963
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Removed the code for specifying {"root": ~}, {"rootOptions": [~]}, and {"rootsExcluding": [~]} in buildbot
|
||
properties in the syncing script's configurations since they are no longer used after r215061.
|
||
|
||
Also removed the support for using "arguments" as an alias to "properties", and updated the tests accordingly.
|
||
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotSyncer._parseRepositoryGroup): Removed the unused code.
|
||
(BuildbotSyncer._validateAndMergeConfig): Just allow string values in properties.
|
||
(BuildbotSyncer._validateAndMergeProperties): Deleted.
|
||
|
||
* unit-tests/buildbot-syncer-tests.js:
|
||
(sampleiOSConfig): Use "properties" instead of "arguments" to specify the buildbot properties.
|
||
(sampleiOSConfigWithExpansions): Ditto.
|
||
|
||
2017-05-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Another build fix after r215633 to make the bar graphs render even when the confidence intervals aren't available.
|
||
|
||
* public/v3/components/bar-graph-group.js:
|
||
(BarGraphGroup.prototype._computeRange):
|
||
|
||
2017-05-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r215633.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.prototype._computeRequestedCommitSets):
|
||
(TestGroup.prototype.requestsForCommitSet):
|
||
|
||
2017-05-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add API to upload a patched build for a custom A/B testing
|
||
https://bugs.webkit.org/show_bug.cgi?id=171956
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added /api/upload-root to upload a root file, the build product of a patch associated with a commit set.
|
||
|
||
Extracted more functions out of privileged-api/upload-file.php to uploaded-file-helpers.php to share code
|
||
with /api/upload-root.php.
|
||
|
||
* public/api/upload-root.php: Added.
|
||
(main):
|
||
(compute_commit_set_items_to_update): Find the list of commit set items to associate this root with.
|
||
A root can be associated with multiple repositories and there fore commit set items; e.g. if a software
|
||
is built from multiple repositories and there is a patch associated with one of them, the built product
|
||
must be associated with all those repositories.
|
||
|
||
* public/include/build-requests-fetcher.php:
|
||
(BuildRequestsFetcher::fetch_commits_for_set_if_needed): Include the root file is there is one.
|
||
|
||
* public/include/json-header.php:
|
||
(validate_arguments): Added the support for validating json string.
|
||
(verify_slave): Return the slave ID found.
|
||
|
||
* public/include/uploaded-file-helpers.php:
|
||
(validate_uploaded_file): Extracted from /privileged-api/upload-file to be shared with /api/upload-root.
|
||
(query_total_file_size): Ditto.
|
||
(create_uploaded_file_from_form_data): Ditto.
|
||
(upload_file_in_transaction): Ditto. Takes a lambda to do the extra work inside the transaction.
|
||
|
||
* public/privileged-api/upload-file.php:
|
||
(main):
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.constructBuildRequestsFromData): Resolve the rootFIle of each commit set item.
|
||
|
||
* public/v3/models/commit-set.js:
|
||
(CommitSet): Added _repositoryToRootMap and _allRootFiles as instance variables.
|
||
(CommitSet.prototype.updateSingleton): Added. Previously, each commit set's states never changed after
|
||
its creation. After this patch, each item can be newly associated with a root so we must update its
|
||
_repositoryToRootMap and _allRootFiles. For simplicity, we update all states.
|
||
(CommitSet.prototype._updateFromObject): Extracted from the constructor.
|
||
(CommitSet.prototype.allRootFiles): Added. Includes custom roots and roots created for patches.
|
||
(CommitSet.prototype.rootForRepository): Added.
|
||
(CommitSet.prototype.equals): Fixed the bug that we were comparing _repositoryToPatchMap to
|
||
_repositoryToCommitMap, and added a check for _repositoryToRootMap.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.prototype.task): Added.
|
||
(TestGroup.createWithTask):
|
||
(TestGroup.createWithCustomConfiguration):
|
||
(TestGroup.createAndRefetchTestGroups):
|
||
(TestGroup._fetchTestGroupsForTask): Deleted. Now fetchForTask takes a boolean argument: ignoreCache.
|
||
(TestGroup.findAllByTask): Added.
|
||
(TestGroup.fetchForTask): Renamed from fetchByTask.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype._fetchRelatedInfoForTaskId):
|
||
|
||
* server-tests/api-build-requests-tests.js:
|
||
|
||
* server-tests/api-upload-root-tests.js: Added. Added tests for /api/upload-root.
|
||
(makeReport): Added.
|
||
(addSlaveAndCreateRootFile): Added.
|
||
(createTestGroupWihPatch): Added.
|
||
|
||
* server-tests/privileged-api-create-test-group-tests.js:
|
||
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.sharedRepositoryId): Added.
|
||
(MockData.addMockData): Added "Shared" repository along with commits.
|
||
|
||
2017-05-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Rename server-tests/api-update-triggerable.js to server-tests/api-update-triggerable-tests.js
|
||
https://bugs.webkit.org/show_bug.cgi?id=171905
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
* server-tests/api-update-triggerable-tests.js: Renamed from server-tests/api-update-triggerable.js.
|
||
|
||
2017-04-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add the support for scheduling a A/B testing with a patch.
|
||
https://bugs.webkit.org/show_bug.cgi?id=171209
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added the support for creating a custom test group with a patch applied.
|
||
|
||
First, each repository in a repository group has a boolean indicating whether a given repository can have
|
||
a patch applied or not. When any configuration in a test group contains a patch, we create build requests
|
||
without a test specified in order to "build" those patches. These build requests have negative order numbers
|
||
to differentiate them from regular build requests. We can't simply build ones with patches since there could
|
||
be differences in SDK, build options, etc... when patches are applied.
|
||
|
||
The JSON format for commit sets returned by /api/build-requests have been changed from using an array of
|
||
commit IDs to an array of dictionaries indicate commit and acceptsPatch boolean. /api/update-triggerable now
|
||
uses a dictionary with two keys: repository and acceptsPatch to specify a set of repositories associated with
|
||
a repository group, and /privileged-api-create-test-group uses a dictionary with two keys: revision and patch
|
||
instead of a revision string to specify commit sets.
|
||
|
||
Furthermore, the syncing script's configuration have been updated to use a dictionary of repository names to
|
||
an options dictionary instead of an array of repositories names. For now, the only supported option is
|
||
acceptsPatch but will be extended when we add the support for rolling back system components.
|
||
e.g. {"WebKit": {acceptsPatch: true}, "macOS": {}} instead of ["WebKit", "macOS"]
|
||
|
||
On the UI side, InstantFileUploader has been changed to accept only one file by default, and added a new method
|
||
allowMultipleFiles() to allow multiple files to be selected for custom roots. Also replaced the input element
|
||
with type=file by a button with a custom label to show labels such as "Apply a patch" or "Add a new root"
|
||
instead of the generic label like "choose a file".
|
||
|
||
|
||
* init-database.sql: Added trigrepo_accepts_patch to triggerable_repositories to indicate whether a given
|
||
repository can have a patch applied or not. Made request_test optional in build_requests for when a build
|
||
request is created to build patches. Such a build request have a negative request_order. Updated the related
|
||
constraints accordingly.
|
||
|
||
* public/admin/triggerables.php: Added the support for updating whether a given repository can have a patch
|
||
applied in each repository group. Only show the repositories in the repository group for this purpose since
|
||
there is no way to accept a patch on a repository without it being a part of the group.
|
||
(generate_repository_form): Now takes the markup for checkboxes instead of generating one itself.
|
||
(generate_repository_checkboxes): Now takes an array of repositories to generate checkboxes. The checkbox is
|
||
shown when the repository ID exists as a key in this array, and is checked when its value is true. The new
|
||
capability to skip repositories not in the array is used to hide repositories not associated with the group
|
||
in the list of checkboxes to indicate a repository accepts a patch.
|
||
|
||
* public/api/update-triggerable.php:
|
||
(main): Now updates the description and acceptsRoots states of each repository group, and sets acceptsPatch
|
||
boolean for each repository in the group if set in the update.
|
||
(validate_repository_groups): Use a reference to $repository_groups in order to set repository_id_list, which
|
||
contains an array of repository IDs to find the existing repository group that matches the set via
|
||
RepositoryGroupFinder's find_by_repositories. Also added a various validations for acceptsRoots, a dictionary
|
||
specifying repository and acceptsPatch.
|
||
|
||
* public/include/build-requests-fetcher.php:
|
||
(BuildRequestsFetcher::fetch_commits_for_set_if_needed): Instead of returning an array of commit IDs as
|
||
"commits", it now returns an array of dictionaries with "commit" and "patch" keys specifying the commit ID
|
||
and the patch file's ID respectively as "revisionItems".
|
||
(BuildRequestsFetcher::add_uploaded_file): Added. Extracted from fetch_commits_for_set_if_needed. Used to
|
||
add either a patch file or a custom root file in the list of uploaded files in the result.
|
||
|
||
* public/include/manifest-generator.php:
|
||
(fetch_triggerables): Each element in repository group's "repositories" field is now an array of dictionaries
|
||
with "repository" and "acceptsPatch" as keys.
|
||
|
||
* public/include/repository-group-finder.php:
|
||
(RepositoryGroupFinder::__construct): Added a map for boolean indicating whether a given repository group
|
||
allows a patch on a repository. Used in /privileged-api/create-test-group.
|
||
(RepositoryGroupFinder::accepts_patch): Added.
|
||
(RepositoryGroupFinder::populate_map): Build up the map for acceptsPatch boolean per repository per group.
|
||
|
||
* public/privileged-api/create-test-group.php:
|
||
(main): Fixed a bug that we were not explicitly checking for a duplicate test group name (with a test). Create
|
||
build requests to "build" patches if there is any patch file specified.
|
||
(commit_sets_from_revision_sets): Updated to take a dictionary with "revision" and "patch" as keys to specify
|
||
a revision and a patch if any instead of just a revision string for each repository. Also validate that each
|
||
repository is allowed to have a patch once the repository group has been found for the set of repositories.
|
||
(ensure_commit_sets):
|
||
|
||
* public/v3/components/custom-analysis-task-configurator.js:
|
||
(CustomAnalysisTaskConfigurator): Added _patchUploaders as an instance variable, which is a dictionary of
|
||
configuration names to a map of InstantFileUploader's used to upload a patch. Also renamed _fileUploaders to
|
||
_customRootUploaders for clarity.
|
||
(CustomAnalysisTaskConfigurator.prototype.setCommitSets):
|
||
(CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree.createRootUploader): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree):
|
||
(CustomAnalysisTaskConfigurator.prototype._ensurePatchUploader): Added. Creates an instant file uploader for
|
||
patches. We only allow a single patch per repository.
|
||
(CustomAnalysisTaskConfigurator.prototype._computeCommitSet): Include a patch in the commit set as needed.
|
||
(CustomAnalysisTaskConfigurator.prototype._buildRevisionTable): Show the patch file uploader for repositories
|
||
which can have patches in the current repository group.
|
||
(CustomAnalysisTaskConfigurator.cssTemplate): Show borders between every rows instead of just between tbody's
|
||
now that each row can have a patch file uploader.
|
||
|
||
* public/v3/components/instant-file-uploader.js:
|
||
(InstantFileUploader): Added _fileInput and _allowMultipleFiles as instance variables. We now show a button
|
||
in the UI instead of an input with type=file. _fileInput is a hidden input with type=file used inside a click
|
||
event of the button to let the user pick a file.
|
||
(InstantFileUploader.prototype.allowMultipleFiles): Added. Allows this instance to accept multiple files.
|
||
(InstantFileUploader.prototype.didConstructShadowTree): Synthetically click on the hidden input element when
|
||
the newly added button element is clicked to open the browser's file picker.
|
||
(InstantFileUploader.prototype.render): Hide the button to add a file if this instance can only select one file
|
||
and there is already some file being uploaded in this instance.
|
||
(InstantFileUploader.htmlTemplate): Replaced the input element with type=file with a button. Its label comes
|
||
from the default slot content.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest): Made the test optional.
|
||
(BuildRequest.prototype.isBuild): Returns true if this is a build request for building a patch.
|
||
(BuildRequest.prototype.isTest): Returns true if this is a build request for running tests.
|
||
(BuildRequest.constructBuildRequestsFromData): Create each commit log here instead of relying on CommitSet's
|
||
constructor to construct its commit logs. Also updated per the replacement of an array of commit IDs by
|
||
an array of dictionaries with commit and patch properties.
|
||
|
||
* public/v3/models/commit-set.js:
|
||
(CommitSet): Made _repositoryToCommitMap a real Map object. Also added _repositoryToPatchMap. Also got rid of
|
||
the code to instantiate commit logs since that's now done in BuildRequest.constructBuildRequestsFromData.
|
||
(CommitSet.prototype.commitForRepository):
|
||
(CommitSet.prototype.revisionForRepository):
|
||
(CommitSet.prototype.patchForRepository): Added.
|
||
(CommitSet.prototype.latestCommitTime): Modernized the code.
|
||
(CommitSet.prototype.equals): Modernized the code. Also added the check for patches.
|
||
(MeasurementCommitSet): Updated per the change to make _repositoryToCommitMap a real Map.
|
||
(CustomCommitSet.prototype.setRevisionForRepository):
|
||
(CustomCommitSet.prototype.equals): Added the check for patches.
|
||
(CustomCommitSet.prototype.revisionForRepository):
|
||
(CustomCommitSet.prototype.patchForRepository): Added.
|
||
|
||
* public/v3/models/manifest.js:
|
||
(Manifest._didFetchManifest): Updated per the replacement of an array of commit IDs by an array of dictionaries
|
||
with commit and patch properties.
|
||
|
||
* public/v3/models/repository.js:
|
||
(Repository.prototype.ownerId): Renamed from owner for clarity.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup): Modernized the code by using LazilyEvaluatedFunction. Removed _requestsAreInOrder since it's not
|
||
necessary anymore with LazilyEvaluatedFunction.
|
||
(TestGroup.prototype.addBuildRequest):
|
||
(TestGroup.prototype.test): Use the last build request's test since the first few requests could be requests to
|
||
build patches.
|
||
(TestGroup.prototype.platform): Ditto.
|
||
(TestGroup.prototype._lastRequest): Added.
|
||
(TestGroup.prototype._orderedBuildRequests): Added.
|
||
(TestGroup.prototype.repetitionCount): Only count the build requests for testing (skipping any requests to
|
||
build patches).
|
||
(TestGroup.prototype.requestedCommitSets): Simply call _computeRequestedCommitSetsLazily.
|
||
(TestGroup.prototype._computeRequestedCommitSets): Extracted from requestedCommitSets.
|
||
(TestGroup.prototype.requestsForCommitSet):
|
||
(TestGroup.prototype.labelForCommitSet): Rewritten. Just compute the label here instead of relying on
|
||
_commitSetToLabel since requestedSets is always of the length two at the moment.
|
||
(TestGroup._revisionSetsFromCommitSets): Specify both the revision and the patch in the revision set.
|
||
|
||
* public/v3/models/triggerable.js:
|
||
(TriggerableRepositoryGroup): Added _patchAcceptingSet as an instance variable. Use
|
||
sortByNamePreferringOnesWithURL to sort repositories instead of simple sortByName.
|
||
(TriggerableRepositoryGroup.prototype.accepts): Added checks for the custom roots and patches.
|
||
(TriggerableRepositoryGroup.prototype.acceptsPatchForRepository): Added.
|
||
|
||
* server-tests/api-build-requests-tests.js: Updated the test cases per the replacement of an array of commit
|
||
IDs by an array of dictionaries with commit and patch properties.
|
||
|
||
* server-tests/api-manifest-tests.js: Updated the test case per the name of Repository's owner to ownerId.
|
||
|
||
* server-tests/api-update-triggerable.js: Updated the test case per the name of Repository's owner to ownerId,
|
||
and added a test case for updating whether a given repository group allows custom roots as well as patches
|
||
on repositories via /api/update-triggerable.
|
||
(.updateWithOSXRepositoryGroup): Updated the sample syncing script configuration per the format change.
|
||
(.refetchManifest): Added.
|
||
|
||
* server-tests/privileged-api-create-test-group-tests.js: Updated per the syncing script configuration format
|
||
change. Also added a test for creating a test group with a duplicate name, which is expected to fail with
|
||
DuplicateTestGroupName, and creating a test group with a patch both when it's allowed and when it's not allowed
|
||
in the matching repository group.
|
||
(.addTriggerableAndCreateTask): Updated per the format change.
|
||
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.addEmptyTriggerable): Added a metric and its configuration to make it appear in the manifest file.
|
||
The new test case in api-update-triggerable.js requires this.
|
||
(MockData.mockTestSyncConfigWithSingleBuilder): Updated per the syncing script configuration format change.
|
||
(MockData.mockTestSyncConfigWithTwoBuilders): Ditto.
|
||
|
||
* server-tests/tools-buildbot-triggerable-tests.js: Removed the useless assertions about test configurations,
|
||
and added assertions about custom roots and patches in the test case for updateTriggerables.
|
||
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotSyncer._parseRepositoryGroup): Made each assertion explicitly refer to the specific repository group
|
||
to make it more user friendly. Now each repository group uses a dictionary of repository names to its options
|
||
in the syncing script configurations. When parsed, we insert it as an array of dictionaries with repository ID
|
||
and acceptsPatch boolean specified separately since this is the format /api/update-triggerable expects.
|
||
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype.updateTriggerable):
|
||
|
||
* unit-tests/build-request-tests.js:
|
||
(sampleBuildRequestData): Updated per the commit sets format change in /api/build-requests.
|
||
|
||
* unit-tests/buildbot-syncer-tests.js: Updated the existing tests per various format changes and added a couple
|
||
of new test cases for the syncing script's configuration validation.
|
||
(sampleiOSConfig):
|
||
(smallConfiguration):
|
||
(createSampleBuildRequest):
|
||
|
||
* unit-tests/resources/mock-v3-models.js:
|
||
(MockModels.inject): Updated per the repository group format change.
|
||
|
||
* unit-tests/test-groups-tests.js:
|
||
(sampleTestGroup): Updated per the commit sets format change in /api/build-requests.
|
||
|
||
2017-04-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Rename commit_set_relationships to commit_set_items
|
||
https://bugs.webkit.org/show_bug.cgi?id=171143
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Renamed commit_set_relationships to commit_set_items. Also added commitset_patch_file in the preparation to add
|
||
the support for applying patches in custom test groups. To migrate an existing database, run:
|
||
|
||
```sql
|
||
BEGIN;
|
||
ALTER TABLE commit_set_relationships RENAME TO commit_set_items;
|
||
ALTER TABLE commit_set_items ADD COLUMN commitset_patch_file integer REFERENCES uploaded_files;
|
||
ALTER TABLE commit_set_items ADD CONSTRAINT commitset_with_patch_must_have_commit
|
||
CHECK (commitset_patch_file IS NULL OR commitset_commit IS NOT NULL);
|
||
END;
|
||
```
|
||
|
||
* init-database.sql:
|
||
* public/include/build-requests-fetcher.php:
|
||
* public/privileged-api/create-test-group.php:
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.addMockData):
|
||
(MockData.addMockTestGroupWithGitWebKit):
|
||
* tools/js/database.js:
|
||
|
||
2017-04-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add the support for creating a custom test group in the analysis task page
|
||
|
||
Make it possible to create more custom test groups in the analysis task page
|
||
https://bugs.webkit.org/show_bug.cgi?id=171138
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Extracted CustomConfigurationTestGroupForm out of CreateAnalysisTaskPage and added it to AnalysisTaskPage inside
|
||
AnalysisTaskConfiguratorPane. This allows configuration of a new test group within a custom analysis task.
|
||
|
||
* public/privileged-api/create-test-group.php:
|
||
(main): Fixed the bug that the triggerable wasn't resolved when creating a test group in a custom analysis task.
|
||
|
||
* public/v3/components/custom-analysis-task-configurator.js:
|
||
(CustomAnalysisTaskConfigurator.prototype.selectTests): Added. Used by CustomConfigurationTestGroupForm's
|
||
setConfigurations.
|
||
(CustomAnalysisTaskConfigurator.prototype.selectPlatform): Ditto.
|
||
(CustomAnalysisTaskConfigurator.prototype.setCommitSets): Ditto.
|
||
(CustomAnalysisTaskConfigurator.prototype._setUploadedFilesIfEmpty): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._revisionMapFromCommitSet): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype.render): Update the currently selected platforms and tests now that
|
||
they can be set externally via selectTests and selectPlatform.
|
||
(CustomAnalysisTaskConfigurator.prototype._renderTriggerableTests): Return the result of _renderRadioButtonList
|
||
so that the caller can update the currently selected tests without having to reconstruct the list.
|
||
(CustomAnalysisTaskConfigurator.prototype._renderTriggerablePlatforms): Ditto.
|
||
(CustomAnalysisTaskConfigurator.prototype._renderRadioButtonList): Renamed from _buildCheckboxList. Now returns
|
||
a function which updates the currently selected items. We still pretend that multiple items can be selected to
|
||
make it future-proof.
|
||
|
||
* public/v3/components/custom-configuration-test-group-form.js: Added.
|
||
(CustomConfigurationTestGroupForm): Added. Inherits from TestGroupForm. Extracted from CreateAnalysisTaskPage.
|
||
(CustomConfigurationTestGroupForm.prototype.setHasTask): Added.
|
||
(CustomConfigurationTestGroupForm.prototype.hasCommitSets): Added.
|
||
(CustomConfigurationTestGroupForm.prototype.setConfigurations): Added. Used by AnalysisTaskConfiguratorPane to
|
||
set the default configuration to what the latest test group used.
|
||
(CustomConfigurationTestGroupForm.prototype.startTesting): Added. Dispatches "startTesting" action with
|
||
platform, test, taskName in addition to what CustomizedTestGroupForm emits.
|
||
(CustomConfigurationTestGroupForm.prototype.didConstructShadowTree): Added.
|
||
(CustomConfigurationTestGroupForm.prototype.render): Added.
|
||
(CustomConfigurationTestGroupForm.prototype._updateTestGroupName): Added.
|
||
(CustomConfigurationTestGroupForm.cssTemplate): Added.
|
||
(CustomConfigurationTestGroupForm.htmlTemplate): Added.
|
||
|
||
* public/v3/components/test-group-form.js:
|
||
(TestGroupForm.cssTemplate): Make the form display: block.
|
||
|
||
* public/v3/index.html:
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.prototype.test): Added.
|
||
(TestGroup.prototype.platform): Added.
|
||
(TestGroup.createWithCustomConfiguration): Added. Creates a custom test group with an existing analysis task.
|
||
|
||
* public/v3/models/uploaded-file.js:
|
||
(UploadedFile): Fixed a bug that _deletedAt was set to a Date object even when object.deletedAt is null.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskConfiguratorPane): Added.
|
||
(AnalysisTaskConfiguratorPane.prototype.didConstructShadowTree): Added. Dispatch createCustomTestGroup action
|
||
in turn when receiving startTesting from CustomConfigurationTestGroupForm.
|
||
(AnalysisTaskConfiguratorPane.prototype.setTestGroups): Added.
|
||
(AnalysisTaskConfiguratorPane.prototype.render): Added.
|
||
(AnalysisTaskConfiguratorPane.htmlTemplate): Added. We override this instead of formContent to display the
|
||
"Start" button at the end instead of at the beginnning.
|
||
(AnalysisTaskConfiguratorPane.cssTemplate): Added.
|
||
(AnalysisTaskPage.prototype.didConstructShadowTree): Listen to createCustomTestGroup.
|
||
(AnalysisTaskPage.prototype.render): Hide AnalysisTaskConfiguratorPane when the analysis task is not custom.
|
||
(AnalysisTaskPage.prototype._showTestGroup): Let AnalysisTaskConfiguratorPane know of the current test group
|
||
so that it can update the default configuration if the user hasn't modified yet.
|
||
(AnalysisTaskPage.prototype._createCustomTestGroup): Added.
|
||
|
||
* public/v3/pages/create-analysis-task-page.js:
|
||
(CreateAnalysisTaskPage.prototype.didConstructShadowTree):
|
||
(CreateAnalysisTaskPage.prototype._createAnalysisTaskWithGroup):
|
||
(CreateAnalysisTaskPage.prototype.render):
|
||
(CreateAnalysisTaskPage.prototype._renderMessage):
|
||
(CreateAnalysisTaskPage.htmlTemplate):
|
||
(CreateAnalysisTaskPage.cssTemplate):
|
||
|
||
* server-tests/privileged-api-create-test-group-tests.js: Added a test case for creating a custom test group for
|
||
an existing analysis task.
|
||
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.otherPlatformId): Added.
|
||
(MockData.addMockData): Added a test configuration for otherPlatformId.
|
||
|
||
2017-04-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make it possible to view results for sub tests and metrics in A/B testing
|
||
https://bugs.webkit.org/show_bug.cgi?id=170975
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Replaced TestGroupResultsTable, which was a single table that presented the test results with a set of revisions
|
||
each build request used, with TestGroupResultsViewer and TestGroupRevisionTable. TestGroupResultsViewer provides
|
||
an UI to look the results of sub-tests and sub-metrics and TestGroupRevisionTable provides an UI to display
|
||
the set of revisions each build request used. TestGroupRevisionTable can also show the list of custom roots now
|
||
that we've added UI to schedule an analysis task with a custom test group.
|
||
|
||
This patch extends BarGraphGroup to show multiple bars per SingleBarGraph using a canvas with bars indicating
|
||
their mean and confidence interval.
|
||
|
||
* browser-tests/index.html:
|
||
(ChartTest.importChartScripts): Include lazily-evaluated-function.js now that Test model object uses
|
||
LazilyEvaluatedFunction.
|
||
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype._valuesForCommitSet):
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
|
||
|
||
* public/v3/components/bar-graph-group.js:
|
||
(BarGraphGroup): No longer takes formatter. Added _computeRangeLazily and _showLabels as instance variables.
|
||
(BarGraphGroup.prototype.addBar): Now takes a list of values, their labels, mean, confidence interval, and
|
||
the colors of bar graphs shown for each value and the mean indicator.
|
||
(BarGraphGroup.prototype.showLabels): Added.
|
||
(BarGraphGroup.prototype.setShowLabels): Added.
|
||
(BarGraphGroup.prototype.range): Added.
|
||
(BarGraphGroup.prototype._computeRange): Renamed from updateGroupRendering. Now returns the range instead off
|
||
setting it to each bar, and each SingleBarGraph's render function uses the value via BarGraphGroup's range.
|
||
(BarGraph): Renamed from SingleBarGraph. Added various arguments introduced in addBar, and now stores various
|
||
lazily evaluated functions used for rendering.
|
||
(BarGraph.prototype.render): Rewritten to use canvas to draw bar graphs and show a label when group's
|
||
showLabels() returns true.
|
||
(BarGraph.prototype._resizeCanvas): Added.
|
||
(BarGraph.prototype._renderCanvas): Added.
|
||
(BarGraph.prototype._renderLabels): Added. We align the top of each label to the middle of each bar and shift it
|
||
back up by half the height of the label (0.4rem) using margin-top in css.
|
||
(BarGraph.htmlTemplate): Uses a canvas now.
|
||
(BarGraph.cssTemplate):
|
||
|
||
* public/v3/components/results-table.js:
|
||
(ResultsTable.prototype.renderTable): Updated per code changes to BarGraphGroup.
|
||
(ResultsTableRow.prototype.resultContent): Ditto.
|
||
|
||
* public/v3/components/test-group-results-table.js: Removed.
|
||
* public/v3/components/test-group-results-viewer.js: Added.
|
||
(TestGroupResultsViewer): Added. Shows a list of test results with bar graphs with mean and confidence interval
|
||
indicators. The results of sub tests and metrics can be expanded via "(Breakdown)" link shown below each test.
|
||
(TestGroupResultsViewer.prototype.setTestGroup): Added.
|
||
(TestGroupResultsViewer.prototype.setAnalysisResults): Added.
|
||
(TestGroupResultsViewer.prototype.render): Added.
|
||
(TestGroupResultsViewer.prototype._renderResultsTable): Compute the depth of the test tree we show, and construct
|
||
the header rows. Each sub test is "indented" by a new column.
|
||
(TestGroupResultsViewer.prototype._buildRowForTest): Added. Build rows for metrics of the given test. Expand the
|
||
list of its child tests if it's in expandedTests. Otherwise add a link to "Breakdown" if it has any child tests.
|
||
(TestGroupResultsViewer.prototype._buildRowForMetric): Added. Builds rows of table cells to show the results for
|
||
the given metric for each configuration.
|
||
(TestGroupResultsViewer.prototype._buildRowForMetric.createConfigurationRow): Added. A helper to build cells for
|
||
a given configuration represented by a requested commit set.
|
||
(TestGroupResultsViewer.prototype._buildValueMap): Added. Creates a mappting between a requested commit set, and
|
||
the list of values, mean, etc... associated with the results for the commit set.
|
||
(TestGroupResultsViewer.prototype._buildEmptyCells): Added. A helper to create empty cells to indent sub tests.
|
||
(TestGroupResultsViewer.prototype._expandCurrentMetrics): Added. Highlights the current metrics and renders the
|
||
label for each bar in the results.
|
||
(TestGroupResultsViewer.htmlTemplate): Added.
|
||
(TestGroupResultsViewer.cssTemplate): Added.
|
||
|
||
* public/v3/components/test-group-revision-table.js: Added.
|
||
(TestGroupRevisionTable): Added. Renders the list of revisions requested for each test configuration as well as
|
||
ones used in actual testing, and additional repositories being reported (e.g. repositories for helper scripts).
|
||
(TestGroupRevisionTable.prototype.setTestGroup): Added.
|
||
(TestGroupRevisionTable.prototype.setAnalysisResults): Added.
|
||
(TestGroupRevisionTable.prototype.render): Added.
|
||
(TestGroupRevisionTable.prototype._renderTable): Added. The basic algorithm here is to first create a row entry
|
||
object for each build request, merge cells that use the same revision of the same repository, and then render
|
||
the entire table.
|
||
(TestGroupRevisionTable.prototype._buildCommitCell): Added.
|
||
(TestGroupRevisionTable.prototype._buildCustomRootsCell): Added.
|
||
(TestGroupRevisionTable.prototype._mergeCellsWithSameCommitsAcrossRows): Added. Compute rowspan for each cell
|
||
by traversing the rows that use the same revision per repository, and store it in rowCountByRepository while
|
||
adding the repository to each succeeding row's repositoriesToSkip.
|
||
(TestGroupRevisionTable.htmlTemplate): Added.
|
||
(TestGroupRevisionTable.cssTemplate): Added.
|
||
|
||
* public/v3/index.html:
|
||
* public/v3/models/analysis-results.js:
|
||
(AnalysisResults): Added _metricIds and _lazilyComputedHighestTests as instance variables.
|
||
(AnalysisResults.prototype.findResult): Renamed from find.
|
||
(AnalysisResults.prototype.highestTests): Added.
|
||
(AnalysisResults.prototype._computeHighestTests): Added. Finds the root tests for this analysis result.
|
||
(AnalysisResults.prototype.add): Update _metricIds.
|
||
(AnalysisResults.prototype.commitSetForRequest): Added. Returns the reported commit set for the build request.
|
||
This commit set contains the set of revisions reported to /api/report by A/B testers.
|
||
(AnalysisResultsView.prototype.resultForRequest): Renamed from resultForBuildId.
|
||
|
||
* public/v3/models/metric.js:
|
||
(Metric.prototype.relativeName): Added. Computes the relative name given the test/metric path. This function is
|
||
used to determine the label for each test/metric in TestGroupResultsViewer.
|
||
(Metric.prototype.aggregatorLabel): Extracted from label.
|
||
(Metric.prototype.label):
|
||
(Metric.makeFormatter): Added the default value of false to alwaysShowSign.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.prototype.compareTestResults): Now takes a metric instead of retrieving it from the analysis task
|
||
since a custom analysis task may not have a metric associated with it.
|
||
|
||
* public/v3/models/test.js:
|
||
(Test): Added _computePathLazily as an instance variable.
|
||
(Test.prototype.path): Lazily computes the path now that this function can be called on the same test for many
|
||
times in TestGroupResultsViewer while computing relative names of tests and metrics.
|
||
(Test.prototype._computePath): Extracted path.
|
||
(Test.prototype.fullName): Modernized the code.
|
||
(Test.prototype.relativeName): Added.
|
||
|
||
* public/v3/models/uploaded-file.js:
|
||
(UploadedFile):
|
||
(UploadedFile.prototype.deletedAt): Added.
|
||
(UploadedFile.prototype.label): Added.
|
||
(UploadedFile.prototype.url): Added.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskTestGroupPane.prototype.setTestGroups):
|
||
(AnalysisTaskTestGroupPane.prototype.setAnalysisResults): Replaced setAnalysisResultsView. Now takes an
|
||
analysisResults instead of its view.
|
||
(AnalysisTaskTestGroupPane.prototype.render): No longer enqueues the results table and the retry form to render
|
||
since the results table no longer exists, and the retry form re-renders itself as needed.
|
||
(AnalysisTaskTestGroupPane.htmlTemplate): Now uses test-group-results-viewer and test-group-revision-table
|
||
instead of test-group-results-table, which has been removed.
|
||
(AnalysisTaskTestGroupPane.cssTemplate):
|
||
(AnalysisTaskPage.prototype._assignTestResultsIfPossible):
|
||
|
||
* public/v3/pages/create-analysis-task-page.js:
|
||
(CreateAnalysisTaskPage.prototype._createAnalysisTaskWithGroup): Removed superflous console.log's.
|
||
|
||
* tools/js/v3-models.js: Import LazilyEvaluatedFunction now that it's used in the Test model.
|
||
|
||
* unit-tests/test-model-tests.js: Added.
|
||
|
||
2017-04-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Another build fix after r215061. Clear TriggerableRepositoryGroup's static map in each iteration.
|
||
|
||
* tools/sync-buildbot.js:
|
||
(syncLoop):
|
||
|
||
2017-04-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r215061.
|
||
|
||
There was a mismatch between the format updateTriggerable and /api/update-triggerable were using.
|
||
Namely, each repository group was assumed to contain a name field in /api/update-triggerable
|
||
but updateTriggerable was not including that at all.
|
||
|
||
We didn't catch this because the test for updateTriggerable also used the wrong format :(
|
||
|
||
* server-tests/tools-buildbot-triggerable-tests.js:
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype.updateTriggerable):
|
||
|
||
2017-04-14 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Add sub-commit UI in commit log viewer.
|
||
https://bugs.webkit.org/show_bug.cgi?id=170379
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Add an API to return sub-commits for a given commit.
|
||
Add sub-commit difference viewer into commit log viewer to show changed sub-commits between two commits.
|
||
Add 'ownsSubCommits' info in 'api/commits' return values.
|
||
Extend 'api/manifest' to include whether a repositories owns other repositories.
|
||
Only show this sub-commit difference viewer when a repository owns other repositories and both commits owns sub-commits.
|
||
Add unit tests for those new features.
|
||
|
||
* browser-tests/commit-log-viewer-tests.js: Updated test cases.
|
||
* public/api/commits.php: Added 'sub-commits' to provide sub-commit for a given commit.
|
||
* public/include/commit-log-fetcher.php: Added function to query sub-commit from database. Added 'repository' and 'ownsSubCommits' fields in returning commits.
|
||
* public/v3/components/expand-collapse-button.js: Added.
|
||
(ExpandCollapseButton):
|
||
(ExpandCollapseButton.prototype.didConstructShadowTree): Changes state on click and dispatches 'toggle' event.
|
||
(ExpandCollapseButton.sizeFactor):
|
||
(ExpandCollapseButton.buttonContent):
|
||
(ExpandCollapseButton.cssTemplate):
|
||
* public/v3/components/commit-log-viewer.js:
|
||
(CommitLogViewer.prototype._renderCommitList): Added sub-commit viewer if two adjacent commits both have sub-commits.
|
||
(CommitLogViewer.cssTemplate):
|
||
* public/v3/components/sub-commit-viewer.js: Added.
|
||
(SubCommitViewer): Added 'SubCommitViewer' class to represent the sub-commit differences between two given commits.`
|
||
(SubCommitViewer.prototype.didConstructShadowTree): Makes 'expand-collapse' button listen to 'toggle' event.
|
||
(SubCommitViewer.prototype._toggleVisibility): Updates UI once 'expand-collapse' button is clicked.
|
||
(SubCommitViewer.prototype.render): Render sub-commit view based on the state.
|
||
(SubCommitViewer.prototype._renderSubcommitTable): Generates sub-commits difference table entries.
|
||
(SubCommitViewer.htmlTemplate):
|
||
(SubCommitViewer.cssTemplate):
|
||
* public/v3/index.html: Added 'sub-commit-viewer.js' and 'expand-collapse-button.js'.
|
||
* public/v3/models/commit-log.js:
|
||
(CommitLog): Added '_subCommits'.
|
||
(CommitLog.prototype.updateSingleton): Updates 'rawData.ownsSubCommits' as well.
|
||
(CommitLog.prototype.ownsSubCommits):
|
||
(CommitLog.prototype.subCommits): Added. Returns sub-commits.
|
||
(CommitLog.prototype.fetchSubCommits): Added. Fetches sub-commits if haven't fetched them before.
|
||
(CommitLog.prototype._buildSubCommitMap): Added. Creates a map which maps repositories to commits.
|
||
(CommitLog.diffSubCommits): Added. Finds difference between two given commits.
|
||
(CommitLog.fetchBetweenRevisions): Updated due to '_constructFromRawData' change.
|
||
(CommitLog.fetchForSingleRevision): Updated due to '_constructFromRawData' change.
|
||
(CommitLog._constructFromRawData): Removed first argument 'repository' as it can be determined by calling 'Repository.findById'.
|
||
* public/v3/models/repository.js:
|
||
(Repository):
|
||
(Repository.prototype.owner): Returns the owner id.
|
||
(Repository.prototype.ownedRepositories): Returns a list of repositories owned by this repository.
|
||
* server-tests/api-commits-tests.js: Added tests for 'sub-commits' filter.
|
||
* server-tests/api-manifest-tests.js: Added a test.
|
||
* unit-tests/commit-log-tests.js: Added tests for 'fetchSubCommits' and 'diffSubCommits'.
|
||
* unit-tests/resources/mock-v3-models.js: Added 'ownerRepository' and 'ownedRepository'.
|
||
|
||
2017-04-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Retrying an A/B testing does not set the repetition count in some cases
|
||
https://bugs.webkit.org/show_bug.cgi?id=170695
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
When selecting an existing A/B test group, the analysis task page automatically sets the repetition count
|
||
of its retry to be that of the original test group. However, this information wasn't being passed correctly
|
||
to the code that actually created a test group. As a result, the retried test group's repetition count does
|
||
not match that of the original group or the number shown to the user on UI.
|
||
|
||
Fixed the bug by updating this._repetitionCount in setRepetitionCount.
|
||
|
||
* browser-tests/index.html:
|
||
* browser-tests/test-group-form-tests.js: Added. Added tests.
|
||
(.createTestGroupFormWithContext): Added.
|
||
* public/v3/components/test-group-form.js:
|
||
(TestGroupForm.prototype.setRepetitionCount):
|
||
(TestGroupForm.formContent):
|
||
(TestGroupForm):
|
||
|
||
2017-04-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add the UI for scheduling a A/B testing with a custom root
|
||
https://bugs.webkit.org/show_bug.cgi?id=170622
|
||
|
||
Reviewed by Anders Carlsson.
|
||
|
||
This patch adds the support for creating a new analysis task with a custom darwinup roots. A follow up patch
|
||
would update the syncing script to schedule such an A/B testing job to a buildbot instance.
|
||
|
||
|
||
* ReadMe.md: Updated instructions for backing up and restoring the database so that it's easier to replace
|
||
the file path for the backup.
|
||
|
||
* init-database.sql: Make task_platform and task_metric optional in each analysis task. Also added a column
|
||
to store the root file in commit_set_relationships.
|
||
|
||
* public/api/build-requests.php:
|
||
(main): Include the uploaded files.
|
||
|
||
* public/api/commits.php:
|
||
(main): Added the support for querying the latest commits for a given platform. This is used in a new page
|
||
to create a custom analysis task to autofill the latest revisions for a given platform.
|
||
|
||
* public/api/test-groups.php:
|
||
(main): Include the uploaded files.
|
||
|
||
* public/include/build-requests-fetcher.php:
|
||
(BuildRequestsFetcher::__construct): Added a list of uploaded_files and a map from its id.
|
||
(BuildRequestsFetcher::uploaded_files): Added.
|
||
(BuildRequestsFetcher::fetch_commits_for_set_if_needed): Added the support for including custom roots' id in
|
||
each commit set, and inserting its meta data in the list of uplaoded files.
|
||
|
||
* public/include/commit-log-fetcher.php:
|
||
(CommitLogFetcher::fetch_latest_for_platform): Added. Finds the latest commit for a given platform. Ideally,
|
||
we should be finding the latest commit for a given platform, but this is very slow so instead find the commit
|
||
of the latest build for a given platform.
|
||
|
||
* public/privileged-api/create-test-group.php:
|
||
(main): Added the support for creating an analysis task along with a group.
|
||
(commit_sets_from_revision_sets): Added the support for custom roots. Verify the specified uploaded file exists
|
||
and include it in commit_set_relationships. Because commits and upload files are stored in a different column
|
||
in commit_set_relationships, this function now stores the information for each row of commit_set_relationships
|
||
except the commit set ID, which is unknown until the set is created, instead of a commit ID.
|
||
(ensure_commit_sets): Made the each entry in a commit set a row instead of a commit ID as done. As this format
|
||
is only by v2 UI and detect-changes.js, we don't add the support for specifying custom roots here.
|
||
|
||
* public/privileged-api/upload-file.php:
|
||
(main): Fixed a typo. Also added one more error check.
|
||
|
||
* public/v3/components/custom-analysis-task-configurator.js: Added. The UI for selecting a test, a platform,
|
||
and a set of revisions, as well as custom roots for a custom A/B testing job. The first set of revision with
|
||
custom roots is referred as "baseline", and the second configuration is referred as "comparison" in this class.
|
||
(CustomAnalysisTaskConfigurator):
|
||
(CustomAnalysisTaskConfigurator.prototype.tests): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype.platform): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype.commitSets): Added. Returns a pair of baseline and comparsion if both
|
||
have been configured by the user.
|
||
(CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._configureComparison): Added. Called when the user is to configu the
|
||
"comparison" configuration.
|
||
(CustomAnalysisTaskConfigurator.prototype.render): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._renderTriggerableTests): Added. Renders the list of top-level tests
|
||
that can be scheduled by a triggerable.
|
||
(CustomAnalysisTaskConfigurator.prototype._renderTriggerablePlatforms): Added. Renders the list of platforms
|
||
that can be schedule with the currently selected list of tests by a triggerable. Note that the current UI only
|
||
lets the user select a single test but the intent is to allow multiple tests to be selected in the near future.
|
||
(CustomAnalysisTaskConfigurator.prototype._buildCheckboxList): Added. Creates a list of radio boxes to select
|
||
an item with a callback for each. It automatically sets "selected" class on the selected item. It's used to
|
||
render both the list of tests and platforms.
|
||
(CustomAnalysisTaskConfigurator.prototype._updateTriggerable): Added. Finds the triggerable for a given list of
|
||
tests and platforms. Returns an error when some tests belong to another triggearalbe.
|
||
(CustomAnalysisTaskConfigurator.prototype._updateRepositoryGroups): Added. Finds a repository group to use when
|
||
the current triggerable has changed. We try to use the repository group of the same name if there is any, and
|
||
defaults to the first repository group if there is none. This allows the set of repositories to be specified to
|
||
more or less persist across different triggerables. For example, if iOS platforms and Mac platforms use two
|
||
distinct triggerables , and both triggerables have two repository groups: one that only specify the OS and the
|
||
other that specifies both teh OS and WebKit revision, then this code allows the choice the user had made to
|
||
specify either just the OS or the OS and WebKit will be preserved when the user switches from an iOS platform
|
||
to a Mac platform.
|
||
(CustomAnalysisTaskConfigurator.prototype._updateCommitSetMap): Added. Create a commit set map, the format that
|
||
TestGroup.createWithTask accepts given "baseline" and "comparison" commit sets. Pretend "comparison" is not set
|
||
if two sets are identical since it makes no sense to schedule an A/B testing job when A and B are identical.
|
||
(CustomAnalysisTaskConfigurator.prototype._computeCommitSet): Added. Creates a commit set using the revisions
|
||
and the csutom roots the user had specified.
|
||
(CustomAnalysisTaskConfigurator.prototype._renderRepositoryPanes): Added. Renders the pane to specify revisions
|
||
and custom roots for "baseline" and "comparison".
|
||
(CustomAnalysisTaskConfigurator.prototype._renderBaselineRevisionTable): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._renderComparisonRevisionTable): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._optionalRepositoryList): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._buildRevisionTable): Added. Creates a table for specifying revisions
|
||
and custom roots along with a list of repository groups to pick. The set of repositories and custom roots are
|
||
shown at the all if all repository groups require them. Otherwise, they are grouped at the bottom as optional.
|
||
(CustomAnalysisTaskConfigurator.prototype._buildRepositoryGroupList): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._selectRepositoryGroup): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._buildRevisionInput): Added. Creates an input element to specify
|
||
a revision for a given repository. Autofills it with the latest commit for the currently selected platform if
|
||
the user had not modified the field by the time the revisions are fetched.
|
||
(CustomAnalysisTaskConfigurator.htmlTemplate): Added.
|
||
(CustomAnalysisTaskConfigurator.cssTemplate): Added.
|
||
|
||
* public/v3/components/instant-file-uploader.js: Added. A form to upload a custom darwinup root in "baseline"
|
||
or "comparison" configurations of CustomAnalysisTaskConfigurator. It's "instant" because it auto-detects when a
|
||
file to be uploaded had already been uploaded elsewhere by checking its SHA-256 hash.
|
||
(InstantFileUploader):
|
||
(InstantFileUploader.prototype.hasFileToUpload): Added.
|
||
(InstantFileUploader.prototype.uploadedFiles): Added.
|
||
(InstantFileUploader.prototype.addUploadedFile): Added. It's called on the uploader for "comparison"
|
||
configuration when the uploader for "baseline" configuration dipsatches "uploadedFile" action to automatically
|
||
mirror the newly uploaded custom root to "comparision" configuration.
|
||
(InstantFileUploader.prototype.didConstructShadowTree): Added.
|
||
(InstantFileUploader.prototype.render): Added.
|
||
(InstantFileUploader.prototype._renderUploadedFiles): Added. Renders the list of the uploaded files.
|
||
(InstantFileUploader.prototype._renderPreuploadFiles): Added. Renders the list of the files to be uploaded with
|
||
a progress bar.
|
||
(InstantFileUploader.prototype._updateUploadStatus): Added. Updates the progress bar for uploading the file.
|
||
(InstantFileUploader.prototype._formatUploadError): Added.
|
||
(InstantFileUploader.prototype._didFileInputChange): Added. Called when the user picks a file to uploaded on
|
||
the input element. Fetch the meta data for the uploaded file with the same SHA-256 hash if there is any, and
|
||
start uploading the file if there isn't one.
|
||
(InstantFileUploader.prototype._removeUploadedFile): Added.
|
||
(InstantFileUploader.prototype._didUploadFile): Added. Move a file from the list of files to be uploaded to
|
||
the list of uploaded files.
|
||
(InstantFileUploader.htmlTemplate): Added.
|
||
(InstantFileUploader.cssTemplate): Added.
|
||
|
||
* public/v3/index.html:
|
||
|
||
* public/v3/models/analysis-task.js:
|
||
(AnalysisTask): Made platform and metric optional as it is now.
|
||
(AnalysisTask.findByPlatformAndMetric): Skip analysis tasks without a platform or a metric.
|
||
(AnalysisTask.prototype.isCustom): Added. Returns true for a custom analysis task.
|
||
(AnalysisTask.fetchRelatedTasks): Skip custom analysis tasks.
|
||
(AnalysisTask._constructAnalysisTasksFromRawData): Construct analysis tasks even if they were missing a metric
|
||
or a platform instead of silently skipping them.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.constructBuildRequestsFromData): Construct uploaded file objects returned by /api/build-requests.
|
||
|
||
* public/v3/models/commit-log.js:
|
||
(CommitLog.fetchLatestCommitForPlatform): Added.
|
||
|
||
* public/v3/models/commit-set.js:
|
||
(CommitSet): Added this._customRoots.
|
||
(CommitSet.prototype.customRoots): Returns this._customRoots.
|
||
(CommitSet.prototype.equals): Returns false when the set of custom roots are not equal.
|
||
(CommitSet.areCustomRootsEqual): Added.
|
||
(CustomCommitSet):
|
||
(CustomCommitSet.prototype.equals): Added.
|
||
(CustomCommitSet.prototype.customRoots): Added.
|
||
(CustomCommitSet.prototype.addCustomRoot): Added.
|
||
|
||
* public/v3/models/manifest.js:
|
||
(Manifest._didFetchManifest): Store fileUploadSizeLimit in the manifest as UploadedFile.fileUploadSizeLimit.
|
||
This allows a file size check in the client size instead of uploading it to the server and receiving an error.
|
||
|
||
* public/v3/models/metric.js:
|
||
(Metric.formatTime): Moved from ChartPaneStatusView to be also used by InstantFileUploader._renderUploadedFiles.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.prototype.createWithTask): Added.
|
||
(TestGroup.prototype.createAndRefetchTestGroups):
|
||
(TestGroup.prototype._revisionSetsFromCommitSets): Added. Extracted from createAndRefetchTestGroups.
|
||
(TestGroup.prototype._fetchTestGroupsForTask): Added. Extracted from createAndRefetchTestGroups.
|
||
|
||
* public/v3/models/triggerable.js:
|
||
(Triggerable.triggerablePlatformsForTests): Added.
|
||
(Triggerable.sortByNamePreferringSmallerRepositories): Added.
|
||
|
||
* public/v3/models/uploaded-file.js:
|
||
(UploadedFile.prototype.createdAt): Added.
|
||
(UploadedFile.prototype.filename): Added.
|
||
(UploadedFile.prototype.author): Added.
|
||
(UploadedFile.prototype.size): Added.
|
||
(UploadedFile.uploadFile): Added a client-side check for the file size using UploadedFile.fileUploadSizeLimit.
|
||
(UploadedFile.fetchUnloadedFileWithIdenticalHash): Ditto. Also fixed a bug that 404 was resulting in a rejected
|
||
promise instead of a resolved promise with null.
|
||
|
||
* public/v3/pages/analysis-category-page.js:
|
||
(AnalysisCategoryPage.prototype._reconstructTaskList): Modernized the code. Added the support for platform and
|
||
metric being null for some analysis tasks.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype._didFetchTask): Don't fetch the measurement set or create a chart for custom tasks.
|
||
(AnalysisTaskPage.prototype.render): Don't display the charts or the stacking table for custom tasks.
|
||
(AnalysisTaskPage.prototype._renderTaskNameAndStatus): Don't try to show the full test name for custom tasks
|
||
since it's not associated with exactly one pair.
|
||
|
||
* public/v3/pages/chart-pane-status-view.js:
|
||
(ChartPaneStatusView.prototype._renderBuildRevisionTable):
|
||
(ChartPaneStatusView.prototype._formatTime): Moved to Metric.formatTime.
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane.prototype._analyzeRange): Set inProgress to true to hide CustomAnalysisTaskConfigurator in
|
||
CreateAnalysisTaskPage when creating a non-custom analysis task for a specific range.
|
||
|
||
* public/v3/pages/create-analysis-task-page.js:
|
||
(CreateAnalysisTaskPage): This page now shows CustomAnalysisTaskConfigurator by default, and lets a user create
|
||
a custom analysis task by picking a test, a platform, and a set of revisions and custom darwinup roots.
|
||
(CreateAnalysisTaskPage.prototype.updateFromSerializedState): Show a message when inProgress is set. This is
|
||
the old behavior of this page.
|
||
(CreateAnalysisTaskPage.prototype.didConstructShadowTree): Added.
|
||
(CreateAnalysisTaskPage.prototype._createAnalysisTaskWithGroup): Added.
|
||
(CreateAnalysisTaskPage.prototype.render):
|
||
(CreateAnalysisTaskPage.prototype._renderMessage): Added. Hides CustomAnalysisTaskConfigurator and the select
|
||
element to specify the numebr of iterations when a message is set.
|
||
(CreateAnalysisTaskPage.htmlTemplate):
|
||
(CreateAnalysisTaskPage.cssTemplate):
|
||
|
||
* public/v3/pages/page-router.js:
|
||
(PageRouter.prototype.route): Always enqueue the page to re-render when the route has changed.
|
||
|
||
* server-tests/api-build-requests-tests.js: Updated test cases now that the response contains a list of
|
||
uploaded files associated with build requests.
|
||
|
||
* server-tests/privileged-api-create-test-group-tests.js: Added test cases for creating a custom analysis task
|
||
and a test group with custom roots.
|
||
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.addMockData): Updated the mock data to satisfy new constraint on analysis-tasks table.
|
||
|
||
* tools/js/remote.js: Include global.FormData from form-data.js.
|
||
|
||
* unit-tests/build-request-tests.js:
|
||
(sampleBuildRequestData): Updated the mock response.
|
||
* unit-tests/buildbot-syncer-tests.js:
|
||
(createSampleBuildRequest): Ditto.
|
||
* unit-tests/test-groups-tests.js:
|
||
(sampleTestGroup): Ditto.
|
||
|
||
2017-04-10 Commit Queue <commit-queue@webkit.org>
|
||
|
||
Unreviewed, rolling out r215202.
|
||
https://bugs.webkit.org/show_bug.cgi?id=170694
|
||
|
||
Committed incorrectly (Requested by rniwa on #webkit).
|
||
|
||
Reverted changeset:
|
||
|
||
"Add the UI for scheduling a A/B testing with a custom root"
|
||
https://bugs.webkit.org/show_bug.cgi?id=170622
|
||
http://trac.webkit.org/changeset/215202
|
||
|
||
2017-04-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add the UI for scheduling a A/B testing with a custom root
|
||
https://bugs.webkit.org/show_bug.cgi?id=170622
|
||
|
||
Reviewed by Anders Carlsson.
|
||
|
||
This patch adds the support for creating a new analysis task with a custom darwinup roots. A follow up patch
|
||
would update the syncing script to schedule such an A/B testing job to a buildbot instance.
|
||
|
||
|
||
* ReadMe.md: Updated instructions for backing up and restoring the database so that it's easier to replace
|
||
the file path for the backup.
|
||
|
||
* init-database.sql: Make task_platform and task_metric optional in each analysis task. Also added a column
|
||
to store the root file in commit_set_relationships.
|
||
|
||
* public/api/build-requests.php:
|
||
(main): Include the uploaded files.
|
||
|
||
* public/api/commits.php:
|
||
(main): Added the support for querying the latest commits for a given platform. This is used in a new page
|
||
to create a custom analysis task to autofill the latest revisions for a given platform.
|
||
|
||
* public/api/test-groups.php:
|
||
(main): Include the uploaded files.
|
||
|
||
* public/include/build-requests-fetcher.php:
|
||
(BuildRequestsFetcher::__construct): Added a list of uploaded_files and a map from its id.
|
||
(BuildRequestsFetcher::uploaded_files): Added.
|
||
(BuildRequestsFetcher::fetch_commits_for_set_if_needed): Added the support for including custom roots' id in
|
||
each commit set, and inserting its meta data in the list of uplaoded files.
|
||
|
||
* public/include/commit-log-fetcher.php:
|
||
(CommitLogFetcher::fetch_latest_for_platform): Added. Finds the latest commit for a given platform. Ideally,
|
||
we should be finding the latest commit for a given platform, but this is very slow so instead find the commit
|
||
of the latest build for a given platform.
|
||
|
||
* public/privileged-api/create-test-group.php:
|
||
(main): Added the support for creating an analysis task along with a group.
|
||
(commit_sets_from_revision_sets): Added the support for custom roots. Verify the specified uploaded file exists
|
||
and include it in commit_set_relationships. Because commits and upload files are stored in a different column
|
||
in commit_set_relationships, this function now stores the information for each row of commit_set_relationships
|
||
except the commit set ID, which is unknown until the set is created, instead of a commit ID.
|
||
(ensure_commit_sets): Made the each entry in a commit set a row instead of a commit ID as done. As this format
|
||
is only by v2 UI and detect-changes.js, we don't add the support for specifying custom roots here.
|
||
|
||
* public/privileged-api/upload-file.php:
|
||
(main): Fixed a typo. Also added one more error check.
|
||
|
||
* public/v3/components/custom-analysis-task-configurator.js: Added. The UI for selecting a test, a platform,
|
||
and a set of revisions, as well as custom roots for a custom A/B testing job. The first set of revision with
|
||
custom roots is referred as "baseline", and the second configuration is referred as "comparison" in this class.
|
||
(CustomAnalysisTaskConfigurator):
|
||
(CustomAnalysisTaskConfigurator.prototype.tests): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype.platform): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype.commitSets): Added. Returns a pair of baseline and comparsion if both
|
||
have been configured by the user.
|
||
(CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._configureComparison): Added. Called when the user is to configu the
|
||
"comparison" configuration.
|
||
(CustomAnalysisTaskConfigurator.prototype.render): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._renderTriggerableTests): Added. Renders the list of top-level tests
|
||
that can be scheduled by a triggerable.
|
||
(CustomAnalysisTaskConfigurator.prototype._renderTriggerablePlatforms): Added. Renders the list of platforms
|
||
that can be schedule with the currently selected list of tests by a triggerable. Note that the current UI only
|
||
lets the user select a single test but the intent is to allow multiple tests to be selected in the near future.
|
||
(CustomAnalysisTaskConfigurator.prototype._buildCheckboxList): Added. Creates a list of radio boxes to select
|
||
an item with a callback for each. It automatically sets "selected" class on the selected item. It's used to
|
||
render both the list of tests and platforms.
|
||
(CustomAnalysisTaskConfigurator.prototype._updateTriggerable): Added. Finds the triggerable for a given list of
|
||
tests and platforms. Returns an error when some tests belong to another triggearalbe.
|
||
(CustomAnalysisTaskConfigurator.prototype._updateRepositoryGroups): Added. Finds a repository group to use when
|
||
the current triggerable has changed. We try to use the repository group of the same name if there is any, and
|
||
defaults to the first repository group if there is none. This allows the set of repositories to be specified to
|
||
more or less persist across different triggerables. For example, if iOS platforms and Mac platforms use two
|
||
distinct triggerables , and both triggerables have two repository groups: one that only specify the OS and the
|
||
other that specifies both teh OS and WebKit revision, then this code allows the choice the user had made to
|
||
specify either just the OS or the OS and WebKit will be preserved when the user switches from an iOS platform
|
||
to a Mac platform.
|
||
(CustomAnalysisTaskConfigurator.prototype._updateCommitSetMap): Added. Create a commit set map, the format that
|
||
TestGroup.createWithTask accepts given "baseline" and "comparison" commit sets. Pretend "comparison" is not set
|
||
if two sets are identical since it makes no sense to schedule an A/B testing job when A and B are identical.
|
||
(CustomAnalysisTaskConfigurator.prototype._computeCommitSet): Added. Creates a commit set using the revisions
|
||
and the csutom roots the user had specified.
|
||
(CustomAnalysisTaskConfigurator.prototype._renderRepositoryPanes): Added. Renders the pane to specify revisions
|
||
and custom roots for "baseline" and "comparison".
|
||
(CustomAnalysisTaskConfigurator.prototype._renderBaselineRevisionTable): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._renderComparisonRevisionTable): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._optionalRepositoryList): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._buildRevisionTable): Added. Creates a table for specifying revisions
|
||
and custom roots along with a list of repository groups to pick. The set of repositories and custom roots are
|
||
shown at the all if all repository groups require them. Otherwise, they are grouped at the bottom as optional.
|
||
(CustomAnalysisTaskConfigurator.prototype._buildRepositoryGroupList): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._selectRepositoryGroup): Added.
|
||
(CustomAnalysisTaskConfigurator.prototype._buildRevisionInput): Added. Creates an input element to specify
|
||
a revision for a given repository. Autofills it with the latest commit for the currently selected platform if
|
||
the user had not modified the field by the time the revisions are fetched.
|
||
(CustomAnalysisTaskConfigurator.htmlTemplate): Added.
|
||
(CustomAnalysisTaskConfigurator.cssTemplate): Added.
|
||
|
||
* public/v3/components/instant-file-uploader.js: Added. A form to upload a custom darwinup root in "baseline"
|
||
or "comparison" configurations of CustomAnalysisTaskConfigurator. It's "instant" because it auto-detects when a
|
||
file to be uploaded had already been uploaded elsewhere by checking its SHA-256 hash.
|
||
(InstantFileUploader):
|
||
(InstantFileUploader.prototype.hasFileToUpload): Added.
|
||
(InstantFileUploader.prototype.uploadedFiles): Added.
|
||
(InstantFileUploader.prototype.addUploadedFile): Added. It's called on the uploader for "comparison"
|
||
configuration when the uploader for "baseline" configuration dipsatches "uploadedFile" action to automatically
|
||
mirror the newly uploaded custom root to "comparision" configuration.
|
||
(InstantFileUploader.prototype.didConstructShadowTree): Added.
|
||
(InstantFileUploader.prototype.render): Added.
|
||
(InstantFileUploader.prototype._renderUploadedFiles): Added. Renders the list of the uploaded files.
|
||
(InstantFileUploader.prototype._renderPreuploadFiles): Added. Renders the list of the files to be uploaded with
|
||
a progress bar.
|
||
(InstantFileUploader.prototype._updateUploadStatus): Added. Updates the progress bar for uploading the file.
|
||
(InstantFileUploader.prototype._formatUploadError): Added.
|
||
(InstantFileUploader.prototype._didFileInputChange): Added. Called when the user picks a file to uploaded on
|
||
the input element. Fetch the meta data for the uploaded file with the same SHA-256 hash if there is any, and
|
||
start uploading the file if there isn't one.
|
||
(InstantFileUploader.prototype._removeUploadedFile): Added.
|
||
(InstantFileUploader.prototype._didUploadFile): Added. Move a file from the list of files to be uploaded to
|
||
the list of uploaded files.
|
||
(InstantFileUploader.htmlTemplate): Added.
|
||
(InstantFileUploader.cssTemplate): Added.
|
||
|
||
* public/v3/index.html:
|
||
|
||
* public/v3/models/analysis-task.js:
|
||
(AnalysisTask): Made platform and metric optional as it is now.
|
||
(AnalysisTask.findByPlatformAndMetric): Skip analysis tasks without a platform or a metric.
|
||
(AnalysisTask.prototype.isCustom): Added. Returns true for a custom analysis task.
|
||
(AnalysisTask.fetchRelatedTasks): Skip custom analysis tasks.
|
||
(AnalysisTask._constructAnalysisTasksFromRawData): Construct analysis tasks even if they were missing a metric
|
||
or a platform instead of silently skipping them.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.constructBuildRequestsFromData): Construct uploaded file objects returned by /api/build-requests.
|
||
|
||
* public/v3/models/commit-log.js:
|
||
(CommitLog.fetchLatestCommitForPlatform): Added.
|
||
|
||
* public/v3/models/commit-set.js:
|
||
(CommitSet): Added this._customRoots.
|
||
(CommitSet.prototype.customRoots): Returns this._customRoots.
|
||
(CommitSet.prototype.equals): Returns false when the set of custom roots are not equal.
|
||
(CommitSet.areCustomRootsEqual): Added.
|
||
(CustomCommitSet):
|
||
(CustomCommitSet.prototype.equals): Added.
|
||
(CustomCommitSet.prototype.customRoots): Added.
|
||
(CustomCommitSet.prototype.addCustomRoot): Added.
|
||
|
||
* public/v3/models/manifest.js:
|
||
(Manifest._didFetchManifest): Store fileUploadSizeLimit in the manifest as UploadedFile.fileUploadSizeLimit.
|
||
This allows a file size check in the client size instead of uploading it to the server and receiving an error.
|
||
|
||
* public/v3/models/metric.js:
|
||
(Metric.formatTime): Moved from ChartPaneStatusView to be also used by InstantFileUploader._renderUploadedFiles.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.prototype.createWithTask): Added.
|
||
(TestGroup.prototype.createAndRefetchTestGroups):
|
||
(TestGroup.prototype._revisionSetsFromCommitSets): Added. Extracted from createAndRefetchTestGroups.
|
||
(TestGroup.prototype._fetchTestGroupsForTask): Added. Extracted from createAndRefetchTestGroups.
|
||
|
||
* public/v3/models/triggerable.js:
|
||
(Triggerable.triggerablePlatformsForTests): Added.
|
||
(Triggerable.sortByNamePreferringSmallerRepositories): Added.
|
||
|
||
* public/v3/models/uploaded-file.js:
|
||
(UploadedFile.prototype.createdAt): Added.
|
||
(UploadedFile.prototype.filename): Added.
|
||
(UploadedFile.prototype.author): Added.
|
||
(UploadedFile.prototype.size): Added.
|
||
(UploadedFile.uploadFile): Added a client-side check for the file size using UploadedFile.fileUploadSizeLimit.
|
||
(UploadedFile.fetchUnloadedFileWithIdenticalHash): Ditto. Also fixed a bug that 404 was resulting in a rejected
|
||
promise instead of a resolved promise with null.
|
||
|
||
* public/v3/pages/analysis-category-page.js:
|
||
(AnalysisCategoryPage.prototype._reconstructTaskList): Modernized the code. Added the support for platform and
|
||
metric being null for some analysis tasks.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype._didFetchTask): Don't fetch the measurement set or create a chart for custom tasks.
|
||
(AnalysisTaskPage.prototype.render): Don't display the charts or the stacking table for custom tasks.
|
||
(AnalysisTaskPage.prototype._renderTaskNameAndStatus): Don't try to show the full test name for custom tasks
|
||
since it's not associated with exactly one pair.
|
||
|
||
* public/v3/pages/chart-pane-status-view.js:
|
||
(ChartPaneStatusView.prototype._renderBuildRevisionTable):
|
||
(ChartPaneStatusView.prototype._formatTime): Moved to Metric.formatTime.
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane.prototype._analyzeRange): Set inProgress to true to hide CustomAnalysisTaskConfigurator in
|
||
CreateAnalysisTaskPage when creating a non-custom analysis task for a specific range.
|
||
|
||
* public/v3/pages/create-analysis-task-page.js:
|
||
(CreateAnalysisTaskPage): This page now shows CustomAnalysisTaskConfigurator by default, and lets a user create
|
||
a custom analysis task by picking a test, a platform, and a set of revisions and custom darwinup roots.
|
||
(CreateAnalysisTaskPage.prototype.updateFromSerializedState): Show a message when inProgress is set. This is
|
||
the old behavior of this page.
|
||
(CreateAnalysisTaskPage.prototype.didConstructShadowTree): Added.
|
||
(CreateAnalysisTaskPage.prototype._createAnalysisTaskWithGroup): Added.
|
||
(CreateAnalysisTaskPage.prototype.render):
|
||
(CreateAnalysisTaskPage.prototype._renderMessage): Added. Hides CustomAnalysisTaskConfigurator and the select
|
||
element to specify the numebr of iterations when a message is set.
|
||
(CreateAnalysisTaskPage.htmlTemplate):
|
||
(CreateAnalysisTaskPage.cssTemplate):
|
||
|
||
* public/v3/pages/page-router.js:
|
||
(PageRouter.prototype.route): Always enqueue the page to re-render when the route has changed.
|
||
|
||
* server-tests/api-build-requests-tests.js: Updated test cases now that the response contains a list of
|
||
uploaded files associated with build requests.
|
||
*server-tests/api-commits-tests.js: Added a test case for /api/commits/<repository-name>/latest?platform=X.
|
||
* server-tests/privileged-api-create-test-group-tests.js: Added test cases for creating a custom analysis task
|
||
and a test group with custom roots.
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.addMockData): Updated the mock data to satisfy new constraint on analysis-tasks table. Also inserted
|
||
more commits, builds, and build_commits rows for testing /api/commits/<repository-name>/latest?platform=X.
|
||
|
||
* tools/js/remote.js: Include global.FormData from form-data.js.
|
||
|
||
* unit-tests/analysis-task-tests.js: Added a test for calling findByPlatformAndMetric when there is a custom
|
||
analysis task.
|
||
(sampleAnalysisTask): Removed the category since /api/analysis-tasks/ no longer generate this property.
|
||
(sampleCustomAnalysisTask): Added.
|
||
* unit-tests/build-request-tests.js:
|
||
(sampleBuildRequestData): Updated the mock response. Added a test case for fetcing custom roots.
|
||
* unit-tests/buildbot-syncer-tests.js:
|
||
(createSampleBuildRequest): Ditto.
|
||
* unit-tests/test-groups-tests.js:
|
||
(sampleTestGroup): Ditto.
|
||
|
||
2017-04-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make cycler page scroll down when a dashboard is too tall for the current viewport size
|
||
https://bugs.webkit.org/show_bug.cgi?id=170588
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Updated the cycler page to scroll down smoothly over 500ms and scroll up again before moving to the next page
|
||
when a dashboard page is too tall to be shown at once. For now, we assume that each dashboard's height is no
|
||
more than 2x the height of the viewport.
|
||
|
||
* public/cycler.html:
|
||
|
||
2017-04-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Each build request should be associated with a repository group
|
||
https://bugs.webkit.org/show_bug.cgi?id=170528
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Make the buildbot syncing script use the concept of repository groups so that each repository group can post
|
||
a different set of properties to buildbot. In order to do this, we associate each build request with
|
||
a repository group to use. Each triggerable's repository groups is now updated by the syncing scripts via
|
||
/api/update-triggerable just the same way the set of the supported platform, test pairs are updated.
|
||
|
||
Each repository group specifies the list of repositories, a dictionary that maps the buildbot property name
|
||
to either a string value or a repository name enclosed in < and >:
|
||
|
||
```js
|
||
"repositoryGroups": {
|
||
"webkit-svn": {
|
||
"repositories": ["WebKit", "macOS"],
|
||
"properties": {"os": "<macOS>", "wk": "<WebKit>"}
|
||
}
|
||
}
|
||
```
|
||
|
||
With this, removed the support for specifying a repository to use in generic dictionary of properties via
|
||
a dictionary with a single key of "root", "rootOptions", and "rootsExcluding". We now validate that the list of
|
||
repositories in each repository group matches exactly the ones used in buildbot properties as well as ones in
|
||
build requests.
|
||
|
||
After this patch, sync-with-buildbot.js will no longer schedule a build request without a repository group.
|
||
Run the appropriate database queries to set the repository group on each build request. Because of this change,
|
||
this patch also makes BuildbotTriggerable.prototype.syncOnce more robust against invalid build requests.
|
||
Instead of throwing an exception and exiting early, it simply skips all build requests that belong to the same
|
||
test group if the next build request to be scheduled does not specify a repository group.
|
||
|
||
* init-database.sql: Add request_repository_group column to build_requests table, and a unique constraint for
|
||
repository and group pair in triggerable_repositories table.
|
||
|
||
* public/api/update-triggerable.php:
|
||
(main): Validate and insert repository groups.
|
||
(validate_configurations): Extracted from main.
|
||
(validate_repository_groups): Added.
|
||
|
||
* public/v3/models/repository.js:
|
||
(Repository.findTopLevelByName): Added.
|
||
|
||
* public/include/build-requests-fetcher.php:
|
||
(BuildRequestsFetcher::results_internal): Include the repository group of each request in the JSON response.
|
||
|
||
* public/include/repository-group-finder.php: Added. A helper class to find the repository group for a given
|
||
triggerable for a list of repositories.
|
||
(RepositoryGroupFinder): Added.
|
||
(RepositoryGroupFinder::__construct): Added.
|
||
(RepositoryGroupFinder::find_by_repositories): Added.
|
||
(RepositoryGroupFinder::populate_map): Added.
|
||
|
||
* public/privileged-api/create-test-group.php:
|
||
(main): Each element in an array returned by ensure_commit_sets and commit_sets_from_revision_sets now contains
|
||
"set", the list of commit IDs, and "repository_group", the repository group identified for each commit set.
|
||
Use that to set the repository group in each new build request.
|
||
(commit_sets_from_revision_sets): Use RepositoryGroupFinder to find the right repository group.
|
||
(ensure_commit_sets): Ditto. There is no need to find a repository group for each commit set here since its
|
||
argument is keyed by the repository name. e.g. {"WebKit": [123, 456], "macOS": ["16A323", "16A323"]}
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest):
|
||
(BuildRequest.prototype.triggerable): Added.
|
||
(BuildRequest.prototype.repositoryGroup): Added.
|
||
(BuildRequest.constructBuildRequestsFromData): Resolve the triggerable and the repository group.
|
||
|
||
* public/v3/models/triggerable.js:
|
||
(Triggerable.prototype.name): Added.
|
||
(Triggerable.prototype.acceptedRepositories): Deleted.
|
||
(TriggerableRepositoryGroup):
|
||
(TriggerableRepositoryGroup.prototype.accepts): Added. Retruns true if the repository group
|
||
|
||
* server-tests/api-build-requests-tests.js: Added a test for getting the repository group of a build request.
|
||
* server-tests/api-manifest-tests.js: Added assertions for the repository groups.
|
||
* server-tests/api-report-tests.js:
|
||
(.emptyReport):
|
||
(.reportWithTwoLevelsOfAggregations):
|
||
* server-tests/api-update-triggerable.js: Added test cases for updating the repository groups associated with
|
||
a triggerable.
|
||
(.updateWithOSXRepositoryGroup):
|
||
(.mapRepositoriesByGroup):
|
||
* server-tests/privileged-api-create-test-group-tests.js:
|
||
(addTriggerableAndCreateTask): Add two repository groups for testing. Added assertions for repository groups
|
||
in existing test cases, and added a test case for creating a test group with two different repository groups.
|
||
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.resetV3Models): Reset TriggerableRepositoryGroup's static maps.
|
||
(MockData.emptyTriggeragbleId): Added.
|
||
(MockData.macosRepositoryId): Added.
|
||
(MockData.webkitRepositoryId): Added.
|
||
(MockData.gitWebkitRepositoryId): Added.
|
||
(MockData.addMockData): Create repository groups as needed. Renamed the "OS X" repository to "macOS" since some
|
||
tests were using the latter, and now we need mock data to be consistent across tests due to stricter checks.
|
||
(MockData.addEmptyTriggerable): Added. Used in api-update-triggerable.js.
|
||
(MockData.addMockTestGroupWithGitWebKit): Added. Used in api-build-requests-tests.js.
|
||
(MockData.addAnotherMockTestGroup): Cleanup.
|
||
(MockData.mockTestSyncConfigWithSingleBuilder): Updated the mock configuration per code changes.
|
||
(MockData.mockTestSyncConfigWithTwoBuilders): Ditto.
|
||
|
||
* server-tests/tools-buildbot-triggerable-tests.js: Updated a test case testing /api/update-triggerable to test
|
||
updating the set of repository groups in addition to the set of test, platform pairs.
|
||
(.refetchManifest): Added.
|
||
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotSyncer): Now takes a set of configurations shared across syncers: repositoryGroups, slaveArgument,
|
||
and buildRequestArgument as the third argument.
|
||
(BuildbotSyncer.prototype.repositoryGroups): Added.
|
||
(BuildbotSyncer.prototype._testGroupMapForBuildRequests): Cleaned up the code to use Array.prototype.find.
|
||
Also added an assertion that the build request is associated with a repository group.
|
||
(BuildbotSyncer.prototype._propertiesForBuildRequest): Removed the support for using an arbitary property to
|
||
specify a revision in favor of explicity listing each property and repository name in a repository group.
|
||
(BuildbotSyncer._loadConfig): Removed the support for "shared", which specified the set of buildbot properties
|
||
shared across syncers, the name of properties which specifies the build slave name and build request ID. These
|
||
values are not stored as top-level properties and superseded by the concept of repository groups.
|
||
(BuildbotSyncer._parseRepositoryGroup): Parses and validates repository groups.
|
||
(BuildbotSyncer._createTestConfiguration): We no longer expect each configuration to specify a dictionary of
|
||
properties or buildRequestArgument (often inherited from shared).
|
||
(BuildbotSyncer._validateAndMergeConfig): Removed "slaveArgument" and "buildRequestArgument" from the list of
|
||
allowed proeprties in each configuration now that they're specified as top-level properties.
|
||
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype.updateTriggerable): Update the associated repository groups.
|
||
(BuildbotTriggerable.prototype.syncOnce): Skip test groups for which the next build request to be scheduled is
|
||
not included in the list of valid build requests.
|
||
(BuildbotTriggerable.prototype._validateRequests): Now returns the list of valid build requests, which excludes
|
||
those that lack a repository group set.
|
||
(BuildbotTriggerable.prototype._nextRequestInGroup): Extracted from _scheduleRequestIfSlaveIsAvailable. Finds
|
||
the next build request to be scheduled for the test group.
|
||
(BuildbotTriggerable.prototype._scheduleRequestIfSlaveIsAvailable): Renamed from
|
||
_scheduleNextRequestInGroupIfSlaveIsAvailable. Now takes the syncer and the slave name as arguments instead of
|
||
a test group information since syncOnce now calls _nextRequestInGroup to find the next build request.
|
||
|
||
* tools/js/v3-models.js:
|
||
|
||
* unit-tests/build-request-tests.js: Fixed the test name.
|
||
|
||
* unit-tests/buildbot-syncer-tests.js: Removed tests for "rootOptions" and "rootsExcluding", and added tests
|
||
for parsing repository groups.
|
||
(sampleiOSConfig): Updated the mock configuration per code changes.
|
||
(sampleiOSConfigWithExpansions): Ditto.
|
||
(smallConfiguration): Ditto. Now returns the entire configuration instead of a single builder configuration.
|
||
Various test cases have been updated to reflect this.
|
||
(createSampleBuildRequest): Removed the git hash of WebKit to match the repository groups listed in the mock
|
||
configurations. The git hash was there to test "rootOptions", which this patch removed.
|
||
(samplePendingBuild): Removed "root_dict" from the list of properties. This was used to test "rootsExcluding"
|
||
which, again, this patch removed.
|
||
(sampleInProgressBuild): Ditto.
|
||
(sampleFinishedBuild): Ditto.
|
||
|
||
* unit-tests/resources/mock-v3-models.js:
|
||
(MockModels.inject): Added ock repository groups so that existing tests will continue to function.
|
||
|
||
2017-04-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Introduce the notion of repository groups to triggerables
|
||
https://bugs.webkit.org/show_bug.cgi?id=170228
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
On some triggerable, it's desirable to specify multiple sets of repositories that are accepted.
|
||
|
||
For example, if a repository X transitioned from Subversion to Git, and if a triggerable accepted X and
|
||
some other repository Y, then it's desirable to two sets: (X-Subversion, Y) and (X-Git, Y) since neither
|
||
(X-Subversion, X-Git) nor (X-Subversion, X-Git, Y) makes sense as a set.
|
||
|
||
This patch introduces triggerable_repository_groups table to represent a set of repositories accepted by
|
||
a triggerable. It has many to one relationship to build_triggerables and triggerable_repositories in turn
|
||
now has many to one relationship to triggerable_repository_groups instead of build_triggerables.
|
||
|
||
Also make it possible to disable a triggerable e.g. a set of tests and platforms are no longer supported.
|
||
We don't want to delete the triggerable completely from the database since it would result in the associated
|
||
A/B testing results being purged, which is not desirale.
|
||
|
||
To migrate an existing database, run the following transaction:
|
||
```sql
|
||
BEGIN;
|
||
ALTER TABLE build_triggerables ADD COLUMN triggerable_disabled boolean NOT NULL DEFAULT FALSE;
|
||
|
||
CREATE TABLE triggerable_repository_groups (
|
||
repositorygroup_id serial PRIMARY KEY,
|
||
repositorygroup_triggerable integer REFERENCES build_triggerables NOT NULL,
|
||
repositorygroup_name varchar(256) NOT NULL,
|
||
repositorygroup_description varchar(256),
|
||
repositorygroup_accepts_roots boolean NOT NULL DEFAULT FALSE,
|
||
CONSTRAINT repository_group_name_must_be_unique_for_triggerable
|
||
UNIQUE(repositorygroup_triggerable, repositorygroup_name));
|
||
INSERT INTO triggerable_repository_groups (repositorygroup_triggerable, repositorygroup_name)
|
||
SELECT triggerable_id, 'default' FROM build_triggerables;
|
||
|
||
ALTER TABLE triggerable_repositories ADD COLUMN trigrepo_group integer REFERENCES triggerable_repository_groups;
|
||
UPDATE triggerable_repositories SET trigrepo_group = repositorygroup_id FROM triggerable_repository_groups
|
||
WHERE trigrepo_triggerable = repositorygroup_triggerable;
|
||
ALTER TABLE triggerable_repositories ALTER COLUMN trigrepo_group SET NOT NULL;
|
||
|
||
ALTER TABLE triggerable_repositories DROP COLUMN trigrepo_triggerable;
|
||
ALTER TABLE triggerable_repositories DROP COLUMN trigrepo_sub_roots;
|
||
END;
|
||
```
|
||
|
||
* init-database.sql:
|
||
* public/admin/triggerables.php: Use a custom column to make forms to add and configure repository groups.
|
||
(insert_triggerable_repositories): Added.
|
||
(generate_repository_list): Added.
|
||
(generate_repository_form): Added.
|
||
(generate_repository_checkboxes): Now generates checkboxes for a repository group instead of a triggerable.
|
||
|
||
* public/include/manifest-generator.php:
|
||
(fetch_triggerables): Fixed the bug that we were not filtering results with query in /api/triggerable.
|
||
Rewrote it to include an array of repository groups, which in turn contains an array of repositories along
|
||
with its name and a description, and a boolean indicating whether it accepts a custom root file or not.
|
||
The boolean will be used when we're adding the support for perf try bots. We will keep acceptedRepositories
|
||
since it's still used by detect-changes.js.
|
||
|
||
* public/v3/models/manifest.js:
|
||
(Manifest._didFetchManifest): Resolve repositoriy, test, and platform IDs to their respective objects.
|
||
|
||
* public/v3/models/triggerable.js:
|
||
(Triggerable):
|
||
(Triggerable.prototype.isDisabled): Added.
|
||
(Triggerable.prototype.repositoryGroups): Added.
|
||
(Triggerable.prototype.acceptsTest): Added.
|
||
(TriggerableRepositoryGroup): Added.
|
||
(TriggerableRepositoryGroup.prototype.description): Added.
|
||
(TriggerableRepositoryGroup.prototype.acceptsCustomRoots): Added.
|
||
(TriggerableRepositoryGroup.prototype.repositories): Added.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype._didFetchTask): Don't use a disabled triggerable.
|
||
|
||
* server-tests/api-manifest-tests.js: Updated a test case to test repository groups.
|
||
|
||
* tools/js/database.js:
|
||
(tableToPrefixMap): Added triggerable_repository_groups.
|
||
|
||
* tools/js/v3-models.js: Imported TriggerableRepositoryGroup from triggerable.js.
|
||
|
||
2017-03-31 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. For OS versions, we can end up with non-alphanumeric revision.
|
||
Delete the code path only used by the v2 UI since nobody uses that now.
|
||
|
||
* public/api/commits.php:
|
||
(main):
|
||
|
||
2017-03-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
sync-buildbot.js can schedule more than one build per builder
|
||
https://bugs.webkit.org/show_bug.cgi?id=170318
|
||
|
||
Reviewed by Saam Barati.
|
||
|
||
The bug was caused by _scheduleNextRequestInGroupIfSlaveIsAvailable not returning a promise when
|
||
scheduling the first build request of a test group. This resulted in _pullBuildbotOnAllSyncers
|
||
to prematurely resolve before POST'ing new build had finished. That in turn could result in the
|
||
next cycle of syncing to occur before POST'ing has actually taken place.
|
||
|
||
More precisely, when the nextRequest was the first request or its associated syncer object could
|
||
not be identified, we were supposed to find the first available syncer, schedule the request,
|
||
and then return the promise returned by scheduleRequestInGroupIfAvailable. However, the for loop
|
||
which called scheduleRequestInGroupIfAvailable on every syncer was declaring its own variable
|
||
named "promise" thereby shadowing the outer variable, which is returned to the caller.
|
||
|
||
Fixed the bug by not declaring a shadowing variable, and refactored the code. Namely, the only
|
||
reason we had such a complicated logic with two local variables, promise and syncer, was so that
|
||
we could log that we're scheduling a build. Extracted this code as _scheduleRequestWithLog.
|
||
|
||
_scheduleNextRequestInGroupIfSlaveIsAvailable can now simply exit early with a call to
|
||
_scheduleRequestWithLog when the syncer is readily identified. When looping over syncers, it can
|
||
simply return the first non-null result of _scheduleNextRequestInGroupIfSlaveIsAvailable.
|
||
|
||
* server-tests/tools-buildbot-triggerable-tests.js: Added a test case where we wait 10ms after
|
||
receiving the request to POST a build. There should be no new network request until we resolve
|
||
this request.
|
||
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype._scheduleNextRequestInGroupIfSlaveIsAvailable): Fixed the bug.
|
||
(BuildbotTriggerable.prototype._scheduleRequestWithLog): Extracted.
|
||
|
||
2017-03-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Modernize BuildbotSyncer and BuildbotTriggerable
|
||
https://bugs.webkit.org/show_bug.cgi?id=170310
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Modernized the code to use arrow functions and other modern idoms in ES2016.
|
||
|
||
* ReadMe.md: Added instructions on how to run tests, and moved the steps to configure postgres
|
||
above the steps to configure Apache since only the former is needed to run tests.
|
||
* tools/js/buildbot-syncer.js:
|
||
* tools/js/buildbot-triggerable.js:
|
||
|
||
2017-03-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Yet another build fix after r214502. Workaround webkit.org/b/169907 for now.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.cssTemplate):
|
||
|
||
2017-03-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Revert an erronously change in the previous commit.
|
||
|
||
* public/v3/components/base.js:
|
||
|
||
2017-03-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r214280. Don't render components until its element is inserted into a document.
|
||
|
||
* public/v3/components/base.js:
|
||
(ComponentBase):
|
||
|
||
2017-03-29 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Another build fix after r214502.
|
||
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer.prototype.render): this._groupToCellMap.get may not contain the cell when startPoint
|
||
or metric had not been fetched yet even if currentTestGroup is set.
|
||
|
||
2017-03-29 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r214502. Analysis tasks without any test groups are throwing exceptions.
|
||
|
||
* public/v3/components/results-table.js:
|
||
(ResultsTable.prototype.renderTable): Don't show the header row when there are no content to show.
|
||
(ResultsTable.prototype._computeRepositoryList): Return a pair of arrays. The caller expects the repository
|
||
list to be an array, not undefined.
|
||
|
||
2017-03-28 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Modernize AnalysisTaskPage
|
||
https://bugs.webkit.org/show_bug.cgi?id=170165
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Modernized AnalysisTaskPage and related components. The main refactoring happened in AnalysisTaskPage
|
||
from which AnalysisTaskResultsPane and AnalysisTaskTestGroupPane have been extracted.
|
||
|
||
Decoupled BuildRequest from its results. AnalysisResultsViewer and TestGroupResultsTable now stores
|
||
a reference to AnalysisResultsView and Metric to find the results for each build request.
|
||
This refactoring is necessary in order to view results of an arbitrary metric in the future.
|
||
|
||
Also refactored ResultsTable and its subclasses extensively. Instead of making its render() to invoke
|
||
subclass' methods such as buildRowGroups, heading, and additionalHeading, rely on each subclass call
|
||
to invoke renderTable(), renamed from render(), with callbacks to add extra headers and columns.
|
||
|
||
This patch also fixes a number of usability issues found by the user such as changing the test name
|
||
resets the customized revisions by the virtue of the modern code being naturally more correct.
|
||
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer):
|
||
(AnalysisResultsViewer.prototype.setTestGroupCallback): Deleted. Replaced by "testGroupClick" action.
|
||
(AnalysisResultsViewer.prototype.setRangeSelectorLabels): Moved here from ResultsTable since it's
|
||
never used in ResultsTable or TestGroupResultsTable.
|
||
(AnalysisResultsViewer.prototype.selectedRange): Ditto.
|
||
(AnalysisResultsViewer.prototype.setPoints): Now takes metric as the third argument.
|
||
(AnalysisResultsViewer.prototype.setTestGroups): Now takes the current test group.
|
||
(AnalysisResultsViewer.prototype.didUpdateResults): Deleted.
|
||
(AnalysisResultsViewer.prototype.setAnalysisResultsView): Added.
|
||
(AnalysisResultsViewer.prototype.render): Invoke _renderTestGroups lazily. Also simplified the logic
|
||
to find the selected list item. Since we always use a shadow DOM now, we can simply look for an element
|
||
with ".seleted" instead of crafting a unique class name.
|
||
(AnalysisResultsViewer.prototype.renderTestGroups): Renamed from buildRowGroups. Specify callbacks to
|
||
insert headers for A/B radio buttons, which has been moved from ResultsTable.prototype.render, and the
|
||
stacked blocks of testing results.
|
||
(AnalysisResultsViewer.prototype._classForTestGroup): Deleted.
|
||
(AnalysisResultsViewer.prototype._openStackingBlock): Deleted.
|
||
(AnalysisResultsViewer.prototype._expandBetween): Create a new set for expandedPoints to make
|
||
_renderTestGroupsLazily.evaluate do the work.
|
||
(AnalysisResultsViewer._layoutBlocks): Moved from TestGroupStackingGrid.layout.
|
||
(AnalysisResultsViewer._sortBlocksByRow): Moved from AnalysisResultsViewer.TestGroupStackingGrid.
|
||
(AnalysisResultsViewer._insertAfterBlockWithSameRange): Ditto.
|
||
(AnalysisResultsViewer._insertBlockInFirstAvailableColumn): Ditto.
|
||
(AnalysisResultsViewer._createCellsForRow): Ditto.
|
||
|
||
(AnalysisResultsViewer.TestGroupStackingBlock):
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype.addRowIndex):
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype.createStackingCell): No longer creates a unique
|
||
class name here. See the inline comment for AnalysisResultsViewer.prototype.render.
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype.isThin): Deleted. We used to collapse "failed"
|
||
test groups as a thin vertical line, and we wanted to show them next to each other in _layoutBlock but
|
||
we don't do that anymore.
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype._valuesForCommitSet): Added. Uses
|
||
this._analysisResultsView to extract the results for the current metrics.
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
|
||
|
||
* public/v3/components/analysis-task-bug-list.js: Added.
|
||
(AnalysisTaskBugList): Added. Extracted from AnalysisTaskChartPane.
|
||
(AnalysisTaskBugList.prototype.setTask): Added.
|
||
(AnalysisTaskBugList.prototype.didConstructShadowTree): Added.
|
||
(AnalysisTaskBugList.prototype.render): Added.
|
||
(AnalysisTaskBugList.prototype._associateBug): Added.
|
||
(AnalysisTaskBugList.prototype._dissociateBug): Added.
|
||
(AnalysisTaskBugList.htmlTemplate): Added.
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase.htmlTemplate): Added a hook to insert more content at the end in AnalysisTaskChartPane.
|
||
(ChartPaneBase.paneFooterTemplate): Added.
|
||
|
||
* public/v3/components/customizable-test-group-form.js:
|
||
(CustomizableTestGroupForm):
|
||
(CustomizableTestGroupForm.prototype.setCommitSetMap):
|
||
(CustomizableTestGroupForm.prototype.startTesting): Renamed from _submitted. Now dispatches an action
|
||
by the name of "startTesting" instead of calling this._startCallback.
|
||
(CustomizableTestGroupForm.prototype.didConstructShadowTree): Added. Moved the logic to attach event
|
||
handlers here to avoid eagerly creating the shadow tree in the constructor.
|
||
(CustomizableTestGroupForm.prototype._computeCommitSetMap): Use the newly added this._revisionEditorMap
|
||
to find the relevant input element instead of running a querySelector.
|
||
(CustomizableTestGroupForm.prototype.render): Lazily invoke _renderCustomRevisionTable. This avoids
|
||
overriding the customized revisions when the user finally types in the test group name.
|
||
(CustomizableTestGroupForm.prototype._renderCustomRevisionTable): Extracted from render.
|
||
(CustomizableTestGroupForm.prototype._constructRevisionRadioButtons): Made this a non-static method
|
||
since it needs to update this._revisionEditorMap now. Merged _constructRevisionRadioButtons.
|
||
(CustomizableTestGroupForm.prototype._createRadioButton): Deleted. See above.
|
||
(CustomizableTestGroupForm.cssTemplate):
|
||
(CustomizableTestGroupForm.formContent): Use IDs instead of classes to make this.content(ID) work.
|
||
|
||
* public/v3/components/mutable-list-view.js:
|
||
(MutableListView.prototype.setList):
|
||
(MutableListView.prototype.setKindList):
|
||
(MutableListView.prototype.setAddCallback): Deleted. Replaced by "addItem" action.
|
||
(MutableListView.prototype.render):
|
||
(MutableListItem.prototype.content):
|
||
|
||
* public/v3/components/results-table.js:
|
||
(ResultsTable): Removed this._rangeSelectorLabels, this._rangeSelectorCallback, and this._selectedRange
|
||
as they are only used by AnalysisResultsViewer. Also replaced this._valueFormatter by
|
||
this._analysisResultsView which knows a metric.
|
||
(ResultsTable.prototype.setValueFormatter): Deleted.
|
||
(ResultsTable.prototype.setRangeSelectorLabels): Deleted.
|
||
(ResultsTable.prototype.setRangeSelectorCallback): Deleted.
|
||
(ResultsTable.prototype.selectedRange): Deleted.
|
||
(ResultsTable.prototype._rangeSelectorClicked): Deleted.
|
||
(ResultsTable.prototype.setAnalysisResultsView): Added.
|
||
(ResultsTable.prototype.renderTable): Added. Removed the logic to add _rangeSelectorLabels since it has
|
||
been moved to AnalysisResultsViewer.prototype.render inside buildColumns, which also inserts additional
|
||
columns which used to be stored on each ResultsTableRow. Use the same technique to insert additional
|
||
headers. Also take the name (thead tr th) of row header (tbody tr td) as an argument and automatically
|
||
create a table cell of an appropriate colspan.
|
||
(ResultsTable.prototype._createRevisionListCells):
|
||
(ResultsTable.prototype.heading): Deleted. Superseded by buildHeaders callback.
|
||
(ResultsTable.prototype.additionalHeading): Ditto.
|
||
(ResultsTable.prototype.buildRowGroups): Deleted. It is now the responsibility of each subclass to call
|
||
ResultsTable's renderTable() in the subclass' render() function.
|
||
(ResultsTable.prototype._computeRepositoryList): No longer takes extraRepositories as an argument.
|
||
Instead, this function now returns a pair of the repository list and the list of constant commits.
|
||
(ResultsTable.htmlTemplate):
|
||
(ResultsTable.cssTemplate):
|
||
|
||
* public/v3/components/test-group-form.js:
|
||
(TestGroupForm): Avoid eagerly creating the shadow tree. Also removed the removed the dead code.
|
||
(TestGroupForm.prototype.setRepetitionCount): Simply override the value of the select element.
|
||
(TestGroupForm.prototype.didConstructShadowTree): Added. Attach event handlers here to avoid eagerly
|
||
creating the shadow tree in the constructor.
|
||
(TestGroupForm.prototype.startTesting): Renamed from _submitted. Dispatch "startTesting" action instead
|
||
of invoking _startCallback which has been removed.
|
||
(TestGroupForm.htmlTemplate):
|
||
(TestGroupForm.formContent):
|
||
|
||
* public/v3/components/test-group-results-table.js:
|
||
(TestGroupResultsTable):
|
||
(TestGroupResultsTable.prototype.didUpdateResults): Deleted. No longer neeed per setAnalysisResultsView
|
||
in ResultsTable.
|
||
(TestGroupResultsTable.prototype.setTestGroup):
|
||
(TestGroupResultsTable.prototype.heading): Deleted.
|
||
(TestGroupResultsTable.prototype.render):
|
||
(TestGroupResultsTable.prototype._renderTestGroup): Extracted from render.
|
||
(TestGroupResultsTable.prototype._buildRowGroups): Renamed from buildRowGroups.
|
||
(TestGroupResultsTable.prototype._buildRowGroupForCommitSet): Extracted from buildRowGroups.
|
||
(TestGroupResultsTable.prototype._buildComparisonRow): Extracted from buildRowGroups.buildRowGroups
|
||
|
||
* public/v3/index.html: Include analysis-task-bug-list.js.
|
||
|
||
* public/v3/models/analysis-results.js:
|
||
(AnalysisResults): Inverted the map so that we can easily create a view based on metric.
|
||
(AnalysisResults.prototype.find): Ditto.
|
||
(AnalysisResults.prototype.add): Ditto.
|
||
(AnalysisResults.prototype.viewForMetric): Added.
|
||
(AnalysisResults.fetch):
|
||
(AnalysisResultsView): Added.
|
||
(AnalysisResultsView.prototype.metric): Added.
|
||
(AnalysisResultsView.prototype.resultForBuildId): Added.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.result): Deleted.
|
||
(BuildRequest.setResult): Deleted.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup): Removed this._allCommitSets since it was never used.
|
||
(TestGroup.prototype.didSetResult): Deleted since it was never used.
|
||
(TestGroup.prototype.compareTestResults): Now takes an array of measurement set values.
|
||
(TestGroup.prototype._valuesForCommitSet): Deleted.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskChartPane): This class now includes the form to cutomize the revisions.
|
||
(AnalysisTaskChartPane.prototype.setShowForm): Added.
|
||
(AnalysisTaskChartPane.prototype._mainSelectionDidChange):
|
||
(AnalysisTaskChartPane.prototype.didConstructShadowTree): Added. Dispatches "newTestGroup" action when
|
||
the user presses the button to start a new A/B testing from the chart.
|
||
(AnalysisTaskChartPane.prototype.render): Added.
|
||
(AnalysisTaskChartPane.prototype.paneFooterTemplate): Added.
|
||
(AnalysisTaskChartPane.cssTemplate):
|
||
|
||
(AnalysisTaskResultsPane): Added. Encapsulates AnalysisResultsViewer and CustomizableTestGroupForm.
|
||
(AnalysisTaskResultsPane.prototype.setPoints): Added.
|
||
(AnalysisTaskResultsPane.prototype.setTestGroups): Added.
|
||
(AnalysisTaskResultsPane.prototype.setAnalysisResultsView): Added.
|
||
(AnalysisTaskResultsPane.prototype.setShowForm): Added.
|
||
(AnalysisTaskResultsPane.prototype.didConstructShadowTree): Added. Dispatches "newTestGroup" action
|
||
when the user presses the button to start a new A/B testing from the chart.
|
||
(AnalysisTaskResultsPane.prototype.render): Added.
|
||
(AnalysisTaskResultsPane.htmlTemplate): Added.
|
||
(AnalysisTaskResultsPane.cssTemplate): Added.
|
||
|
||
(AnalysisTaskTestGroupPane): Added. Encapsulates TestGroupResultsTable and CustomizableTestGroupForm.
|
||
(AnalysisTaskTestGroupPane.prototype.didConstructShadowTree): Added.
|
||
(AnalysisTaskTestGroupPane.prototype.setTestGroups): Added.
|
||
(AnalysisTaskTestGroupPane.prototype.setAnalysisResultsView): Added.
|
||
(AnalysisTaskTestGroupPane.prototype.render): Added.
|
||
(AnalysisTaskTestGroupPane.prototype._renderTestGroups): Added. Updates the list of test groups. Hide
|
||
the hidden groups unless showHiddenGroups is set. Updates this._testGroupMap so that the visibility of
|
||
groups and their names can be updated without having to re-render the entire list.
|
||
(AnalysisTaskTestGroupPane.prototype._renderTestGroupVisibility): Added.
|
||
(AnalysisTaskTestGroupPane.prototype._renderTestGroupNames): Added.
|
||
(AnalysisTaskTestGroupPane.prototype._renderCurrentTestGroup): Added. Update TestGroupResultsTable with
|
||
the selected test group. Also highlight the list view, and update the hide-unhide toggle button's label
|
||
as needed.
|
||
(AnalysisTaskTestGroupPane.htmlTemplate): Added.
|
||
(AnalysisTaskTestGroupPane.cssTemplate): Added.
|
||
|
||
(AnalysisTaskPage): Deleted a massive number of instance variables. They are now manged by newly added
|
||
AnalysisTaskChartPane, AnalysisTaskResultsPane, and AnalysisTaskTestGroupPane
|
||
(AnalysisTaskPage.prototype.didConstructShadowTree): Added. Attach various event handlers here to avoid
|
||
eagerly creating the shadow tree in the constructor.
|
||
(AnalysisTaskPage.prototype._fetchRelatedInfoForTaskId):
|
||
(AnalysisTaskPage.prototype._didFetchTask): No longer sets the value formatter to the results viewer
|
||
and the results table as they now recieve AnalysisResultsView later in _assignTestResultsIfPossible.
|
||
(AnalysisTaskPage.prototype._didFetchMeasurement): Set the metric to the results viewer.
|
||
(AnalysisTaskPage.prototype._didUpdateTestGroupHiddenState):
|
||
(AnalysisTaskPage.prototype._assignTestResultsIfPossible): Create AnalysisResultsView from the newly
|
||
retrieved AnalysisResults and pass it to AnalysisTaskResultsPane and AnalysisTaskTestGroupPane.
|
||
(AnalysisTaskPage.prototype.render): Dramatically simplified.
|
||
(AnalysisTaskPage.prototype._renderTaskNameAndStatus): Extracted from render.
|
||
(AnalysisTaskPage.prototype._renderRelatedTasks): Ditto.
|
||
(AnalysisTaskPage.prototype._renderCauseAndFixes): Ditto.
|
||
(AnalysisTaskPage.prototype._showTestGroup):
|
||
(AnalysisTaskPage.prototype._updateTaskName): Now takes the new name as an argument.
|
||
(AnalysisTaskPage.prototype._updateTestGroupName): Now takes the new name as the second argument.
|
||
(AnalysisTaskPage.prototype._hideCurrentTestGroup): Now takes the test group to hide.
|
||
(AnalysisTaskPage.prototype._associateCommit): Moved to AnalysisTaskBugList.
|
||
(AnalysisTaskPage.prototype._dissociateCommit): Ditto.
|
||
(AnalysisTaskPage.prototype._retryCurrentTestGroup): Now takes the test group as the first argument.
|
||
(AnalysisTaskPage.prototype._chartSelectionDidChange): Deleted.
|
||
(AnalysisTaskPage.prototype._createNewTestGroupFromChart): Deleted.
|
||
(AnalysisTaskPage.prototype._selectedRowInAnalysisResultsViewer): Deleted.
|
||
(AnalysisTaskPage.prototype._createNewTestGroupFromViewer): Deleted.
|
||
(AnalysisTaskPage.htmlTemplate):
|
||
(AnalysisTaskPage.cssTemplate):
|
||
|
||
* unit-tests/test-groups-tests.js: Updated a test case which was expecting BuildReqeust's result, which
|
||
has been removed, to exist.
|
||
|
||
2017-03-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Share more code between ManifestGenerator and /api/triggerables
|
||
https://bugs.webkit.org/show_bug.cgi?id=169993
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Shared the code to fetch the list of triggerables from the database between ManifestGenerator
|
||
and /api/triggerables.
|
||
|
||
* public/api/triggerables.php:
|
||
(main):
|
||
* public/include/manifest-generator.php:
|
||
(ManifestGenerator::fetch_triggerables): Extracted as a static function. Also include the ID
|
||
in the triggerable data.
|
||
|
||
2017-03-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
create-test-group should allow a different set of repositories to be used in each configuration
|
||
https://bugs.webkit.org/show_bug.cgi?id=169992
|
||
|
||
Rubber-stamped by Antti Koivisto.
|
||
|
||
Added the support for new POST parameter, revisionSets, to /privileged-api/create-test-group.
|
||
This new parameter now specifies an array of repository id to revision dictionaries, and allows
|
||
different set of repositories' revisions to be specified in each dictionary.
|
||
|
||
We keep the old API for v2 UI and detect-changes.js compatibility for now.
|
||
|
||
* public/privileged-api/create-test-group.php:
|
||
(main):
|
||
(commit_sets_from_revision_sets): Added.
|
||
(ensure_commit_sets): Only fetch the top-level repository per r213788 and r213976.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.createAndRefetchTestGroups): Use the newly added revisionSets parameter instead of
|
||
the now depreacted commitSets parameter.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList): Simplified this code
|
||
by simply verifying the consistency of commit sets now that createAndRefetchTestGroups takes
|
||
an array of commit sets instead of a dictionary of repository name to a list of revisions.
|
||
|
||
* server-tests/privileged-api-create-test-group-tests.js: Added test cases for new parameter.
|
||
|
||
2017-03-22 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
/api/uploaded-file should return createdAt as a POSIX timestamp
|
||
https://bugs.webkit.org/show_bug.cgi?id=169980
|
||
|
||
Rubber-stamped by Antti Koivisto.
|
||
|
||
Call Database::to_js_time on createdAt to return it as a POSIX timestamp.
|
||
|
||
* public/include/uploaded-file-helpers.php:
|
||
(format_uploaded_file): Fixed the bug.
|
||
* server-tests/api-manifest-tests.js: Renamed from api-manifest.js.
|
||
* server-tests/api-uploaded-file-tests.js: Renamed from api-uploaded-file.js. Added a test case.
|
||
|
||
2017-03-22 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
UploadedFile should support a callback for upload progress
|
||
https://bugs.webkit.org/show_bug.cgi?id=169977
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Added a new option dictionary to CommonRemoteAPI.sendHttpRequest with uploadProgressCallback
|
||
|
||
Moved request headers and responseHandler callback in NodeRemoteAPI to this dictionary,
|
||
and updated the tests which relied on this code.
|
||
|
||
* public/shared/common-remote.js:
|
||
(CommonRemoteAPI.prototype.postJSON):
|
||
(CommonRemoteAPI.prototype.postJSONWithStatus):
|
||
(CommonRemoteAPI.prototype.postFormData):
|
||
(CommonRemoteAPI.prototype.postFormDataWithStatus):
|
||
* public/v3/privileged-api.js:
|
||
(PrivilegedAPI.prototype.sendRequest):
|
||
* public/v3/remote.js:
|
||
(BrowserRemoteAPI.prototype.sendHttpRequest):
|
||
(BrowserRemoteAPI.prototype.sendHttpRequestWithFormData):
|
||
(BrowserRemoteAPI):
|
||
* server-tests/api-uploaded-file.js:
|
||
* tools/js/remote.js:
|
||
(NodeRemoteAPI.prototype.sendHttpRequest):
|
||
(NodeRemoteAPI.prototype.sendHttpRequestWithFormData):
|
||
(NodeRemoteAPI):
|
||
|
||
2017-03-22 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
ComponentBase should enqueue itself to render when it becomes connected
|
||
https://bugs.webkit.org/show_bug.cgi?id=169905
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
When a component becomes connected to a document, enqueue itself to render automatically.
|
||
Also added the support for boolean attribute to ComponentBase.createElement.
|
||
|
||
* ReadMe.md: Added an instruction to raise the upload limit per r214065.
|
||
* browser-tests/component-base-tests.js: Added tests for the new behavior and createElement. Also moved
|
||
the tests related to enqueueToRenderOnResize out of defineElement tests.
|
||
|
||
* browser-tests/index.html:
|
||
(BrowsingContext.prototype.constructor): Override requestAnimationFrame so that the callback would be
|
||
involved immediately durign testing.
|
||
|
||
* public/v3/components/base.js:
|
||
(ComponentBase): Enqueue itself to render during construction if custom elements is not available.
|
||
(ComponentBase.defineElement):
|
||
(ComponentBase.defineElement.elementClass.prototype.connectedCallback): Enqueue itself to render when
|
||
the component's element became connected.
|
||
(ComponentBase.createElement): Use Array.isArray instead of instanceof to make it work with arrays made
|
||
in other realms (global objects) during testing. Added the support for boolean attributes. Setting an
|
||
attribute value to true would set the attribute, and setting it to false would not set the attribute.
|
||
(ComponentBase.useNativeCustomElements): Added. True iff window.customElements is defined.
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase.prototype.render): No longer need to call enqueueToRender on the commit log viewer.
|
||
|
||
* public/v3/components/commit-log-viewer.js:
|
||
(CommitLogViewer.prototype.render): No longer need to call enqueueToRender on the spinner icon.
|
||
|
||
* public/v3/models/time-series.js:
|
||
(TimeSeries): Made this a proper class declaration now that we don't include data.js after r213300.
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane.prototype._renderActionToolbar): No longer need to call enqueueToRender on the close icon.
|
||
|
||
* public/v3/pages/summary-page.js:
|
||
(SummaryPage.prototype._renderCell): No longer need to call enqueueToRender on the spinner icon.
|
||
|
||
2017-03-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Delete another function that was supposed to be removed in the previous commit.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.cachedRequestsForTriggerableID): Deleted.
|
||
|
||
2017-03-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Modernize BuildRequestQueuePage
|
||
https://bugs.webkit.org/show_bug.cgi?id=169903
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Modernized the code for /v3/#/analysis/queue.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.fetchTriggerables): Deleted since the manifest JSON now contains all the triggerables.
|
||
|
||
* public/v3/pages/build-request-queue-page.js:
|
||
(BuildRequestQueuePage): Deleted this._triggerables. Added this._buildRequestsByTriggerable.
|
||
(BuildRequestQueuePage.prototype.open): Modernized the code.
|
||
(BuildRequestQueuePage.prototype.render): Ditto.
|
||
(BuildRequestQueuePage.prototype._constructBuildRequestTable): Ditto.
|
||
|
||
2017-03-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Charts page show an inconsistent list of revisions for Git and Subversion
|
||
https://bugs.webkit.org/show_bug.cgi?id=169888
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
With Git, CommitLogViewer was showing the list of revisions including the starting hash,
|
||
which was the last data point's revision instead of all revisions after the last data point.
|
||
|
||
Fixed the bug by always specifying the revision at the last data point in both Subversion
|
||
and Git and then making /api/commits/<repository>/?from=X&to=Y exclude the first revision.
|
||
For clarity, "from" and "to" query parameters have been renamed to "precedingRevision" and
|
||
"lastRevision" respectively.
|
||
|
||
We also no longer adds 1 to the starting revision of Subversion-like starting revisions. e.g.
|
||
when the last data point was at r1234, new data point is at r1250, the label is now "r1234-r1250"
|
||
instead of "r1235-r1250".
|
||
|
||
* browser-tests/chart-revision-range-tests.js: Fixed the tests since revisionList no longer
|
||
specifies from/to revisions.
|
||
* browser-tests/commit-log-viewer-tests.js: Added. Added tests for CommitLogViewer.
|
||
* browser-tests/index.html: Include the new test. Also use a local copy of mocha.js/css.
|
||
|
||
* public/api/commits.php:
|
||
(main): Renamed "from" and "to" query parameters.
|
||
|
||
* public/include/commit-log-fetcher.php:
|
||
(CommitLogFetcher::fetch_between): Added a check that commit time should either be specified
|
||
in both rows or not specified in either. Also reject when before_first_revision is identical
|
||
or after last_revision instead of re-ordering them since it no longer makes sense to do so with
|
||
new query parameter names.
|
||
|
||
* public/v3/components/base.js:
|
||
(ComponentBase._addContentToElement): Use Array.isArray instead of instanceof. It's resilient
|
||
againt realm (global object) differences.
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase.prototype._updateCommitLogViewer): No longer calls enqueueToRender on this since
|
||
CommitLogViewer does that on its own now.
|
||
(ChartPaneBase.prototype.render): Juse use this._openRepository instead of relying on CommitLogViewer
|
||
to remember which repository is current. This was the only use of currentRepository.
|
||
|
||
* public/v3/components/commit-log-viewer.js:
|
||
(CommitLogViewer):
|
||
(CommitLogViewer.prototype.currentRepository): Deleted.
|
||
(CommitLogViewer.prototype.view):
|
||
(CommitLogViewer.prototype._fetchCommitLogs): Modernized and extracted from view to make it lazy.
|
||
Call fetchForSingleRevision when precedingRevision is not specified or it's identical to lastRevision
|
||
since the generic JSON API no longer supports being called with the identical revisions.
|
||
(CommitLogViewer.prototype.render): Modernized & simplified the code.
|
||
(CommitLogViewer.prototype._renderCommitList): Extracted from render to make it lazy.
|
||
(CommitLogViewer.htmlTemplate): Add ID on caption & tbody so that they're more easily addressable.
|
||
(CommitLogViewer.cssTemplate):
|
||
|
||
* public/v3/models/commit-log.js:
|
||
(CommitLog.prototype.diff): No longer includes from/to revisions in the result. Also avoid adding
|
||
1 to a Subversion-like starting revision for creating the label. See above. But we still do this
|
||
for forming URLs due to the way tools like Trac work with Subversion revisions.
|
||
(CommitLog.fetchBetweenRevisions): Rewritten using DataModel.prototype.cachedFetch with FIXME for
|
||
what this function is supposed to be doing.
|
||
(CommitLog._cachedCommitLogs): Deleted.
|
||
(CommitLog.fetchForSingleRevision): Added.
|
||
(CommitLog._constructFromRawData): Added.
|
||
|
||
* public/v3/models/data-model.js:
|
||
(DataModelObject.cachedFetch): Don't parse query values as an integer. Just URL-escape them.
|
||
|
||
* public/v3/remote.js:
|
||
(BrowserRemoteAPI.prototype.sendHttpRequest): Fixed a typo.
|
||
|
||
* server-tests/api-commits-tests.js: Renamed from api-commits.js. Updated the existing tests to
|
||
use new query parameters and added more test cases.
|
||
|
||
* unit-tests/commit-log-tests.js: Updated the test cases now that CommitLog.prototype.diff no longer
|
||
includes from/to values. They're computed in ChartRevisionRange instead.
|
||
|
||
2017-03-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix os-build-fetcher.js and subprocess.js to make them work
|
||
https://bugs.webkit.org/show_bug.cgi?id=169844
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
The script added in r213976 has a bug that it can execute commands to fetch subcommits in parallel.
|
||
Some commands to poll the lsit of system components is not desirable to be ran in parallel.
|
||
|
||
* server-tests/resources/mock-subprocess.js:
|
||
(MockSubprocess): Use const declaration.
|
||
(MockSubprocess.resetAndWaitForInvocation): Added.
|
||
(MockSubprocess.waitForInvocation): Renamed from waitingForInvocation. A function name must be a verb.
|
||
See https://webkit.org/code-style-guidelines/#names-verb
|
||
(MockSubprocess.reset): Set invocations.length to 0 so that tests can store a reference to the array
|
||
regardless of whether reset is called or when it's called.
|
||
|
||
* server-tests/tools-os-build-fetcher-tests.js: Updated tests per the code change. Most of codes now
|
||
expect each command to be ran seprately. e.g. if there were two commands to run, instead of expecting
|
||
them to be both ran, and resolving invocation promises, we'd wait for one command to run, resolve,
|
||
its subcommand to run, and then move onto the second top-level command. Also use a local reference
|
||
to MockSubprocess.invocations instead of using the fully qualified name.
|
||
|
||
* tools/js/os-build-fetcher.js:
|
||
(mapInSerialPromiseChain): Added. Calling a closure that returns a promise on each item in an array
|
||
in serial (not asynchronous) is a very common pattern in this class.
|
||
(OSBuildFetcher.fetchAndReportAllInOrder): Added.
|
||
(OSBuildFetcher.prototype.fetchAndReportNewBuilds): Log what the number of builds being submitted.
|
||
(OSBuildFetcher.prototype._fetchAvailableBuilds): Fixed the main bug. Using Promise.all would result
|
||
in each top-level command to be execued in parallel. Since each subcommand is executed as soon as
|
||
its parent command is executed, this results in commands to be executed in parallel.
|
||
Added a whole bunch of logging so that we can at least detect a bug like this in the future.
|
||
(OSBuildFetcher.prototype._commitsForAvailableBuilds): Cleanup the coding style.
|
||
(OSBuildFetcher.prototype._addSubCommitsForBuild): Use mapInSerialPromiseChain. Tightened the assertion
|
||
about the content returned by a subcommand.
|
||
|
||
* tools/js/subprocess.js: Fixed the bug that we were importing require('child_process').ChildProcess.
|
||
execFile is defined on require('child_process') itself.
|
||
(Subprocess.prototype.execute): Fixed a typo. this._childProcess doesn't exist.
|
||
(Subprocess):
|
||
|
||
* tools/sync-os-versions.js: Renamed from tools/pull-os-versions.js.
|
||
(syncLoop): Cleaned up the coding style a little. Also added logging about how long we're about to sleep.
|
||
|
||
2017-03-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add the file uploading capability to the perf dashboard.
|
||
https://bugs.webkit.org/show_bug.cgi?id=169737
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added /privileged-api/upload-file to upload a file, and /api/uploaded-file/ to download the file
|
||
and retrieve its meta data based on its SHA256. We treat two files with the identical SHA256 as
|
||
identical since anyone who can upload a file using this mechanism can execute arbitrary code in
|
||
our bots anyway. This is important for avoiding uploading a large darwinup roots multiple times
|
||
to the server, saving both user's time/bandwidth and server's disk space.
|
||
|
||
* config.json: Added uploadDirectory, uploadFileLimitInMB, and uploadUserQuotaInMB as options.
|
||
* init-database.sql: Added uploaded_files table.
|
||
|
||
* public/api/uploaded-file.php: Added.
|
||
(main): /api/uploaded-file/N would download uploaded_file with id=N. /api/uploaded-file/?sha256=X
|
||
would return the meta data for uploaded_file with sha256=X.
|
||
(stream_file_content): Streams the file content in 64KB chunks. We support Range & If-Range HTTP
|
||
request headers so that browsers can pause and resume downloading of a large root file.
|
||
(parse_range_header): Parses Range HTTP request header.
|
||
|
||
* public/include/json-header.php:
|
||
(remote_user_name): Use the default argument of NULL.
|
||
|
||
* public/include/manifest-generator.php:
|
||
(ManifestGenerator::generate): Include the maximum upload size in the manifest file to let the
|
||
frontend code preemptively check the file size before attempting to submit a file.
|
||
|
||
* public/include/uploaded-file-helpers.php: Added.
|
||
(format_uploaded_file):
|
||
(uploaded_file_path_for_row):
|
||
|
||
* public/privileged-api/upload-file-form.html: Added. For debugging purposes.
|
||
(fetchCSRFfToken):
|
||
(upload):
|
||
|
||
* public/privileged-api/upload-file.php: Added.
|
||
(main):
|
||
(query_total_file_size):
|
||
(create_uploaded_file_from_form_data):
|
||
|
||
* public/shared/common-remote.js:
|
||
(CommonRemoteAPI.prototype.postFormData): Added.
|
||
(CommonRemoteAPI.prototype.postFormDataWithStatus): Added.
|
||
(CommonRemoteAPI.prototype.sendHttpRequestWithFormData): Added.
|
||
(CommonRemoteAPI.prototype._asJSON): Throw an exception instead of calling a non-existent reject.
|
||
|
||
* public/v3/models/uploaded-file.js: Added.
|
||
(UploadedFile): Added.
|
||
(UploadedFile.uploadFile): Added.
|
||
(UploadedFile.fetchUnloadedFileWithIdenticalHash): Added. Finds the file with the same SHA256 in
|
||
the server to avoid uploading a large custom root multiple times.
|
||
(UploadedFile._computeSHA256Hash): Added.
|
||
|
||
* public/v3/privileged-api.js:
|
||
(PrivilegedAPI.prototype.sendRequest): Added the options dictionary as a third argument. For now,
|
||
only support useFormData boolean.
|
||
|
||
* public/v3/remote.js:
|
||
(BrowserRemoteAPI.prototype.sendHttpRequestWithFormData): Added.
|
||
|
||
* server-tests/api-manifest.js: Updated per the inclusion of fileUploadSizeLimit in the manifest.
|
||
* server-tests/api-uploaded-file.js: Added.
|
||
* server-tests/privileged-api-upload-file-tests.js: Added.
|
||
|
||
* server-tests/resources/temporary-file.js: Added.
|
||
(TemporaryFile): Added. A helper class for creating a temporary file to upload.
|
||
(TemporaryFile.makeTemporaryFileOfSizeInMB):
|
||
(TemporaryFile.makeTemporaryFile):
|
||
(TemporaryFile.inject):
|
||
|
||
* server-tests/resources/test-server.conf: Set upload_max_filesize and post_max_size for testing.
|
||
* server-tests/resources/test-server.js:
|
||
(TestServer.prototype.testConfig): Use uploadFileLimitInMB and uploadUserQuotaInMB of 2MB and 5MB.
|
||
(TestServer.prototype._ensureDataDirectory): Create a directory to store uploaded files inside
|
||
the data directory. In a production server, we can place it outside ServerRoot / DocumentRoot.
|
||
(TestServer.prototype.cleanDataDirectory): Delete the aforementioned directory as needed.
|
||
|
||
* tools/js/database.js:
|
||
(tableToPrefixMap): Added uploaded_files.
|
||
|
||
* tools/js/remote.js:
|
||
(NodeRemoteAPI.prototype.sendHttpRequest): Added a dictionary to specify request headers and
|
||
a callback to process the response as arguments. Fixed the bug that any 2xx code other than 200
|
||
was resulting in a rejected promise. Also include the response headers in the result for tests.
|
||
Finally, when content is a function, call that instead of writing the content since FormData
|
||
requires a custom logic.
|
||
(NodeRemoteAPI.prototype.sendHttpRequestWithFormData): Added.
|
||
|
||
* tools/js/v3-models.js: Include uploaded-file.js.
|
||
|
||
* tools/run-tests.py:
|
||
(main): Add form-data as a new dependency.
|
||
|
||
2017-03-15 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Fix unit test and bug fix for 'pull-os-versions.js' script.
|
||
https://bugs.webkit.org/show_bug.cgi?id=169701
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Fix unit tests warnings on node-6.10.0.
|
||
Fix 'pull-os-versions.js' does not fetch new builds and report.
|
||
|
||
* server-tests/tools-os-build-fetcher-tests.js:
|
||
(then):
|
||
(beforeEach):
|
||
(afterEach):
|
||
* tools/pull-os-versions.js:
|
||
(syncLoop):
|
||
|
||
2017-03-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
In-browser and node.js implementations of RemoteAPI should share some code
|
||
https://bugs.webkit.org/show_bug.cgi?id=169695
|
||
|
||
Rubber-stamped by Antti Koivisto.
|
||
|
||
Extracted CommonRemoteAPI out of RemoteAPI implementations for node.js and browser.
|
||
|
||
* public/shared/common-remote.js: Added.
|
||
(CommonRemoteAPI): Added.
|
||
(CommonRemoteAPI.prototype.postJSON): Extracted from RemoteAPI.
|
||
(CommonRemoteAPI.prototype.postJSONWithStatus): Ditto.
|
||
(CommonRemoteAPI.prototype.getJSON): Ditto.
|
||
(CommonRemoteAPI.prototype.getJSONWithStatus): Ditto.
|
||
(CommonRemoteAPI.prototype.sendHttpRequest): Added. Needs to implemented by a subclass.
|
||
(CommonRemoteAPI.prototype._asJSON): Added.
|
||
(CommonRemoteAPI.prototype._checkStatus): Added.
|
||
|
||
* public/v3/index.html: Include common-remote.js.
|
||
|
||
* public/v3/privileged-api.js:
|
||
(PrivilegedAPI): Use class now that we don't include data.js.
|
||
(PrivilegedAPI.sendRequest): Modernized the code.
|
||
(PrivilegedAPI.requestCSRFToken): Ditto.
|
||
|
||
* public/v3/remote.js:
|
||
(BrowserRemoteAPI): Renamed from RemoteAPI. window.RemoteAPI is now an instance of this class.
|
||
(BrowserRemoteAPI.prototype.sendHttpRequest): Moved from RemoteAPI.sendHttpRequest.
|
||
(BrowserRemoteAPI.prototype.sendHttpRequest):
|
||
|
||
* server-tests/privileged-api-create-analysis-task-tests.js: Updated tests since NodeJSRemoteAPI
|
||
now throws the JSON status as an error to be consistent with BrowserRemoteAPI.
|
||
* server-tests/privileged-api-create-test-group-tests.js: Ditto.
|
||
* server-tests/privileged-api-upate-run-status.js: Ditto.
|
||
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype.syncOnce): Just use postJSONWithStatus instead of manually
|
||
checking the status.
|
||
|
||
* tools/js/remote.js:
|
||
(NodeRemoteAPI): Renamed from RemoteAPI. Still exported as RemoteAPI.
|
||
(NodeRemoteAPI.prototype.constructor):
|
||
(NodeRemoteAPI.prototype.sendHttpRequest): Modernized the code.
|
||
|
||
2017-03-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix server tests after r213998 and r213969
|
||
https://bugs.webkit.org/show_bug.cgi?id=169690
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Fixed the existing server tests.
|
||
|
||
* public/v3/models/analysis-task.js:
|
||
(AnalysisTask.prototype._updateRemoteState): Use the relative path from the root so that it works inside tests.
|
||
(AnalysisTask.prototype.associateBug): Ditto.
|
||
(AnalysisTask.prototype.dissociateBug): Ditto.
|
||
(AnalysisTask.prototype.associateCommit): Ditto.
|
||
(AnalysisTask.prototype.dissociateCommit): Ditto.
|
||
(AnalysisTask._fetchSubset): Ditto.
|
||
(AnalysisTask.fetchAll): Ditto.
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.prototype.updateName): Ditto.
|
||
(TestGroup.prototype.updateHiddenFlag): Ditto.
|
||
(TestGroup.createAndRefetchTestGroups): Ditto.
|
||
(TestGroup.cachedFetch): Ditto.
|
||
* server-tests/api-manifest.js: Reverted an inadvertant change in r213969.
|
||
* tools/js/database.js:
|
||
(tableToPrefixMap): Added analysis_strategies.
|
||
* unit-tests/analysis-task-tests.js: Updated expectations per changes to AnalysisTask.
|
||
|
||
2017-03-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add tests for privileged-api/create-analysis-task and privileged-api/create-test-group
|
||
https://bugs.webkit.org/show_bug.cgi?id=169688
|
||
|
||
Rubber-stamped by Antti Koivisto.
|
||
|
||
Added tests for privileged-api/create-analysis-task and privileged-api/create-test-group, and fixed newly found bugs.
|
||
|
||
* public/privileged-api/create-analysis-task.php:
|
||
(main): Fixed the bug that we were not explicitly checking whether start_run and end_run were integers or not.
|
||
Also return InvalidTimeRange when start and end times are identical as that makes no sense for an analysis task.
|
||
|
||
* public/privileged-api/create-test-group.php:
|
||
(main): Fixed a bug that we were not explicitly checking task and repetitionCount to be an integer.
|
||
(ensure_commit_sets): Fixed the bug that the number of commit sets weren't checked.
|
||
|
||
* server-tests/privileged-api-create-analysis-task-tests.js: Added.
|
||
* server-tests/privileged-api-create-test-group-tests.js: Added.
|
||
|
||
* server-tests/resources/common-operations.js:
|
||
(prepareServerTest): Increase the timeout from 1s to 5s.
|
||
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.addMockData): Use a higher database ID of 20 for a mock build_slave to avoid a conflict with auto-generated IDs.
|
||
|
||
2017-03-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make unit tests return a promise instead of manually calling done
|
||
https://bugs.webkit.org/show_bug.cgi?id=169663
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Make the existing unit tests always reutrn a promise instead of manually calling "done" callback as done
|
||
in r213969. The promise tests are a lot more stable and less error prone.
|
||
|
||
Also use MockRemoteAPI.waitForRequest() instead of chaining two resolved promises where appropriate.
|
||
|
||
* unit-tests/analysis-task-tests.js:
|
||
* unit-tests/buildbot-syncer-tests.js:
|
||
* unit-tests/checkconfig.js:
|
||
* unit-tests/privileged-api-tests.js:
|
||
|
||
2017-03-15 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Rewrite 'pull-os-versions' script in Javascript to add support for reporting os revisions with sub commits.
|
||
https://bugs.webkit.org/show_bug.cgi?id=169542
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Extend '/api/commits/<repository>/last-reported' to accept a range and return last reported commits in given range.
|
||
Rewrite 'pull-os-versions' in JavaScript and add unit tests for it.
|
||
Instead of writing query manually while searching criteria contains null columns, use the methods provided in 'db.php'.
|
||
Add '.gitignore' file to ommit files generated by while running tests/instances locally.
|
||
|
||
* .gitignore: Added.
|
||
* public/api/commits.php:
|
||
* public/api/report-commits.php:
|
||
* public/include/commit-log-fetcher.php:
|
||
* public/include/db.php: 'null_columns' of prepare_params should be a reference.
|
||
* public/include/report-processor.php:
|
||
* server-tests/api-commits.js:
|
||
(then):
|
||
* server-tests/api-report-commits-tests.js:
|
||
* server-tests/resources/mock-logger.js: Added.
|
||
(MockLogger):
|
||
(MockLogger.prototype.log):
|
||
(MockLogger.prototype.error):
|
||
* server-tests/resources/mock-subprocess.js: Added.
|
||
(MockSubprocess.call):
|
||
(MockSubprocess.waitingForInvocation):
|
||
(MockSubprocess.inject):
|
||
(MockSubprocess.reset):
|
||
* server-tests/tools-buildbot-triggerable-tests.js:
|
||
(MockLogger): Deleted.
|
||
(MockLogger.prototype.log): Deleted.
|
||
(MockLogger.prototype.error): Deleted.
|
||
* server-tests/tools-os-build-fetcher-tests.js: Added.
|
||
(beforeEach):
|
||
(return.waitingForInvocationPromise.then):
|
||
(then):
|
||
(string_appeared_here.return.waitingForInvocationPromise.then):
|
||
(return.addSlaveForReport.emptyReport.then):
|
||
* tools/js/os-build-fetcher.js: Added.
|
||
(OSBuildFetcher):
|
||
(OSBuildFetcher.prototype._fetchAvailableBuilds):
|
||
(OSBuildFetcher.prototype._computeOrder):
|
||
(OSBuildFetcher.prototype._commitsForAvailableBuilds.return.this._subprocess.call.then.):
|
||
(OSBuildFetcher.prototype._commitsForAvailableBuilds):
|
||
(OSBuildFetcher.prototype._addSubCommitsForBuild):
|
||
(OSBuildFetcher.prototype._submitCommits):
|
||
(OSBuildFetcher.prototype.fetchAndReportNewBuilds):
|
||
* tools/js/subprocess.js: Added.
|
||
(const.childProcess.require.string_appeared_here.Subprocess.prototype.call):
|
||
(const.childProcess.require.string_appeared_here.Subprocess):
|
||
* tools/pull-os-versions.js: Added.
|
||
(main):
|
||
(syncLoop):
|
||
* tools/sync-commits.py:
|
||
(Repository.fetch_commits_and_submit):
|
||
|
||
2017-03-14 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make server tests return a promise instead of manually calling done
|
||
https://bugs.webkit.org/show_bug.cgi?id=169648
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Make the existing server tests always reutrn a promise instead of manually calling "done" callback.
|
||
The promise tests are a lot more stable and less error prone.
|
||
|
||
Also use arrow functions everywhere and use prepareServerTest, renamed from connectToDatabaseInEveryTest,
|
||
in more tests instead of manually connecting to database in every test, and reset v3 models.
|
||
|
||
* server-tests/admin-platforms-tests.js:
|
||
* server-tests/admin-reprocess-report-tests.js:
|
||
* server-tests/api-build-requests-tests.js:
|
||
* server-tests/api-manifest.js:
|
||
* server-tests/api-measurement-set-tests.js:
|
||
(.postReports): Deleted. Not used in any test.
|
||
* server-tests/api-report-commits-tests.js:
|
||
* server-tests/api-report-tests.js:
|
||
* server-tests/api-update-triggerable.js:
|
||
* server-tests/privileged-api-upate-run-status.js:
|
||
* server-tests/resources/common-operations.js:
|
||
(prepareServerTest): Renamed from connectToDatabaseInEveryTest. Increase the timeout and reset v3 models.
|
||
* server-tests/tools-buildbot-triggerable-tests.js:
|
||
|
||
2017-03-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Rename RootSet to CommitSet
|
||
https://bugs.webkit.org/show_bug.cgi?id=169580
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Renamed root_sets to commit_sets and roots to commit_set_relationships in the database schema, and renamed
|
||
related classes in public/v3/ and tools accordingly.
|
||
|
||
RootSet, MeasurementRootSet, and CustomRootSet are respectively renamed to CommitSet, MeasurementCommitSet,
|
||
and CustomCommitSet.
|
||
|
||
In order to migrate the database, run:
|
||
```
|
||
BEGIN;
|
||
ALTER TABLE root_sets RENAME TO commit_sets;
|
||
ALTER TABLE commit_sets RENAME COLUMN rootset_id TO commitset_id;
|
||
ALTER TABLE roots RENAME TO commit_set_relationships;
|
||
ALTER TABLE commit_set_relationships RENAME COLUMN root_set TO commitset_set;
|
||
ALTER TABLE commit_set_relationships RENAME COLUMN root_commit TO commitset_commit;
|
||
ALTER TABLE build_requests RENAME COLUMN request_root_set TO request_commit_set;
|
||
END;
|
||
```
|
||
|
||
* browser-tests/index.html:
|
||
* init-database.sql:
|
||
* public/api/build-requests.php:
|
||
(main):
|
||
* public/api/test-groups.php:
|
||
(main):
|
||
(format_test_group):
|
||
* public/include/build-requests-fetcher.php:
|
||
(BuildRequestsFetcher::__construct):
|
||
(BuildRequestsFetcher::results_internal):
|
||
(BuildRequestsFetcher::commit_sets): Renamed from root_sets.
|
||
(BuildRequestsFetcher::commits): Renamed from roots.
|
||
(BuildRequestsFetcher::fetch_commits_for_set_if_needed): Renamed from fetch_roots_for_set_if_needed.
|
||
* public/privileged-api/create-test-group.php:
|
||
(main):
|
||
(ensure_commit_sets): Renamed from commit_sets_from_root_sets.
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer.prototype.buildRowGroups):
|
||
(AnalysisResultsViewer.prototype._collectCommitSetsInTestGroups): Renamed from _collectRootSetsInTestGroups.
|
||
(AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups):
|
||
(AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups):
|
||
(AnalysisResultsViewer.CommitSetInTestGroup): Renamed from RootSetInTestGroup.
|
||
(AnalysisResultsViewer.CommitSetInTestGroup.prototype.constructor):
|
||
(AnalysisResultsViewer.CommitSetInTestGroup.prototype.commitSet): Renamed from rootSet.
|
||
(AnalysisResultsViewer.CommitSetInTestGroup.prototype.succeedingCommitSet): Renamed from succeedingRootSet.
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype.constructor):
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype.addRowIndex):
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype.isComplete):
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype.startRowIndex):
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype.endRowIndex):
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
|
||
* public/v3/components/chart-revision-range.js:
|
||
(ChartRevisionRange.prototype._revisionForPoint):
|
||
(ChartRevisionRange.prototype._computeRevisionList):
|
||
* public/v3/components/customizable-test-group-form.js:
|
||
(CustomizableTestGroupForm.prototype.constructor):
|
||
(CustomizableTestGroupForm.prototype.setCommitSetMap): Renamed from setRootSetMap.
|
||
(CustomizableTestGroupForm.prototype._submitted):
|
||
(CustomizableTestGroupForm.prototype._computeCommitSetMap): Renamed from _computeRootSetMap.
|
||
(CustomizableTestGroupForm.prototype.render): Renamed from render.
|
||
(CustomizableTestGroupForm.prototype._constructRevisionRadioButtons):
|
||
* public/v3/components/results-table.js:
|
||
(ResultsTable.prototype.render):
|
||
(ResultsTable.prototype._createRevisionListCells):
|
||
(ResultsTable.prototype._computeRepositoryList):
|
||
(ResultsTableRow.prototype.constructor):
|
||
(ResultsTableRow.prototype.commitSet): Renamed from rootSet.
|
||
* public/v3/components/test-group-results-table.js:
|
||
(TestGroupResultsTable.prototype.buildRowGroups):
|
||
* public/v3/index.html:
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.prototype.constructor):
|
||
(BuildRequest.prototype.updateSingleton):
|
||
(BuildRequest.prototype.commitSet): Renamed from rootSet.
|
||
(BuildRequest.constructBuildRequestsFromData):
|
||
* public/v3/models/commit-set.js: Renamed from public/v3/models/root-set.js.
|
||
(CommitSet): Renamed from RootSet.
|
||
(CommitSet.containsMultipleCommitsForRepository):
|
||
(MeasurementCommitSet): Renamed from MeasurementRootSet.
|
||
(MeasurementCommitSet.prototype.namedStaticMap):
|
||
(MeasurementCommitSet.prototype.ensureNamedStaticMap):
|
||
(MeasurementCommitSet.namedStaticMap):
|
||
(MeasurementCommitSet.ensureNamedStaticMap):
|
||
(MeasurementCommitSet.ensureSingleton):
|
||
(CustomCommitSet): Renamed from CustomRootSet.
|
||
* public/v3/models/measurement-adaptor.js:
|
||
(MeasurementAdaptor.prototype.applyTo):
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.prototype.constructor):
|
||
(TestGroup.prototype.addBuildRequest):
|
||
(TestGroup.prototype.repetitionCount):
|
||
(TestGroup.prototype.requestedCommitSets): Renamed from requestedRootSets.
|
||
(TestGroup.prototype.requestsForCommitSet): Renamed from requestsForRootSet.
|
||
(TestGroup.prototype.labelForCommitSet): Renamed from labelForRootSet.
|
||
(TestGroup.prototype.didSetResult):
|
||
(TestGroup.prototype.compareTestResults):
|
||
(TestGroup.prototype._valuesForCommitSet): Renamed from _valuesForRootSet.
|
||
(TestGroup.prototype.createAndRefetchTestGroups):
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype.render):
|
||
(AnalysisTaskPage.prototype._retryCurrentTestGroup):
|
||
(AnalysisTaskPage.prototype._createNewTestGroupFromChart):
|
||
(AnalysisTaskPage.prototype._createNewTestGroupFromViewer):
|
||
(AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList):
|
||
* server-tests/api-build-requests-tests.js:
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.resetV3Models):
|
||
(MockData.addMockData):
|
||
(MockData.addAnotherMockTestGroup):
|
||
* tools/detect-changes.js:
|
||
(createAnalysisTaskAndNotify):
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotSyncer.prototype._propertiesForBuildRequest):
|
||
(BuildbotSyncer.prototype._revisionSetFromCommitSetWithExclusionList):
|
||
* tools/js/database.js:
|
||
(tableToPrefixMap):
|
||
* tools/js/v3-models.js:
|
||
* tools/sync-buildbot.js:
|
||
(syncLoop):
|
||
* tools/sync-with-buildbot.py: Deleted. No longer used.
|
||
* unit-tests/analysis-task-tests.js:
|
||
* unit-tests/build-request-tests.js:
|
||
(sampleBuildRequestData):
|
||
* unit-tests/buildbot-syncer-tests.js:
|
||
(sampleCommitSetData):
|
||
* unit-tests/measurement-adaptor-tests.js:
|
||
* unit-tests/measurement-set-tests.js:
|
||
* unit-tests/resources/mock-v3-models.js:
|
||
(MockModels.inject):
|
||
* unit-tests/test-groups-tests.js:
|
||
(sampleTestGroup):
|
||
|
||
2017-03-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Database's query functions should support querying for a row with NULL value
|
||
https://bugs.webkit.org/show_bug.cgi?id=169504
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Add the support for calling select_* with one of column values set to NULL.
|
||
This feature is useful in webkit.org/b/146374 and webkit.org/b/168962.
|
||
|
||
* public/include/db.php:
|
||
(Database::prepare_params): Added $null_columns as an optional argument.
|
||
(Database::select_conditions_with_null_columns): Added. Builds up a query string by appending AND x is NULL
|
||
to match columns whose value must be NULL.
|
||
(Database::_select_update_or_insert_row):
|
||
(Database::select_rows):
|
||
|
||
2017-03-13 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Add the ability to report a commit with sub-commits.
|
||
https://bugs.webkit.org/show_bug.cgi?id=168962
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Introduce 'commit_ownerships' which records ownership between commits.
|
||
On existing production server, run ```
|
||
CREATE TABLE commit_ownerships (
|
||
commit_owner integer NOT NULL REFERENCES commits ON DELETE CASCADE,
|
||
commit_ownee integer NOT NULL REFERENCES commits ON DELETE CASCADE,
|
||
PRIMARY KEY (commit_owner, commit_ownee)
|
||
);
|
||
ALTER TABLE repositories RENAME repository_parent TO repository_owner;
|
||
ALTER TABLE repositories DROP repository_name_must_be_unique;
|
||
CREATE UNIQUE INDEX repository_name_owner_unique_index ON repositories (repository_owner, repository_name) WHERE repository_owner IS NOT NULL;
|
||
CREATE UNIQUE INDEX repository_name_unique_index ON repositories (repository_name) WHERE repository_owner IS NULL;
|
||
``` to update database.
|
||
Add unit-tests to cover this change.
|
||
|
||
* init-database.sql:
|
||
* public/api/report-commits.php:
|
||
* public/include/commit-log-fetcher.php:
|
||
* public/include/db.php:
|
||
* public/include/manifest-generator.php:
|
||
* public/include/report-processor.php:
|
||
* public/v3/models/repository.js:
|
||
(Repository):
|
||
(Repository.prototype.owner):
|
||
* server-tests/admin-reprocess-report-tests.js:
|
||
(addBuilderForReport.simpleReportWithRevisions.0.then):
|
||
(then):
|
||
* server-tests/api-manifest.js:
|
||
(then):
|
||
* server-tests/api-report-commits-tests.js:
|
||
(addSlaveForReport.sameRepositoryNameInSubCommitAndMajorCommit.then):
|
||
(then):
|
||
(addSlaveForReport.systemVersionCommitWithSubcommits.then):
|
||
(addSlaveForReport.multipleSystemVersionCommitsWithSubcommits.then):
|
||
(addSlaveForReport.systemVersionCommitWithEmptySubcommits.then):
|
||
(addSlaveForReport.systemVersionCommitAndSubcommitWithTimestamp.then):
|
||
* tools/js/database.js:
|
||
|
||
2017-03-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Update ReadMe.md to use directory format for backing up & restoring the database
|
||
https://bugs.webkit.org/show_bug.cgi?id=169263
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Update ReadMe.md's instruction to backup and restore the database to use directory format instead of
|
||
piping it to gzip. The new command will backup and restore the database with multiple concurrent processes
|
||
with a custom compression level.
|
||
|
||
* ReadMe.md:
|
||
|
||
2017-03-02 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make baseline data points selectable
|
||
https://bugs.webkit.org/show_bug.cgi?id=169069
|
||
<rdar://problem/29209427>
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Add the capability to select data points other than "current" configuration type.
|
||
|
||
This patch refactors the way the "chart status" is computed. Before this patch, ChartStatusView was
|
||
responsible for determining two data points for which to compute the status, and computing the status
|
||
between two data points. ChartPaneStatusView which inherits from ChartStatusView and used in the charts
|
||
page relied upon ChartStatusView to compute these values, and computed the list of revision ranges for
|
||
each relevant repository between the data points. ChartPane then had callbacks on ChartPaneStatusView
|
||
to know whenever these values changed. Because of this entangled mess, ChartStatusView had to be aware
|
||
of InteractiveTimeSeriesChart even though only ChartPaneStatusView could be used with it.
|
||
|
||
This patch dramatically simplifies the situation by adding referencePoints() on TimeSeriesChart and
|
||
InteractiveTimeSeriesChart which returns the current point, the previous point if there is any, and
|
||
their time series view. It also extracts ChartStatusEvaluator which computes the current status values
|
||
and ChartRevisionRange which computes a list of revision differences both based on the referencePoints.
|
||
As a result, ChartPaneStatusView no longer inherits from ChartStatusView, and ChartStatusView has been
|
||
renamed to DashboardChartStatusView to reflect its purpose. Furthermore, ChartPane which used to rely on
|
||
ChartPaneStatusView's revisionCallback to update the commit log viewer simply uses another instance of
|
||
ChartRevisionRange, eliminating the need for the callback.
|
||
|
||
To implement these classes easily, this patch also introduces a new class, LazilyEvaluatedFunction to
|
||
memoize the return value of a function when called with the same arguments. Delaying the computation of
|
||
a value and avoiding the work when the values are the same is a very common pattern in the perf dashboard
|
||
so I expect this class would be used in a lot more places in the future.
|
||
|
||
* browser-tests/chart-revision-range-tests.js: Added. Tests for ChartRevisionRange.
|
||
* browser-tests/chart-status-evaluator-tests.js: Added. Tests for ChartStatusEvaluator.
|
||
|
||
* browser-tests/index.html:
|
||
(BrowsingContext):
|
||
(BrowsingContext.importScripts): Fixed the bug that calling importScripts twice results in MockRemoteAPI
|
||
being loaded twice.
|
||
(ChartTest.importChartScripts): Import more model objects.
|
||
(ChartTest.sampleCluster): Made this a getter.
|
||
(ChartTest.makeModelObjectsForSampleCluster):
|
||
(ChartTest.makeSampleCluster): Added. Cutomizes the valus of baseline / target based on options.
|
||
(ChartTest.respondWithSampleCluster): Now takes an options argument for makeSampleCluster.
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase): Added _openRepository to keep track of the currently open repository instead of relying
|
||
on _mainChartStatus or _commitLogViewer to keep track of it.
|
||
(ChartPaneBase.prototype.configure): The callback for when the user clicked on a repository name in
|
||
ChartPaneStatusView has been replaced by "openRepository" action.
|
||
(ChartPaneBase.prototype.setOpenRepository): Moved from ChartPane.
|
||
(ChartPaneBase.prototype._mainSelectionDidChange):
|
||
(ChartPaneBase.prototype._indicatorDidChange):
|
||
(ChartPaneBase.prototype._didFetchData):
|
||
(ChartPaneBase.prototype._updateCommitLogViewer): Renamed from _updateStatus.
|
||
(ChartPaneBase.prototype.openNewRepository): Renamed from _requestOpeningCommitViewer. Fixed a bug that
|
||
clicking on the repository name inside ChartPaneStatusView would not focus the pane, which resulted in
|
||
arrow keys to be ignored instead of moving the main chart's indicator or the currently open repository.
|
||
(ChartPaneBase.prototype._keyup):
|
||
(ChartPaneBase.prototype._moveOpenRepository): Moved from ChartPaneStatusView's
|
||
moveRepositoryWithNotification. Used when changing the open repository by up/down arrow keys.
|
||
|
||
* public/v3/components/chart-revision-range.js: Added. Extracted from ChartPaneStatusView.
|
||
(ChartRevisionRange): Added.
|
||
(ChartRevisionRange.prototype.revisionList): Added.
|
||
(ChartRevisionRange.prototype.rangeForRepository): Added.
|
||
(ChartRevisionRange._revisionForPoint): Added. Extracted from ChartPaneStatusView's
|
||
_updateRevisionListForNewCurrentRepository.
|
||
(ChartRevisionRange._computeRevisionList): Ditto from computeChartStatusLabels.
|
||
|
||
* public/v3/components/chart-status-evaluator.js: Added.
|
||
(ChartStatusEvaluator): Added.
|
||
(ChartStatusEvaluator.prototype.status): Added.
|
||
(ChartStatusEvaluator.computeChartStatus): Added. Extracted from ChartStatusView's updateStatusIfNeeded.
|
||
|
||
* public/v3/components/chart-status-view.js: Removed.
|
||
(ChartStatusView): Deleted. Split into ChartStatusEvaluator and DashboardChartStatusView.
|
||
|
||
* public/v3/components/chart-styles.js:
|
||
(ChartStyles.baselineStyle): Make baseline data points interactive. This single line change is what
|
||
enables the user to interact with the data points. The rest of changes in this patch mostly deals with
|
||
the status text such as "5% worse than baseline" and the list of revisions shown in the commit log viewer
|
||
which would have shown the wrong range without these changes.
|
||
|
||
* public/v3/components/dashboard-chart-status-view.js: Added. Extracted from ChartStatusView.
|
||
(DashboardChartStatusView): Added.
|
||
(DashboardChartStatusView.prototype.render): Added.
|
||
(DashboardChartStatusView.htmlTemplate): Added.
|
||
(DashboardChartStatusView.cssTemplate): Added.
|
||
|
||
* public/v3/components/interactive-time-series-chart.js:
|
||
(InteractiveTimeSeriesChart.prototype.referencePoints): Added. Return the first point and the last point
|
||
as the reference points when there is a selection. Only report the previous point if they are distinct as
|
||
showing a range of revisions from a data point to itself makes no sense. When there is a indicator simply
|
||
return it and its previous point as reference points. Otherwise return null unlike TimeSeriesChart's
|
||
referencePoints which always returns the latest point as the reference point.
|
||
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart.prototype.referencePoints): Added. Return the latest point as the reference point. It
|
||
never returns the previous point even if there were more data points as there is no way for the user to
|
||
specify which data points to compare.
|
||
|
||
* public/v3/index.html: Include newly added files.
|
||
|
||
* public/v3/lazily-evaluated-function.js: Added.
|
||
(LazilyEvaluatedFunction): Added.
|
||
(LazilyEvaluatedFunction.prototype.evaluate): Added.
|
||
|
||
* public/v3/models/commit-log.js:
|
||
(CommitLog.prototype.diff): Fixed a bug that computing the diff of two Subversion-like revisions results
|
||
in "from" field to be unexpectedly an integer instead of a string.
|
||
|
||
* public/v3/models/metric.js:
|
||
(Metric): Moved the code to compute the unit from the metric name from v2's RunsData class. This makes
|
||
writing tests easier since it eliminates the need to load v2's data.js.
|
||
(Metric.prototype.unit):
|
||
(Metric.prototype.isSmallerBetter): Ditto for determining whether the unit is smaller-is-better.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskChartPane.prototype._updateStatus): Deleted the unused code.
|
||
|
||
* public/v3/pages/chart-pane-status-view.js:
|
||
(ChartPaneStatusView): No longer inherits from ChartStatusView. Uses ChartStatusEvaluator and
|
||
ChartRevisionRange to to compute the chart status and the list of revision changes.
|
||
(ChartPaneStatusView.prototype.pointsRangeForAnalysis): Deleted.
|
||
(ChartPaneStatusView.prototype.render): Split it into _renderStatus and _renderBuildRevisionTable using
|
||
LazilyEvaluatedFunction.
|
||
(ChartPaneStatusView.prototype._renderStatus): Added.
|
||
(ChartPaneStatusView.prototype._renderBuildRevisionTable): Added.
|
||
(ChartPaneStatusView.prototype.setCurrentRepository): _updateRevisionListForNewCurrentRepository has been
|
||
moved into ChartRevisionRange. Just enqueue itself to re-render.
|
||
(ChartPaneStatusView.prototype._setRevisionRange): Deleted.
|
||
(ChartPaneStatusView.prototype.moveRepositoryWithNotification): Deleted.
|
||
(ChartPaneStatusView.prototype.updateRevisionList): Deleted.
|
||
(ChartPaneStatusView.prototype._updateRevisionListForNewCurrentRepository): Deleted.
|
||
(ChartPaneStatusView.prototype.computeChartStatusLabels): Deleted.
|
||
(ChartPaneStatusView.htmlTemplate):
|
||
(ChartPaneStatusView.cssTemplate):
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane.prototype.openNewRepository): Overrides the one in ChartPaneBase, which has been renamed from
|
||
_requestOpeningCommitViewer.
|
||
(ChartPane.prototype._analyzeRange):
|
||
(ChartPane.prototype._renderActionToolbar): Use the main chart's selection directly to determine whether
|
||
an analysis task can be created for the currenty selected range.
|
||
|
||
* public/v3/pages/dashboard-page.js:
|
||
(DashboardPage.prototype._createChartForCell):
|
||
|
||
* unit-tests/lazily-evaluated-function-tests.js: Added. Tests for LazilyEvaluatedFunction.
|
||
|
||
2017-03-01 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r212853. Make creating an analysis task work again.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype.render):
|
||
|
||
2017-02-27 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix tests after r213119 and r213120.
|
||
|
||
* browser-tests/time-series-chart-tests.js:
|
||
(return.ChartTest.importChartScripts.context.then):
|
||
(string_appeared_here.then): Deleted.
|
||
|
||
2017-02-27 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Removed the unused code that was supposed to be removed in the previous commit.
|
||
|
||
* browser-tests/time-series-chart-tests.js:
|
||
|
||
2017-02-27 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Split tests for InteractiveTimeSeriesChart into a separate test file.
|
||
https://bugs.webkit.org/show_bug.cgi?id=168960
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Extracted the test cases for InteractiveTimeSeriesChart charts from time-series-chart-tests.js
|
||
into interactive-time-series-chart-tests.js now that the former file has gotten really big over time.
|
||
|
||
Also extracted a bunch of helper functions time-series-chart-tests.js as ChartTest in index.html.
|
||
Any test which instantiates a time series chart can use this helper class.
|
||
|
||
* browser-tests/index.html:
|
||
(ChartTest.importChartScripts): Ditto.
|
||
(ChartTest.posixTime): Moved from time-series-chart-tests.js.
|
||
(ChartTest.sampleCluster): Ditto.
|
||
(ChartTest.createChartWithSampleCluster): Ditto.
|
||
(ChartTest.createInteractiveChartWithSampleCluster): Ditto.
|
||
(ChartTest.respondWithSampleCluster):
|
||
* browser-tests/interactive-time-series-chart-tests.js: Extracted from time-series-chart-tests.js.
|
||
* browser-tests/time-series-chart-tests.js:
|
||
(posixTime): Moved.
|
||
(dayInMilliseconds): Moved.
|
||
(sampleCluster): Moved.
|
||
(createChartWithSampleCluster): Moved.
|
||
(createInteractiveChartWithSampleCluster): Moved.
|
||
(respondWithSampleCluster): Moved.
|
||
* unit-tests/analysis-task-tests.js: Fixed a typo. s/adopter/adapter/.
|
||
|
||
2017-02-27 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Calling build() on a baseline point results in an exception
|
||
https://bugs.webkit.org/show_bug.cgi?id=168959
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Some baseline points may lack the build information. e.g. A custom data point made by an user.
|
||
Only instantiate Build object in a point object returned by MeasurementAdaptor when the builder id
|
||
is available so that we don't hit an assertion inside Build's constructor.
|
||
|
||
* public/v3/models/measurement-adaptor.js:
|
||
(MeasurementAdaptor.prototype.applyTo..build): Only instantiate Build when builderId is set.
|
||
* unit-tests/measurement-adaptor-tests.js: Added a test case.
|
||
|
||
2017-02-27 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Arrow key shouldn't move the indicator beyond the visible points
|
||
https://bugs.webkit.org/show_bug.cgi?id=168956
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
The bug was caused by moveLockedIndicatorWithNotification using the full sampled time series view
|
||
instead of the one constrained by the domain. Since the time series chart expands the visible domain
|
||
to include at least one point before the start time and one point after the end tiem to draw lines
|
||
extending beyond the visible region (otherwise it looks as though the graph ends there), we need to
|
||
use a view constrained by the start time and the end time before looking for a next/previous point.
|
||
|
||
* browser-tests/time-series-chart-tests.js: Added test cases for moveLockedIndicatorWithNotification.
|
||
* public/v3/components/interactive-time-series-chart.js:
|
||
(InteractiveTimeSeriesChart.prototype.moveLockedIndicatorWithNotification): Fixed the bug. Also
|
||
enqueue itself to render instead of relying on a parent component to do it.
|
||
|
||
2017-02-27 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
A Locked indicator should be visually distinct from an unlocked indicator
|
||
https://bugs.webkit.org/show_bug.cgi?id=168868
|
||
<rdar://problem/29666054>
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Added the support for specifying options.lockedIndicator in addition to options.indicator to style
|
||
an locked indicator differently from an unlocked one.
|
||
|
||
* browser-tests/time-series-chart-tests.js: Added new test cases for indicators.
|
||
(createChartWithSampleCluster): Renamed and swapped the order of arguments to better match
|
||
TimeSeriesChart's constructor. Now the second argument is an array of source as is in the constructor.
|
||
(createInteractiveChartWithSampleCluster): Added.
|
||
|
||
* public/v3/components/chart-styles.js:
|
||
(ChartStyles.overviewChartOptions): Changed the color of a selection to blue.
|
||
(ChartStyles.mainChartOptions): Ditto. Also use a different style for a locked indicator.
|
||
|
||
* public/v3/components/interactive-time-series-chart.js:
|
||
(InteractiveTimeSeriesChart.prototype._layout): Removed the unused variable.
|
||
(InteractiveTimeSeriesChart.prototype._renderChartContent): Use options.lockedIndicator when rendering
|
||
a locked indicator. Also stroke the circle in addition to filling it so that we can use a blue circle
|
||
with a white hole for a locked indicator to make it even more visually distinctive from an unlocked one.
|
||
|
||
2017-02-25 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Commit should order by 'commit_order' as secondary key.
|
||
https://bugs.webkit.org/show_bug.cgi?id=168866
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Currently, commits are sorted by 'commit_time' only.
|
||
We should use 'commit_order' as secondary key when 'commit_time' is equal or null.
|
||
|
||
* public/include/commit-log-fetcher.php:
|
||
* public/include/db.php:
|
||
* server-tests/api-commits.js:
|
||
(return.addSlaveForReport.subversionCommits.then):
|
||
(then):
|
||
|
||
2017-02-24 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
REGRESSION(r212853): Comparisons to baseline no longer shows up
|
||
https://bugs.webkit.org/show_bug.cgi?id=168863
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
The bug was caused by ChartStatusView's code not being updated to use TimeSeriesView's.
|
||
Updated the code to use TimeSeriesView's methods to fix the bug.
|
||
|
||
Also made InteractiveTimeSeriesChart's currentPoint to return a (TimeSeriesView, point, isLocked) tuple
|
||
to consolidate it with lockedIndicator() to work towards making the baseline data points selectable.
|
||
|
||
* browser-tests/time-series-chart-tests.js: Updated the test cases to use currentIndicator, and added
|
||
test cases for newly added lastPointInTimeRange.
|
||
|
||
* public/v3/components/chart-pane.js:
|
||
(ChartPane.prototype.serializeState): Updated to use currentIndicator.
|
||
(ChartPane.prototype._renderFilteringPopover): Ditto.
|
||
|
||
* public/v3/components/chart-status-view.js:
|
||
(ChartStatusView.prototype.updateStatusIfNeeded): Use currentIndicator for an interative time series.
|
||
Fixed the non-interactive chart's code path for TimeSeriesView.
|
||
(ChartStatusView.prototype._computeChartStatus): Modernized the code.
|
||
(ChartStatusView.prototype._findLastPointPriorToTime): Deleted. Replaced by TimeSeriesView's
|
||
lastPointInTimeRange.
|
||
|
||
* public/v3/components/interactive-time-series-chart.js:
|
||
(InteractiveTimeSeriesChart.prototype.currentIndicator):
|
||
(InteractiveTimeSeriesChart.prototype.moveLockedIndicatorWithNotification):
|
||
(InteractiveTimeSeriesChart.prototype._renderChartContent):
|
||
(InteractiveTimeSeriesChart):
|
||
|
||
* public/v3/models/time-series.js:
|
||
(TimeSeriesView.prototype.lastPointInTimeRange): Added.
|
||
(TimeSeriesView.prototype._reverse): Added. Traverses the view in the reverse order.
|
||
* unit-tests/time-series-tests.js:
|
||
|
||
2017-02-23 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Rename 'commit_parent' in 'commits' table to 'commit_previous_commit'.
|
||
https://bugs.webkit.org/show_bug.cgi?id=168816
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Rename 'commit_parent' to avoid ambiguity in the coming feature.
|
||
For exisiting database, run
|
||
"ALTER TABLE commits RENAME commit_parent TO commit_previous_commit;"
|
||
to update the database.
|
||
|
||
* init-database.sql:
|
||
* public/api/report-commits.php:
|
||
* public/include/commit-log-fetcher.php:
|
||
* server-tests/api-commits.js:
|
||
(then):
|
||
* server-tests/api-report-commits-tests.js:
|
||
(then):
|
||
* tools/sync-commits.py:
|
||
(main):
|
||
(Repository.fetch_commits_and_submit):
|
||
(GitRepository._revision_from_tokens):
|
||
* unit-tests/analysis-task-tests.js:
|
||
(sampleAnalysisTask):
|
||
|
||
2017-02-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New sampling algorithm shows very few points when zoomed out
|
||
https://bugs.webkit.org/show_bug.cgi?id=168813
|
||
|
||
Reviewed by Saam Barati.
|
||
|
||
When a chart is zoomed out to a large time interval, the new sampling algorithm introduced in r212853 can
|
||
hide most of the data points because the difference between the preceding point's time and the succeeding
|
||
point's time of most points will be below the threshold we computed.
|
||
|
||
Instead, rank each data point based on the aforementioned time interval difference, and pick the first M data
|
||
points when M data points are to be shown.
|
||
|
||
This makes the new algorithm behave like our old algorithm while keeping it stable still. Note that this
|
||
algorithm still biases data points without a close neighboring point but this seems to work out in practice
|
||
because such a point tends to be an important sample anyway, and we don't have a lot of space between
|
||
data points since we aim to show about one point per pixel.
|
||
|
||
* browser-tests/index.html:
|
||
(CanvasTest.canvasContainsColor): Extracted from one of the test cases and generalized. Returns true when
|
||
the specified region of the canvas contains a specified color (alpha is optional).
|
||
* browser-tests/time-series-chart-tests.js: Added a test case for sampling. It checks that sampling happens
|
||
and that we always show some data point even when zoomed out to a large time interval.
|
||
(createChartWithSampleCluster):
|
||
|
||
* public/v3/components/interactive-time-series-chart.js:
|
||
(InteractiveTimeSeriesChart.prototype._sampleTimeSeries):
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart.prototype._ensureSampledTimeSeries): M, the number of data points we pick must be computed
|
||
based on the width of data points we're about to draw constrained by the canvas size. e.g. when the canvas
|
||
is only half filled, we shouldn't be showing two points per pixel in the filled region.
|
||
(TimeSeriesChart.prototype._sampleTimeSeries): Refined the algorithm. First, compute the time difference or
|
||
the rank for each N data points. Sort those ranks in descending order (in the order we prefer), and include
|
||
all data points above the M-th rank in the sample.
|
||
(TimeSeriesChart.prototype.computeTimeGrid): Revert the inadvertent change in r212935.
|
||
|
||
* public/v3/models/time-series.js:
|
||
(TimeSeriesView.prototype.filter): Fixed a bug that the indices passed onto the callback were shifted by the
|
||
starting index.
|
||
* unit-tests/time-series-tests.js: Added a test case to ensure callbacks are called with correct data points
|
||
and indices.
|
||
|
||
2017-02-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
REGRESSION(r212542): Make TimeSeriesChart.computeTimeGrid stops x-axis grid prematurely
|
||
https://bugs.webkit.org/show_bug.cgi?id=168812
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Add time iterator of two months, three months, and four months with some tests.
|
||
|
||
Also for one-month time iterator, round the day of month to 1 or 15 whichever is closer.
|
||
|
||
* browser-tests/time-series-chart-tests.js: Added more tests.
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart._timeIterators.next):
|
||
(TimeSeriesChart._timeIterators):
|
||
|
||
2017-02-22 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add tests for InteractiveTimeSeriesChart and adopt actions
|
||
https://bugs.webkit.org/show_bug.cgi?id=168750
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added tests for InteractiveTimeSeriesChart.
|
||
|
||
Also replaced selection.onchange, selection.onzoom, indicator.onchange, annotations.onclick callbacks
|
||
by "selectionChange", "zoom", "indicatorChange", and "annotationClick" actions respectively.
|
||
|
||
Also fixed various bugs and bad code I encountered while writing these tests.
|
||
|
||
* browser-tests/index.html:
|
||
(waitForComponentsToRender): Delay the call to enqueueToRender until the next run loop because there
|
||
might be outstanding promises that just got resolved. e.g. for fetching measurement sets JSONs. Let
|
||
all those promises get resolved first. Otherwise, some tests become racy.
|
||
(canvasImageData): Extracted from time-series-chart-tests.js.
|
||
(canvasRefTest): Ditto.
|
||
(CanvasTest): Ditto.
|
||
(CanvasTest.fillCanvasBeforeRedrawCheck): Ditto.
|
||
(CanvasTest.hasCanvasBeenRedrawn): Ditto.
|
||
(CanvasTest.canvasImageData): Ditto.
|
||
(CanvasTest.expectCanvasesMatch): Ditto.
|
||
(CanvasTest.expectCanvasesMismatch): Ditto.
|
||
|
||
* browser-tests/time-series-chart-tests.js: Fixed some test cases where dpr multipler was not doing
|
||
the right thing anymore in Safari under a high DPI screen. Also added a lot of test cases for interactive
|
||
time series chart and one for rendering annotations.
|
||
(scripts): Moved.
|
||
(posixTime): Added. A helper function for sampleCluster.
|
||
(dayInMilliseconds): Ditto.
|
||
(sampleCluster): Moved here. Made the same cluster more artifical for an easier testing.
|
||
(createChartWithSampleCluster): Moved out of one of the tests.
|
||
(respondWithSampleCluster): Ditto.
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase.prototype.configure): Adopted new actions in InteractiveTimeSeriesChart.
|
||
|
||
* public/v3/components/chart-status-view.js:
|
||
(ChartStatusView.prototype.updateStatusIfNeeded): Removed a superflous console.log.
|
||
|
||
* public/v3/components/chart-styles.js:
|
||
(ChartStyles.mainChartOptions): Set zoomButton to true. InteractiveTimeSeriesChart used to determine
|
||
whether to show the zoom button or not based on the precense of the zoom callback. We made it explicit.
|
||
|
||
* public/v3/components/interactive-time-series-chart.js:
|
||
(InteractiveTimeSeriesChart.prototype.setIndicator): Explicitly call _notifySelectionChanged with false
|
||
instead of relying on undefined to be treated as falsey.
|
||
(InteractiveTimeSeriesChart.prototype._createCanvas): Use id instead of selector to find elements.
|
||
(InteractiveTimeSeriesChart.htmlTemplate):
|
||
(InteractiveTimeSeriesChart.cssTemplate):
|
||
(InteractiveTimeSeriesChart.prototype._mouseMove): Explicitly call _startOrContinueDragging with false
|
||
instead of relying on undefined treated as falsey. Also added the missing call to enqueueToRender found
|
||
by new tests. This was working fine on the dashboard due to other components invoking enqueueToRender
|
||
but won't work in a standalone instance of InteractiveTimeSeriesChart.
|
||
(InteractiveTimeSeriesChart.prototype._mouseLeave): Ditto, adding the missing call to enqueueToRender.
|
||
(InteractiveTimeSeriesChart.prototype._click): Removed the assignment to _forceRender when calling
|
||
_mouseMove in an early exist, which does set this flag and invokes enqueueToRender, and added the missing
|
||
call to enqueueToRender in the other code path.
|
||
(InteractiveTimeSeriesChart.prototype._startOrContinueDragging): Replaced annotations.onclick callback
|
||
by the newly added "annotationClick" action, and added the missing call to enqueueToRender.
|
||
(InteractiveTimeSeriesChart.prototype._endDragging): Use arrow function.
|
||
(InteractiveTimeSeriesChart.prototype._notifyIndicatorChanged): Replaced indicator.onchange callback by
|
||
the newly added "indicatorChange" action.
|
||
(InteractiveTimeSeriesChart.prototype._notifySelectionChanged): Replaced selection.onchange callback by
|
||
the newly added "selectionChange" action.
|
||
(InteractiveTimeSeriesChart.prototype._renderChartContent): Show the zoom button when options.zoomButton
|
||
is set instead of relying on the presence of selection.onzoom especially now that the callback has been
|
||
replaced by the "zoom" action.
|
||
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart.prototype.setAnnotations): Added the missing call to enqueueToRender.
|
||
|
||
* public/v3/main.js:
|
||
|
||
2017-02-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make sampling algorithm more stable and introduce an abstraction for sampled data
|
||
https://bugs.webkit.org/show_bug.cgi?id=168693
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Before this patch, TimeSeriesChart's resampling resulted in some points poping up and disappearing as
|
||
the width of a chart is changed. e.g. when resizing the browser window. The bug was by caused by
|
||
the sample for a given width not always including all points for a smaller width so as the width is
|
||
expanded, some point may be dropped.
|
||
|
||
Fixed this by using a much simpler algorithm of always picking a point when the time interval between
|
||
the preceding point and the succeeding point is larger than the minimum space we allow for a given width.
|
||
|
||
Also introduced a new abstraction around the sample data: TimeSeriesView. A TimeSeriesView provides
|
||
a similar API to TimeSeries for a subset of the time series filtered by a time range a custom function.
|
||
This paves a way to adding the ability to select baseline, etc... on the chart status view.
|
||
|
||
TimeSeriesView can be in two modes:
|
||
Mode 1. The view represents a contiguous subrange of TimeSeries - In this mode, this._data references
|
||
the underlying TimeSeries's _data directly, and we use _startingIndex to adjust index given to
|
||
find the relative index. Finding the next point or the previous point of a given point is done
|
||
via looking up the point's seriesIndex and doing a simple arithmetic. In general, an index is
|
||
converted to the absolute index in the underlying TimeSeries's _data array.
|
||
|
||
Mode 2. The view represents a filtered non-contiguous subset of TimeSeries - In this mode, this._data is
|
||
its own array. Finding the next point or the previous point of a given point requires finding
|
||
a sibling point in the underlying TimeSeries which is in this view. Since this may result in O(n)
|
||
traversal and a hash lookup, we lazily build a map of each point to its position in _data instead.
|
||
|
||
* public/v3/components/chart-status-view.js:
|
||
(ChartStatusView.prototype.updateStatusIfNeeded): Call selectedPoints instead of sampledDataBetween for
|
||
clarity. This function now returns a TimeSeriesView instead of a raw array.
|
||
|
||
* public/v3/components/interactive-time-series-chart.js:
|
||
(InteractiveTimeSeriesChart.prototype.currentPoint): Updated now that _sampledTimeSeriesData contains
|
||
an array of TimeSeriesView's. Note that diff is either 0, -1, or 1.
|
||
(InteractiveTimeSeriesChart.prototype.selectedPoints): Ditto. sampledDataBetween no longer exists since
|
||
we can simply call viewTimeRange on TimeSeriesView returned by sampledDataBetween.
|
||
(InteractiveTimeSeriesChart.prototype.firstSelectedPoint): Ditto.
|
||
(InteractiveTimeSeriesChart.prototype._sampleTimeSeries): Use add since excludedPoints is now a Set.
|
||
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart.prototype.sampledDataBetween): Deleted.
|
||
(TimeSeriesChart.prototype.firstSampledPointBetweenTime): Deleted.
|
||
(TimeSeriesChart.prototype._ensureSampledTimeSeries): Modernized the code. Use the the time interval of
|
||
the chart divided by the number of allowed points as the time interval used in the new sampling algorithm.
|
||
(TimeSeriesChart.prototype._sampleTimeSeries): Rewritten. We also create TimeSeriesView here.
|
||
(TimeSeriesChart.prototype._sampleTimeSeries.findMedian): Deleted.
|
||
(TimeSeriesChart.prototype._updateCanvasSizeIfClientSizeChanged): Fixed a bug that the canvas size wasn't
|
||
set to the correct value on Chrome when a high DPI screen is used.
|
||
|
||
* public/v3/models/time-series.js:
|
||
(TimeSeries.prototype.viewBetweenPoints): Renamed from dataBetweenPoints. Now returns a TimeSeriesView.
|
||
(TimeSeriesView): Added. This constructor is to be called by viewBetweenPoints, viewTimeRange, and filter.
|
||
(TimeSeriesView.prototype._buildPointIndexMap): Added. Used in mode (2).
|
||
(TimeSeriesView.prototype.length): Added.
|
||
(TimeSeriesView.prototype.firstPoint): Added.
|
||
(TimeSeriesView.prototype.lastPoint): Added.
|
||
(TimeSeriesView.prototype.nextPoint): Added. Note index is always a position in this._data. In mode (1),
|
||
this is the position of the point in the underlying TimeSeries' _data. In mode (2), this is the position
|
||
of the point in this._data which is dictinct from the underlying TimeSeries' _data.
|
||
(TimeSeriesView.prototype.previousPoint): Ditto.
|
||
(TimeSeriesView.prototype.findPointByIndex): Added. Finds the point using the positional index from the
|
||
beginning of this view. findPointByIndex(0) on one view may not be same as findPointByIndex(0) of another.
|
||
(TimeSeriesView.prototype.findById): Added. This is O(n).
|
||
(TimeSeriesView.prototype.values): Added. Returns the value of each point in this view.
|
||
(TimeSeriesView.prototype.filter): Added. Creates a new view with a subset of data points the predicate
|
||
function returned true.
|
||
(TimeSeriesView.prototype.viewTimeRange): Added. Creates a new view with a subset of data points for the
|
||
given time ragne. When the resultant view would include all points of this view, it simply returns itself
|
||
as an optimization.
|
||
(TimeSeriesView.prototype.firstPointInTimeRange): Added. Returns the first point in the view which lies
|
||
within the specified time range.
|
||
(TimeSeriesView.prototype.Symbol.iterator): Added. Iterates over each point in the view.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskChartPane.prototype.selectedPoints): Use selectedPoints in lieu of getting selection and then
|
||
calling sampledDataBetween with that range.
|
||
|
||
* public/v3/pages/summary-page.js:
|
||
(SummaryPageConfigurationGroup.set _medianForTimeRange): Modernized.
|
||
|
||
* unit-tests/time-series-tests.js: Added tests for TimeSeries and TimeSeriesView. Already caught bugs!
|
||
(addPointsToSeries):
|
||
|
||
2017-02-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add tests for the time series chart and fix bugs I found along the way
|
||
https://bugs.webkit.org/show_bug.cgi?id=168499
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Add basic tests for the time series chart.
|
||
|
||
Replaced the "ondata" callback set in the options by "dataChange" action now that ComponentBase provides
|
||
a facility for defining event-like actions.
|
||
|
||
Also fixed bugs I encountered while writing these tests see below for descriptions.
|
||
|
||
* browser-tests/editable-text-tests.js:
|
||
(waitToRender): Moved to index.html
|
||
* browser-tests/index.html:
|
||
(waitToRender): Moved from editable-text-tests.js.
|
||
(wait): Added.
|
||
* browser-tests/time-series-chart-tests.js: Added.
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase.prototype.configure):
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart): Removed the code to set display and position inline properties. This is now done inside
|
||
cssTemplate with :host pseudo class.
|
||
(TimeSeriesChart.prototype._ensureCanvas): Don't strech the canvas to 100% of width and height. This was
|
||
causing a flush of contents where the canvas is momentarily streched by the browser and the script later
|
||
updates with the content with the correct aspect ratio.
|
||
(TimeSeriesChart.cssTemplate): Added :host rule to set display: block and position: relative.
|
||
(TimeSeriesChart._updateAllCharts): Deleted.
|
||
(TimeSeriesChart.prototype.render): Only run the code for axis when options.axis is defined. Also, avoid
|
||
setting the fill style because we never fill for axis drawing.
|
||
(TimeSeriesChart.prototype._computeHorizontalRenderingMetrics): Ditto. Fallback to sensible values when
|
||
options.axis is not defined.
|
||
(TimeSeriesChart.prototype._renderYAxis): Now computeValueGrid generates a sequence of {time, label}.
|
||
(TimeSeriesChart.prototype._renderTimeSeries): Don't draw the shades for confidence intervals unless its
|
||
fill style is defined. Otherwise, we'd end up drawing black shade and mask the actual data points.
|
||
(TimeSeriesChart.prototype._ensureSampledTimeSeries): Dispatch newly added "dataChange" action instead of
|
||
calling "ondata" callback in options dictionary.
|
||
(TimeSeriesChart.computeTimeGrid): Modernized to use const/let. Also fixed the bug that we were emitting
|
||
the date even when the entire time range fit within a 24-hour interval.
|
||
(TimeSeriesChart.computeValueGrid): Rewritten to make MB/GB use a nice round number instead of 0.98GB.
|
||
We were using a power of 10 to round up the stepping value but the value formatter used a power of 1024
|
||
to divide byte measurements (e.g. for memory). Use formatter.divisor to find the right scaling factor for
|
||
each kind.
|
||
* public/v3/models/metric.js:
|
||
(Metric.prototype.makeFormatter):
|
||
(Metric.makeFormatter): Extracted from the one on the prototype so that tests don't need a metric object
|
||
just to test TimeSeriesChart. Added the second argument which specifies the maximum absolute value of the
|
||
range we're formatting. This is needed to use the same number of decimal points when the most significant
|
||
digit of some value is smaller than that of the biggest one. For example, we were emitting 0.50GB instead
|
||
of 0.5G along with 2.0GB. The "adjustment" reduces the number of significant figures in these cases.
|
||
* public/v3/pages/dashboard-page.js:
|
||
(DashboardPage.prototype._createChartForCell):
|
||
|
||
2017-02-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Use expect.js instead of expect in browser tests
|
||
https://bugs.webkit.org/show_bug.cgi?id=168492
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Use expect.js (https://github.com/Automattic/expect.js) instead of expect (https://github.com/mjackson/expect).
|
||
|
||
* browser-tests/close-button-tests.js:
|
||
* browser-tests/component-base-tests.js:
|
||
* browser-tests/editable-text-tests.js:
|
||
* browser-tests/index.html:
|
||
|
||
2017-02-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Modernize and fix measurement-set tests
|
||
https://bugs.webkit.org/show_bug.cgi?id=168484
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Modernized and fixed the tests in measurement-set-tests.js.
|
||
|
||
1. Return a promise instead of manually calling done in then/catch hanlders.
|
||
2. Use arrow function everywhere.
|
||
3. Explicitly assert the number of calls to callbacks instead of asserting never reached.
|
||
|
||
The test case labled "should return false when the range ends after the fetched cluster"
|
||
was incorrectly asserting that hasFetchedRange returns false when the end time is after
|
||
the primary cluster's end time. Test an interval before the primary cluster instead.
|
||
|
||
Added a test case for hasFetchedRange returning true when the end time appears after
|
||
the end of the primary cluster and fixed hasFetchedRange to that end. Since there are
|
||
no data points after the primary cluster which is chronologically the last cluster,
|
||
there is nothing to fetch beyond its end time.
|
||
|
||
* public/v3/models/measurement-set.js:
|
||
(MeasurementSet.prototype.hasFetchedRange): Fixed the bug that this function returned
|
||
false when the end time was after the primary cluster's end by truncating the range by
|
||
the end of the primary cluster.
|
||
* unit-tests/measurement-set-tests.js:
|
||
* unit-tests/resources/mock-remote-api.js:
|
||
(assert.notReached.assert.notReached): Deleted. It's no longer used by any tests.
|
||
|
||
2017-02-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Update ReadMe.md and merge it with Install.md
|
||
https://bugs.webkit.org/show_bug.cgi?id=168405
|
||
|
||
Reviewed by Michael Catanzaro.
|
||
|
||
Merged Install.md and ReadMe.md into one file.
|
||
|
||
* Install.md: Removed.
|
||
* ReadMe.md: Merged Install.md at the top and updated the rest of the content.
|
||
|
||
2017-01-24 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Modernize editable-text component and add tests
|
||
https://bugs.webkit.org/show_bug.cgi?id=167398
|
||
|
||
Reviewed by Yusuke Suzuki.
|
||
|
||
Modernized EditableText component to use the action feature added in r210938.
|
||
|
||
* browser-tests/editable-text-tests.js: Added. Added tests for EditableText component.
|
||
(.waitToRender):
|
||
* browser-tests/index.html:
|
||
* public/v3/components/base.js:
|
||
(ComponentBase.prototype.dispatchAction): Return the result from the callback.
|
||
* public/v3/components/editable-text.js:
|
||
(EditableText): Removed a bunch of instance variables that are no longer needed.
|
||
(EditableText.prototype.didConstructShadowTree): Added. Add event listeners on the Edit/Save button and the host.
|
||
(EditableText.prototype.editedText): Return the text field's value directly.
|
||
(EditableText.prototype.text): Added.
|
||
(EditableText.prototype.setText): Call enqueueToRender automatically instead of relying on the parent component
|
||
to do so in _startedEditingCallback, which has been removed.
|
||
(EditableText.prototype.render): Modernized the code.
|
||
(EditableText.prototype._didClick): No longer prevents the default action manually since that's automatically done
|
||
in createEventHandler. Handle the case where the update action is not handled.
|
||
(EditableText.prototype._endEditingMode): Renamed from _didUpdate.
|
||
(EditableText.htmlTemplate): Added ids on various elements in the shadow tree.
|
||
(EditableText.cssTemplate): Updated the CSS selectors per above change.
|
||
* public/v3/main.js:
|
||
(main): Fixed a typo.
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage): Use the action listener instead of manually setting callbacks.
|
||
(AnalysisTaskPage.prototype._createTestGroupListItem): Ditto.
|
||
(AnalysisTaskPage.prototype._didStartEditingTaskName): Deleted.
|
||
|
||
2017-01-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r210783. Didn't mean to require custom elements API.
|
||
|
||
* public/v3/main.js:
|
||
(main):
|
||
|
||
2017-01-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make sync-commits.py robust against missing Subversion authors and missing parent Git commits
|
||
https://bugs.webkit.org/show_bug.cgi?id=167231
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Fixed a bug that a subversion commit that's missing author name (anonymous commit) results in an out of bound
|
||
exception, and a bug that syncing a git repository starts failing once there was a merge commit which pulled
|
||
in a commit data earlier than that of the last reported commit.
|
||
|
||
For the latter fix, added --max-ancestor-fetch-count to specify the number of maximum commits to look back.
|
||
|
||
* tools/sync-commits.py:
|
||
(main): Added --max-ancestor-fetch-count.
|
||
(Repository.fetch_commits_and_submit): If submit_commits fails with FailedToFindParentCommit, fetch the parent
|
||
commit's information until we've resolved them all.
|
||
(Repository.fetch_next_commit): Renamed from fetch_commit.
|
||
(SVNRepository.fetch_next_commit): Renamed from fetch_commit. Don't try to get the author name if it's missing
|
||
due to an anonymous commit. It's important to never include the "author" field in the JSON submitted to
|
||
a dashboard since it rejects when "author" field is not an array (e.g. null).
|
||
(GitRepository.fetch_next_commit): Renamed from fetch_commit.
|
||
(GitRepository.fetch_commit): Added. Fetches the commit information for a given git hash. Used to retrieve
|
||
missing parent commits.
|
||
(GitRepository._revision_from_tokens): Extracted from fetch_commit.
|
||
|
||
* tools/util.py:
|
||
(submit_commits): Optionally takes status_to_accept to avoid throwing in the case of FailedToFindParentCommit
|
||
and returns the response JSON.
|
||
|
||
2017-01-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
REGRESSION(r198234): /api/commits/%revision% always fails
|
||
https://bugs.webkit.org/show_bug.cgi?id=167235
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
The bug was caused by a typo in CommitLogFetcher::fetch_revision, which was calling commit_for_revision on
|
||
$this->db instead of $this. This had been monkey-patched in the internal dashboard so it was working there.
|
||
|
||
Also fixed a bug that /latest wasn't doing what it claimed to do, and a bug that /oldest /latest,
|
||
and /last-reported would return a commit with all values set to null instead of an empty list.
|
||
|
||
Finally, added server API tests for /api/commits.
|
||
|
||
* public/api/commits.php:
|
||
(main): Add a comment for APIs that only exist for v2 UI.
|
||
|
||
* public/include/commit-log-fetcher.php:
|
||
(CommitLogFetcher::fetch_latest): Fixed the bug that this function was returning the oldest commit, not the
|
||
the latest commit as desired.
|
||
(CommitLogFetcher::fetch_revision): Fixed the bug that this function would always encounter an exception
|
||
because commit_for_revision is defined on $this, not $this->db.
|
||
(CommitLogFetcher::format_single_commit): Return an empty list instead of an array with a single commit with
|
||
all values set to null.
|
||
|
||
* server-tests/api-commits.js: Added. Added tests for the JSON API at /api/commits.
|
||
(.assertCommitIsSameAsOneSubmitted): Added. A helper function to compare a commit returned by /api/commits
|
||
to one sent to /api/report-commits.
|
||
|
||
2017-01-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
measurement-sets API can incorrectly order points with OS version without commit time
|
||
https://bugs.webkit.org/show_bug.cgi?id=167227
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Ignore revision_order for the purpose of ordering data points in /api/measurement-sets.
|
||
|
||
These orderings are used in some UI (e.g A/B testing) to order OS build numbers which do not have a timestamp
|
||
associated with each "revision".
|
||
|
||
The baseline measurements made in our internal dashboard were using these ordering numbers before ordering
|
||
results with build time. Because those data points don't have an associated Webkit revisions, all data points
|
||
were ordered first by macOS's revision_order, then build time. Because v3 UI completely ignores revision_order
|
||
for the purpose of plotting data points, this resulted in some data points being plotted in a wrong order
|
||
with some lines going backwards in time.
|
||
|
||
This patch addresses this discrepancy by stop ordering data points with revision_order in the JSON API.
|
||
|
||
* public/api/measurement-set.php:
|
||
(MeasurementSetFetcher::execute_query): Fixed the bug.
|
||
* server-tests/api-measurement-set-tests.js: Added a test.
|
||
|
||
2017-01-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r210626. We need to clear Triggerable's static map in each iteration.
|
||
|
||
* tools/sync-buildbot.js:
|
||
(syncLoop):
|
||
|
||
2017-01-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add a mechanism to dispatch and listen to an action
|
||
https://bugs.webkit.org/show_bug.cgi?id=167191
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Added the notion of an action to components. Like DOM events, it can be dispatched or listen to.
|
||
|
||
Also added ComponentBase.prototype.part which finds a sub-component inside a component's shadow tree,
|
||
and made ComponentBase.prototype.content take an id to find an element that matches it.
|
||
|
||
* browser-tests/close-button-tests.js: Added. Tests for CloseButton.
|
||
* browser-tests/component-base-tests.js: Added tests for ComponentBase's part(~), content(id), dispatchEvent.
|
||
* browser-tests/index.html:
|
||
* public/v3/components/base.js:
|
||
(ComponentBase): Added this._actionCallbacks, which is a map of an action name to a callback to be invoked.
|
||
(ComponentBase.prototype.content): Return an element of the given id if one is specified.
|
||
(ComponentBase.prototype.part): Find a component whose element has the matching id.
|
||
(ComponentBase.prototype.dispatchAction): Added.
|
||
(ComponentBase.prototype.listenToAction): Added.
|
||
(ComponentBase.prototype._ensureShadowTree): Call didConstructShadowTree.
|
||
(ComponentBase.prototype.didConstructShadowTree): Added.
|
||
(ComponentBase.prototype._recursivelyReplaceUnknownElementsByComponents): Copy attributes when instantiating
|
||
an element for a component when the browser doesn't support custom elements API.
|
||
(ComponentBase.createLink):
|
||
(ComponentBase.prototype.createEventHandler): Added.
|
||
(ComponentBase.createEventHandler): Renamed from createActionHandler.
|
||
* public/v3/components/button-base.js:
|
||
(ButtonBase.prototype.didConstructShadowTree): Added. Dispatch "activate" action when the button is clicked.
|
||
(ButtonBase.prototype.setCallback): Deleted.
|
||
(ButtonBase.htmlTemplate): Use id instead of class so that this.content() can find it.
|
||
(ButtonBase.cssTemplate): Updated style rules.
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane):
|
||
(ChartPane.prototype.didConstructShadowTree): Added. Listen to "activate" action on the close button.
|
||
(ChartPane.prototype.render): Fixed a bug that we were never calling enqueueToRender on the close button.
|
||
(ChartPane.htmlTemplate): Add the id on the close button.
|
||
|
||
2017-01-18 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
'buildbot-syncer.js' should be able to determine force build argument from a list of possible repositories.
|
||
https://bugs.webkit.org/show_bug.cgi?id=167152
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Add 'rootOptions' key which maps to a list of possible repositories.
|
||
For a build request, only one of the repositories in the list is valid.
|
||
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotSyncer.prototype._propertiesForBuildRequest):
|
||
(BuildbotSyncer._validateAndMergeProperties):
|
||
(BuildbotSyncer):
|
||
* unit-tests/buildbot-syncer-tests.js:
|
||
(sampleiOSConfig):
|
||
(sampleiOSConfigWithExpansions):
|
||
(createSampleBuildRequest):
|
||
(Promise.resolve.then):
|
||
* unit-tests/resources/mock-v3-models.js:
|
||
(MockModels.inject):
|
||
|
||
2017-01-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make calls to render() functions async
|
||
https://bugs.webkit.org/show_bug.cgi?id=167151
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Make calls to render() async by coalescing calls inside enqueueToRender(), which has been renamed from
|
||
updateRendering(). We now queue up all the components and wait until the next animation frame to invoke
|
||
render() on all those components.
|
||
|
||
This reduces render() calls in the summary page of our internal dashboard by 15x from ~9400 to ~600 by
|
||
eliminating pathological O(n^2) behavior between render() calls.
|
||
|
||
Consolidated TimeSeriesChart's enqueueRender into this newly added feature of ComponentBase along with
|
||
the support to call render() on a resize event. New implementation makes use of connectedCallback and
|
||
disconnectedCallback to avoid the work when the component is not in a document tree.
|
||
|
||
The rest of the patch concerns with renaming updateRendering to enqueueToRender and fixing a few minor bugs
|
||
that I encountered while working on this patch.
|
||
|
||
* browser-tests/component-base-tests.js: Added tests for ComponentBase.enqueueToRender().
|
||
* browser-tests/index.html:
|
||
(BrowserContext.prototype.importScripts): Renamed from importScript; Now supports loading multiple scripts.
|
||
(BrowserContext.prototype.importScript): Added.
|
||
(BrowserContext): Removed the unused createWithScripts.
|
||
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer.prototype._expandBetween):
|
||
* public/v3/components/bar-graph-group.js:
|
||
(BarGraphGroup.prototype.updateGroupRendering):
|
||
|
||
* public/v3/components/base.js:
|
||
(ComponentBase): When the browser doesn't support custom elements and
|
||
(ComponentBase.prototype.enqueueToRender): Renamed from updateRendering. Queues up the component to call
|
||
render() instead of immediately invoking it.
|
||
(ComponentBase.renderingTimerDidFire): Call render(). Since render() function often calls enqueueToRender
|
||
on child components, go ahead and invoke render() on any components enqueued during render() calls.
|
||
(ComponentBase._connectedComponentToRenderOnResize): Added.
|
||
(ComponentBase._disconnectedComponentToRenderOnResize): Added.
|
||
(ComponentBase.defineElement.elementClass.prototype.connectedCallback): Added. This is an optimization to
|
||
avoid the work when the component is not in the document; e.g. because the entire page component has been
|
||
detached from the document. The old implementation in TimeSeriesChart was not doing this.
|
||
(ComponentBase.defineElement.elementClass.prototype.disconnectedCallback): Added.
|
||
(ComponentBase): Replaced unused static variables with _componentsToRender and _componentsToRenderOnResize.
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase.prototype.fetchAnalysisTasks):
|
||
(ChartPaneBase.prototype.didUpdateAnnotations): Added. Addresses the bug that the annotation bars in the
|
||
charts shown an an analysis task doesn't update its color when the state is updated in the UI.
|
||
(ChartPaneBase.prototype._mainSelectionDidZoom):
|
||
(ChartPaneBase.prototype._updateStatus):
|
||
(ChartPaneBase.prototype._requestOpeningCommitViewer):
|
||
(ChartPaneBase.prototype._keyup):
|
||
(ChartPaneBase.prototype.render):
|
||
* public/v3/components/commit-log-viewer.js:
|
||
* public/v3/components/customizable-test-group-form.js:
|
||
(CustomizableTestGroupForm):
|
||
(CustomizableTestGroupForm.prototype._customize):
|
||
* public/v3/components/editable-text.js:
|
||
(EditableText.prototype._didUpdate):
|
||
* public/v3/components/interactive-time-series-chart.js:
|
||
* public/v3/components/pane-selector.js:
|
||
(PaneSelector.prototype._selectedItem):
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart): Removed the logic to update upon resize. See _connectedComponentToRenderOnResize above.
|
||
(TimeSeriesChart.prototype.get enqueueToRenderOnResize): Added. Returns true.
|
||
(TimeSeriesChart.prototype.enqueueToRender): Deleted.
|
||
(TimeSeriesChart._renderEnqueuedCharts): Deleted.
|
||
(TimeSeriesChart): Call ComponentBase.defineElement to make this a proper component so that the logic in
|
||
connectedCallback to update upon resize event would work.
|
||
* public/v3/instrumentation.js:
|
||
(Instrumentation.dumpStatistics): Sort results by the key names.
|
||
* public/v3/models/time-series.js:
|
||
(TimeSeries.prototype.values): Added. This method was never ported to v3 in r198462, and broke the feature
|
||
to show moving averages, etc... on the charts page.
|
||
* public/v3/pages/analysis-category-page.js:
|
||
(AnalysisCategoryPage.prototype.open):
|
||
(AnalysisCategoryPage.prototype.updateFromSerializedState):
|
||
(AnalysisCategoryPage.prototype.filterDidChange):
|
||
(AnalysisCategoryPage.prototype.render):
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskChartPane.prototype._updateStatus):
|
||
(AnalysisTaskPage.prototype.updateFromSerializedState):
|
||
(AnalysisTaskPage.prototype._didFetchTask):
|
||
(AnalysisTaskPage.prototype._didFetchRelatedAnalysisTasks):
|
||
(AnalysisTaskPage.prototype._didFetchMeasurement):
|
||
(AnalysisTaskPage.prototype._didFetchTestGroups):
|
||
(AnalysisTaskPage.prototype._showAllTestGroups):
|
||
(AnalysisTaskPage.prototype._didFetchAnalysisResults):
|
||
(AnalysisTaskPage.prototype.render):
|
||
(AnalysisTaskPage.prototype._renderTestGroupList.):
|
||
(AnalysisTaskPage.prototype._renderTestGroupList):
|
||
(AnalysisTaskPage.prototype._createTestGroupListItem):
|
||
(AnalysisTaskPage.prototype._showTestGroup):
|
||
(AnalysisTaskPage.prototype._didStartEditingTaskName):
|
||
(AnalysisTaskPage.prototype._updateTaskName):
|
||
(AnalysisTaskPage.prototype._updateTestGroupName):
|
||
(AnalysisTaskPage.prototype._hideCurrentTestGroup):
|
||
(AnalysisTaskPage.prototype._updateChangeType): Fixed the bug that we were never updating annotation bars
|
||
in the main chart by calling didUpdateAnnotations.
|
||
(AnalysisTaskPage.prototype._associateBug):
|
||
(AnalysisTaskPage.prototype._dissociateBug):
|
||
(AnalysisTaskPage.prototype._associateCommit):
|
||
(AnalysisTaskPage.prototype._dissociateCommit):
|
||
(AnalysisTaskPage.prototype._chartSelectionDidChange):
|
||
(AnalysisTaskPage.prototype._selectedRowInAnalysisResultsViewer):
|
||
* public/v3/pages/build-request-queue-page.js:
|
||
(BuildRequestQueuePage.prototype.open.):
|
||
(BuildRequestQueuePage.prototype.open):
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane.prototype.setOpenRepository):
|
||
(ChartPane.prototype._renderTrendLinePopover): Fixed a race condition. Insert a select element as needed
|
||
before trying to assign the current value on it.
|
||
(ChartPane.prototype._trendLineTypeDidChange):
|
||
(ChartPane.prototype._updateTrendLine):
|
||
* public/v3/pages/charts-page.js:
|
||
(ChartsPage.prototype.updateFromSerializedState):
|
||
(ChartsPage.prototype._updateDomainsFromSerializedState):
|
||
(ChartsPage.prototype.setNumberOfDaysFromToolbar):
|
||
(ChartsPage.prototype._didMutatePaneList):
|
||
(ChartsPage.prototype.render):
|
||
* public/v3/pages/charts-toolbar.js:
|
||
(ChartsToolbar.prototype.render):
|
||
* public/v3/pages/create-analysis-task-page.js:
|
||
(CreateAnalysisTaskPage.prototype.updateFromSerializedState):
|
||
* public/v3/pages/dashboard-page.js:
|
||
(DashboardPage.prototype.updateFromSerializedState):
|
||
(DashboardPage.prototype._fetchedData):
|
||
* public/v3/pages/heading.js:
|
||
(Heading.prototype.render):
|
||
* public/v3/pages/page-with-heading.js:
|
||
(PageWithHeading.prototype.render):
|
||
* public/v3/pages/page.js:
|
||
(Page.prototype.open):
|
||
* public/v3/pages/summary-page.js:
|
||
(SummaryPage.prototype.open):
|
||
(SummaryPage.prototype.this._renderQueue.push):
|
||
(SummaryPage):
|
||
(SummaryPage.prototype._renderCell):
|
||
|
||
2017-01-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add the build fix for browsers that don't yet support custom elements SPI.
|
||
It was supposedly to be a part of the previous commit.
|
||
|
||
* public/v3/components/base.js:
|
||
(ComponentBase.defineElement):
|
||
|
||
2017-01-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Adopt custom elements API in perf dashboard
|
||
https://bugs.webkit.org/show_bug.cgi?id=167045
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Adopt custom elements API in ComponentBase, and create the shadow tree lazily in content() and render()
|
||
instead of eagerly creating it inside the constructor.
|
||
|
||
For now, create a separate element class for each component in ComponentBase.defineElement instead of
|
||
making ComponentBase inherit from HTMLElement to preserve the semantics we have as well as to test
|
||
the boundaries of what custom elements API allows for framework authors.
|
||
|
||
In order to ensure one-to-one correspondence between elements and their components, we use a static map,
|
||
ComponentBase._currentlyConstructedByInterface, to remember which element or component is being created
|
||
and use that in custom element's constructor to update element.component() and this._element.
|
||
|
||
Also dropped the support for not having attachShadow as we've shipped this feature in Safari 10.
|
||
|
||
Finally, added tests to be ran inside a browser to test the front end code in browser-tests.
|
||
|
||
* browser-tests/component-base-tests.js: Added. Basic tests for ComponentBase.
|
||
* browser-tests/index.html: Added.
|
||
|
||
* public/v3/components/base.js:
|
||
(ComponentBase): Don't create the shadow tree. Use the currently constructed element as this._element if
|
||
there is one (the custom element's constructor is getting called). Otherwise create a new element but
|
||
store this component in the map to avoid creating a new component in the custom element's constructor.
|
||
(ComponentBase.prototype.content): Lazily create the shadow tree now.
|
||
(ComponentBase.prototype.render): Ditto.
|
||
(ComponentBase.prototype._ensureShadowTree): Renamed from _constructShadowTree. Dropped the support for
|
||
not having shadow DOM API. This is now required. Also use importNode instead of cloneNode in cloning
|
||
the template content since the latter would not get upgraded.
|
||
(ComponentBase.prototype._recursivelyReplaceUnknownElementsByComponents): Modernized the code. Don't
|
||
re-create a component if its element had already been upgraded by its custom element constructor.
|
||
(ComponentBase.defineElement): Add this component to the static maps. _componentByName is used by
|
||
_recursivelyReplaceUnknownElementsByComponents to instantiate new components in the browsers that don't
|
||
support custom elements API and _componentByClass is used by ComponentBase's constructor to lookup the
|
||
element name. The latter should go away once all components fully adopt ComponentBase.defineElement.
|
||
(ComponentBase.defineElement.elementClass): A class to define a custom element for the component.
|
||
We need to reconfigure the property since class's name is not writable but configurable.
|
||
|
||
* public/v3/components/button-base.js:
|
||
(ButtonBase.htmlTemplate): Added. Extracted the common code from CloseButton and WarningIcon.
|
||
(ButtonBase.buttonContent): Added. An abstract method overridden by CloseButton and WarningIcon.
|
||
(ButtonBase.sizeFactor): Added. Overridden by WarningIcon.
|
||
(ButtonBase.cssTemplate): Updated to use :host.
|
||
* public/v3/components/close-button.js:
|
||
(CloseButton.buttonContent): Renamed from htmlTemplate.
|
||
* public/v3/components/spinner-icon.js:
|
||
(SpinnerIcon.cssTemplate): Removed webkit prefixed properties, and updated it to animate stroke instead
|
||
of opacity to reduce the power usage.
|
||
(SpinnerIcon.htmlTemplate): Factored stroke, stroke-width, and stroke-linecap into cssTemplate.
|
||
* public/v3/components/warning-icon.js:
|
||
(WarningIcon.cssTemplate): Deleted.
|
||
(WarningIcon.sizeFactor): Added.
|
||
(WarningIcon.buttonContent): Renamed from htmlTemplate.
|
||
* public/v3/pages/summary-page.js:
|
||
(SummaryPage._constructRatioGraph): Fixed a bug that we were not never calling spinner.updateRendering().
|
||
(SummaryPage.prototype._renderCell):
|
||
|
||
2017-01-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Instrument calls to render()
|
||
https://bugs.webkit.org/show_bug.cgi?id=167037
|
||
|
||
Reviewed by Sam Weinig.
|
||
|
||
Wrap every call to render() by newly added ComponentBase.updateRendering() to instrument it.
|
||
Also, use arrow functions instead of this.render.bind or regular closures for simplicity.
|
||
|
||
Currently, we're making 5100 calls to render() while opening the summary page, and that's way too high.
|
||
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer.prototype._expandBetween):
|
||
* public/v3/components/bar-graph-group.js:
|
||
(BarGraphGroup.prototype.updateGroupRendering): Renamed form render() as BarGraphGroup is not a component.
|
||
* public/v3/components/base.js:
|
||
(ComponentBase.prototype.updateRendering): Added. Instruments render() call.
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase.prototype.fetchAnalysisTasks):
|
||
(ChartPaneBase.prototype._mainSelectionDidZoom):
|
||
(ChartPaneBase.prototype._updateStatus):
|
||
(ChartPaneBase.prototype._requestOpeningCommitViewer):
|
||
(ChartPaneBase.prototype._keyup):
|
||
(ChartPaneBase.prototype.render):
|
||
* public/v3/components/commit-log-viewer.js:
|
||
* public/v3/components/customizable-test-group-form.js:
|
||
(CustomizableTestGroupForm):
|
||
(CustomizableTestGroupForm.prototype._customize):
|
||
* public/v3/components/editable-text.js:
|
||
(EditableText.prototype._didUpdate):
|
||
* public/v3/components/pane-selector.js:
|
||
(PaneSelector.prototype._selectedItem):
|
||
* public/v3/components/results-table.js:
|
||
(ResultsTable.prototype.render):
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart._renderEnqueuedCharts):
|
||
* public/v3/pages/analysis-category-page.js:
|
||
(AnalysisCategoryPage.prototype.open):
|
||
(AnalysisCategoryPage.prototype.updateFromSerializedState):
|
||
(AnalysisCategoryPage.prototype.filterDidChange):
|
||
(AnalysisCategoryPage.prototype.render):
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskChartPane.prototype._updateStatus):
|
||
(AnalysisTaskPage.prototype.updateFromSerializedState):
|
||
(AnalysisTaskPage.prototype._didFetchTask):
|
||
(AnalysisTaskPage.prototype._didFetchRelatedAnalysisTasks):
|
||
(AnalysisTaskPage.prototype._didFetchMeasurement):
|
||
(AnalysisTaskPage.prototype._didFetchTestGroups):
|
||
(AnalysisTaskPage.prototype._showAllTestGroups):
|
||
(AnalysisTaskPage.prototype._didFetchAnalysisResults):
|
||
(AnalysisTaskPage.prototype.render):
|
||
(AnalysisTaskPage.prototype._renderTestGroupList.):
|
||
(AnalysisTaskPage.prototype._renderTestGroupList):
|
||
(AnalysisTaskPage.prototype._createTestGroupListItem):
|
||
(AnalysisTaskPage.prototype._showTestGroup):
|
||
(AnalysisTaskPage.prototype._didStartEditingTaskName):
|
||
(AnalysisTaskPage.prototype._updateTaskName):
|
||
(AnalysisTaskPage.prototype._updateTestGroupName):
|
||
(AnalysisTaskPage.prototype._hideCurrentTestGroup):
|
||
(AnalysisTaskPage.prototype._updateChangeType):
|
||
(AnalysisTaskPage.prototype._associateBug):
|
||
(AnalysisTaskPage.prototype._dissociateBug):
|
||
(AnalysisTaskPage.prototype._associateCommit):
|
||
(AnalysisTaskPage.prototype._dissociateCommit):
|
||
(AnalysisTaskPage.prototype._chartSelectionDidChange):
|
||
(AnalysisTaskPage.prototype._selectedRowInAnalysisResultsViewer):
|
||
* public/v3/pages/build-request-queue-page.js:
|
||
(BuildRequestQueuePage.prototype.open.):
|
||
(BuildRequestQueuePage.prototype.open):
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane.prototype.setOpenRepository):
|
||
(ChartPane.prototype._trendLineTypeDidChange):
|
||
(ChartPane.prototype._updateTrendLine):
|
||
* public/v3/pages/charts-page.js:
|
||
(ChartsPage.prototype.updateFromSerializedState):
|
||
(ChartsPage.prototype._updateDomainsFromSerializedState):
|
||
(ChartsPage.prototype.setNumberOfDaysFromToolbar):
|
||
(ChartsPage.prototype._didMutatePaneList):
|
||
(ChartsPage.prototype.render):
|
||
* public/v3/pages/charts-toolbar.js:
|
||
(ChartsToolbar.prototype.render):
|
||
* public/v3/pages/create-analysis-task-page.js:
|
||
(CreateAnalysisTaskPage.prototype.updateFromSerializedState):
|
||
* public/v3/pages/dashboard-page.js:
|
||
(DashboardPage.prototype.updateFromSerializedState):
|
||
(DashboardPage.prototype._fetchedData):
|
||
* public/v3/pages/heading.js:
|
||
(Heading.prototype.render):
|
||
* public/v3/pages/page-with-heading.js:
|
||
(PageWithHeading.prototype.render):
|
||
* public/v3/pages/page.js:
|
||
(Page.prototype.open):
|
||
* public/v3/pages/summary-page.js:
|
||
(SummaryPage.prototype.open):
|
||
(SummaryPage.prototype.this._renderQueue.push):
|
||
(SummaryPage):
|
||
(SummaryPage.prototype._renderCell):
|
||
|
||
2017-01-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Outliers are not hidden in v3 UI
|
||
https://bugs.webkit.org/show_bug.cgi?id=166966
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Fixed the typo in addToSeries. An outlier has markedOutlier set to true, not isOutlier.
|
||
|
||
Also fixed a bug unveiled by new tests in MeasurementRootSet.ensureSingleton. It was was creating
|
||
a new MeasurementRootSet each time it was called instead of finding an existing instance. Fixed the bug
|
||
by merging the static maps of MeasurementRootSet and RootSet.
|
||
|
||
* public/v3/models/measurement-cluster.js:
|
||
(MeasurementCluster.prototype.addToSeries): Fixed the bug.
|
||
* public/v3/models/root-set.js:
|
||
(MeasurementRootSet.prototype.namedStaticMap): Added.
|
||
(MeasurementRootSet.prototype.ensureNamedStaticMap): Added.
|
||
(MeasurementRootSet.namedStaticMap): Added.
|
||
(MeasurementRootSet.ensureNamedStaticMap): Added.
|
||
* unit-tests/measurement-set-tests.js: Added tests for adopting time series data from a cluster.
|
||
|
||
2017-01-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Hide the UI to trigger an A/B testing when there are no triggerables
|
||
https://bugs.webkit.org/show_bug.cgi?id=166964
|
||
|
||
Reviewed by Yusuke Suzuki.
|
||
|
||
Hide the "Start A/B Testing" button on analysis task pages instead of showing it and failing later
|
||
when the user tries to create one it with a TriggerableNotFound error.
|
||
|
||
Added the list of triggerables to the manifest JSON so that we can determine this condition without
|
||
having to fetch /api/triggerable for each analysis task as done in v2 UI.
|
||
|
||
* public/admin/reprocess-report.php:
|
||
* public/api/manifest.php:
|
||
* public/api/report.php:
|
||
* public/include/admin-header.php:
|
||
* public/include/manifest-generator.php: Moved from public/include/manifest.php.
|
||
(ManifestGenerator::generate):
|
||
(ManifestGenerator::triggerables): Added. Include the list of repositories this triggerable accepts
|
||
as well as the list of (test, platform) pairs on which this triggerable is available.
|
||
Use [testId, platformId] instead of a dictionary to reduce the file size.
|
||
* public/v3/components/customizable-test-group-form.js:
|
||
(CustomizableTestGroupForm): Removed this._disabled. This variable was used in TestGroupFrom to
|
||
disable the "Start A/B Testing" button when no range is selected but this ended up racy. Compute
|
||
the visibility of the button in render() function instead.
|
||
(CustomizableTestGroupForm.prototype.setRootSetMap):
|
||
(CustomizableTestGroupForm.prototype._submitted):
|
||
(CustomizableTestGroupForm.prototype.render): Hide the customize link and the button as needed.
|
||
The "Start A/B Testing" button must be hidden when either no range is selected or no title is typed.
|
||
"Customize" button must be hidden when no range is selected.
|
||
* public/v3/components/test-group-form.js:
|
||
(TestGroupForm): Removed _disabled since it's no longer used.
|
||
(TestGroupForm.prototype.setDisabled): Ditto.
|
||
(TestGroupForm.prototype.render): Ditto.
|
||
* public/v3/index.html: Include triggerable.js.
|
||
* public/v3/models/manifest.js:
|
||
(Manifest._didFetchManifest): Modernized. Create Triggerable objects from the manifest JSON.
|
||
* public/v3/models/triggerable.js: Added.
|
||
(Triggerable): Add this triggerable object to the static map of (test id, platform id) pair.
|
||
(Triggerable.prototype.acceptedRepositories): Added.
|
||
(Triggerable.findByTestConfiguration): Added. Finds a triggerable in the aforementioned static map.
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskChartPane.prototype._updateStatus): Added. Re-render the page since time series data
|
||
points that were previously not available may have become available. The lack of this update was
|
||
causing a race condition in which the "Start A/B Testing" button for the charts is disabled even
|
||
after a group name had been specified because setRootSetMap was never called with a valid set.
|
||
(AnalysisTaskPage): Added this._triggerable.
|
||
(AnalysisTaskPage.prototype._didFetchTask): Find the triggerable now that we've fetched the task.
|
||
(AnalysisTaskPage.prototype.render): Hide the group view (the table of A/B testing results) entirely
|
||
when there are no groups to show. Also hide the forms to start A/B testing when there are no matching
|
||
triggerable, which is the main feature of this patch.
|
||
* server-tests/api-manifest.js: Added a test for including a list of triggerables in the manifest JSON.
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.resetV3Models): Reset Triggerable's static map.
|
||
* server-tests/tools-buildbot-triggerable-tests.js: Assert that Triggerable objects are constructed
|
||
with appropriate list of repositories and (test, platform) associations.
|
||
* tools/js/database.js:
|
||
(tableToPrefixMap): Added triggerable_repositories's prefix.
|
||
* tools/js/remote.js:
|
||
(RemoteAPI.prototype.getJSON): Log the entire response to stderr when JSON.parse fails to aid debugging.
|
||
* tools/js/v3-models.js: Import triggerable.js.
|
||
|
||
2017-01-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
fetch-from-remote doesn’t work with some websites
|
||
https://bugs.webkit.org/show_bug.cgi?id=166963
|
||
|
||
Reviewed by Yusuke Suzuki.
|
||
|
||
Apparently file_get_contents is not compatible with some SSL/TLS connections.
|
||
Use curl_* functions to access remote servers instead.
|
||
|
||
* public/admin/fetch-from-remote.php:
|
||
(fetch_remote):
|
||
|
||
2017-01-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Another build fix. Always use UTC when expressing commit times in UNIX-epoch timestamps.
|
||
|
||
* public/api/measurement-set.php:
|
||
|
||
2017-01-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix a typo in the previous commit.
|
||
|
||
* public/api/measurement-set.php:
|
||
|
||
2017-01-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fixes for older versions of Postgres.
|
||
|
||
Also redirect / and /# to /v3/ as intended in r200820.
|
||
|
||
* public/api/measurement-set.php:
|
||
* public/api/runs.php:
|
||
* public/index.html:
|
||
|
||
2016-10-18 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Update test cases for change r206465.
|
||
https://bugs.webkit.org/show_bug.cgi?id=163618
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Update test case for change r206465 which added support for multiple summary pages.
|
||
Use deepStrictEqual instead of deepEqual as deepEqual will not complain in the case like 'deepEqual([],{})'.
|
||
Fix a test failure in tools-buildbot-triggerable-tests.js.
|
||
Fix a bug in generating manifest.
|
||
|
||
* config.json:
|
||
* public/include/manifest.php:
|
||
* server-tests/api-manifest.js:
|
||
(TestServer.remoteAPI.getJSON.string_appeared_here.then):
|
||
* server-tests/tools-buildbot-triggerable-tests.js:
|
||
(then):
|
||
|
||
2016-09-27 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Extend perf dashboard to support multiple summary pages.
|
||
https://bugs.webkit.org/show_bug.cgi?id=162594
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Start support multiple summary pages instead of one.
|
||
Specify 'summaryPages' as key that map to a list of summaries which follows
|
||
current 'summary' format in 'config.json' but with 2 more properties:
|
||
'name': specifying the name shows on perf dashboard,
|
||
'route': specifying the path to this page.
|
||
|
||
* public/include/manifest.php:
|
||
* public/v3/main.js:
|
||
(main):
|
||
(main.): Deleted.
|
||
* public/v3/models/manifest.js:
|
||
(Manifest._didFetchManifest):
|
||
(Manifest):
|
||
* public/v3/pages/summary-page.js:
|
||
(SummaryPage):
|
||
(SummaryPage.prototype.routeName):
|
||
|
||
2016-08-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Don't filter out the latest data point in chart data sampling
|
||
https://bugs.webkit.org/show_bug.cgi?id=160714
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Exclude the last data point from sampling so that it's always included in the "sampled" charts data.
|
||
Without this, the last data point can change as we zoom out the time domain.
|
||
|
||
Luckily, we already had a mechanism to exclude the user selected point from sampling. Extend this
|
||
feature by supporting an array of point IDs instead of a single ID to exclude from filering.
|
||
|
||
* public/v3/components/interactive-time-series-chart.js:
|
||
(InteractiveTimeSeriesChart.prototype._sampleTimeSeries): Replaced exclusionPointID by excludedPoints.
|
||
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart.prototype._ensureSampledTimeSeries): Put the last data point in excludedPoints.
|
||
(TimeSeriesChart.prototype._sampleTimeSeries): Check point's id against the list of IDs.
|
||
|
||
2016-08-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r204187. interval has to be a getter, not a method.
|
||
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart.prototype._renderTimeSeries):
|
||
* public/v3/models/measurement-adaptor.js:
|
||
(MeasurementAdaptor.prototype.applyTo):
|
||
|
||
2016-08-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix a typo that was supposed to be fixed in r204296 before landing.
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane):
|
||
(ChartPane.prototype.updateFromSerializedState):
|
||
(ChartPane.prototype._analyzeRange):
|
||
(ChartPane.prototype._renderTrendLinePopover):
|
||
(ChartPane.prototype._trendLineTypeDidChange):
|
||
|
||
2016-08-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Always show segmentation on v3 charts page
|
||
https://bugs.webkit.org/show_bug.cgi?id=160576
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Added "Trend Lines" popover to select and customize a moving average or a segmentation to show on charts page
|
||
and made Schwarz criterion segmentation the default trend line for all charts.
|
||
|
||
Because computing the segmentation is expensive, we use WebWorker to parallelize the computation via AsyncTask.
|
||
We also compute and cache the segmentation for each cluster separately to avoid processing the entire measurement
|
||
set as that could take 10-20s total, which was a huge problem in v2 UI. v3 UI's approach is more incremental and
|
||
even opens up an opportunity to cache the results in the server side.
|
||
|
||
Also brought back "shading" for the confidence interval drawing as done in v1 and v2 UI.
|
||
|
||
* public/shared/statistics.js:
|
||
(Statistics.segmentTimeSeriesByMaximizingSchwarzCriterion): Added segmentCountWeight and gridSize as arguments
|
||
to customize the algorithm.
|
||
(Statistics.splitIntoSegmentsUntilGoodEnough): Takes segmentCountWeight as BirgeAndMassartC.
|
||
|
||
* public/v3/async-task.js: Added.
|
||
(AsyncTask): Added. This class represents a task such as computing segmentation to be executed in a worker.
|
||
(AsyncTask.prototype.execute): Added. Returns a promise that gets resolved when the specified task completes.
|
||
(AsyncTaskWorker.waitForAvailableWorker): Added. Calls the given callback with the first available worker. When
|
||
all workers are processing some tasks, it waits until one becomes available by putting the callback into a queue.
|
||
_didRecieveMessage pops an item out of this queue when a worker completes a task. We don't use a promise here
|
||
because calling this function multiple times synchronously could result in all the returned promises getting
|
||
resolved with the same worker as none of the callers get to lock away the first available worker until the end
|
||
of the current micro-task.
|
||
(AsyncTaskWorker._makeWorkerEventuallyAvailable): Added. A helper function for waitForAvailableWorker. Start
|
||
a new worker if the number of workers we've started is less than the number of extra cores (e.g. 7 if there are
|
||
8 cores on the machine). Avoid starting a new worker if we've started a new worker within the last 50 ms since
|
||
starting a new worker takes some time.
|
||
(AsyncTaskWorker._findAvailableWorker): Added. Finds a worker that's available right now if there is any.
|
||
(AsyncTaskWorker): Added. An instance of AsyncTaskWorker represents a Web worker.
|
||
(AsyncTaskWorker.prototype.id): Added.
|
||
(AsyncTaskWorker.prototype.sendTask): Added. Sends a task represented by AsyncTask to the worker.
|
||
(AsyncTaskWorker.prototype._didRecieveMessage): Added. This function gets called when the current task completes
|
||
in the worker. Pop the next callback if some caller of waitForAvailableWorker is still waiting. Otherwise stop
|
||
the worker after one second of waiting to avoid worker churning.
|
||
(AsyncTaskWorker.workerDidRecieveMessage): Added. Called by onmessage on the worker. Executes the specified task
|
||
and sends back a message upon completion with the appropriate timing data.
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase.prototype.configure): Uses _createSourceList.
|
||
(ChartPaneBase.prototype._createSourceList): Added. Extracted from configure to customize the source list for
|
||
the main chart and the overview chart.
|
||
(ChartPaneBase.prototype._updateSourceList): Uses _createSourceList.
|
||
|
||
* public/v3/components/chart-styles.js:
|
||
(ChartStyles.createSourceList): Added a boolean showPoint as an extra argument. This specifies whether circles
|
||
are drawn for each data point.
|
||
(ChartStyles.baselineStyle): Added styles for foreground lines and background lines. They're used for trend lines
|
||
and underlying raw data respectively when trend lines are shown.
|
||
(ChartStyles.targetStyle): Ditto.
|
||
(ChartStyles.currentStyle): Ditto.
|
||
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart): Added _trendLines, _renderedTrendLines, and _fetchedTimeSeries as instance variables.
|
||
(TimeSeriesChart.prototype.setSourceList): Clear _fetchedTimeSeries before calling setSourceList for consistency.
|
||
(TimeSeriesChart.prototype.sourceList): Added.
|
||
(TimeSeriesChart.prototype.clearTrendLines): Added.
|
||
(TimeSeriesChart.prototype.setTrendLine): Added. Preserves the existing trend lines for other sources. This is
|
||
necessary because segmentation for "current" and "baseline" lines may become available at different times, and we
|
||
don't want to clear one or the other when setting one.
|
||
(TimeSeriesChart.prototype._layout): Added a call to _ensureTrendLines.
|
||
(TimeSeriesChart.prototype._renderChartContent): Call _renderTimeSeries for trend lines. Trend lines are always
|
||
foreground lines and "regular" raw data points are drawn as background if there are trend lines.
|
||
(TimeSeriesChart.prototype._renderTimeSeries): Added layerName as an argument. It could be an empty string,
|
||
"foreground", or "background". Draw a "shade" just like v1 and v2 UI instead of vertical lines for the confidence
|
||
intervals. Pick "foreground", "background", or "regular" chart style based on layerName. Also avoid drawing data
|
||
points when *PointRadius is set to zero to reduce the runtime of this function.
|
||
(TimeSeriesChart.prototype._sourceOptionWithFallback): Added.
|
||
(TimeSeriesChart.prototype._ensureSampledTimeSeries): When *PointRadius is 0, show as many points as there are x
|
||
coordinates as a fallback instead of showing every point.
|
||
(TimeSeriesChart.prototype._ensureTrendLines): Added. Returns true if the chart contents haven't been re-rendered
|
||
since the last update to trend lines. This flag is unset by setTrendLine.
|
||
|
||
* public/v3/index.html:
|
||
|
||
* public/v3/models/measurement-cluster.js:
|
||
(MeasurementCluster.prototype.addToSeries): Store the data points' index to idMap to help aid MeasurementSet's
|
||
_cachedClusterSegmentation efficiently re-create the segmentation from the cache.
|
||
|
||
* public/v3/models/measurement-set.js:
|
||
(MeasurementSet): Added _segmentationCache as an instance variable.
|
||
(MeasurementSet.prototype.fetchSegmentation): Added. Calls _cachedClusterSegmentation on each cluster, and
|
||
constructs the time series representation of the segmentation from the results.
|
||
(MeasurementSet.prototype._cachedClusterSegmentation): Computes and caches the segmentation for each cluster.
|
||
The cache of segmentation stores ID of each measurement set at which segment changes instead of its index since
|
||
the latter could change in any moment when a new test result is reported, or an existing test result is removed
|
||
from the time series; e.g. when it's marked as an outlier.
|
||
(MeasurementSet.prototype._validateSegmentationCache): Added. Checks whether the cached segmentation's name and
|
||
its parameters match that of the requested one.
|
||
(MeasurementSet.prototype._invokeSegmentationAlgorithm): Added. Invokes the segmentation algorithm either in the
|
||
main thread or in a Web worker via AsyncTask API based on the size of the time series. While parallelizing the
|
||
work is beneficial when the data set is large, the overhead can add up if we keep processing a very small data
|
||
set in a worker.
|
||
|
||
* public/v3/models/time-series.js: Made the file compatible with Node.
|
||
(TimeSeries.prototype.length): Added.
|
||
(TimeSeries.prototype.valuesBetweenRange): Added.
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(createTrendLineExecutableFromAveragingFunction): Added.
|
||
(ChartTrendLineTypes): Added. Similar to StatisticsStrategies (statistics-strategies.js) in v2 UI.
|
||
(ChartPane): Added _trendLineType, _trendLineParameters, _trendLineVersion, and _renderedTrendLineOptions as
|
||
instance variables.
|
||
(ChartPane.prototype.serializeState): Serialize the trend line option. This format is compatible with v2 UI.
|
||
(ChartPane.prototype.updateFromSerializedState): Ditto. Parsing is compatible with v2 UI except that we now have
|
||
the default trend line set when the specified ID doesn't match an existing type ID.
|
||
(ChartPane.prototype._renderActionToolbar): Added a call to _renderTrendLinePopover. This is the popover that
|
||
specifies the type of a trend line to show as well as its parameters.
|
||
(ChartPane.prototype._renderTrendLinePopover): Added. A popover for specifying and customizing a trend line.
|
||
(ChartPane.prototype._trendLineTypeDidChange): Added. Called when a new trend line is selected.
|
||
(ChartPane.prototype._defaultParametersForTrendLine): Added.
|
||
(ChartPane.prototype._trendLineParameterDidChange): Added. Called when the trend lines' parameters are changed.
|
||
(ChartPane.prototype._didFetchData): Added. Overrides the one in ChartPaneBase to trigger a trend line update.
|
||
(ChartPane.prototype._updateTrendLine): Added. Update the trend line. Since segmentation can take an arbitrary
|
||
long time, avoid updating trend lines if this function had been called again (possibly for a different trend line
|
||
type or with different parameters) before the results become available; hence the versioning.
|
||
(ChartPane.paneHeaderTemplate): Added the trend line popover.
|
||
(ChartPane.cssTemplate): Added styles for the trend line popover. Also use a more opaque background color behind
|
||
popovers when the -webkit-backdrop-filter property is not supported.
|
||
|
||
* public/v3/pages/dashboard-page.js:
|
||
(DashboardPage.prototype._createChartForCell): Call createSourceList with showPoints set to true to preserve the
|
||
existing behavior.
|
||
|
||
* tools/js/v3-models.js: Include TimeSeries object.
|
||
|
||
* unit-tests/measurement-set-tests.js: Added two test cases for MeasurementSet's fetchSegmentation.
|
||
|
||
* unit-tests/resources/almost-equal.js: Added.
|
||
(almostEqual): Extracted out of statistics-tests.js.
|
||
|
||
* unit-tests/statistics-tests.js:
|
||
|
||
2016-08-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
segmentTimeSeriesByMaximizingSchwarzCriterion returns a bogus result on empty charts
|
||
https://bugs.webkit.org/show_bug.cgi?id=160575
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
The bug was caused by an early return in segmentTimeSeriesByMaximizingSchwarzCriterion.
|
||
Removed this early return as the one in splitIntoSegmentsUntilGoodEnough was sufficient.
|
||
|
||
Also factored out a few functions in findOptimalSegmentation so that they can be better
|
||
optimized in JSC's DFG and FTL tiers, and removed unused debuggingTestingRangeNomination.
|
||
|
||
* public/shared/statistics.js:
|
||
(Statistics.segmentTimeSeriesByMaximizingSchwarzCriterion): Removed an early return.
|
||
(Statistics.splitIntoSegmentsUntilGoodEnough):
|
||
(.allocateCostUpperTriangularForSegmentation): Extracted from findOptimalSegmentation.
|
||
(.allocatePreviousNodeForSegmentation): Ditto.
|
||
(.findOptimalSegmentationInternal): Ditto.
|
||
(.findOptimalSegmentation):
|
||
|
||
* unit-tests/statistics-tests.js: Added a test case.
|
||
|
||
2016-08-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard sometimes tries to fetch a non-existent measurement-set JSON
|
||
https://bugs.webkit.org/show_bug.cgi?id=160577
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
The bug was caused by findClusters computing the first cluster's endTime incorrectly. Namely, we were
|
||
multiplying the number of clusters by clusterStart instead of clusterSize with an off-by-one error.
|
||
|
||
* public/v3/models/measurement-set.js:
|
||
(MeasurementSet.prototype.findClusters): Folded computeClusterStart into where clusterEnd is computed
|
||
for clarity. Also fixed a bug that we were not computing the first cluster to fetch correctly when
|
||
the fetched time range started before clusterStart (i.e. when startTime - clusterStart is negative).
|
||
Finally, fixed the main bug by multiplying the number of clusters by clusterSize instead of
|
||
clusterStart to compute the end time of the very first cluster in this measurement set. Because what
|
||
we're computing here is the end time of the first cluster, not the start time, we also need to subtract
|
||
one from the number of clusters. e.g. if there was exactly one cluster, then firstClusterEndTime is
|
||
identically equal to lastClusterEndTime.
|
||
(MeasurementSet.prototype.fetchedTimeSeries): Removed the unused argument to TimeSeries's constructor.
|
||
|
||
* unit-tests/analysis-task-tests.js: Fixed the tests for the latest version of Mocha which complains if
|
||
we returned a promise in unit tests when "done" function is used.
|
||
* unit-tests/checkconfig.js: Ditto.
|
||
* unit-tests/measurement-set-tests.js: Added a test case for findClusters and a test to make sure
|
||
fetchBetween doesn't try to fetch a cluster before the first cluster in the set. Also fixed other test
|
||
cases which were relying on the bug this patch fixed.
|
||
|
||
2016-08-04 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
MeasurementCluster's addToSeries is slow
|
||
https://bugs.webkit.org/show_bug.cgi?id=160581
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
The bulk of time was spent in MeasurementAdaptor.prototype.applyTo where we computed the interval.
|
||
|
||
Since some of data points are filtered out by TimeSeriesChart component before intervals are used,
|
||
we can significantly reduce the CPU time by lazily compute them. This patch reduces the runtime of
|
||
applyTo from ~60ms to ~30ms on my machine.
|
||
|
||
* public/v3/models/measurement-adaptor.js:
|
||
(MeasurementAdaptor.prototype.applyTo): Lazily compute and cache the interval. Also cache the build
|
||
object instead of always creating a new object.
|
||
* public/v3/models/measurement-cluster.js:
|
||
(MeasurementCluster.prototype.addToSeries): Call applyTo first before checking whether the point is
|
||
an outlier or its id to avoid extracting those values twice since they show up in the profiler. Also
|
||
use "of" instead "forEach" since "of" seems to be faster here.
|
||
|
||
2016-08-04 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Syncing script's configuration duplicates a lot of boilerplate
|
||
https://bugs.webkit.org/show_bug.cgi?id=160574
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
This patch makes each configuration accept an array of platforms and types so that we can write:
|
||
|
||
{"type": "speedometer", "builder": "mba", "platform": "Trunk El Capitan MacBookAir"},
|
||
{"type": "speedometer", "builder": "mbp", "platform": "Trunk El Capitan MacBookPro"},
|
||
{"type": "speedometer", "builder": "mba", "platform": "Trunk Sierra MacBookAir"},
|
||
{"type": "speedometer", "builder": "mbp", "platform": "Trunk Sierra MacBookPro"},
|
||
{"type": "jetstream", "builder": "mba", "platform": "Trunk El Capitan MacBookAir"},
|
||
{"type": "jetstream", "builder": "mbp", "platform": "Trunk El Capitan MacBookPro"},
|
||
{"type": "jetstream", "builder": "mba", "platform": "Trunk Sierra MacBookAir"},
|
||
{"type": "jetstream", "builder": "mbp", "platform": "Trunk Sierra MacBookPro"},
|
||
|
||
more concisely as:
|
||
|
||
{"builder": "mba", "types": ["speedometer", "jetstream"],
|
||
"platforms": ["Trunk El Capitan MacBookAir", "Trunk Sierra MacBookAir"]},
|
||
{"builder": "mbp", "types": ["speedometer", "jetstream"],
|
||
"platforms": ["Trunk El Capitan MacBookPro", "Trunk Sierra MacBookPro"]},
|
||
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotSyncer._loadConfig):
|
||
(BuildbotSyncer._expandTypesAndPlatforms): Added. Clones a new configuration entry for each type
|
||
and platform.
|
||
(BuildbotSyncer._createTestConfiguration): Extracted from _loadConfig.
|
||
(BuildbotSyncer._validateAndMergeConfig): Added a new argument that specifies a property that
|
||
shouldn't be merged into the configuration. Also added the support for 'types' and 'platforms',
|
||
and merged the code for verify an array of strings. Finally, allow the appearance of 'properties'
|
||
since this function can now be called on a cloned configuration in which 'arguments' had already
|
||
been renamed to 'properties'.
|
||
|
||
* unit-tests/buildbot-syncer-tests.js: Added a test case to parse a consolidated configuration.
|
||
(sampleiOSConfigWithExpansions): Added.
|
||
|
||
* unit-tests/resources/mock-v3-models.js:
|
||
(MockModels.inject): Added a few more mock models for the newly added test.
|
||
|
||
2016-07-26 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
REGRESSION: Tooltip for analysis tasks doesn't show up on charts
|
||
https://bugs.webkit.org/show_bug.cgi?id=160221
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
The bug was caused by ChartPaneBase resetting annotation bars every time the current point has moved.
|
||
Avoid doing this in ChartPaneBase's _renderAnnotations().
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase):
|
||
(ChartPaneBase.prototype.fetchAnalysisTasks):
|
||
(ChartPaneBase.prototype._renderAnnotations):
|
||
|
||
2016-07-26 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
REGRESSION: The arrow indicating the current page doesn't get updated
|
||
https://bugs.webkit.org/show_bug.cgi?id=160185
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bug was caused by Heading's render() function not updating the DOM more than once. I don't understand
|
||
how this has ever worked. Fixed the bug by rendering DOM whenever the current page has changed.
|
||
|
||
* public/v3/pages/heading.js:
|
||
(Heading):
|
||
(Heading.prototype.render):
|
||
|
||
2016-07-25 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix for Safari 9.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.prototype.waitingTime): Don't use "const" in strict mode.
|
||
|
||
2016-07-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should show the list of a pending A/B testing jobs
|
||
https://bugs.webkit.org/show_bug.cgi?id=160138
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Add a page to show the list of A/B testing build requests per triggerable. Ideally, we would like to
|
||
see a queue per builder but that would require changes to database tables and syncing scripts.
|
||
|
||
Because this page is most useful when the analysis task with which each build request is associated,
|
||
JSON API at /api/build-requests/ has been modified to return the analysis task ID for each request.
|
||
|
||
Also streamlined the page that shows the list of analysis tasks per Chris' feedback by consolidating
|
||
"Bisecting" and "Identified" into "Investigated" and moving the toolbar from the upper left corner
|
||
inside the heading to right beneath the heading above the table. Also made the category page serialize
|
||
the filter an user had typed in so that reloading the page doesn't clear it.
|
||
|
||
* public/api/analysis-tasks.php:
|
||
(fetch_associated_data_for_tasks): Removed 'category' from the list of columns returned as the notion
|
||
of 'category' is only relevant in UI, and it's better computed in the front-end.
|
||
(format_task): Ditto.
|
||
(determine_category): Deleted.
|
||
|
||
* public/api/test-groups.php:
|
||
(main):
|
||
|
||
* public/include/build-requests-fetcher.php:
|
||
(BuildRequestsFetcher::fetch_for_task): Include the analysis task ID in the rows.
|
||
(BuildRequestsFetcher::fetch_for_group): Ditto. Ditto.
|
||
(BuildRequestsFetcher::fetch_incomplete_requests_for_triggerable): Ditto.
|
||
(BuildRequestsFetcher::results_internal): Ditto.
|
||
|
||
* public/v3/index.html:
|
||
|
||
* public/v3/main.js:
|
||
(main): Create a newly introduced BuildRequestQueuePage as a subpage of AnalysisCategoryPage.
|
||
|
||
* public/v3/components/ratio-bar-graph.js:
|
||
(RatioBarGraph.prototype.update): Fixed a bogus assertion here. ratio can be any number. The coercion
|
||
into [-1, 1] is done inside RatioBarGraph's render() function.
|
||
|
||
* public/v3/models/analysis-task.js:
|
||
(AnalysisTask.prototype.category): Moved the code to compute the analysis task's category from
|
||
determine_category in analysis-tasks.php. Also merged "bisecting" and "identified" into "investigated".
|
||
(AnalysisTask.categories): Merged "bisecting" and "identified" into "investigated".
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest): Remember the triggerable and the analysis task associated with this request as well as
|
||
the time at when this request was created.
|
||
(BuildRequest.prototype.analysisTaskId): Added.
|
||
(BuildRequest.prototype.statusLabel): Use a shorter label: "Waiting" for "pending" status.
|
||
(BuildRequest.prototype.createdAt): Added.
|
||
(BuildRequest.prototype.waitingTime): Added. Returns a human readable time duration since the creation
|
||
of this build request such as "2 hours 21 minutes" against a reference time.
|
||
(BuildRequest.fetchTriggerables): Added.
|
||
(BuildRequest.cachedRequestsForTriggerableID): Added. Used when navigating back to
|
||
|
||
* public/v3/pages/analysis-category-page.js:
|
||
(AnalysisCategoryPage): Construct AnalysisCategoryToolbar and store it in this._categoryToolbar since it
|
||
no longer inherits from Toolbar class, which PageWithHeading recognizes and stores.
|
||
(AnalysisCategoryPage.prototype.title):
|
||
(AnalysisCategoryPage.prototype.serializeState): Added.
|
||
(AnalysisCategoryPage.prototype.stateForCategory): Added. Include the filter in the serialization.
|
||
(AnalysisCategoryPage.prototype.updateFromSerializedState): Restore the filter from the URL state.
|
||
(AnalysisCategoryPage.prototype.filterDidChange): Added. Called by AnalysisCategoryToolbar to update
|
||
the URL state in addition to calling render() as done previously via setFilterCallback.
|
||
(AnalysisCategoryPage.prototype.render): Always call _categoryToolbar.render() since the hyperlinks for
|
||
the category pages now include the filter, which can be updated in each call.
|
||
(AnalysisCategoryPage.cssTemplate):
|
||
|
||
* public/v3/pages/analysis-category-toolbar.js:
|
||
(AnalysisCategoryToolbar): Inherits from ComponentBase instead of Toolbar since AnalysisCategoryToolbar
|
||
no longer works with Heading class unlike other subclasses of Toolbar class.
|
||
(AnalysisCategoryToolbar.prototype.setCategoryPage): Added.
|
||
(AnalysisCategoryToolbar.prototype.setFilterCallback): Deleted.
|
||
(AnalysisCategoryToolbar.prototype.setFilter): Added. Used to restore from a serialized URL state.
|
||
(AnalysisCategoryToolbar.prototype.render): Don't recreate the input element as it clears the value as
|
||
well as the selection of the element. Also use AnalysisCategoryPage's stateForCategory to serialize the
|
||
category name and the current filter for each hyperlink.
|
||
(AnalysisCategoryToolbar.prototype._filterMayHaveChanged): Now takes an boolean argument specifying
|
||
whether the URL state should be updated or not. We update the URL only when a change event is fired to
|
||
avoid constantly updating it while an user is still typing.
|
||
(AnalysisCategoryToolbar.cssTemplate): Added.
|
||
(AnalysisCategoryToolbar.htmlTemplate): Added a button to open the newly added queue page.
|
||
|
||
* public/v3/pages/build-request-queue-page.js:
|
||
(BuildRequestQueuePage): Added.
|
||
(BuildRequestQueuePage.prototype.routeName): Added.
|
||
(BuildRequestQueuePage.prototype.pageTitle): Added.
|
||
(BuildRequestQueuePage.prototype.open): Added. Fetch open build requests for every triggerables using
|
||
the same API as the syncing scripts.
|
||
(BuildRequestQueuePage.prototype.render): Added.
|
||
(BuildRequestQueuePage.prototype._constructBuildRequestTable): Added. Construct a table for the list of
|
||
pending, scheduled or running build requests in the order syncing scripts would see. Note that the list
|
||
of build requests returned by /api/build-requests/* can contain completed, canceled, or failed requests
|
||
since the JSON returns all build requests associated with each test group if one of the requests of the
|
||
group have not finished. This helps syncing scripts picking the right builder for A/B testing when it
|
||
had previously been unloaded or crashed in the middle of processing a test group. This characteristics
|
||
of the API actually helps us here because we can reliably compute the total number of build requests in
|
||
the group. The first half of this function does this counting as well as collapses all but the first
|
||
unfinished build requests into a "contraction" row, which just shows the number of build requests that
|
||
are remaining in the group.
|
||
(BuildRequestQueuePage.cssTemplate): Added.
|
||
(BuildRequestQueuePage.htmlTemplate): Added.
|
||
|
||
* public/v3/pages/summary-page.js:
|
||
(SummaryPage.prototype.open): Use one-day median instead of seven-day median to compute the status.
|
||
(SummaryPageConfigurationGroup): Initialize _ratio to NaN. This was causing assertion failures in
|
||
RatioBarGraph's update() while measurement sets are being fetched.
|
||
|
||
* server-tests/api-build-requests-tests.js: Updated the tests per change in BuildRequest's statusLabel.
|
||
* unit-tests/analysis-task-tests.js: Ditto.
|
||
* unit-tests/test-groups-tests.js: Ditto.
|
||
* unit-tests/build-request-tests.js: Added tests for BuildRequest's waitingTime.
|
||
|
||
2016-07-22 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
REGRESSION(r203035): Marking points as an outlier no longer updates charts
|
||
https://bugs.webkit.org/show_bug.cgi?id=160106
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
The bug was caused by MeasurementSet's fetchBetween clearing previously registered callbacks when noCache
|
||
option is specified.
|
||
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart.prototype.setSourceList): Clear this._fetchedTimeSeries when changing chart options.
|
||
e.g. need to start including or excluding outliers.
|
||
(TimeSeriesChart.prototype.fetchMeasurementSets): Don't skip the fetching when noCache is true.
|
||
|
||
* public/v3/models/measurement-set.js:
|
||
(MeasurementSet): Added this._callbackMap as an instance variable to keep track of all callbacks on every
|
||
cluster since we may need to call each callback multiple times per cluster when noCache option is used.
|
||
(MeasurementSet.prototype.fetchBetween): Moved the code to add _primaryClusterPromise to _allFetches here
|
||
so that now this function and _ensureClusterPromise are only functions that touch _allFetches.
|
||
(MeasurementSet.prototype._ensureClusterPromise): Extracted out of fetchBetween. Queue up all callbacks
|
||
for each cluster when creating a new promise.
|
||
(MeasurementSet.prototype._fetchPrimaryCluster): Removed the code to add _primaryClusterPromise now that
|
||
it's done in fetchBetween.
|
||
|
||
* public/v3/remote.js:
|
||
(RemoteAPI.postJSONWithStatus): Removed superfluous call to console.log.
|
||
|
||
* unit-tests/measurement-set-tests.js: Updated the test case for noCache. The callback registered before
|
||
fetchBetween is called with noCache=true is now invoked so callCount must be 3 instead of 2.
|
||
|
||
2016-07-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard always re-generate measurement set JSON
|
||
https://bugs.webkit.org/show_bug.cgi?id=159951
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bug was caused by manifest.json reporting the last modified date of a measurement set in floating point,
|
||
and a measurement set JSON reporting it as an integer. Fixed the bug by always using an integer.
|
||
|
||
* public/api/measurement-set.php:
|
||
(main): Return 404 when the results is empty.
|
||
(MeasurementSetFetcher::execute_query): Use "extract(epoch from commit_time)" like ManifestGenerator to improve
|
||
the generation speed. This is ~10% runtime improvement.
|
||
(MeasurementSetFetcher::format_map): Updated to reflect the above change.
|
||
(MeasurementSetFetcher::parse_revisions_array): Ditto.
|
||
|
||
* public/include/manifest.php:
|
||
(ManifestGenerator::platforms): Fixed the bug by coercing lastModified to integer (instead of float).
|
||
|
||
* server-tests/api-measurement-set-tests.js: Added a test case for returning empty results, and a test case for
|
||
making sure lastModified dates in manifest.json and measurement sets match.
|
||
|
||
* tools/js/remote.js:
|
||
(RemoteAPI.prototype.sendHttpRequest): Reject the promise when HTTP status code is not 200.
|
||
|
||
2016-07-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard can consume 50-70% of CPU on MacBook even if user is not interacting at all
|
||
https://bugs.webkit.org/show_bug.cgi?id=159597
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
TimeSeriesChart and InteractiveTimeSeriesChart had been relying on continually polling on requestAnimationFrame
|
||
to update itself in response to its canvas resizing. Even though there as an early exit in the case there was
|
||
nothing to update, this is still causing a significant power drain when the user is not interacting at all.
|
||
|
||
Let TimeSeriesChart use the regular top-down render path like other components with exceptions of listening to
|
||
window's resize eventas well as when new JSONs are fetched from the server. The render() call to the latter case
|
||
will be coerced into a single callback on requestAnimationFrame to avoid DOM-mutation-layout churn.
|
||
|
||
* public/v3/components/base.js:
|
||
(ComponentBase.isElementInViewport): Deleted.
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase.prototype.render): Enqueue charts to render.
|
||
* public/v3/components/chart-styles.js:
|
||
(ChartStyles.dashboardOptions): Removed updateOnRequestAnimationFrame which is no longer an available option.
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart): Replaced the code to register itself for rAF by the code to listen to resize events on window.
|
||
(TimeSeriesChart._updateOnRAF): Deleted.
|
||
(TimeSeriesChart._updateAllCharts): Added.
|
||
(TimeSeriesChart.prototype._enqueueToRender): Added.
|
||
(TimeSeriesChart._renderEnqueuedCharts): Added.
|
||
(TimeSeriesChart.prototype.fetchMeasurementSets): Avoid calling fetchBetween when the range had been fetched.
|
||
Without this change, we can incur a significant number of redundant calls to render() when adjusting the domain
|
||
in charts page by the slider. When no new JSON is fetched, simply enqueue this chart to render on rAF.
|
||
(TimeSeriesChart.prototype._didFetchMeasurementSet): Enqueue this chart to render on rAF.
|
||
(TimeSeriesChart.prototype.render): Removed the check for isElementInViewport since we no longer get render() call
|
||
when this chart moves into the viewport (as we no longer listen to every rAF or scroll event).
|
||
* public/v3/models/measurement-set.js:
|
||
(MeasurementSet.prototype.hasFetchedRange): Fixed various bugs revealed by the new use in fetchMeasurementSets.
|
||
* public/v3/pages/chart-pane-status-view.js:
|
||
(ChartPaneStatusView.prototype._updateRevisionListForNewCurrentRepository): Removed the dead code. It was probably
|
||
copied from when this code was in InteractiveTimeSeries chart. There is no this._forceRender in this component.
|
||
* public/v3/pages/dashboard-page.js:
|
||
(DashboardPage.prototype.render): Enqueue charts to render.
|
||
* public/v3/pages/heading.js:
|
||
(SummaryPage.prototype.open): Removed the call to isElementInViewport. This wasn't really doing anything useful in
|
||
this component.
|
||
* unit-tests/measurement-set-tests.js: Added tests for hasFetchedRange.
|
||
(.waitForMeasurementSet): Moved to be used in a newly added test case.
|
||
|
||
2016-07-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
REGRESSION: manifest.json generation takes multiple seconds on perf dashboard
|
||
https://bugs.webkit.org/show_bug.cgi?id=159596
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The most of CPU time was spent looking for a duplicate entry in an array of metrics by array_search.
|
||
This patch moves to postgres by using aggregate functions in the query. Also moved the code to convert
|
||
datetime to UNIX epoch timestamp from PHP to within postgres query.
|
||
|
||
These improvements reduce total runtime of Manifest::generate from ~4s to ~350ms on my machine.
|
||
|
||
* public/include/manifest.php:
|
||
(Manifest::generate): No longer fetches test_configurations table as this is done in Manifest::platforms now.
|
||
Also moved calls to each method in the class to separate lines for easier instrumentation.
|
||
(Manifest::platforms): Group test configurations (current, baseline, target) by platform and metric.
|
||
Use the max of the last modified dates in UNIX epoch timestamps (ms to be compatible with JS's representation).
|
||
A given platform, metric pair is considered to be in the v1 dashboard if any test configuration is in.
|
||
|
||
2016-07-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
bundle-v3-scripts.py should compress HTML/CSS templates
|
||
https://bugs.webkit.org/show_bug.cgi?id=159582
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Strip leading and trailing whitespaces from HTML and CSS templates. This is a 8% progression on the file size.
|
||
|
||
* Install.md: Updated the list of MIME types to apply deflate for newer versions of Apache.
|
||
* tools/bundle-v3-scripts.py:
|
||
(main):
|
||
(compress_template): Added.
|
||
|
||
2016-06-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Strip out "use strict" everywhere so that the perf dashboard works on the shipping Safari.
|
||
|
||
* tools/bundle-v3-scripts.py:
|
||
(main):
|
||
|
||
2016-06-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Invalid token error when trying to create an A/B analysis for a range
|
||
https://bugs.webkit.org/show_bug.cgi?id=158679
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The problem in this particular case was due to another website overriding cookies for our subdomain.
|
||
Make PrivilegedAPI robust against its token becoming invalid in general to fix the bug since the cookie
|
||
is only available under /privileged-api/ and the v3 UI can't access it for security reasons.
|
||
|
||
This patch factors out PrivilegedAPI out of remote.js so that it can be tested separately in server tests
|
||
as well as unit tests even though RemoteAPI itself is implemented differently in each case.
|
||
|
||
* init-database.sql: Added a forgotten default value "false" to run_marked_outlier.
|
||
* public/v3/index.html:
|
||
* public/v3/privileged-api.js: Added. Extracted out of public/v3/remote.js.
|
||
(PrivilegedAPI.sendRequest): Fixed the bug. When the initial request fails with "InvalidToken" error,
|
||
re-generate the token and re-issue the request.
|
||
(PrivilegedAPI.requestCSRFToken):
|
||
* public/v3/remote.js:
|
||
(RemoteAPI.postJSON): Added to match tools/js/remote.js.
|
||
(RemoteAPI.postJSONWithStatus): Ditto.
|
||
(PrivilegedAPI): Moved to privileged-api.js.
|
||
* server-tests/api-measurement-set-tests.js: Removed the unused require for crypto.
|
||
* server-tests/privileged-api-upate-run-status.js: Added tests for /privileged-api/update-run-status.
|
||
* server-tests/resources/test-server.js:
|
||
(TestServer.prototype.inject): Clear the cookies as well as tokens in PrivilegedAPI.
|
||
* tools/js/remote.js:
|
||
(RemoteAPI): Added the support for PrivilegedAPI by making cookie set by the server persist.
|
||
(RemoteAPI.prototype.clearCookies): Added for tests.
|
||
(RemoteAPI.prototype.postJSON): Make sure sendHttpRequest always sends a valid JSON.
|
||
(RemoteAPI.prototype.postJSONWithStatus): Added since this API is used PrivilegedAPI.
|
||
(RemoteAPI.prototype.sendHttpRequest): Retain the cookie set by the server and send it back in each request.
|
||
* tools/js/v3-models.js:
|
||
* unit-tests/privileged-api-tests.js: Added unit tests for PrivilegedAPI.
|
||
* unit-tests/resources/mock-remote-api.js:
|
||
(MockRemoteAPI.postJSON): Added for unit testing.
|
||
(MockRemoteAPI.postJSONWithStatus): Ditto.
|
||
|
||
2016-06-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
/admin/tests is very slow
|
||
https://bugs.webkit.org/show_bug.cgi?id=158682
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The slowness came from TestNameResolver::__construct, which was fetching the entire table of test_configurations,
|
||
which at this point contains more than 32,000 rows. Don't fetch the entire table in the constructor. Instead,
|
||
fetch a subset of rows as needed in configurations_for_metric_and_platform. Even though this results in many SQL
|
||
queries being issued, that's a lot more efficient in practice because we only fetch a few dozen rows in practice.
|
||
|
||
Also removed a whole bunch of features from /admin/tests to simplify the page. In particular, the ability to update
|
||
the list of triggerables has been removed now that sync-buildbot.js automatically updates that for us. This removed
|
||
the last use of test_exists_on_platform, which was also dependent on fetching test_configurations upfront.
|
||
|
||
* public/admin/tests.php:
|
||
* public/include/test-name-resolver.php:
|
||
(TestNameResolver::__construct): Don't fetch the entire table of test_configurations.
|
||
(TestNameResolver::configurations_for_metric_and_platform): Just issue a SQL query for the specified platform and metric.
|
||
(TestNameResolver::test_exists_on_platform): Removed.
|
||
|
||
2016-06-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
sync-buildbot.js should update the list of tests and platforms associated with a triggerable
|
||
https://bugs.webkit.org/show_bug.cgi?id=158406
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Add /api/update-triggerable and a test for it, which were supposed to be added in r201718
|
||
but for which I forgot to run svn add.
|
||
|
||
* public/api/update-triggerable.php: Added.
|
||
(main):
|
||
* server-tests/api-update-triggerable.js: Added.
|
||
|
||
2016-06-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r201739. attachShadow was throwing an exception on this component.
|
||
|
||
* public/v3/pages/analysis-category-toolbar.js:
|
||
(AnalysisCategoryToolbar):
|
||
|
||
2016-06-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
sync-buildbot.js should update the list of tests and platforms associated with a triggerable
|
||
https://bugs.webkit.org/show_bug.cgi?id=158406
|
||
<rdar://problem/26185737>
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Added /api/update-triggerable to update the list of configurations (platform and test pairs)
|
||
associated with a given triggerable, and make sync-buildbot.js use this JSON API before each
|
||
syncing cycle so that the association gets updated automatically by simply updating the JSON.
|
||
|
||
* server-tests/api-manifest.js: Use const for imported modules.
|
||
* server-tests/api-report-commits-tests.js: Removed unnecessary importing of crypto.
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.someTestId): Added.
|
||
(MockData.somePlatformId): Added.
|
||
(MockData.addMockData):
|
||
* server-tests/tools-buildbot-triggerable-tests.js: Use const for imported modules. Also added
|
||
a test for BuildbotTriggerable's updateTriggerable.
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype.updateTriggerable): Added. Find the list of all configurations
|
||
associated with this triggeerable and post it to /api/update-triggerable.
|
||
* tools/js/database.js: Added triggerable_configurations to the list of tables.
|
||
* tools/js/remote.js:
|
||
(RemoteAPI.prototype.postJSON): Print the whole response when JSON parsing fails for debugging.
|
||
* tools/sync-buildbot.js:
|
||
(syncLoop): Call BuildbotTriggerable's updateTriggerable before syncing.
|
||
|
||
2016-06-02 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r201564.
|
||
|
||
* public/v3/pages/analysis-category-page.js:
|
||
(AnalysisCategoryPage.prototype.updateFromSerializedState):
|
||
* public/v3/pages/create-analysis-task-page.js:
|
||
(CreateAnalysisTaskPage.prototype.updateFromSerializedState):
|
||
(CreateAnalysisTaskPage.prototype.render):
|
||
|
||
2016-05-31 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v3 UI should support marking and unmarking outliers as well as hiding them
|
||
https://bugs.webkit.org/show_bug.cgi?id=158248
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Added the support for marking and unmarking a sequence of points as outliers. Unlike v2, we now support marking
|
||
multiple points as outliers in a single click. Also fixed a bug that outliers are never explicitly hidden in v3 UI.
|
||
|
||
This patch splits ChartStyles.createChartSourceList into two functions: resolveConfiguration and createSourceList
|
||
to separate the work of resolving platform and metric IDs to their respective model objects, and creating a source
|
||
list used by TimeSeriesChart to fetch measurement sets. createSourceList is called again when filtering options are
|
||
changed.
|
||
|
||
It also adds noCache option to TimeSeriesChart's fetchMeasurementSets, MeasurementSet's fetchBetween and
|
||
_fetchPrimaryCluster to update the measurement sets after marking or unmarking points as outliers. In addition, it
|
||
fixes a bug that the annotation bars for analysis tasks are not updated in charts page after creating an analysis
|
||
task by adding noCache option to ChartPaneBase's fetchAnalysisTasks, AnalysisTask's fetchByPlatformAndMetric and
|
||
_fetchSubset.
|
||
|
||
Finally, this patch splits ChartPane._makeAnchorToOpenPane into _makePopoverActionItem, _makePopoverOpenOnHover and
|
||
_setPopoverVisibility for clarity.
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase): Added _disableSampling and _showOutliers as instance variables.
|
||
(ChartPaneBase.prototype.configure):
|
||
(ChartPaneBase.prototype.isSamplingEnabled): Added.
|
||
(ChartPaneBase.prototype.setSamplingEnabled): Added. When a filtering option is updated, recreate the source list
|
||
so that TimeSeriesChart.setSourceList can re-fetch the measurement set JSONs.
|
||
(ChartPaneBase.prototype.isShowingOutliers): Added.
|
||
(ChartPaneBase.prototype.setShowOutliers): Added. Ditto for calling _updateSourceList.
|
||
(ChartPaneBase.prototype._updateSourceList): Added.
|
||
(ChartPaneBase.prototype.fetchAnalysisTasks): Renamed from _fetchAnalysisTasks. Now takes noCache as an argument
|
||
instead of platform and metric IDs since they're on instance variables.
|
||
|
||
* public/v3/components/chart-styles.js:
|
||
(ChartStyles.resolveConfiguration): Renamed from createChartSourceList. Just resolves platform and metric IDs.
|
||
(ChartStyles.createSourceList): Extracted from createChartSourceList since it needs to be called when a filtering
|
||
option is changed as well as when ChartPaneBase.prototype.configure is called.
|
||
(ChartStyles.baselineStyle): Now takes filtering options.
|
||
(ChartStyles.targetStyle): Ditto.
|
||
(ChartStyles.currentStyle): Ditto.
|
||
|
||
* public/v3/components/interactive-time-series-chart.js:
|
||
(InteractiveTimeSeriesChart.prototype.currentPoint): Find the point in _fetchedTimeSeries when
|
||
_sampledTimeSeriesData hasn't been computed yet as a fallback (e.g. when the chart hasn't been rendered yet).
|
||
(InteractiveTimeSeriesChart.prototype.selectedPoints): Added.
|
||
(InteractiveTimeSeriesChart.prototype.firstSelectedPoint): Added.
|
||
(InteractiveTimeSeriesChart.prototype.lockedIndicator): Added. Returns the current point if it's locked.
|
||
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart.prototype.setDomain):
|
||
(TimeSeriesChart.prototype.setSourceList): Added. Re-create _fetchedTimeSeries when filtering options have changed.
|
||
Don't re-fetch measurement set JSONs here since showing outliers can be done entirely in the front end.
|
||
(TimeSeriesChart.prototype.fetchMeasurementSets): Extracted out of setDomain. Now takes noCache as an argument.
|
||
ChartPane._markAsOutlier
|
||
(TimeSeriesChart.prototype.firstSampledPointBetweenTime): Added.
|
||
|
||
* public/v3/models/analysis-task.js:
|
||
(AnalysisTask.fetchByPlatformAndMetric): Added noCache as an argument.
|
||
(AnalysisTask._fetchSubset): Ditto.
|
||
|
||
* public/v3/models/measurement-adaptor.js:
|
||
(MeasurementAdaptor.prototype.isOutlier): Added.
|
||
(MeasurementAdaptor.prototype.applyToAnalysisResults): Add markedOutlier as a property on each point.
|
||
|
||
* public/v3/models/measurement-cluster.js:
|
||
(MeasurementCluster.prototype.addToSeries): Fixed the bug that filtering outliers was broken as _markedOutlierIndex
|
||
is undefined here. Use MeasurementAdaptor's isOutlier instead.
|
||
|
||
* public/v3/models/measurement-set.js:
|
||
(MeasurementSet.prototype.fetchBetween): Added noCache as an argument. Reset _primaryClusterPromise and _allFetches
|
||
when noCache is true since we need to re-fetch the primary cluster as well as all secondary clusters now.
|
||
(MeasurementSet.prototype._fetchPrimaryCluster): Added noCache as an argument. Directly invoke the JSON API at
|
||
/api/measurement-set to re-generate all clusters' JSON files instead of first fetching the cached version.
|
||
(MeasurementSet.prototype._fetchSecondaryCluster):
|
||
(MeasurementSet.prototype._didFetchJSON): Removed a bogus assertion since this function is called on secondary
|
||
clusters as well as primary clusters.
|
||
(MeasurementSet.prototype._addFetchedCluster): Reimplemented this function using an insertion sort. Also remove the
|
||
existing entry if the fetch cluster should replace it.
|
||
|
||
* public/v3/models/time-series.js:
|
||
(TimeSeries.prototype.dataBetweenPoints): Removed the dead code to filter out outliers. This is done in addToSeries
|
||
of MeasurementCluster instead.
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane): Renamed pane to popover since it was confusing to have a pane inside a pane class. As such, renamed
|
||
_paneOpenedByClick to _lockedPopover.
|
||
(ChartPane.prototype.serializeState): Added the code to serialize filtering options in the serialized state URL.
|
||
(ChartPane.prototype.updateFromSerializedState): Ditto for parsing.
|
||
(ChartPane.prototype._analyzeRange): Extracted out of render(). Also fixed a bug that the charts page don't show
|
||
the newly created analysis task by invoking fetchAnalysisTasks with noCache set to true.
|
||
(ChartPane.prototype._markAsOutlier): Added.
|
||
(ChartPane.prototype._renderActionToolbar): A bunch of changes due to pane -> popover rename. Also added a popover
|
||
for filtering options.
|
||
(ChartPane.prototype._makePopoverActionItem): Extracted from _makeAnchorToOpenPane.
|
||
(ChartPane.prototype._makePopoverOpenOnHover): Ditto.
|
||
(ChartPane.prototype._setPopoverVisibility): Ditto.
|
||
(ChartPane.prototype._renderFilteringPopover): Added.
|
||
(ChartPane.htmlTemplate): Added a popover for specifying filtering options. Also added .popover on each popover.
|
||
(ChartPane.cssTemplate): Updated the style to make use of .popover.
|
||
|
||
* public/v3/pages/charts-page.js:
|
||
(ChartsPage.prototype.graphOptionsDidChange): Added. Updates the URL state when a filtering option is modified.
|
||
|
||
* public/v3/pages/dashboard-page.js:
|
||
(DashboardPage.prototype._createChartForCell):
|
||
|
||
* public/v3/pages/page-router.js:
|
||
(PageRouter.prototype._serializeHashQueryValue): Serialize a set of strings as | separated tokens.
|
||
(PageRouter.prototype._deserializeHashQueryValue): Rewrote the function as the serialized URL can no longer be
|
||
parsed as a JSON as | separated tokens can't be converted into a valid JSON construct with a simple regex.
|
||
|
||
* unit-tests/measurement-set-tests.js: Added a test case for fetchBetween with noCache=true.
|
||
|
||
2016-05-24 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Another build fix after r201307.
|
||
|
||
* public/v3/pages/page-router.js:
|
||
(PageRouter.prototype._deserializeHashQueryValue):
|
||
(PageRouter.prototype._countOccurrences): Moved from _deserializeHashQueryValue.
|
||
|
||
2016-05-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r201307.
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane.prototype.serializeState):
|
||
|
||
2016-05-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Some applications truncates the last closing parenthesis in perf dashboard URL
|
||
https://bugs.webkit.org/show_bug.cgi?id=157976
|
||
|
||
Reviewed by Tim Horton.
|
||
|
||
Unfortunately, different applications use different heuristics to determine the end of each URL. Two trailing
|
||
parentheses, for example, is just fine in Radar as well as Apple Mail if the URL is short enough. Using other
|
||
characters such as ] and } wouldn't work either because they would be %-escaped. At that point, we might as well
|
||
as %-escape everything.
|
||
|
||
Work around the bug by parsing the URL as if it had one extra ')' if the parsing had failed. Also shorten the charts
|
||
page's URL by avoid emitting "-null" for each pane when the pane doesn't have a currently selected point or selection.
|
||
This improves the odds of the entire URL being recognized by various applications.
|
||
|
||
We could, in theory, implement some sort of a URL shorter but that can wait until when we support real user accounts.
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane.prototype.serializeState): Don't serialize the selection or the current point if nothing is selected.
|
||
* public/v3/pages/page-router.js:
|
||
(PageRouter.prototype._deserializeHashQueryValue): Try parsing the value again with one extra ] at the end if
|
||
the JSON parsing had failed.
|
||
|
||
2016-05-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard "Add pane" should list first by test, then by machine
|
||
https://bugs.webkit.org/show_bug.cgi?id=157880
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
Reversed the order which tests and platforms are selected. Also split .pane-selector-container into #tests and
|
||
#platform for the ease of DOM node manipulations.
|
||
|
||
* public/v3/components/pane-selector.js:
|
||
(PaneSelector):
|
||
(PaneSelector.prototype._renderPlatformList): Renamed from _renderPlatformLists since there is a single list
|
||
for platforms. This list now disappears while a non-metric item is selected in the collection of test lists.
|
||
e.g. "Speedometer" instead of its "Score" metric. Remember the last metric we rendered to avoid churning.
|
||
(PaneSelector.prototype._renderTestLists): Render the top level tests once. The index of lists have been
|
||
decreased by one since test lists are now inside #tests instead of appearing after the platform list.
|
||
(PaneSelector.prototype._buildTestList): Don't filter tests since platform is chosen after tests now.
|
||
(PaneSelector.prototype._replaceList):
|
||
(PaneSelector.prototype._selectedItem): Don't reset the test path (specifies which subtest or metric is picked)
|
||
when a platform is selected since it happens after a test metric is chosen now.
|
||
(PaneSelector.prototype._clickedItem): Add a pane when a platform is clicked, not when a metric is clicked.
|
||
(PaneSelector.cssTemplate):
|
||
|
||
2016-05-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Analysis task should look for a git commit based on abridged hashes
|
||
https://bugs.webkit.org/show_bug.cgi?id=157877
|
||
<rdar://problem/26254374>
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Made /privileged-api/associate-commit look for commits using LIKE instead of an exact match.
|
||
Associate the commit when there is exactly one match.
|
||
|
||
* public/include/commit-log-fetcher.php:
|
||
(CommitLogFetcher::fetch_between):
|
||
* public/include/db.php:
|
||
(Database::escape_for_like): Extracted from CommitLogFetcher::fetch_between.
|
||
* public/privileged-api/associate-commit.php:
|
||
(main): Look for the commits using LIKE. Reject whenever there are multiple commits. We limit the number of
|
||
matches to two for performance when the user specifies something that almost thousands of commits: e.g. "1".
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype._associateCommit): Added human friendly error messages for mismatching commits.
|
||
|
||
2016-05-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix. Use --date-order so that every child commit appears after its parent.
|
||
Otherwise we'll hit a FailedToFindParentCommit error while submitting a commit that appears before its parent.
|
||
|
||
* tools/sync-commits.py:
|
||
(GitRepository._fetch_all_hashes):
|
||
|
||
2016-05-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Removed the erroneously committed debug code.
|
||
|
||
* tools/sync-commits.py:
|
||
(GitRepository.fetch_commit):
|
||
|
||
2016-05-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should have a script to sync git commits
|
||
https://bugs.webkit.org/show_bug.cgi?id=157867
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added the support to pull from a Git repo to pull-svn.py and renamed it to sync-commits.py.
|
||
|
||
Added two classes SVNRepository and GitRepository which inherits from an abstract class, Repository.
|
||
The code that fetches commit and format revision number / git hash is specialized in each.
|
||
|
||
* Install.md:
|
||
* tools/pull-svn.py: Removed.
|
||
* tools/sync-commits.py: Renamed from Websites/perf.webkit.org/tools/pull-svn.py.
|
||
(main): Renamed --svn-config-json to --repository-config-json. Also made it robust against exceptions
|
||
inside fetch_commits_and_submit of each Repository class.
|
||
(load_repository): A factory function for SVNRepository and GitRepository.
|
||
(Repository): Added.
|
||
(Repository.__init__): Added.
|
||
(Repository.fetch_commits_and_submit): Extracted from standalone fetch_commits_and_submit.
|
||
(Repository.fetch_commit): Added. Implemented by a subclass.
|
||
(Repository.format_revision): Ditto.
|
||
(Repository.determine_last_reported_revision): Extracted from alonealone
|
||
determine_first_revision_to_fetch. The fallback to use "oldest" has been moved to SVNRepository's
|
||
fetch_commit since it doesn't work in Git.
|
||
(Repository.fetch_revision_from_dasbhoard): Extracted from fetch_revision_from_dasbhoard.
|
||
(SVNRepository): Added.
|
||
(SVNRepository.__init__): Added.
|
||
(SVNRepository.fetch_commit): Extracted from standalone fetch_commit_and_resolve_author and fetch_commit.
|
||
(SVNRepository._resolve_author_name): Renamed from resolve_author_name_from_account.
|
||
(SVNRepository.format_revision): Added.
|
||
(GitRepository): Added.
|
||
(GitRepository.__init__):
|
||
(GitRepository.fetch_commit): Added. Fetches the list of all git hashes if needed, and finds the next hash.
|
||
(GitRepository._find_next_hash): Added. Finds the first commit that appears after the specified hash.
|
||
(GitRepository._fetch_all_hashes): Added. Gets the list of all git hashs chronologically (old to new).
|
||
(GitRepository._run_git_command): Added.
|
||
(GitRepository.format_revision): Added. Use the first 8 characters of the hash.
|
||
|
||
2016-05-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add a subtitle under platform name in the summary page
|
||
https://bugs.webkit.org/show_bug.cgi?id=157809
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Add a description beneath the platform names.
|
||
|
||
* public/v3/pages/summary-page.js:
|
||
(SummaryPage.prototype._constructTable): Add a br and a span if subtitle is present.
|
||
(SummaryPage.cssTemplate): Added CSS rules for .subtitle.
|
||
|
||
2016-05-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v3 UI shows full git hash instead of the first 8 characters for a blame range
|
||
https://bugs.webkit.org/show_bug.cgi?id=157691
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
Fixed the bug that v3 UI shows the full 40 character git hash instead of the first 8 character as done in v2 UI.
|
||
|
||
* public/v3/models/commit-log.js:
|
||
(CommitLog.prototype.diff): Fixed the bug.
|
||
* tools/run-tests.py:
|
||
(main): Add the support for running a subset of tests as mocha does.
|
||
* unit-tests/commit-log-tests.js: Added.
|
||
|
||
2016-05-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed. Added the missing executable bits.
|
||
|
||
* tools/bundle-v3-scripts.py: Added property svn:executable.
|
||
* tools/detect-changes.js: Added property svn:executable.
|
||
* tools/process-maintenance-backlog.py: Added property svn:executable.
|
||
|
||
2016-05-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Summary page doesn't report some missing platforms
|
||
https://bugs.webkit.org/show_bug.cgi?id=157670
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
This patch improves the warning text for missing platforms and fixes the bug that platforms that don't have
|
||
any data reported for a given test would not be reported as missing.
|
||
|
||
* public/v3/pages/summary-page.js:
|
||
(SummaryPage.prototype.render): Added instrumentations.
|
||
(SummaryPage.prototype._constructRatioGraph): Always create both the ratio bar graph and the spinner icon.
|
||
(SummaryPage.prototype._renderCell): Extracted from _constructRatioGraph. Toggle the displayed-ness of the
|
||
spinner and the ratio bar graph in the cell by CSS for better performance.
|
||
(SummaryPage.prototype._warningTextForGroup): Extracted from _constructRatioGraph. Rephrased warning text
|
||
for clarity and adopted new API of SummaryPageConfigurationGroup.
|
||
(SummaryPage.prototype._warningTextForGroup.mapAndSortByName): Added.
|
||
(SummaryPage.prototype._warningTextForGroup.pluralizeIfNeeded): Added.
|
||
(SummaryPage.cssTemplate): Added rules to toggle the visibility of spinner icons and bar graphs.
|
||
(SummaryPageConfigurationGroup): Replaced this._warnings by more explicitly named this._missingPlatforms
|
||
and this._platformsWithoutBaseline. Also add a platform to this._missingPlatforms if it didn't appear in
|
||
any metrics. Note that adding a platform whenever it doesn't in any one metric would be incorrect since
|
||
some tests uses a different test name on different platforms: e.g. PLT-Mac and PLT-iPhone.
|
||
(SummaryPageConfigurationGroup.prototype.missingPlatforms): Added.
|
||
(SummaryPageConfigurationGroup.prototype.platformsWithoutBaseline): Added.
|
||
(SummaryPageConfigurationGroup.prototype._fetchAndComputeRatio):
|
||
|
||
2016-05-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Always use v3 UI for dashboards and analysis task pages
|
||
https://bugs.webkit.org/show_bug.cgi?id=157647
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Redirect dashboard pages from v1 and v2 to v3's summary page. Also redirect v1 UI's charts page and v2 UI's
|
||
analysis task pages to the corresponding v3 pages.
|
||
|
||
Keep v2's charts page accessible since some features such as segmentation is still only available on v2 UI.
|
||
|
||
* public/index.html:
|
||
(init.showCharts): Redirect to v3 UI once the chart list has been parsed.
|
||
(init.redirectChartsToV3): Added.
|
||
* public/v2/index.html:
|
||
|
||
2016-05-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Show a spinner while fetching data on summary page
|
||
https://bugs.webkit.org/show_bug.cgi?id=157658
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Show a spinner while fetching JSON files on the summary page.
|
||
|
||
* public/v3/components/base.js:
|
||
(ComponentBase.prototype.renderReplace): Added a new implementation that simply calls the static version.
|
||
(ComponentBase.renderReplace): Made this static.
|
||
|
||
* public/v3/pages/summary-page.js:
|
||
(SummaryPage.prototype._constructRatioGraph): Show a spinner icon when SummaryPageConfigurationGroup's
|
||
isFetching returns true.
|
||
(SummaryPage.cssTemplate): Force the height of each cell to be 2.5rem so that the height of cell doesn't
|
||
change when a spinner is replaced by a ratio bar graph.
|
||
|
||
(SummaryPageConfigurationGroup): Added this._isFetching as an instance variable.
|
||
(SummaryPageConfigurationGroup.prototype.isFetching): Added.
|
||
(SummaryPageConfigurationGroup.prototype.fetchAndComputeSummary): Set this._isFetching while waiting for
|
||
the promises to resolve after 50ms. We don't immediately set this._isFetching to avoid FOC when all JSON
|
||
files have been cached.
|
||
|
||
2016-05-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add horizontal between categories of tests
|
||
https://bugs.webkit.org/show_bug.cgi?id=157386
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Wrap tests in each category by tbody and add a horizontal bar between each category.
|
||
|
||
* public/v3/pages/summary-page.js:
|
||
(SummaryPage.prototype._constructTable):
|
||
(SummaryPage.cssTemplate):
|
||
|
||
2016-05-04 Dewei Zhu <dewei_zhu@apple.com>
|
||
|
||
Summary page should show warnings when current or baseline data is missing.
|
||
https://bugs.webkit.org/show_bug.cgi?id=157339
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
Set summary page to be the default page of v3 UI.
|
||
Show warning icon when either baseline or current data is missing.
|
||
Make fetchBetween returns a promise.
|
||
Update unit tests for MeasurementSet.fetchBetween since it returns a promise now.
|
||
Add a workaround to skip some platform and metric configurations.
|
||
|
||
* public/v3/components/ratio-bar-graph.js:
|
||
(RatioBarGraph):
|
||
(RatioBarGraph.prototype.update): Add showWarningIcon flag to indicate whether we should show warning icon.
|
||
(RatioBarGraph.prototype.render): Show warning icon when showWarningIcon is true.
|
||
(RatioBarGraph.cssTemplate): Add style for warning icon.
|
||
* public/v3/components/warning-icon.js: Add warning icon.
|
||
(WarningIcon):
|
||
(WarningIcon.cssTemplate):
|
||
* public/v3/index.html:
|
||
* public/v3/main.js:
|
||
(main): Set summary page to be the default page of v3 UI.
|
||
* public/v3/models/measurement-set.js:
|
||
(MeasurementSet):
|
||
(MeasurementSet.prototype.fetchBetween): Returns a promise. Fix the bug in previous implementation that we miss
|
||
some callbacks sometimes. Basically, we will fetch primary cluster first, then secondary clusters. For each
|
||
secondary cluster fetch, we will always invoke callback even when it fails.
|
||
(MeasurementSet.prototype._fetchSecondaryClusters): Deleted.
|
||
(MeasurementSet.prototype._fetch.else.url.api.measurement.set platform): Deleted.
|
||
* public/v3/pages/summary-page.js:
|
||
(SummaryPage): Add a variable for excluded configurations.
|
||
(SummaryPage.prototype._createConfigurationGroup): Pass excluded configurations while building config groups.
|
||
(SummaryPage.prototype._constructTable): Remove the logic for unified header since it breaks consistency of the table appearance.
|
||
(SummaryPage.prototype.this._renderQueue.push): Show warning message when baseline/current data is missing.
|
||
(SummaryPageConfigurationGroup): Add a variable to keep track of the warnings while computing summary.
|
||
(SummaryPageConfigurationGroup.prototype.warnings): A getter for warnings.
|
||
(SummaryPageConfigurationGroup._computeSummary): Fix a bug in calculating ratios. We should always use
|
||
current/baseline for ratio and present the difference between ratio and 1 in the summary page.
|
||
(SummaryPageConfigurationGroup.set then): Deleted.
|
||
(SummaryPageConfigurationGroup.set var): Deleted.
|
||
* unit-tests/measurement-set-tests.js: Add a helper function to wait for fetchBetween. Update unit tests since fetchBetween returns a promise now.
|
||
(promise.set fetchBetween):
|
||
(set MeasurementSet):
|
||
(set fetchBetween): Deleted.
|
||
|
||
2016-04-26 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Chart status should always be computed against prior values
|
||
https://bugs.webkit.org/show_bug.cgi?id=157014
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Compare the current value against the last baseline or target value that appear before the current value in time
|
||
so that the comparison stay the same even when new baseline and target values are reported. Also include the compared
|
||
baseline or target value in the label for clarity.
|
||
|
||
* public/v3/components/chart-status-view.js:
|
||
(ChartStatusView.prototype._computeChartStatus):
|
||
(ChartStatusView.prototype._computeChartStatus.labelForDiff):
|
||
(ChartStatusView.prototype._findLastPointPriorToTime): Extracted from _relativeDifferenceToLaterPointInTimeSeries.
|
||
Now finds the last point before the current point's time if there is any, or the last point in baseline / target.
|
||
(ChartStatusView.prototype._relativeDifferenceToLaterPointInTimeSeries): Deleted.
|
||
* public/v3/models/metric.js:
|
||
(Metric.prototype.makeFormatter): Don't use SI units for unit-less metrics.
|
||
|
||
2016-04-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
REGRESSION(r199444): Perf dashboard always fetches all measurement sets
|
||
https://bugs.webkit.org/show_bug.cgi?id=156534
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
The bug was cased by SummaryPage's constructor fetching all measurement sets. Since each page is always
|
||
constructed in main(), this resulted in all measurement sets being fetched on all pages.
|
||
|
||
* public/v3/pages/summary-page.js:
|
||
(SummaryPage):
|
||
(SummaryPage.prototype.open): Fetch measurement set JSONs here.
|
||
(SummaryPage.prototype._createConfigurationGroup): Renamed from _createConfigurationGroupAndStartFetchingData.
|
||
|
||
2016-04-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add a summary page to v3 UI
|
||
https://bugs.webkit.org/show_bug.cgi?id=156531
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
Add new "Summary" page, which shows the average difference (better or worse) from the baseline across
|
||
multiple platforms and tests by a single number.
|
||
|
||
* public/include/manifest.php:
|
||
(ManifestGenerator::generate): Include "summary" in manifest.json.
|
||
* public/shared/statistics.js:
|
||
(Statistics.mean): Added.
|
||
(Statistics.median): Added.
|
||
* public/v3/components/ratio-bar-graph.js: Added.
|
||
(RatioBarGraph): Shows a horizontal bar graph that visualizes the relative difference (e.g. 3% better).
|
||
(RatioBarGraph.prototype.update):
|
||
(RatioBarGraph.prototype.render):
|
||
(RatioBarGraph.cssTemplate):
|
||
(RatioBarGraph.htmlTemplate):
|
||
* public/v3/index.html:
|
||
* public/v3/main.js:
|
||
(main): Instantiate SummaryPage and add it to the navigation bar and the router.
|
||
* public/v3/models/manifest.js:
|
||
(Manifest._didFetchManifest): Let "summary" pass through from manifest.json to main().
|
||
* public/v3/models/measurement-set.js:
|
||
(MeasurementSet.prototype._failedToFetchJSON): Invoke the callback with an error or true in order for
|
||
the callback can detect a failure.
|
||
(MeasurementSet.prototype._invokeCallbacks): Ditto.
|
||
* public/v3/pages/charts-page.js:
|
||
(ChartsPage.createStateForConfigurationList): Added to add a hyperlink from summary page to charts page.
|
||
* public/v3/pages/summary-page.js: Added.
|
||
(SummaryPage): Added.
|
||
(SummaryPage.prototype.routeName): Added.
|
||
(SummaryPage.prototype.open): Added.
|
||
(SummaryPage.prototype.render): Added.
|
||
(SummaryPage.prototype._createConfigurationGroupAndStartFetchingData): Added.
|
||
(SummaryPage.prototype._constructTable): Added.
|
||
(SummaryPage.prototype._constructRatioGraph): Added.
|
||
(SummaryPage.htmlTemplate): Added.
|
||
(SummaryPage.cssTemplate): Added.
|
||
(SummaryPageConfigurationGroup): Added. Represents a set of platforms and tests shown in a single cell.
|
||
(SummaryPageConfigurationGroup.prototype.ratio): Added.
|
||
(SummaryPageConfigurationGroup.prototype.label): Added.
|
||
(SummaryPageConfigurationGroup.prototype.changeType): Added.
|
||
(SummaryPageConfigurationGroup.prototype.configurationList): Added.
|
||
(SummaryPageConfigurationGroup.prototype.fetchAndComputeSummary): Added.
|
||
(SummaryPageConfigurationGroup.prototype._computeSummary): Added.
|
||
(SummaryPageConfigurationGroup.prototype._fetchAndComputeRatio): Added. Invoked for each time series in
|
||
the set, and stores the computed ratio of the current values to the baseline in this._setToRatio.
|
||
The results are aggregated by _computeSummary as a single number later.
|
||
(SummaryPageConfigurationGroup._medianForTimeRange): Added.
|
||
(SummaryPageConfigurationGroup._fetchData): A thin wrapper to make MeasurementSet.fetchBetween promise
|
||
friendly since MeasurementSet doesn't support Promise at the moment (but it should!).
|
||
* server-tests/api-manifest.js: Updated a test case.
|
||
|
||
2016-04-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make sync-buildbot.js fault safe
|
||
https://bugs.webkit.org/show_bug.cgi?id=156498
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Fixed a bug that sync-buildbot.js will continue to schedule build requests from multiple test groups
|
||
if multiple test groups are simultaneously in-progress on the same builder. Also fixed a bug that if
|
||
a build request had failed without leaving a trace (i.e. no entry on any of the builders we know of),
|
||
sync-buildbot.js throws an exception.
|
||
|
||
* server-tests/tools-buildbot-triggerable-tests.js: Added test cases.
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotSyncer.prototype.scheduleRequestInGroupIfAvailable): Renamed. Optionally takes the slave name.
|
||
When this parameter is specified, schedule the request only if the specified slave is available.
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype._scheduleNextRequestInGroupIfSlaveIsAvailable): Always use
|
||
scheduleRequestInGroupIfAvailable to schedule a new build request. Using scheduleRequest for non-first
|
||
build requests was problematic when there were multiple test groups with pending requests because then
|
||
we would schedule those pending requests without checking whether there is already a pending job or if
|
||
we have previously scheduled a job. Also fallback to use any syncer / builder when groupInfo.syncer is
|
||
not set even if the next request was not the first one in the test group since we can't determine on
|
||
which builder preceding requests are processed in such cases.
|
||
* unit-tests/buildbot-syncer-tests.js:
|
||
|
||
2016-04-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Replace script runner to use mocha.js tests
|
||
https://bugs.webkit.org/show_bug.cgi?id=156490
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Replaced run-tests.js, which was a whole test harness for running legacy tests by tools/run-tests.py
|
||
which is a thin wrapper around mocha.js.
|
||
|
||
* run-tests.js: Removed.
|
||
* tests: Removed.
|
||
* tools/run-tests.py: Added.
|
||
(main):
|
||
|
||
2016-04-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New syncing script sometimes schedules a build request on a wrong builder
|
||
https://bugs.webkit.org/show_bug.cgi?id=156489
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
The bug was caused by _scheduleNextRequestInGroupIfSlaveIsAvailable scheduling the next build request on
|
||
any available syncer regardless of whether the request is the first one in the test group or not because
|
||
BuildRequest.order was returning a string instead of a number.
|
||
|
||
Also fixed a bug that BuildbotTriggerable.syncOnce was re-ordering test groups by their id's instead of
|
||
respecting the order in which the perf dashboard returned.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.prototype.order): Force the order to be a number.
|
||
* server-tests/api-build-requests-tests.js: Assert the order as numbers.
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.addAnotherMockTestGroup): Changed the test group id to 601, which is after the first mock data.
|
||
The old number was masking a bug in BuildbotTriggerable that it was re-ordering test groups by their id's
|
||
instead of using the order set forth by the perf dashboard.
|
||
(MockData.mockTestSyncConfigWithSingleBuilder):
|
||
* server-tests/tools-buildbot-triggerable-tests.js: Added a test case for scheduling two build requests in
|
||
a single call to syncOnce. Each build request should be scheduled on the same builder as the previous build
|
||
requests in the same test group.
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype.syncOnce): Order test groups by groupOrder, which is the index at which first
|
||
build request in the group appeared.
|
||
(BuildbotTriggerable.prototype._scheduleNextRequestInGroupIfSlaveIsAvailable): Don't re-order build requests
|
||
as they're already sorted on the server side.
|
||
(BuildbotTriggerable._testGroupMapForBuildRequests): Added groupOrder to test group info
|
||
|
||
2016-04-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Don't treat a build number 0 as a pending build.
|
||
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotBuildEntry.prototype.isPending):
|
||
|
||
2016-04-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Escape builder names in url* and pathFor* methods of BuildbotSyncer
|
||
https://bugs.webkit.org/show_bug.cgi?id=156427
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
The build fix in r199251 breaks other usage of RemoteAPI. Fix it properly by escaping builder names in
|
||
various methods of BuildbotSyncer.
|
||
|
||
Also fixed a typo in the logging and a bug that the new syncing script never updated "scheduled" to "running".
|
||
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.mockTestSyncConfigWithTwoBuilders): Renamed "some-builder-2" to "some builder 2" to test the
|
||
new escaping behavior in tools-buildbot-triggerable-tests.js and buildbot-syncer-tests.js.
|
||
|
||
* server-tests/tools-buildbot-triggerable-tests.js: Added tests for status url, and added a new test case
|
||
for updating "scheduled" to "running".
|
||
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotBuildEntry.buildRequestStatusIfUpdateIsNeeded): Update the status to "running" when the request's
|
||
status is "scheduled" and the buildbot's build is currently in progress.
|
||
(BuildbotSyncer.prototype.pathForPendingBuildsJSON): Escape the builder name.
|
||
(BuildbotSyncer.prototype.pathForBuildJSON): Ditto.
|
||
(BuildbotSyncer.prototype.pathForForceBuild): Ditto.
|
||
(BuildbotSyncer.prototype.url): Ditto.
|
||
(BuildbotSyncer.prototype.urlForBuildNumber): Ditto.
|
||
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers):
|
||
(BuildbotTriggerable.prototype._scheduleNextRequestInGroupIfSlaveIsAvailable): Fixed a typo. We are
|
||
scheduling new build requests, not syncing them.
|
||
* tools/js/remote.js:
|
||
(RemoteAPI.sendHttpRequest): Reverted r199251.
|
||
* unit-tests/buildbot-syncer-tests.js:
|
||
|
||
2016-04-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. We need to escape the path or http.request would fail.
|
||
|
||
* tools/js/remote.js:
|
||
|
||
2016-04-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix various bugs in the new syncing script
|
||
https://bugs.webkit.org/show_bug.cgi?id=156393
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
* server-tests/resources/common-operations.js: Added. This file was supposed to be added in r199191.
|
||
(addBuilderForReport):
|
||
(addSlaveForReport):
|
||
(connectToDatabaseInEveryTest):
|
||
(submitReport):
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers): Don't log every time we pull from buildbot
|
||
builder as this dramatically increases the amount of log we generate.
|
||
* tools/js/parse-arguments.js:
|
||
(parseArguments): Fixed a typo. This should be parseArgument*s*, not parseArgument.
|
||
* tools/js/remote.js:
|
||
(RemoteAPI.prototype.url): Fixed a bug that portSuffix wasn't being expanded in the template literal.
|
||
(RemoteAPI.prototype.configure): Added more validations with nice error messages.
|
||
(RemoteAPI.prototype.sendHttpRequest): Falling back to port 80 isn't right when scheme is https. Compute
|
||
the right port in configure instead based on the scheme.
|
||
* tools/sync-buildbot.js:
|
||
(syncLoop): Fixed the bug that syncing multiple times fail because Manifest.fetch() create new Platform
|
||
and Test objects. This results in various references in BuildRequest objects to get outdated. Fixing this
|
||
properly in Manifest.fetch() because we do need to "forget" about some tests and platforms in some cases.
|
||
For now, delete all v3 model objects and start over in each syncing cycle.
|
||
* unit-tests/tools-js-remote-tests.js: Added. Unit tests for the aforementioned changes to RemoteAPI.
|
||
|
||
2016-04-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
sync-buildbot.js doesn't mark disappeared builds as failed
|
||
https://bugs.webkit.org/show_bug.cgi?id=156386
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Fix a bug that new syncing script doesn't mark builds that it scheduled but doesn't appear when queried
|
||
by buildbot's JSON API. These are builds that got canceled by humans (e.g. buildbot was restarted, data
|
||
loss, pending build was canceled, etc...)
|
||
|
||
* server-tests/tools-buildbot-triggerable-tests.js: Added a test case.
|
||
* tools/js/buildbot-triggerable.js:
|
||
(BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers): Added a set of build requests we've matched
|
||
against BuildbotBuildEntry's. Mark build requests that didn't have any entry but supposed to be in either
|
||
'scheduled' or 'running' status as failed.
|
||
|
||
2016-04-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
A/B testing bots should prioritize user created test groups
|
||
https://bugs.webkit.org/show_bug.cgi?id=156375
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Order build requests preferring user created ones over ones automatically created by detect-changes.js.
|
||
|
||
Also fixed a bug in BuildbotSyncer.scheduleFirstRequestInGroupIfAvailable that it was scheduling a new
|
||
build request on a builder/slave even when we had previously scheduled another build request.
|
||
|
||
* public/include/build-requests-fetcher.php:
|
||
(BuildRequestsFetcher::fetch_incomplete_requests_for_triggerable): Order build requested based on
|
||
author_order which is 0 when it's created by an user and 1 when it's created by detect-changes.js.
|
||
Since we're using ascending order, this would put user created test groups first.
|
||
* server-tests/api-build-requests-tests.js: Updated an existing test case and added a new test case
|
||
for testing that build requests for an user created test group shows up first.
|
||
* server-tests/resources/mock-data.js:
|
||
(MockData.addAnotherMockTestGroup): Takes an extra argument to specify the author name.
|
||
* server-tests/tools-buildbot-triggerable-tests.js: Added a test case for testing that build requests
|
||
for an user created test group shows up first.
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotSyncer): Added _slavesWithNewRequests to keep track of build slaves on which we have already
|
||
scheduled new build requests. Don't schedule more requests on these slaves.
|
||
(BuildbotSyncer.prototype.scheduleRequest):
|
||
(BuildbotSyncer.prototype.scheduleFirstRequestInGroupIfAvailable): Add the specified slave name (or null
|
||
when slaveList is not specified) to _slavesWithNewRequests.
|
||
(BuildbotSyncer.prototype.pullBuildbot): Clear the set after pulling buildbot since any build request
|
||
we have previously scheduled should be included in one of the entires now.
|
||
* unit-tests/buildbot-syncer-tests.js: Added test cases for the aforementioned bug.
|
||
(sampleiOSConfig): Added a second slave for new test cases.
|
||
|
||
2016-04-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Migrate legacy perf dashboard tests to mocha.js based tests
|
||
https://bugs.webkit.org/show_bug.cgi?id=156335
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Migrated all legacy run-tests.js tests to mocha.js based tests. Since the new harness uses Promise
|
||
for most of asynchronous operations, refactored the tests to use Promises as well, and added more
|
||
assertions where appropriate.
|
||
|
||
Also consolidated common helper functions into server-tests/resources/common-operations.js.
|
||
Unfortunately there were multiple inconsistent implementations of addBuilder/addSlave. Some were
|
||
taking an array of reports while others were taking a single report. New shared implementation in
|
||
common-operations.js now takes a single report.
|
||
|
||
Also decreased the timeout in most tests from 10s to 1s so that tests fail early when they timeout.
|
||
Most of tests are passing under 100ms on my computer so 1s should be plenty still.
|
||
|
||
* run-tests.js: Removed.
|
||
* server-tests/admin-platforms-tests.js: Moved from tests/admin-platforms.js.
|
||
(reportsForDifferentPlatforms):
|
||
* server-tests/admin-reprocess-report-tests.js: Moved from tests/admin-reprocess-report.js.
|
||
(.addBuilder): Moved to common-operations.js.
|
||
* server-tests/api-build-requests-tests.js:
|
||
* server-tests/api-manifest.js: Use MockData.resetV3Models() instead of manually clearing maps.
|
||
* server-tests/api-measurement-set-tests.js: Moved from tests/api-measurement-set.js.
|
||
(.queryPlatformAndMetric):
|
||
(.format):
|
||
* server-tests/api-report-commits-tests.js: Moved from tests/api-report-commits.js.
|
||
* server-tests/api-report-tests.js: Moved from tests/api-report.js.
|
||
(.emptyReport):
|
||
(.emptySlaveReport):
|
||
(.reportWithSameSubtestName):
|
||
* server-tests/resources/common-operations.js: Added.
|
||
(addBuilderForReport): Extracted from tests.
|
||
(addSlaveForReport): Ditto.
|
||
(connectToDatabaseInEveryTest): Added.
|
||
(submitReport): Extracted from admin-platforms-tests.js.
|
||
* server-tests/resources/test-server.js:
|
||
(TestServer): Make TestServer a singleton since it doesn't make any sense for each module to start
|
||
its own Apache instance (that would certainly will fail).
|
||
* server-tests/tools-buildbot-triggerable-tests.js:
|
||
* tests: Removed.
|
||
* tools/js/database.js:
|
||
(Database.prototype.selectAll): Added.
|
||
(Database.prototype.selectFirstRow): Added.
|
||
(Database.prototype.selectRows): Added. Dynamically construct a query string based on arguments.
|
||
|
||
2016-04-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New buildbot syncing scripts that supports multiple builders and slaves
|
||
https://bugs.webkit.org/show_bug.cgi?id=156269
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Add sync-buildbot.js that supports scheduling A/B testing jobs on multiple builders and slaves.
|
||
The old python script (sync-with-buildbot.py) could only support a single builder and slave
|
||
for each platform, test pair.
|
||
|
||
The main logic is implemented in BuildbotTriggerable.syncOnce. Various helper methods are added
|
||
throughout the codebase and tests have been refactored.
|
||
|
||
BuildbotSyncer has been updated to support multiple platform, test pairs. It's now responsible
|
||
for syncing everything on each builder (on a buildbot).
|
||
|
||
Added more unit tests for BuildbotSyncer and server tests for BuildbotTriggerable, and refactored
|
||
test helpers and mocks as needed.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.prototype.status): Added.
|
||
(BuildRequest.prototype.isScheduled): Added.
|
||
* public/v3/models/metric.js:
|
||
(Metric.prototype.fullName): Added.
|
||
* public/v3/models/platform.js:
|
||
(Platform): Added the map based on platform name.
|
||
(Platform.findByName): Added.
|
||
* public/v3/models/test.js:
|
||
(Test.topLevelTests):
|
||
(Test.findByPath): Added. Finds a test based on an array of test names; e.g. ['A', 'B'] would
|
||
find the test whose name is "B" which has a parent test named "A".
|
||
(Test.prototype.fullName): Added.
|
||
* server-tests/api-build-requests-tests.js:
|
||
(addMockData): Moved to resources/mock-data.js.
|
||
(addAnotherMockTestGroup): Ditto.
|
||
* server-tests/resources/mock-data.js: Added.
|
||
(MockData.resetV3Models): Added.
|
||
(MockData.addMockData): Moved from api-build-requests-tests.js.
|
||
(MockData.addAnotherMockTestGroup): Ditto.
|
||
(MockData.mockTestSyncConfigWithSingleBuilder): Added.
|
||
(MockData.mockTestSyncConfigWithTwoBuilders): Added.
|
||
(MockData.pendingBuild): Added.
|
||
(MockData.runningBuild): Added.
|
||
(MockData.finishedBuild): Added.
|
||
* server-tests/resources/test-server.js:
|
||
(TestServer):
|
||
(TestServer.prototype.remoteAPI):
|
||
(TestServer.prototype._ensureTestDatabase): Don't fail even if the test database doesn't exit.
|
||
(TestServer.prototype._startApache): Create a RemoteAPI instance to access the test sever.
|
||
(TestServer.prototype._waitForPid): Increase the timeout.
|
||
(TestServer.prototype.inject): Replace global.RemoteAPI during the test and restore it afterwards.
|
||
* server-tests/tools-buildbot-triggerable-tests.js: Added. Tests BuildbotTriggerable.syncOnce.
|
||
(MockLogger): Added.
|
||
(MockLogger.prototype.log): Added.
|
||
(MockLogger.prototype.error): Added.
|
||
* tools/detect-changes.js:
|
||
(parseArgument): Moved to js/parse-arguments.js.
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotBuildEntry):
|
||
(BuildbotBuildEntry.prototype.syncer): Added.
|
||
(BuildbotBuildEntry.prototype.buildRequestStatusIfUpdateIsNeeded): Added. Returns a new status
|
||
for a build request (of the matching build request ID) if it needs to be updated in the server.
|
||
(BuildbotSyncer): This class
|
||
(BuildbotSyncer.prototype.addTestConfiguration): Added.
|
||
(BuildbotSyncer.prototype.testConfigurations): Returns the list of test configurations.
|
||
(BuildbotSyncer.prototype.matchesConfiguration): Returns true iff the request can be scheduled on
|
||
this builder.
|
||
(BuildbotSyncer.prototype.scheduleRequest): Added. Schedules a new job on buildbot for a request.
|
||
(BuildbotSyncer.prototype.scheduleFirstRequestInGroupIfAvailable): Added. Schedules a new job for
|
||
the specified build request on the first slave that's available.
|
||
(BuildbotSyncer.prototype.pullBuildbot): Return a list of BuildbotBuildEntry instead of an object.
|
||
Also store it on an instance variable so that scheduleFirstRequestInGroupIfAvailable could use it.
|
||
(BuildbotSyncer.prototype._pullRecentBuilds):
|
||
(BuildbotSyncer.prototype.pathForPendingBuildsJSON): Renamed from urlForPendingBuildsJSON and now
|
||
only returns the path instead of the full URL since RemoteAPI takes a path, not full URL.
|
||
(BuildbotSyncer.prototype.pathForBuildJSON): Ditto from pathForBuildJSON.
|
||
(BuildbotSyncer.prototype.pathForForceBuild): Added.
|
||
(BuildbotSyncer.prototype.url): Use RemoteAPI's url method instead of manually constructing URL.
|
||
(BuildbotSyncer.prototype.urlForBuildNumber): Ditto.
|
||
(BuildbotSyncer.prototype._propertiesForBuildRequest): Now that each syncer can have multiple test
|
||
configurations associated with it, find the one matching for this request.
|
||
(BuildbotSyncer._loadConfig): Create a syncer per builder and add all test configurations to it.
|
||
(BuildbotSyncer._validateAndMergeConfig): Added the support for 'SlaveList', which is a list of
|
||
slave names present on this builder.
|
||
* tools/js/buildbot-triggerable.js: Added.
|
||
(BuildbotTriggerable): Added.
|
||
(BuildbotTriggerable.prototype.name): Added.
|
||
(BuildbotTriggerable.prototype.syncOnce): Added. The main logic for the syncing script. It pulls
|
||
existing build requests from the perf dashboard, pulls buildbot for pending and running/completed
|
||
builds on each builder (represented by each syncer), schedules build requests on buildbot if there
|
||
is any builder/slave available, and updates the status of build requests in the database.
|
||
(BuildbotTriggerable.prototype._validateRequests): Added.
|
||
(BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers): Added.
|
||
(BuildbotTriggerable.prototype._scheduleNextRequestInGroupIfSlaveIsAvailable): Added.
|
||
(BuildbotTriggerable._testGroupMapForBuildRequests): Added.
|
||
* tools/js/database.js:
|
||
* tools/js/parse-arguments.js: Added. Extracted out of tools/detect-changes.js.
|
||
(parseArguments):
|
||
* tools/js/remote.js:
|
||
(RemoteAPI): Now optionally takes the server configuration.
|
||
(RemoteAPI.prototype.url): Added.
|
||
(RemoteAPI.prototype.getJSON): Removed the code for specifying request content.
|
||
(RemoteAPI.prototype.getJSONWithStatus): Ditto.
|
||
(RemoteAPI.prototype.postJSON): Added.
|
||
(RemoteAPI.prototype.postFormUrlencodedData): Added.
|
||
(RemoteAPI.prototype.sendHttpRequest): Fixed the code to specify auth.
|
||
* tools/js/v3-models.js: Don't include RemoteAPI here as they require a configuration for each host.
|
||
* tools/sync-buildbot.js: Added.
|
||
(main): Added. Parse the arguments and start the loop.
|
||
(syncLoop): Added.
|
||
* unit-tests/buildbot-syncer-tests.js: Added tests for pullBuildbot, scheduleRequest, as well as
|
||
scheduleFirstRequestInGroupIfAvailable. Refactored helper functions as needed.
|
||
(sampleiOSConfig):
|
||
(smallConfiguration): Added.
|
||
(smallPendingBuild): Added.
|
||
(smallInProgressBuild): Added.
|
||
(smallFinishedBuild): Added.
|
||
(createSampleBuildRequest): Create a unique build request for each platform.
|
||
(samplePendingBuild): Optionally specify build time and slave name.
|
||
(sampleInProgressBuild): Optionally specify slave name.
|
||
(sampleFinishedBuild): Ditto.
|
||
* unit-tests/resources/mock-remote-api.js:
|
||
(assert.notReached.assert.notReached):
|
||
(MockRemoteAPI.url): Added.
|
||
(MockRemoteAPI.postFormUrlencodedData): Added.
|
||
(MockRemoteAPI._addRequest): Extracted from getJSONWithStatus.
|
||
(MockRemoteAPI.waitForRequest): Extracted from inject. For tools-buildbot-triggerable-tests.js, we
|
||
need to instantiate a RemoteAPI for buildbot without replacing global.RemoteAPI.
|
||
(MockRemoteAPI.inject):
|
||
(MockRemoteAPI.reset): Added.
|
||
|
||
2016-03-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Simplify API of Test model by removing Test.setParentTest
|
||
https://bugs.webkit.org/show_bug.cgi?id=156055
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Removed Test.setParentTest. Keep track of the child-parent relationship using the static map instead.
|
||
|
||
Now each test only stores parent's id and uses the ID static map in Test.parentTest().
|
||
|
||
* public/v3/models/manifest.js:
|
||
(Manifest._didFetchManifest.buildObjectsFromIdMap): Removed the code to create the map of child-parent
|
||
relationship and call setParentTest.
|
||
* public/v3/models/test.js:
|
||
(Test): Updated a static map by the name of "childTestMap" to store itself. We should probably sort
|
||
child tests using some fixed criteria in the future instead of relying on the creation order but
|
||
preserve the old code's ordering for now.
|
||
(Test.prototype.parentTest): Look up the static map by the parent test's id.
|
||
(Test.prototype.onlyContainsSingleMetric):
|
||
(Test.prototype.setParentTest): Deleted.
|
||
(Test.prototype.childTests): Look up the child test map.
|
||
|
||
2016-03-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
BuildRequest should have associated platform and test
|
||
https://bugs.webkit.org/show_bug.cgi?id=156054
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Added methods to retrieve the platform and the test associated with a build request with tests.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest):
|
||
(BuildRequest.prototype.platform): Added.
|
||
(BuildRequest.prototype.test): Added.
|
||
* server-tests/api-build-requests-tests.js:
|
||
* server-tests/api-manifest.js: Fixed a typo. This tests /api/manifest, not /api/build-requests.
|
||
* unit-tests/buildbot-syncer-tests.js:
|
||
(.createSampleBuildRequest): Now takes Platform and Test objects to avoid hitting assertions in
|
||
BuildRequest's constructor.
|
||
|
||
2016-03-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
BuildRequest should have a method to fetch all in-progress and pending requests for a triggerable
|
||
https://bugs.webkit.org/show_bug.cgi?id=156008
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Add a method to BuildRequest that fetches all pending and in-progress requests for a triggerable.
|
||
|
||
Now, new syncing scripts must be able to figure out the build slave the first build requests in
|
||
a given test group had used in order to schedule subsequent build requests in the test group.
|
||
|
||
For this purpose, /api/build-requests has been modified to return all build requests whose test
|
||
group had not finished yet. A test group is finished if all build requests in the test group had
|
||
finished (completed, failed, or canceled).
|
||
|
||
* public/include/build-requests-fetcher.php:
|
||
(BuildRequestFetcher::fetch_incomplete_requests_for_triggerable): Return all build requests in test
|
||
groups that have not been finished.
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest):
|
||
(BuildRequest.prototype.testGroupId): Added.
|
||
(BuildRequest.prototype.isPending): Renamed from hasPending to fix a bad grammar.
|
||
(BuildRequest.fetchForTriggerable): Added.
|
||
(BuildRequest.constructBuildRequestsFromData): Extracted from _createModelsFromFetchedTestGroups in
|
||
TestGroup.
|
||
* public/v3/models/manifest.js:
|
||
(Manifest.fetch): Use the full path from root so that it works in server tests.
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.hasPending):
|
||
(TestGroup._createModelsFromFetchedTestGroups):
|
||
* server-tests/api-build-requests-tests.js: Added tests to ensure all build requests for a test group
|
||
is present in the response returned by /api/build-requests iff any build request in the group had not
|
||
finished yet.
|
||
(.addMockData):
|
||
(.addAnotherMockTestGroup): Added.
|
||
* unit-tests/test-groups-tests.js:
|
||
|
||
2016-03-29 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make dependency injection in unit tests more explicit
|
||
https://bugs.webkit.org/show_bug.cgi?id=156006
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Make the dependency injection of model objects in unit tests explicit so that server tests that create
|
||
"real" model objects won't create these mock objects. Now each test that uses mock model objects would call
|
||
MockModels.inject() to inject before / beforeEach and access each object using a property on MockModels
|
||
instead of them being implicitly defined on the global object.
|
||
|
||
Similarly, MockRemoteAPI now only replaces global.RemoteAPI during each test so that server tests can use
|
||
real RemoteAPI to access the test Apache server.
|
||
|
||
* unit-tests/analysis-task-tests.js:
|
||
* unit-tests/buildbot-syncer-tests.js:
|
||
(createSampleBuildRequest):
|
||
* unit-tests/measurement-adaptor-tests.js:
|
||
* unit-tests/measurement-set-tests.js:
|
||
* unit-tests/resources/mock-remote-api.js:
|
||
(MockRemoteAPI.getJSONWithStatus):
|
||
(MockRemoteAPI.inject): Added. Override RemoteAPI on the global object during each test.
|
||
* unit-tests/resources/mock-v3-models.js:
|
||
(MockModels.inject): Added. Create mock model objects before each test, and clear all static maps of
|
||
various v3 model classes (to remove all singleton objects for those model classes).
|
||
* unit-tests/test-groups-tests.js:
|
||
|
||
2016-03-29 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
BuildbotSyncer should be able to fetch JSON from buildbot
|
||
https://bugs.webkit.org/show_bug.cgi?id=155921
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Added BuildbotSyncer.pullBuildbot which fetches pending, in-progress, and finished builds from buildbot
|
||
with lots of unit tests as this has historically been a source of subtle bugs in the old script.
|
||
|
||
New implementation fixes a subtle bug in the old pythons script which overlooked the possibility that
|
||
the state of some builds may change between each HTTP request. In the old script, we fetched the list
|
||
of the pending builds, and requested -1, -2, etc... builds for N times. But between each request,
|
||
a pending build may start running or an in-progress build finish and shift the offset by one. The new
|
||
script avoids this problem by first requesting all pending builds, then all in-progress and finished
|
||
builds in a single HTTP request. The results are then merged so that entries for in-progress and
|
||
finished builds would override the entries for pending builds if they overlap.
|
||
|
||
Also renamed RemoteAPI.fetchJSON to RemoteAPI.getJSON to match v3 UI's RemoteAPI. This change makes
|
||
the class interchangeable between frontend (public/v3/remote.js) and backend (tools/js/remote.js).
|
||
|
||
* server-tests/api-build-requests-tests.js:
|
||
* server-tests/api-manifest.js:
|
||
* tools/js/buildbot-syncer.js:
|
||
(BuildbotBuildEntry): Removed the unused argument "type". Store the syncer as an instance variable as
|
||
we'd need to query for the buildbot URL. Also fixed a bug that _isInProgress was true for finished
|
||
builds as 'currentStep' is always defined but null in those builds.
|
||
(BuildbotBuildEntry.prototype.buildNumber): Added.
|
||
(BuildbotBuildEntry.prototype.isPending): Added.
|
||
(BuildbotBuildEntry.prototype.hasFinished): Added.
|
||
(BuildbotSyncer.prototype.pullBuildbot): Added. Fetches pending builds first and then finished builds.
|
||
(BuildbotSyncer.prototype._pullRecentBuilds): Added. Fetches in-progress and finished builds.
|
||
(BuildbotSyncer.prototype.urlForPendingBuildsJSON): Added.
|
||
(BuildbotSyncer.prototype.urlForBuildJSON): Added.
|
||
(BuildbotSyncer.prototype.url): Added.
|
||
(BuildbotSyncer.prototype.urlForBuildNumber): Added.
|
||
* tools/js/remote.js:
|
||
(RemoteAPI.prototype.getJSON): Renamed from fetchJSON.
|
||
(RemoteAPI.prototype.getJSONWithStatus): Renamed from fetchJSONWithStatus.
|
||
* tools/js/v3-models.js: Load tools/js/remote.js instead of public/v3/remote.js inside node.
|
||
* unit-tests/buildbot-syncer-tests.js: Added a lot of unit tests for BuildbotSyncer.pullBuildbot
|
||
(samplePendingBuild):
|
||
(sampleInProgressBuild): Added.
|
||
(sampleFinishedBuild): Added.
|
||
* unit-tests/resources/mock-remote-api.js:
|
||
(global.RemoteAPI.getJSON): Use the same mock as getJSONWithStatus.
|
||
|
||
2016-03-24 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Migrate admin-regenerate-manifest.js to mocha.js and test v3 UI code
|
||
https://bugs.webkit.org/show_bug.cgi?id=155863
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Replaced admin-regenerate-manifest.js by a new mocha.js tests using the new server testing capability
|
||
added in r198642 and tested v3 UI code (parsing manifest.json and creating models). Also removed
|
||
/admin/regenerate-manifest since it has been superseded by /api/manifest.
|
||
|
||
This patch also extracts manifest.js out of main.js so that it could be used and tested without the
|
||
DOM support in node.
|
||
|
||
* public/admin/regenerate-manifest.php: Deleted.
|
||
* public/include/db.php: Fixed a regression from r198642 since CONFIG_DIR now doesn't end with
|
||
a trailing backslash.
|
||
* public/include/manifest.php:
|
||
(ManifestGenerator::bug_trackers): Avoid a warning message when there are no repositories.
|
||
* public/v3/index.html:
|
||
* public/v3/main.js:
|
||
(main):
|
||
* public/v3/models/bug-tracker.js:
|
||
(BugTracker.prototype.newBugUrl): Added.
|
||
(BugTracker.prototype.repositories): Added.
|
||
* public/v3/models/manifest.js: Added. Extracted from main.js.
|
||
(Manifest.fetch): Moved from main.js' fetchManifest.
|
||
(Manifest._didFetchManifest): Moved from main.js' didFetchManifest.
|
||
* public/v3/models/platform.js:
|
||
(Platform.prototype.hasTest): Fixed the bug that "test" here was shadowing the function parameter of
|
||
the same name. This is tested by the newly added test cases.
|
||
* server-tests/api-build-requests-tests.js:
|
||
* server-tests/api-manifest.js: Added. Migrated test cases from tests/admin-regenerate-manifest.js
|
||
with additional assertions for v3 UI model objects.
|
||
* server-tests/resources/test-server.js:
|
||
(TestServer.prototype.start):
|
||
(TestServer.prototype.testConfig): Renamed from _constructTestConfig now that this is a public API.
|
||
Also no longer takes dataDirectory as an argument since it's always the same.
|
||
(TestServer.prototype._ensureDataDirectory): Fixed a bug that we weren't making public/data.
|
||
(TestServer.prototype.cleanDataDirectory): Added. Remove all files inside public/data between tests.
|
||
(TestServer.prototype.inject): Added. Calls before, etc... because always calling before had an
|
||
unintended side effect of slowing down unit tests even through they don't need Postgres or Apache.
|
||
* tests/admin-regenerate-manifest.js: Removed.
|
||
* tools/js/database.js:
|
||
* tools/js/v3-models.js:
|
||
|
||
2016-03-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add mocha server tests for /api/build-requests
|
||
https://bugs.webkit.org/show_bug.cgi?id=155831
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added the new mocha.js based server-tests for /api/build-requests. The new harness automatically:
|
||
- starts a new Apache instance
|
||
- switches the database during testing via setting an environmental variable
|
||
- backups and restores public/data directory during testing
|
||
|
||
As a result, developer no longer has to manually setup Apache, edit config.json manually to use
|
||
a testing database, or run /api/manifest.php to re-generate the manifest file after testing.
|
||
|
||
This patch also makes ID resolution optional on /api/build-requests so that v3 model based syncing
|
||
scripts can re-use the same code as the v3 UI to process the JSON. tools/sync-with-buildbot.py has
|
||
been modified to use this option (useLegacyIdResolution).
|
||
|
||
* config.json: Added configurations for the test httpd server.
|
||
* init-database.sql: Don't error when tables and types don't exist (when database is empty).
|
||
* public/api/build-requests.php:
|
||
(main): Made the ID resolution optional with useLegacyIdResolution. Also removed "updates" from the
|
||
results JSON since it's never used.
|
||
* public/include/build-requests-fetcher.php:
|
||
(BuildRequestsFetcher::__construct):
|
||
(BuildRequestsFetcher::fetch_roots_for_set_if_needed): Fixed the bug that we would include the same
|
||
commit multiple times for each root set.
|
||
* public/include/db.php:
|
||
(config): If present, use ORG_WEBKIT_PERF_CONFIG_PATH instead of Websites/perf.webkit.org/config.json.
|
||
* server-tests: Added.
|
||
* server-tests/api-build-requests-tests.js: Added. Tests for /api/build-requests.
|
||
(.addMockData):
|
||
* server-tests/resources: Added.
|
||
* server-tests/resources/test-server.conf: Added. Apache configuration file for testing.
|
||
* server-tests/resources/test-server.js: Added.
|
||
(TestSever): Added.
|
||
(TestSever.prototype.start): Added.
|
||
(TestSever.prototype.stop): Added.
|
||
(TestSever.prototype.remoteAPI): Added. Configures RemoteAPI to be used with the test sever.
|
||
(TestSever.prototype.database): Added. Returns Database configured to use the test database.
|
||
(TestSever.prototype._constructTestConfig): Creates config.json for testing. The file is generated by
|
||
_start and db.php's config() reads it from the environmental variable: ORG_WEBKIT_PERF_CONFIG_PATH.
|
||
(TestSever.prototype._ensureDataDirectory): Renames public/data to public/original-data if exists,
|
||
and creates a new empty public/data.
|
||
(TestSever.prototype._restoreDataDirectory): Deletes public/data and renames public/original-data
|
||
back to public/data.
|
||
(TestSever.prototype._ensureTestDatabase): Drops the test database if exists and creates a new one.
|
||
(TestSever.prototype.initDatabase): Run init-database.sql to start each test with a consistent state.
|
||
(TestSever.prototype._executePgsqlCommand): Executes a postgres command line tool such as psql.
|
||
(TestSever.prototype._determinePgsqlDirectory): Finds the directory that contains psql.
|
||
(TestSever.prototype._startApache): Starts an Apache instance for testing.
|
||
(TestSever.prototype._stopApache): Stops the Apache instance for testing.
|
||
(TestSever.prototype._waitForPid): Waits for the Apache pid file to appear or disappear.
|
||
(before): Start the test server at the beginning.
|
||
(beforeEach): Re-initialize all tables before each test.
|
||
(after): Stop the test server at the end.
|
||
* tools/js/config.js:
|
||
(Config.prototype.path):
|
||
(Config.prototype.serverRoot): Added. The path to Websites/perf.webkit.org/public/.
|
||
(Config.prototype.pathFromRoot): Added. Resolves a path from Websites/perf.webkit.org.
|
||
* tools/js/database.js:
|
||
(Database): Now optionally takes the database name to use a different database during testing.
|
||
(Database.prototype.connect):
|
||
(Database.prototype.query): Added.
|
||
(Database.prototype.insert): Added.
|
||
(tableToPrefixMap): Maps table name to its prefix. Used by Database.insert.
|
||
* tools/js/remote.js: Added.
|
||
(RemoteAPI): Added. This is node.js equivalent of RemoteAPI in public/v3/remote.js.
|
||
(RemoteAPI.prototype.configure): Added.
|
||
(RemoteAPI.prototype.fetchJSON): Added.
|
||
(RemoteAPI.prototype.fetchJSONWithStatus): Added.
|
||
(RemoteAPI.prototype.sendHttpRequest): Added.
|
||
* tools/sync-with-buildbot.py:
|
||
(main): Use useLegacyIdResolution as this script relies on the legacy behavior.
|
||
* unit-tests/checkconfig.js: pg was never directly used in this test.
|
||
|
||
2016-03-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Delete a file that was supposed to be removed in r198614 for real.
|
||
|
||
* unit-tests/resources/v3-models.js: Removed.
|
||
|
||
2016-03-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add a model for parsing buildbot JSON with unit tests
|
||
https://bugs.webkit.org/show_bug.cgi?id=155814
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Added BuildbotSyncer and BuildbotBuildEntry classes to parse buildbot JSON files with unit tests.
|
||
They will be used in the new syncing scripts to improve A/B testing.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest):
|
||
* tools/js/buildbot-syncer.js: Added.
|
||
(BuildbotBuildEntry): Added.
|
||
(BuildbotBuildEntry.prototype.slaveName): Added.
|
||
(BuildbotBuildEntry.prototype.buildRequestId): Added.
|
||
(BuildbotBuildEntry.prototype.isInProgress): Added.
|
||
(BuildbotSyncer): Added.
|
||
(BuildbotSyncer.prototype.testPath): Added.
|
||
(BuildbotSyncer.prototype.builderName): Added.
|
||
(BuildbotSyncer.prototype.platformName): Added.
|
||
(BuildbotSyncer.prototype.fetchPendingRequests): Added.
|
||
(BuildbotSyncer.prototype._propertiesForBuildRequest): Added.
|
||
(BuildbotSyncer.prototype._revisionSetFromRootSetWithExclusionList): Added.
|
||
(BuildbotSyncer._loadConfig): Added.
|
||
(BuildbotSyncer._validateAndMergeConfig): Added.
|
||
(BuildbotSyncer._validateAndMergeProperties): Added.
|
||
* tools/js/v3-models.js: Copied from unit-tests/resources/v3-models.js.
|
||
(beforeEach): Deleted since this only defined inside mocha.
|
||
* unit-tests/analysis-task-tests.js:
|
||
* unit-tests/buildbot-syncer-tests.js: Added.
|
||
(sampleiOSConfig):
|
||
(createSampleBuildRequest):
|
||
(.smallConfiguration):
|
||
* unit-tests/measurement-adaptor-tests.js:
|
||
* unit-tests/measurement-set-tests.js:
|
||
* unit-tests/resources/mock-v3-models.js: Renamed from unit-tests/resources/v3-models.js.
|
||
(beforeEach):
|
||
* unit-tests/test-groups-tests.js:
|
||
(sampleTestGroup):
|
||
|
||
2016-03-22 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add unit tests for test-group.js
|
||
https://bugs.webkit.org/show_bug.cgi?id=155781
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Added unit tests for test-group.js that would have caught regressions fixed in r198503.
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase.prototype._renderAnnotations): Added a forgotten break statement.
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.prototype.setResult):
|
||
(BuildRequest):
|
||
* public/v3/models/test-group.js:
|
||
* unit-tests/measurement-set-tests.js: Use ./resources/v3-models.js to reduce the code duplication.
|
||
* unit-tests/resources/v3-models.js: Import more stuff from v3 models.
|
||
(beforeEach):
|
||
* unit-tests/test-groups-tests.js: Added. Added some unit tests for TestGroup.
|
||
(sampleTestGroup):
|
||
(.testGroupWithStatusList):
|
||
|
||
2016-03-22 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix a typo.
|
||
|
||
* config.json:
|
||
|
||
2016-03-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Commit log viewer repaints too frequently after r198499
|
||
https://bugs.webkit.org/show_bug.cgi?id=155732
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
The bug was caused by InteractiveTimeSeriesChart invoking onchange callback whenever mouse moved even
|
||
if the current point didn't change. Fixed the bug by avoiding the work if the indicator hadn't changed
|
||
and avoiding work in the commit log viewer when the requested repository and the revision range were
|
||
the same as those of the last request.
|
||
|
||
* public/v3/components/commit-log-viewer.js:
|
||
(CommitLogViewer):
|
||
(CommitLogViewer.prototype.currentRepository): Exit early when repository and the revision range are
|
||
identical to the one we already have to avoid repaints and issuing multiple network requests.
|
||
* public/v3/components/interactive-time-series-chart.js:
|
||
(InteractiveTimeSeriesChart.prototype._mouseMove): Don't invoke _notifyIndicatorChanged if the current
|
||
indicator hadn't changed.
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane.prototype._indicatorDidChange): Fixed the bug that unlocking the indicator wouldn't update
|
||
the URL. We need to check whether the lock state had changed. The old condition was also redundant
|
||
since _mainChartIndicatorWasLocked is always identically equal to isLocked per the prior assignment.
|
||
|
||
2016-03-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix A/B testing after r198503.
|
||
|
||
* public/include/build-requests-fetcher.php:
|
||
|
||
2016-03-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Analysis task page is broken after r198479
|
||
https://bugs.webkit.org/show_bug.cgi?id=155735
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
* public/api/measurement-set.php:
|
||
(AnalysisResultsFetcher::fetch_commits): We need to emit the commit ID as done for regular data.
|
||
* public/include/build-requests-fetcher.php:
|
||
(BuildRequestsFetcher::fetch_roots_for_set_if_needed): Ditto. Don't use a fake ID after r198479.
|
||
* public/v3/models/commit-log.js:
|
||
(CommitLog): Assert that all commit log IDs are integers to catch regressions like this in future.
|
||
* public/v3/models/root-set.js:
|
||
(RootSet): Don't resolve Repository here as doing so would modify the shared "root" entry in the JSON
|
||
we fetched, and subsequent construction of RootSet would fail since this line would blow up trying to
|
||
find the repository with "[object]" as the ID.
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup._createModelsFromFetchedTestGroups): Resolve Repository here.
|
||
|
||
2016-03-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v3 UI sometimes don't update the list of revisions on the commit log viewer
|
||
https://bugs.webkit.org/show_bug.cgi?id=155729
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Fixed multiple bugs that were affecting the list of blame range and commit logs for the range weren't
|
||
updated in some cases on v3 UI. Also, the commit log viewer state is now a part of the URL state so
|
||
opening and closing the commit log viewer will persist across page loads.
|
||
|
||
Also fixed a regression from r198479 that Test object can't be created for a top level test.
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase.prototype.configure):
|
||
(ChartPaneBase.prototype._mainSelectionDidChange): Fixed the bug that the list of blame range nor the
|
||
commit log viewer don't get updated when the selected range changes.
|
||
(ChartPaneBase.prototype._indicatorDidChange):
|
||
(ChartPaneBase.prototype._didFetchData):
|
||
(ChartPaneBase.prototype._updateStatus): Extracted from _indicatorDidChange and _didFetchData.
|
||
(ChartPaneBase.prototype._requestOpeningCommitViewer): Renamed from _openCommitViewer.
|
||
|
||
* public/v3/components/chart-status-view.js:
|
||
(ChartStatusView.prototype.updateStatusIfNeeded): Fixed the bug that the blame range doesn't get set
|
||
on the initial page load when the selection range is set but the chart data hadn't been fetched yet.
|
||
|
||
* public/v3/components/commit-log-viewer.js:
|
||
(CommitLogViewer.prototype.view): Fixed the bug that we don't clear out the old list of commits while
|
||
loading the next set of commits to show as it looked as if the list was never updated.
|
||
(CommitLogViewer.prototype.render): Fixed the bug that the view always show the last repository name
|
||
even if there were nothing being fetched or commits to show.
|
||
|
||
* public/v3/components/pane-selector.js:
|
||
(PaneSelector.prototype.focus): Removed superfluous call to console.log.
|
||
|
||
* public/v3/models/data-model.js:
|
||
(DataModelObject.listForStaticMap): Generalized the code for all to fix the bug in Test.
|
||
(DataModelObject.all):
|
||
|
||
* public/v3/models/test.js:
|
||
(Test): Fixed the bug that this code was relying on the static map to be an array.
|
||
(Test.topLevelTests): Use newly added listForStaticMap to convert the dictionary to an array.
|
||
|
||
* public/v3/pages/chart-pane-status-view.js:
|
||
(ChartPaneStatusView): Always initialize _usedRevisionRange as a triple to simplify code elsewhere.
|
||
(ChartPaneStatusView.prototype.render): Invoke _revisionCallback when user clicks on a repository
|
||
expansion mark (>>). Also fixed click handler from the row since this made selecting revision range
|
||
on the view cumbersome. Now user has to explicitly click on the expansion mark (>>).
|
||
(ChartPaneStatusView.prototype._setRevisionRange): Now takes shouldNotify, from, and to as arguments
|
||
as this function must not invoke_revisionCallback inside _updateRevisionListForNewCurrentRepository.
|
||
(ChartPaneStatusView.prototype.moveRepositoryWithNotification): Use newly added setCurrentRepository
|
||
instead of manually invoking setCurrentRepository and updateRevisionListWithNotification.
|
||
(ChartPaneStatusView.prototype.setCurrentRepository): Fixed the bug that we weren't updating the
|
||
blame list here.
|
||
(ChartPaneStatusView.prototype.updateRevisionList): Renamed from updateRevisionListWithNotification
|
||
since we no longer call _revisionCallback. In general, callbacks are only meant to communicate user
|
||
initiated actions, and not program induced updates like this API so this was a bad pattern anyway.
|
||
ChartPane now explicitly updates the commit log viewer instead of relying on this function calling
|
||
_requestOpeningCommitViewer implicitly.
|
||
(ChartPaneStatusView.prototype._updateRevisionListForNewCurrentRepository): Extracted from
|
||
updateRevisionListWithNotification so that setCurrentRepository can also call this function.
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane.prototype._requestOpeningCommitViewer): Overrides ChartPaneBase's method. Open the same
|
||
repository in other panes via ChartsPage.setOpenRepository.
|
||
(ChartPane.prototype.setOpenRepository): This method is called when the user selected a repository in
|
||
another pane. Open the same repository in this pane if it wasn't already open.
|
||
|
||
* public/v3/pages/charts-page.js:
|
||
(ChartsPage): Added this._currentRepositoryId.
|
||
(ChartsPage.prototype.serializeState): Serialize _currentRepositoryId.
|
||
(ChartsPage.prototype.updateFromSerializedState): Set the commit log viewer's
|
||
(ChartsPage.prototype.setOpenRepository): Added.
|
||
|
||
* tests/api-measurement-set.js: Fixed a test after r198479.
|
||
|
||
2016-03-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
V3 Perf Dashboard should automatically select initial range when creating a new task
|
||
https://bugs.webkit.org/show_bug.cgi?id=155677
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
Select the entire range of points for which the analysis task is created by default so that creating
|
||
a test group to confirm the regression / progression is easy.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage): Added a boolean flag which indicates the user had modified main chart's selection.
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype.render): Set the main chart's selection to the entire range of points in
|
||
the analysis task if the user had never modified selection.
|
||
(AnalysisTaskPage.prototype._chartSelectionDidChange): This callback is invoked only when the user had
|
||
modified the selection so set _selectionWasModifiedByUser true here unconditionally.
|
||
|
||
2016-03-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Associated commits don't immediately show up on an analysis task page
|
||
https://bugs.webkit.org/show_bug.cgi?id=155692
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
The bug was caused by resolveCommits in AnalysisTask._constructAnalysisTasksFromRawData not being
|
||
able to find the matching commit log if the commit log had been created by the charts which don't
|
||
set the remote identifiers on each CommitLog objects.
|
||
|
||
Fixed the bug by modifying /api/measurement-set to include the commit ID, and making CommitLog
|
||
use the real database ID as its ID instead of a fake ID we create from repository and revision.
|
||
|
||
Also added a bunch of Mocha unit tests for AnalysisTask.fetchAll.
|
||
|
||
* public/api/measurement-set.php:
|
||
(MeasurementSetFetcher::execute_query): Fetch commit_id.
|
||
(MeasurementSetFetcher::format_run): Use pass-by-reference to avoid making a copy of the row.
|
||
(MeasurementSetFetcher::parse_revisions_array): Include commit_id as the first item in the result.
|
||
* public/v3/instrumentation.js:
|
||
* public/v3/models/analysis-task.js:
|
||
(AnalysisTask): Fixed a bug that _buildRequestCount and _finishedBuildRequestCount could be kept
|
||
as strings and hasPendingRequests() could return a wrong result because it would perform string
|
||
inequality instead of numerical inequality.
|
||
(AnalysisTask.prototype.updateSingleton): Ditto.
|
||
(AnalysisTask.prototype.dissociateCommit):
|
||
(AnalysisTask._constructAnalysisTasksFromRawData):
|
||
(AnalysisTask._constructAnalysisTasksFromRawData.resolveCommits): Use findById now that CommitLog
|
||
objects all use the same id as the database id.
|
||
* public/v3/models/commit-log.js:
|
||
(CommitLog):
|
||
(CommitLog.prototype.remoteId): Deleted since we no longer create a fake id for commit logs for
|
||
measurement sets.
|
||
(CommitLog.findByRemoteId): Deleted.
|
||
(CommitLog.ensureSingleton): Deleted.
|
||
(CommitLog.fetchBetweenRevisions):
|
||
|
||
* public/v3/models/data-model.js:
|
||
(DataModelObject.clearStaticMap): Added to aid unit testing.
|
||
(DataModelObject.ensureNamedStaticMap): Fixed a typo. Each map is a dictionary, not an array.
|
||
* public/v3/models/metric.js:
|
||
* public/v3/models/platform.js:
|
||
* public/v3/models/root-set.js:
|
||
(RootSet): Updated per the interface change in CommitLog.ensureSingleton.
|
||
(MeasurementRootSet): Updated per /api/measurement-set change. Use the first value as the id.
|
||
* public/v3/models/test.js:
|
||
* unit-tests/analysis-task-tests.js: Added.
|
||
(sampleAnalysisTask):
|
||
(measurementCluster):
|
||
* unit-tests/checkconfig.js: Added some assertion message to help aid diagnosing the failure.
|
||
* unit-tests/measurement-adaptor-tests.js: Updated the sample data per the API change in
|
||
/api/measurement-set and also added assertions for commit log ids.
|
||
* unit-tests/measurement-set-tests.js:
|
||
(beforeEach):
|
||
* unit-tests/resources: Added.
|
||
* unit-tests/resources/mock-remote-api.js: Added. Extracted from measurement-set-tests.js to be
|
||
used in analysis-task-tests.js.
|
||
(assert.notReached.assert.notReached):
|
||
(global.RemoteAPI.getJSON):
|
||
(global.RemoteAPI.getJSONWithStatus):
|
||
(beforeEach):
|
||
* unit-tests/resources/v3-models.js: Added. Extracted from measurement-set-tests.js to be used in
|
||
analysis-task-tests.js and added more imports as needed.
|
||
(importFromV3):
|
||
(beforeEach):
|
||
|
||
2016-03-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r198464.
|
||
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups):
|
||
|
||
2016-03-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r198234.
|
||
|
||
* public/api/commits.php:
|
||
(main): Typo: fetch_latest_reported -> fetch_last_reported.
|
||
* public/include/commit-log-fetcher.php:
|
||
(CommitLogFetcher::format_single_commit): commits should be an array.
|
||
|
||
2016-03-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf Dashboard v3 confuses better and worse on A/B task page
|
||
https://bugs.webkit.org/show_bug.cgi?id=155675
|
||
<rdar://problem/25208723>
|
||
|
||
Reviewed by Joseph Pecoraro.
|
||
|
||
The analysis results viewer on v3 UI sometimes treats regressions as progressions and vice versa when
|
||
the first set (i.e. set A) of the revisions used in an A/B testing never appears in the original graph,
|
||
and its latest commit time matches that of the second set, which appears in the original graph.
|
||
|
||
Because the analysis results viewer compares results in the increasing row number, this results in
|
||
B to be compared to A instead of A to be compared to B. Fixed the bug by preventing the wrong ordering
|
||
to occur in _buildRowsForPointsAndTestGroups by always inserting a root set A before B when B appears
|
||
and A doesn't appear in the original graph.
|
||
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer.prototype._collectRootSetsInTestGroups): Remember the succeeding root set B
|
||
when creating an entry for root set A.
|
||
(AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups): Fixed the bug. Also un-duplicated
|
||
the code to create a new row.
|
||
(AnalysisResultsViewer.RootSetInTestGroup): Now takes a succeeding root set. e.g. it's B for A and
|
||
undefined for B in A/B testing.
|
||
(AnalysisResultsViewer.RootSetInTestGroup.prototype.succeedingRootSet): Added.
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart.computeTimeGrid): Fixed the bug that we would end up showing 0 AM instead of dates
|
||
when both dates and months change.
|
||
|
||
2016-03-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add unit tests for measurement-set.js and measurement-adapter.js
|
||
https://bugs.webkit.org/show_bug.cgi?id=155673
|
||
|
||
Reviewed by Daniel Bates.
|
||
|
||
Add tests which were supposed to be added in r198462.
|
||
|
||
* unit-tests/measurement-adaptor-tests.js: Added.
|
||
* unit-tests/measurement-set-tests.js: Added.
|
||
(assert.notReached): Added.
|
||
(global.RemoteAPI.getJSON): Added.
|
||
(global.RemoteAPI.getJSONWithStatus): Added. A mock.
|
||
|
||
2016-03-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add unit tests for measurement-set.js and measurement-adapter.js
|
||
https://bugs.webkit.org/show_bug.cgi?id=155673
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Added mocha unit tests for MeasurementSet and MeasurementAdapter classes along with the necessary
|
||
refactoring to run these tests in node.
|
||
|
||
getJSON and getJSONStatus are now under RemoteAPI so that unit tests can mock them.
|
||
|
||
Removed the dependency on v2 UI's TimeSeries and Measurement class by adding a new implementation
|
||
of TimeSeries in v3 and removing the dependency on Measurement in chart-pane-status-view.js with
|
||
new helper methods on Build and CommitLog.
|
||
|
||
Many js files now use 'use strict' (node doesn't support class syntax in non-strict mode) and
|
||
module.exports to export symbols in node's require function.
|
||
|
||
* public/v3/index.html:
|
||
* public/v3/main.js:
|
||
* public/v3/models/analysis-results.js:
|
||
(AnalysisResults.fetch):
|
||
* public/v3/models/analysis-task.js:
|
||
(AnalysisTask.fetchAll):
|
||
* public/v3/models/builder.js:
|
||
(Build):
|
||
(Build.prototype.builder): Added. Used by ChartPaneStatusView.
|
||
(Build.prototype.buildNumber): Ditto.
|
||
(Build.prototype.buildTime): Ditto.
|
||
* public/v3/models/commit-log.js:
|
||
(CommitLog.prototype.diff): Ditto.
|
||
(CommitLog.fetchBetweenRevisions):
|
||
* public/v3/models/data-model.js:
|
||
(DataModelObject.cachedFetch):
|
||
* public/v3/models/measurement-adaptor.js:
|
||
(MeasurementAdaptor.prototype.applyToAnalysisResults): Renamed from adoptToAnalysisResults.
|
||
(MeasurementAdaptor.prototype.applyTo): Renamed from adoptToSeries. Now shares a lot more
|
||
code with applyToAnalysisResults. The code to set 'series' and 'seriesIndex' has been moved
|
||
to TimeSeries.append. 'measurement' is no longer needed as this patch removes its only use
|
||
in ChartPaneStatusView.
|
||
* public/v3/models/measurement-cluster.js:
|
||
(MeasurementCluster.prototype.addToSeries): Use TimeSeries.append instead of directly mutating
|
||
series._series.
|
||
* public/v3/models/measurement-set.js:
|
||
(Array.prototype.includes): Added a polyfill for node.
|
||
(MeasurementSet.prototype._fetchSecondaryClusters): Removed a bogus assertion. When fetchBetween
|
||
is called with a mixture of clusters that have been fetched and not fetched, this assertion fails.
|
||
(MeasurementSet.prototype._fetch):
|
||
(TimeSeries.prototype.findById): Moved to time-series.js.
|
||
(TimeSeries.prototype.dataBetweenPoints): Ditto.
|
||
(TimeSeries.prototype.firstPoint): Ditto.
|
||
(TimeSeries.prototype.fetchedTimeSeries): Moved the code to extend the last point to TimeSeries'
|
||
extendToFuture.
|
||
* public/v3/models/repository.js:
|
||
* public/v3/models/root-set.js:
|
||
(MeasurementRootSet): Ignore repositories that had not been defined (e.g. it could be added after
|
||
manifest.json had been downloaded but before a given root set is created for an A/B testing).
|
||
* public/v3/models/time-series.js:
|
||
(TimeSeries): Added.
|
||
(TimeSeries.prototype.append): Added.
|
||
(TimeSeries.prototype.extendToFuture): Added.
|
||
(TimeSeries.prototype.firstPoint): Moved from measurement-set.js.
|
||
(TimeSeries.prototype.lastPoint): Added.
|
||
(TimeSeries.prototype.previousPoint): Added.
|
||
(TimeSeries.prototype.nextPoint): Added.
|
||
(TimeSeries.prototype.findPointByIndex): Added.
|
||
(TimeSeries.prototype.findById): Moved from measurement-set.js.
|
||
(TimeSeries.prototype.findPointAfterTime): Added.
|
||
(TimeSeries.prototype.dataBetweenPoints): Moved from measurement-set.js.
|
||
* public/v3/pages/chart-pane-status-view.js:
|
||
(ChartPaneStatusView.prototype.render): Use newly added helper functions on Build.
|
||
(ChartPaneStatusView.prototype._formatTime): Added.
|
||
(ChartPaneStatusView.prototype.setCurrentRepository):
|
||
(ChartPaneStatusView.prototype.computeChartStatusLabels): Rewrote the code using RootSet object on
|
||
currentPoint and previousPoint instead of Measurement class from v2 UI. Also sort the results using
|
||
sortByNamePreferringOnesWithURL.
|
||
* public/v3/remote.js:
|
||
(RemoteAPI.getJSON): Moved under RemoteAPI.
|
||
(RemoteAPI.getJSONWithStatus): Ditto.
|
||
(PrivilegedAPI):
|
||
(PrivilegedAPI.requestCSRFToken):
|
||
|
||
2016-03-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add unit tests for config.json and statistics.js
|
||
https://bugs.webkit.org/show_bug.cgi?id=155626
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Added mocha unit tests for statistics.js and validating config.json. For segmentations, I've extracted
|
||
real data from our internal perf dashboard.
|
||
|
||
Also fixed some bugs covered by these new tests.
|
||
|
||
* public/shared/statistics.js:
|
||
(Statistics.movingAverage): Fixed a bug that forwardWindowSize was never used.
|
||
(Statistics.exponentialMovingAverage): Fixed the bug that the moving average starts at 0. It should
|
||
start at the first value instead.
|
||
(.splitIntoSegmentsUntilGoodEnough): Fixed the bug that we may try to segment a time series into
|
||
more parts than there are data points. Clearly, that doesn't make any sense.
|
||
(.findOptimalSegmentation): Renamed local variables so that they're more descriptive, and rewrote
|
||
the debugging code was the old code was emitting some useless data. Also fixed the bug that the length
|
||
of "segmentation" was off by one (we need segmentCount + 1 elements in the array sine we always
|
||
include the start of the first segment = 0 and the end of the last segment = values.length).
|
||
(.SampleVarianceUpperTriangularMatrix):
|
||
(Statistics): Modernized the export code.
|
||
* tools/js: Added.
|
||
* tools/js/config.js: Added.
|
||
(Config): Added.
|
||
(Config.prototype.configFilePath): Added.
|
||
(Config.prototype.value): Added.
|
||
(Config.prototype.path): Added.
|
||
* tools/js/database.js: Added.
|
||
(Database): Added.
|
||
(Database.prototype.connect): Added.
|
||
(Database.prototype.disconnect): Added.
|
||
* unit-tests: Added.
|
||
* unit-tests/checkconfig.js: Added. Validates config.json. This is useful while setting up
|
||
a local instance of the perf dashboard.
|
||
* unit-tests/statistics-tests.js: Added.
|
||
(assert.almostEqual): Added. Asserts that two floating values are within a given significant digits.
|
||
(.stdev):
|
||
(.delta):
|
||
(.computeWelchsT):
|
||
|
||
2016-03-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix a typo which was supposed to be fixed in r198351.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype.render):
|
||
|
||
2016-03-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
An analysis task should be closed if a progression cause is identified
|
||
https://bugs.webkit.org/show_bug.cgi?id=155549
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Since a progression is desirable, we should close an analysis task once its cause is identified.
|
||
|
||
Also fix some typos.
|
||
|
||
* init-database.sql: Fixed a typo.
|
||
* public/api/analysis-tasks.php:
|
||
* public/v3/models/analysis-task.js:
|
||
(AnalysisTask.prototype.dissociateBug): Renamed from dissociateBug.
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype.render):
|
||
(AnalysisTaskPage.prototype._dissociateBug): Renamed from _dissociateBug.
|
||
(AnalysisTaskPage.prototype._dissociateCommit): Fixed the typo in the alert.
|
||
|
||
2016-03-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Analysis task page should allow specifying commits that caused or fixed a regression or a progression
|
||
https://bugs.webkit.org/show_bug.cgi?id=155529
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added the capability to associate revisions that caused or fixed a progression or a regression for which
|
||
an analysis task was created. Added task_commits that stores this relationship and added the backend
|
||
support to retrieve this table in /api/analysis-tasks and an privileged API to update this table at
|
||
/privileged-api/associate-commit.
|
||
|
||
Also extracted a new component, MutableListView, out of AnalysisTaskPage to render and manipulate a list
|
||
of mutable items, and used it to render the list of associated bugs and commits. The view takes a list of
|
||
kinds (e.g. repositories or bug trackers), and accepts a pair of a kind and arbitrary text as a new item
|
||
value.
|
||
|
||
* init-database.sql: Added task_commits table.
|
||
|
||
* public/api/analysis-tasks.php:
|
||
(main):
|
||
(fetch_associated_data_for_tasks): Renamed from fetch_and_push_bugs_to_tasks now that it also fetches
|
||
the list of commits associated with each analysis task by calling CommitLogFetcher::fetch_for_tasks.
|
||
Also fixe the bug that we were not taking
|
||
(format_task): No longer sets 'category' since the computation of category now depends on the list of
|
||
commits associated with this analysis task which aren't available until fetch_associated_data_for_tasks.
|
||
(determine_category): Added. Categorize any analysis tasks with "fixes" commits as "closed" and "causes"
|
||
commits as "identified".
|
||
|
||
* public/include/commit-log-fetcher.php:
|
||
(CommitLogFetcher::__construct): Remove the unused instance variable.
|
||
(CommitLogFetcher::fetch_for_tasks): Added. Fetches all commits associated with a list of analysis tasks.
|
||
Assumes the caller (fetch_associated_data_for_tasks) had setup "fixes" and "causes" fields on each task.
|
||
|
||
* public/privileged-api/associate-commit.php: Added. Updates task_commits table to associate or disassociate
|
||
a commit with an analysis task. When the specified analysis task and the specified commit are already
|
||
associated, we simply update the table instead of adding a duplicating entry or error. For dissociation,
|
||
the front-end specifies the commit ID.
|
||
(main): Added.
|
||
|
||
* public/v3/index.html:
|
||
* public/v3/components/mutable-list-view.js: Added. Used by the list associated bugs and commits.
|
||
(MutableListView): Added.
|
||
(MutableListView.prototype.setList): Added.
|
||
(MutableListView.prototype.setKindList): Added.
|
||
(MutableListView.prototype.setAddCallback): Added. This callback is invoked when the user tries to add
|
||
a new item to the list.
|
||
(MutableListView.prototype.render): Added.
|
||
(MutableListView.prototype._submitted): Added.
|
||
(MutableListView.cssTemplate):
|
||
(MutableListView.htmlTemplate):
|
||
(MutableListItem): Added. RemovalLink could be a hyperlink or a callback and gets involved when the user
|
||
tries to delete this item.
|
||
(MutableListItem.prototype.content):
|
||
|
||
* public/v3/models/analysis-task.js:
|
||
(AnalysisTask): Added the support of the list of commits that fixed and caused changes.
|
||
(AnalysisTask.prototype.updateSingleton): Ditto.
|
||
(AnalysisTask.prototype.causes): Added.
|
||
(AnalysisTask.prototype.fixes): Added.
|
||
(AnalysisTask.prototype.associateCommit): Added. Use the API added at /privileged-api/associate-commit
|
||
to associate a new commit with this analysis task. Each commit has either caused or fixed the change.
|
||
(AnalysisTask.prototype.dissociateCommit): Added. Use the same API to disassociate each commit.
|
||
(AnalysisTask._constructAnalysisTasksFromRawData): Find all commits associated with each analysis task.
|
||
Because commit log objects use a fake ID fdue to /api/measurement-set not providing commit IDs, we must
|
||
use CommitLog.findByRemoteId to find each commit instead of usual CommitLog.findById.
|
||
(AnalysisTask._constructAnalysisTasksFromRawData.resolveCommits): Added.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.prototype.hasFinished): Renamed from hasCompleted since it was confusing for this._status
|
||
being "completed" wasn't a necessary condition for this function to return true.
|
||
|
||
* public/v3/models/commit-log.js:
|
||
(CommitLog): Added the static map for actual commit ID instead of a fake ID created in ensureSingleton.
|
||
(CommitLog.prototype.remoteId): Added. Returns the real commit ID.
|
||
(CommitLog.findByRemoteId): Added. Finds an CommitLog object using the real ID.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.prototype.hasFinished): Renamed from hasCompleted to match the rename in BuildRequest.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage): Added lists for the commits that fixed and caused the change using MutableListView.
|
||
Also adopted MutableListView for the list of associated bugs.
|
||
(AnalysisTaskPage.prototype.render): Added the code to populate the newly added lists.
|
||
(AnalysisTaskPage.prototype._makeCommitListItem): Added.
|
||
(AnalysisTaskPage.prototype._associateBug): Now this is a callback from MutableListView.
|
||
(AnalysisTaskPage.prototype._associateCommit): Added.
|
||
(AnalysisTaskPage.prototype._dissociateCommit): Added.
|
||
(AnalysisTaskPage.htmlTemplate):
|
||
(AnalysisTaskPage.cssTemplate):
|
||
|
||
* public/v3/remote.js:
|
||
(getJSON): Spit out the entire responseText when JSON failed to parse to make debugging easier.
|
||
|
||
2016-03-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Extract the code to format commit logs into its own PHP file
|
||
https://bugs.webkit.org/show_bug.cgi?id=155514
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Extracted CommitLogFetcher out of /api/commits so that it could be used in analysis-tasks.php
|
||
in the future to support associating cause/fix for each analysis task.
|
||
|
||
* public/api/commits.php:
|
||
* public/include/commit-log-fetcher.php: Added.
|
||
(CommitLogFetcher)
|
||
(CommitLogFetcher::__construct): Added.
|
||
(CommitLogFetcher::repository_id_from_name): Added.
|
||
(CommitLogFetcher::fetch_between): Added.
|
||
(CommitLogFetcher::fetch_oldest): Added.
|
||
(CommitLogFetcher::fetch_latest): Added.
|
||
(CommitLogFetcher::fetch_last_reported): Added.
|
||
(CommitLogFetcher::fetch_revision): Added.
|
||
(CommitLogFetcher::commit_for_revision): Added.
|
||
(CommitLogFetcher::format_single_commit): Added.
|
||
(CommitLogFetcher::format_commit): Added.
|
||
|
||
2016-03-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r196870.
|
||
|
||
* public/include/report-processor.php:
|
||
|
||
2016-03-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add Size metric to perf dashboard
|
||
https://bugs.webkit.org/show_bug.cgi?id=155266
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added the "Size" metric and use bytes as its unit.
|
||
|
||
* public/js/helper-classes.js:
|
||
(PerfTestRuns):
|
||
* public/v2/data.js:
|
||
(RunsData.unitFromMetricName):
|
||
|
||
2016-02-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add the support for universal slave password
|
||
https://bugs.webkit.org/show_bug.cgi?id=154476
|
||
|
||
Reviewed by David Kilzer.
|
||
|
||
Added the support for universalSlavePassword.
|
||
|
||
* config.json:
|
||
* public/include/report-processor.php:
|
||
(ReportProcessor::process):
|
||
(ReportProcessor::authenticate_and_construct_build_data): Extracted from process().
|
||
|
||
2016-02-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Analysis tasks page complains about missing repository but with a wrong name
|
||
https://bugs.webkit.org/show_bug.cgi?id=154468
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Fixed the bug by using the right variable in the template literal.
|
||
|
||
* public/v3/components/customizable-test-group-form.js:
|
||
(CustomizableTestGroupForm.prototype._computeRootSetMap): Use querySelector here since Chrome doesn't have
|
||
getElementsByClassName on ShadowRoot.
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype._createTestGroupAfterVerifyingRootSetList): Use name which is the name of
|
||
repository here.
|
||
|
||
2016-02-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Revert an unintended change made in the previous commit.
|
||
|
||
* init-database.sql:
|
||
|
||
2016-02-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should let user cancel pending A/B testing and hide failed ones
|
||
https://bugs.webkit.org/show_bug.cgi?id=154433
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added a button to hide a test group in the details view (the bottom table) in the analysis task page, and
|
||
"Show hidden tests" link to show the hidden test groups on demand. When a test group is hidden, all pending
|
||
requests in the group will also be canceled since a common scenario of using this feature is that the user
|
||
had triggered an useless A/B testing; e.g. all builds will fail, wrong, etc... We can revisit and add the
|
||
capability to just cancel the pending requests and leaving the group visible later if necessary.
|
||
|
||
Run `ALTER TYPE build_request_status_type ADD VALUE 'canceled';` to add the new type.
|
||
|
||
* init-database.sql: Added testgroup_hidden column to analysis_test_groups table and added 'canceled'
|
||
as a value to build_request_status_type table.
|
||
* public/api/test-groups.php:
|
||
(format_test_group): Added 'hidden' field in the JSON result.
|
||
* public/privileged-api/update-test-group.php:
|
||
(main): Added the support for updating testgroup_hidden column. When this column is set to true, also
|
||
cancel all pending build requests (by setting its request_status to 'canceled' which will be ignore by
|
||
the syncing script).
|
||
* public/v3/components/test-group-results-table.js:
|
||
(TestGroupResultsTable.prototype.setTestGroup): Reset _renderedTestGroup here so that the next call to
|
||
render() will update the table; e.g. when build requests' status change from 'Pending' to 'Canceled'.
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.prototype.hasCompleted): A build request is considered complete/finished if it's canceled.
|
||
(BuildRequest.prototype.hasPending): Added.
|
||
(BuildRequest.prototype.statusLabel): Handle 'canceled' status.
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup):
|
||
(TestGroup.prototype.updateSingleton): Added to update 'hidden' field.
|
||
(TestGroup.prototype.isHidden): Added.
|
||
(TestGroup.prototype.hasPending): Added.
|
||
(TestGroup.prototype.hasPending): Added.
|
||
(TestGroup.prototype.updateHiddenFlag): Added. Uses the privileged API to update testgroup_hidden column.
|
||
The JSON API also updates the status of the 'pending' build requests in the group to 'canceled'.
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage): Added _showHiddenTestGroups and _filteredTestGroups as instance variables.
|
||
(AnalysisTaskPage.prototype._didFetchTestGroups):
|
||
(AnalysisTaskPage.prototype._showAllTestGroups): Added.
|
||
(AnalysisTaskPage.prototype._didUpdateTestGroupHiddenState): Extracted from _didFetchTestGroups.
|
||
(AnalysisTaskPage.prototype._renderTestGroupList): Use the filtered list of test groups to show the list
|
||
of test groups. When all test groups are shown, we would first show the hidden ones after the regular ones.
|
||
(AnalysisTaskPage.prototype._createTestGroupListItem): Extracted from _renderTestGroupList.
|
||
(AnalysisTaskPage.prototype._renderTestGroupDetails): Update the text inside the button to hide the test
|
||
group. Also show a warning text that the pending requests will be canceled if there are any.
|
||
(AnalysisTaskPage.prototype._hideCurrentTestGroup): Added.
|
||
(AnalysisTaskPage.cssTemplate): Updated the style.
|
||
|
||
2016-02-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
The rows in the analysis results table should be expandable
|
||
https://bugs.webkit.org/show_bug.cgi?id=154427
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added "(Expand)" link between rows that have hidden points. Upon click it inserts the hidden rows.
|
||
|
||
We insert around five rows at a time when there are hundreds of hidden points but we also avoid leaving
|
||
behind expandable rows of less than two rows.
|
||
|
||
Also fixed a bug in CustomizableTestGroupForm that getElementsById would throw in the shipping Safari
|
||
because getElementsById doesn't exist on Element.prototype by using class name instead.
|
||
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer):
|
||
(AnalysisResultsViewer.prototype.setCurrentTestGroup): Removed superfluous call to render().
|
||
(AnalysisResultsViewer.prototype.setPoints): Always show the start and the end points.
|
||
(AnalysisResultsViewer.prototype.buildRowGroups):
|
||
(AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups): Add an instance of ExpandableRow which
|
||
shows a "(Expand)" link to show hidden rows here.
|
||
(AnalysisResultsViewer.prototype._expandBetween): Added. Expands rows between two points.
|
||
(AnalysisResultsViewer.cssTemplate): Added rules for "(Expand)" links.
|
||
(AnalysisResultsViewer.ExpandableRow): Added.
|
||
(AnalysisResultsViewer.ExpandableRow.prototype.resultContent): Added. Overrides what's in the results column.
|
||
(AnalysisResultsViewer.ExpandableRow.prototype.heading): Added. Generates "(Expand)" link.
|
||
|
||
* public/v3/components/customizable-test-group-form.js:
|
||
(CustomizableTestGroupForm.prototype._computeRootSetMap): Use getElementsByClassName instead of
|
||
getElementById.
|
||
(CustomizableTestGroupForm.prototype._classForLabelAndRepository): Renamed from _idForLabelAndRepository.
|
||
(CustomizableTestGroupForm._constructRevisionRadioButtons): Set class name instead of id.
|
||
|
||
* public/v3/components/results-table.js:
|
||
(ResultsTable.prototype.render): Don't generate radio buttons to select a row when root set is missing;
|
||
e.g. for rows that show "(Expand)" links.
|
||
|
||
2016-02-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Statistically significant A/B testing results should be color coded in details view
|
||
https://bugs.webkit.org/show_bug.cgi?id=154414
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Color code the statistically significant comparisions in TestGroupResultsTable as done in the analysis
|
||
results viewer.
|
||
|
||
* public/v3/components/customizable-test-group-form.js:
|
||
(CustomizableTestGroupForm.cssTemplate): Build fix after r196768.
|
||
* public/v3/components/test-group-results-table.js:
|
||
(TestGroupResultsTable.prototype.buildRowGroups): Add the status as a class name.
|
||
(TestGroupResultsTable.cssTemplate): Added styles to color-code statistically significant results.
|
||
|
||
2016-02-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v3 UI should allow custom revisions for A/B testing
|
||
https://bugs.webkit.org/show_bug.cgi?id=154379
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added the capability to customize revisions selected in the overview chart and the results viewer.
|
||
|
||
Newly added CustomizableTestGroupForm is responsible for allowing users to modify the set of revisions in
|
||
a new A/B testing group. Unlike TestGroupForm which doesn't know anything about which revisions are selected
|
||
for each project/repository, CustomizableTestGroupForm is aware of the list of revisions used in each set.
|
||
|
||
The list of revisions used in each set is represented by RootSet if users had not customized them, and
|
||
CustomRootSet otherwise; the latter was added since regular RootSet object requires CommitLog and other
|
||
DataModelObjects which are hard to create without corresponding database entries.
|
||
|
||
* public/v3/components/customizable-test-group-form.js: Added.
|
||
(CustomizableTestGroupForm): Added.
|
||
(CustomizableTestGroupForm.prototype.setRootSetMap): Added.
|
||
(CustomizableTestGroupForm.prototype._submitted): Overrides the superclass' method.
|
||
(CustomizableTestGroupForm.prototype._customize): Ditto. Unlike TestGroupForm's callback, this class'
|
||
callback passes in a root set map as the third argument.
|
||
(CustomizableTestGroupForm.prototype._computeRootSetMap): Added. Returns this._rootSetMap, which is set by
|
||
AnalysisTaskPage if user had not customized the root sets. Otherwise return a new map with CustomRootSet's.
|
||
(CustomizableTestGroupForm.prototype.render): Added. Creates a table to allow customization of root sets.
|
||
(CustomizableTestGroupForm._constructRevisionRadioButtons): Added.
|
||
(CustomizableTestGroupForm._createRadioButton): Added.
|
||
(CustomizableTestGroupForm.cssTemplate): Added.
|
||
(CustomizableTestGroupForm.formContent): Added. This method is called by TestGroupForm.htmlTemplate.
|
||
* public/v3/components/test-group-form.js:
|
||
(TestGroupForm): Updated the various methods to not directly mutate DOM. Store the state in instance
|
||
variables and update DOM in render() as done elsewhere.
|
||
(TestGroupForm.prototype.setNeedsName): Deleted. We no longer need this flag since TestGroupForm which is
|
||
used for retries never needs a name and CustomizableTestGroupForm which is used to create a new test group
|
||
always requires a name.
|
||
(TestGroupForm.prototype.setDisabled):
|
||
(TestGroupForm.prototype.setLabel):
|
||
(TestGroupForm.prototype.setRepetitionCount):
|
||
(TestGroupForm.prototype.render): Added.
|
||
(TestGroupForm.prototype._submitted): Moved the code to prevent the default action has been moved to the
|
||
constructor since this method is overridden by CustomizableTestGroupForm.
|
||
(TestGroupForm.cssTemplate): Added.
|
||
(TestGroupForm.htmlTemplate):
|
||
(TestGroupForm.formContent): Extracted from htmlTemplate.
|
||
* public/v3/index.html:
|
||
* public/v3/models/repository.js:
|
||
(Repository.sortByNamePreferringOnesWithURL): Added.
|
||
* public/v3/models/root-set.js:
|
||
(RootSet.prototype.revisionForRepository): Added so that _createTestGroupAfterVerifyingRootSetList can retrieve
|
||
the revision information from CustomRootSet without going through CommitLog objects since CustomRootSet doesn't
|
||
have associated CommitLog objects.
|
||
(CustomRootSet): Added. Used by CustomizableTestGroupForm to create a custom root map since regular RootSet
|
||
requires CommitLog and other related objects which are hard to create without database entries.
|
||
(CustomRootSet.prototype.setRevisionForRepository): Added.
|
||
(CustomRootSet.prototype.repositories): Added.
|
||
(CustomRootSet.prototype.revisionForRepository): Added.
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage):
|
||
(AnalysisTaskPage.prototype.render): Removed the reference to v2 UI since v3 UI is now strictly more powerful
|
||
than v2 UI. Also update the root set maps in each form here.
|
||
(AnalysisTaskPage.prototype._retryCurrentTestGroup): No longer takes unused name argument as it got removed
|
||
from TestGroupForm.
|
||
(AnalysisTaskPage.prototype._chartSelectionDidChange): No longer updates the disabled-ness here since it's now
|
||
done in render() via setRootSetMap().
|
||
(AnalysisTaskPage.prototype._createNewTestGroupFromChart): Now takes rootSetMap as an argument.
|
||
(AnalysisTaskPage.prototype._selectedRowInAnalysisResultsViewer): No longer updates the disabled-ness here
|
||
since it's now done in render() via setRootSetMap().
|
||
(AnalysisTaskPage.prototype._createNewTestGroupFromViewer): Now takes rootSetMap as an argument.
|
||
(AnalysisTaskPage.prototype._createTestGroupAfterVerifyingRootSetList): Take a dictionary of root set labels
|
||
such as A and B, which maps to a RootSet or a newly-added CustomRootSet.
|
||
(AnalysisTaskPage.htmlTemplate): Use customizable-test-group-form for creating a new A/B testing group. Retry
|
||
form will continue to use TestGroupForm since customizing revisions is non-sensical in retries.
|
||
(AnalysisTaskPage.cssTemplate): Updated the style.
|
||
|
||
2016-02-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v3 UI has the capability to schedule an A/B testing in a specific range
|
||
https://bugs.webkit.org/show_bug.cgi?id=154329
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Extended AnalysisTaskChartPane and ResultsTable so that users can select a range of points in either
|
||
the overview chart pane and the results viewer table. Extracted TestGroupForm out of the analysis task
|
||
page and used right below those two components in the analysis task page.
|
||
|
||
* public/v3/components/results-table.js:
|
||
(ResultsTable):
|
||
(ResultsTable.prototype.setRangeSelectorLabels): Added.
|
||
(ResultsTable.prototype.setRangeSelectorCallback): Added.
|
||
(ResultsTable.prototype.selectedRange): Added.
|
||
(ResultsTable.prototype._rangeSelectorClicked): Added.
|
||
(ResultsTable.prototype.render): Generate radio boxes to select a range.
|
||
|
||
* public/v3/components/test-group-form.js:
|
||
(TestGroupForm):
|
||
(TestGroupForm.prototype.setStartCallback): Added.
|
||
(TestGroupForm.prototype.setNeedsName): Added.
|
||
(TestGroupForm.prototype.setDisabled): Added.
|
||
(TestGroupForm.prototype.setLabel): Added.
|
||
(TestGroupForm.prototype.setRepetitionCount): Added.
|
||
(TestGroupForm.prototype._submitted): Added.
|
||
(TestGroupForm.htmlTemplate): Extracted from AnalysisTaskPage.htmlTemplate.
|
||
|
||
* public/v3/index.html:
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskChartPane.prototype._mainSelectionDidChange): Added. Delegates the work to AnalysisTaskPage.
|
||
(AnalysisTaskChartPane.prototype.selectedPoints): Added.
|
||
(AnalysisTaskPage):
|
||
(AnalysisTaskPage.prototype.title):
|
||
(AnalysisTaskPage.prototype.render):
|
||
(AnalysisTaskPage.prototype._renderTestGroupDetails): Use TestGroupForm's methods instead of mutating DOM.
|
||
(AnalysisTaskPage.prototype._retryCurrentTestGroup):
|
||
(AnalysisTaskPage.prototype._chartSelectionDidChange): Added.
|
||
(AnalysisTaskPage.prototype._createNewTestGroupFromChart): Added.
|
||
(AnalysisTaskPage.prototype._selectedRowInAnalysisResultsViewer): Added.
|
||
(AnalysisTaskPage.prototype._createNewTestGroupFromViewer): Added.
|
||
(AnalysisTaskPage.prototype._createRetryNameForTestGroup):
|
||
(AnalysisTaskPage.prototype._createTestGroupAfterVerifyingRootSetList): Extracted from _retryCurrentTestGroup
|
||
so that we can call it in _createNewTestGroupFromChart and _createNewTestGroupFromViewer.
|
||
(AnalysisTaskPage.htmlTemplate):
|
||
|
||
2016-02-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Extract the code specific to v2 UI out of shared statistics.js
|
||
https://bugs.webkit.org/show_bug.cgi?id=154277
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Extracted statistics-strategies.js out of statistics.js for v2 UI and detect-changes.js. The intent is to
|
||
deprecate this file once we implement refined statistics tools in v3 UI and adopt it in detect-changes.js.
|
||
|
||
* public/shared/statistics.js:
|
||
(Statistics.movingAverage): Extracted from the "Simple Moving Average" strategy.
|
||
(Statistics.cumultaiveMovingAverage): Extracted from the "Cumulative Moving Average" strategy.
|
||
(Statistics.exponentialMovingAverage): Extracted from the "Exponential Moving Average" strategy.
|
||
Use a temporary "movingAverage" to keep the last moving average instead of relying on the previous
|
||
entry in "averages" array to avoid special casing an array of length 1 and starting the loop at i = 1.
|
||
(Statistics.segmentTimeSeriesGreedyWithStudentsTTest): Extracted from "Segmentation: Recursive t-test"
|
||
strategy. Don't create the list of averages to match segmentTimeSeriesByMaximizingSchwarzCriterion here.
|
||
It's done in newly added averagesFromSegments.
|
||
(Statistics.segmentTimeSeriesByMaximizingSchwarzCriterion): Extracted from
|
||
"Segmentation: Schwarz criterion" strategy.
|
||
(.recursivelySplitIntoTwoSegmentsAtMaxTIfSignificantlyDifferent): Just store the start index to match
|
||
* public/v2/app.js:
|
||
(App.Pane.updateStatisticsTools):
|
||
(App.Pane._computeMovingAverageAndOutliers):
|
||
* public/v2/data.js:
|
||
* public/v2/index.html:
|
||
* public/v2/statistics-strategies.js: Added.
|
||
(StatisticsStrategies.MovingAverageStrategies): Added.
|
||
(averagesFromSegments): Extracted from "Segmentation: Schwarz criterion" strategy. Now used by both
|
||
"Segmentation: Recursive t-test" and "Segmentation: Schwarz criterion" strategies.
|
||
(StatisticsStrategies.EnvelopingStrategies): Moved from Statistics.EnvelopingStrategies.
|
||
(StatisticsStrategies.TestRangeSelectionStrategies): Moved from Statistics.TestRangeSelectionStrategies.
|
||
(createWesternElectricRule): Moved from statistics.js.
|
||
(countValuesOnSameSide): Ditto.
|
||
(StatisticsStrategies.executeStrategy): Moved from Statistics.executeStrategy.
|
||
* tools/detect-changes.js:
|
||
(computeRangesForTesting):
|
||
|
||
2016-02-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v1 UI and v2 UI should share statistics.js
|
||
https://bugs.webkit.org/show_bug.cgi?id=154262
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Share statistics.js between v1 and v2 UI.
|
||
|
||
* public/index.html:
|
||
* public/js/shared.js: Deleted.
|
||
* public/js/statistics.js: Removed.
|
||
* public/shared: Added.
|
||
* public/shared/statistics.js: Moved from Websites/perf.webkit.org/public/v2/js/statistics.js.
|
||
* public/v2/index.html:
|
||
* public/v2/js/statistics.js: Removed.
|
||
* public/v3/index.html:
|
||
* tools/detect-changes.js:
|
||
|
||
2016-02-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v3 UI sometimes shows same dates twice on the x-axis of time series charts
|
||
https://bugs.webkit.org/show_bug.cgi?id=154210
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bug was caused by the label generation code in TimeSeriesChart.computeTimeGrid never emitting hours.
|
||
|
||
Use hours instead of dates as labels when the current time's date is same as the previous label's date.
|
||
Always include dates before entering this mode to avoid just having hours as labels on the entire x-axis.
|
||
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart.prototype._renderXAxis): Slightly increase the "average" width of x-axis label.
|
||
(TimeSeriesChart.computeTimeGrid): See above. Also assert that the number of labels we generate never
|
||
exceeds maxLabels as a sanity check.
|
||
(TimeSeriesChart._timeIterators): Added an iterator that increments by two hours for zoomed graphs.
|
||
|
||
2016-02-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v3 UI should show status and associated bugs on analysis task pages
|
||
https://bugs.webkit.org/show_bug.cgi?id=154212
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added the capability to see and modify the status and the list of associated of bugs on analysis task pages.
|
||
|
||
Also added the list of related tasks, which are analysis tasks associated with the same bug or have
|
||
overlapping time ranges with the same test metric but on a potentially different platform.
|
||
|
||
In addition, categorize analysis tasks with the status of "no change" or "inconclusive" as "closed" as no
|
||
further action can be taken (users can bring them back to non-closed state without any restrictions).
|
||
|
||
* public/api/analysis-tasks.php:
|
||
(format_task): Categorize 'unchanged' and 'inconclusive' analysis tasks as closed.
|
||
|
||
* public/privileged-api/associate-bug.php:
|
||
(main): Added shouldDelete as a new mechanism to disassociate a bug since v3 UI shares a single Bug object
|
||
between multiple analysis tasks (as it should have been in the first place).
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase):
|
||
(ChartPaneBase.prototype._fetchAnalysisTasks): Since each analysis task's change type (status/result) could
|
||
change, we need to create annotation objects during each render() call.
|
||
(ChartPaneBase.prototype.render):
|
||
(ChartPaneBase.prototype._renderAnnotations): Extracted from ChartPaneBase.prototype._fetchAnalysisTasks to
|
||
do that. I was afraid of the perf impact of this but it doesn't seem to be an issue in my testing.
|
||
(ChartPaneBase.cssTemplate): Removed superfluous margins (moved to ChartPane.cssTemplate) around the charts
|
||
since they are only useful in the charts page.
|
||
|
||
* public/v3/models/analysis-task.js:
|
||
(AnalysisTask):
|
||
(AnalysisTask.prototype.updateSingleton): Added a comment as to why object.result cannot be renamed to
|
||
object.changeType in the JSON API.
|
||
(AnalysisTask.prototype.updateName): Added.
|
||
(AnalysisTask.prototype.updateChangeType): Added.
|
||
(AnalysisTask.prototype._updateRemoteState): Added.
|
||
(AnalysisTask.prototype.associateBug): Added.
|
||
(AnalysisTask.prototype.disassociateBug): Added.
|
||
(AnalysisTask.fetchRelatedTasks): Added. See above for the criteria of related-ness.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage):
|
||
(AnalysisTaskPage.prototype.updateFromSerializedState):
|
||
(AnalysisTaskPage.prototype._fetchRelatedInfoForTaskId): Extracted from updateFromSerializedState.
|
||
(AnalysisTaskPage.prototype._didFetchRelatedAnalysisTasks): Added.
|
||
(AnalysisTaskPage.prototype.render): Render the list of associated bugs, the list of bug trackers (so that
|
||
users can use it to associate with a new bug), and the list of related analysis tasks.
|
||
(AnalysisTaskPage.prototype._renderTestGroupList): Extracted from render since it was getting too long.
|
||
(AnalysisTaskPage.prototype._renderTestGroupDetails): Ditto.
|
||
(AnalysisTaskPage.prototype._updateChangeType): Added.
|
||
(AnalysisTaskPage.prototype._associateBug): Added.
|
||
(AnalysisTaskPage.prototype._disassociateBug): Added.
|
||
(AnalysisTaskPage.htmlTemplate): Added various elements to show and modify the status, associate bugs,
|
||
and a list of related analysis tasks.
|
||
(AnalysisTaskPage.cssTemplate): Added various styles for those form controls.
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane.cssTemplate): Moved the margins from ChartPaneBase.cssTemplate.
|
||
|
||
2016-02-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should allow renaming analysis tasks and test groups
|
||
https://bugs.webkit.org/show_bug.cgi?id=154200
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Allow editing names of analysis tasks and A/B testing groups in the v3 UI.
|
||
|
||
Added the support for updating the name to the privileged API at /privileged-api/update-analysis-task
|
||
and added a new prevailed API to update A/B testing groups at /privileged-api/update-test-group.
|
||
|
||
* public/privileged-api/update-analysis-task.php: Added the support for renaming the analysis task.
|
||
(main):
|
||
|
||
* public/privileged-api/update-test-group.php: Added. Supports updating the test group's name.
|
||
(main):
|
||
|
||
* public/v3/components/editable-text.js: Added.
|
||
(EditableText): Added. A new editable text label control. It looks like a text node with "(Edit)" link
|
||
at the end which allow users to go into the "editing mode", which reveals an input element.
|
||
The user can exit the editing mode by either moving the focus away from the control or clicking on
|
||
"(Save)" at the end. It calls _updateCallback in the latter case.
|
||
(EditableText.prototype.editedText): Returns the current value of the input element user.
|
||
(EditableText.prototype.setText): Sets the label. This does not live-update the input element until
|
||
the user exists the current editing mode and re-enters it.
|
||
(EditableText.prototype.setStartedEditingCallback): Sets a callback which gets called when the user
|
||
requested to enter the editing mode. Since EditableText relies on AnalysisTaskPage to render, this
|
||
callback only exits to call EditableText.render() in AnalysisTask._didStartEditingTaskName.
|
||
(EditableText.prototype.setUpdateCallback): Sets a callback which gets called when the user exits
|
||
the editing mode by activating the "(Save)" link. This callback MUST return a promise upon resolution
|
||
of which the control gets out of the editing mode. While the promise is in flight, the input element
|
||
becomes readonly.
|
||
(EditableText.prototype.render): Updates various states of the elements. When _updatingPromise is not
|
||
falsy, we make the input element readonly and show '(...)' on the link. Don't show the action link
|
||
if the label is empty (e.g. analysis task or test group is still being fetched).
|
||
(EditableText.prototype._didClick): Called when the user clicked on the action link. Enter the editing
|
||
mode or save the edited label via _updateCallback.
|
||
(EditableText.prototype._didBlur): Exit the editing mode without saving if the input element is not
|
||
focused, there is no inflight promise returned by _updateCallback, and the action link "(Save)" does
|
||
not have the focus.
|
||
(EditableText.prototype._didUpdate): Called when exiting the editing mode.
|
||
(EditableText.htmlTemplate):
|
||
(EditableText.cssTemplate):
|
||
|
||
* public/v3/index.html: Include newly added editable-text.js.
|
||
|
||
* public/v3/models/analysis-task.js:
|
||
(AnalysisTask.prototype.updateSingleton): Added.
|
||
(AnalysisTask.prototype.updateName): Added. Uses PrivilegedAPI to update the name and re-fetches
|
||
the analysis task from the sever.
|
||
(AnalysisTask._constructAnalysisTasksFromRawData): Use ensureSingleton instead of manually calling
|
||
findById since we need to update the name of the singleton object we found (via updateSingleton).
|
||
|
||
* public/v3/models/bug.js:
|
||
(Bug.ensureSingleton): Moved the code to compute the synthetic id from AnalysisTask's
|
||
_constructAnalysisTasksFromRawData.
|
||
(Bug.prototype.updateSingleton): Added. Just assert that nothing changes.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.prototype.updateSingleton): Added. Assert that the intrinsic values of a build request
|
||
doesn't change and update status text, status url, and build id as they could change.
|
||
|
||
* public/v3/models/commit-log.js:
|
||
(CommitLog): Made the constructor argument conform to the convention of id, object pair so that we can
|
||
use DataModelObject.ensureSingleton.
|
||
(CommitLog.ensureSingleton):
|
||
(CommitLog.prototype.updateSingleton): Extracted from CommitLog.ensureSingleton.
|
||
|
||
* public/v3/models/data-model.js:
|
||
(DataModelObject.ensureSingleton): Call newly added updateSingleton.
|
||
(DataModelObject.prototype.updateSingleton):
|
||
(LabeledObject): Removed the name map since it's never used (findByName is never called anywhere).
|
||
(LabeledObject.prototype.updateSingleton): Added. Updates _name.
|
||
(LabeledObject.findByName): Deleted.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.prototype.updateName): Added. Uses PrivilegedAPI to update the name and re-fetches
|
||
the test group from the sever.
|
||
(TestGroup._createModelsFromFetchedTestGroups): Removed bogus code. A root set doesn't have a test
|
||
group associated with it since multiple test groups can share a single root set (this property doesn't
|
||
even exist).
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage): Removed useless _taskId and added this._testGroupLabelMap and this._taskNameLabel.
|
||
(AnalysisTaskPage.prototype.updateFromSerializedState): Cleanup.
|
||
(AnalysisTaskPage.prototype._didFetchTask): Assert that this function is called exactly once.
|
||
(AnalysisTaskPage.prototype.render): Use this._task.id() to show the v2 link. Use EditableText to show
|
||
the names of the analysis task and the associated test groups. Hide the overview chart and the list of
|
||
test groups (along with the retry/confirm button) when the analysis task failed to fetch. We always
|
||
update the names of the analysis task and the associated test groups since they could be updated by
|
||
the server.
|
||
(AnalysisTaskPage.prototype._didStartEditingTaskName): Added.
|
||
(AnalysisTaskPage.prototype._updateTaskName): Added.
|
||
(AnalysisTaskPage.prototype._updateTestGroupName): Added.
|
||
(AnalysisTaskPage.htmlTemplate): Updated the style.
|
||
|
||
2016-02-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Land the change that was supposed to be the part of r196463.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype._didFetchTestGroups): Select the latest test group by default.
|
||
|
||
2016-02-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Refine v3 UI's analysis task page
|
||
https://bugs.webkit.org/show_bug.cgi?id=154152
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
This patch makes the following refinements to the analysis task page:
|
||
- Always show the relative different of in-progress A/B testing.
|
||
- Make the annotations (colored bars) in the chart open other analysis tasks.
|
||
- Order the A/B testing groups in the reverse chronological order.
|
||
- Select the time range corresponding to the current test group.
|
||
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer.cssTemplate): Fixed the bug that pending and running testing groups are no longer
|
||
colored after r196440. Use a slightly more opaque color for currently running groups compared to pending ones.
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
(ChartPaneBase.prototype.setMainSelection): Added.
|
||
(ChartPaneBase.prototype._openAnalysisTask): Moved the code from ChartPane._openAnalysisTask so that it can be
|
||
reused in both AnalysisTaskChartPane and ChartPane (in charts page).
|
||
(ChartPaneBase.prototype.router): Added. Overridden by each subclass.
|
||
|
||
* public/v3/components/test-group-results-table.js:
|
||
(TestGroupResultsTable.prototype.buildRowGroups): Always show the summary (relative difference of A to B) as
|
||
long as there are some results in each set.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.prototype.compareTestResults): Always set .label and .fullLabel with the relative change as long as
|
||
there are some values. Keep using "pending" and "running" in .status since that would determine the color of
|
||
stacking blocks representing those A/B testing groups.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskChartPane):
|
||
(AnalysisTaskChartPane.prototype.setPage): Added.
|
||
(AnalysisTaskChartPane.prototype.router): Added.
|
||
(AnalysisTaskPage):
|
||
(AnalysisTaskPage.prototype.render): Show the list of A/B testing groups in the reverse chronological order.
|
||
Also set the main chart's selection to the time range of the current test group.
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane.prototype.router): Added.
|
||
(ChartPane.prototype._openAnalysisTask): Moved to ChartPaneBase.prototype._openAnalysisTask.
|
||
|
||
2016-02-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add a script to process backlogs created while perf dashboard was in the maintenance mode
|
||
https://bugs.webkit.org/show_bug.cgi?id=154140
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added a script to process the backlog JSONs created while the perf dashboard was put in the maintenance mode.
|
||
It re-submits each JSON file to the perf dashboard using the same server config file used by syncing scripts.
|
||
|
||
* public/include/report-processor.php:
|
||
(TestRunsGenerator::test_value_list_to_values_by_iterations): Fixed a bug in the error message code. It was
|
||
referencing an undeclared variable.
|
||
* tools/process-maintenance-backlog.py: Added.
|
||
|
||
2016-02-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
AnalysisResultsViewer never uses this._smallerIsBetter
|
||
https://bugs.webkit.org/show_bug.cgi?id=154134
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Removed the unused instance variable _smallerIsBetter from AnalysisResultsViewer and TestGroupStackingBlock.
|
||
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer): Removed the unused _smallerIsBetter.
|
||
(AnalysisResultsViewer.prototype.setSmallerIsBetter): Deleted.
|
||
(AnalysisResultsViewer.prototype.buildRowGroups):
|
||
(AnalysisResultsViewer.TestGroupStackingBlock): Removed the unused _smallerIsBetter.
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.prototype._didFetchTask):
|
||
|
||
2016-02-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r196440.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.prototype.addBuildRequest): Clear the map instead of setting the property to null.
|
||
|
||
2016-02-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should have UI to retry A/B testing
|
||
https://bugs.webkit.org/show_bug.cgi?id=154090
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added a button to re-try an existing A/B testing group with a custom repetition count. The same button functions
|
||
as a way of confirming the progression/regression when there have been no A/B testing scheduled in the task.
|
||
|
||
Also fixed the bug that A/B testing groups that have been waiting for other test groups will be shown as "running".
|
||
|
||
* public/v3/components/results-table.js:
|
||
(ResultsTable.cssTemplate): Don't pad the list of extra repositories when it's empty.
|
||
|
||
* public/v3/components/test-group-results-table.js:
|
||
(TestGroupResultsTable.prototype.buildRowGroups): Use TestGroup.labelForRootSet instead of manually
|
||
computing the letter for each configuration set.
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.prototype.hasStarted): Added.
|
||
|
||
* public/v3/models/data-model.js:
|
||
(DataModelObject.ensureSingleton): Added.
|
||
(DataModelObject.cachedFetch): Added noCache option. This is used when re-fetching the test groups after
|
||
creating one.
|
||
|
||
* public/v3/models/measurement-cluster.js:
|
||
(MeasurementCluster.prototype.startTime): Added.
|
||
|
||
* public/v3/models/measurement-set.js:
|
||
(MeasurementSet.prototype.hasFetchedRange): Added. Returns true only if there are no "holes" (cluster
|
||
yet to be fetched) between the specified time range. This was added to fix a bug in AnalysisTaskPage's
|
||
_didFetchMeasurement.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup): Added this._rootSetToLabel.
|
||
(TestGroup.prototype.addBuildRequest): Reset this._rootSetToLabel along with this._requestedRootSets.
|
||
(TestGroup.prototype.repetitionCount): Added. Returns the number of iterations executed per set. We assume that
|
||
every root set in the test group shares a single repetition count.
|
||
(TestGroup.prototype.requestedRootSets): Now populates this._rootSetToLabel for labelForRootSet.
|
||
(TestGroup.prototype.labelForRootSet): Added.
|
||
(TestGroup.prototype.hasStarted): Added.
|
||
(TestGroup.prototype.compareTestResults): Use 'running' and 'pending' to differentiate test groups that are waiting
|
||
for other groups to finish running from the ones that are actually running ('incomplete' before this patch).
|
||
(TestGroup.fetchByTask):
|
||
(TestGroup.createAndRefetchTestGroups): Added. Creates a new test group using the privileged-api/create-test-group
|
||
and fetches the list of test groups for the specified analysis task.
|
||
(TestGroup._createModelsFromFetchedTestGroups): Extracted from TestGroup.fetchByTask.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage): Initialize _renderedCurrentTestGroup to undefined so that we'd always can differentiate
|
||
the initial call to AnalysisTaskPage.render and subsequent calls in which it's identical to _currentTestGroup.
|
||
(AnalysisTaskPage.prototype._didFetchMeasurement): Fixed a bug that we don't exit early even when some
|
||
clusters in between startPoint and endPoint are still being fetched via newly added hasFetchedRange.
|
||
(AnalysisTaskPage.prototype.render): Update the default repetition count based on the current test group.
|
||
Also update the label of the button to "Confirm the change" if there is no A/B testing in this task.
|
||
(AnalysisTaskPage.prototype._retryCurrentTestGroup): Added. Re-triggers an existing A/B testing group or creates
|
||
the A/B testing for the entire range of the analysis task.
|
||
(AnalysisTaskPage.prototype._hasDuplicateTestGroupName): Added.
|
||
(AnalysisTaskPage.prototype._createRetryNameForTestGroup): Added.
|
||
(AnalysisTaskPage.htmlTemplate): Added form controls to re-trigger A/B testing.
|
||
(AnalysisTaskPage.cssTemplate): Updated the style.
|
||
|
||
2016-02-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Removed the duplicated definition of ChartPaneBase.
|
||
|
||
* public/v3/components/chart-pane-base.js:
|
||
|
||
2016-02-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Analysis task page on v3 UI should show charts
|
||
https://bugs.webkit.org/show_bug.cgi?id=154057
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Extracted ChartPaneBase out of ChartPane and added an instance of its new subclass, AnalysisTaskChartPane,
|
||
to the analysis task page. The main difference is that ChartPaneBase doesn't depend on the presence of
|
||
this._chartsPage unlike ChartPane. It also doesn't have the header with toolbar (to show breakdown, etc...).
|
||
|
||
* public/v3/components/base.js:
|
||
(ComponentBase.prototype._constructShadowTree): Call htmlTemplate() and cssTemplate() with the right "this".
|
||
|
||
* public/v3/components/chart-pane-base.js: Added.
|
||
(ChartPaneBase): Extracted from ChartPane.
|
||
(ChartPaneBase.prototype.configure): Extracted from the constructor. Separating this function allows the
|
||
component to be instantiated inside a HTML template.
|
||
(ChartPaneBase.prototype._fetchAnalysisTasks): Moved from ChartPane._fetchAnalysisTasks.
|
||
(ChartPaneBase.prototype.platformId): Ditto.
|
||
(ChartPaneBase.prototype.metricId): Ditto.
|
||
(ChartPaneBase.prototype.setOverviewDomain): Ditto.
|
||
(ChartPaneBase.prototype.setMainDomain): Ditto.
|
||
(ChartPaneBase.prototype._overviewSelectionDidChange): Extracted from the constructor. This is overridden in
|
||
ChartPane and unused in AnalysisTaskChartPane.
|
||
(ChartPaneBase.prototype._mainSelectionDidChange): Extracted from ChartPane._mainSelectionDidChange.
|
||
(ChartPaneBase.prototype._mainSelectionDidZoom): Extracted from ChartPane._mainSelectionDidZoom.
|
||
(ChartPaneBase.prototype._indicatorDidChange): Extracted from ChartPane._indicatorDidChange.
|
||
(ChartPaneBase.prototype._didFetchData): Moved from ChartPane._fetchAnalysisTasks.
|
||
(ChartPaneBase.prototype._openAnalysisTask): Ditto.
|
||
(ChartPaneBase.prototype._openCommitViewer): Ditto. Also fixed a bug that we don't show the spinner while
|
||
waiting for the data to be fetched by calling this.render() here.
|
||
(ChartPaneBase.prototype._keyup): Moved from ChartPane._keyup. Also fixed the bug that the revisions list
|
||
doesn't update by calling this.render() here.
|
||
(ChartPaneBase.prototype.render): Extracted from ChartPane.render.
|
||
(ChartPaneBase.htmlTemplate): Extracted from ChartPane.htmlTemplate.
|
||
(ChartPaneBase.paneHeaderTemplate): Added. This is overridden in ChartPane and unused in AnalysisTaskChartPane.
|
||
(ChartPaneBase.cssTemplate): Extracted from ChartPane.htmlTemplate.
|
||
|
||
* public/v3/components/chart-styles.js: Renamed from public/v3/pages/page-with-charts.js.
|
||
(PageWithCharts): Renamed from PageWithCharts since it no longer extends PageWithHeading.
|
||
(ChartStyles.createChartSourceList):
|
||
|
||
* public/v3/components/commit-log-viewer.js:
|
||
(CommitLogViewer.prototype.view): Set this._repository right away instead of waiting for the fetched data
|
||
so that spinner will be shown while the data is being fetched.
|
||
|
||
* public/v3/index.html:
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskChartPane): Added extends ChartPaneBase.
|
||
(AnalysisTaskPage): Added. this._chartPane.
|
||
(AnalysisTaskPage.prototype._didFetchTask): Initialize this._chartPane with a domain.
|
||
(AnalysisTaskPage.prototype.render): Render this._chartPane.
|
||
(AnalysisTaskPage.htmlTemplate):
|
||
|
||
* public/v3/pages/chart-pane-status-view.js:
|
||
(ChartPaneStatusView): Removed the unused router from the argument list.
|
||
(ChartPaneStatusView.prototype.pointsRangeForAnalysis): Renamed from analyzeData() since it was ambiguous.
|
||
(ChartPaneStatusView.prototype.moveRepositoryWithNotification): Fixed the bug that we don't update the list
|
||
of the revisions here.
|
||
(ChartPaneStatusView.prototype.computeChartStatusLabels):
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane): Now extends ChartPaneBase.
|
||
(ChartPane.prototype._overviewSelectionDidChange): Extracted from the constructor.
|
||
(ChartPane.prototype._mainSelectionDidChange):
|
||
(ChartPane.prototype._mainSelectionDidZoom):
|
||
(ChartPane.prototype._indicatorDidChange):
|
||
(ChartPane.prototype.render):
|
||
(ChartPane.prototype._renderActionToolbar):
|
||
(ChartPane.paneHeaderTemplate): Extracted from htmlTemplate.
|
||
(ChartPane.cssTemplate):
|
||
(ChartPane.overviewOptions.selection.onchange): Deleted.
|
||
(ChartPane.prototype._fetchAnalysisTasks): Deleted.
|
||
(ChartPane.prototype.platformId): Deleted.
|
||
(ChartPane.prototype.metricId): Deleted.
|
||
(ChartPane.prototype.setOverviewDomain): Deleted.
|
||
(ChartPane.prototype.setMainDomain): Deleted.
|
||
(ChartPane.prototype._openCommitViewer): Deleted.
|
||
(ChartPane.prototype._didFetchData): Deleted.
|
||
(ChartPane.prototype._keyup): Deleted.
|
||
|
||
* public/v3/pages/charts-page.js:
|
||
(ChartsPage):
|
||
(ChartsPage.createDomainForAnalysisTask): Extracted by createDomainForAnalysisTask; used to set the domain
|
||
of the charts in the analysis task page.
|
||
(ChartsPage.createStateForAnalysisTask):
|
||
|
||
* public/v3/pages/dashboard-page.js:
|
||
(DashboardPage):
|
||
(DashboardPage.prototype._createChartForCell):
|
||
|
||
2016-02-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add the support for maintenance mode
|
||
https://bugs.webkit.org/show_bug.cgi?id=154072
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added the crude support for maintenance mode whereby which the reports are stored in the filesystem
|
||
instead of the database.
|
||
|
||
* config.json: Added maintenanceMode and maintenanceDirectory as well as forgotten siteTitle and
|
||
remoteServer.httpdMutexDir.
|
||
* public/api/report.php:
|
||
(main): Don't connect to the database or modify database when maintenanceMode is set.
|
||
* public/include/json-header.php:
|
||
(ensure_privileged_api_data): Exit with InMaintenanceMode when maintenanceMode is set. This prevents
|
||
privileged API such as creating analysis tasks and new A/B testing groups from modifying the database.
|
||
|
||
2016-02-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Analysis task page on v3 show progression as regressions
|
||
https://bugs.webkit.org/show_bug.cgi?id=154045
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bug was caused by TestGroup.compareTestResults referring to undefined _smallerIsBetter.
|
||
Retrieve it from the associated metric object via the owner analysis task.
|
||
|
||
* public/v3/models/test-group.js:
|
||
|
||
2016-02-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Testing with remote server cache is unusably slow
|
||
https://bugs.webkit.org/show_bug.cgi?id=153928
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Don't use the single process mode of httpd as it's way too slow even for testing.
|
||
Also we'll hit a null pointer crash (http://svn.apache.org/viewvc?view=revision&revision=1711479)
|
||
|
||
Since httpd exits immediately when launched in multi-process mode, remote-cache-server.py (renamed from
|
||
run-with-remote-server.py) now has "start" and "stop" commands to start/stop the Apache. Also added
|
||
"reset" command to reset the cache for convenience.
|
||
|
||
* Install.md: Updated the instruction.
|
||
* config.json: Fixed a typo: httpdErro*r*Log.
|
||
* tools/remote-cache-server.py: Copied from Websites/perf.webkit.org/tools/run-with-remote-server.py.
|
||
Now takes one of the following commands: "start", "stop", and "reset".
|
||
(main):
|
||
(start_httpd): Extracted from main.
|
||
(stop_httpd): Added.
|
||
* tools/remote-server-relay.conf: Removed redundant (duplicate) LoadModule's.
|
||
* tools/run-with-remote-server.py: Removed.
|
||
|
||
2016-02-04 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should have a script to setup database
|
||
https://bugs.webkit.org/show_bug.cgi?id=153906
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added tools/setup-database.py to setup the database. It retrieves the database name, username, password
|
||
and initializes a database at the specified location.
|
||
|
||
* Install.md: Updated instruction to setup postgres to use setup-database.py.
|
||
* tools/setup-database.py: Added.
|
||
(main):
|
||
(load_database_config):
|
||
(determine_psql_dir):
|
||
(start_or_stop_database):
|
||
(execute_psql_command):
|
||
|
||
2016-01-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
buildbot syncing scripts sometimes schedule more than one requests per builder
|
||
https://bugs.webkit.org/show_bug.cgi?id=153047
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bug was caused by the check for singularity of scheduledRequests being conducted per configuration
|
||
instead of per builder. So if there were multiple test configurations (e.g. Speedometer and Octane) that
|
||
both used the same builder, then we may end up scheduling both at once.
|
||
|
||
Fixed the bug by sharing a single set to keep track of the scheduled requests for all configurations per
|
||
builder.
|
||
|
||
* tools/sync-with-buildbot.py:
|
||
(load_config): Share a set amongst test configurations for each builder.
|
||
(find_request_updates): Instead of creating a new set for each configuration, reuse the existing sets to
|
||
share a single set agmonst test configurations for each builder.
|
||
|
||
2016-01-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Analysis results viewer sometimes doesn't show the correct relative difference
|
||
https://bugs.webkit.org/show_bug.cgi?id=152930
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bug was caused by single A/B testing result associated with multiple rows when there are multiple data
|
||
points with the same root set which matches that of an A/B testing.
|
||
|
||
Fixed the bug by detecting such a case, and only associating each A/B testing result with the row created
|
||
for the first matching point.
|
||
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups):
|
||
|
||
2016-01-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make v3 UI analysis task page is hard to understand
|
||
https://bugs.webkit.org/show_bug.cgi?id=152917
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Add a dark gray border around the selected block in the analysis results viewer instead of using darker
|
||
shades since that looks as if they were bigger regression/progression.
|
||
|
||
Explicitly show "Failed" as the label instead of omitting with "-" when all build requests in an A/B
|
||
testing group fails.
|
||
|
||
* public/v3/components/analysis-results-viewer.js:
|
||
(AnalysisResultsViewer.cssTemplate): Tweaked the style to underline text in the hovered blocks and the
|
||
selected blocks and show a dark gray border around the selected blocks.
|
||
(AnalysisResultsViewer.TestGroupStackingBlock):
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype.createStackingCell): Use this._title for title.
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype._valuesForRootSet): Deleted.
|
||
|
||
* public/v3/components/results-table.js:
|
||
(ResultsTable.prototype.render):
|
||
(ResultsTable.prototype._createRevisionListCells): Extracted from ResultsTable.prototype.render.
|
||
(ResultsTable.cssTemplate): Tweaked the style.
|
||
(ResultsTableRow):
|
||
(ResultsTableRow.prototype.constructor): Added _labelForWholeRow to store the label for the entire row.
|
||
This is used to show the comparison result of two root sets (e.g. A vs B).
|
||
(ResultsTableRow.prototype.setLabelForWholeRow): Added.
|
||
(ResultsTableRow.prototype.labelForWholeRow): Added.
|
||
(ResultsTableRow.prototype.resultContent): Extracted from buildHeading. Creates a hyperlinked bar graph
|
||
used for each A/B testing result.
|
||
(ResultsTableRow.prototype.buildHeading): Deleted since we need to set colspan on the second table cell
|
||
when we're creating a row with _labelForWholeRow.
|
||
|
||
* public/v3/components/test-group-results-table.js:
|
||
(TestGroupResultsTable.prototype.buildRowGroups): Added rows to show relative differences and statistical
|
||
significance between root sets (e.g. A vs B).
|
||
|
||
* public/v3/models/build-request.js:
|
||
(BuildRequest.prototype.hasCompleted): Added.
|
||
|
||
* public/v3/models/test-group.js:
|
||
(TestGroup.prototype.compareTestResults): Extracted from AnalysisResultsViewer.TestGroupStackingBlock's
|
||
_computeTestGroupStatus and generalized to be reused in TestGroupResultsTable.
|
||
(TestGroup.prototype._valuesForRootSet): Moved from AnalysisResultsViewer.TestGroupStackingBlock.
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage.cssTemplate): Tweaked the style.
|
||
|
||
2016-01-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should automatically add aggregators
|
||
https://bugs.webkit.org/show_bug.cgi?id=152818
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
When an aggregator entry is missing in aggregators table, automatically insert it in /api/report.
|
||
|
||
In a very early version of the perf dashboard, we had the ability to define a custom aggregator
|
||
in an admin page. In practice, nobody used or needed this feature so we got rid of it even before
|
||
the dashboard was landed into WebKit repository. This patch cleans up that mess.
|
||
|
||
* run-tests.js:
|
||
(main): Added the filtering capability.
|
||
(TestEnvironment): Expose the config JSON in the test environment.
|
||
|
||
* public/include/report-processor.php:
|
||
(ReportProcessor): Renamed name_to_aggregator now that it only contains ID.
|
||
(ReportProcessor::__construct): No longer fetches the aggregator table. An equivalent work is done
|
||
in newly added ensure_aggregators.
|
||
(ReportProcessor::process): Calls ensure_aggregators which populates name_to_aggregator_id.
|
||
(ReportProcessor::ensure_aggregators): Added. Add the builtin aggregators: Arithmetic, Geometric,
|
||
Harmonic, and Total.
|
||
(TestRunsGenerator): Renamed name_to_aggregator now that it only contains ID.
|
||
(TestRunsGenerator::__construct):
|
||
(TestRunsGenerator::add_aggregated_metric): Don't include aggregator_definition here since it's
|
||
never used now that all the aggregations are done natively in PHP.
|
||
(TestRunsGenerator::$aggregators): Added. We don't include SquareSum since it's only used for
|
||
computing run_square_sum_cache in test_runs table and it's useless elsewhere.
|
||
(TestRunsGenerator::aggregate_values): Add a comment about that.
|
||
|
||
* tests/api-report.js: Updated a test case to reflect the change.
|
||
|
||
2016-01-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard JSON API should fail gracefully when postgres is down
|
||
https://bugs.webkit.org/show_bug.cgi?id=152812
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Even though all JSON APIs returned DatabaseConnectionFailure as the status when Database::connect
|
||
returned a falsy value, PHP was spitting out warnings and producing HTTP responses that cannot be
|
||
parsed as a JSON when pg_connect failed.
|
||
|
||
Fixed the bug by suppressing warning messages in pg_connect.
|
||
|
||
* public/include/db.php:
|
||
(Database::connect): Use '@' prefix to suppress warning messages.
|
||
|
||
2016-01-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should auto-generate manifest file when one is missing
|
||
https://bugs.webkit.org/show_bug.cgi?id=152813
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
When /data/manifest.json is missing, fall back to newly added /api/manifest instead of
|
||
silently failing to show the UI. This will make the initial setup easier.
|
||
|
||
* public/api/manifest.php: Added.
|
||
(main):
|
||
* public/include/manifest.php:
|
||
(Manifest::manifest): Added.
|
||
* public/v3/main.js:
|
||
(fetchManifest):
|
||
(didFetchManifest): Extracted from fetchManifest.
|
||
|
||
2016-01-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Commit another forgotten change, this time, for r194653.
|
||
|
||
* public/v3/models/measurement-set.js:
|
||
|
||
2016-01-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
The sampling of time series on v3 UI is too aggressive
|
||
https://bugs.webkit.org/show_bug.cgi?id=152804
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Fixed a bug that we were always halving the number of data points in _sampleTimeSeries
|
||
and increased the number of data points allowed to make the sampling less aggressive.
|
||
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart.prototype._ensureSampledTimeSeries): Increase the number of maximum points
|
||
to 2x the number of pixels divided by the radius of each point.
|
||
(TimeSeriesChart.prototype._sampleTimeSeries.findMedian): Changed the semantics of endIndex
|
||
to mean the index after the last point and renamed it to indexAfterEnd.
|
||
(TimeSeriesChart.prototype._sampleTimeSeries): Fixed a bug that this code always coerced two
|
||
data points into one sampled data point despite of the fact i and j are sufficiently apart
|
||
since data[j].time - data[i].time > timePerSample by definition.
|
||
|
||
2016-01-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Commit the forgotten change for r194651.
|
||
|
||
* public/v3/pages/domain-control-toolbar.js:
|
||
(DomainControlToolbar.prototype.setStartTime):
|
||
|
||
2016-01-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
The right hand side of main chart appears to be cut off as you zoom out on v3 UI
|
||
https://bugs.webkit.org/show_bug.cgi?id=152778
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Add a padding on x-axis after the end time to make the main chart more easily interactive.
|
||
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart.prototype._computeHorizontalRenderingMetrics):
|
||
|
||
* public/v3/pages/page-with-charts.js:
|
||
(PageWithCharts.mainChartOptions): Add a padding of 5px at the end of x-axis.
|
||
|
||
2016-01-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v3 UI should use four sig-figs to label y-axis of the main charts
|
||
https://bugs.webkit.org/show_bug.cgi?id=152779
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Increase the number of significant figures used in the main charts to four as done in v2 UI.
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane.constructor): Create a formatter with four significant figures.
|
||
* public/v3/pages/page-with-charts.js:
|
||
(PageWithCharts.mainChartOptions): Increase the width of y-axis labels.
|
||
|
||
2016-01-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v3 UI's time range slider is harder to use than that of v2 UI
|
||
https://bugs.webkit.org/show_bug.cgi?id=152780
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
Improved the time range slider by using a cubic mapping to time range and providing a text field
|
||
to directly edit the number of days to show.
|
||
|
||
Now an user can enter the text mode to directly edit the number of days to show by clicking on
|
||
the number of days (text field is always there with opacity=0).
|
||
|
||
* public/v3/pages/charts-toolbar.js:
|
||
(ChartsToolbar): Store the minimum and maximum number of days allowed. Also rename _inputElement
|
||
to _slider and added a new type=number text field as _editor.
|
||
(ChartsToolbar.prototype.render):
|
||
(ChartsToolbar.prototype.setStartTime): Exit the text mode when the number of days is changed by
|
||
an URL state transition (i.e. back/forward navigation).
|
||
(ChartsToolbar.prototype._setInputElementValue): Added. Updates the values of _slider and _editor.
|
||
(ChartsToolbar.prototype._enterTextMode): Added. Hide the elements used by the slider mode and
|
||
show the text field.
|
||
(ChartsToolbar.prototype._exitTextMode): Added. Does the opposite.
|
||
(ChartsToolbar.prototype._sliderValueMayHaveChanged): Renamed from _inputValueMayHaveChanged.
|
||
(ChartsToolbar.prototype._editorValueMayHaveChanged): Added. Similar to _sliderValueMayHaveChanged
|
||
but also corrects the value of _editor if needed.
|
||
(ChartsToolbar.prototype._callNumberOfDaysCallback): Extracted from _inputValueMayHaveChanged.
|
||
Also fixed a bug that we didn't update the URL state when the change event was fired without
|
||
modifying the effective number of days.
|
||
(ChartsToolbar.cssTemplate): Tweaked the style to support the new mode. Also set a fixed width on
|
||
the span showing the number of days in the slider mode.
|
||
|
||
2016-01-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Zooming button is broken on v3 UI
|
||
https://bugs.webkit.org/show_bug.cgi?id=152777
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Bring up the zoom button in z-index so that users can click it.
|
||
|
||
* public/v3/components/interactive-time-series-chart.js:
|
||
(InteractiveTimeSeriesChart.cssTemplate):
|
||
|
||
2016-01-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v3 UI doesn't preserve the time range when charts page is opened from a dashboard
|
||
https://bugs.webkit.org/show_bug.cgi?id=152776
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Fixed the bug by moving the construction of charts URL from DashboardPage.prototype.open to
|
||
DashboardPage.prototype.render and re-rendering the entire page upon an URL state transition.
|
||
|
||
* public/v3/pages/charts-page.js:
|
||
(ChartsPage.createStateForDashboardItem): Takes the start time for the charts page.
|
||
|
||
* public/v3/pages/dashboard-page.js:
|
||
(DashboardPage.prototype.updateFromSerializedState): Merged _numberOfDaysDidChange and
|
||
_updateChartsDomainFromToolbar into this function since they're not used elsewhere. Also re-render
|
||
the entire page when transition between different number of days to show.
|
||
(DashboardPage.prototype._numberOfDaysDidChange): Deleted.
|
||
(DashboardPage.prototype._updateChartsDomainFromToolbar): Deleted.
|
||
(DashboardPage.prototype.render): Construct URL for each charts here.
|
||
(DashboardPage.prototype._createChartForCell): Don't construct URL here since this function is
|
||
called once when the dashboard page is opened, and not when the time range is changed.
|
||
|
||
2016-01-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix for an old version of PHP after r194618.
|
||
|
||
* public/api/measurement-set.php:
|
||
|
||
2016-01-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
A/B testing results should be visualized intuitively on v3 UI
|
||
https://bugs.webkit.org/show_bug.cgi?id=152496
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Add the "stacking block" view of A/B testing results to the analysis task page on v3 UI.
|
||
|
||
The patch enhances JSON APIs at /api/analysis-task /api/measurement-set/ to reduce the number of
|
||
HTTP requests, and adds two UI components: TestGroupResultsTable and AnalysisResultsViewer both
|
||
of which inherits from an abstract superclass: ResultsTable.
|
||
|
||
ResultsTable provides a tabular presentation of measured values in regular measurement sets and
|
||
A/B testing results using groups of bar graphs created by BarGraphGroup. TestGroupResultsTable
|
||
inherits from this class to display A/B testing configurations and the averaged results for each
|
||
configuration, and AnalysisResultsViewer inherits from it to provide an intuitive visualization
|
||
of the outcomes of all A/B testing results associated with a given analysis task.
|
||
|
||
* public/api/analysis-tasks.php:
|
||
(main): Add the capability to find the analysis task based on its build request.
|
||
This allows /v3/#/analysis/task/?buildRequest=<id> to be hyperlinked on buildbot page.
|
||
|
||
* public/api/measurement-set.php:
|
||
(main): Removed the unused startTime and endTime, and added "analysisTask" to query parameters.
|
||
(AnalysisResultsFetcher): Added. Used to fetch measured data associated with every build request
|
||
on an analysis task.
|
||
(AnalysisResultsFetcher::__construct):
|
||
(AnalysisResultsFetcher::fetch): Unlike MeasurementSetFetcher, we fetch the list of commits and
|
||
list of measurements separately since there will be a lot less builds and commits than measured
|
||
data (since we're fetching measured values for all tests and their metrics).
|
||
(AnalysisResultsFetcher::fetch_commits): Fetches commits.
|
||
(AnalysisResultsFetcher::format_measurement): Like MeasurementSetFetcher::format_measurement but
|
||
with config_type and config_metric since we're returning measured data for all metrics and test
|
||
configurations.
|
||
(AnalysisResultsFetcher::format_map): Similar to MeasurementSetFetcher::format_map.
|
||
|
||
* public/v3/components/analysis-results-viewer.js: Added.
|
||
(AnalysisResultsViewer): Added.
|
||
(AnalysisResultsViewer.prototype.didUpdateResults): This callback is called by AnalysisTaskPage
|
||
when A/B testing results become available.
|
||
(AnalysisResultsViewer.prototype.render): Overrides ResultsTable's render to highlight the block
|
||
representing the currently selected test group.
|
||
|
||
(AnalysisResultsViewer.prototype.buildRowGroups): Creates a list of rows with "stacking blocks"
|
||
that visualizes A/B testing results. The algorithm works as follows: 1. Create all table rows.
|
||
2. Find which row is associated with each set in each test group. 3. Layout "blocks".
|
||
|
||
(AnalysisResultsViewer.prototype._collectRootSetsInTestGroups): Collects root sets from all data
|
||
in the measurement set as well as A/B testing **requests** (results may contain more repositories
|
||
than requested but they aren't interesting for the purpose of visualizing results for the entire
|
||
analysis task).
|
||
|
||
(AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups): Create table rows. First,
|
||
create table rows for measurement set points that have a matching test group (i.e. either set A
|
||
or set B of an A/B testing uses the same root set as a point). Second, insert a new row for each
|
||
root set in each test group which didn't find a matching measurement set point. There is a little
|
||
subtlety that some A/B testing may specify revisions for a subset of repositories and/or some A/B
|
||
testing results may appear as if it goes back in time with respect to other A/B testing results.
|
||
For example, consider creating two A/B test groups for WebKit changes and OS changes separately.
|
||
There could be no coherent linearization of those two A/B testing in which both WebKit and OS
|
||
versions move forward.
|
||
|
||
(AnalysisResultsViewer.RootSetInTestGroup): Added. Represents a pair (test group, root set) since
|
||
a root set could be shared by multiple test groups.
|
||
(AnalysisResultsViewer.TestGroupStackingBlock): Added. A stacked block representing a test group.
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype.addRowIndex): Associates a row number with
|
||
either set A or set B.
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype.createStackingCell): Creates a table cell
|
||
for this block.
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype.isThin): Returns true if this test group
|
||
has failed and this block should look "thin" without any label.
|
||
(AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus): Computes the
|
||
status for this test group.
|
||
|
||
(AnalysisResultsViewer.TestGroupStackingGrid): Added. AnalysisResultsViewer uses this class to
|
||
layout blocks representing test groups.
|
||
(AnalysisResultsViewer.TestGroupStackingGrid.prototype.insertBlockToColumn): Inserts a new block
|
||
to layout. We keep all test groups doing the same A/B test next to each other.
|
||
(AnalysisResultsViewer.TestGroupStackingGrid.prototype.layout): Layouts each block / test group
|
||
in the order they are created.
|
||
(AnalysisResultsViewer.TestGroupStackingGrid.prototype._layoutBlock): Places the block in the
|
||
left-most column that can accommodate it while avoiding columns of a different thin-ness. A column
|
||
is thin if its A/B testing has failed, and not thin otherwise.
|
||
(AnalysisResultsViewer.TestGroupStackingGrid.prototype.createCellsForRow): Creates table cells for
|
||
a given row. For each column, generate a table cell if we're in the first row and the first block
|
||
starts in a later row, a block starts in the current row, or the last block ended in the previous
|
||
row and the next block or the last row appears later.
|
||
|
||
* public/v3/components/bar-graph-group.js: Added. A component for showing a group of bar graphs.
|
||
(BarGraphGroup): Added. Creates a group of bar graphs with the same value range. It's used by
|
||
AnalysisResultsViewer and ResultsTable to show bar graphs to compare values.
|
||
(SingleBarGraph): A component created and collectively controlled by BarGraphGroup.
|
||
|
||
* public/v3/components/results-table.js: Added.
|
||
(ResultsTable): An abstract superclass for TestGroupResultsTable and AnalysisResultsViewer.
|
||
|
||
(ResultsTable.prototype.render): Renders the table. 1. Call "buildRowGroups()" implemented by
|
||
a subclass to obtain the list of rows. 2. Compute the list of repositories to show. 3. For each
|
||
cell in the table, compute the number of rows to show the same value (for rowspan). 4. Render the
|
||
table with an extra list of repositories if exists.
|
||
|
||
(ResultsTable.prototype._computeRepositoryList): Compute the list of repositories to list
|
||
revisions in the table. Omit repositories not present in any row or for which all rows have the
|
||
same revision. In the latter case, include it in the extra repositories listed below the table.
|
||
This minimizes the amount of redundant information presented to the user.
|
||
|
||
(ResultsTableRow): Added. Represents a single row in the table. ResultsTable constructs necessary
|
||
table cells to tabulate the associated root sets, and shows the associated result using a grouped
|
||
bar graph. Additional columns are used by AnalysisResultsViewer to show stacked blocks for A/B
|
||
testing groups.
|
||
|
||
* public/v3/components/test-group-results-table.js: Added.
|
||
(TestGroupResultsTable):
|
||
(TestGroupResultsTable.prototype.didUpdateResults):
|
||
(TestGroupResultsTable.prototype.setTestGroup):
|
||
(TestGroupResultsTable.prototype.heading):
|
||
(TestGroupResultsTable.prototype.render):
|
||
(TestGroupResultsTable.prototype.buildRowGroups):
|
||
|
||
* public/v3/index.html:
|
||
* public/v3/models/analysis-results.js: Added.
|
||
(AnalysisResults): Added. Like MeasurementSet, this class represents a set of measured values
|
||
associated with a given analysis task.
|
||
(AnalysisResults.prototype.find): Returns a measured valued for a given build and metric.
|
||
(AnalysisResults.prototype.add): Adds a new measured value. Used by AnalysisResults.fetch.
|
||
(AnalysisResults.fetch): Fetches data and creates AnalysisResults for a given analysis task.
|
||
|
||
* public/v3/models/analysis-task.js:
|
||
(AnalysisTask.prototype.startMeasurementId): Added.
|
||
(AnalysisTask.prototype.endMeasurementId): Added.
|
||
(AnalysisTask.fetchByBuildRequestId): Added.
|
||
(AnalysisTask._fetchSubset): Uses DataModelObject.cachedFetch.
|
||
|
||
* public/v3/models/build-request.js: Added.
|
||
(BuildRequest): Added. Represents a single A/B testing request associated with a test group.
|
||
|
||
* public/v3/models/builder.js:
|
||
(Build): Added. Represents a build associated with a given A/B testing result.
|
||
|
||
* public/v3/models/commit-log.js:
|
||
(CommitLog): Made this class inherit from DataModelObject.
|
||
(CommitLog.ensureSingleton): Added. Finds the singleton object created for a given revision
|
||
in the specified repository. This helps RootSet and other classes compare commits fast.
|
||
(CommitLog.prototype.repository): Added.
|
||
(CommitLog.fetchBetweenRevisions): Uses CommitLog.ensureSingleton.
|
||
|
||
* public/v3/models/data-model.js:
|
||
(DataModelObject):
|
||
(DataModelObject.namedStaticMap): Added.
|
||
(DataModelObject.ensureNamedStaticMap): Renamed from namedStaticMap instead of implicitly
|
||
assuming that the non-static version always creates the map.
|
||
(DataModelObject.prototype.namedStaticMap): Added.
|
||
(DataModelObject.cachedFetch): Extracted from AnalysisTask._fetchSubset so that TestGroup's
|
||
fetchByTask could also use it.
|
||
(LabeledObject):
|
||
|
||
* public/v3/models/measurement-adaptor.js: Added.
|
||
(MeasurementAdaptor): Extracted from MeasurementCluster. This class is responsible for
|
||
re-formatting the data received via /api/measurement-set JSON API inside the v3 UI.
|
||
(MeasurementAdaptor.prototype.extractId): Added.
|
||
(MeasurementAdaptor.prototype.adoptToAnalysisResults): Added. Used by AnalysisResults.
|
||
(MeasurementAdaptor.aggregateAnalysisResults): Added. Used by TestGroupResultsTable to
|
||
aggregate results for each test configuration; e.g. computing the average for set A.
|
||
(MeasurementAdaptor.prototype.adoptToSeries): Extracted from MeasurementCluster.addToSeries.
|
||
Added rootSet() to each point. This allows AnalysisResultsViewer to compare them against root
|
||
sets associated with A/B testing results.
|
||
(MeasurementAdaptor.computeConfidenceInterval): Moved from MeasurementCluster.
|
||
|
||
* public/v3/models/measurement-cluster.js:
|
||
(MeasurementCluster):
|
||
(MeasurementCluster.prototype.addToSeries):
|
||
|
||
* public/v3/models/repository.js:
|
||
(Repository.prototype.hasUrlForRevision): Added.
|
||
|
||
* public/v3/models/root-set.js: Added.
|
||
(RootSet): Added. Represents a set of commits in measured results.
|
||
(MeasurementRootSet): Added. Ditto for results associated with A/B testing.
|
||
|
||
* public/v3/models/test-group.js: Added.
|
||
(TestGroup): Added. Represents a A/B testing on analysis task.
|
||
(TestGroup.prototype.createdAt): Added.
|
||
(TestGroup.prototype.buildRequests): Returns the list of build requests associated with this
|
||
A/B testing.
|
||
(TestGroup.prototype.addBuildRequest): Added. Used by BuildRequest's constructor to associate
|
||
itself with this group.
|
||
(TestGroup.prototype.didSetResult): Added. Called by BuildRequest.setResult when measured
|
||
values are fetched and associated with a build request in this group.
|
||
|
||
* public/v3/models/test.js:
|
||
(Test):
|
||
|
||
* public/v3/pages/analysis-task-page.js:
|
||
(AnalysisTaskPage):
|
||
(AnalysisTaskPage.prototype.updateFromSerializedState): Fetch the analysis task, test groups
|
||
associated with it, and all A/B testing results based on the task id or the build request id
|
||
specified in the URL.
|
||
(AnalysisTaskPage.prototype._didFetchTask): Added. Start fetching the measured data. This is
|
||
the data on charts page for which this analysis task was created, not results of A/B testing.
|
||
(AnalysisTaskPage.prototype._didFetchMeasurement): Added. Display the fetched data in a table
|
||
inside AnalysisResultsViewer.
|
||
(AnalysisTaskPage.prototype._didFetchTestGroups): Added. Display the list of A/B test groups
|
||
as well as the results of the first A/B testing.
|
||
(AnalysisTaskPage.prototype._didFetchAnalysisResults): Added.
|
||
(AnalysisTaskPage.prototype._assignTestResultsIfPossible): Added. Once both the analysis task,
|
||
A/B test groups as well as their results are fetched, update build requests in each test group
|
||
with their results.
|
||
(AnalysisTaskPage.prototype.render): Show the list of test groups and highlight the currently
|
||
selected one.
|
||
(AnalysisTaskPage.prototype._showTestGroup): Added. A callback used by AnalysisResultsViewer
|
||
and TestGroupResultsTable to notify this class when the user selects a new test group.
|
||
(AnalysisTaskPage.htmlTemplate): Updated the template.
|
||
(AnalysisTaskPage.cssTemplate): Ditto.
|
||
|
||
* public/v3/pages/charts-page.js:
|
||
(ChartsPage.createStateForAnalysisTask): Added. Creates a URL state object for opening a chart
|
||
associated with an analysis task.
|
||
|
||
2015-12-22 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Analysis task page is slow to load
|
||
https://bugs.webkit.org/show_bug.cgi?id=152517
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
The slowness comes from r194130 which made the JSON API at /api/analysis-tasks to report the start
|
||
and the end of each analysis task. This query was adding ~2s to the total JSON generation time.
|
||
|
||
Cache these values on analysis_task table since they never change once an analysis task is created.
|
||
|
||
* init-database.sql: Added columns task_start_run_time and task_end_run_time to analysis_task table.
|
||
Also added the missing drop statements at the top.
|
||
|
||
* public/api/analysis-tasks.php:
|
||
(fetch_and_push_bugs_to_tasks): Don't fetch the latest commit time of the start and the end.
|
||
(format_task): Report task_start_run_time and task_end_run_time as startRunTime and endRunTime.
|
||
|
||
* public/privileged-api/create-analysis-task.php:
|
||
(main): Set start_run_time and end_run_time when creating an analysis task.
|
||
(time_for_run): Added.
|
||
|
||
2015-12-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v3 UI shouldn't open/close pane selector by mouseenter/leave
|
||
https://bugs.webkit.org/show_bug.cgi?id=152399
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Removed the code to open and close the pane selector by mouseenter and mouseleave
|
||
since multiple people have complained about the behavior.
|
||
|
||
* public/v3/pages/charts-toolbar.js:
|
||
(ChartsToolbar): Removed the event listeners.
|
||
(ChartsToolbar.prototype._addPane): Don't close the pane selector when adding a new pane
|
||
to better support the use case of adding multiple panes.
|
||
(ChartsToolbar.cssTemplate): Tweaked CSS.
|
||
|
||
2015-12-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Popover for analysis tasks shows up at the left edge of annotation bars in the v3 UI
|
||
https://bugs.webkit.org/show_bug.cgi?id=152389
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Compute the x coordinate of the popover from the center of each annotation bar.
|
||
|
||
Also adjust the x coordinate to keep the popover within the charts.
|
||
|
||
* public/v3/components/interactive-time-series-chart.js:
|
||
(InteractiveTimeSeriesChart.prototype._renderChartContent):
|
||
|
||
2015-12-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Dashboard charts should have uniform widths on v3 UI
|
||
https://bugs.webkit.org/show_bug.cgi?id=152395
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Fix the bug by applying table-layout: fixed on the dashboard table.
|
||
|
||
* public/v3/pages/dashboard-page.js:
|
||
(DashboardPage.prototype.render): Added header-column as a class name to explicitly set the header column with.
|
||
(DashboardPage.cssTemplate): Adjusted CSS accordingly.
|
||
|
||
2015-12-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Closing a pane on v3 UI always closes the last pane
|
||
https://bugs.webkit.org/show_bug.cgi?id=152388
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bug was caused by closePane being called without arguments. (The first argument to bind is "this" value.)
|
||
Fixed it by passing in "this" pane object to the first argument.
|
||
|
||
* public/v3/pages/chart-pane.js:
|
||
(ChartPane):
|
||
|
||
2015-12-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf Dashboard v3 UI doesn't show recent data points on v2 UI
|
||
https://bugs.webkit.org/show_bug.cgi?id=152368
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bug was caused by the last modified date in measurement set JSON being a string instead of a POSIX timestamp,
|
||
which prevented the v3 UI from invalidating the cache. Specifically, the following boolean logic always evaluated
|
||
to false because +data['lastModified'] was NaN in MeasurementSet.prototype._fetch (/v3/models/measurement-set.js):
|
||
|
||
!clusterEndTime && useCache && +data['lastModified'] < self._lastModified
|
||
|
||
Fixed the bug by calling Database::to_js_time on the last modified date fetched from the database.
|
||
|
||
* public/api/measurement-set.php:
|
||
(MeasurementSetFetcher::fetch_config_list): Convert the string returned by the database to a POSIX timestamp.
|
||
* tests/api-measurement-set.js: Added a test to ensure the last modified date in JSON is numeric. Since the value
|
||
of the last modified date depends on when tests run, we can't assert it to be a certain value.
|
||
|
||
2015-12-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v3 UI should show and link the build number on charts page
|
||
https://bugs.webkit.org/show_bug.cgi?id=152359
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Show the hyperlinked build number in the v3 UI.
|
||
|
||
* public/v3/models/builder.js:
|
||
(Builder): Renamed _buildURL to _buildUrlTemplate.
|
||
(Builder.prototype.urlForBuild): Added.
|
||
* public/v3/pages/chart-pane-status-view.js:
|
||
(ChartPaneStatusView):
|
||
(ChartPaneStatusView.prototype.render): Added the code to render hyperlinked build number when one is available.
|
||
(ChartPaneStatusView.prototype.computeChartStatusLabels): Store currentPoint's measurement object as _buildInfo
|
||
if the current point is set by an indicator (not by a selection).
|
||
|
||
2015-12-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v3 dashboard doesn't stretch charts to fill the screen
|
||
https://bugs.webkit.org/show_bug.cgi?id=152354
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bug was caused by a workaround to avoid canvas stretching table cell too much.
|
||
|
||
Fix the problem instead by making the canvas absolutely positioned inside the "time-series-chart" element
|
||
so that it does not contribute to the intrinsic/natural width of the cell.
|
||
|
||
* public/v3/components/time-series-chart.js:
|
||
(TimeSeriesChart.prototype._ensureCanvas): Make the canvas absolutely positioned inside the shadow root.
|
||
(TimeSeriesChart.prototype._updateCanvasSizeIfClientSizeChanged): Use the container element's size now that
|
||
the canvas does not resize with it.
|
||
* public/v3/pages/dashboard-page.js:
|
||
(DashboardPage.cssTemplate): Updated the CSS so that the chart stretches all the way.
|
||
|
||
2015-12-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
The chart status on v3 UI sometimes show wrong revision ranges
|
||
https://bugs.webkit.org/show_bug.cgi?id=152331
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bug was caused by the status view not taking the data sampling that happens in TimeSeriesChart into account
|
||
when finding the previous point. Take this into account by using InteractiveTimeSeries.currentPoint(-1) which
|
||
finds the sampled data point immediately preceding the current point (at which the indicator is shown).
|
||
|
||
* public/v3/components/chart-status-view.js:
|
||
(ChartStatusView.prototype.updateStatusIfNeeded):
|
||
|
||
2015-12-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard's cycler page should use v3 UI
|
||
https://bugs.webkit.org/show_bug.cgi?id=152324
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Use the v3 UI in cycler.html after r194130.
|
||
|
||
* public/cycler.html:
|
||
* public/v3/index.html: Removed the reference to a non-existent platform-selector.js.
|
||
|
||
2015-12-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add v3 UI to perf dashboard
|
||
https://bugs.webkit.org/show_bug.cgi?id=152311
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Add the third iteration of the perf dashboard UI. UI for viewing and modifying analysis tasks is coming soon.
|
||
The v3 UI is focused on speed, and removes all third-party script dependencies including jQuery, d3, and Ember.
|
||
Both the DOM-based UI and graphing are implemented manually.
|
||
|
||
|
||
The entire app is structured using new component library implemented in components/base.js. Each component is
|
||
an instance of a subclass of ComponentBase which owns a single DOM element. Each subclass may supply static
|
||
methods named htmlTemplate and cssTemplate as the template for a component instance. ComponentBase automatically
|
||
clones the templates inside the associated element (or its shadow root on the supported browsers). Each subclass
|
||
must supply a method called "render()" which constructs and updates the DOM as needed.
|
||
|
||
There is a special component called Page, which represents an entire page. Each Page is opened by PageRouter's
|
||
"route()" function. Each subclass of Page supplies "open()" for initialization and "updateFromSerializedState()"
|
||
for a hash URL transition.
|
||
|
||
|
||
The key feature of the v3 UI is the split of time series into chunks called clusters (see r194120). On an internal
|
||
instance of the dashboard, the v2 UI downloads 27MB of data whereas the same page loads only 3MB of data in the v3.
|
||
The key logic for fetching time series in chunks is implemented by MeasurementSet in /v3/models/measurement-set.js.
|
||
We first fetch the cached primary cluster (the cluster that contains the newest data) at:
|
||
/data/measurement-set-<platform-id>-<metric-id>.json
|
||
|
||
If that's outdated according to lastModified in manifest.json, then we immediately re-fetch the primary cluster at:
|
||
/api/measurement-set/?platform=<platform-id>&metric=<metric-id>
|
||
|
||
Once the up-to-date primary cluster is fetched, we fetch all "secondary" clusters. For each cluster being fetched,
|
||
including the primary, we invoke registered callbacks.
|
||
|
||
|
||
In addition, the v3 UI reduces the initial page load time by loading a single bundled JS file generated by
|
||
tools/bundle-v3-scripts.py. index.html has a fallback to load all 44 JS files individually during development.
|
||
|
||
* public/api/analysis-tasks.php:
|
||
(fetch_and_push_bugs_to_tasks): Added the code to fetch start and end run times. This is necessary in V3 UI
|
||
because no longer fetch the entire time series. See r194120 for the new measurement set JSON API.
|
||
(format_task): Compute the category of an analysis task based on "result" value. This will be re-vamped once
|
||
I add the UI for the analysis task page in v3.
|
||
|
||
* public/include/json-header.php:
|
||
(require_format): CamelCase the name.
|
||
(require_match_one_of_values): Ditto.
|
||
(validate_arguments): Renamed from require_existence_of and used in measurement-set.php landed in r194120.
|
||
|
||
* public/v3: Added.
|
||
* public/v3/components: Added.
|
||
|
||
* public/v3/components/base.js: Added.
|
||
(ComponentBase): The base component class.
|
||
(ComponentBase.prototype.element): Returns the DOM element associated with the DOM element.
|
||
(ComponentBase.prototype.content): Returns the shadow root if one exists and the associated element otherwise.
|
||
(ComponentBase.prototype.render): To be implemented by a subclass.
|
||
(ComponentBase.prototype.renderReplace): A helper function to "render" DOM contents.
|
||
(ComponentBase.prototype._constructShadowTree): Called inside the constructor to instantiate the templates.
|
||
(ComponentBase.prototype._recursivelyReplaceUnknownElementsByComponents): Instantiates components referred by
|
||
its element name inside the instantiated content.
|
||
(ComponentBase.isElementInViewport): A helper function. Returns true if the element is in the viewport and it has
|
||
non-zero width and height.
|
||
(ComponentBase.defineElement): Defines a custom element that can be automatically instantiated from htmlTemplate.
|
||
(ComponentBase.createElement): A helper function to create DOM tree to be used in "render()" method.
|
||
(ComponentBase._addContentToElement): A helper for "createElement".
|
||
(ComponentBase.createLink): A helper function to create a hyperlink or another clickable element (via callback).
|
||
(ComponentBase.createActionHandler): A helper function to create an event listener that prevents the default action
|
||
and stops the event propagation.
|
||
|
||
* public/v3/components/button-base.js: Added.
|
||
|
||
* public/v3/components/chart-status-view.js: Added.
|
||
(ChartStatusView): A component that reports the current status of time-series-chart. It's subclasses by
|
||
ChartPaneStatusView to provide additional information in the charts page's panes.
|
||
|
||
* public/v3/components/close-button.js: Added.
|
||
(CloseButton):
|
||
* public/v3/components/commit-log-viewer.js: Added.
|
||
(CommitLogViewer): A component that lists commit revisions along with commit messages for a range of data points.
|
||
|
||
* public/v3/components/interactive-time-series-chart.js: Added.
|
||
(InteractiveTimeSeriesChart): A subclass of InteractiveTimeSeriesChart with interactivity (selection & indicator).
|
||
Selection and indicator are mutually exclusive.
|
||
|
||
* public/v3/components/pane-selector.js: Added.
|
||
(PaneSelector): A component for selecting (platform, metric) pair to add in the charts page.
|
||
|
||
* public/v3/components/spinner-icon.js: Added.
|
||
|
||
* public/v3/components/time-series-chart.js: Added.
|
||
(TimeSeriesChart): A canvas-based chart component without interactivity. It takes a source list and options as
|
||
the constructor arguments. A source list is a list of measurement sets (measurement-set.js) with drawing options.
|
||
This component fetches data via MeasurementSet.fetchBetween inside TimeSeriesChart.prototype.setDomain and
|
||
progressively updates the charts as more data arrives. The canvas is updated on animation frame via rAF and all
|
||
layout and rendering metrics are lazily computed in _layout. In addition, this component samples data before
|
||
rendering the chart when there are more data points per pixel in _ensureSampledTimeSeries.
|
||
|
||
* public/v3/index.html: Added. Loads bundled-scripts.js if it exists, or individual script files otherwise.
|
||
|
||
* public/v3/instrumentation.js: Added. This class is used to gather runtime statistics of v3 UI. (It measures
|
||
the performance of the perf dashboard UI).
|
||
|
||
* public/v3/main.js: Added. Bootstraps the app.
|
||
(main):
|
||
(fetchManifest):
|
||
|
||
* public/v3/models: Added.
|
||
* public/v3/models/analysis-task.js: Added.
|
||
* public/v3/models/bug-tracker.js: Added.
|
||
* public/v3/models/bug.js: Added.
|
||
* public/v3/models/builder.js: Added.
|
||
* public/v3/models/commit-log.js: Added.
|
||
* public/v3/models/data-model.js: Added.
|
||
(DataModelObject): The base class for various data objects that correspond to database tables. It supplies static
|
||
hash map to find entries by id as well as other keys.
|
||
(LabeledObject): A subclass of DataModelObject with the capability to find an object via its name.
|
||
|
||
* public/v3/models/measurement-cluster.js: Added.
|
||
(MeasurementCluster): Represents a single cluster or a chunk of data in a measurement set.
|
||
|
||
* public/v3/models/measurement-set.js: Added.
|
||
(MeasurementSet): Represents a measurement set.
|
||
(MeasurementSet.findSet): Returns the singleton set given (metric, platform). We use singleton to avoid issuing
|
||
multiple HTTP requests for the same JSON when there are multiple TimeSeriesChart that show the same graph (e.g. on
|
||
charts page with overview and main charts).
|
||
(MeasurementSet.prototype.findClusters): Finds the list of clusters to fetch in a given time range.
|
||
(MeasurementSet.prototype.fetchBetween): Fetch clusters for a given time range and calls callback whenever new data
|
||
arrives. The number of callbacks depends on the how many clusters need to be newly fetched.
|
||
(MeasurementSet.prototype._fetchSecondaryClusters): Fetches non-primary (non-latest) clusters.
|
||
(MeasurementSet.prototype._fetch): Issues a HTTP request to fetch a cluster.
|
||
(MeasurementSet.prototype._didFetchJSON): Called when a cluster is fetched.
|
||
(MeasurementSet.prototype._failedToFetchJSON): Called when the fetching of a cluster has failed.
|
||
(MeasurementSet.prototype._invokeCallbacks): Invokes callbacks upon an approval of a new cluster.
|
||
(MeasurementSet.prototype._addFetchedCluster): Adds the newly fetched cluster in the order.
|
||
(MeasurementSet.prototype.fetchedTimeSeries): Returns a time series that contains data from all clusters that have
|
||
been fetched.
|
||
(TimeSeries.prototype.findById): Additions to TimeSeries defined in /v2/data.js.
|
||
(TimeSeries.prototype.dataBetweenPoints): Ditto.
|
||
(TimeSeries.prototype.firstPoint): Ditto.
|
||
|
||
* public/v3/models/metric.js: Added.
|
||
* public/v3/models/platform.js: Added.
|
||
* public/v3/models/repository.js: Added.
|
||
* public/v3/models/test.js: Added.
|
||
|
||
* public/v3/pages: Added.
|
||
* public/v3/pages/analysis-category-page.js: Added. The "Analysis" page that lists the analysis tasks.
|
||
* public/v3/pages/analysis-category-toolbar.js: Added. The toolbar to filter analysis tasks based on its category
|
||
(unconfirmed, bisecting, identified, closed) and a keyword.
|
||
|
||
* public/v3/pages/analysis-task-page.js: Added. Not implemented yet. It just has the hyperlink to the v2 UI.
|
||
|
||
* public/v3/pages/chart-pane-status-view.js: Added.
|
||
(ChartPaneStatusView): A subclass of ChartStatusView used in the charts page. In addition to the current value,
|
||
comparison to baseline/target, it shows the list of repository revisions (e.g. WebKit revision, OS version).
|
||
|
||
* public/v3/pages/chart-pane.js: Added.
|
||
(ChartPane): A component a pane in the charts page. Each pane has the overview chart and the main chart. The zooming
|
||
is synced across all panes in the charts page.
|
||
|
||
* public/v3/pages/charts-page.js: Added. Charts page.
|
||
* public/v3/pages/charts-toolbar.js: Added. The toolbar to set the number of days to show. This affects the overview
|
||
chart's domain in each pane.
|
||
|
||
* public/v3/pages/create-analysis-task-page.js: Added.
|
||
(CreateAnalysisTaskPage): A page that gets shown momentarily while creating a new analysis task.
|
||
|
||
* public/v3/pages/dashboard-page.js: Added. A dashboard page.
|
||
* public/v3/pages/dashboard-toolbar.js: Added. Its toolbar with buttons to select the number of days to show.
|
||
* public/v3/pages/domain-control-toolbar.js: Added. An abstract superclass of charts and dashboard toolbars.
|
||
|
||
* public/v3/pages/heading.js: Added. A component for displaying the header and toolbar, if exists, on each page.
|
||
* public/v3/pages/page-router.js: Added. This class is responsible for updating the URL hashes as well as opening
|
||
and updating each page when the hash changes (via back/forward navigation).
|
||
* public/v3/pages/page-with-charts.js: Added. An abstract subclass of page used by dashboards and charts page.
|
||
Supplies helper functions for creating TimeSeriesChart options.
|
||
* public/v3/pages/page-with-heading.js: Added. An abstract subclass of page that uses the heading component.
|
||
* public/v3/pages/page.js: Added. The Page component.
|
||
* public/v3/pages/toolbar.js: Added. An abstract toolbar component.
|
||
|
||
* public/v3/remote.js: Added.
|
||
(getJSON): Fetches JSON from the remote server.
|
||
(getJSONWithStatus): Ditto. Rejects the response if the status is not "OK".
|
||
(PrivilegedAPI.sendRequest): Posts a HTTP request to a privileged API in /privileged-api/.
|
||
(PrivilegedAPI.requestCSRFToken): Creates a new CSRF token to request a privileged API post.
|
||
|
||
* tools/bundle-v3-scripts.py: Added.
|
||
(main): Bundles js files together and minifies them by jsmin.py for the v3 UI. Without this script, we're forced to
|
||
download 44 JS files or making each JS file contain multiple classes.
|
||
|
||
* tools/jsmin.py: Copied from WebInspector / JavaScriptCore code.
|
||
|
||
2015-12-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix v2 UI after r194093.
|
||
|
||
* public/v2/data.js:
|
||
|
||
2015-12-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add /api/measurement-set for v3 UI
|
||
https://bugs.webkit.org/show_bug.cgi?id=152312
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
The new API JSON allows the front end to fetch measured data in chunks called a "cluster" as specified
|
||
in config.json for each measurement set specified by the pair of a platform and a metric.
|
||
|
||
When the front end needs measured data in a given time range (t_0, t_1) for a measurement set, it first
|
||
fetches the primary cluster by /api/measurement-set/?platform=<platform-id>&metric=<metric-id>.
|
||
The primary cluster is the last cluster in the set (returning the first cluster here is not useful
|
||
since we don't typically show very old data), and provides the information needed to fetch other clusters.
|
||
|
||
Fetching the primary cluster also creates JSON files at:
|
||
/data/measurement-set-<platform-id>-<metric-id>-<cluster-end-time>.json
|
||
to allow latency free access for secondary clusters. The front end code can also fetch the cache of
|
||
the primary cluster at: /data/measurement-set-<platform-id>-<metric-id>.json.
|
||
|
||
Because the front end code has to behave as if all data is fetched, each cluster contains one data point
|
||
immediately before the first data point and one immediately after the last data point. This avoids having
|
||
to fetch multiple empty clusters for manually specified baseline data. To support this behavior, we generate
|
||
all clusters for a given measurement set at once when the primary cluster is requested.
|
||
|
||
Furthermore, all measurement sets are divided at the same time into clusters so that the boundary of clusters
|
||
won't shift as more data are reported to the server.
|
||
|
||
* config.json: Added clusterStart and clusterSize as options.
|
||
* public/api/measurement-set.php: Added.
|
||
(main):
|
||
(MeasurementSetFetcher::__construct):
|
||
(MeasurementSetFetcher::fetch_config_list): Finds configurations that belongs to this (platform, metric) pair.
|
||
(MeasurementSetFetcher::at_end): Returns true if we've reached the end of all clusters for this set.
|
||
(MeasurementSetFetcher::fetch_next_cluster): Generates the JSON data for the next cluster. We generate clusters
|
||
in increasing chronological order (the oldest first and the newest last).
|
||
(MeasurementSetFetcher::execute_query): Executes the main query.
|
||
(MeasurementSetFetcher::format_map): Returns the mapping of a measurement field to an array index. This removes
|
||
the need to have key names for each measurement and reduces the JSON size by ~10%.
|
||
(MeasurementSetFetcher::format_run): Creates an array that contains data for a single measurement. The order
|
||
matches that of keys in format_map.
|
||
(MeasurementSetFetcher::parse_revisions_array): Added. Copied from runs.php.
|
||
* tests/api-measurement-set.js: Added. Added tests for /api/measurement-set.
|
||
|
||
2015-12-14 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Using fake timestamp in OS version make some results invisible
|
||
https://bugs.webkit.org/show_bug.cgi?id=152289
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
Fix various bugs after r194088.
|
||
|
||
* public/api/commits.php:
|
||
(format_commit): Include the commit order.
|
||
* public/v2/data.js:
|
||
(CommitLogs._cacheConsecutiveCommits): Sort by commit order when commit time is missing.
|
||
* tools/pull-os-versions.py:
|
||
(OSBuildFetcher._assign_order): Use integer instead of fake time for commit order.
|
||
(available_builds_from_command): Exit early when an exception is thrown.
|
||
|
||
2015-12-14 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix a typo in the previous commit.
|
||
|
||
* public/include/report-processor.php:
|
||
|
||
2015-12-14 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r192965. Suppress a warning about log being referred to as a closure variable.
|
||
|
||
* public/include/report-processor.php:
|
||
|
||
2015-12-14 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Using fake timestamp in OS version make some results invisible
|
||
https://bugs.webkit.org/show_bug.cgi?id=152289
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
Added commit_order column to explicitly order OS versions. This fixes the bug whereby which
|
||
baseline results reported with only OS versions are shown with x coordinate set to 10 years ago.
|
||
|
||
To migrate the existing database, run:
|
||
ALTER TABLE commits ADD COLUMN commit_order integer;
|
||
CREATE INDEX commit_order_index ON commits(commit_order);
|
||
|
||
Then for each repository $1,
|
||
UPDATE commits SET (commit_time, commit_order) = (NULL, CAST(EXTRACT(epoch from commit_time) as integer))
|
||
WHERE commit_repository = $1;
|
||
|
||
|
||
* init-database.sql: Added the column.
|
||
* public/api/commits.php:
|
||
(fetch_commits_between): Use commit_order to order commits when commit_time is missing.
|
||
* public/api/report-commits.php:
|
||
(main): Set commit_order.
|
||
* tools/pull-os-versions.py:
|
||
(OSBuildFetcher.fetch_and_report_new_builds):
|
||
(OSBuildFetcher._assign_order): Renamed from _assign_fake_timestamps. Set the order instead of a fake timestmap.
|
||
|
||
2015-12-14 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard can't merge when the destination platform is missing baseline/target
|
||
https://bugs.webkit.org/show_bug.cgi?id=152286
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
The bug was caused by the query to migrate test configurations to new platform checking
|
||
configuration type and metric separately; that is, it assumes the configuration exists
|
||
only if either the same type or the same metric exists in the destination.
|
||
|
||
Fixed the bug by checking both conditions simultaneously for each configuration.
|
||
|
||
* public/admin/platforms.php:
|
||
* tests/admin-platforms.js: Added a test.
|
||
|
||
2015-12-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard's buildbot sync config JSON duplicates too much information
|
||
https://bugs.webkit.org/show_bug.cgi?id=152196
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
Added shared, per-builder, and per-test (called type) configurations.
|
||
|
||
* tools/sync-with-buildbot.py:
|
||
(load_config):
|
||
(load_config.merge):
|
||
|
||
2015-12-02 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should avoid overflow during geometric mean computation
|
||
https://bugs.webkit.org/show_bug.cgi?id=151773
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
* public/include/report-processor.php:
|
||
|
||
2015-11-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should extend baseline and target to the future
|
||
https://bugs.webkit.org/show_bug.cgi?id=151511
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
* public/v2/data.js:
|
||
(RunsData.prototype.timeSeriesByCommitTime): Added extendToFuture as an argument.
|
||
(RunsData.prototype.timeSeriesByBuildTime): Ditto.
|
||
(RunsData.prototype._timeSeriesByTimeInternal): Ditto.
|
||
(TimeSeries): Add a new point to the end if extendToFuture is set and the series is not empty.
|
||
* public/v2/manifest.js:
|
||
(App.Manifest._formatFetchedData): Set extendToFuture to true for baselines and targets.
|
||
|
||
2015-11-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should always show comparison to baseline and target even if one is missing
|
||
https://bugs.webkit.org/show_bug.cgi?id=151510
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Show the comparison status against the baseline when baseline is present but target is missing.
|
||
|
||
To make the code more readable, this patch splits the logic into three cases:
|
||
1. Both baseline and target are present
|
||
2. Only baseline is present
|
||
3. Only target is present
|
||
|
||
Also extracted a helper function to construct the label.
|
||
|
||
* public/v2/app.js:
|
||
(.labelForDiff): Added.
|
||
(App.Pane.computeStatus):
|
||
|
||
2015-11-23 Commit Queue <commit-queue@webkit.org>
|
||
|
||
Unreviewed, rolling out r192716 and r192717.
|
||
https://bugs.webkit.org/show_bug.cgi?id=151582
|
||
|
||
The patch was incorrect. We always need at least one data
|
||
point in each configuration (Requested by rniwa on #webkit).
|
||
|
||
Reverted changesets:
|
||
|
||
"Perf dashboard's should not include results more than 366
|
||
days old in JSON"
|
||
https://bugs.webkit.org/show_bug.cgi?id=151529
|
||
http://trac.webkit.org/changeset/192716
|
||
|
||
"Build fix for old version of PHP."
|
||
http://trac.webkit.org/changeset/192717
|
||
|
||
2015-11-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix for old version of PHP.
|
||
|
||
* public/api/runs.php:
|
||
|
||
2015-11-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard's should not include results more than 366 days old in JSON
|
||
https://bugs.webkit.org/show_bug.cgi?id=151529
|
||
|
||
Reviewed by Timothy Hatcher.
|
||
|
||
Don't return results more than 366 days old in /api/runs/ JSON API.
|
||
This is a ~5% runtime improvement and reduces the JSON file size by 20-50% in the internal perf dashboard.
|
||
|
||
* public/api/runs.php:
|
||
(main): Added the support for "?noResults" to avoid echoing results. This is useful for debugging.
|
||
Also instantiate RunsGenerator before issuing the query to find all configurations so that the runtime cost
|
||
of doing so will be included in elapsedTime.
|
||
(RunsGenerator::fetch_runs): Skip a row when its build and commit times are more than 366 days old.
|
||
(RunsGenerator::format_run): Takes build_time and revisions as arguments since fetch_runs uses them now.
|
||
(RunsGenerator::parse_revisions_array): Compute the max of commit times.
|
||
|
||
2015-11-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Remove chartPointRadius from interactive chart component
|
||
https://bugs.webkit.org/show_bug.cgi?id=151480
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Replaced the parameter by CSS rules.
|
||
|
||
* public/v2/chart-pane.css:
|
||
(.chart .dot):
|
||
(.chart .dot.foreground):
|
||
(.chart .highlight):
|
||
(.chart .extent):
|
||
* public/v2/index.html:
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent.Ember.Component.extend._constructGraphIfPossible):
|
||
(App.InteractiveChartComponent.Ember.Component.extend._highlightedItemsChanged):
|
||
|
||
2015-11-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard's runs API uses more than 128MB of memory
|
||
https://bugs.webkit.org/show_bug.cgi?id=151478
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Don't fetch all query results at once to avoid using twice as much memory as needed.
|
||
Use iterative API to format each result at a time.
|
||
|
||
This change is also a 5% runtime performance gain.
|
||
|
||
* public/api/runs.php:
|
||
(RunsGenerator::__construct): Takes a Database instance instead of a list of configurations. The latter is
|
||
no longer needed as we pass in each configuration type explicitly to fetch_runs.
|
||
(RunsGenerator::fetch_runs): Renamed from add_runs since it now executes the database query via execute_query.
|
||
Also moved the logic to compute the last modified time here.
|
||
(RunsGenerator::execute_query): Moved from fetch_runs_for_config. Use Database::query instead of query_and_fetch_all.
|
||
(RunsGeneratorForTestGroup):
|
||
(RunsGeneratorForTestGroup::__construct):
|
||
(RunsGeneratorForTestGroup::execute_query): Moved from fetch_runs_for_config_and_test_group.
|
||
|
||
* public/include/db.php:
|
||
(generate_data_file): Lock the file to avoid corruption.
|
||
|
||
2015-11-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard always fetches charts JSON twice
|
||
https://bugs.webkit.org/show_bug.cgi?id=151483
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Only re-generate "runs" JSON via /api/runs/ when the cache doesn't exist in /data/ or the cached JSON is
|
||
obsolete (shouldRefetch is set true) or corrupt (the second closure).
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane._fetch):
|
||
|
||
2015-11-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Internal perf dashboard takes forever to load
|
||
https://bugs.webkit.org/show_bug.cgi?id=151430
|
||
|
||
Rubber-stamped by Antti Koivisto.
|
||
|
||
Fix a few performance problems with the perf dashboard v2 UI.
|
||
|
||
* public/v2/app.js:
|
||
(App.DashboardRow._createPane): Set "inDashboard" to true.
|
||
(App.Pane._fetch): Immediately show the cached chart instead of waiting for the refetched data which invokes
|
||
a PHP JSON API. Also don't fetch the analysis tasks when the chart is shown in the dashboard since we don't
|
||
show annotate charts in the dashboard.
|
||
|
||
2015-10-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed fix of a test after r190687.
|
||
|
||
* tests/admin-regenerate-manifest.js:
|
||
|
||
2015-10-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard tools shouldn't require server credentials in multiple configuration files
|
||
https://bugs.webkit.org/show_bug.cgi?id=149994
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Made detect-changes.js and pull-svn.py pull username and passwords from the server config JSON to reduce
|
||
the number of JSON files that need to include credentials.
|
||
|
||
Also made each script reload the server config after sleep to allow dynamic credential updates.
|
||
|
||
In addition, change the server config JSON's format to include scheme, host, and port numbers separately
|
||
instead of a url since detect-changes.js needs each value separately.
|
||
|
||
This reduces the number of JSONs with credentials to two for our internal dashboard.
|
||
|
||
* tools/detect-changes.js:
|
||
(main): Added a property argument parsing. Now takes --server-config-json, --change-detection-config-json,
|
||
and --seconds-to-sleep like other scripts.
|
||
(parseArgument): Added.
|
||
(fetchManifestAndAnalyzeData): Reload the server config JSON.
|
||
(loadServerConfig): Added. Set settings.perfserver and settings.slave from the server config JSON. Also
|
||
add settings.perfserver.host to match the old format.
|
||
(configurationsForTesting): Fixed a bug that we throw an exception when a dashboard contains an empty cell.
|
||
|
||
* tools/pull-os-versions.py:
|
||
(main): Use load_server_config after each sleep.
|
||
|
||
* tools/pull-svn.py:
|
||
(main): Use load_server_config after each sleep.
|
||
(fetch_commits_and_submit): Use the perf dashboard's auth as subversion credential when useServerAuth is set.
|
||
|
||
* tools/sync-with-buildbot.py:
|
||
(main): Use load_server_config after each sleep.
|
||
|
||
* tools/util.py:
|
||
(load_server_config): Extracted from python scripts. Computes server's url from scheme, host, and port number
|
||
to match the old format python scripts except.
|
||
|
||
2015-10-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r190817. Now that pull-os-versions store fake timestamps, we need to bypass timestamp
|
||
checks for OS versions when bots try to report new results. Otherwise, we fail to process the reports
|
||
with a MismatchingCommitTime error.
|
||
|
||
* public/include/report-processor.php:
|
||
(ReportProcessor::resolve_build_id):
|
||
|
||
2015-10-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard erroneously shows an old OS build in A/B testing range
|
||
https://bugs.webkit.org/show_bug.cgi?id=149942
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Ordering OS builds lexicologically turned out be a bad idea since 15A25 falls between 15A242 and 15A251.
|
||
Use a fake/synthetic timestamp to force the commonly understood total order instead.
|
||
|
||
Refactored pull-os-versions.py to share the server config JSON with other scripts. Also made the script
|
||
support pulling multiple sources; e.g. both OS X and iOS.
|
||
|
||
Also removed superfluous feature to submit results in chunks. The perf dashboard can handle thousands of
|
||
revisions being submitted at once just fine.
|
||
|
||
* public/api/commits.php:
|
||
(main): A partial revert of r185574 since we no longer need to order builds lexicologically.
|
||
|
||
* tools/pull-os-versions.py:
|
||
(main): Takes --os-config-json, --server-config-json, and --seconds-to-sleep as arguments instead of
|
||
a single --config argument to share the server config JSON with other scripts.
|
||
(OSBuildFetcher): Extracted out of main. This class is instantiated for each OS kind (e.g. OS X).
|
||
(OSBuildFetcher.__init__): Added.
|
||
(OSBuildFetcher._fetch_available_builds): Extracted out of main. Fetches available builds from a website
|
||
or custom commands.
|
||
(OSBuildFetcher.fetch_and_report_new_builds): Extracted out of main. Submits the fetched builds after
|
||
filtering out the ones we've already reported.
|
||
(OSBuildFetcher._assign_fake_timestamps): Creates a fake timestamp to establish a total order amongst each
|
||
OS X / iOS style build number such as 12A3456b.
|
||
|
||
2015-10-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
pull-svn.py fails to sync revisions when SVN credentials is not setup
|
||
https://bugs.webkit.org/show_bug.cgi?id=149941
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added the support for specifying subversion credentials.
|
||
|
||
Also added the support for pulling from multiple subversion servers. Subversion servers are specified
|
||
in a JSON configuration file specified by --svn-config formatted as follows:
|
||
|
||
[
|
||
{
|
||
"name": "WebKit",
|
||
"url": "http://svn.webkit.org/repository/webkit",
|
||
"username": "webkitten",
|
||
"password": "webkitten's password",
|
||
"trustCertificate": true,
|
||
"accountNameFinderScript":
|
||
["python", "/Volumes/Data/WebKit/Tools/Scripts/webkit-patch", "find-users"]
|
||
},
|
||
...
|
||
]
|
||
|
||
In addition, refactored it to use the shared server config JSON for the dashboard access.
|
||
|
||
* tools/pull-svn.py:
|
||
(main): Now takes --svn-config-json, --server-config-json, --seconds-to-sleep and --max-fetch-count
|
||
as required options instead of seven unnamed arguments.
|
||
(fetch_commits_and_submit): Extracted from main. Fetches at most max_fetch_count new revisions from
|
||
the subversion server, and submits them in accordance with server_config.
|
||
(fetch_commit_and_resolve_author): Now takes a single repository dictionary instead of two separate
|
||
arguments for name and URL to pass down the repository's authentication info to fetch_commit.
|
||
(fetch_commit): Ditto. Add appropriate arguments when username and passwords are specified.
|
||
(resolve_author_name_from_account): Use a list argument instead of a single string argument now that
|
||
the argument comes from a JSON instead of sys.argv.
|
||
|
||
2015-10-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed race condition fix. Exit early when xScale or yScale is not defined.
|
||
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent._updateRangeBarRects):
|
||
|
||
2015-10-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add a page that cycles through v2 dashboards
|
||
https://bugs.webkit.org/show_bug.cgi?id=149907
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Add cycler.html that goes through each dashboard on v2 UI.
|
||
|
||
This allows the dashboards to be cycled through on a TV screen.
|
||
|
||
* public/cycler.html: Added.
|
||
(loadURLAt): Appends a new iframe to load the next URL (i is the index of the dashboard to be shown)
|
||
at the end of body. We don't immediately show the new iframe since it might take a while to load.
|
||
(showNewFrameIfLoaded): Remove the current iframe and show the next iframe if the next dashboard has
|
||
finished loading. We can't rely on DOMContentLoaded or load events because we use asynchronous XHR to
|
||
load each chart's data. Instead, wait until some chart becomes available or fails to load and none of
|
||
charts are still in progress to be shown.
|
||
|
||
2015-10-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Allow custom revisions to be specified in A/B testing
|
||
https://bugs.webkit.org/show_bug.cgi?id=149905
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Allow custom revision number on each "repository" when creating a test group.
|
||
|
||
* public/v2/app.css:
|
||
(form .analysis-group [name=customValue]): Added.
|
||
|
||
* public/v2/app.js:
|
||
(App.AnalysisTaskController._createConfiguration): Added "Custom" as a revision option.
|
||
Also added point labels such as (point 3) on "None" for when some points are missing revision info.
|
||
(App.AnalysisTaskController._labelForPoints): Extracted from _createConfiguration.
|
||
(App.AnalysisTaskController.actions.createTestGroup): Respect the custom revision number when custom
|
||
revision option is selected.
|
||
|
||
* public/v2/index.html: Added a text field for specifying a custom revision number.
|
||
|
||
2015-10-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make the site name configurable in perf dashboard
|
||
https://bugs.webkit.org/show_bug.cgi?id=149894
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added "siteTitle" as a new configuration key to specify the site name.
|
||
|
||
* public/include/db.php:
|
||
(config): Now takes the default value as an argument.
|
||
* public/include/manifest.php:
|
||
(ManifestGenerator::generate): Include siteTitle in the manifest.
|
||
* public/index.html: Update the title and the heading when the manifest is loaded.
|
||
* public/v2/index.html: Use App.Manifest.siteTitle as the heading. document.title needs to be updated manually.
|
||
* public/v2/manifest.js:
|
||
(App.MetricSerializer.normalizePayload): Update document.title and App.Manifest.siteTitle.
|
||
|
||
2015-10-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard doesn't show analysis tasks anchored at outliers
|
||
https://bugs.webkit.org/show_bug.cgi?id=149870
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bug was caused by the computation of start and end times of analysis tasks being dependent on
|
||
time series provided to the interactive chart component even though they are already filtered.
|
||
|
||
Since the interactive chart component shouldn't be messing with the underlying data models, moved
|
||
the code to compute start and end times to App.Pane, to where it belongs, and made the moved code use
|
||
the unfiltered time series newly exposed on ChartData.
|
||
|
||
Also fixed a bug in fetch-from-remote.php which resulted in Ember endlessly fetching same JSON files.
|
||
|
||
* public/admin/fetch-from-remote.php:
|
||
(.): Use the full request URI for HTTP requests and caching. Otherwise, we're going to mix up caches
|
||
and Ember can start hanging browsers (took me three hours to debug this).
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane._showOutlierChanged): Added. Resets chartData when showOutlier flag has been changed.
|
||
(App.Pane.fetchAnalyticRanges): The old code wasn't filtering analysis tasks by platforms and metrics
|
||
at all since it relied on the server-side REST API to do the filtering, which I haven't implemented yet.
|
||
Filter the results manually instead.
|
||
(App.Pane.ranges): Moved the logic to compute startTime and endTime here from InteractiveChartComponent.
|
||
(App.PaneController.toggleShowOutlier): Now that App.Pane responds to showOutlier changes, we don't
|
||
need to call a private method on it.
|
||
(App.AnalysisTaskController._chartDataChanged): When end points are not found, try showing outliers.
|
||
This will cause chartData to be modified so just exit early and wait for getting called again.
|
||
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent._rangesChanged): The code to compute start and end time has been moved
|
||
to App.Pane.ranges.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Manifest._formatFetchedData): Added unfiltered time series as new properties as they are now used
|
||
to compute the end points of analysis tasks when their end points are outliers.
|
||
|
||
2015-10-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed. Fix a typo in r190645.
|
||
|
||
* public/include/db.php:
|
||
|
||
2015-10-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
V2 UI shouldn't sort dashboards lexicologically
|
||
https://bugs.webkit.org/show_bug.cgi?id=149856
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Don't sort the dashboards by name in App.Manifest.
|
||
|
||
* public/v2/app.js:
|
||
(App.IndexRoute.beforeModel): Don't transition to "undefined" (string) dashboard.
|
||
* public/v2/manifest.js:
|
||
(App.Manifest.._fetchedManifest):
|
||
|
||
2015-10-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
V2 UI fails to show the data for the very first point in charts
|
||
https://bugs.webkit.org/show_bug.cgi?id=149857
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bug was caused by seriesBetweenPoints returning null for when point.seriesIndex is 0.
|
||
Explicitly check the type of this property instead.
|
||
|
||
* public/v2/data.js:
|
||
(TimeSeries.prototype.seriesBetweenPoints):
|
||
|
||
2015-10-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should have the capability to test local UI with production data
|
||
https://bugs.webkit.org/show_bug.cgi?id=149834
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added tools/run-with-remote-server.py which runs a local httpd server and pulls data from a remote server.
|
||
|
||
* Install.md: Added the instruction on how to use the script. Also updated the remaining instructions
|
||
for El Capitan.
|
||
* config.json: Added remote server configurations.
|
||
* public/admin/fetch-from-remote.php: Added. This script fetches JSON from the remote server specified in
|
||
config.json and caches the results in the location specified as "cacheDirectory" in config.json.
|
||
(main):
|
||
(fetch_remote):
|
||
* public/include/db.php:
|
||
(config_path): Extracted from generate_data_file.
|
||
(generate_data_file):
|
||
* tools/remote-server-relay.conf: Added. Apache 2.4 configuration file for a local http server launched by
|
||
run-with-remote-server.py.
|
||
* tools/run-with-remote-server.py: Added. Launches Apache with the right set of directives.
|
||
(main):
|
||
(abspath_from_root):
|
||
|
||
2015-07-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix a typo.
|
||
|
||
* public/js/helper-classes.js:
|
||
|
||
2015-06-27 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
build-requests should use conform to JSON API format
|
||
https://bugs.webkit.org/show_bug.cgi?id=146375
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
Instead of returning single dictionary that maps root set id to a dictionary of repository names
|
||
to revisions, timestamps, simply return root sets and roots "rows" or "objects" as defined in
|
||
JSON API (http://jsonapi.org/). This API change makes it easier to resolve the bug 146374 and
|
||
matches what we do in /api/test-groups.
|
||
|
||
Also add the support for /api/build-requests/?id=<id> to fetch the build request with <id>.
|
||
This is useful for debugging purposes.
|
||
|
||
* public/api/build-requests.php:
|
||
(main): Added the support for $_GET['id']. Also return "rootSets" and "roots".
|
||
(update_builds): Extracted from main.
|
||
|
||
* public/include/build-requests-fetcher.php:
|
||
(BuildRequestFetcher::fetch_request): Added. Used for /api/build-requests/?id=<id>.
|
||
(BuildRequestFetcher::results_internal): Always call fetch_roots_for_set_if_needed.
|
||
(BuildRequestFetcher::fetch_roots_for_set_if_needed): Renamed from fetch_roots_for_set.
|
||
Moved the logic to exit early when the root set had already been fetched here.
|
||
|
||
* public/v2/analysis.js:
|
||
(App.TestGroup._fetchTestResults): Fixed the bug that test groups without any successful results
|
||
won't be shown.
|
||
|
||
* tools/pull-os-versions.py:
|
||
(main):
|
||
(setup_auth): Moved to util.py
|
||
|
||
* tools/sync-with-buildbot.py:
|
||
(main): Replaced a bunch of perf dashboard related options by --server-config-json.
|
||
(update_and_fetch_build_requests): No longer takes build_request_auth since that's now taken care
|
||
of by setup_auth.
|
||
(organize_root_sets_by_id_and_repository_names): Added. Builds the old rootsSets directory based
|
||
on "roots" and "rootSets" dictionaries returned by /api/build-requests.
|
||
(config_for_request): Fixed a bug that the script blows up when the build request is missing
|
||
the repository specified in the configuration. This tolerance is necessary when a new repository
|
||
dependency is added but we want to run A/B tests for old builds without the dependency.
|
||
(fetch_json): No longer takes auth.
|
||
|
||
* tools/util.py:
|
||
(setup_auth): Moved from pull-os-versions.py to be shared with sync-with-buildbot.py.
|
||
|
||
2015-06-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. A/B testing is broken when continuous builders report revisions out of order.
|
||
|
||
* public/v2/app.js:
|
||
(App.AnalysisTaskController.Ember.Controller.extend.):
|
||
|
||
2015-06-22 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
A/B testing results should be shown even if they were submitted to different platforms
|
||
https://bugs.webkit.org/show_bug.cgi?id=146219
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Fetch A/B testing results regardless of the platform to which results are submitted
|
||
by providing the platform ID to which the results were submitted for each test group.
|
||
|
||
* public/api/test-groups.php:
|
||
(main): Include the platform id in the test groups.
|
||
* public/v2/analysis.js:
|
||
(App.TestGroup._fetchTestResults): Fetch results from the platform associated with the group.
|
||
|
||
2015-06-19 Csaba Osztrogonác <ossy@webkit.org>
|
||
|
||
Remove unnecessary svn:executable flags
|
||
https://bugs.webkit.org/show_bug.cgi?id=146107
|
||
|
||
Reviewed by Alexey Proskuryakov.
|
||
|
||
* public/js/helper-classes.js: Removed property svn:executable.
|
||
* public/js/jquery.flot.plugins.js: Removed property svn:executable.
|
||
* public/v2/app.css: Removed property svn:executable.
|
||
* public/v2/app.js: Removed property svn:executable.
|
||
* public/v2/chart-pane.css: Removed property svn:executable.
|
||
* public/v2/data.js: Removed property svn:executable.
|
||
* public/v2/index.html: Removed property svn:executable.
|
||
* public/v2/js/d3/LICENSE: Removed property svn:executable.
|
||
* public/v2/js/d3/d3.js: Removed property svn:executable.
|
||
* public/v2/js/d3/d3.min.js: Removed property svn:executable.
|
||
* public/v2/js/ember-data.js: Removed property svn:executable.
|
||
* public/v2/js/ember.js: Removed property svn:executable.
|
||
* public/v2/js/handlebars.js: Removed property svn:executable.
|
||
* public/v2/js/jquery.min.js: Removed property svn:executable.
|
||
* public/v2/js/statistics.js: Removed property svn:executable.
|
||
* public/v2/manifest.js: Removed property svn:executable.
|
||
* public/v2/popup.js: Removed property svn:executable.
|
||
|
||
2015-06-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Reading the list of analysis tasks is extremely slow
|
||
https://bugs.webkit.org/show_bug.cgi?id=146086
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
The bug was caused by Ember data requesting manifest.js hundreds of times.
|
||
Fetch it ahead of time in each route instead.
|
||
|
||
* public/v2/app.js:
|
||
(App.AnalysisRoute.model):
|
||
(App.AnalysisTaskRoute.model):
|
||
|
||
2015-06-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Update ReadMe.md and Install.md per database changes
|
||
https://bugs.webkit.org/show_bug.cgi?id=146076
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Updated.
|
||
|
||
* Install.md:
|
||
* ReadMe.md:
|
||
|
||
2015-06-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Increase the popup dismissal time from 100ms to 500ms
|
||
https://bugs.webkit.org/show_bug.cgi?id=146077
|
||
|
||
Rubber-stamped by Andreas Kling.
|
||
|
||
* public/v2/popup.js:
|
||
(App.PopupView.scheduleHiding):
|
||
|
||
2015-06-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v2 UI should have buttons to breakdown a test
|
||
https://bugs.webkit.org/show_bug.cgi?id=146010
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added buttons beneath each chart pane to add "alternative panes". By default, it shows every platform
|
||
as well as "Breakdown" to add all subtests' metrics.
|
||
|
||
Also removed the metric submenu from tests that had exactly one metric. When a test only measures Time
|
||
for example, we make the test itself clickable instead of showing a submenu that only contains one item.
|
||
|
||
* public/v2/app.js:
|
||
(App.ChartsController.addAlternativePanes): Added.
|
||
(App.TestProxyForPopup.children): Calls _updateChildren and returns this._children.
|
||
(App.TestProxyForPopup.actionName): Added.
|
||
(App.TestProxyForPopup.actionArgument): Added.
|
||
(App.TestProxyForPopup._updateChildren): Extracted from children. Now also sets _actionName and
|
||
_actionArgument in the case there was exactly one metric so that showing submenu is unnecessary.
|
||
(App.PaneController.alternativePanes): Added. Returns the list of alternative panes. The platform list
|
||
excludes ones that don't have this metric (e.g. iOS doesn't have desktop PLT results) as well as ones
|
||
that are already present in the list of panes.
|
||
* public/v2/chart-pane.css: Added CSS rules for alternative pane buttons beneath the chart panes.
|
||
* public/v2/index.html:
|
||
* public/v2/manifest.js:
|
||
(App.Metric.childMetrics): Added.
|
||
|
||
2015-06-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r185574.
|
||
|
||
* public/v2/app.js:
|
||
(set get App.Pane.Ember.Object.extend.):
|
||
|
||
2015-06-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix a typo.
|
||
|
||
* tools/pull-os-versions.py:
|
||
(main):
|
||
|
||
2015-06-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should be able to list iOS versions as well as OS X versions
|
||
https://bugs.webkit.org/show_bug.cgi?id=146003
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
Generalized pull-osx.py so that it can run an arbitrary shell command to fetch OS versions based on
|
||
information specified in config.json.
|
||
|
||
* tools/pull-os-versions.py: Renamed from pull-osx.py.
|
||
(main): Use available_builds_from_command when 'customCommands' is specified.
|
||
(available_builds_from_command): Added. Executes a shell command to fetch a list of available builds.
|
||
(fetch_available_builds): Now takes the repository name.
|
||
|
||
2015-06-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Removed a superfluous console.log per Chris's comment.
|
||
|
||
* public/v2/app.js:
|
||
|
||
2015-06-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Analysis task should show all possible revisions for A/B testing
|
||
https://bugs.webkit.org/show_bug.cgi?id=145996
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
* public/api/commits.php:
|
||
(fetch_commits_between): When the time stamp is not available for commits, use revision numbers
|
||
to find revisions between two ranges. This is necessary for OS X and iOS versions since they don't
|
||
have a "commit time".
|
||
|
||
* public/v2/app.js:
|
||
(App.AnalysisTaskController.updateRootConfigurations): Fetch commits between two end points.
|
||
(App.AnalysisTaskController._createConfiguration): Extracted from updateRootConfigurations. List
|
||
the fetched list of commits if available.
|
||
(App.AnalysisTaskController._serializeNumbersSkippingConsecutiveEntries): Added. Serializes an list
|
||
of numbers intelligently. For example, [1, 2, 4, 5] turns into "1-2, 4-5". Without this, some lists
|
||
of points shown in the A/B testing configurations become too long.
|
||
|
||
* public/v2/commits-viewer.js:
|
||
(App.CommitsViewerComponent.commitsChanged):
|
||
|
||
* public/v2/data.js:
|
||
(CommitLogs.fetchCommits): Renamed from fetchForTimeRange.
|
||
|
||
2015-06-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add a script to post new OS X builds to perf dashboard
|
||
https://bugs.webkit.org/show_bug.cgi?id=145955
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Added a new script pull-osx.py and relaxed the restrictions on commits accepted by the dashboard API.
|
||
|
||
* public/api/report-commits.php:
|
||
(main): Allow more characters than [A-Za-z0-9] in revision. e.g. "10.10.3 14D136".
|
||
Also allow commits without the author, commit time, and commit message as OS versions do not have those.
|
||
|
||
* tools/pull-osx.py: Added.
|
||
(main): Fetch the list of builds from a website and submit them per submissionSize with submissionInterval.
|
||
Once all builds have been submitted, wait for a long time as specified by fetchInterval.
|
||
(setup_auth): Sets up basic or digest auth to access the dashboard.
|
||
(fetch_available_builds): Fetches and parses the XML document from an internal website.
|
||
(textContent): A helper function to get the text content out of a XML node.
|
||
(submit_commits): Submits commits to the perf dashboard.
|
||
|
||
* tools/pull-svn.py:
|
||
(fetch_commit):
|
||
|
||
* tools/util.py: Extracted submit_commits and text_content from pull-svn.py to be reused in pull-osx.py.
|
||
|
||
2015-06-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard's v2 UI shouldn't hide auto-detected outliers
|
||
https://bugs.webkit.org/show_bug.cgi?id=145940
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Don't fallback to the default strategies for moving averages and envelope when one is not specified.
|
||
Also deleted the code to mark points outside the envelop as outliers.
|
||
|
||
* public/v2/app.js:
|
||
|
||
2015-06-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix for merging platforms.
|
||
|
||
* public/admin/platforms.php:
|
||
|
||
2015-06-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix. Some builder names are really long.
|
||
|
||
* init-database.sql:
|
||
|
||
2015-05-22 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Show results and status before revisions for A/B testing results
|
||
https://bugs.webkit.org/show_bug.cgi?id=145327
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Place the results and the status columns before the columns for revisions.
|
||
Also show the absolute difference as well as the relative difference between the averages of A and B.
|
||
|
||
* public/v2/app.js:
|
||
(App.TestGroupPane._populate):
|
||
(App.TestGroupPane._computeStatisticalSignificance):
|
||
* public/v2/index.html:
|
||
|
||
2015-05-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r184591.
|
||
|
||
* public/v2/manifest.js:
|
||
|
||
2015-05-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Use POSIX timestamp instead of human readable string for the commit time.
|
||
|
||
* public/include/build-requests-fetcher.php:
|
||
|
||
2015-05-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
UI to associate bugs with an analysis task is crappy
|
||
https://bugs.webkit.org/show_bug.cgi?id=145198
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Make the UI less crappy by linkifying bug numbers and adding an explicit button to disassociate
|
||
a bug and a separate select view with a text field to associate a new bug instead of implicitly
|
||
updating or deleting the existing record based on what the user had typed.
|
||
|
||
* init-database.sql: Removed the constraint that each bug tracker should appear exactly once for
|
||
a given analysis task since it's perfectly reasonable for a given task to be associated with
|
||
multiple WebKit bugs.
|
||
|
||
* public/privileged-api/associate-bug.php:
|
||
(main): Only remove the bug specified by newly added bugToDelete instead of implicitly deleting
|
||
one that matches the analysis task and the bug tracker when the bug number is falsey.
|
||
|
||
* public/v2/analysis.js:
|
||
(App.Bug.url): Added.
|
||
(App.BugAdapter.deleteRecord): Added. Uses the privileged API to delete the record.
|
||
|
||
* public/v2/app.css:
|
||
|
||
* public/v2/app.js:
|
||
(App.AnalysisTaskController.actions.addBug): Added.
|
||
(App.AnalysisTaskController.actions.deleteBug): Added.
|
||
(App.AnalysisTaskController.associateBug): Deleted.
|
||
|
||
* public/v2/index.html: Updated the templates.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.BugTracker.urlFromBugNumber): Added.
|
||
|
||
2015-05-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
A/B testing rootSets should provide commit times as well as revisions
|
||
https://bugs.webkit.org/show_bug.cgi?id=145207
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Some continuous build systems need the commit time as well as the revision number / hash so provide one
|
||
in the root sets but maintain the backwards compatibility with buildbots that use revision number directly.
|
||
|
||
* public/include/build-requests-fetcher.php:
|
||
(BuildRequestsFetcher::fetch_roots_for_set): Made the revision info an associative array that contains
|
||
the revision number as well as the commit time.
|
||
* tools/sync-with-buildbot.py:
|
||
(schedule_request): Removed "replacement" which was a superfluous copy of "roots". Use "revision" values
|
||
when the JSON configuration refers to "root". This is necessary in buildbot instances that require WebKit
|
||
revision to be specified on its own field instead of it being a JSON that contains "revision" and "time".
|
||
|
||
2015-05-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Don't fall into an infinite loop when value (renamed from bytes) is zero.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Manifest.Ember.Controller.extend.):
|
||
(App.Manifest.Ember.Controller.extend):
|
||
|
||
2015-05-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Don't show unit (bytes) separaetly from SI suffixes (K, M, etc...)
|
||
https://bugs.webkit.org/show_bug.cgi?id=145181
|
||
|
||
Rubber-stamped by Chris Dumez.
|
||
|
||
Show 'MB' in each y-axis label instead of showing 'bytes' separately and suffixing each label with just 'M'
|
||
for clarity. This change also reduces the code complexity.
|
||
|
||
* public/index.html:
|
||
* public/v2/app.js:
|
||
(App.AnalysisTaskController._chartDataChanged):
|
||
(App.TestGroupPane._createConfigurationSummary):
|
||
* public/v2/data.js:
|
||
(RunsData.unitFromMetricName): Use 'B' instead of 'bytes' as the unit.
|
||
|
||
* public/v2/interactive-chart.js: Removed the support for showing units separately.
|
||
(App.InteractiveChartComponent._constructGraphIfPossible):
|
||
(App.InteractiveChartComponent._relayoutDataAndAxes)
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Manifest._makeFormatter): Renamed from _formatBytes. Support more SI suffixes such as micro and mili.
|
||
Now takes the unit as the first argument. Adjust the base unit if it's 'ms'.
|
||
(App.Manifest._formatFetchedData): Removed unit and formatWithUnit now that all all formatters would
|
||
automatically include unit.
|
||
|
||
2015-05-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
REGRESSION: v2 UI reports a higher memory usage
|
||
https://bugs.webkit.org/show_bug.cgi?id=145151
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bug was caused by v2 UI using 1000 to divide the number of bytes instead of by 1024 as done in v1.
|
||
Fixed the bug by manually implementing the formatter as done in v1.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Manfiest._formatBytes): Added.
|
||
(App.Manifest._formatFetchedData): Use _formatByte instead of format('s').
|
||
|
||
2015-05-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix. Add "Duration" as a time metric.
|
||
|
||
* public/js/helper-classes.js:
|
||
* public/v2/data.js:
|
||
(RunsData.unitFromMetricName):
|
||
|
||
2015-05-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard treats Speedometer and JetStream as smaller is better
|
||
https://bugs.webkit.org/show_bug.cgi?id=144711
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added the support for "Score" metric.
|
||
|
||
* public/js/helper-classes.js:
|
||
(PerfTestRuns):
|
||
* public/v2/data.js:
|
||
(RunsData.unitFromMetricName):
|
||
(RunsData.isSmallerBetter):
|
||
|
||
2015-04-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r183232.
|
||
|
||
* public/include/json-header.php:
|
||
|
||
2015-04-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should automatically detect regressions
|
||
https://bugs.webkit.org/show_bug.cgi?id=141443
|
||
|
||
Reviewed by Anders Carlsson.
|
||
|
||
Added a node.js script detect-changes.js to detect potential regressions and progressions
|
||
on the graphs tracked on v2 dashboards.
|
||
|
||
* init-database.sql: Added analysis_strategies table and task_segmentation and task_test_range
|
||
columns to analysis_tasks to keep the segmentation and test range selection strategies used
|
||
to create an analysis task.
|
||
|
||
* public/api/analysis-tasks.php:
|
||
(format_task): Include task_segmentation and analysis_tasks in the results.
|
||
|
||
* public/include/json-header.php:
|
||
(remote_user_name): Returns null when the privileged API is authenticated as a slave instead
|
||
of a CSRF prevention token.
|
||
(should_authenticate_as_slave): Added.
|
||
(ensure_privileged_api_data_and_token_or_slave): Added. Authenticate as a slave if slaveName
|
||
and slavePassword are specified. Since detect-changes.js and other slaves are not susceptible
|
||
to a CSRF attack, we don't need to check a CSRF token.
|
||
|
||
* public/privileged-api/create-analysis-task.php:
|
||
(main): Use ensure_privileged_api_data_and_token_or_slave to let detect-changes.js create new
|
||
analysis task. Also add or find segmentation and test range selection strategies if specified.
|
||
|
||
* public/privileged-api/create-test-group.php:
|
||
(main): Use ensure_privileged_api_data_and_token_or_slave.
|
||
|
||
* public/privileged-api/generate-csrf-token.php:
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane._computeMovingAverageAndOutliers): _executeStrategy has been moved to Statistics.
|
||
|
||
* public/v2/data.js: Export Measurement, RunsData, TimeSeries. Used in detect-changes.js.
|
||
(Array.prototype.find): Added a polyfill to be used in node.js.
|
||
(RunsData.fetchRuns):
|
||
(RunsData.pathForFetchingRuns): Extracted from fetchRuns. Used in detect-changes.js.
|
||
(RunsData.createRunsDataInResponse): Extracted from App.Manifest._formatFetchedData to use it
|
||
in detect-changes.js.
|
||
(RunsData.unitFromMetricName): Ditto.
|
||
(RunsData.isSmallerBetter): Ditto.
|
||
(RunsData.prototype._timeSeriesByTimeInternal): Added secondaryTime to sort points when commit
|
||
times are identical.
|
||
(TimeSeries): When commit times are identical, order points based on build time. This is needed
|
||
for when we trigger two builds at two different OS versions with the same WebKit revision since
|
||
OS versions don't change the commit times.
|
||
(TimeSeries.prototype.findPointByIndex): Added.
|
||
(TimeSeries.prototype.rawValues): Added.
|
||
|
||
* public/v2/js/statistics.js:
|
||
(Statistics.TestRangeSelectionStrategies.[0]): Use the 99% two-sided probability as claimed in the
|
||
description of this strategy instead of the default probability. Also fixed a bug that debugging
|
||
code was referring to non-existent variables.
|
||
(Statistics.executeStrategy): Moved from App.Pane (app.js).
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Manifest._formatFetchedData): Various code has been extracted into RunsData in data.js to be
|
||
used in detect-changes.js.
|
||
|
||
* tools/detect-changes.js: Added. The script fetches the manifest JSON, analyzes each graph in
|
||
the v2 dashboards, and creates an analysis task for the latest regression or progression detected.
|
||
It also schedules an A/B testing if possible and notifies another server; e.g. to send an email.
|
||
(main): Loads the settings JSON specified in the argument.
|
||
(fetchManifestAndAnalyzeData): The main loop that periodically wakes up to do the analysis.
|
||
(mapInOrder): Executes callback sequentially (i.e. blocking) on each item in the array.
|
||
(configurationsForTesting): Finds every (platform, metric) pair to analyze in the v2 dashbaords,
|
||
and computes various values for when statistically significant changes are detected later.
|
||
(analyzeConfiguration): Finds potential regressions and progression in the last X days where X
|
||
is the specified maximum number of days using the specified strategies. Sort the resultant ranges
|
||
in chronological order and create a new analysis task for the very last change we detected. We'll
|
||
eventually create an analysis task for all detected changes since we're repeating the analysis in
|
||
fetchManifestAndAnalyzeData after some time.
|
||
(computeRangesForTesting): Fetch measured values and compute ranges to test using the specified
|
||
segmentation and test range selection strategies. Once ranges are found, find overlapping analysis
|
||
tasks as they need to be filtered out in analyzeConfiguration to avoid creating multiple analysis
|
||
tasks for the same range (e.g. humans may create one before the script gets to do it).
|
||
(createAnalysisTaskAndNotify): Create a new analysis task for the specified range, trigger an A/B
|
||
testing if available, and notify another server with a HTML message as specified.
|
||
(findStrategyByLabel):
|
||
(changeTypeForRange): A change is a regression if values are getting larger in a smaller-is-better
|
||
test or values are getting smaller in a larger-is-better test and vice versa.
|
||
(summarizeRange): Create a human readable string that summarizes the change detected. e.g.
|
||
"Potential 3.2% regression detected between 2015-04-20 12:00 and 17:00".
|
||
(formatTimeRange):
|
||
(getJSON):
|
||
(postJSON):
|
||
(postNotification): Recursively replaces $title and $massage in the specified JSON template.
|
||
(instantiateNotificationTemplate):
|
||
(fetchJSON):
|
||
|
||
2015-04-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should have UI to set status on analysis tasks
|
||
https://bugs.webkit.org/show_bug.cgi?id=143977
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added the UI to set the result of an analysis task to 'progression', 'regression', 'unchanged', and 'inconclusive'
|
||
as well as a boolean indicating whether creating the analysis task was the right thing to do or not.
|
||
The latter will be a useful metric once we start automatically creating analysis tasks.
|
||
|
||
* init-database.sql: Added two columns to analysis_tasks table.
|
||
* public/api/analysis-tasks.php: Include the added columns in the JSON.
|
||
* public/include/db.php:
|
||
(Database::to_database_boolean): Added.
|
||
* public/include/json-header.php:
|
||
(require_match_one_of_values): Added.
|
||
* public/privileged-api/update-analysis-task.php: Added. Updates 'result' and 'needed' values of an analysis task.
|
||
(main):
|
||
* public/v2/analysis.js:
|
||
(App.AnalysisTask.result): Added.
|
||
(App.AnalysisTask.needed): Added. We don't use DS.attr('boolean') here since that would coerce null into false
|
||
and we want to differentiate null from false in order to differentiate the null-ness of the value.
|
||
(App.AnalysisTask.saveStatus): Added.
|
||
(App.AnalysisTask.statusLabel): Use 'result' as the label if it's set and all build requests have been processed.
|
||
* public/v2/app.css:
|
||
* public/v2/app.js:
|
||
(App.AnalysisTaskController.analysisResultOptions): Added.
|
||
(App.AnalysisTaskController.shouldNotHaveBeenCreated): Added.
|
||
(App.AnalysisTaskController.needsFeedback): Added. Show the checkbox to indicate the analysis task should not have
|
||
been created if 'no change' is selected.
|
||
(App.AnalysisTaskController._updateChosenAnalysisResult): Added.
|
||
(App.AnalysisTaskController.actions.saveStatus): Added.
|
||
* public/v2/index.html: Extracted a partial template for updating the bug numbers. Also added the UI to update
|
||
'result' and 'needed' values of the analysis task.
|
||
|
||
2015-04-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix. Updated config.json after recent changes.
|
||
|
||
* config.json:
|
||
|
||
2015-04-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make the analysis page more useful
|
||
https://bugs.webkit.org/show_bug.cgi?id=143617
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
* public/api/analysis-tasks.php:
|
||
(fetch_and_push_bugs_to_tasks): Added total and finished numbers of build requests associated
|
||
with the fetched analysis tasks as buildRequestCount and finishedBuildRequestCount respectively.
|
||
* public/v2/analysis.js:
|
||
(App.AnalysisTask.formattedCreatedAt): Added.
|
||
(App.AnalysisTask._addLeadingZero): Added.
|
||
(App.AnalysisTask.buildRequestCount): Added.
|
||
(App.AnalysisTask.finishedBuildRequestCount): Added.
|
||
(App.AnalysisTask.statusLabel): Added. Status total and finished numbers of build requests.
|
||
(App.AnalysisTask.testGroups):
|
||
(App.AnalysisTask.triggerable):
|
||
(App.AnalysisTask.label):
|
||
|
||
* public/v2/app.css: Tweaked style rules for the analysis page.
|
||
|
||
* public/v2/app.js:
|
||
(App.buildPopup): Sort the list of platforms by name.
|
||
(App.AnalysisRoute.model): Sort the list of analysis tasks by the order they are created.
|
||
(App.AnalysisTaskController._fetchedManifest): Added elementId to associate bug tracker names
|
||
such as "Bugzilla" with the corresponding text field.
|
||
|
||
* public/v2/index.html: Added a bunch of columns to the analysis page and also wrapped the table
|
||
showing A/B testing results in a div with overflow: scroll so that it always leaves enough space
|
||
for the accompanying graph.
|
||
|
||
2015-04-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should automatically select ranges for A/B testing
|
||
https://bugs.webkit.org/show_bug.cgi?id=143580
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added a new statistics option for picking a A/B test range selection strategy.
|
||
The selected ranges are shown in the graph using the same UI to show analysis tasks.
|
||
|
||
* public/v2/app.js:
|
||
(App.DashboardPaneProxyForPicker._platformOrMetricIdChanged): Updated the query parameters for
|
||
charts page used by the dashboard since we've added a new parameter at the end.
|
||
(App.Pane.ranges): Added. Merges ranges created for analysis tasks and A/B testing.
|
||
(App.Pane.updateStatisticsTools): Clone and set the test range selection strategies.
|
||
(App.Pane._cloneStrategy): Copy isSegmentation.
|
||
(App.Pane._updateMovingAverageAndEnvelope): Set testRangeCandidates.
|
||
(App.Pane._movingAverageOrEnvelopeStrategyDidChange): Update the charts when a new text range
|
||
selection strategy is picked by the user.
|
||
(App.Pane._computeMovingAverageAndOutliers): Compute the test ranges using the chosen strategy.
|
||
Avoid going through isAnomalyArray when no anomaly detection strategy is enabled. Also changed
|
||
the return value from the moving average time series to a dictionary that contains the moving
|
||
average time series, a dictionary of anomalies, and an array of test ranges.
|
||
(App.ChartsController._parsePaneList): Parse the test range selection strategy configuration.
|
||
(App.ChartsController._serializePaneList): Ditto for serialization.
|
||
(App.ChartsController._scheduleQueryStringUpdate): Update the URL hash when the user picks a new
|
||
test range selection strategy.
|
||
|
||
* public/v2/chart-pane.css: Fixed a typo as well as added a CSS rule for test ranges markers.
|
||
|
||
* public/v2/index.html: Added UI for selecting a test range selection strategy.
|
||
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent._rangesChanged): Pass down "status" to be used as a class name.
|
||
|
||
* public/v2/js/statistics.js:
|
||
(Statistics.MovingAverageStrategies): Added isSegmentation to segmentation strategies.
|
||
(Statistics.TestRangeSelectionStrategies): Added.
|
||
|
||
2015-04-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
The results of A/B testing should state statistical significance
|
||
https://bugs.webkit.org/show_bug.cgi?id=143552
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added statistical comparisons between results for each configuration on analysis task page using
|
||
Welch's t-test. The probability as well as t-statistics and the degrees of freedoms are reported.
|
||
|
||
* public/v2/app.js:
|
||
(App.TestGroupPane._populate): Report the list of statistical comparison between every pair of
|
||
root configurations in the results. e.g. if we've got A, B, C configurations then compare A/B, A/C
|
||
and B/C.
|
||
(App.TestGroupPane._computeStatisticalSignificance): Compute the statistical significance using
|
||
Welch's t-test. Report the probability by which two samples do not come from the same distribution.
|
||
(App.TestGroupPane._createConfigurationSummary): Include the array of results for this configuration.
|
||
Also renamed "items" to "requests" for clarity.
|
||
|
||
* public/v2/index.html: Added the template for showing statistical comparisons.
|
||
|
||
* public/v2/js/statistics.js: Renamed tDistributionQuantiles to tDistributionByOneSidedProbability
|
||
for clarity. Also factored out the functions to convert from one-sided probability to two-sided
|
||
probability and vice versa.
|
||
(Statistics.supportedConfidenceIntervalProbabilities):
|
||
(Statistics.confidenceIntervalDelta):
|
||
(Statistics.probabilityRangeForWelchsT): Added. Computes the lower bound and the upper bound for
|
||
the probability that two values are sampled from distinct distributions using Welch's t-test.
|
||
(Statistics.computeWelchsT): This function now takes two-sided probability like all other functions.
|
||
(.tDistributionByOneSidedProbability): Renamed from tDistributionQuantiles.
|
||
(.oneSidedToTwoSidedProbability): Extracted.
|
||
(.twoSidedToOneSidedProbability): Extracted.
|
||
(Statistics.MovingAverageStrategies): Converted the one-sided probability to the two-sided probability
|
||
now that computeWelchsT takes two-sided probability.
|
||
|
||
2015-04-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed fix after r182496 for when the cached runs JSON doesn't exist.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane._fetch):
|
||
(App.Pane.refetchRuns):
|
||
|
||
2015-04-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should have a way of marking outliers
|
||
https://bugs.webkit.org/show_bug.cgi?id=143466
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Address kling's in-person comment to notify users when the new run status is saved in the database.
|
||
|
||
* public/v2/app.js:
|
||
(App.PaneController._selectedItemIsMarkedOutlierDidChange)
|
||
* public/v2/chart-pane.css: Fixed a typo.
|
||
|
||
2015-04-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should have a way of marking outliers
|
||
https://bugs.webkit.org/show_bug.cgi?id=143466
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added UI to mark a data point as an outlier as well as a button to toggle the visibility of outliers.
|
||
Added a new privileged API /privileged-api/update-run-status to store this boolean flag.
|
||
|
||
* init-database.sql: Added run_marked_outlier column to test_runs table.
|
||
|
||
* public/admin/tests.php:
|
||
|
||
* public/api/runs.php:
|
||
(main): Only emit Cache-Control and Expires headers in v1 UI.
|
||
(RunsGenerator::format_run): Emit markedOutlier.
|
||
|
||
* public/include/admin-header.php:
|
||
|
||
* public/include/db.php:
|
||
(Database::is_true): Made it static.
|
||
|
||
* public/include/manifest.php:
|
||
(Manifest::platforms):
|
||
|
||
* public/index.html: Call into /api/runs/ with ?cache=true.
|
||
|
||
* public/privileged-api/update-run-status.php: Added.
|
||
(main): Updates the newly added column in test_runs table.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane._fetch):
|
||
(App.Pane.refetchRuns): Extracted from App.Pane._fetch.
|
||
(App.Pane._didFetchRuns): Renamed from _updateChartData.
|
||
(App.Pane._setNewChartData): Added. Pick the right time series based based on the value of showOutlier.
|
||
Cloning chartData is necessary when toggling the outlier visibility or using statistics tools because
|
||
the interactive chart component only observes changes to chartData and not individual properties of it.
|
||
(App.Pane._highlightPointsMarkedAsOutlier): Added. Highlight points marked as outliers.
|
||
(App.Pane._movingAverageOrEnvelopeStrategyDidChange): Call to _setNewChartData replaced the code to
|
||
clone chartData here.
|
||
|
||
(App.PaneController.actions.toggleShowOutlier): Toggle the visibility of points marked as outliers by
|
||
invoking App.Pane._setNewChartData.
|
||
(App.PaneController._detailsChanged): Don't hide the analysis pane when details changed since keep
|
||
opening the pane for marking points as outliers would be annoying.
|
||
(App.PaneController._updateCanAnalyze): Update 'cannotMarkOutlier' as well as 'cannotAnalyze'.
|
||
(App.PaneController.selectedMeasurement): Added.
|
||
(App.PaneController.showOutlierTitle): Added.
|
||
(App.PaneController._selectedItemIsMarkedOutlierDidChange): Added. Call out to setMarkedOutlier to
|
||
mark the selected point as an outlier via the newly added privileged API.
|
||
|
||
* public/v2/chart-pane.css: Updated styles.
|
||
|
||
* public/v2/data.js:
|
||
(PrivilegedAPI._post): Report the semantic errors.
|
||
(Measurement.prototype.markedOutlier): Added.
|
||
(Measurement.prototype.setMarkedOutlier): Added. Uses PrivilegedAPI to update the database.
|
||
(RunsData.prototype.timeSeriesByCommitTime): Added a new argument, includeOutliers, to indicate
|
||
whether the time series should include measurements marked as outliers or not.
|
||
(RunsData.prototype.timeSeriesByBuildTime): Ditto.
|
||
(RunsData.prototype._timeSeriesByTimeInternal): Extracted from timeSeriesByCommitTime and
|
||
timeSeriesByBuildTime to share code. Now ignores measurements marked as outliers if needed.
|
||
|
||
* public/v2/index.html: Added an icon for showing and hiding outliers. Also added a checkbox to
|
||
mark individual points as outliers.
|
||
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent._selectClosestPointToMouseAsCurrentItem): Re-enable the distance
|
||
heuristics that takes vertical closeness into account. This heuristics is more useful when marking
|
||
some points as outliers. This heuristics was disabled because the behavior was unpredictable but
|
||
with the arrow key navigation support, this is no longer an issue.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Manifest._formatFetchedData): Added showOutlier to the chart data. This function dynamically
|
||
updates the time series in this chart data in order to include or exclude outliers.
|
||
|
||
2015-04-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should be able to trigger A/B testing jobs for iOS
|
||
https://bugs.webkit.org/show_bug.cgi?id=143398
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Fix various bugs in the perf dashboard so that it can schedule A/B testing jobs for iOS.
|
||
|
||
Also generalized sync-with-buildbot.py slightly to meet the requirements of iOS builders.
|
||
|
||
* public/api/triggerables.php:
|
||
(main): Avoid spitting a warning when $id_to_triggerable doesn't contain the triggerable.
|
||
* public/v2/analysis.js:
|
||
(App.AnalysisTask.triggerable): Log an error when failed to fetch triggerables for debugging purposes.
|
||
* public/v2/app.js:
|
||
(App.AnalysisTaskController.updateRootConfigurations): Show 'None' when a revision is missing from
|
||
some of the data points. This will happen when we modify the list of projects we build for iOS.
|
||
(App.AnalysisTaskController.actions.createTestGroup): Gracefully fail by showing alerts when an user
|
||
attempts to create an invalid test group; when there is already another test group of the same or when
|
||
only either configuration specifies the revision for some repository.
|
||
(App.AnalysisTaskController._updateRootsBySelectedPoints): Fixed a typo: sets[i] -> set.
|
||
* public/v2/index.html: Don't show the form to create a new test group if it's not available.
|
||
* tools/sync-with-buildbot.py:
|
||
(find_request_updates):
|
||
(schedule_request): iOS builders take a JSON that contains the list of roots. Generate this JSON when
|
||
a dictionary of the form {rootsExcluding: ["WebKit"]} is specified. Also replaced the way we refer to
|
||
a revision from $-based text replacements to an explicit dictionary of the form {root: "WebKit"}.
|
||
(request_id_from_build): Don't hard code the parameter name here. Retrieve the name from the config.
|
||
|
||
2015-04-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add time series segmentation algorithms as moving averages
|
||
https://bugs.webkit.org/show_bug.cgi?id=143362
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
This patch implements two preliminary time series segmentation algorithms as moving averages.
|
||
|
||
Recursive t-test: Compute Welch's t-statistic at each point in a given segment of the time series.
|
||
If Welch's t-test implicates a statistically significance difference, then split the segment into two
|
||
sub segments with the maximum t-statistic (i.e. the point at which if split would yield the highest
|
||
probability that two segments do not share the same "underlying" mean in classical / frequentist sense).
|
||
We repeat this process recursively. See [1] for the evaluation of this particular algorithm.
|
||
|
||
Schwarz criterion: Use Schwarz or Bayesian information criterion to heuristically find the optimal
|
||
segmentation. Intuitively, the problem of finding the best segmentation comes down to minimizing the
|
||
residual sum of squares in each segment as in linear regressions. That is, for a given segment with
|
||
values y_1 through y_n with mean y_avg, we want to minimize the sum of (y_i - y_avg)^2 over i = 1
|
||
through i = n. However, we also don't want to split every data point into a separate segment so we need
|
||
to account the "cost" of introducing new segments. We use a cost function that's loosely based on two
|
||
models discussed in [2] for simplicity. We will tune this cost function further in the future.
|
||
|
||
The problem of finding the best segmentation then reduces to a search problem. Unfortunately, our problem
|
||
space is exponential with respect to the size of the time series since we could split at each data point.
|
||
We workaround this problem by first splitting the time series into a manageable smaller grids, and only
|
||
considering segmentation of a fixed size (i.e. the number of segments is constant). Since time series
|
||
tend to contain a lot more data points than segments, this strategy finds the optimal solution without
|
||
exploring much of the problem space.
|
||
|
||
Finding the optimal segmentation of a fixed size is, itself, another search problem that is equivalent to
|
||
finding the shortest path of a fixed length in DAG. Here, we use dynamic programming with a matrix of size
|
||
n by n where n is the length of the time series (grid). Each entry in this matrix at (i, k) stores
|
||
the minimum cost of segmenting data points 1 through i using k segments. We start our search at i = 1.
|
||
Clearly C(1, 0) = 0 (note the actual code uses 0-based index). In i-th iteration, we compute the cost
|
||
S(i, j) of each segment starting at i and ending at another point j after i and update C(j, k + 1) by
|
||
min( C(j, k + 1), C(i, k) + S(i, j) ) for all values of j above i.
|
||
|
||
[1] Kensuke Fukuda, H. Eugene Stanley, and Luis A. Nunes Amaral, "Heuristic segmentation of
|
||
a nonstationary time series", Physical Review E 69, 021108 (2004)
|
||
|
||
[2] Marc Lavielle, Gilles Teyssi`ere, "Detection of Multiple Change–Points in Multivariate Time Series"
|
||
Lithuanian Mathematical Journal, vol 46, 2006
|
||
|
||
* public/v2/index.html: Show the optional description for the chosen moving average strategy.
|
||
* public/v2/js/statistics.js:
|
||
(Statistics.testWelchsT):
|
||
(Statistics.computeWelchsT): Extracted from testWelchsT. Generalized to take the offset and the length
|
||
of each value array between which Welch's t-statistic is computed. This generalization helps the
|
||
Schwarz criterion segmentation algorithm avoid splitting values array O(n^2) times.
|
||
(.sampleMeanAndVarianceForValues): Ditto for the generalization.
|
||
(.recursivelySplitIntoTwoSegmentsAtMaxTIfSignificantlyDifferent): Added. Implements recursive t-test.
|
||
(.splitIntoSegmentsUntilGoodEnough): Added. Implements Schwarz criterion.
|
||
(.findOptimalSegmentation): Added. Implements the algorithm to find the optimal segmentation of a fixed
|
||
segment count.
|
||
(.SampleVarianceUpperTriangularMatrix): Added. Stores S(i, j) used by findOptimalSegmentation.
|
||
(.SampleVarianceUpperTriangularMatrix.prototype.costBetween): Added.
|
||
|
||
2015-04-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
REGRESSION: Perf dashboard sometimes fails to update zooming level
|
||
https://bugs.webkit.org/show_bug.cgi?id=143359
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
The bug was caused by various bugs that ended up in an exception.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane._handleFetchErrors): Removed superfluous console.log.
|
||
(App.Pane.computeStatus): Fixed the bug in r182185 that previousPoint could be null.
|
||
(App.PaneController.actions.zoomed): Update the overview when the main chart triggered a zoom.
|
||
* public/v2/index.html: Replaced all instances of href="#" by href="javascript:false" to avoid navigating
|
||
to # when Ember.js fails to attach event listeners on time.
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent._updateDimensionsIfNeeded): Avoid using a negative width or height when
|
||
the containing element's size is 0.
|
||
(App.InteractiveChartComponent._updateBrush): Ditto.
|
||
|
||
2015-04-02 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should have UI to test out anomaly detection strategies
|
||
https://bugs.webkit.org/show_bug.cgi?id=143290
|
||
|
||
Reviewed by Benjamin Poulain.
|
||
|
||
Added the UI to select anomaly detection strategies. The detected anomalies are highlighted in the graph.
|
||
|
||
Implemented the Western Electric Rules 1 through 4 in http://en.wikipedia.org/wiki/Western_Electric_rules
|
||
as well as Welch's t-test that compares the last five points to the prior twenty points.
|
||
|
||
The latter is what Mozilla uses (or at least did in the past) to detect performance regressions on their
|
||
performance tests although they compare medians instead of means.
|
||
|
||
All of these strategies don't quite work for us since our data points are too noisy but this is a good start.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane.updateStatisticsTools): Clone anomaly detection strategies.
|
||
(App.Pane._updateMovingAverageAndEnvelope): Highlight anomalies detected by the enabled strategies.
|
||
(App.Pane._movingAverageOrEnvelopeStrategyDidChange): Observe changes to anomaly detection strategies.
|
||
(App.Pane._computeMovingAverageAndOutliers): Detect anomalies by each strategy and aggregate results.
|
||
Only report the first data point when multiple consecutive data points are detected as anomalies.
|
||
* public/v2/chart-pane.css: Updated styles.
|
||
* public/v2/index.html: Added the pane for selecting anomaly detection strategies.
|
||
* public/v2/js/statistics.js:
|
||
(Statistics.testWelchsT): Added. Implements Welch's t-test.
|
||
(.sampleMeanAndVarianceForValues): Added.
|
||
(.createWesternElectricRule): Added.
|
||
(.countValuesOnSameSide): Added.
|
||
(Statistics.AnomalyDetectionStrategy): Added.
|
||
|
||
2015-03-31 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
REGRESSION: Searching commits can highlight wrong data points
|
||
https://bugs.webkit.org/show_bug.cgi?id=143272
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
The bug was caused by /api/commits returning commit times with millisecond precision whereas /api/runs
|
||
return commit times with only second precision. This resulted in the frontend code to match a commit
|
||
with the data point that included the next commit when the millisecond component of commit's timestamp
|
||
wasn't identically 0.
|
||
|
||
This discrepancy was caused by the fact PHP's strtotime only ignores milliseconds and /api/commits
|
||
was returning timestamp as string instead of parsing via Database::to_js_time as done in /api/runs
|
||
so miliseconds component was only preserved in /api/commits.
|
||
|
||
Fixed the bug by always using Database::to_js_time to return commit time. Also fixed to_js_time so that
|
||
it returns time in milisecond precision.
|
||
|
||
* public/api/commits.php:
|
||
(fetch_commits_between): Use Database::to_js_time for format commit times.
|
||
(format_commit): Ditto.
|
||
* public/include/db.php:
|
||
(Database::to_js_time): Parse and append millisecond component. Ignore sub-milliseconds for simplicity.
|
||
* public/v2/data.js:
|
||
(CommitLogs.fetchForTimeRange): The commit time is now an integer so don't call "replace" on it.
|
||
|
||
2015-03-31 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should show relative change in values
|
||
https://bugs.webkit.org/show_bug.cgi?id=143252
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
When a range of values are selected, show the percentage difference between the start and the end
|
||
in addition to the absolute value difference. When a single point is selected, show the relative
|
||
difference with respect to the previous point. Use two significant figures and always show plus sign
|
||
when the difference is positive.
|
||
|
||
* public/v2/app.js: Compute and format the relative difference.
|
||
* public/v2/chart-pane.css: Don't let commits view shrink itself when they're all collapsed.
|
||
* public/v2/index.html: Show the relative difference.
|
||
|
||
2015-03-31 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
REGRESSION(r180000): Changing moving average or enveloping strategy doesn't update the graph
|
||
https://bugs.webkit.org/show_bug.cgi?id=143254
|
||
|
||
Reviewed by Antti Koivisto.
|
||
|
||
The bug was caused by App.Pane no longer replacing 'chartData' property when updating the moving average
|
||
or the enveloping values. Fixed the bug by creating a new chartData object when the strategy is changed
|
||
so that the interactive chart component will observe a change to 'chartData'.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane._movingAverageOrEnvelopeStrategyDidChange): Added.
|
||
|
||
2015-03-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fixes.
|
||
|
||
* public/include/manifest.php:
|
||
(Manifest::generate): These should be {} instead of [] when they're empty.
|
||
* public/v2/data.js:
|
||
(Measurement.prototype.formattedRevisions): Don't assume previousRevisions[repositoryId] exits.
|
||
* public/v2/manifest.js:
|
||
(App.Metric.fullName): Fixed the typo.
|
||
* tests/admin-regenerate-manifest.js: Fixed the test.
|
||
|
||
2015-02-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Commit the erroneously reverted change.
|
||
|
||
* public/api/runs.php:
|
||
(RunsGenerator::results):
|
||
|
||
2015-02-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Loading the perf dashboard takes multiple seconds
|
||
https://bugs.webkit.org/show_bug.cgi?id=141860
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
This patch introduces the caches of JSON files returned by /api/ in /data/ directory. It also records
|
||
the last time test_runs rows associated with the requested platforms and metrics are inserted, updated,
|
||
or removed in the caches as well as the manifest JSON files ("last modified time"). Because the manifest
|
||
is regenerated each time a new test result is reported, the front end can compare last modified time in
|
||
the manifest file with that in a /api/runs JSON cache to detect the stale-ness.
|
||
|
||
More concretely, the front end first optimistically fetches the JSON in /data/. If the cache doesn't exit
|
||
or the last modified time in the cache doesn't match with that in the manifest file, it would fetch it
|
||
again via /api/runs. In the case the cache did exist, we render the charts based on the cache meanwhile.
|
||
This dramatically reduces the perceived latency for the page load since charts are drawn immediately using
|
||
the cache and we would only re-render the charts as new up-to-date JSON comes in.
|
||
|
||
This patch also changes the format of runs JSONs by pushing the exiting properties into 'configurations'
|
||
and adding 'lastModified' and 'elapsedTime' at the top level.
|
||
|
||
* init-database.sql: Added config_runs_last_modified to test_configurations table as well as a trigger to
|
||
auto-update this column upon changes to test_runs table.
|
||
|
||
* public/admin/test-configurations.php:
|
||
(add_run): Regenerate the manifest file to invalidate the /api/runs JSON cache.
|
||
(delete_run): Ditto.
|
||
|
||
* public/api/runs.php:
|
||
(main): Fetch all columns of test_configurations table including config_runs_last_modified. Also generate
|
||
the cache in /data/ directory.
|
||
(RunsGenerator::__construct): Compute the last modified time for this (platform, metric) pair.
|
||
(RunsGenerator::results): Put the old content in 'configurations' property and include 'lastModified' and
|
||
'elapsedTime' properties. 'elapsedTime' is added for debugging purposes.
|
||
(RunsGenerator::add_runs):
|
||
(RunsGenerator::parse_revisions_array):
|
||
|
||
* public/include/db.php:
|
||
(CONFIG_DIR): Added.
|
||
(generate_data_file): Added based on ManifestGenerator::store.
|
||
(Database::to_js_time): Extracted from RunsGenerator::add_runs to share code.
|
||
|
||
* public/include/json-header.php:
|
||
(echo_success): Renamed from success_json. Return the serialized JSON instead of echo'ing it so that we can
|
||
generate caches in /api/runs/.
|
||
(exit_with_success):
|
||
|
||
* public/include/manifest.php:
|
||
(ManifestGenerator::generate): Added 'elapsedTime' property for the time taken to generate the manifest.
|
||
It seems like we're generating it in 200-300ms for now so that's good.
|
||
(ManifestGenerator::store): Uses generate_data_file.
|
||
(ManifestGenerator::platforms): Added 'lastModified' array to each platform entry. This array contains the
|
||
last modified time for each (platform, metric) pair.
|
||
|
||
* public/index.html:
|
||
(fetchTest): Updated per the format change in runs JSON.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane._fetch): Fetch the cached JSON first. Refetch the uncached version if instructed as such.
|
||
(App.Pane._updateChartData): Extracted from App.Pane._fetch.
|
||
(App.Pane._handleFetchErrors): Ditto.
|
||
|
||
* public/v2/data.js:
|
||
(RunsData.fetchRuns): Takes the fourth argument indicating whether we should fetch the cached version or not.
|
||
The cached JSON is located in /data/ with the same filename. When fetching a cached JSON results in 404,
|
||
fulfill the promise with null as the result instead of rejecting it. The only client of this function which
|
||
sets useCache to true is App.Manifest.fetchRunsWithPlatformAndMetric, and it handles this special case.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.DateArrayTransform): Added. Handles the array of last modified dates in platform objects.
|
||
(App.Platform.lastModifiedTimeForMetric): Added. Returns the last modified date in the manifest JSON.
|
||
(App.Manifest.fetchRunsWithPlatformAndMetric): Takes "useCache" like RunsData.fetchRuns. Set shouldRefetch
|
||
to true if response is null (the cache didn't exit) or the cache is out-of-date.
|
||
(App.Manifest._formatFetchedData): Extracted from App.Manifest.fetchRunsWithPlatformAndMetric.
|
||
|
||
* run-tests.js:
|
||
(initializeDatabase): Avoid splitting function definitions in the middle.
|
||
|
||
* tests/api-report.js: Added tests to verify that reporting new test results updates the last modified time
|
||
in test_configurations.
|
||
|
||
2015-02-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
REGRESSION(r180333): Analysis tasks can't be associated with bugs
|
||
https://bugs.webkit.org/show_bug.cgi?id=141858
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Added back the erroneously removed table to associate bugs. Also moved "details-table-container" div outside
|
||
of the chart-details partial template as it needs to wrap associate bugs in analysis task pages.
|
||
|
||
* public/v2/chart-pane.css:
|
||
* public/v2/index.html:
|
||
|
||
2015-02-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Selecting revisions for A/B testing is hard
|
||
https://bugs.webkit.org/show_bug.cgi?id=141824
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Update the revisions used in A/B testing based on the selection in the overview chart. This allows users to
|
||
intuitively select revisions based on points shown in the chart. Removed the old select elements used to
|
||
select A/B testing points manually.
|
||
|
||
Also renamed 'testSets' to 'configurations', 'roots' to 'rootConfigurations', and 'revisions' in each root's
|
||
sets to 'options' for clarity.
|
||
|
||
* public/v2/app.css: Reorganized style rules.
|
||
|
||
* public/v2/app.js:
|
||
(App.AnalysisTaskController):
|
||
(App.AnalysisTaskController._taskUpdated): Merged updateTestGroupPanes.
|
||
(App.AnalysisTaskController._chartDataChanged): Renamed from paneDomain. It's now an observer instead of
|
||
a property, which sets 'overviewDomain' property as well as other properties.
|
||
(App.AnalysisTaskController.updateRootConfigurations): Renamed from updateRoots.
|
||
(App.AnalysisTaskController._updateRootsBySelectedPoints): Added. Select roots based on the selected points
|
||
in the overview chart.
|
||
|
||
* public/v2/chart-pane.css: Added arrows next to the configuration names (e.g. 'A') to indicate whether
|
||
individual build requests / test results are shown or not.
|
||
|
||
* public/v2/index.html: Removed the select element per configuration column. Also moved the select element
|
||
for the number of runs as it doesn't belong in the same table as the one that lists repositories and roots.
|
||
|
||
2015-02-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed test fixes after r179037, r179591, and r179763.
|
||
|
||
* tests/admin-regenerate-manifest.js:
|
||
* tests/admin-reprocess-report.js:
|
||
|
||
2015-02-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Relationship between A/B testing results are unclear
|
||
https://bugs.webkit.org/show_bug.cgi?id=141810
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Show a "reference chart" indicating which two points have been tested in each test group pane.
|
||
|
||
Now the chart shown at the top of an analysis task page is called the "overview pane", and we use the pane
|
||
and the domain used in this chart to show charts in each test group.
|
||
|
||
Also renamed an array of revisions used in the A/B test results tables from 'revisions' to 'revisionList'.
|
||
|
||
* public/v2/analysis.js:
|
||
(App.TestGroup._fetchTestResults): Renamed from _fetchChartData. Set 'testResults' instead of 'chartData'
|
||
since this is the results of A/B testing results, not the data for charts shown next to them.
|
||
|
||
* public/v2/app.css: Added CSS rules for reference charts.
|
||
|
||
* public/v2/app.js:
|
||
(App.AnalysisTaskController.paneDomain): Set 'overviewPane' and 'overviewDomain' on each test group pane.
|
||
(App.TestGroupPane._populate): Updated per 'chartData' to 'testResults' rename.
|
||
(App.TestGroupPane._updateReferenceChart): Get the chart data via the overview pane and find points that
|
||
identically matches root sets. If one of configuration used a set of revisions for which no measurement
|
||
was made in the original chart, don't show the reference chart as that would be misleading / confusing.
|
||
(App.TestGroupPane._computeRepositoryList): Updated per 'chartData' to 'testResults' rename.
|
||
(App.TestGroupPane._createConfigurationSummary): Ditto. Also renamed 'revisions' to 'revisionList'.
|
||
In addition, renamed 'buildNumber' to 'buildLabel' and prefixed it with "Build ".
|
||
|
||
* public/v2/data.js:
|
||
(Measurement.prototype.revisionForRepository): Added.
|
||
(Measurement.prototype.commitTimeForRepository): Cleanup.
|
||
(TimeSeries.prototype.findPointByRevisions): Added. Finds a point based on a set of revisions.
|
||
|
||
* public/v2/index.html: Added the reference chart. Streamlined the status label for each build request
|
||
by including the build number in the title attribute instead of in the markup.
|
||
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent._updateDomain): Fixed a typo introduced as a consequence of r179913.
|
||
(App.InteractiveChartComponent._computeYAxisDomain): Expand the y-axis to show the highlighted points.
|
||
(App.InteractiveChartComponent._highlightedItemsChanged): Adjust the y-axis as needed.
|
||
|
||
2015-02-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Analysis task pages are unusable
|
||
https://bugs.webkit.org/show_bug.cgi?id=141786
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
This patch makes following improvements to analysis task pages:
|
||
1. Making the main chart interactive. This change required the use of App.Pane as well as moving the code to
|
||
compute the data for the details pane from PaneController.
|
||
2. Moving the form to add a new test group to the top of test groups instead of the bottom of them.
|
||
3. Grouping the build requests in each test group by root sets instead of the order by which they were ran.
|
||
This change required the creation of App.TestGroupPane as well as its methods.
|
||
4. Show a box plot for each root set configuration as well as each build request. This change required
|
||
App.BoxPlotComponent.
|
||
5. Show revisions of each repository (e.g. WebKit) for each root set and build request.
|
||
|
||
* public/api/build-requests.php:
|
||
(main): Update per the rename of BuildRequestsFetcher::root_sets to BuildRequestsFetcher::root_sets_by_id.
|
||
|
||
* public/api/test-groups.php:
|
||
(main): Include root sets and roots in the response.
|
||
(format_test_group):
|
||
|
||
* public/include/build-requests-fetcher.php:
|
||
(BuildRequestsFetcher::root_sets_by_id): Renamed from root_sets.
|
||
(BuildRequestsFetcher::root_sets): Added.
|
||
(BuildRequestsFetcher::roots): Added.
|
||
(BuildRequestsFetcher::fetch_roots_for_set): Takes a boolean argument $resolve_ids. This flag is only set to
|
||
true in /api/build-requests/ (as done prior to this patch) to use repository names as identifiers since
|
||
tools/sync-with-buildbot.py can't convert repository names to their ids.
|
||
|
||
* public/v2/analysis.js:
|
||
(App.Root): Added.
|
||
(App.RootSet): Added.
|
||
(App.RootSet.revisionForRepository): Added.
|
||
(App.TestGroup.rootSets): Deleted the code to compute root set ids from build requests now that the JSON
|
||
response at /api/test-groups will include them.
|
||
(App.BuildRequest): Ditto. Also deleted 'configLetter' property, which has been moved to a proxy created by
|
||
_createConfigurationSummary.
|
||
(App.BuildRequest.statusLabel): Use 'Completed' as the human readable label for 'completed' status.
|
||
(App.BuildRequest.aggregateStatuses): Added. Generates a human readable status for a set of build requests.
|
||
|
||
* public/v2/app.css: Updated style rules for analysis task pages.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane): This class is now used in analysis task pages to make the main chart interactive.
|
||
(App.Pane._updateDetails): Moved from App.PaneController.
|
||
|
||
(App.PaneController._updateCanAnalyze): Updated the code per the move of selectedPoints.
|
||
|
||
(App.AnalysisTaskController): Added 'details'.
|
||
(App.AnalysisTaskController._taskUpdated):
|
||
(App.AnalysisTaskController.paneDomain):Renamed from _fetchedRuns.
|
||
(App.AnalysisTaskController.updateTestGroupPanes): Added. Creates App.TestGroupPane for each test group.
|
||
(App.AnalysisTaskController.actions.toggleShowRequestList): Added.
|
||
|
||
(App.TestGroupPane): Added.
|
||
(App.TestGroupPane._populate): Added. Group build requests by root sets and create a summary for each group.
|
||
(App.TestGroupPane._computeRepositoryList): Added. Returns a sorted list of repositories which is the union
|
||
of all repositories appearing in root sets and builds associated with A/B testing results.
|
||
(App.TestGroupPane._groupRequestsByConfigurations): Added. Groups build requests by root sets.
|
||
(App.TestGroupPane._createConfigurationSummary): Added. Creates a summary for a group of build requests that
|
||
use the same root set. We start by wrapping "raw" build requests in a proxy with formatted values,
|
||
build numbers, etc... obtained from the fetched chart data. The list of revisions shown in the group summary
|
||
is a union of revisions in the root set and the first build request in the group. We null-out revision info
|
||
for a build request if it is identical to the one in the summary. The range of values is expanded as needed
|
||
by the values in the group as well as 95% percentile confidence interval.
|
||
|
||
(App.BoxPlotComponent): Added. Controls a box plot shown for each test group summary and build request.
|
||
(App.BoxPlotComponent.didInsertElement): Added. Inserts a SVG element as well as two indicator rects to show
|
||
the mean and the confidence interval.
|
||
(App.BoxPlotComponent._updateBars): Added. Updates the dimensions of the indicator rects.
|
||
(App.BoxPlotComponent.valueChanged): Added. Computes the relative dimensions of the indicator rects and
|
||
calls _updateBars to update the rects.
|
||
|
||
* public/v2/chart-pane.css: Added some style rules to be used in the details pane in analysis task pages.
|
||
|
||
* public/v2/data.js:
|
||
(Measurement.prototype.formattedRevisions):
|
||
(Measurement.formatRevisionRange): Renamed from Measurement.prototype._formatRevisionRange so that it can be
|
||
called in _createConfigurationSummary.
|
||
|
||
* public/v2/index.html: Updated the templates for analysis task pages. Moved the form to create a new test
|
||
group above all test groups, and replaced the list of data points by "details" pane used in the charts page.
|
||
Also made the fetching of chartData no longer block showing of test groups.
|
||
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent._updateDomain): Added an early exit to fix a newly revealed race condition.
|
||
(App.InteractiveChartComponent._domainChanged): Ditto.
|
||
(App.InteractiveChartComponent._updateSelectionToolbar): Made it respect 'zoomable' boolean property.
|
||
|
||
* public/v2/js/statistics.js:
|
||
(Statistics.min): Added.
|
||
(Statistics.max): Added.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Manifest.fetchRunsWithPlatformAndMetric): Added formatWithDeltaAndUnit to be used in _createConfigurationSummary.
|
||
|
||
2015-02-14 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build URL on new perf dashboard doesn't resolve $builderName
|
||
https://bugs.webkit.org/show_bug.cgi?id=141583
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Support $builderName in the build URL template.
|
||
|
||
* public/js/helper-classes.js:
|
||
(TestBuild.buildUrl): Replaced $builderName with the builder name.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Metric.fullName): Fixed the typo. We need &ni, not &in.
|
||
(App.BuilderurlFromBuildNumber): Replaced $builderName with the builder name.
|
||
|
||
2015-02-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix after r179591.
|
||
|
||
* public/api/commits.php:
|
||
|
||
2015-02-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
The status of a A/B testing request always eventually becomes "Failed"
|
||
https://bugs.webkit.org/show_bug.cgi?id=141523
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
The bug was caused by /api/build-requests always setting the status of a build request to 'failed' when
|
||
'failedIfNotCompleted' was sent by the buildbot sync'er.
|
||
|
||
Fixed the bug by only setting the status to 'failed' if it wasn't set to 'completed'.
|
||
|
||
* public/api/build-requests.php:
|
||
(main):
|
||
|
||
2015-02-13 Csaba Osztrogonác <ossy@webkit.org>
|
||
|
||
Unreviewed, remove empty directories.
|
||
|
||
* public/data: Removed.
|
||
|
||
2015-02-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should show the results of A/B testing
|
||
https://bugs.webkit.org/show_bug.cgi?id=141500
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added the support for fetching test_runs for a specific test group in /api/runs/, and used it in the
|
||
analysis task page to fetch results for each test group.
|
||
|
||
Merged App.createChartData into App.Manifest.fetchRunsWithPlatformAndMetric so that App.BuildRequest
|
||
can use the formatter.
|
||
|
||
* public/api/runs.php:
|
||
(fetch_runs_for_config_and_test_group): Added.
|
||
(fetch_runs_for_config): Just return the fetched rows since main will format them with RunsGenerator.
|
||
(main): Use fetch_runs_for_config_and_test_group to fetch rows when a test group id is specified. Also
|
||
use RunsGenerator to format results.
|
||
(RunsGenerator): Added.
|
||
(RunsGenerator::__construct): Added.
|
||
(RunsGenerator::add_runs): Added.
|
||
(RunsGenerator::format_run): Moved.
|
||
(RunsGenerator::parse_revisions_array): Moved.
|
||
|
||
* public/v2/analysis.js:
|
||
(App.TestGroup): Fixed a typo. The property on a test group that refers to an analysis task is "task".
|
||
(App.TestGroup._fetchChartData): Added. Fetches all A/B testing results for this group.
|
||
(App.BuildRequest.configLetter): Renamed from config since this returns a letter that identifies the
|
||
configuration associated with this build request such as "A" and "B".
|
||
(App.BuildRequest.statusLabel): Added the missing label for failed build requests.
|
||
(App.BuildRequest.url): Added. Returns the URL associated with this build request.
|
||
(App.BuildRequest._meanFetched): Added. Retrieve the mean and the build number for this request via
|
||
_fetchChartData.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane._fetch): Set chartData directly here.
|
||
(App.Pane._updateMovingAverageAndEnvelope): Renamed from _computeChartData. No longer sets chartData
|
||
now that it's done in App.Pane._fetch.
|
||
(App.AnalysisTaskController._fetchedRuns): Updated per createChartData merge.
|
||
|
||
* public/v2/data.js:
|
||
(Measurement.prototype.buildId): Added.
|
||
(TimeSeries.prototype.findPointByBuild): Added.
|
||
|
||
* public/v2/index.html: Fixed a bug that build status URL was broken. We can't use link-to helper since
|
||
url is not an Ember routed path.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Manifest.fetchRunsWithPlatformAndMetric): Takes testGroupId as the third argument. Merged
|
||
App.createChartData here so that App.BuildRequest can use the formatter
|
||
|
||
2015-02-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
v2 UI should adjust the number of ticks on dashboards based on screen size
|
||
https://bugs.webkit.org/show_bug.cgi?id=141502
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent._updateDimensionsIfNeeded): Compute the number of ticks based on the
|
||
content size.
|
||
|
||
2015-02-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New perf dashboard shows too much space around interesting data points
|
||
https://bugs.webkit.org/show_bug.cgi?id=141487
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Revise the y-axis range adjustment algorithm in r179913. Instead of showing the entire moving average,
|
||
show the current time series excluding points in the series outside the moving average envelope.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane._computeChartData): Don't deal with missing moving average or enveloping strategy here.
|
||
(App.Pane._computeMovingAverageAndOutliers): Set isOutliner to true on all data points in the current
|
||
time series if the point lies outside the moving average envelope. Don't expose the moving average or
|
||
the envelope computed for this purpose if they're not set by the user.
|
||
|
||
* public/v2/data.js:
|
||
(TimeSeries.prototype.minMaxForTimeRange): Takes a boolean argument, ignoreOutlier. When the flag is set
|
||
to true, min/max computation will ignore any point in the series with non-falsy "isOutliner" property.
|
||
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent._constructGraphIfPossible): Unsupport hideMovingAverage and hideEnvelope.
|
||
(App.InteractiveChartComponent._computeYAxisDomain): Removed the commented out code. Also moved the code
|
||
to deal with showFullYAxis here.
|
||
(App.InteractiveChartComponent._minMaxForAllTimeSeries): Rewrote the code. Takes ignoreOutliners as an
|
||
argument instead of directly inspecting showFullYAxis.
|
||
|
||
2015-02-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New perf dashboard shouldn't always show outliners
|
||
https://bugs.webkit.org/show_bug.cgi?id=141445
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Use the simple moving average with an average difference envelope to compute the y-axis range to show
|
||
to avoid expanding it spuriously to show one off outlier.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane): Don't show the full y-axis range by default.
|
||
(App.Pane._computeChartData): Use the first strategies for the moving average and the enveloping if
|
||
one is not specified by the user but without showing them in the charts.
|
||
(App.Pane._computeMovingAverage): Takes moving average and enveloping strategies as arguments instead
|
||
of retrieving via chosenMovingAverageStrategy and chosenEnvelopingStrategy.
|
||
|
||
(App.ChartsController._parsePaneList): Added showFullYAxis as a query string argument to each pane.
|
||
(App.ChartsController._serializePaneList): Ditto.
|
||
|
||
* public/v2/chart-pane.css: Added a CSS rule for when y-axis is clickable.
|
||
|
||
* public/v2/index.html: Pass in showFullYAxis as an argument to the main interactive chart.
|
||
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent._constructGraphIfPossible): Add an event listener on y-axis labels when
|
||
the chart is interactive so that toggle showFullYAxis. Also hide the moving average and/or the envelope
|
||
if they are not specified by the user (i.e. only used to adjust y-axis range).
|
||
(App.InteractiveChartComponent._updateDomain): Don't exit early if y-axis domains are different even if
|
||
x-axis domain remained the same. Without this change, the charts would never redraw.
|
||
(App.InteractiveChartComponent._minMaxForAllTimeSeries): Use the moving average instead of the current
|
||
time series to compute the y-axis range if showFullYAxis is false. When showFullYAxis is true, expand
|
||
y-axis all the way down to 0 or the minimum value in the current time series whichever is smaller.
|
||
|
||
* public/v2/js/statistics.js:
|
||
(Statistics.MovingAverageStrategies): Use a wider window in Simple Moving Average by default.
|
||
|
||
2015-02-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix.
|
||
|
||
* public/v2/app.js:
|
||
(set get App.Pane.Ember.Object.extend):
|
||
|
||
2015-02-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New perf dashboard should have the ability to overlay moving average with an envelope
|
||
https://bugs.webkit.org/show_bug.cgi?id=141438
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
This patch adds three kinds of moving average strategies and two kinds of enveloping strategies:
|
||
|
||
Simple Moving Average - The moving average x̄_i of x_i is computed as the arithmetic mean of values
|
||
from x_(i - n) though x_(i + m) where n is a non-negative integer and m is a positive integer. It takes
|
||
n, backward window size, and m, forward window size, as an argument.
|
||
|
||
Cumulative Moving Average - x̄_i is computed as the arithmetic mean of all values x_0 though x_i.
|
||
That is, x̄_1 = x_1 and x̄_i = ((i - 1) * M_(i - 1) + x_i) / i for all i > 1.
|
||
|
||
Exponential Moving Average - x̄_i is computed as the weighted average of x_i and x̄_(i - 1) with α as
|
||
an argument specifying x_i's weight. To be precise, x̄_1 = x_1 and x̄_i = α * x_i + (α - 1) x̄_(i-1).
|
||
|
||
|
||
Average Difference - The enveloping delta d is computed as the arithmetic mean of the difference
|
||
between each x_i and x̄_i.
|
||
|
||
Moving Average Standard Deviation - d is computed like the standard deviation except the deviation
|
||
for each term is measured from the moving average instead of the sample arithmetic mean. i.e. it uses
|
||
the average of (x_i - x̄_i)^2 as the "sample variance" instead of the conventional (x_i - x̄)^2 where
|
||
x̄ is the sample mean of all x_i's. This change was necessary since our time series is non-stationary.
|
||
|
||
|
||
Each strategy is cloned for an App.Pane instance so that its parameterList can be configured per pane.
|
||
The configuration of the currently chosen strategies is saved in the query string for convenience.
|
||
|
||
Also added the "stat pane" to choose a moving average strategy and a enveloping strategy in each pane.
|
||
|
||
* public/v2/app.css: Specify the fill color for all SVG groups in the pane toolbar icons.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane._fetch): Delegate the creation of 'chartData' to _computeChartData.
|
||
(App.Pane.updateStatisticsTools): Added. Clones moving average and enveloping strategies for this pane.
|
||
(App.Pane._cloneStrategy): Added. Clones a strategy for a new pane.
|
||
(App.Pane._configureStrategy): Added. Finds and configures a strategy from the configuration retrieved
|
||
from the query string via ChartsController.
|
||
(App.Pane._computeChartData): Added. Creates chartData from fetchedData.
|
||
(App.Pane._computeMovingAverage): Added. Computes the moving average and the envelope.
|
||
(App.Pane._executeStrategy): Added.
|
||
(App.Pane._updateStrategyConfigIfNeeded): Pushes the strategy configurations to the query string via
|
||
ChartsController.
|
||
(App.ChartsController._parsePaneList): Merged the query string arguments for the range and point
|
||
selections, and added two new arguments for the moving average and the enveloping configurations.
|
||
(App.ChartsController._serializePaneList): Ditto.
|
||
(App.ChartsController._scheduleQueryStringUpdate): Observes strategy configurations.
|
||
(App.PaneController.actions.toggleBugsPane): Hides the stat pane.
|
||
(App.PaneController.actions.toggleSearchPane): Hides the stat pane.
|
||
(App.PaneController.actions.toggleStatPane): Added.
|
||
|
||
* public/v2/chart-pane.css: Added CSS rules for the new stat pane. Also added .foreground class for the
|
||
current (as opposed to baseline and target) time series for when it's the most foreground graph without
|
||
moving average and its envelope overlapping on top of it.
|
||
|
||
* public/v2/index.html: Added the templates for the stat pane and the corresponding icon (Σ).
|
||
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent.chartDataDidChange): Unset _totalWidth and _totalHeight to avoid exiting
|
||
early inside _updateDimensionsIfNeeded when chartData changes after the initial layout.
|
||
(App.InteractiveChartComponent.didInsertElement): Attach event listeners here instead of inside
|
||
_constructGraphIfPossible since that could be called multiple times on the same SVG element.
|
||
(App.InteractiveChartComponent._constructGraphIfPossible): Clear down the old SVG element we created
|
||
but don't bother removing individual paths and circles. Added the code to show the moving average time
|
||
series when there is one. Also add "foreground" class on SVG elements for the current time series when
|
||
we're not showing the moving average. chart-pane.css has been updated to "dim down" the current time
|
||
series when "foreground" is not set.
|
||
(App.InteractiveChartComponent._minMaxForAllTimeSeries): Take the moving average time series into
|
||
account when computing the y-axis range.
|
||
(App.InteractiveChartComponent._brushChanged): Removed 'selectionIsLocked' argument as it's useless.
|
||
|
||
* public/v2/js/statistics.js:
|
||
(Statistics.MovingAverageStrategies): Added.
|
||
(Statistics.EnvelopingStrategies): Added.
|
||
|
||
2015-02-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
The delta value in the chart pane sometimes doens't show '+' for a positive delta
|
||
https://bugs.webkit.org/show_bug.cgi?id=141340
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
The bug was caused by computeStatus prefixing the value delta with '+' if it's greater than 0 after
|
||
it had already been formatted. Fixed the bug by using a formatter that always emits a sign symbol.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane.computeStatus):
|
||
(App.createChartData):
|
||
|
||
2015-02-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix. currentPoint wasn't defined when selectedPoints was used to find points.
|
||
|
||
* public/v2/app.js:
|
||
(App.PaneController._updateDetails):
|
||
|
||
2015-02-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed. Commit the forgotten change.
|
||
|
||
* public/include/manifest.php:
|
||
|
||
2015-02-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New perf dashboard should have multiple dashboard pages
|
||
https://bugs.webkit.org/show_bug.cgi?id=141339
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Added the support for multiple dashboard pages. Also added the status of the latest data point.
|
||
e.g. "5% better than target"
|
||
|
||
* public/v2/app.css: Tweaked the styles to work around the fact Ember.js creates empty script elements.
|
||
Also hid the border lines around charts on the dashboard page for a cleaner look.
|
||
|
||
* public/v2/app.js:
|
||
(App.IndexRoute): Added. Navigate to /dashboard/<defaultDashboardName> once the manifest.json is loaded.
|
||
(App.IndexRoute.beforeModel): Added.
|
||
(App.DashboardRoute): Added.
|
||
(App.DashboardRoute.model): Added. Return the dashboard specified by the name.
|
||
(App.CustomDashboardRoute): Added. This route is used for a customized dashboard specified by "grid".
|
||
(App.CustomDashboardRoute.model): Create a dashboard model from "grid" query parameter.
|
||
(App.CustomDashboardRoute.renderTemplate): Use the dashboard template.
|
||
(App.DashboardController): Renamed from App.IndexController.
|
||
(App.DashboardController.modelChanged): Renamed from gridChanged. Removed the code to deal with "grid"
|
||
and "defaultDashboard" as these are taken care of by newly added routers.
|
||
(App.DashboardController.computeGrid): Renamed from updateGrid. No longer updates "grid" since this is
|
||
now done in actions.toggleEditMode.
|
||
(App.DashboardController.actions.toggleEditMode): Navigate to CustomDashboardRoute when start editing
|
||
an existing dashboard.
|
||
|
||
(App.Pane.computeStatus): Moved from App.PaneController so that to be called in App.Pane.latestStatus.
|
||
Also moved the code to compute the delta with respect to the previous data point from _updateDetails.
|
||
(App.Pane._relativeDifferentToLaterPointInTimeSeries): Ditto.
|
||
(App.Pane.latestStatus): Added. Used by the dashboard template to show the status of the latest result.
|
||
|
||
(App.createChartData): Added deltaFormatter to show less significant digits for differences.
|
||
|
||
(App.PaneController._updateDetails): Updated per changes to computeStatus.
|
||
|
||
* public/v2/chart-pane.css: Added style rules for the status labels on the dashboard.
|
||
|
||
* public/v2/data.js:
|
||
(TimeSeries.prototype.lastPoint): Added.
|
||
|
||
* public/v2/index.html: Prefetch manifest.json as soon as possible, show the latest data points' status
|
||
on the dashboard, and enumerate all predefined dashboards.
|
||
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent._relayoutDataAndAxes): Slightly adjust the offset at which we show unit
|
||
for the dashboard page.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Dashboard): Inherit from App.NameLabelModel now that each predefined dashboard has a name.
|
||
(App.MetricSerializer.normalizePayload): Parse all predefined dashboards instead of a single dashboard.
|
||
IDs are generated for each dashboard for forward compatibility.
|
||
(App.Manifest):
|
||
(App.Manifest.dashboardByName): Added.
|
||
(App.Manifest.defaultDashboardName): Added.
|
||
(App.Manifest._fetchedManifest): Create dashboard model objects for all predefined ones.
|
||
|
||
2015-02-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Move commits viewer to the end of details view
|
||
https://bugs.webkit.org/show_bug.cgi?id=141315
|
||
|
||
Rubber-stamped by Andreas Kling.
|
||
|
||
Show the difference instead of the old value per kling's request.
|
||
|
||
* public/v2/app.js:
|
||
(App.PaneController._updateDetails):
|
||
* public/v2/index.html:
|
||
|
||
2015-02-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Move commits viewer to the end of details view
|
||
https://bugs.webkit.org/show_bug.cgi?id=141315
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Improved the way list of commits are shown per kling's request.
|
||
|
||
* public/v2/app.js:
|
||
(App.PaneController._updateDetails): Always show the old value even when a single point is selected.
|
||
|
||
* public/v2/chart-pane.css: Updated the style for the commits viewer.
|
||
|
||
* public/v2/commits-viewer.js:
|
||
(App.CommitsViewerComponent): Added "visible" property to hide the list of commits.
|
||
(App.CommitsViewerComponent.actions.toggleVisibility): Added. Toggles "visible" property.
|
||
|
||
* public/v2/index.html: Updated the template for commits viewer to support "visible" property. Also
|
||
moved the commits viewers out of the details tables so that they don't interleave revision data.
|
||
|
||
2015-02-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New perf dashboard should compare results to baseline and target
|
||
https://bugs.webkit.org/show_bug.cgi?id=141286
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Compare the selected value against baseline and target values as done in v1. e.g. "5% below target"
|
||
Also use d3.format to format the selected value to show four significant figures.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane.searchCommit):
|
||
(App.Pane._fetch): Create time series here via createChartData so that _computeStatus can use them
|
||
to compute the status text without having to recreate them.
|
||
(App.createChartData): Added.
|
||
(App.PaneController._updateDetails): Use 3d.format on current and old values.
|
||
(App.PaneController._computeStatus): Added. Computes the status text.
|
||
(App.PaneController._relativeDifferentToLaterPointInTimeSeries): Added.
|
||
(App.AnalysisTaskController._fetchedManifest): Use createChartData as done in App.Pane._fetch. Also
|
||
format the values using chartData.formatter.
|
||
|
||
* public/v2/chart-pane.css: Enlarge the status text. Show the status text in red if it's worse than
|
||
the baseline and in blue if it's better than the target.
|
||
|
||
* public/v2/data.js:
|
||
(TimeSeries.prototype.findPointAfterTime): Added.
|
||
|
||
* public/v2/index.html: Added a new tbody for the status text and the selected value. Also fixed
|
||
the bug that we were not showing the old value's unit.
|
||
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent._constructGraphIfPossible): Use chartData.formatter. Also cleaned up
|
||
the code to show the baseline and the target lines.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Manifest.fetchRunsWithPlatformAndMetric): Added smallerIsBetter.
|
||
|
||
2015-02-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix.
|
||
|
||
* public/v2/app.js:
|
||
(App.IndexController.gridChanged): Use store.createRecord to create a custom dashboard as required by Ember.js
|
||
|
||
2015-02-04 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New perf dashboard doesn't preserve the number of days when clicking on a dashboard chart
|
||
https://bugs.webkit.org/show_bug.cgi?id=141280
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Fixed the bug by passing in "since" as a query parameter to the charts page.
|
||
|
||
Also fixed the styling issue that manifests when a JSON fetching fails on "Dashboard" page.
|
||
|
||
* public/v2/app.css: Fixed CSS rules for error messages shown in the place of charts.
|
||
* public/v2/app.js:
|
||
(App.IndexController): Changed the default number of days from one month to one week.
|
||
(App.IndexController._sharedDomainChanged): Set "since" property on the controller.
|
||
* public/v2/index.html: Pass in "since" property on the controller as a query parameter.
|
||
|
||
2015-02-04 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New perf dashboard erroneously clears zoom when poping history items
|
||
https://bugs.webkit.org/show_bug.cgi?id=141278
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bug was caused by _sharedZoomChanged updating overviewSelection without updating mainPlotDomain.
|
||
|
||
Updating overviewSelection resulted in _overviewSelectionChanged, which observes changes to overviewSelection,
|
||
to schedule a call to propagateZoom, which in turn overrode "sharedZoom" we just parsed from the query string.
|
||
|
||
* public/v2/app.js:
|
||
(App.PaneController._overviewSelectionChanged): Don't schedule propagateZoom if the selected domain is already
|
||
shown in the main plot.
|
||
(App.PaneController._sharedZoomChanged): Set both overviewSelection and mainPlotDomain to avoid overriding
|
||
"sharedZoom" via propagateZoom inside _overviewSelectionChanged.
|
||
|
||
2015-02-04 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New perf dashboard shows null as the aggregator name if no aggregation is done
|
||
https://bugs.webkit.org/show_bug.cgi?id=141256
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Don't show the aggregator name if there isn't one.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Metric.label):
|
||
|
||
2015-02-04 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix after r179611.
|
||
|
||
* public/v2/interactive-chart.js:
|
||
|
||
2015-02-04 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard doesn’t show the right unit for Safari UI tests
|
||
https://bugs.webkit.org/show_bug.cgi?id=141238
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Safari UI tests use custom metrics that end with "Time". This patch teaches the perf dashboard how to
|
||
get the unit for a given metric based on the suffix of the metric name instead of hard-coding the mapping
|
||
between metrics and their units.
|
||
|
||
* public/js/helper-classes.js:
|
||
(PerfTestRuns): Use the suffix of the metric name to compute the unit.
|
||
* public/v2/manifest.js:
|
||
(App.Manifest.fetchRunsWithPlatformAndMetric): Ditto. Also set "useSI" property iff for "bytes".
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent._constructGraphIfPossible): Respect useSI. Use toPrecision(3) otherwise.
|
||
(App.InteractiveChartComponent._relayoutDataAndAxes): Place the unit vertically on the left of ticks.
|
||
|
||
2015-02-04 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Interactive chart component provides two duplicate API for highlighting points
|
||
https://bugs.webkit.org/show_bug.cgi?id=141234
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Prior to this patch, the interactive chart component supported highlightedItems for finding commits
|
||
on the main charts page and markedPoints to show the two end points in the analysis task page.
|
||
|
||
This patch merges markedPoints into highlightedItems.
|
||
|
||
* public/v2/app.js:
|
||
(App.AnalysisTaskController._fetchedRuns): Use highlightedItems.
|
||
* public/v2/chart-pane.css:
|
||
* public/v2/index.html: Ditto.
|
||
* public/v2/interactive-chart.js:
|
||
(App.InteractiveChartComponent._constructGraphIfPossible): Make this._highlights an array instead of
|
||
array of arrays. Also call _highlightedItemsChanged at the end to fix the bug that we never highlight
|
||
items if highlightedItems was set before the initial layout.
|
||
(App.InteractiveChartComponent._relayoutDataAndAxes):
|
||
(App.InteractiveChartComponent._updateHighlightPositions): Now that highlights are circles instead of
|
||
vertical lines, just set cx and cy as done for other "dots".
|
||
(App.InteractiveChartComponent._highlightedItemsChanged): Exit early only if _clippedContainer wasn't
|
||
already set; i.e. _constructGraphIfPossible hasn't been called. Also updated the logic to accommodate
|
||
the fact this._highlights is an array of elements instead of an array of arrays of elements. Finally,
|
||
set the radius of highlight circles here.
|
||
|
||
2015-02-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Don’t use repository names as id’s.
|
||
https://bugs.webkit.org/show_bug.cgi?id=141226
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
Not using repository names as their id's reduces the need to fetch the entire repositories table.
|
||
Since names of repositories are available in manifest.json, we can resolve their names in the front end.
|
||
|
||
* Websites/perf.webkit.org/public/api/runs.php:
|
||
(parse_revisions_array): No longer uses $repository_id_to_name.
|
||
(main): No longer populates $repository_id_to_name.
|
||
|
||
* Websites/perf.webkit.org/public/api/triggerables.php:
|
||
(main): Don't resolve repository names.
|
||
|
||
* Websites/perf.webkit.org/public/include/manifest.php:
|
||
(ManifestGenerator::repositories): Use repositories ids as keys in the result and include their names.
|
||
(ManifestGenerator::bug_trackers): Don't resolve repository names.
|
||
|
||
* Websites/perf.webkit.org/public/js/helper-classes.js:
|
||
(TestBuild): Renamed repositoryName to repositoryId.
|
||
(TestBuild.revision): Ditto.
|
||
(TestBuild.formattedRevisions): Ditto. Continue to use the repository name in the formatted result
|
||
since this is the text shown to human.
|
||
|
||
* Websites/perf.webkit.org/public/v2/app.js:
|
||
(App.pane.searchCommit): Renamed repositoryName to repositoryId.
|
||
(App.PaneController._updateDetails): Ditto.
|
||
(App.AnalysisTaskController.updateRoots): Ditto.
|
||
|
||
* Websites/perf.webkit.org/public/v2/data.js:
|
||
(Measurement): Ditto.
|
||
(Measurement.prototype.commitTimeForRepository): Ditto.
|
||
(Measurement.prototype.formattedRevisions): Ditto.
|
||
|
||
* Websites/perf.webkit.org/public/v2/index.html: Use the repository name and the repository id as
|
||
select element's label and value respectively.
|
||
|
||
2015-02-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix. Declare $repository_id_to_name in the global scope.
|
||
|
||
* public/api/runs.php:
|
||
|
||
2015-02-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
/api/runs.php should have main function
|
||
https://bugs.webkit.org/show_bug.cgi?id=141220
|
||
|
||
Reviewed by Benjamin Poulain.
|
||
|
||
Wrapped the code inside main function for clarity.
|
||
|
||
* public/api/runs.php:
|
||
|
||
2015-01-27 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix. "eta" isn't set on a in-progress build on a newly added builder.
|
||
|
||
* tools/sync-with-buildbot.py:
|
||
(find_request_updates):
|
||
|
||
2015-01-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard always assigns the result of A/B testing with build request 1
|
||
https://bugs.webkit.org/show_bug.cgi?id=140382
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
The bug was caused by the expression array_get($report, 'jobId') or array_get($report, 'buildRequest')
|
||
which always evaluated to 1 when the report contained jobId. Fixed the bug by cascading array_get instead.
|
||
|
||
Also fixed a typo as well as a bug that reports were never associated with builds.
|
||
|
||
* public/include/report-processor.php:
|
||
(ReportProcessor::process): Don't use "or" to find the non-null value since that always evaluates to 1
|
||
instead of the first non-null value.
|
||
(ReportProcessor::resolve_build_id): Fixed the typo by adding the missing "$this->".
|
||
(ReportProcessor::commit): Associate the report with the corresponding build as intended.
|
||
|
||
2015-01-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed typo fix. The prefix in triggerable_configurations is "trigconfig", not "trigrepo".
|
||
|
||
* public/admin/tests.php:
|
||
|
||
2015-01-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix. Removed the stale code.
|
||
|
||
* public/admin/triggerables.php:
|
||
|
||
2015-01-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should have the ability to post A/B testing builds
|
||
https://bugs.webkit.org/show_bug.cgi?id=140317
|
||
|
||
Rubber-stamped by Simon Fraser.
|
||
|
||
This patch adds the support for triggering A/B testing from the perf dashboard.
|
||
|
||
We add a few new tables to the database. "build_triggerables", which represents a set of builders
|
||
that accept A/B testing. "triggerable_repositories" associates each "triggerable" with a fixed set
|
||
of repositories for which an arbitrary revision can be specified for A/B testing.
|
||
"triggerable_configurations" specifies a triggerable available on a given test on a given platform.
|
||
"roots" table which specifies the revision used in a given root set in each repository.
|
||
|
||
* init-database.sql: Added "build_triggerables", "triggerable_repositories",
|
||
"triggerable_configurations", and "roots" tables. Added references to "build_triggerables",
|
||
"platforms", and "tests" tables as well as columns to store status, status url, and creation time
|
||
to build_requests table. Also made each test group's name unique in a given analysis task as it
|
||
would be confusing to have multiple test groups of the same name.
|
||
|
||
* public/admin/tests.php: Added the UI and the code to associate a test with a triggerable.
|
||
|
||
* public/admin/triggerables.php: Added. Manages the list of triggerables as well as repositories
|
||
for which a specific revision can be set in an A/B testing on a given triggerable.
|
||
|
||
* public/api/build-requests.php: Added. Returns the list of open build requests on a specified
|
||
triggerable. Also updates the status' and the status urls of specified build requests when
|
||
buildRequestUpdates is provided in the raw POST data.
|
||
(main):
|
||
|
||
* public/api/runs.php:
|
||
(fetch_runs_for_config): Don't include results associated with a build request, meaning they are
|
||
results of an A/B testing.
|
||
|
||
* public/api/test-groups.php:
|
||
(main): Use the newly added BuildRequestsFetcher. Also merged fetch_test_groups_for_task back.
|
||
|
||
* public/api/triggerables.php: Added.
|
||
(main): Returns a list of triggerables or a triggerable associated with a given analysis task.
|
||
|
||
* public/include/admin-header.php:
|
||
|
||
* public/include/build-requests-fetcher.php: Added. Extracted from public/api/test-groups.php.
|
||
(BuildRequestsFetcher): This class abstracts the process of fetching a list of builds requests
|
||
and root sets used in those requests.D
|
||
(BuildRequestsFetcher::__construct):
|
||
(BuildRequestsFetcher::fetch_for_task):
|
||
(BuildRequestsFetcher::fetch_for_group):
|
||
(BuildRequestsFetcher::fetch_incomplete_requests_for_triggerable):
|
||
(BuildRequestsFetcher::has_results):
|
||
(BuildRequestsFetcher::results):
|
||
(BuildRequestsFetcher::results_with_resolved_ids):
|
||
(BuildRequestsFetcher::results_internal):
|
||
(BuildRequestsFetcher::root_sets):
|
||
(BuildRequestsFetcher::fetch_roots_for_set):
|
||
|
||
* public/include/db.php:
|
||
(Database::prefixed_column_names): Don't return "$prefix_" when there are no columns.
|
||
(Database::insert_row): Support taking an empty array for values. This is useful in "root_sets"
|
||
table since it only has the primary key, id, column.
|
||
(Database::select_or_insert_row):
|
||
(Database::update_or_insert_row):
|
||
(Database::update_row): Added.
|
||
(Database::_select_update_or_insert_row): Takes an extra argument specifying whether a new row
|
||
should be inserted when no row matches the specified criteria. This is used while updating
|
||
build_requests' status and url in public/api/build-requests.php since we shouldn't be inserting
|
||
new build requests in that API.
|
||
(Database::select_rows): Also use "1 == 1" in the select query when the query criteria is empty.
|
||
This is used in public/api/triggerables.php when no analysis task is specified.
|
||
|
||
* public/include/json-header.php:
|
||
(find_triggerable_for_task): Added. Finds a triggerable available on a given test. We return the
|
||
triggerable associated with the closest ancestor of the test. Since issuing a new query for each
|
||
ancestor test is expensive, we retrieve triggerable for all ancestor tests at once and manually
|
||
find the closest ancestor with a triggerable.
|
||
|
||
* public/include/report-processor.php:
|
||
(ReportProcessor::process):
|
||
(ReportProcessor::resolve_build_id): Associate a build request with the newly created build
|
||
if jobId or buildRequest is specified.
|
||
|
||
* public/include/test-name-resolver.php:
|
||
(TestNameResolver::map_metrics_to_tests): Store the entire metric row instead of its name so that
|
||
test_exists_on_platform can use it. The last diff in public/admin/tests.php adopts this change.
|
||
(TestNameResolver::test_exists_on_platform): Added. Returns true iff the test has ever run on
|
||
a given platform.
|
||
|
||
* public/include/test-path-resolver.php: Added.
|
||
(TestPathResolver): This class abstracts the ancestor chains of a test. It retrieves the entire
|
||
"tests" table to do this since there could be arbitrary number of ancestors for a given test.
|
||
This class is a lot more lightweight than TestNameResolver, which retrieves a whole bunch of tables
|
||
in order to compute full test metric names.
|
||
(TestPathResolver::__construct):
|
||
(TestPathResolver::ancestors_for_test): Returns the ordered list of ancestors from the closest to
|
||
the highest (a test without a parent).
|
||
(TestPathResolver::path_for_test): Returns a test "path", the ordered list of test names from
|
||
the highest ancestor to the test itself.
|
||
(TestPathResolver::ensure_id_to_test_map): Fetches "tests" table to construct id_to_test_map.
|
||
|
||
* public/privileged-api/create-test-group.php: Added. An API to create A/B testing groups.
|
||
(main):
|
||
(commit_sets_from_root_sets): Given a dictionary of repository names to a pair of revisions
|
||
for sets A and B respectively, returns a pair of arrays, each of which contains the corresponding
|
||
set of "commits" for sets A and B respectively. e.g. {"WebKit": [1, 2], "Safari": [3, 4]} will
|
||
result in [[WebKit commit at r1, Safari commit at r3], [WebKit commit at r2, Safari commit at r4]].
|
||
|
||
* public/v2/analysis.js:
|
||
(App.AnalysisTask.testGroups): Takes arguments so that set('testGroups') will invalidate the cache.
|
||
(App.AnalysisTask.triggerable): Added. Retrieves the triggerable associated with the task lazily.
|
||
(App.TestGroup.rootSets): Added. Returns the list of root set ids used in this A/B testing group.
|
||
(App.TestGroup.create): Added. Creates a new A/B testing group.
|
||
(App.Triggerable): Added.
|
||
(App.TriggerableAdapter): Added.
|
||
(App.TriggerableAdapter.buildURL): Added.
|
||
(App.BuildRequest.testGroup): Renamed from group.
|
||
(App.BuildRequest.orderLabel): Added. One-based index to be used in labels.
|
||
(App.BuildRequest.config): Added. Returns either 'A' or 'B' depending on the configuration used
|
||
in this build request.
|
||
(App.BuildRequest.status): Added.
|
||
(App.BuildRequest.statusLabel): Added. Returns a human friendly label for the current status.
|
||
(App.BuildRequest): Removed buildNumber, buildBuilder, as well as buildTime as they're unused.
|
||
|
||
* public/v2/app.js:
|
||
(App.AnalysisTaskController.testGroups): Added.
|
||
(App.AnalysisTaskController.possibleRepetitionCounts): Added.
|
||
(App.AnalysisTaskController.updateRoots): Renamed from roots. This is also no longer a property
|
||
but an observer that updates "roots" property. Filter out the repositories that are not accepted
|
||
by the associated triggerable as they will be ignored.
|
||
(App.AnalysisTaskController.actions.createTestGroup): Added.
|
||
|
||
* public/v2/index.html: Updated the UI, and added a form element to trigger createTestGroup action.
|
||
|
||
* tools/sync-with-buildbot.py: Added. This scripts posts new builds on buildbot and reports back
|
||
the status of those builds to the perf dashboard. A similar script can be written to support
|
||
other continuous builds systems.
|
||
(main): Fetches the list of pending builds as well as currently running or completed builds from
|
||
a buildbot, and report new statuses of builds requests to the perf dashboard. It will then schedule
|
||
a single new build on each builder with no pending builds, and marks the set of open build requests
|
||
that have been scheduled to run on the buildbot but not found in the first step as stale.
|
||
(load_config): Loads a JSON that contains the configurations for each builder. e.g.
|
||
[
|
||
{
|
||
"platform": "mac-mavericks",
|
||
"test": ["Parser", "html5-full-render.html"],
|
||
"builder": "Trunk Syrah Production Perf AB Tests",
|
||
"arguments": {
|
||
"forcescheduler": "force-mac-mavericks-release-perf",
|
||
"webkit_revision": "$WebKit",
|
||
"jobid": "$buildRequest"
|
||
}
|
||
}
|
||
]
|
||
|
||
(find_request_updates): Return a list of build request status updates to make based on the pending
|
||
builds as well as in-progress and completed builds on each builder on the buildbot. When a build is
|
||
completed, we use the special status "failedIfNotCompleted" which results in "failed" status only
|
||
if the build request had not been completed. This is necessary because a failed build will not
|
||
report its failed-ness back to the perf dashboard in some cases; e.g. lost slave or svn up failure.
|
||
(update_and_fetch_build_requests): Submit the build request status updates and retrieve the list
|
||
of open requests the perf dashboard has.
|
||
(find_stale_request_updates): Compute the list of build requests that have been scheduled on the
|
||
buildbot but not found in find_request_updates. These build requests are lost. e.g. a master reboot
|
||
or human canceling a build may trigger such a state.
|
||
(schedule_request): Schedules a build with the arguments specified in the configuration JSON after
|
||
replacing repository names with their revisions and buildRequest with the build request id.
|
||
(config_for_request): Finds a builder for the test and the platform of a build request.
|
||
(fetch_json): Fetches a JSON from the specified URL, optionally with BasicAuth.
|
||
(property_value_from_build): Returns the value of a specific property in a buildbot build.
|
||
(request_id_from_build): Returns the build request id of a given buildbot build if there is one.
|
||
|
||
2015-01-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Cache-control should be set only on api/runs
|
||
https://bugs.webkit.org/show_bug.cgi?id=140312
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Some JSON APIs such as api/analysis-tasks can't be cached even for a short period of time (e.g. a few minutes)
|
||
since they can be modified by the user on demand. Since only api/runs.php takes a long time to generate JSONs,
|
||
just set cache-control there instead of json-header.php which is used by other JSON APIs.
|
||
|
||
Also set date_default_timezone_set in db.php since we never use non-UTC timezone in our scripts.
|
||
|
||
* public/api/analysis-tasks.php:
|
||
* public/api/runs.php: Set the cache control headers.
|
||
* public/api/test-groups.php:
|
||
* public/include/db.php: Set the default timezone to UTC.
|
||
* public/include/json-header.php: Don't set the cache control headers.
|
||
|
||
2015-01-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
api/report-commit should authenticate with a slave name and password
|
||
https://bugs.webkit.org/show_bug.cgi?id=140308
|
||
|
||
Reviewed by Benjamin Poulain.
|
||
|
||
Use a slave name and a password to authenticate new commit reports.
|
||
|
||
* public/api/report-commits.php:
|
||
(main):
|
||
* public/include/json-header.php:
|
||
(verify_slave): Renamed and repurposed from verify_builder in report-commits.php. Now authenticates with
|
||
a slave name and a password instead of a builder name and a password.
|
||
* tests/api-report-commits.js: Updated tests.
|
||
* tools/pull-svn.py:
|
||
(main): Renamed variables.
|
||
(submit_commits): Submits slaveName and slavePassword instead of builderName and builderPassword.
|
||
|
||
2014-12-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should support authentication via a slave password
|
||
https://bugs.webkit.org/show_bug.cgi?id=139837
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
For historical reasons, perf dashboard conflated builders and build slaves. As a result we ended up
|
||
having to add multiple builders with the same password when a single build slave is shared among them.
|
||
|
||
This patch introduces the concept of build_slave into the perf dashboard to end this madness.
|
||
|
||
* init-database.sql: Added build_slave table as well as references to it in builds and reports.
|
||
|
||
* public/admin/build-slaves.php: Added.
|
||
|
||
* public/admin/builders.php: Added the support for updating passwords.
|
||
|
||
* public/include/admin-header.php:
|
||
(update_field): Takes an extra argument when a new value needs to be supplied by the caller instead of
|
||
being retrieved from $_POST.
|
||
(AdministrativePage::render_table): Use array_get to retrieve a value out of the database row since
|
||
the raw may not exist (e.g. new_password).
|
||
(AdministrativePage::render_form_to_add): Added the support for post_insertion. Don't render the form
|
||
control here when this flag evaluates to TRUE.
|
||
|
||
* public/include/report-processor.php:
|
||
(ReportProcessor::process): Added the logic to authenticate with slaveName and slavePassword if those
|
||
values are present in the report. In addition, try authenticating builderName with slavePassword if
|
||
builderPassword is not specified. When neither password is specified, exit with BuilderNotFound.
|
||
Also insert the slave or the builder whichever is missing after we've successfully authenticated.
|
||
(ReportProcessor::construct_build_data): Takes a builder ID and an optional slave ID instead of
|
||
a builder row.
|
||
(ReportProcessor::store_report): Store the slave ID with the report.
|
||
(ReportProcessor::resolve_build_id): Exit with MismatchingBuildSlave when the slave associated with
|
||
the matching build is different from what's being reported.
|
||
|
||
* tests/api-report.js: Added a bunch of tests to test the new features of /api/report.
|
||
(.addSlave): Added.
|
||
|
||
2014-12-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New perf dashboard should not duplicate author information in each commit
|
||
https://bugs.webkit.org/show_bug.cgi?id=139756
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Instead of each commit having author name and email, make it reference a newly added committers table.
|
||
Also replace "email" by "account" since some repositories don't use emails as account names.
|
||
|
||
This improves the keyword search performance in commits.php since LIKE now runs on committers table,
|
||
which only contains as many rows as there are accounts in each repository, instead of commits table
|
||
which contains every commit ever happened in each repository.
|
||
|
||
To migrate an existing database into match the new schema, run:
|
||
|
||
BEGIN;
|
||
|
||
INSERT INTO committers (committer_repository, committer_name, committer_email)
|
||
(SELECT DISTINCT commit_repository, commit_author_name, commit_author_email
|
||
FROM commits WHERE commit_author_email IS NOT NULL);
|
||
|
||
ALTER TABLE commits ADD COLUMN commit_committer integer REFERENCES committers ON DELETE CASCADE;
|
||
|
||
UPDATE commits SET commit_committer = committer_id FROM committers
|
||
WHERE commit_repository = committer_repository AND commit_author_email = committer_email;
|
||
|
||
ALTER TABLE commits DROP COLUMN commit_author_name CASCADE;
|
||
ALTER TABLE commits DROP COLUMN commit_author_email CASCADE;
|
||
|
||
COMMIT;
|
||
|
||
* init-database.sql: Added committers table, and replaced author columns in commits table by a foreign
|
||
reference to committers. Also added the missing drop table statements.
|
||
|
||
* public/api/commits.php:
|
||
(main): Fetch the corresponding committers row for a single commit. Also wrap a single commit by
|
||
an array here instead of doing it in format_commit.
|
||
(fetch_commits_between): Updated queries to JOIN commits with committers.
|
||
(format_commit): Takes both commit and committers rows. Also don't wrap the result in an array as that
|
||
is now done in main.
|
||
|
||
* public/api/report-commits.php:
|
||
(main): Store the reported committer information or update the existing entry if there is one.
|
||
|
||
* tests/admin-regenerate-manifest.js: Fixed tests.
|
||
|
||
* tests/api-report-commits.js: Ditto. Also added a test for updating an existing committer entry.
|
||
|
||
* tools/pull-svn.py: Renamed email to account.
|
||
(main):
|
||
(fetch_commit_and_resolve_author):
|
||
(fetch_commit):
|
||
(resolve_author_name_from_account):
|
||
(resolve_author_name_from_email): Deleted.
|
||
|
||
2014-12-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix.
|
||
|
||
* public/v2/index.html: Include js files we extracted in r177424.
|
||
|
||
2014-12-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed. Adding the forgotten svnprop.
|
||
|
||
* tools/pull-svn.py: Added property svn:executable.
|
||
|
||
2014-12-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Split InteractiveChartComponent and CommitsViewerComponent into separate files
|
||
https://bugs.webkit.org/show_bug.cgi?id=139716
|
||
|
||
Rubber-stamped by Benjamin Poulain.
|
||
|
||
Refactored InteractiveChartComponent and CommitsViewerComponent out of app.js into commits-viewer.js
|
||
and interactive-chart.js respectively since app.js has gotten really large.
|
||
|
||
* public/v2/app.js:
|
||
* public/v2/commits-viewer.js: Added.
|
||
* public/v2/interactive-chart.js: Added.
|
||
|
||
2014-12-02 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New perf dashboard's chart UI is buggy
|
||
https://bugs.webkit.org/show_bug.cgi?id=139214
|
||
|
||
Reviewed by Chris Dumez.
|
||
|
||
The bugginess was caused by weird interactions between charts and panes. Rewrote the code to fix it.
|
||
|
||
Superfluous selectionChanged and domainChanged "event" actions were removed from the interactive chart
|
||
component. This is not how Ember.js components should interact to begin with. The component now exposes
|
||
selectedPoints and always updates selection instead of sharedSelection.
|
||
|
||
* public/v2/app.js:
|
||
(App.ChartsController.present): Added. We can't call Date.now() in various points in our code as that
|
||
would lead to infinite mutual recursions since X-axis domain values wouldn't match up.
|
||
(App.ChartsController.updateSharedDomain): This function was completely useless. The overview's start
|
||
and end time should be completely determined by "since" and the present time.
|
||
(App.ChartsController._startTimeChanged): Ditto.
|
||
(App.ChartsController._scheduleQueryStringUpdate):
|
||
(App.ChartsController._updateQueryString): Set "zoom" only if it's different from the shared domain.
|
||
|
||
(App.domainsAreEqual): Moved from InteractiveChartComponent._xDomainsAreSame.
|
||
|
||
(App.PaneController.actions.createAnalysisTask): Use selectedPoints property set by the chart.
|
||
(App.PaneController.actions.overviewDomainChanged): Removed; only needed to call updateSharedDomain.
|
||
(App.PaneController.actions.rangeChanged): Removed. _showDetails (renamed to _updateDetails) directly
|
||
observes the changes to selectedPoints property as it gets updated by the main chart.
|
||
(App.PaneController._overviewSelectionChanged): This was previously a dead code. Now it's used again
|
||
with a bug fix. When the overview selection is cleared, we use the same domain in the main chart and
|
||
the overview chart.
|
||
(App.PaneController._sharedDomainChanged): Fixed a but that it erroneously updates the overview domain
|
||
when domain arrays aren't identical. This was causing a subtle race with other logic.
|
||
(App.PaneController._sharedZoomChanged): Ditto. Also don't set mainPlotDomain here as any changes to
|
||
overviewSelection will automatically propagate to the main plot's domain as they're aliased.
|
||
(App.PaneController._currentItemChanged): Merged into _updateDetails (renamed from _showDetails).
|
||
(App.PaneController._updateDetails): Previously, this function took points and inspected _hasRange to
|
||
see if those two points correspond to a range or a single data point. Rewrote all that logic by
|
||
directly observing selectedPoints and currentItem properties instead of taking points and relying on
|
||
an instance variable, which was a terrible API.
|
||
(App.PaneController._updateCanAnalyze): Use selectedPoints property. Since this property is only set
|
||
when the main plot has a selected range, we don't have to check this._hasRange anymore.
|
||
|
||
(App.InteractiveChartComponent._updateDomain): No longer sends domainChanged "event" action.
|
||
(App.InteractiveChartComponent._sharedSelectionChanged): Removed. This is a dead code.
|
||
(App.InteractiveChartComponent._updateSelection):
|
||
(App.InteractiveChartComponent._xDomainsAreSame): Moved to App.domainsAreEqual.
|
||
(App.InteractiveChartComponent._setCurrentSelection): Update the selection only if needed. Also set
|
||
selectedPoints property.
|
||
|
||
(App.AnalysisTaskController._fetchedRuns):
|
||
(App.AnalysisTaskController._rootChangedForTestSet):
|
||
|
||
* public/v2/index.html:
|
||
Removed non-functional sharedSelection and superfluous selectionChanged and domainChanged actions.
|
||
|
||
2014-11-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed. Fixed syntax errors.
|
||
|
||
* init-database.sql:
|
||
* public/api/commits.php:
|
||
|
||
2014-11-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
The dashboard on new perf monitor should be configurable
|
||
https://bugs.webkit.org/show_bug.cgi?id=138994
|
||
|
||
Reviewed by Benjamin Poulain.
|
||
|
||
For now, make it configurable via config.json. We should eventually make it configurable via
|
||
an administrative page but this will do for now.
|
||
|
||
* config.json: Added the empty dashboard configuration.
|
||
|
||
* public/include/manifest.php: Include the dashboard configuration in the manifest file.
|
||
|
||
* public/v2/app.js:
|
||
(App.IndexController): Removed defaultTable since this is now dynamically obtained via App.Manifest.
|
||
(App.IndexController.gridChanged): Use App.Dashboard to parse the dashboard configuration.
|
||
Also obtain the default configuration from App.Manifest.
|
||
(App.IndexController._normalizeTable): Moved to App.Dashboard.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Repository.urlForRevision): Fixed the position of the open curly bracket.
|
||
(App.Repository.urlForRevisionRange): Ditto.
|
||
(App.Dashboard): Added.
|
||
(App.Dashboard.table): Extracted from App.IndexController.gridChanged.
|
||
(App.Dashboard.rows): Ditto.
|
||
(App.Dashboard.headerColumns): Ditto.
|
||
(App.Dashboard._normalizeTable): Moved from App.IndexController._normalizeTable.
|
||
(App.MetricSerializer.normalizePayload): Synthesize a dashboard record from the configuration.
|
||
Since there is exactly one dashboard object per app, it's okay to hard code an id here.
|
||
(App.Manifest._fetchedManifest): Set defaultDashboard to the one and only one dashboard we have.
|
||
|
||
2014-11-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
There should be a way to associate bugs with analysis tasks
|
||
https://bugs.webkit.org/show_bug.cgi?id=138977
|
||
|
||
Reviewed by Benjamin Poulain.
|
||
|
||
Updated associate-bug.php to match the new database schema.
|
||
|
||
* public/include/json-header.php:
|
||
(require_format): Removed the call to camel_case_words_separated_by_underscore since the name is
|
||
already camel-cased in require_existence_of. This makes the function usable elsewhere.
|
||
|
||
* public/privileged-api/associate-bug.php:
|
||
(main): Changed the API to take run, bugTracker, and number to match the new database schema.
|
||
Also verify that those values are integers using require_format.
|
||
|
||
* public/v2/analysis.js:
|
||
(App.AnalysisTask.label): Added. Concatenates the task's name with the bug numbers.
|
||
(App.Bug.label): Added.
|
||
(App.BugAdapter): Added.
|
||
(App.BugAdapter.createRecord): Use PrivilegedAPI instead of the builtin ajax call.
|
||
(App.BuildRequest): Inherit from newly added App.Model, which is set to DS.Model right now.
|
||
|
||
* public/v2/app.css: Renamed .test-groups to .analysis-group. Also added new rules for the table
|
||
containing the bug information.
|
||
|
||
* public/v2/app.js:
|
||
(App.InteractiveChartComponent._rangesChanged): Added label to range bar objects.
|
||
(App.AnalysisTaskRoute):
|
||
(App.AnalysisTaskController): Replaced the functionality of App.AnalysisTaskViewModel.
|
||
(App.AnalysisTaskController._fetchedManifest): Added.
|
||
(App.AnalysisTaskController.actions.associateBug): Added.
|
||
|
||
* public/v2/chart-pane.css: Renamed .bugs-pane to .analysis-pane.
|
||
|
||
* public/v2/data.js:
|
||
(Measurement.prototype.associateBug): Deleted.
|
||
|
||
* public/v2/index.html: Renamed .bugs-pane to .analysis-pane and .test-groups to .analysis-group.
|
||
Added a table show the bug information. Also hide the chart until chartData is available.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Model): Added.
|
||
|
||
2014-11-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix misc bugs and typos in app.js
|
||
https://bugs.webkit.org/show_bug.cgi?id=138946
|
||
|
||
Reviewed by Benjamin Poulain.
|
||
|
||
* public/v2/app.js:
|
||
(App.DashboardPaneProxyForPicker._platformOrMetricIdChanged):
|
||
(App.ChartsController.init):
|
||
(App.buildPopup): Renamed from App.BuildPopup.
|
||
(App.InteractiveChartComponent._constructGraphIfPossible): Fixed the bug that we were calling
|
||
remove() on the wrong object (an array as opposed to elements in the array).
|
||
(App.InteractiveChartComponent._highlightedItemsChanged): Check the length of _highlights as
|
||
_highlights is always an array and evalutes to true.
|
||
|
||
2014-11-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New perf dashboard should provide UI to create a new analysis task
|
||
https://bugs.webkit.org/show_bug.cgi?id=138910
|
||
|
||
Reviewed by Benjamin Poulain.
|
||
|
||
This patch reverts some parts of r175006 and re-introduces bugs associated with analysis tasks.
|
||
I'll add UI to show and edit bug numbers associated with an analysis task in a follow up patch.
|
||
|
||
With this patch, we can create a new analysis task by selection a range of points and opening
|
||
"analysis pane" (renamed from "bugs pane"). Each analysis task created is represented by a yellow bar
|
||
in the chart hyperlinked to the analysis task.
|
||
|
||
* init-database.sql: Redefined the bugs to be associated with an analysis task instead of a test run.
|
||
|
||
* public/api/analysis-tasks.php: Added the support for querying analysis tasks for a specific metric
|
||
on a specific platform. Also retrieve and return all bugs associated with analysis tasks.
|
||
(main):
|
||
(fetch_and_push_bugs_to_tasks): Added. Fetches all bugs associated with an array of analysis tasks
|
||
and adds the associated bugs to each task in the array.
|
||
(format_task):
|
||
|
||
* public/api/runs.php: Reverted changes made in r175006.
|
||
(fetch_runs_for_config):
|
||
(format_run):
|
||
|
||
* public/api/test-groups.php:
|
||
(fetch_test_groups_for_task): Use the newly added Database::select_rows.
|
||
|
||
* public/include/db.php:
|
||
(Database::select_first_or_last_row):
|
||
(Database::select_rows): Extracted from select_first_or_last_row.
|
||
|
||
* public/v2/analysis.js:
|
||
(App.AnalysisTask): Added "bugs" property.
|
||
(App.Bug): Added now that bugs are regular data store objects.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane._fetch): Calls this.fetchAnalyticRanges to fetch analysis tasks as well as test runs.
|
||
(App.Pane.fetchAnalyticRanges): Added. Fetches analysis tasks for the current metric on the current
|
||
platform that are associated with a specific range of runs.
|
||
(App.PaneController.actions.toggleBugsPane): Updated per showingBugsPane to showingAnalysisPane rename.
|
||
(App.PaneController.actions.associateBug): Deleted.
|
||
(App.PaneController.actions.createAnalysisTask): Replaced the pre-condition checks with assertions as
|
||
this action should never be triggered when the pre-condition is not met. Also re-fetch analysis tasks
|
||
once we've created one.
|
||
(App.PaneController.toggleSearchPane): Updated per showingBugsPane to showingAnalysisPane rename.
|
||
(App.PaneController._detailsChanged): Ditto. Removed selectedSinglePoint since it's no longer used.
|
||
(App.PaneController._showDetails): Call _updateCanAnalyze to update the status of "Analyze" button.
|
||
(App.PaneController._updateBugs): Deleted.
|
||
(App.PaneController._updateMarkedPoints): Deleted.
|
||
(App.PaneController._updateCanAnalyze): Added. Disables the button to create an analysis task when
|
||
the name is missing or when at most one point is selected.
|
||
|
||
(App.InteractiveChartComponent._constructGraphIfPossible): Update the locations of range rects.
|
||
(App.InteractiveChartComponent._relayoutDataAndAxes): Ditto.
|
||
(App.InteractiveChartComponent._mousePointInGraph): Don't return a point unless the mouse cursor is
|
||
on our svg element to avoid locking the current item when a bar shown for an analysis task is clicked.
|
||
(App.InteractiveChartComponent._rangesChanged): Added. Creates an array of objects representing
|
||
clickable bars for analysis tasks.
|
||
(App.InteractiveChartComponent._updateRangeBarRects): Computes the inline style used by each clickable
|
||
bar for analysis tasks to place them at the right location.
|
||
(App.InteractiveChartComponent.actions.openRange): Added. Forwards the action to the parent controller.
|
||
|
||
* public/v2/chart-pane.css:
|
||
(.chart .extent): Use the same color as the vertical indicator in the highlight behind the selection.
|
||
(.chart .rangeBar): Added.
|
||
|
||
* public/v2/data.js:
|
||
(TimeSeries.prototype.nextPoint): Added. Used by _rangesChanged.
|
||
|
||
* public/v2/index.html: Renamed "bugs pane" to "analysis pane" and removed the UI to associate bugs.
|
||
This ability will be reinstated in a follow up patch. Also added a container div and spans for analysis
|
||
task bars in the interactive chart component.
|
||
|
||
2014-11-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix typos in r176203.
|
||
|
||
* public/v2/app.js:
|
||
(App.ChartsController.actions.addPaneByMetricAndPlatform):
|
||
(App.AnalysisTaskRoute):
|
||
|
||
2014-11-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed. Updated the install instruction.
|
||
|
||
* Install.md:
|
||
|
||
2014-11-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
App.Manifest shouldn't use App.__container__.lookup
|
||
https://bugs.webkit.org/show_bug.cgi?id=138768
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Removed the hack to find the store object via App.__container__.lookup.
|
||
Pass around the store object instead.
|
||
|
||
* public/v2/app.js:
|
||
(App.DashboardRow._createPane): Add "store" property to the pane.
|
||
(App.DashboardPaneProxyForPicker._platformOrMetricIdChanged): Ditto.
|
||
(App.IndexController.gridChanged): Ditto.
|
||
(App.IndexController.actions.addRow): Ditto.
|
||
(App.IndexController.init): Ditto.
|
||
(App.Pane._fetch): Ditto.
|
||
(App.ChartsController._parsePaneList): Ditto.
|
||
(App.ChartsController._updateQueryString): Ditto.
|
||
(App.ChartsController.actions.addPaneByMetricAndPlatform): Ditto.
|
||
(App.BuildPopup): Ditto.
|
||
(App.AnalysisTaskRoute.model): Ditto.
|
||
(App.AnalysisTaskViewModel._taskUpdated): Ditto.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Manifest.fetch): Removed the code to find the store object.
|
||
|
||
2014-11-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix Ember.js warnings the new perf dashboard
|
||
https://bugs.webkit.org/show_bug.cgi?id=138531
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
Fixed various warnings.
|
||
|
||
* public/v2/app.js:
|
||
(App.InteractiveChartComponent._relayoutDataAndAxes): We can't use "rem". Use this._rem as done for x.
|
||
* public/v2/data.js:
|
||
(PrivilegedAPI._post): Removed the superfluous console.log.
|
||
(CommitLogs.fetchForTimeRange): Ditto.
|
||
* public/v2/index.html: Added tbody as required by the HTML specification.
|
||
|
||
2014-11-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix typos in r175768.
|
||
|
||
* public/v2/app.js:
|
||
(App.AnalysisTaskViewModel.roots):
|
||
|
||
2014-11-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Introduce the concept of analysis task to perf dashboard
|
||
https://bugs.webkit.org/show_bug.cgi?id=138517
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Introduced the concept of an analysis task, which is created for a range of measurements for a given metric on
|
||
a single platform and used to bisect regressions in the range.
|
||
|
||
Added a new page to see the list of active analysis tasks and a page to view the contents of an analysis task.
|
||
|
||
* init-database.sql: Added a bunch of tables to store information about analysis tasks.
|
||
analysis_tasks - Represents each analysis task. Associated with a platform and a metric and possibly with two
|
||
test runs. Analysis tasks not associated with test runs are used for try new patches.
|
||
analysis_test_groups - A test group in an analysis task represents a bunch of related A/B testing results.
|
||
root_sets - A root set represents a set of roots (or packages) installed in each A/B testing.
|
||
build_requests - A build request represents a single pending build for A/B testing.
|
||
|
||
* public/api/analysis-tasks.php: Added. Returns the specified analysis task or all analysis tasks in an array.
|
||
(main):
|
||
(format_task):
|
||
|
||
* public/api/test-groups.php: Added. Returns analysis task groups for the specified analysis task or returns
|
||
the specified analysis task group as well as build requests associated with them.
|
||
(main):
|
||
(fetch_test_groups_for_task):
|
||
(fetch_build_requests_for_task):
|
||
(fetch_build_requests_for_group):
|
||
(format_test_group):
|
||
(format_build_request):
|
||
|
||
* public/include/json-header.php:
|
||
(remote_user_name): Extracted from compute_token so that we can use it in create-analysis-task.php.
|
||
(compute_token):
|
||
|
||
* public/privileged-api/associate-bug.php:
|
||
(main): Fixed a typo.
|
||
|
||
* public/privileged-api/create-analysis-task.php: Added. Creates a new analysis task for a given test run range.
|
||
(main):
|
||
(ensure_row_by_id):
|
||
(ensure_config_from_runs):
|
||
|
||
* public/privileged-api/generate-csrf-token.php: Use remote_user_name.
|
||
|
||
* public/v2/analysis.js: Added. Various Ember data store models to represent analysis tasks and related objects.
|
||
(App.AnalysisTask):
|
||
(App.AnalysisTask.create):
|
||
(App.TestGroup):
|
||
(App.TestGroupAdapter):
|
||
(App.AnalysisTaskSerializer):
|
||
(App.TestGroupSerializer):
|
||
(App.BuildRequest):
|
||
|
||
* public/v2/app.css: Added style rules for the analysis page.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane._fetch): Use fetchRunsWithPlatformAndMetric, which has been refactored into App.Manifest.
|
||
|
||
(App.PaneController.actions.toggleBugsPane): Show bugs pane even when there are no bug trackers or there is not
|
||
exactly one selected point as we can still create an analysis task.
|
||
(App.PaneController.actions.associateBug): Renamed singlySelectedPoint to selectedSinglePoint to be more
|
||
grammatical and also alert'ed the error message when there is one.
|
||
(App.PaneController.actions.createAnalysisTask): Added. Creates a new analysis task and opens it in a new tab.
|
||
Since window.open only works during the click, we open the new "window" preemptively and navigates or closes it
|
||
once XHR request has completed.
|
||
(App.PaneController._detailsChanged): Changes due to singlySelectedPoint to selectedSinglePoint rename.
|
||
(App.PaneController._updateBugs): Fixed a bug that we were showing bugs in the previous point when a single point
|
||
is selected in the details pane.
|
||
|
||
(App.AnalysisRoute): Added.
|
||
(App.AnalysisTaskRoute): Added.
|
||
(App.AnalysisTaskViewModel): Added.
|
||
(App.AnalysisTaskViewModel._taskUpdated): Fetch runs for the associated platform and metric.
|
||
(App.AnalysisTaskViewModel._fetchedRuns): Setup the chart data to show.
|
||
(App.AnalysisTaskViewModel.testSets): The computed property used to update roots for all repositories/projects.
|
||
(App.AnalysisTaskViewModel._rootChangedForTestSet): Updates root selections for all repositories/projects when
|
||
the user selects an option for all roots in A or B configuration.
|
||
(App.AnalysisTaskViewModel.roots): The computed property used to show root choices for each repository/project.
|
||
|
||
* public/v2/chart-pane.css: Added style rules for details view in the analysis task page.
|
||
|
||
* public/v2/data.js:
|
||
(Measurement.prototype._formatRevisionRange): Don't prefix a revision number with "At " when there is no previous
|
||
point so that we can use it in App.AnalysisTaskViewModel.roots.
|
||
(TimeSeries.prototype.findPointByMeasurementId): Added.
|
||
(TimeSeries.prototype.seriesBetweenPoints): Added.
|
||
|
||
* public/v2/index.html: Use Metric.fullName since the same value is needed in the analysis task page. Also added
|
||
a button to create an analysis task, and made bugs pane button always enabled since we can an analysis task even
|
||
when multiple points are selected. Finally, added a new template for the analysis task page.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Metric.fullName): Added to share code between the charts page and the analysis task page.
|
||
(App.Manifest.fetchRunsWithPlatformAndMetric): Extracted from App.Pane._fetch to be reused in
|
||
App.AnalysisTaskViewModel._taskUpdated.
|
||
|
||
2014-10-28 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Remove App.PaneController.bugsChangeCount in the new perf dashboard
|
||
https://bugs.webkit.org/show_bug.cgi?id=138111
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
* public/v2/app.js:
|
||
(App.PaneController.bugsChangeCount): Removed.
|
||
(App.PaneController.actions.associateBug): Call _updateMarkedPoints instead of incrementing bugsChangeCount.
|
||
(App.PaneController._updateMarkedPoints): Extracted from App.InteractiveChartComponent._updateDotsWithBugs.
|
||
Finds the list of current run's points that are associated with bugs.
|
||
(App.InteractiveChartComponent._updateMarkedDots): Renamed from _updateDotsWithBugs.
|
||
* public/v2/chart-pane.css:
|
||
(.chart .marked): Renamed from .hasBugs.
|
||
* public/v2/index.html: Specify chartPointRadius and markedPoints.
|
||
|
||
2014-10-27 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
REGRESSION: commit logs are not shown sometimes on the new dashboard UI
|
||
https://bugs.webkit.org/show_bug.cgi?id=138099
|
||
|
||
Reviewed by Benjamin Poulain.
|
||
|
||
The bug was caused by _currentItemChanged not passing the previous point in the list of points and also
|
||
_showDetails inverting the order of the current and old measurements.
|
||
|
||
* public/v2/app.js:
|
||
(App.PaneController._currentItemChanged): Pass in the previous point to _showDetails when there is one.
|
||
(App.PaneController._showDetails): Since points are ordered chronologically, the last point is the
|
||
current (latest) measurement and the first point is the oldest measurement.
|
||
(App.CommitsViewerComponent.commitsChanged): Don't show a single measurement as a range for clarity.
|
||
|
||
2014-10-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should provide a way to associate bugs with a test run
|
||
https://bugs.webkit.org/show_bug.cgi?id=137857
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Added a "privileged" API, /privileged-api/associate-bug, to associate a bug with a test run.
|
||
/privileged-api/ is to be protected by an authentication mechanism such as DigestAuth over https by
|
||
the Apache configuration.
|
||
|
||
|
||
The Cross Site Request (CSRF) Forgery prevention for privileged APIs work as follows. When a user is
|
||
about to make a privileged API access, the front end code obtains a CSRF token generated by POST'ing
|
||
to privileged-api/generate-csrf-token; the page sets a randomly generated salt and an expiration time
|
||
via the cookie and returns a token computed from those two values as well as the remote username.
|
||
|
||
The font end code then POST's the request along with the returned token. The server side code verifies
|
||
that the specified token can be generated from the salt and the expiration time set in the cookie, and
|
||
the token hasn't expired.
|
||
|
||
|
||
* init-database.sql: Added bug_url to bug_trackers table, and added bugs table. Each bug tracker will
|
||
have zero or exactly one bug associated with a test run.
|
||
|
||
* public/admin/bug-trackers.php: Added the support for editing bug_url.
|
||
* public/api/runs.php:
|
||
(fetch_runs_for_config): Modified the query to fetch bugs associated with test_runs.
|
||
(parse_bugs_array): Added. Parses the aggregated bugs and creates a dictionary that maps a tracker id to
|
||
an associated bug if there is one.
|
||
(format_run): Calls parse_bugs_array.
|
||
|
||
* public/include/json-header.php: Added helper functions to deal for CSRF prevention.
|
||
(ensure_privileged_api_data): Added. Dies immediately if the request's method is not POST or doesn't
|
||
have a valid JSON payload.
|
||
(ensure_privileged_api_data_and_token): Ditto. Also checks that the CSRF prevention token is valid.
|
||
(compute_token): Computes a CSRF token using the REMOTE_USER (e.g. set via BasicAuth), the salt, and
|
||
the expiration time stored in the cookie.
|
||
(verify_token): Returns true iff the specified token matches what compute_token returns from the cookie.
|
||
|
||
* public/include/manifest.php:
|
||
(ManifestGenerator::bug_trackers): Include bug_url as bugUrl in the manifest. Also use tracker_id instead
|
||
of tracker_name as the key in the manifest. This requires changes to both v1 and v2 front end.
|
||
|
||
* public/index.html:
|
||
(Chart..showTooltipWithResults): Updated for the manifest format changed mentioned above.
|
||
|
||
* public/privileged-api/associate-bug.php: Added.
|
||
(main): Added. Associates or dissociates a bug with a test run inside a transaction. It prevent a CSRF
|
||
attack via ensure_privileged_api_data_and_token, which calls verify_token.
|
||
|
||
* public/privileged-api/generate-csrf-token.php: Added. Generates a CSRF token valid for one hour.
|
||
|
||
* public/v2/app.css:
|
||
(.disabled .icon-button:hover g): Used by the "bugs" icon when a range of points or no points are
|
||
selected in a chart.
|
||
|
||
* public/v2/app.js:
|
||
(App.PaneController.actions.toggleBugsPane): Added. Toggles the visibility of the bugs pane when exactly
|
||
one point is selected in the chart. Also hides the search pane when making the bugs pane visible since
|
||
they would overlap on each other if both of them are shown.
|
||
(App.PaneController.actions.associateBug): Makes a privileged API request to associate the specified bug
|
||
with the currently selected point (test run). Updates the bug information in "details" and colors of dots
|
||
in the charts to reflect new states. Because chart data objects aren't real Ember objects for performance
|
||
reasons, we have to use a dirty hack of modifying a dummy counter bugsChangeCount.
|
||
(App.PaneController.actions.toggleSearchPane): Renamed from toggleSearch. Also hides the bugs pane when
|
||
showing the search pane.
|
||
(App.PaneController.actions.rangeChanged): Takes all selected points as the second argument instead of
|
||
taking start and end points as the second and the third arguments so that _showDetails can enumerate all
|
||
bugs in the selected range.
|
||
|
||
(App.PaneController._detailsChanged): Added. Hide the bugs pane whenever a new point is selected.
|
||
Also update singlySelectedPoint, which is used by toggleBugsPane and associateBug.
|
||
(App.PaneController._currentItemChanged): Updated for the _showDetails change.
|
||
(App.PaneController._showDetails): Takes an array of selected points in place of old arguments.
|
||
Simplified the code to compute the revision information. Calls _updateBugs to format the associated bugs.
|
||
(App.PaneController._updateBugs): Sets details.bugTrackers to a dictionary that maps a bug tracker id to
|
||
a bug tracker proxy with an array of (bugNumber, bugUrl) pairs and also editedBugNumber, which is used by
|
||
the bugs pane to associate or dissociate a bug number, if exactly one point is selected.
|
||
|
||
(App.InteractiveChartComponent._updateDotsWithBugs): Added. Sets hasBugs class on dots as needed.
|
||
(App.InteractiveChartComponent._setCurrentSelection): Finds and passes all points in the selected range
|
||
to selectionChanged action instead of just finding the first and the last points.
|
||
|
||
* public/v2/chart-pane.css: Updated the style.
|
||
|
||
* public/v2/data.js:
|
||
(PrivilegedAPI): Added. A wrapper for privileged APIs' CSRF tokens.
|
||
(PrivilegedAPI.sendRequest): Makes a privileged API call. Fetches a new CSRF token if needed.
|
||
(PrivilegedAPI._generateTokenInServerIfNeeded): Makes a request to privileged-api/generate-csrf-token if
|
||
we haven't already obtained a CSRF token or if the token has already been expired.
|
||
(PrivilegedAPI._post): Makes a single POST request to /privileged-api/* with a JSON payload.
|
||
|
||
(Measurement.prototype.bugs): Added.
|
||
(Measurement.prototype.hasBugs): Returns true iff bugs has more than one bug number.
|
||
(Measurement.prototype.associateBug): Associates a bug with a test run via privileged-api/associate-bug.
|
||
|
||
* public/v2/index.html: Added the bugs pane. Also added a list of bugs associated with the current run in
|
||
the details.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.BugTracker.bugUrl):
|
||
(App.BugTracker.newBugUrl): Added.
|
||
(App.BugTracker.repositories): Added. This was a missing back reference to repositories.
|
||
(App.MetricSerializer.normalizePayload): Now parses/loads the list of bug trackers from the manifest.
|
||
(App.Manifest.repositoriesWithReportedCommits): Now initialized to an empty array instead of null.
|
||
(App.Manifest.bugTrackers): Added.
|
||
(App.Manifest._fetchedManifest): Sets App.Manifest.bugTrackers. Also sorts the list of repositories by
|
||
their respective ids to make the ordering stable.
|
||
|
||
2014-10-14 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Remove unused jobs table
|
||
https://bugs.webkit.org/show_bug.cgi?id=137724
|
||
|
||
Reviewed by Daniel Bates.
|
||
|
||
Removed jobs table in the database as well as related code.
|
||
|
||
* init-database.sql:
|
||
* public/admin/jobs.php: Removed.
|
||
* public/admin/tests.php:
|
||
* public/include/admin-header.php:
|
||
|
||
2014-10-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New perf dashboard should have an ability to search commits by a keyword
|
||
https://bugs.webkit.org/show_bug.cgi?id=137675
|
||
|
||
Reviewed by Geoffrey Garen.
|
||
|
||
/api/commits/ now accepts query parameters to search a commit by a keyword. Its output format changed to
|
||
include "authorEmail" and "authorName" directly as columns instead of including an "author" object.
|
||
This API change allows fetch_commits_between to generate results without processing Postgres query results.
|
||
|
||
In the front end side, we've added a search pane in pane controller, and the interactive chart component
|
||
now has a concept of highlighted items which is used to indicate commits found by the search pane.
|
||
|
||
* public/api/commits.php:
|
||
(main): Extract query parameters: keyword, from, and to and use that to fetch appropriate commits.
|
||
(fetch_commits_between): Moved some code from main. Now takes a search term as the third argument.
|
||
We look for a commit if its author name or email contains the keyword or if its revision matches the keyword.
|
||
(format_commit): Renamed from format_commits. Now only formats one commit.
|
||
|
||
* public/include/db.php:
|
||
(Database::query_and_fetch_all): Now returns array() when the query results is empty (instead of false).
|
||
|
||
* public/v2/app.css: Renamed .close-button to .icon-button since it's used by a search button as well.
|
||
|
||
* public/v2/app.js:
|
||
(App.Pane.searchCommit): Added. Finds the commits by a search term and assigns 'highlightedItems',
|
||
which is a hash table that contains highlighted items' measurements' ids as keys.
|
||
(App.PaneController.actions.toggleSearch): Toggles the visibility of the search pane. Also sets
|
||
the default commit repository.
|
||
(App.PaneController.actions.searchCommit): Delegates the work to App.Pane.searchCommit.
|
||
(App.InteractiveChartComponent._constructGraphIfPossible): Fixed a bug that we weren't removing old this._dots.
|
||
Added the code to initialize this._highlights.
|
||
(App.InteractiveChartComponent._updateDimensionsIfNeeded): Updates dimensions of highlight lines.
|
||
(App.InteractiveChartComponent._updateHighlightPositions): Added. Ditto.
|
||
(App.InteractiveChartComponent._highlightedItemsChanged): Adds vertical lines for highlighted items and deletes
|
||
the existing lines for the old highlighted items.
|
||
(App.CommitsViewerComponent.commitsChanged): Updated the code per JSON API change mentioned above.
|
||
Also fixed a bug that the code tries to update the commits viewer even if the viewer had already been destroyed.
|
||
|
||
* public/v2/chart-pane.css: Added style for the search pane and the search button.
|
||
|
||
* public/v2/data.js: Turned FetchCommitsForTimeRange into a class: CommitLogs.
|
||
(CommitLogs): Added.
|
||
(CommitLogs.fetchForTimeRange): Renamed from FetchCommitsForTimeRange. Takes a search term as an argument.
|
||
(CommitLogs._cachedCommitsBetween): Extracted from FetchCommitsForTimeRange.
|
||
(CommitLogs._cacheConsecutiveCommits): Ditto.
|
||
(FetchCommitsForTimeRange._cachedCommitsByRepository): Deleted.
|
||
(Measurement.prototype.commitTimeForRepository): Extracted from formattedRevisions.
|
||
(Measurement.prototype.formattedRevisions): Uses formattedRevisions. Deleted the unused code for commitTime.
|
||
|
||
* public/v2/index.html: Added the search pane and the search button. Also removed the unused attribute binding
|
||
for showingDetails since this property is no longer used.
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Manifest.repositories): Added.
|
||
(App.Manifest.repositoriesWithReportedCommits): Ditto. Used by App.PaneController.actions.toggleSearch to find
|
||
the default repository to search.
|
||
(App.Manifest._fetchedManifest): Populates repositories and repositoriesWithReportedCommits.
|
||
|
||
2014-10-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix after r174555.
|
||
|
||
* public/include/manifest.php:
|
||
(ManifestGenerator::generate): Assign an empty array to $repositories_with_commit when there are no commits.
|
||
* tests/admin-regenerate-manifest.js: Fixed the test case.
|
||
|
||
2014-10-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
New perf dashboard UI tries to fetch commits all the time
|
||
https://bugs.webkit.org/show_bug.cgi?id=137592
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Added hasReportedCommits boolean to repository meta data in manifest.json, and used that in
|
||
the front end to avoid issuing HTTP requests to fetch commit logs for repositories with
|
||
no reported commits as they are all going to fail.
|
||
|
||
Also added an internal cache to FetchCommitsForTimeRange in the front end to avoid fetching
|
||
the same commit logs repeatedly. There are two data structures we cache: commitsByRevision
|
||
which maps a given commit revision/hash to a commit object; and commitsByTime which is an array
|
||
of commits sorted chronologically by time.
|
||
|
||
* public/include/manifest.php:
|
||
|
||
* public/v2/app.js:
|
||
(App.CommitsViewerComponent.commitsChanged):
|
||
|
||
* public/v2/data.js:
|
||
(FetchCommitsForTimeRange):
|
||
(FetchCommitsForTimeRange._cachedCommitsByRepository):
|
||
|
||
* public/v2/manifest.js:
|
||
(App.Repository):
|
||
|
||
2014-10-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Another unreviewed build fix after r174477.
|
||
|
||
Don't try to insert a duplicated row into build_commits as it results in a database constraint error.
|
||
|
||
This has been caught by a test in /api/report. I don't know why I thought all tests were passing.
|
||
|
||
* public/include/report-processor.php:
|
||
|
||
2014-10-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix after r174477.
|
||
|
||
* init-database.sql: Removed build_commits_index since it's redundant with build_commit's primary key.
|
||
Also fixed a syntax error that we were missing "," after line that declared build_commit column.
|
||
|
||
* public/api/runs.php: Fixed the query so that test_runs without commits data will be retrieved.
|
||
This is necessary for baseline and target values manually added via admin pages.
|
||
|
||
2014-10-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add v2 UI for the perf dashboard
|
||
https://bugs.webkit.org/show_bug.cgi?id=137537
|
||
|
||
Rubber-stamped by Andreas Kling.
|
||
|
||
* public/v2: Added.
|
||
* public/v2/app.css: Added.
|
||
* public/v2/app.js: Added.
|
||
* public/v2/chart-pane.css: Added.
|
||
* public/v2/data.js: Added.
|
||
* public/v2/index.html: Added.
|
||
* public/v2/js: Added.
|
||
* public/v2/js/d3: Added.
|
||
* public/v2/js/d3/LICENSE: Added.
|
||
* public/v2/js/d3/d3.js: Added.
|
||
* public/v2/js/d3/d3.min.js: Added.
|
||
* public/v2/js/ember-data.js: Added.
|
||
* public/v2/js/ember.js: Added.
|
||
* public/v2/js/handlebars.js: Added.
|
||
* public/v2/js/jquery.min.js: Added.
|
||
* public/v2/js/statistics.js: Added.
|
||
* public/v2/manifest.js: Added.
|
||
* public/v2/popup.js: Added.
|
||
|
||
2014-10-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Remove superfluously duplicated code in public/api/report-commits.php.
|
||
|
||
2014-10-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard should store commit logs
|
||
https://bugs.webkit.org/show_bug.cgi?id=137510
|
||
|
||
Reviewed by Darin Adler.
|
||
|
||
For the v2 version of the perf dashboard, we would like to be able to see commit logs in the dashboard itself.
|
||
|
||
This patch replaces "build_revisions" table with "commits" and "build_commits" relations to store commit logs,
|
||
and add JSON APIs to report and retrieve them. It also adds a tools/pull-svn.py to pull commit logs from
|
||
a subversion directory. The git version of this script will be added in a follow up patch.
|
||
|
||
|
||
In the new database schema, each revision in each repository is represented by exactly one row in "commits"
|
||
instead of one row for each build in "build_revisions". "commits" and "builds" now have a proper many-to-many
|
||
relationship via "build_commits" relations.
|
||
|
||
In order to migrate an existing instance of this application, run the following SQL commands:
|
||
|
||
BEGIN;
|
||
|
||
INSERT INTO commits (commit_repository, commit_revision, commit_time)
|
||
(SELECT DISTINCT ON (revision_repository, revision_value)
|
||
revision_repository, revision_value, revision_time FROM build_revisions);
|
||
|
||
INSERT INTO build_commits (commit_build, build_commit) SELECT revision_build, commit_id
|
||
FROM commits, build_revisions
|
||
WHERE commit_repository = revision_repository AND commit_revision = revision_value;
|
||
|
||
DROP TABLE build_revisions;
|
||
|
||
COMMIT;
|
||
|
||
|
||
The helper script to submit commit logs can be used as follows:
|
||
|
||
python ./tools/pull-svn.py "WebKit" https://svn.webkit.org/repository/webkit/ https://perf.webkit.org
|
||
feeder-slave feeder-slave-password 60 "webkit-patch find-users"
|
||
|
||
The above command will pull the subversion server at https://svn.webkit.org/repository/webkit/ every 60 seconds
|
||
to retrieve at most 10 commits, and submits the results to https://perf.webkit.org using "feeder-slave" and
|
||
"feeder-slave-password" as the builder name and the builder password respectively.
|
||
|
||
The last, optional, argument is the shell command to convert a subversion account to the corresponding username.
|
||
e.g. "webkit-patch find-users rniwa@webkit.org" yields "Ryosuke Niwa" <rniwa@webkit.org> in the stdout.
|
||
|
||
|
||
* init-database.sql: Replaced "build_revisions" relation with "commits" and "build_commits" relations.
|
||
|
||
* public/api/commits.php: Added. Retrieves a list of commits based on arguments in its path of the form
|
||
/api/commits/<repository-name>/<filter>. The behavior of this API depends on <filter> as follows:
|
||
|
||
- Not specified - It returns every single commit for a given repository.
|
||
- Matches "oldest" - It returns the commit with the oldest timestamp.
|
||
- Matches "latest" - It returns the commit with the latest timestamp.
|
||
- Matches "last-reported" - It returns the commit with the latest timestamp added via report-commits.php.
|
||
- Is entirely alphanumeric - It returns the commit whose revision matches the filter.
|
||
- Is of the form <alphanumeric>:<alphanumeric> or <alphanumeric>-<alphanumeric> - It retrieves the list
|
||
of commits added via report-commits.php between two timestamps retrieved from commits whose revisions
|
||
match the two alphanumeric values specified. Because it retrieves commits based on their timestamps,
|
||
the list may contain commits that do not appear as neither hash's ancestor in git/mercurial.
|
||
(main):
|
||
(commit_from_revision):
|
||
(fetch_commits_between):
|
||
(format_commits):
|
||
|
||
* public/api/report-commits.php: Added. A JSON API to report new subversion, git, or mercurial commits.
|
||
See tests/api-report-commits.js for examples on how to use this API.
|
||
|
||
* public/api/runs.php: Updated the query to use "commit_builds" and "commits" relations instead of
|
||
"build_revisions". Regrettably, the new query is 20% slower but I'm going to wait until the new UI is ready
|
||
to optimize this and other JSON APIs.
|
||
|
||
* public/include/db.php:
|
||
(Database::select_or_insert_row):
|
||
(Database::update_or_insert_row): Added.
|
||
(Database::_select_update_or_insert_row): Extracted from select_or_insert_row. Try to update first and then
|
||
insert if the update fails for update_or_insert_row. Preserves the old behavior when $should_update is false.
|
||
|
||
(Database::select_first_row):
|
||
(Database::select_last_row): Added.
|
||
(Database::select_first_or_last_row): Extracted from select_first_row. Fixed a bug that we were asserting
|
||
$order_by to be not alphanumeric/underscore. Retrieve the last row instead of the first if $descending_order.
|
||
|
||
* public/include/report-processor.php:
|
||
(ReportProcessor::resolve_build_id): Store commits instead of build_revisions. We don't worry about the race
|
||
condition for adding "build_commits" rows since we shouldn't have a single tester submitting the same result
|
||
concurrently. Even if it happened, it will only result in a PHP error and the database will stay consistent.
|
||
|
||
* run-tests.js:
|
||
(pathToTests): Don't call path.resolve with "undefined" testName; It throws an exception in the latest node.js.
|
||
|
||
* tests/api-report-commits.js: Added.
|
||
* tests/api-report.js: Fixed a test per build_revisions to build_commits/commits replacement.
|
||
|
||
* tools: Added.
|
||
* tools/pull-svn.py: Added. See above for how to use this script.
|
||
(main):
|
||
(determine_first_revision_to_fetch):
|
||
(fetch_revision_from_dasbhoard):
|
||
(fetch_commit_and_resolve_author):
|
||
(fetch_commit):
|
||
(textContent):
|
||
(resolve_author_name_from_email):
|
||
(submit_commits):
|
||
|
||
2014-09-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Update Install.md for Mavericks and fix typos
|
||
https://bugs.webkit.org/show_bug.cgi?id=137276
|
||
|
||
Reviewed by Benjamin Poulain.
|
||
|
||
Add the instruction to copy php.ini to enable the Postgres extension in PHP.
|
||
|
||
Also use perf.webkit.org as the directory name instead of WebKitPerfMonitor.
|
||
|
||
Finally, init-database.sql is no longer located inside database directory.
|
||
|
||
* Install.md:
|
||
|
||
2014-08-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Report run id's in api/runs.php for the new dashboard UI
|
||
https://bugs.webkit.org/show_bug.cgi?id=135813
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Include run_id in the generated JSON.
|
||
|
||
* public/api/runs.php:
|
||
(fetch_runs_for_config): Don't sort results by time since that has been done in the front end for ages now.
|
||
(format_run):
|
||
|
||
2014-08-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Merging platforms mixes baselines and targets into reported data
|
||
https://bugs.webkit.org/show_bug.cgi?id=135260
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
When merging two platforms, move test configurations of a different type (baseline, target)
|
||
as well as of different metric (Time, Runs).
|
||
|
||
Also avoid fetching the entire table of runs just to see if there are no remaining runs.
|
||
It's sufficient to detect one such test_runs object.
|
||
|
||
* public/admin/platforms.php:
|
||
(merge_platforms):
|
||
|
||
2014-07-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Merging platforms mixes baselines and targets into reported data
|
||
https://bugs.webkit.org/show_bug.cgi?id=135260
|
||
|
||
Reviewed by Geoffrey Garen.
|
||
|
||
Make sure two test configurations we're merging are of the same type (e.g. baseline, target, current).
|
||
Otherwise, we'll erroneously mix up runs for baseline, target, and current (reported values).
|
||
|
||
* public/admin/platforms.php:
|
||
|
||
2014-07-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r171361.
|
||
|
||
* public/js/helper-classes.js:
|
||
(.this.formattedBuildTime):
|
||
|
||
2014-07-22 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard spends 2s processing JSON data during the page loads
|
||
https://bugs.webkit.org/show_bug.cgi?id=135152
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
In the Apple internal dashboard, we were spending as much as 2 seconds
|
||
converting raw JSON data into proper JS objects while loading the dashboard.
|
||
|
||
This caused the apparent unresponsiveness of the dashboard despite of the fact
|
||
charts themselves updated almost instantaneously.
|
||
|
||
* public/index.html:
|
||
* public/js/helper-classes.js:
|
||
(TestBuild): Compute the return values of formattedTime and formattedBuildTime
|
||
lazily as creating new Date objects and running string replace is expensive.
|
||
(TestBuild.formattedTime):
|
||
(TestBuild.formattedBuildTime):
|
||
(PerfTestRuns.setResults): Added. Pushing each result was the biggest bottle neck.
|
||
(PerfTestRuns.addResult): Deleted.
|
||
|
||
2014-07-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Perf dashboard shouldn't show the full git hash
|
||
https://bugs.webkit.org/show_bug.cgi?id=135083
|
||
|
||
Reviewed by Benjamin Poulain.
|
||
|
||
Detect Git/Mercurial hash by checking the length.
|
||
|
||
If it's a hash, use the first 8 characters in the label
|
||
while retaining the full length to be used in hyperlinks.
|
||
|
||
* public/js/helper-classes.js:
|
||
(.this.formattedRevisions):
|
||
(TestBuild):
|
||
|
||
2014-05-29 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add an instruction on how to backup the database.
|
||
https://bugs.webkit.org/show_bug.cgi?id=133391
|
||
|
||
Rubber-stamped by Andreas Kling.
|
||
|
||
* Install.md:
|
||
|
||
2014-04-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r166479. 'bytes' is now abbreviated as 'B'.
|
||
|
||
* public/js/helper-classes.js:
|
||
(PerfTestRuns.smallerIsBetter):
|
||
|
||
2014-04-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Some CSS teaks.
|
||
|
||
* public/common.css:
|
||
(#title):
|
||
* public/index.html:
|
||
(#charts .pane):
|
||
(#charts .arrow):
|
||
|
||
2014-04-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
WebKitPerfMonitor: There should be a way to add all metrics of a suite without also adding subtests
|
||
https://bugs.webkit.org/show_bug.cgi?id=131157
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Split "all metrics" into all metrics of a test suite and all subtests of the suite.
|
||
This allows, for example, adding all metrics such as Arithmetic and Geometric for
|
||
a given test suite without also adding its subtests.
|
||
|
||
* public/index.html:
|
||
(init.showCharts):
|
||
(init):
|
||
|
||
2014-04-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
WebKitPerfMonitor: Tooltips cannot be pinned after using browser's back button
|
||
https://bugs.webkit.org/show_bug.cgi?id=131155
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
The bug was caused by Chart.attach binding event listeners on plot container on each call.
|
||
This resulted in the click event handler toggling the visiblity of the tooltip twice upon
|
||
click when attach() has been called even number of times, keeping the tooltip invisible.
|
||
|
||
Fixed the bug by extracting the code to bind event listeners outside of Chart.attach as
|
||
a separate function, bindPlotEventHandlers, and calling it exactly once when Chart.attach
|
||
is called for the first time.
|
||
|
||
* public/index.html:
|
||
(Chart.attach):
|
||
(Chart..bindPlotEventHandlers):
|
||
|
||
2014-04-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
WebKitPerfMonitor: Tooltips can be cut off at the top
|
||
https://bugs.webkit.org/show_bug.cgi?id=130960
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
* public/common.css:
|
||
(#title): Removed the gradients, box shadows, and border from the header.
|
||
(#title h1): Reduce the font size.
|
||
(#title ul): Use line-height to vertically align the navigation bar instead of specifying a padding atop.
|
||
* public/index.html:
|
||
(.tooltop:before): Added. Identical to .tooltop:after except it's upside down (arrow facing up).
|
||
(.tooltip.inverted:before): Show the arrow facing up when .inverted is set.
|
||
(.tooltip.inverted:before): Hide the arrow facing down when .inverted is set.
|
||
* public/js/helper-classes.js:
|
||
(Tooltip.show): Show the tooltip below the point if placing it above the point results in the top of the
|
||
tooltip extending above y=0.
|
||
|
||
2014-04-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
WebKitPerfMonitor: Y-axis adjustment is too aggressive
|
||
https://bugs.webkit.org/show_bug.cgi?id=130937
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
Previously, adjusted min. and max. were defined as the two standards deviations away from EWMA of measured
|
||
results. This had two major problems:
|
||
1. Two standard deviations can be too small to show the confidence interval for results.
|
||
2. Sometimes baseline and target can be more than two standards deviations away.
|
||
|
||
Fixed the bug by completely rewriting the algorithm to compute the interval. Instead of blindly using two
|
||
standard deviations as margins, we keep adding quarter the standard deviation on each side until more than 90%
|
||
of points lie in the interval or we've expanded 4 standard deviations. Once this condition is met, we reduce
|
||
the margin on each side separately to reduce the empty space on either side.
|
||
|
||
A more rigorous approach would involve computing least squared value of results with respect to intervals
|
||
but that seems like an overkill for a simple UI problem; it's also computationally expensive.
|
||
|
||
* public/index.html:
|
||
(Chart..adjustedIntervalForRun): Extracted from computeYAxisBoundsToFitLines.
|
||
(Chart..computeYAxisBoundsToFitLines): Compute the min. and max. adjusted intervals out of adjusted intervals
|
||
for each runs (current, baseline, and target) so that at least one point from each set of results is shown.
|
||
We wouldn't see the difference between measured values versus baseline and target values otherwise.
|
||
* public/js/helper-classes.js:
|
||
(PerfTestResult.unscaledConfidenceIntervalDelta): Returns the default value if the confidence
|
||
interval delta cannot be computed.
|
||
(PerfTestResult.isInUnscaledInterval): Added. Returns true iff the confidence intervals lies
|
||
within the given interval.
|
||
(PerfTestRuns..filteredResults): Extracted from unscaledMeansForAllResults now that PerfTestRuns.min and
|
||
PerfTestRuns.max need to use both mean and confidence interval delta for each result.
|
||
(PerfTestRuns..unscaledMeansForAllResults):
|
||
(PerfTestRuns.min): Take the confidence interval delta into account.
|
||
(PerfTestRuns.max): Ditto.
|
||
(PerfTestRuns.countResults): Returns the number of results in the given time frame (> minTime).
|
||
(PerfTestRuns.countResultsInInterval): Returns the number of results whose confidence interval lie within the
|
||
given interval.
|
||
(PerfTestRuns.exponentialMovingArithmeticMean): Fixed the typo so that it actually computes the EWMA.
|
||
|
||
2014-03-31 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Some CSS tweaks after r166477 and r166479,
|
||
|
||
* public/index.html:
|
||
|
||
2014-03-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
WebKitPerfMonitor: Sometimes text inside panes overlap
|
||
https://bugs.webkit.org/show_bug.cgi?id=130956
|
||
|
||
Reviewed by Gyuyoung Kim.
|
||
|
||
Revamped the pane UI. Now build info uses table element instead of plane text with BRs. The computed status of
|
||
the latest result against baseline/target such as "3% until target" is now shown above the current value. This
|
||
reduces the total height of the pane and fits more information per screen capita on the dashboard.
|
||
|
||
* public/index.html: Updated and added a bunch of CSS rules for the new look.
|
||
(.computeStatus): Don't append the build info here. The build info is constructed as a separate table now.
|
||
(.createSummaryRowMarkup): Use th instead of td for "Current", "Baseline", and "Target" in the summary table.
|
||
(.buildLabelWithLinks): Construct table rows instead of br separated lines of text. This streamlines the look
|
||
of the build info shown in a chart pane and a tooltip.
|
||
(Chart): Made .status a table.
|
||
(Chart.populate): Prepend status.text, which contains text such as "3% until target", into the summary rows
|
||
right above "Current" value, and populate .status with buildLabelWithLinks manually instead of status.text
|
||
now that status.text no longer contains it.
|
||
(Chart..showTooltipWithResults): Wrap buildLabelWithLinks with a table element.
|
||
|
||
* public/js/helper-classes.js:
|
||
(TestBuild.formattedRevisions): Don't include repository names in labels since repository names are now added
|
||
by buildLabelWithLinks inside th elements. Also place spaces around '-' between two different OS X versions.
|
||
e.g. "OS X 10.8 - OS X 10.9" instead of "OS X 10.8-OS X 10.9".
|
||
(PerfTestRuns): Use "/s" for "runs/s" and "B" for "bytes" to make text shorter in .status and .summaryTable.
|
||
(PerfTestRuns..computeScalingFactorIfNeeded): Avoid placing a space between 'M' and a unit starting with a
|
||
capital letter; e.g. "MB" instead of "M B".
|
||
|
||
2014-03-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
WebKitPerfMonitor: Header and number-of-days slider takes up too much space
|
||
https://bugs.webkit.org/show_bug.cgi?id=130957
|
||
|
||
Reviewed by Gyuyoung Kim.
|
||
|
||
Moved the slider into the header. Also reduced the spacing between the header and platform names.
|
||
This reclaims 50px × width of the screen real estate.
|
||
|
||
* public/common.css:
|
||
(#title): Reduced the space below the header from 20px to 10px.
|
||
* public/index.html:
|
||
(#numberOfDaysPicker): Removed the rounded border around the number-of-days slider.
|
||
(#dashboard > tbody > tr > td): Added a 1.5em padding at the bottom.
|
||
(#dashboard > thead th): That allows us to remove the padding at the top here. This reduces the wasted screen
|
||
real estate between the header and the platform names.
|
||
|
||
2014-03-10 Zoltan Horvath <zoltan@webkit.org>
|
||
|
||
Update the install guidelines for perf.webkit.org
|
||
https://bugs.webkit.org/show_bug.cgi?id=129895
|
||
|
||
Reviewed by Ryosuke Niwa.
|
||
|
||
The current install guideline for perf.webkit.org discourages the use of the installed
|
||
Server application. I've actualized the documentation for Mavericks, and modified the
|
||
guideline to include the instructions for Server.app also.
|
||
|
||
* Install.md:
|
||
|
||
2014-03-08 Zoltan Horvath <zoltan@webkit.org>
|
||
|
||
Update perf.webkit.org json example
|
||
https://bugs.webkit.org/show_bug.cgi?id=129907
|
||
|
||
Reviewed by Andreas Kling.
|
||
|
||
The current example is not valid json syntax. I fixed the syntax errors and indented the code properly.
|
||
|
||
* ReadMe.md:
|
||
|
||
2014-01-31 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Merge database-common.js and utility.js into run-tests.js.
|
||
|
||
Reviewed by Matthew Hanson.
|
||
|
||
Now that run-tests is the only node.js script, merged database-common.js and utility.js into it.
|
||
Also moved init-database.sql out of the database directory and removed the directory entirely.
|
||
|
||
* database: Removed.
|
||
* database/database-common.js: Removed.
|
||
* database/utility.js: Removed.
|
||
* init-database.sql: Moved from database/init-database.sql.
|
||
* run-tests.js:
|
||
(connect): Moved from database-common.js.
|
||
(pathToDatabseSQL): Extracted from pathToLocalScript.
|
||
(pathToTests): Moved from database-common.js.
|
||
(config): Ditto.
|
||
(TaskQueue): Ditto.
|
||
(SerializedTaskQueue): Ditto.
|
||
(main):
|
||
(initializeDatabase):
|
||
(TestEnvironment.it):
|
||
(TestEnvironment.queryAndFetchAll):
|
||
(sendHttpRequest):
|
||
|
||
2014-01-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Remove the dependency on node.js from the production code.
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Work towards <rdar://problem/15955053> Upstream SafariPerfMonitor.
|
||
|
||
Removed node.js dependency from TestRunsGenerator. It was really a design mistake to invoke node.js from php.
|
||
It added so much complexity with only theoretical extensibility of adding aggregators. It turns out that
|
||
many aggregators we'd like to add are a lot more complicated than ones that could be written under the current
|
||
infrastructure, and we need to make the other aspects (e.g. the level of aggregations) a lot more extensible.
|
||
Removing and simplifying TestRunsGenerator allows us to implement such extensions in the future.
|
||
|
||
Also removed the js files that are no longer used.
|
||
|
||
* config.json: Moved from database/config.json.
|
||
* database/aggregate.js: Removed. No longer used.
|
||
* database/database-common.js: Removed unused functions, and updated the path to config.json.
|
||
* database/process-jobs.js: Removed. No longer used.
|
||
* database/sample-data.sql: Removed. We have a much better corpus of data now.
|
||
* database/schema.graffle: Removed. It's completely obsolete.
|
||
* public/include/db.php: Updated the path to config.json.
|
||
* public/include/evaluator.js: Removed.
|
||
|
||
* public/include/report-processor.php:
|
||
(TestRunsGenerator::aggregate): Directly aggregate values via newly added aggregate_values method instead of
|
||
storing values into $expressions and calling evaluate_expressions_by_node.
|
||
(TestRunsGenerator::aggregate_values): Added.
|
||
(TestRunsGenerator::compute_caches): Directly compute the caches.
|
||
|
||
2014-01-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Don't fail the platform merges even if there are no test configurations to be moved to the new platform.
|
||
|
||
* public/admin/platforms.php:
|
||
* public/include/db.php:
|
||
|
||
2014-01-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Zoomed y-axis view is ununsable when the last result is an outlier.
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
Show two standard deviations from the exponential moving average with alpha = 0.3 instead of the mean of
|
||
the last result so that the graph looks sane if the last result was an outlier. However, always show
|
||
the last result's mean even if it was an outlier.
|
||
|
||
* public/index.html:
|
||
* public/js/helper-classes.js:
|
||
(unscaledMeansForAllResults): Extracted from min/max/sampleStandardDeviation.
|
||
Also added the ability to cache the unscaled means to avoid recomputation.
|
||
(PerfTestRuns.min): Refactored to use unscaledMeansForAllResults.
|
||
(PerfTestRuns.max): Ditto.
|
||
(PerfTestRuns.sampleStandardDeviation): Ditto.
|
||
(PerfTestRuns.exponentialMovingArithmeticMean): Added.
|
||
|
||
2014-01-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Minor fixes.
|
||
|
||
* public/admin/tests.php:
|
||
* public/js/helper-classes.js:
|
||
|
||
2014-01-29 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Use two standard deviations instead as I mentioned in the mailing list.
|
||
|
||
* public/index.html:
|
||
|
||
2014-01-28 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
The performance dashboard erroneously shows upward arrow for combined metrics.
|
||
|
||
A single outlier can ruin the zoomed y-axis view.
|
||
|
||
Rubber-stamped by Antti Koivisto.
|
||
|
||
* public/index.html:
|
||
(computeYAxisBoundsToFitLines): Added adjustedMax and adjustedMin, which are pegged at 4 standard deviations
|
||
from the latest results' mean.
|
||
(Chart): Renamed shouldStartYAxisAtZero to shouldShowEntireYAxis.
|
||
(Chart.attachMainPlot): Use the adjusted max and min when we're not showing the entire y-axis.
|
||
(Chart.toggleYAxis):
|
||
* public/js/helper-classes.js:
|
||
(PerfTestRuns.sampleStandardDeviation): Added.
|
||
(PerfTestRuns.smallerIsBetter): 'Combined' is a smaller is better metric.
|
||
|
||
2014-01-28 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Don't include the confidence interval when computing the y-axis.
|
||
|
||
Rubber-stamped by Simon Fraser.
|
||
|
||
* public/js/helper-classes.js:
|
||
(PerfTestRuns.min):
|
||
(PerfTestRuns.max):
|
||
|
||
2014-01-25 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Tiny CSS tweak for tooltips.
|
||
|
||
* public/index.html:
|
||
|
||
2014-01-25 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Remove the erroneously repeated code.
|
||
|
||
* public/admin/test-configurations.php:
|
||
|
||
2014-01-24 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/15704893> perf dashboard should show baseline numbers
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
* public/admin/bug-trackers.php:
|
||
(associated_repositories): Return an array of HTMLs instead of echo'ing as expected by AdministrativePage.
|
||
Also fixed a typo.
|
||
|
||
* public/admin/platforms.php:
|
||
(merge_list): Ditto.
|
||
|
||
* public/admin/test-configurations.php: Added.
|
||
(add_run): Adds a "synthetic" test run and a corresponding build. It doesn't create run_iterations and
|
||
build_revisions as they're not meaningful for baseline / target numbers.
|
||
(delete_run): Deletes a synthetic test run and its build. It verifies that the specified build has exactly
|
||
one test run so that we don't accidentally delete a reported test run.
|
||
(generate_rows_for_configurations): Generates rows of configuration IDs and types.
|
||
(generate_rows_for_test_runs): Ditto for test runs. It also emits the form to add new "synthetic" test runs
|
||
and delete existing ones.
|
||
|
||
* public/admin/tests.php: We wrongfully assumed there is exactly one test configuration for each metric
|
||
on each platform; there could be configurations of distinct types such as "current" and "baseline".
|
||
Thus, update all test configurations for a given metric when updating config_is_in_dashboard.
|
||
|
||
* public/api/runs.php: Remove the NotImplemented when we have multiple test configurations.
|
||
(fetch_runs_for_config): "Synthetic" test runs created on test-configurations page are missing revision
|
||
data so we need to left-outer-join (instead of inner-join) build_revisions. To avoid making the query
|
||
unreadable, don't join revision_repository here. Instead, fetch the list of repositories upfront and
|
||
resolve names in parse_revisions_array. This actually reduces the query time by ~10%.
|
||
|
||
(parse_revisions_array): Skip an empty array created for "synthetic" test runs.
|
||
|
||
* public/include/admin-header.php:
|
||
(AdministrativePage::render_table): Now custom columns support sub columns. e.g. a configuration column may
|
||
have id and type sub columns, and each custom column could generate multiple rows.
|
||
|
||
Any table with sub columns now generates two rows for thead. We generate td's in in the first row without
|
||
sub columns with rowspan of 2, and generate ones with sub columns with colspan set to the sub column count.
|
||
We then proceed to generate the second header row with sub column names.
|
||
|
||
When generating the actual content, we first generate all custom columns as they may have multiple rows in
|
||
which case regular columns need rowspan set to the maximum number of rows.
|
||
|
||
Once we've generated the first row, we proceed to generate subsequent rows for those custom columns that
|
||
have multiple rows.
|
||
|
||
(AdministrativePage::render_custom_cells): Added. This function is responsible for generating table cells
|
||
for a given row in a given custom column. It generates an empty td when the custom column doesn't have
|
||
enough rows. It also generates empty an td when it doesn't have enough columns in some rows except when
|
||
the entire row consists of exactly one cell for a custom column with sub columns, in which case the cell is
|
||
expanded to occupy all sub columns.
|
||
|
||
* public/include/manifest.php:
|
||
(ManifestGenerator::platforms): Don't add the metric more than once.
|
||
|
||
* public/include/test-name-resolver.php:
|
||
(TestNameResolver::__construct): We had wrongfully assumed that we have exactly one test configuration on
|
||
each platform for each metric like tests.php. Fixed that. Also fetch the list of aggregators to compute the
|
||
full metric name later.
|
||
(TestNameResolver::map_metrics_to_tests): Populate $this->id_to_metric.
|
||
(TestNameResolver::test_id_for_full_name): Simplified the code using array_get.
|
||
(TestNameResolver::full_name_for_test): Added.
|
||
(TestNameResolver::full_name_for_metric): Added.
|
||
(TestNameResolver::configurations_for_metric_and_platform): Renamed as it returns multiple configurations.
|
||
|
||
* public/js/helper-classes.js:
|
||
(TestBuild): Use the build time as the maximum time when revision information is missing for "synthetic"
|
||
test runs created to set baseline and target points.
|
||
|
||
2014-01-24 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix after r57928. Removed a superfluous close parenthesis.
|
||
|
||
* public/api/runs.php:
|
||
|
||
2014-01-24 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build & typo fixes.
|
||
|
||
* public/admin/platforms.php:
|
||
* tests/admin-platforms.js:
|
||
|
||
2014-01-24 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/15704893> perf dashboard should show baseline numbers
|
||
|
||
Rubber-stamped by Antti Koivisto.
|
||
|
||
Organize some code into functions in runs.php.
|
||
|
||
Also added back $paths that was erroneously removed in r57925 from json-header.php.
|
||
|
||
* public/api/runs.php:
|
||
(fetch_runs_for_config): Extracted.
|
||
(format_run): Ditto.
|
||
|
||
2014-01-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Merge the upstream json-shared.php as of https://trac.webkit.org/r162693.
|
||
|
||
* database/config.json:
|
||
* public/admin/reprocess-report.php:
|
||
* public/api/report.php:
|
||
* public/api/runs.php:
|
||
* public/include/json-header.php:
|
||
|
||
2014-01-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Commit yet another forgotten change.
|
||
|
||
Something went horribly wrong with my merge :(
|
||
|
||
* database/init-database.sql:
|
||
|
||
2014-01-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Commit one more forgotten change. Sorry for making a mess here.
|
||
|
||
2014-01-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Commit the forgotten files.
|
||
|
||
* public/admin/platforms.php: Added.
|
||
* tests/admin-platforms.js: Added.
|
||
|
||
2014-01-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/15889905> SafariPerfMonitor: there should be a way to merge and hide platforms
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
Added /admin/platforms/ page to hide and merge platforms.
|
||
|
||
Merging two platforms is tricky because we need to migrate test runs as well as some test configurations.
|
||
Recall that each test (e.g. Dromaeo) can have many "test metrics" (e.g. MaxAllocations, EndAllocations),
|
||
and they have a distinct "test configuration" for each platform (e.g. MaxAllocation on Mountain Lion), and
|
||
each test configuration a distinct "test run" for each build.
|
||
|
||
In order to merge platform A into platform B, we must migrate all test runs that belong to platform A via
|
||
their test configurations into platform B.
|
||
|
||
Suppose we're migrating a test run R for test configuration T_A in platform A for metric M. Since M exists
|
||
independent of platforms, R should continue to relate to M through some test configuration. Unfortunately,
|
||
we can't simply move T_A into platform B since we may already have a test configuration T_B for metric M
|
||
in platform B, in which case R should relate to T_B instead.
|
||
|
||
Thus, we first migrate all test runs for which we already have corresponding test configurations in the
|
||
new platform. We then migrate the test configurations of the remaining test runs.
|
||
|
||
* database/init-database.sql: Added platform_hidden.
|
||
|
||
* public/admin/platforms.php: Added.
|
||
(merge_platforms): Added. Implements the algorithm described above.
|
||
(merge_list): Added.
|
||
|
||
* public/admin/tests.php: Disable the checkbox to show a test configuration on the dashboard if its platform
|
||
is hidden since it doesn't do anything.
|
||
|
||
* public/include/admin-header.php: Added the hyperlink to /admin/platforms.
|
||
(update_field): Don't bail out if the newly added "update-column" is set to the field name even if $_POST is
|
||
missing it since unchecked checkbox doesn't set the value in $_POST.
|
||
(AdministrativePage::render_form_control_for_column): Added the support for boolean edit mode. Also used
|
||
switch statement instead of repeated if's.
|
||
(AdministrativePage::render_table): Emit "update-column" for update_field.
|
||
|
||
* public/include/db.php: Disable warnings when we're not in the debug mode.
|
||
|
||
* public/include/manifest.php:
|
||
(ManifestGenerator::platforms): Skip platforms that have been hidden.
|
||
|
||
* run-tests.js:
|
||
(TestEnvironment.postJSON):
|
||
(TestEnvironment.httpGet):
|
||
(TestEnvironment.httpPost): Added.
|
||
(sendHttpRequest): Set the content type if specified.
|
||
|
||
* tests/admin-platforms.js: Added tests.
|
||
|
||
2014-01-22 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Extract the code to compute full test names from tests.php.
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
Extracted TestNameResolver out of tests.php. This reduces the number of global variables in tests.php
|
||
and paves our way to re-use the code in other pages.
|
||
|
||
* public/admin/tests.php:
|
||
|
||
* public/include/db.php:
|
||
(array_set_default): Renamed from array_item_set_default and moved from tests.php as it's used in both
|
||
tests.php and test-name-resolver.php.
|
||
|
||
* public/include/test-name-resolver.php: Added.
|
||
(TestNameResolver::__construct):
|
||
(TestNameResolver::compute_full_name): Moved from tests.php.
|
||
(TestNameResolver::map_metrics_to_tests): Ditto.
|
||
(TestNameResolver::sort_tests_by_full_name): Ditto.
|
||
(TestNameResolver::tests): Added.
|
||
(TestNameResolver::test_id_for_full_name): Ditto.
|
||
(TestNameResolver::metrics_for_test_id): Ditto.
|
||
(TestNameResolver::child_metrics_for_test_id): Ditto.
|
||
(TestNameResolver::configuration_for_metric_and_platform): Ditto.
|
||
|
||
2014-01-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/15867325> Perf dashboard is erroneously associating reported results with old revisions
|
||
|
||
Reviewed by Stephanie Lewis.
|
||
|
||
Add the ability to reprocess reports so that I can re-associate wrongfully associated reports.
|
||
|
||
Added public/admin/reprocess-report.php. It doesn't have any nice UI to find reports and it returns JSON
|
||
but that's sufficient to correct the wrongfully processed reports for now.
|
||
|
||
* public/admin/reprocess-report.php: Added. Takes a report id in $_GET or $_POST and process the report.
|
||
We should eventually add a nice UI to find and reprocess reports.
|
||
|
||
* public/api/report.php: ReportProcessor and TestRunsGenerator have been removed.
|
||
|
||
* public/include/db.php: Added the forgotten call to prefixed_column_names.
|
||
|
||
* public/include/report-processor.php: Copied from public/api/report.php.
|
||
(ReportProcessor::__construct): Fetch the list of aggregators here for simplicity.
|
||
(ReportProcessor::process): Optionally takes $existing_report_id. When this value is specified, we don't
|
||
create a new report or authenticate the builder password (the password is never stored in the report).
|
||
Also use select_first_row instead of query_and_fetch_all to find the builder for simplicity.
|
||
(ReportProcessor::construct_build_data): Extracted from store_report_and_get_build_data.
|
||
(ReportProcessor::store_report): Ditto.
|
||
|
||
* tests/admin-reprocess-report.js: Added.
|
||
|
||
2014-01-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/15867325> Perf dashboard is erroneously associating reported results with old revisions
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
The bug was caused by a build fix r57645. It attempted to treat multiple reports from the same builder
|
||
for the same build number as a single build by ignoring build time. This was necessary to associate
|
||
multiple reports by a single build - e.g. for different performance test suites - because the scripts
|
||
we use to submit results computed its own "build time" when they're called.
|
||
|
||
An unintended consequence of this change was revealed when we moved a buildbot master to the new machine
|
||
last week; new reports were wrongfully associated with old build numbers.
|
||
|
||
Fixed the bug by not allowing reports made more than 1 day after the initial build time to be assigned
|
||
to the same build. Instead, we create a new build object for those reports. Since the longest set of
|
||
tests we have only take a couple of hours to run, 24 hours should be more than enough.
|
||
|
||
* database/init-database.sql: We can no longer constrain that each build number is unique to a builder
|
||
or that build number and build time pair is unique. Instead, constrain the uniqueness of the tuple
|
||
(builder, build number, build time).
|
||
|
||
* public/api/report.php:
|
||
(ReportProcessor::resolve_build_id): Look for any builds made within the past one day. Create a new build
|
||
when no such build exists. This prevents a report from being associated with a very old build of the same
|
||
build number.
|
||
|
||
Also check that revision numbers or hashes match when we're adding revision info. This will let us catch
|
||
a similar bug in the future sooner.
|
||
|
||
* tests/api-report.js: Added three test cases.
|
||
|
||
2014-01-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Merged the upstream changes to db.php
|
||
See http://trac.webkit.org/browser/trunk/Websites/test-results/public/include/db.php
|
||
|
||
* public/include/db.php:
|
||
|
||
2014-01-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Update other scripts and tests per previous patch.
|
||
|
||
* public/include/manifest.php:
|
||
* tests/admin-regenerate-manifest.js:
|
||
|
||
2014-01-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Remove metrics_unit.
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
This column is no longer used by the front-end code since r48360.
|
||
|
||
* database/init-database.sql:
|
||
* public/admin/tests.php:
|
||
|
||
2014-01-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix.
|
||
|
||
* public/api/report.php:
|
||
|
||
2014-01-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/15832456> Automate DoYouEvenBench (124497)
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Support a new alternative format for aggregated results where we have raw values as well as
|
||
the list aggregators so that instead of
|
||
"metrics": {"Time": ["Arithmetic"]}
|
||
we can have
|
||
"metrics": {"Time": { "aggregators" : ["Arithmetic"], "current": [300, 310, 320, 330] }}
|
||
|
||
This allows single JSON generated by run-perf-tests in WebKit to be shared between the perf
|
||
dashboard and the generated results page, which doesn't know how to aggregate values.
|
||
|
||
We need to keep the support for the old format because all other existing performance tests
|
||
all rely on the old format. Even if we updated the tests, we need the dashboard to support
|
||
the old format during the transition.
|
||
|
||
* public/api/report.php:
|
||
(ReportProcessor::recursively_ensure_tests): Support the new format in addition to the old one.
|
||
(ReportProcessor::aggregator_list_if_exists): Replaced is_list_of_aggregators.
|
||
|
||
* tests/api-report.js: Updated one of aggregator test cases to test the new format.
|
||
|
||
2013-05-31 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed; Tweak the CSS so that chart panes align vertically.
|
||
|
||
* public/index.html:
|
||
|
||
2013-05-31 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor should support Combined metric.
|
||
|
||
* public/js/helper-classes.js:
|
||
(PerfTestRuns): Added 'Combined' metric. In general, it could be used for smaller-is-better
|
||
value as well but assume it to be greater-is-better for now.
|
||
|
||
2013-05-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Commit the forgotten init-database change to add iteration_relative_time.
|
||
|
||
* database/init-database.sql:
|
||
|
||
2013-05-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13993069> SafariPerfMonitor: Support accepting (relative time, value) pairs
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Add the support for each value to have a relative time. This is necessary for frame rate history
|
||
since a frame rate needs to be associated with a time it was sampled.
|
||
|
||
* database/init-database.sql: Added iteration_relative_time to run_iterations.
|
||
|
||
* public/api/report.php:
|
||
(TestRunsGenerator::test_value_list_to_values_by_iterations): Reject any non-numeral values here.
|
||
This code is used to aggregate values but it doesn't make sense to aggregate iteration values
|
||
with relative time since taking the average of two frame rates for two subtests taken at two
|
||
different times doesn't make any sense.
|
||
(TestRunsGenerator::compute_caches): When we encounter an array value while computing sum, mean,
|
||
etc..., use the second element since we assume values are of the form (relative time, frame rate).
|
||
Also exit early with an error if the number of elements in the array is not a pair.
|
||
(TestRunsGenerator::commit): Store the relative time and the frame rate as needed.
|
||
|
||
* tests/api-report.js: Added a test case. Also modified existing test cases to account for
|
||
iteration_relative_time.
|
||
|
||
2013-05-27 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13654488> SafariPerfMonitor: Support accepting single-value results
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Support that. It's one line change.
|
||
|
||
* public/api/report.php:
|
||
(ReportProcessor.recursively_ensure_tests): When there is exactly one value, wrap it inside an array
|
||
to match the convention assumed elsewhere.
|
||
* tests/api-report.js: Added a test case.
|
||
|
||
2013-05-26 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor shows popups for points outside of the visible region.
|
||
|
||
Rubber-stamped by Simon Fraser.
|
||
|
||
* public/index.html:
|
||
(Chart.closestItemForPageXRespectingPlotOffset): renamed from closestItemForPageX.
|
||
(Chart.attach): Always use closestItemForPageXRespectingPlotOffset to work around the fact flot
|
||
may return an item underneath y-axis labels.
|
||
|
||
2013-05-26 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Tweak the CSS a little to avoid the test name overlapping with the summary table.
|
||
|
||
* public/index.html:
|
||
|
||
2013-05-26 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed. Fix the typo. The anchor element should wrap the svg element, not the other way around.
|
||
|
||
* public/index.html:
|
||
|
||
2013-05-26 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13992266> Should be a toggle to show entire Y-axis range
|
||
<rdar://problem/13992271> Should scale Y axis to include error ranges
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Add the feature. Also made adjust y-axis respect confidence interval delta so that the gray shade behind
|
||
the main graph doesn't go outside the graph even when the y-axis is adjusted.
|
||
|
||
* database/config.json:
|
||
* public/index.html:
|
||
(Chart): Add a SVG arrow to toggle y-axis mode, and bind click on the arrow to toggleYAxis().
|
||
(Chart.attachMainPlot): Respect shouldStartYAxisAtZero.
|
||
(Chart.toggleYAxis): Toggle the y-axis mode of this chart by toggling shouldStartYAxisAtZero and calling
|
||
attachMainPlot.
|
||
* public/js/helper-classes.js:
|
||
(PerfTestResult.confidenceIntervalDelta):
|
||
(PerfTestResult.unscaledConfidenceIntervalDelta): Extracted.
|
||
(PerfTestRuns.min): Take confidence interval delta into account.
|
||
(PerfTestRuns.max): Ditto.
|
||
(PerfTestRuns.hasConfidenceInterval): Not sure why this function was checking the typeof. Just use isNaN.
|
||
|
||
2013-04-26 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
A build fix of the previous. Don't look for a test with NULL parent because NULL != NULL in our beloved SQL.
|
||
|
||
* public/api/report.php:
|
||
(ReportProcessor::recursively_ensure_tests):
|
||
* tests/api-report.js: Added a test.
|
||
|
||
2013-04-26 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fixes.
|
||
|
||
* public/api/report.php:
|
||
(ReportProcessor::process): Explicitly exit with error when builder name or build time is missing.
|
||
Also, tolerate reports without any revision information.
|
||
|
||
(ReportProcessor::recursively_ensure_tests): When looking for a test, don't forget to compare its
|
||
parent test.
|
||
|
||
* tests/api-report.js: Added few test cases.
|
||
|
||
2013-04-26 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Commit another change that was supposed to be committed in r50331.
|
||
|
||
* run-tests.js:
|
||
(TestEnvironment.this.postJSON):
|
||
(TestEnvironment.this.httpGet):
|
||
(sendHttpRequest):
|
||
|
||
2013-04-09 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Commit the remaining files.
|
||
|
||
* public/admin/regenerate-manifest.php:
|
||
* public/include/admin-header.php:
|
||
* public/include/json-header.php:
|
||
* public/include/manifest.php:
|
||
* run-tests.js:
|
||
(TestEnvironment.this.postJSON):
|
||
(TestEnvironment.this.httpGet):
|
||
(sendHttpRequest):
|
||
|
||
2013-03-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor: Add some tests for admin/regenerate-manifest.
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Added some tests for admin/regenerate-manifest.
|
||
|
||
* public/admin/regenerate-manifest.php: Use require_once instead of require.
|
||
* public/include/admin-header.php: Ditto.
|
||
* public/include/json-header.php: Ditto.
|
||
|
||
* public/include/manifest.php:
|
||
(ManifestGenerator::builders): Removed a reference to a non-existent variable.
|
||
When there are no builders, simply return an empty array.
|
||
|
||
* run-tests.js:
|
||
(TestEnvironment.postJSON):
|
||
(TestEnvironment.httpGet): Added.
|
||
(sendHttpRequest): Renamed from postHttpRequest as it now takes method as an argument.
|
||
|
||
* tests/admin-regenerate-manifest.js: Added with a bunch of test cases.
|
||
|
||
2013-03-14 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed. Added more tests for api/report to ensure it creates tests, metrics, test_runs,
|
||
and run_iterations. Also fixed a typo in report.php found by new tests.
|
||
|
||
* public/api/report.php:
|
||
(main): Fix a bug in the regular expression to wrap numbers with double quotations.
|
||
* tests/api-report.js: Added more test cases.
|
||
|
||
2013-03-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13399038> SafariPerfMonitor: Need integration tests
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Add a test runner script and some simple test cases.
|
||
|
||
* database/config.json: Added the configuration for "testServer".
|
||
* database/database-common.js:
|
||
(pathToTests): Added.
|
||
* run-tests.js: Added.
|
||
(main):
|
||
|
||
(confirmUserWantsDatabaseToBeInitializedIfNeeded): Checks whether there are any non-empty tables,
|
||
and if there are, asks the user if it’s okay to delete all of the data contained therein.
|
||
(confirmUserWantsDatabaseToBeInitializedIfNeeded.findNonEmptyTable): Find a table with non-zero
|
||
number of rows.
|
||
(confirmUserWantsDatabaseToBeInitializedIfNeeded.fetchTableNames): Fetch the list of all tables
|
||
in the current database using PostgreSQL's information_schema.
|
||
(askYesOrNoQuestion):
|
||
|
||
(initializeDatabase): Executes init-database.sql. It drops all tables and creates them again.
|
||
|
||
(TestEnvironment): The global object exposed in tests. Provides various utility functions.
|
||
(TestEnvironment.assert): Exposes assert to tests.
|
||
(TestEnvironment.console): Exposes console to tests.
|
||
(TestEnvironment.describe): Adds a description.
|
||
(TestEnvironment.it): Adds a test case.
|
||
(TestEnvironment.postJSON):
|
||
(TestEnvironment.queryAndFetchAll):
|
||
(TestEnvironment.sha256):
|
||
(TestEnvironment.notifyDone): Ends the current test case.
|
||
|
||
(postHttpRequest):
|
||
|
||
(TestContext): An object created for each test case. Conceptually, this object is always on
|
||
"stack" when a test case is running. TestEnvironment and an uncaughtException handler accesses
|
||
this object via currentTestContext.
|
||
(TestContext.description):
|
||
(TestContext.done):
|
||
(TestContext.logError):
|
||
|
||
* tests: Added.
|
||
* tests/api-report.js: Added some basic tests for /api/report.php.
|
||
|
||
2013-03-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed administrative page fix. Make it possible to remove all configuration from dashboard.
|
||
|
||
The problem was that we were detecting whether we're updating dashboard or not by checking
|
||
the existence of metric_configurations in $_POST but this key doesn't exist when we're removing
|
||
all configurations. Use separate 'dashboard' action to execute the code even when
|
||
metric_configurations is empty.
|
||
|
||
* public/admin/tests.php:
|
||
|
||
2013-03-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor: Extract a class to aggregate and store values from ReportProcessor.
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
This patch extracts TestRunsGenerator, which aggregates and compute caches of values,
|
||
from ReportProcessor as a preparation to replace deprecated aggregate.js.
|
||
|
||
* public/api/report.php:
|
||
(ReportProcessor::exit_with_error): Moved.
|
||
(ReportProcessor::process): Use the extracted TestRunsGenerator.
|
||
(TestRunsGenerator): Added.
|
||
(TestRunsGenerator::exit_with_error): Copied from ReportProcessor.
|
||
(TestRunsGenerator::add_aggregated_metric): Moved.
|
||
(TestRunsGenerator::add_values_for_aggregation): Moved. Made public.
|
||
(TestRunsGenerator::aggregate): Moved. Made public.
|
||
(TestRunsGenerator::aggregate_current_test_level): Moved.
|
||
(TestRunsGenerator::test_value_list_to_values_by_iterations): Moved.
|
||
(TestRunsGenerator::evaluate_expressions_by_node): Moved.
|
||
(TestRunsGenerator::compute_caches): Moved. Made public.
|
||
(TestRunsGenerator::add_values_to_commit): Moved. Made public.
|
||
(TestRunsGenerator::commit): Moved. Made public. Also takes build_id and platform_id.
|
||
(TestRunsGenerator::rollback_with_error): Moved.
|
||
|
||
2013-03-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor: Administrative pages should update manifest JSON as needed.
|
||
|
||
Reviewed by Remy Demarest.
|
||
|
||
Regenerate the manifest file when updating fields or adding new items that are included in
|
||
the manifest JSON.
|
||
|
||
* public/admin/bug-trackers.php:
|
||
* public/admin/builders.php:
|
||
* public/admin/regenerate-manifest.php:
|
||
* public/admin/repositories.php:
|
||
* public/admin/tests.php:
|
||
* public/include/admin-header.php:
|
||
(regenerate_manifest): Extracted from regenerate-manifest.php.
|
||
|
||
2013-03-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed build fix for memory test results.
|
||
|
||
Make aggregation work in the nested cases. We start from the "leaf" tests and move our ways up,
|
||
aggregating at each level.
|
||
|
||
* public/api/report.php:
|
||
(ReportProcessor::recursively_ensure_tests):
|
||
(ReportProcessor::add_aggregated_metric): Renamed from ensure_aggregated_metric.
|
||
(ReportProcessor::add_values_for_aggregation):
|
||
(ReportProcessor::aggregate):
|
||
(ReportProcessor::aggregate_current_test_level): Extracted from aggregate.
|
||
|
||
2013-03-02 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fixes. iteration_count_cache should be the total number of values in all iteration group,
|
||
not the number of iteration groups. Also, don't set group number when the entire run belongs
|
||
a single iteration group.
|
||
|
||
* public/api/report.php:
|
||
(ReportProcessor::commit):
|
||
|
||
2013-03-01 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor: Introduce iteration groups
|
||
|
||
Reviewed by Remy Demarest.
|
||
|
||
In WebKit land, we're going to use multiple instances of DumpRenderTree or WebKitTestRunner to amortize
|
||
the runtime environment variances to get more stable results. And it's desirable to keep track of
|
||
the instance of DumpRenderTree or WebKitTestRunner used to generate each iteration value.
|
||
|
||
This patch introduces "iteration groups" to keep track of this extra information.
|
||
|
||
Instead of receiving a flat array of iteration values, we can now receive a two dimensional array where
|
||
the outer array denotes iteration groups and each inner array contains iteration values for each group.
|
||
|
||
|
||
* database/init-database.sql: Add iteration_group column.
|
||
* public/api/report.php:
|
||
(ReportProcessor::recursively_ensure_tests): Always use the two dimensional array internally.
|
||
|
||
(ReportProcessor::aggregate): test_value_list_to_values_by_iterations now returns an associative array
|
||
contains the list of values indexed by the iteration order and group sizes. Store the group size so
|
||
that we can restore the iteration groups before passing it to node.js and restore them later.
|
||
|
||
(ReportProcessor::test_value_list_to_values_by_iterations): Flatten iteration groups into an array
|
||
of values and construct group_size array to restore the groups later in ReportProcessor::aggregate.
|
||
|
||
Also check that each iteration group in each subtest are consistent with one another. To see why we need
|
||
to do this, suppose we're aggregating two tests T1 and T2 with the following values. Then it's important
|
||
that each iteration group in T1 and T2 have the same size:
|
||
T1 = [[1, 2], [3, 4, 5]]
|
||
T2 = [[6, 7], [8, 9, 10]]
|
||
|
||
so that the aggregated result (the sum in this case) can have the same groups as in:
|
||
T = [[7, 9], [11, 13, 15]]
|
||
|
||
If some iteration groups in T1 and T2 had a different size as in:
|
||
T1 = [[1, 2, 3], [4, 5]]
|
||
T2 = [[6, 7], [8, 9, 10]]
|
||
|
||
Then iteration groups of the aggregated T is ambiguous.
|
||
|
||
(ReportProcessor::compute_caches): Flatten iteration groups to compute caches (e.g. mean, stdev, etc...)
|
||
(ReportProcessor::commit): Store iteration_group values.
|
||
|
||
2013-03-01 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed. Delete the migration tool for webkit-perf.appspot.com now that we have successfully
|
||
migrated to perf.webkit.org.
|
||
|
||
* database/perf-webkit-migrator.js: Removed.
|
||
|
||
2013-03-01 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Don't forget to add metrics of the top level tests e.g. Dromaeo:Time:Arithmetic.
|
||
|
||
* public/index.html:
|
||
(.showCharts):
|
||
|
||
2013-03-01 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor: Make it possible to add charts for all subtests or all platforms.
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
It is often desirable to see charts of a given test for all platforms, or to be able to see
|
||
charts of all subtests on a given platform when trying to triage perf. regressions.
|
||
|
||
Support this use case by adding the ability to do so on the charts page.
|
||
|
||
Also, we used to disable items on the test list based on the platform chosen. This turned out
|
||
to be a bad UI because in many situations you want to be able to compare results of the same test
|
||
on multiple platforms.
|
||
|
||
In this new UI, we have three select elements, each of which selects the following:
|
||
1. Top-level test - Test suite such as Dromaeo
|
||
2. Metric - Pages and subtests under the suite such as www.webkit.org for dom-modify:Runs
|
||
(where dom-modify is the name of the subtest and Runs is a metric in that subtest) for Dromaeo.
|
||
3. Platform - Mountain Lion, Qt, etc...
|
||
|
||
A user can select "all" for metric and platform but we disallow doing both at once since adding
|
||
all metrics on all platforms tends to add way too many charts and hang the browser. I also can't
|
||
think of a use case where you want to look at that many charts at once. We can support this later
|
||
if valid use cases come up.
|
||
|
||
* public/index.html:
|
||
(.showCharts.addOption): Extracted.
|
||
(.showCharts): Added "metricList" that shows the list of test and metrics (in the form of
|
||
relative metrics paths such as "DOMWalk:Time") for each top-level test selected in testList.
|
||
metricList has onchange handler that enables/disables items on platformList.
|
||
|
||
(init): Sort tests and test metrics here instead of doing that in showCharts.
|
||
|
||
2013-02-28 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13316756> SafariPerfMonitor: tooltip should include a link to build URLs
|
||
|
||
Reviewed by Remy Demarest and Ricky Mondello.
|
||
|
||
Added a hyperlink to build page in tooltips. Repeating the entire build URL in each build
|
||
was a bad idea because it bloats the resultant JSON file too much. So move the build URL
|
||
templates to the manifest file instead. Each build now only contains the builder id.
|
||
|
||
* public/api/runs.php: Removed the part of the query that joined builders table. This
|
||
speeds up the query quite a bit.
|
||
|
||
* public/include/manifest.php:
|
||
(ManifestGenerator::generate): Generate builders field.
|
||
(ManifestGenerator::builders): Added. Returns an associative array of builder ids to an
|
||
associative array that contains name and its build URL template.
|
||
|
||
* public/index.html:
|
||
(.buildLabelWithLinks.linkifyIfNotNull): Renamed from linkifiedLabel. Take a label and url
|
||
instead of a revision since this function is used for revisions and build page URLs now.
|
||
(.buildLabelWithLinks): Include the linkified build number.
|
||
|
||
* public/js/helper-classes.js:
|
||
(TestBuild.builder): Added.
|
||
(TestBuild.buildNumber): Added.
|
||
(TestBuild.buildUrl): Returns the build URL. The variable name in the URL template has been
|
||
changed from %s to $buildNumber to be more descriptive and consistent with other URL templates.
|
||
|
||
2013-02-27 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Tooltips interfere with user interactions
|
||
|
||
Rubber-stamped by Simon Fraser.
|
||
|
||
Disable tooltip on the dashboard page since graphs are too small to be useful there.
|
||
Also, show graphs for only 10 days by default as opposed to 20.
|
||
Finally, dismiss the hovering tooltip when mouse enters a "pinned" tooltip.
|
||
|
||
* public/index.html:
|
||
* public/js/helper-classes.js:
|
||
|
||
2013-02-24 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix some serious typo. We're supposed to be using SHA-256, not SHA-1 to hash our passwords,
|
||
to be compatible with webkit-perf.appspot.com.
|
||
|
||
* public/admin/builders.php:
|
||
* public/api/report.php:
|
||
|
||
2013-02-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed.
|
||
|
||
Add a missing constraint on builds table. For a given builder, there should be exactly
|
||
one build for a given build number.
|
||
|
||
Also add report_committed_at to reports table to record the time at which a given report
|
||
was processed and test_runs and run_iterations rows were committed into the database.
|
||
|
||
* database/config.json:
|
||
* public/api/report.php:
|
||
|
||
2013-02-22 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed. Add more checks for empty SQL query results.
|
||
|
||
* public/include/manifest.php:
|
||
|
||
2013-02-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
More build fixes on perf.webkit.org.
|
||
|
||
* public/api/runs.php: Make PostgreSQL happier.
|
||
* public/include/manifest.php: Don't assume we always have bug trackers.
|
||
|
||
2013-02-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor: index.html duplicates the code in PerfTestRuns to determine smallerIsBetter
|
||
and fix other miscellaneous UI bugs.
|
||
|
||
Rubber-stamped by Simon Fraser.
|
||
|
||
Removed the code to determine whether smaller value is better or not for a given test in index.html
|
||
in the favor of using that of PerfTestRuns.
|
||
|
||
* public/include/manifest.php: Fixed a typo.
|
||
* public/index.html:
|
||
(Chart):
|
||
(Chart.attachMainPlot): Fixed a bug to access previousPoint.left even when previousPoint is null.
|
||
|
||
* public/js/helper-classes.js:
|
||
(PerfTestRuns): Added EndAllocations, MaxAllocations, and MeanAllocations.
|
||
|
||
(PerfTestRuns.computeScalingFactorIfNeeded): When the mean is almost 10,000 units, we may end up
|
||
using 5 digits instead of 4, resulting in the use of scientific notations. Go up to the next unit
|
||
at roughly 2,000 units to avoid this.
|
||
|
||
(Tooltip.show): Show the tooltip even when the new content is identical to the previous content.
|
||
The only thing we can avoid is innerHTML.
|
||
|
||
2013-02-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Another build fix. The path to node is /usr/local/bin/node, not /usr/bin/local/node
|
||
|
||
* public/include/evaluator.js:
|
||
|
||
2013-02-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13267898> SafariPerfMonitor: Bug trackers should be configurable
|
||
|
||
Reviewed by Remy Demarest.
|
||
|
||
Made the list of bug trackers configurable. Namely, each bug tracker can be added in
|
||
admin/bug-trackers.php and can be associated with multiple repositories.
|
||
|
||
The association between bug trackers and repositories (such as WebKit, Safari, etc...) are used
|
||
to determine the set of bug trackers to show for a given set of blame lists.
|
||
e.g. if a test regressed due to a change in Safari, then we don't want to show WebKit Bugzilla as
|
||
a place to file bugs against the regression.
|
||
F
|
||
* database/init-database.sql: Added bug_trackers and tracker_repositories.
|
||
Also drop those tables before creating them (note "DROP TABLE reports" was missing).
|
||
|
||
* public/admin/bug-trackers.php: Added. The administrative interface for adding and managing
|
||
bug trackers, namely associated repositories.
|
||
|
||
* public/include/admin-header.php: Added a link to bug-trackers.php
|
||
* public/include/manifest.php:
|
||
(ManifestGenerator::generate): Include the list of bug trackers in the manifest.
|
||
Also moved the code to fetch repositories table here from ManifestGenerator::repositories.
|
||
|
||
(ManifestGenerator::repositories):
|
||
|
||
(ManifestGenerator::bug_trackers): Added. Generates an associative array of bug trackers where
|
||
keys are names of bug trackers and values are associative arrays with keys 'new_bug_url' and
|
||
'repositories' where the latter contains the list of associated repository names.
|
||
|
||
* public/index.html:
|
||
(Chart): Takes bugTrackers as as argument.
|
||
(Chart.showTooltipWithResults): Removed the hard-coded list.
|
||
(init):
|
||
(init.addPlatformsToDashboard):
|
||
(init.showCharts.createChartFromListPair):
|
||
(init): Stores the list of bug trackers in the manifest to a local variable.
|
||
|
||
2013-02-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
A follow up on the previous build fix. When using proc_open, we need to make evalulator.js executable.
|
||
|
||
* public/include/evaluator.js:
|
||
|
||
2013-02-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor: Extract the code to generate tabular view in administrative pages
|
||
|
||
Reviewed by Remy Demarest.
|
||
|
||
Extracted AdministrativePage to share the code to generate a tabular view of data and a form to insert
|
||
new row into the database.
|
||
|
||
* public/admin/aggregators.php: Use AdministrativePage.
|
||
* public/admin/builders.php: Ditto.
|
||
* public/admin/repositories.php: Ditto.
|
||
* public/include/admin-header.php:
|
||
(AdministrativePage): Added.
|
||
(AdministrativePage::__construct): column_info is an associative array that maps a SQL column name
|
||
to an associative array that describes the column.
|
||
- editing_mode: Specifies the type of form ('text', 'url', or 'string') to show for this column.
|
||
- label: Human readable name of the column.
|
||
- pre_insertion: Signifies that this column exists only before the row is inserted. e.g. password
|
||
column exists only before we create password_hash column at the insertion time.
|
||
|
||
(AdministrativePage::name_to_titlecase): Converts an underscored lowercase name to a human readable
|
||
titlecase (e.g. new_bug is converted to New Bug).
|
||
(AdministrativePage::column_label): Obtains the label specified in column_info or titlecased column name.
|
||
(AdministrativePage::render_form_control_for_column): "Renders" a text form control such as input and
|
||
textarea for a given editing mode ('text', 'url', or 'string').
|
||
(AdministrativePage::render_table): Renders a whole SQL table after sorting rows by the specified column.
|
||
(AdministrativePage::render_form_to_add): Renders a form to insert new row.
|
||
|
||
2013-02-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Some systems don't support r+. Use proc_open instead.
|
||
|
||
* public/api/report.php:
|
||
|
||
2013-02-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Use the mean data series as supposed to upper or lower confidence bounds
|
||
when computing the y-axis of data points to show tooltips at.
|
||
|
||
* public/index.html:
|
||
|
||
2013-02-15 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed. Removed .htaccess in favor of directly putting directives in httpd.conf.
|
||
|
||
* Install.md:
|
||
* public/.htaccess: Removed.
|
||
|
||
2013-02-14 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed.
|
||
|
||
* public/include/manifest.php: Build fix. db is on this.
|
||
* public/js/statistics.js:
|
||
(Statistics.confidenceInterval): Added. An utility function for debugging purposes.
|
||
|
||
2013-02-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13165667> SafariPerfMonitor doesn't work on perf.webkit.org (Part 2)
|
||
|
||
Reviewed by Anders Carlsson.
|
||
|
||
Rewrote and merged populate-from-report.js into report.php.
|
||
|
||
* database/config.json: Added a path to node.js.
|
||
|
||
* database/init-database.sql: Don't require unit to be always present since it's no longer used by the front end.
|
||
Once we land this patch and update the administrative pages, we can remove this column.
|
||
|
||
Also add a new reports table to store JSON reported by builders. We used to store everything in jobs table but
|
||
that table is going away once we remove the node.js backend.
|
||
|
||
* database/populate-from-report.js: Removed.
|
||
* public/api/report.php: Added.
|
||
(ReportProcessor):
|
||
(ReportProcessor.__construct):
|
||
(ReportProcessor.process):
|
||
|
||
(ReportProcessor.store_report_and_get_build_data): We store the report into the database as soon as it has been
|
||
verified to be submitted by a known builder.
|
||
|
||
(ReportProcessor.exit_with_error): Store the error message and details in the database if the report had been
|
||
stored. If not, then notify that to the client via 'failureStored' in the JSON response.
|
||
(ReportProcessor.resolve_build_id): Insert build and build_revisions rows if needed. We don't do this atomically
|
||
inside a transaction because there could be multiple reports for a single build, each containing results for
|
||
different tests.
|
||
|
||
(ReportProcessor.recursively_ensure_tests): Parse a tree of tests and insert tests and test_metrics rows as
|
||
needed. It also computes the metrics to aggregate and prepares values to commit via ensure_aggregated_metric,
|
||
add_values_to_commit, and add_values_for_aggregation.
|
||
|
||
(ReportProcessor.is_list_of_aggregators): When a metric is an aggregation, it contains an array of aggregator
|
||
names, e.g. ["Arithmetic", "Geometric"], instead of a dictionary of configuration types to their values,
|
||
e.g. {Time: {current: [1, 2, 3,]}}. This function detects the former. (Note that dictionary and list are both
|
||
array's in PHP).
|
||
|
||
(ReportProcessor.ensure_aggregated_metric): Create a metric with aggregator to add it to the list of metrics
|
||
to be aggregated in ReportProcessor.aggregate.
|
||
|
||
(ReportProcessor.add_values_for_aggregation): Called by test metrics with aggregated parent test metrics.
|
||
|
||
(ReportProcessor.aggregate): Compute results for aggregated metrics. Consider a matrix with rows representing
|
||
child tests and columns representing "iterations" for a given aggregated metrics M. Initially, we have values
|
||
given for each row (child metrics of M). This function extracts each column (iteration) via
|
||
test_value_list_to_values_by_iterations, and feeds it into evaluate_expressions_by_node to get aggregated values
|
||
for each column (iteration of M). Finally, it registers those aggregated values to be committed.
|
||
|
||
Note that we don't want to start a new node.js process for each aggregation, so we accumulate all values to be
|
||
aggregated in node.js in $expressions. Each entry in $expressions is a JSON string that contains code and
|
||
values to be aggregated. node.js gives us back a list of JSON strings that contain aggregated values.
|
||
|
||
(ReportProcessor.test_value_list_to_values_by_iterations): See above.
|
||
(ReportProcessor.evaluate_expressions_by_node): See above.
|
||
|
||
(ReportProcessor.compute_caches): Compute cached mean, sum, and square sums for each run we're about to add
|
||
using evaluate_expressions_by_node. We can't do this before computing aggregated results since those aggregated
|
||
results also need the said caches.
|
||
|
||
(ReportProcessor.add_values_to_commit):
|
||
|
||
(ReportProcessor.commit): Add test_runs and run_iterations atomically inside a transaction, rolling back
|
||
the transaction as needed if anything goes wrong.
|
||
|
||
(ReportProcessor.rollback_with_error)
|
||
(main):
|
||
* public/include/db.php:
|
||
(Database.prepare_params): Use $values (instead of $placeholders) to compute the current index since
|
||
placeholders ($1, $2, etc...) may be split up into multiple arrays given they may not necessarily show up
|
||
contiguously in a SQL statement.
|
||
|
||
(Database.select_or_insert_row): Added. Selects a row if the attempt to insert the same row fails. It
|
||
automatically creates a query string from a dictionary of unprefixed column names and table. It returns
|
||
a column value of the choice.
|
||
|
||
(Database.begin_transaction): Added.
|
||
(Database.commit_transaction): Added.
|
||
(Database.rollback_transaction): Added.
|
||
|
||
* public/include/evaluator.js: Added.
|
||
* public/include/json-header.php:
|
||
(exit_with_error): Take error details and merge it with "additional details". This allows report.php to provide
|
||
context under which the request failed.
|
||
(successful_exit): Merge "additional details".
|
||
(set_exit_detail): Added. Sets "additional details" to the JSON returned by exit_with_error or successful_exit.
|
||
(merge_additional_details):
|
||
|
||
2013-02-12 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor: Add more helper functions to db.php
|
||
|
||
Reviewed by Remy Demarest.
|
||
|
||
Added Database::insert_row and array_get to make common database operations easier.
|
||
|
||
* public/admin/aggregators.php: Use Database::insert_row instead of
|
||
execute_query_and_expect_one_row_to_be_affected.
|
||
|
||
* public/admin/builders.php: Ditto.
|
||
|
||
* public/admin/tests.php: Ditto; We used to run a separate SELECT query just to get the id after
|
||
inserting a row. With insert_row, we don't need that.
|
||
|
||
* public/include/admin-header.php: Ditto.
|
||
|
||
* public/include/db.php:
|
||
(array_get): Added. It returns the value of an array given a key if the key exists; otherwise
|
||
return the default value (defaults to NULL) if the key doesn't exist.
|
||
|
||
(Database::column_names): Added. Prefixes an array of column names and creates a comma separated
|
||
list of the names.
|
||
|
||
(Database::prepare_params): Added. Takes an associative array of column names and their values,
|
||
and builds up arrays for placeholder (e.g. $1, $2, etc...) and values, then returns an array of
|
||
column names all in the same order.
|
||
|
||
(Database::insert_row): Added. Inserts a new row into the specified table where column names have
|
||
the given prefix. Values are given in a form of an associative array where keys are unprefixed
|
||
column names and values are corresponding values. When the row is successfully inserted, it returns
|
||
the specified column's value (defaults to prefix_id). If NULL is specified, it returns a boolean
|
||
indicating the success of the insertion.
|
||
|
||
2013-02-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13165667> SafariPerfMonitor doesn't work on perf.webkit.org (Part 1)
|
||
|
||
Reviewed by Conrad Shultz.
|
||
|
||
Rewrote the manifest generator in PHP.
|
||
|
||
* database/generate-manifest.js: Removed.
|
||
* public/admin/regenerate-manifest.php: Added. Use ManifestGenerator to generate and store the manifest.
|
||
* public/include/db.php:
|
||
(array_ensure_item_has_array): Added.
|
||
* public/include/evaluator.js: Added.
|
||
* public/include/json-header.php:
|
||
* public/include/manifest.php: Added.
|
||
|
||
2013-02-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Dates on overflow plot are overlapping
|
||
|
||
Rubber-stamped by Simon Fraser.
|
||
|
||
Don't show more than 5 days.
|
||
|
||
* public/index.html:
|
||
* public/js/helper-classes.js:
|
||
(TestBuild.UTCtoPST):
|
||
(TestBuild.now):
|
||
|
||
2013-02-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Show build time as well as commit time on the dashboard and tooltips.
|
||
|
||
Rubber-stamped by Simon Fraser.
|
||
|
||
Include both the maximum commit time and build time in buildLabelWithLinks.
|
||
Also use ISO format to save the screen real estate.
|
||
|
||
* public/index.html:
|
||
(buildLabelWithLinks):
|
||
* public/js/helper-classes.js:
|
||
(TestBuild):
|
||
(TestBuild.buildTime):
|
||
(TestBuild.formattedBuildTime):
|
||
|
||
2013-02-08 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed; Convert metric.name to metric.unit in the front end.
|
||
|
||
* public/js/helper-classes.js:
|
||
|
||
2013-02-07 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13166276> SafariPerfMonitor: Need hyperlinks to file bugs
|
||
|
||
Rubber-stamped by Simon Fraser.
|
||
|
||
This patch adds hyperlinks to file new bugs on Radar and WebKit Bugzilla. Because we want to include information
|
||
such as the degree of progression or regression and the regression ranges when filing new bugs, broke various
|
||
label() functions into smaller pieces to be used in both generating tooltips and the hyperlinks.
|
||
|
||
* public/index.html:
|
||
(.buildLabelWithLinks): Extracted from TestBuild.label.
|
||
(.showTooltipWithResults): Extracted from Tooltip.show. Also added the code to generate hyperlinks to file new bugs
|
||
on Radar and WebKit Bugzilla.
|
||
* public/js/helper-classes.js:
|
||
(PerfTestResult.metric): Replaced test() as runs.test() no longer exists.
|
||
(PerfTestResult.isBetterThan): Added.
|
||
(PerfTestResult.formattedRelativeDifference): Extracted from PerfTestResult.label.
|
||
(PerfTestResult.formattedProgressionOrRegression): Ditto. Also use "better" and "worse" instead of arrow symbols
|
||
to indicate progressions or regressions.
|
||
(PerfTestResult.label):
|
||
(TestBuild.formattedTime): Added.
|
||
(TestBuild.platform): Added.
|
||
(TestBuild.formattedRevisions): Extracted from TestBuild.label. Merged a part of linkifyLabel.
|
||
(TestBuild.smallerIsBetter): Added.
|
||
(Tooltip.show): Take a raw markup instead of two results.
|
||
|
||
2013-02-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13151520> SafariPerfMonitor: Dashboard can cause excessive horizontal scrolling when there are many platforms
|
||
|
||
Rubber-stamped by Tim Horton.
|
||
|
||
Stack platforms when there are more than 3 of them since making the layout adaptive is tricky
|
||
since each platform may have a different number of tests to be shown on the dashboard.
|
||
|
||
* public/index.html:
|
||
|
||
2013-02-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Don't prefix a SVn revision with 'r' when constructing a changeset / blame URL.
|
||
|
||
* public/js/helper-classes.js:
|
||
(TestBuild.label):
|
||
|
||
2013-02-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor: repository names or revisions are double-quoted when they contain a space
|
||
|
||
Rubber-stamped by Tim Horton.
|
||
|
||
The bug was in the PHP code that parsed Postgres array. Trim double quotations as needed.
|
||
|
||
Also fixed a bug in TestBuild where we used to show the revision range as r1234-1250 when
|
||
the revision r1234 was the revision used in the previous build.
|
||
|
||
* public/api/runs.php:
|
||
(parse_revisions_array): Trim double quotations around repository names and revisions.
|
||
* public/js/helper-classes.js:
|
||
(TestBuild.label):
|
||
|
||
2013-02-05 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13151558> SafariPerfMonitor: Tooltip is unusable
|
||
|
||
Rubber-stamped by Tim Horton.
|
||
|
||
* public/index.html:
|
||
(Chart.attachMainPlot): Disable auto highlighting (circle around a data point that shows up on hover)
|
||
on the dashboard page as it's way too noisy.
|
||
|
||
(Chart.hideTooltip): Added. Hides the tooltip that shows up on hover.
|
||
|
||
(.toggleClickTooltip): Extracted from the code for "mouseout" bind (now replaced by "mouseleave").
|
||
Pins or unpins a tooltip. When pinning a tooltip, we create a tooltip behind the scene and show that
|
||
so that the tooltip for hover can be reused further.
|
||
|
||
(.closestItemForPageX): Find the closest item given pageX. We iterate data points from left to right,
|
||
and find the first point that lies on the right of the cursor position. We then compute the midpoint
|
||
between this and the previous point and pick the closer of the two. It returns an item-like object
|
||
that has all properties we need since flot doesn't provide an API to retrieve the real item object.
|
||
|
||
(Chart): Call toggleClickTooltip when a (hover) tooltip is clicked.
|
||
|
||
(Chart.attach): In "plothover" bind, call closestItemForPageX when item is not provided by flot on
|
||
the first or "current" data points (as opposed to target or baseline data points).
|
||
|
||
Also bind the code to clear crosshair and hide tooltips to "mouseleave" instead of "mouseout", and
|
||
avoid triggering this code when the cursor is still within the plot's rectangle (e.g. when a cursor
|
||
moves onto a tooltip) to avoid the premature dismissal of a tooltip.
|
||
|
||
* public/js/helper-classes.js:
|
||
(Tooltip.ensureContainer): Don't automatically close then the user clicks on tooltip. Delegate this
|
||
work to the client via bindClick.
|
||
|
||
(Tooltip.show): Move tooltip up by 5px. Also added a FIXME to move this offset computation to the client.
|
||
|
||
(Tooltip.bindClick): Added.
|
||
|
||
2013-02-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Yet another build fix. metricId*s*.
|
||
|
||
* public/admin/tests.php:
|
||
|
||
2013-02-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Another build fix. Use the new payload format for the aggregate job.
|
||
|
||
* public/admin/tests.php:
|
||
|
||
2013-02-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fixes.
|
||
|
||
* database/aggregate.js: Use variables that actually exist.
|
||
* database/database-common.js:
|
||
(ensureConfigurationIdFromList): Add the newly added configuration to the list so that subsequent
|
||
function calls will find this configuration.
|
||
|
||
2013-01-31 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13130139> SafariPerfMonitor: Add ReadMe
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Turned InstallManual into a proper markdown document and added ReadMe.md.
|
||
|
||
* InstallManual: Removed.
|
||
* InstallManual.md: Moved from InstallManual.
|
||
* ReadMe.md: Added.
|
||
|
||
2013-01-31 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13109335> SafariPerfMonitor: Add baseline and target lines
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
This patch prepares the front end code to process baseline and target results properly.
|
||
|
||
* public/index.html:
|
||
(fetchTest.createRunAndResults): Extracted.
|
||
(fetchTest): Call createRunAndResults on current, baseline, and target values of the JSON.
|
||
Deleted the comment about how sorting will be unnecessary once we start results in the server side
|
||
since sorting by the maximum revision commit time turned out to be non-trivial in php.
|
||
|
||
2013-01-29 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13057071> SafariPerfMonitor: Use newer version of flot that supports timezone properly
|
||
|
||
Reviewed by Tim Horton.
|
||
|
||
Use flot at https://github.com/flot/flot/commit/ec168da2cb8619ebf59c7e721d12c44a7960ff41.
|
||
These files are "dynamically linked" to our app.
|
||
|
||
* public/index.html:
|
||
* public/js/jquery-1.8.2.min.js: Removed.
|
||
* public/js/jquery.colorhelpers.js: Added.
|
||
* public/js/jquery.flot.categories.js: Added.
|
||
* public/js/jquery.flot.crosshair.js: Added.
|
||
* public/js/jquery.flot.errorbars.js: Added.
|
||
* public/js/jquery.flot.fillbetween.js: Added.
|
||
* public/js/jquery.flot.js: Added.
|
||
* public/js/jquery.flot.min.js: Removed.
|
||
* public/js/jquery.flot.navigate.js: Added.
|
||
* public/js/jquery.flot.resize.js: Added.
|
||
* public/js/jquery.flot.selection.js: Added.
|
||
* public/js/jquery.flot.stack.js: Added.
|
||
* public/js/jquery.flot.symbol.js: Added.
|
||
* public/js/jquery.flot.threshold.js: Added.
|
||
* public/js/jquery.flot.time.js: Added.
|
||
* public/js/jquery.js: Added.
|
||
|
||
2013-01-29 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Return NaN instead of throwing when there aren't enough samples.
|
||
|
||
Reviewed by Sam Weinig.
|
||
|
||
It's better to return NaN when we don't have enough samples so that we can treat it
|
||
as if we don't have any confidence interval.
|
||
|
||
* public/js/statistics.js:
|
||
(Statistics.new):
|
||
|
||
2013-01-28 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Apparently Safari sometimes appends / at the end of hash location. Remove that.
|
||
|
||
* public/js/helper-classes.js:
|
||
(URLState.parseIfNeeded):
|
||
|
||
2013-01-28 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13081582> SafariPerfMonitor: Always use parameterized SQL functions in php code
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Parameterized execute_query_and_expect_one_row_to_be_affected and updated the code accordingly.
|
||
|
||
* public/admin/aggregators.php: Use heredoc.
|
||
* public/admin/builders.php:
|
||
* public/admin/jobs.php:
|
||
* public/admin/repositories.php:
|
||
* public/admin/tests.php: Updated the forms to use unprefixed field names to match other pages.
|
||
This allows us to use update_field when updating test's url and metric's unit. Changed the action
|
||
to regenerate aggregated matrix from "update" to "add" to simplify the dependencies in if-else.
|
||
Also removed a stray code to update unit and url simultaneously since it's never used.
|
||
* public/include/admin-header.php:
|
||
(execute_query_and_expect_one_row_to_be_affected): Added $params. Also automatically convert
|
||
empty strings to NULL as it was previously done via $db->quote_string_or_null_if_empty in callers.
|
||
(update_field): Moved from repositories.php.
|
||
(add_job):
|
||
* public/include/db.php:
|
||
(quote_string_or_null_if_empty): Removed now that nobody uses this function.
|
||
|
||
2013-01-25 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fixes. Treat mean, sum, and square sum as float, not int.
|
||
|
||
Also use 95% confidence interval instead of 90% confidence interval.
|
||
|
||
* public/api/runs.php:
|
||
* public/js/helper-classes.js:
|
||
(.this.confidenceIntervalDelta):
|
||
|
||
2013-01-24 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add an administrative page to edit repository information.
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
* public/admin/repositories.php: Added.
|
||
* public/include/admin-header.php:
|
||
|
||
2013-01-23 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13067539> SafariPerfMonitor: Automatically create aggregated metrics from builder reports
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Auto-create aggregated matrix such as arithmetic means and geometric means as requested and add a job
|
||
to aggregate results for those matrix in populate-from-report.js.
|
||
|
||
* database/generate-manifest.js:
|
||
(.): Include aggregator names such as Arithmetic and Geometric in the list of metrics.
|
||
* database/init-database.sql: Remove an erroneous unique constraint. There could be multiple matrix that share
|
||
the same test and name (e.g. Dromaeo, Time) with different aggregators (e.g. Arithmetic and Geometric).
|
||
* database/populate-from-report.js:
|
||
(main):
|
||
(getReport): No change even though the diff looks as if it moved.
|
||
(processReport): Extracted from main. Fetch the list of aggregators, pass that to recursivelyEnsureTestsIdsAndMetricsIds
|
||
to obtain the list of aggregated metrics (such as arithmetic means) that need to be passed to aggregate.js
|
||
(scheduleJobs): Extracted from processReport. Add a job to aggregate results.
|
||
(recursivelyEnsureTestsIdsAndMetricsIds): When a metric is a list of names, assume them as aggregator names,
|
||
and add corresponding metrics for them. Note we convert those names to ids using the dictionary we obtained
|
||
in processReport.
|
||
(ensureMetricId): Take an aggregator id as an argument.
|
||
* database/process-jobs.js: Support multiple metric ids and build id. Note that aggregate.js aggregates results
|
||
for all builds when the build id is not specified.
|
||
* public/admin/tests.php:
|
||
* public/index.html: Include the aggregator name in the full name since there could be multiple metrics
|
||
of the same name with different aggregators.
|
||
|
||
2013-01-22 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Don't pass in arguments to in the wrong order.
|
||
|
||
* database/aggregate.js:
|
||
|
||
2013-01-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/13057110> SafariPerfMonitor: x-axis is messed up
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Since the version of flot we use doesn't support showing graphs in the current locate or
|
||
in a specific timezone, convert all timestamps to PST manually (Date's constructor will still
|
||
treat them as in UTC). We don't want to use the current locate because other websites on
|
||
webkit.org assume PST.
|
||
|
||
Also append this information to build's label.
|
||
|
||
* public/js/helper-classes.js:
|
||
(TestBuild):
|
||
(TestBuild.label):
|
||
|
||
2013-01-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Store test URLs reported by builders.
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
* database/populate-from-report.js:
|
||
(recursivelyEnsureTestsIdsAndMetricsIds): Pass in the test url.
|
||
(ensureTestId): Store the URL.
|
||
|
||
2013-01-20 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Yet another build fix; don't blow up even if we didn't have any test configurations.
|
||
|
||
* public/admin/tests.php:
|
||
|
||
2013-01-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix; don't instantiate Date when a timestamp wasn't provided.
|
||
|
||
* database/populate-from-report.js:
|
||
|
||
2013-01-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Rename SafariPerfDashboard to SafariPerfMonitor and add a install manual.
|
||
|
||
Reviewed by Tim Horton.
|
||
|
||
Added an install manual.
|
||
|
||
* InstallManual: Added.
|
||
|
||
2012-12-21 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Minor build fix. Don't unset builderPassword when it's not set.
|
||
|
||
* public/api/report.php:
|
||
|
||
2012-12-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Prettify JSON payloads and make very large payloads not explode the table in jobs.php.
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
* public/admin/admin.css: Make a very large payload scrollable.
|
||
* public/admin/jobs.php: Format JSONs.
|
||
|
||
2012-12-19 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/12897424> SafariPerfMonitor: Add ability to report results from bots
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Add report.php and populate-from-report.js that process JSON files submitted by builders.
|
||
|
||
* database/populate-from-report.js: Added.
|
||
(main):
|
||
(getReport): Obtains the payload (the actual report) from "jobs" table.
|
||
(recursivelyEnsureTestsIdsAndMetricsIds): "reports.tests" contain a tree of tests, test metrics,
|
||
and their results. This function recursively traverses tests and metrics and ensure their ids.
|
||
(ensureTestId):
|
||
(metricToUnit): Maps a metric name to a unit. This should really be done in the client side since
|
||
there is no point in storing unit given that every metric maps to exactly one unit (i.e. the mapping
|
||
is a "function" in mathematical sense).
|
||
(ensureMetricId):
|
||
(ensureRepositoryIdsForAllRevisions):
|
||
(getIdOrCreateBuildWithRevisions):
|
||
(ensureBuildIdAndRevisions): Obtains a build id given a builder name, a build number, and a build time
|
||
if one already exists. If not, then inserts a new build and corresponding revisions information (e.g.
|
||
build 123 may contain WebKit revision r456789). We don't retrieve rows for revisions since we don't use
|
||
it elsewhere.
|
||
(insertRun): Insert new rows into "test_runs" and "run_iterations" tables, thereby recording the new
|
||
test results all in a single transaction. This allows us to keep the database consistent in that either
|
||
a build has been reported or not at least in "test_runs" and "run_iterations" tables. It'll be ideal if
|
||
we could do the same for "builds" and "build_revisions" but that's not a hard requirement as far as
|
||
other parts of the application are concerned.
|
||
(scheduleQueriesToInsertRun):
|
||
* database/process-jobs.js: Add a call to populate-from-report.js.
|
||
* public/api/report.php: Added. Adds a new job named "report" to be processed by populate-from-report.js.
|
||
* public/include/db.php: Support parameterized query.
|
||
* public/include/json-header.php: Always include 'status' in the response so that builder submitting
|
||
a test result could confirm that the submission indeed succeeded.
|
||
|
||
2012-12-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Rename get(Id)OrCreate*(Id) to ensure*Id as suggested by Ricky on one of his code reviews.
|
||
|
||
* database/aggregate.js:
|
||
* database/database-common.js:
|
||
(selectColumnCreatingRowIfNeeded):
|
||
(ensureRepositoryId):
|
||
(ensureConfigurationIdFromList):
|
||
* database/perf-webkit-migrator.js:
|
||
(.migrateStat.):
|
||
(.migrateStat):
|
||
(getOrCreateBuildId):
|
||
|
||
2012-12-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Extract commonly-used functions from aggregate.js and perf-webkit-migrator.js.
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
As a preparation to add report.js that processes a JSON file submitted by bots, extract various functions
|
||
and classes from aggregate.js and perf-webkit-migrator.js to be shared.
|
||
|
||
* database/aggregate.js: Extracted TaskQueue and SerializedTaskQueue into utility.js.
|
||
(main):
|
||
(processBuild):
|
||
(saveAggregatedResults):
|
||
* database/database-common.js:
|
||
(getIdOrCreatePlatform): Extracted from webkit-perf-migrator.js.
|
||
(getIdOrCreateRepository): Ditto.
|
||
(getConfigurationsForPlatformAndMetrics): Renamed from fetchConfigurations. Extracted from aggregator.js.
|
||
(getIdFromListOrInsertConfiguration): Renamed from getOrInsertConfiguration. Extracted from aggregator.js.
|
||
* database/perf-webkit-migrator.js:
|
||
* database/utility.js: Added.
|
||
(TaskQueue): Extracted from aggregator.js. Fixed a bug that prevented tasks added after start() is called
|
||
from being executed.
|
||
(TaskQueue.startTasksInQueue): Execute remaining tasks without serializing them. If the queue is empty,
|
||
call the callback passed into start().
|
||
(TaskQueue.taskCallback): The function each task calls back. Decrement the counter and call statTasksInQueue.
|
||
(TaskQueue.addTask):
|
||
(TaskQueue.start):
|
||
(SerializedTaskQueue): Unlike TaskQueue, this class executes each task sequentially.
|
||
(SerializedTaskQueue.executeNextTask):
|
||
(SerializedTaskQueue.addTask):
|
||
(SerializedTaskQueue.start):
|
||
|
||
2012-12-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Revert erroneously committed changes.
|
||
|
||
* database/config.json:
|
||
|
||
2012-12-18 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
aggregator.js should be able to accept multiple metric ids and a single build id.
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Make aggregator.js accept multiple ids and generate results for single build when bots are
|
||
reporting new results.
|
||
|
||
* database/aggregate.js:
|
||
(parseArgv): Added. Returns an object containing the parsed representation of argv,
|
||
which currently contains metricIDs and buildIds.
|
||
(main): Use parseArgv and processConfigurations
|
||
(processPlatform): Use build ids passed in or obtain all builds for the given platform.
|
||
(processPlatform.processConfigurations): Extracted.
|
||
|
||
2012-12-17 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Add an administrative page for builders.
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
We need an administrative page to add and edit builder information.
|
||
Also renamed "slaves" to "builders" in order to reduce the amount of technical jargon we use.
|
||
|
||
* database/init-database.sql: Renamed slaves table to builders. Drop slave_os and slave_spec
|
||
since we don't have plans to use those columns in near future. Also make builder_name unique
|
||
as required by the rest of the app.
|
||
* public/admin/builders.php: Added.
|
||
* public/api/runs.php: Updated per the table rename.
|
||
* public/include/admin-header.php: Added a link to builders.php.
|
||
|
||
2012-12-14 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fixes for r46982.
|
||
|
||
* database/aggregate.js:
|
||
(fetchConfigurations): Bind i so that it's not always metricIds.length.
|
||
(fetchBuildsForPlatform): Return run_build as build_id since that's what caller expects.
|
||
(processBuild): Don't print "." until we've committed transactions. It's misleading.
|
||
|
||
2012-12-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Unreviewed. Move some php files to public/include as suggested by Mark on a code review.
|
||
|
||
* public/admin/aggregators.php:
|
||
* public/admin/footer.php: Removed.
|
||
* public/admin/header.php: Removed.
|
||
* public/admin/index.php:
|
||
* public/admin/jobs.php:
|
||
* public/admin/tests.php:
|
||
* public/api/json-header.php: Removed.
|
||
* public/api/runs.php:
|
||
* public/db.php: Removed.
|
||
* public/include: Added.
|
||
* public/include/admin-footer.php: Copied from public/admin/footer.php.
|
||
* public/include/admin-header.php: Copied from public/admin/header.php.
|
||
* public/include/db.php: Copied from public/db.php.
|
||
* public/include/json-header.php: Copied from public/api/json-header.php.
|
||
|
||
2012-12-13 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/12822613> SafariPerfMonitor: implement naive value aggregation mechanism
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Added the initial implementation of value aggregation.
|
||
Also added abilities to configure the dashboard page in tests.php.
|
||
|
||
* database/aggregate.js: Added.
|
||
(TaskQueue): Added. Execute all tasks at once and waits for those tasks to complete.
|
||
(TaskQueue.addTask):
|
||
(TaskQueue.start):
|
||
(SerializedTaskQueue): Added. Execute tasks sequentially after one another until all of them are completed.
|
||
(SerializedTaskQueue.addTask):
|
||
(SerializedTaskQueue.start):
|
||
(main):
|
||
(processPlatform):
|
||
(fetchConfigurations):
|
||
(fetchBuildsForPlatform):
|
||
(processBuild):
|
||
(testsWithDifferentIterationCounts):
|
||
(aggregateIterationsForMetric): Retrieve run_iterations and aggregate results in memory.
|
||
(saveAggregatedResults): Insert into test_runs and test_config in transactions.
|
||
(getOrInsertConfiguration):
|
||
(fetchAggregators):
|
||
* database/database-common.js:
|
||
(fetchTable): Log an error as an error.
|
||
(getOrCreateId): Extracted from perf-webkit-migrator.
|
||
(statistics): Added.
|
||
* database/perf-webkit-migrator.js:
|
||
(migrateTestConfig): Converted units to respective metric names. Also removed the code to add jobs to update
|
||
runs JSON since runs JSONs are generated on demand now.
|
||
(migrateStat):
|
||
(getOrCreatePlatformId):
|
||
(getOrCreateTestId):
|
||
(getOrCreateConfigurationId):
|
||
(getOrCreateRevisionId):
|
||
(getOrCreateRepositoryId):
|
||
(getOrCreateBuildId):
|
||
* database/process-jobs.js:
|
||
(processJob): Handle 'aggregate' type.
|
||
|
||
2012-12-11 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix the dashboard after adding test_metrics.
|
||
|
||
Reviewed by Ricky Mondello.
|
||
|
||
Rename test to metrics in various functions and sort tests on the charts page.
|
||
Also representing whether a test appears or not by setting a flag on dashboard
|
||
was bogus because test objects are shared by multiple platforms. Instead, store
|
||
dashboard platform list as intended by the manifest JSON.
|
||
|
||
* public/index.html:
|
||
(PerfTestRuns): Renamed test to metric.
|
||
(fetchTest): Ditto.
|
||
(showCharts): Ditto; also sort metrics' full names before adding them to the select element.
|
||
(fullName): Moved so that it appears above where it's called.
|
||
* public/js/helper-classes.js:
|
||
|
||
2012-12-10 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Update tests.php to reflect recent changes in the database schema.
|
||
|
||
Reviewed by Conrad Shultz.
|
||
|
||
Made the following changes to tests.php:
|
||
1. Disallow adding metrics to tests without subtests.
|
||
2. Made dashboard configurable by adding checkboxes for each platform on each metric.
|
||
3. Linkified tests with subtests instead of showing all them at once.
|
||
|
||
* public/admin/admin.css:
|
||
(.action-field, .notice):
|
||
(label):
|
||
* public/admin/header.php: Specify paths by absolute paths so that tests.php can use PATH_INFO.
|
||
(execute_query_and_expect_one_row_to_be_affected): Return a boolean. Used in tests.php while adding test_metrics.
|
||
(add_job): Extracted.
|
||
* public/admin/tests.php: See above.
|
||
(array_item_set_default): Added.
|
||
(array_item_or_default): Renamed from get_value_with_default.
|
||
(compute_full_name): Extracted.
|
||
(sort_tests): Ditto.
|
||
(map_metrics_to_tests): Ditto.
|
||
|
||
2012-12-06 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
<rdar://problem/12832324> SafariPerfMonitor: Linkify test names
|
||
|
||
Reviewed by Simon Fraser.
|
||
|
||
Linkify the headers using metric.test.url when it's provided.
|
||
|
||
* public/index.html:
|
||
|
||
2012-12-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Use parameterized pg_query_params in query_and_fetch_all
|
||
|
||
Reviewed by Conrad Shultz.
|
||
|
||
Address a review comment by Mark by using pg_query_params instead of pg_query in query_and_fetch_all.
|
||
|
||
* public/api/runs.php:
|
||
* public/db.php:
|
||
(ctype_alnum_underscore): Added.
|
||
|
||
2012-12-04 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Update the migration tool to support test_metrics.
|
||
|
||
Reviewed by Mark Rowe.
|
||
|
||
Updated the migration tool from webkit-perf.appspot.com to support test_metrics.
|
||
Also import run_iteration rows as runs JSON files now include individual values.
|
||
|
||
* database/database-common.js:
|
||
(addJob): Extracted.
|
||
* database/perf-webkit-migrator.js:
|
||
(migrateTestConfig): Interchange the order in which we fetch runs and add configurations
|
||
so that we can pass in the metric name and unit to getOrCreateConfigurationId.
|
||
(getOrCreateConfigurationId): Updated to add both test configuration and test metric.
|
||
(ensureCheckout):
|
||
|
||
2012-12-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Build fix. Suppress "Undefined index" warning.
|
||
|
||
* public/admin/tests.php:
|
||
|
||
2012-12-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix a commit error in r46756. api/ should obviously be added under public/
|
||
|
||
* api: Removed.
|
||
* api/json-header.php: Removed.
|
||
* api/runs.php: Removed.
|
||
* public/api: Copied from api.
|
||
|
||
2012-12-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor: Linkify revisions and revisions range
|
||
<rdar://problem/12801010>
|
||
|
||
Reviewed by Mark Rowe.
|
||
|
||
Linkify revisions in TestBuild.label. Pass in manifest.repositories to TestBuild's constructor
|
||
since it needs to know "url" and "blameUrl".
|
||
|
||
Also tweaked the appearance of graphs on charts page to better align graphs when unit names are long.
|
||
|
||
* public/index.html:
|
||
* public/js/helper-classes.js:
|
||
(TestBuild):
|
||
(TestBuild.revision): Renamed from webkitRevision. Now returns an arbitrary revision number.
|
||
(TestBuild.label): Add labels for all revisions.
|
||
(TestBuild):
|
||
(.ensureContainer):
|
||
|
||
2012-12-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Make the generation of "runs" JSON dynamic and support test_metrics.
|
||
|
||
Reviewed by Mark Rowe.
|
||
|
||
It turned out that we can fetch all runs for a given configuration in roughly 100-200ms.
|
||
|
||
Since there could be hundreds, if not thousands, of tests for each configuration and users
|
||
aren't necessarily interested in looking at all test results, it's much more efficient to
|
||
generate runs JSON dynamically (i.e. polling) upon a request instead of generating all of them
|
||
when bots report new results (i.e. pushing).
|
||
|
||
Rewrote the script to generate runs JSON in php and also supported test_metrics table.
|
||
|
||
* api: Added.
|
||
* api/json-header.php: Added. Sets Content-Type and cache policies (10 minutes by default).
|
||
(exit_with_error): Added.
|
||
(successful_exit): Added.
|
||
* api/runs.php: Added. Ported database/database-common.js. It's much shorter in php!
|
||
* database/generate-runs.js: Removed.
|
||
* database/process-jobs.js: No longer supports "runs".
|
||
* public/.htaccess: Added. Always add MultiView so that api/runs can receive a path info.
|
||
* public/db.php: Print "Nothing to see here." when it's accessed directly.
|
||
(ends_with): Added.
|
||
* public/index.html: Fetch runs JSONs from /api/runs/ instead of data/.
|
||
|
||
2012-12-03 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Update tests.php and sample-data.sql per addition of test_metrics.
|
||
|
||
Rubber-stamped by Timothy Hatcher.
|
||
|
||
Remove a useless code from tests.php that used to update the unit and the url of a test
|
||
since it's no longer used, and add the UI and the ability to add a new aggregator to a test.
|
||
|
||
Also update the sample data to reflect the addition of test_metrics.
|
||
|
||
* database/sample-data.sql:
|
||
* public/admin/tests.php:
|
||
|
||
2012-11-30 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Share more code between admin pages.
|
||
|
||
Reviewed by Timothy Hatcher.
|
||
|
||
Added notice and execute_query_and_expect_one_row_to_be_affected helper functions to share more code
|
||
between admin pages.
|
||
|
||
Also moved the code to connect to the database into header.php to be shared. Admin pages just need
|
||
to check the nullity of global $db now.
|
||
|
||
* public/admin/aggregators.php:
|
||
* public/admin/header.php:
|
||
(notice): Added
|
||
(execute_query_and_expect_one_row_to_be_affected): Added.
|
||
* public/admin/index.php:
|
||
* public/admin/jobs.php:
|
||
* public/admin/tests.php:
|
||
|
||
2012-11-29 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor: Add admin page to edit aggregators
|
||
<rdar://problem/12782687>
|
||
|
||
Reviewed by Mark Rowe.
|
||
|
||
Add aggregators.php. It's very simple. We should probably share more code between various admin pages.
|
||
|
||
* public/admin/aggregators.php: Added.
|
||
* public/admin/header.php:
|
||
* public/admin/jobs.php: Removed an erroneous hidden input element.
|
||
|
||
2012-11-28 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Fix a syntax error in init-database.sql and add the missing drop table at the beginning.
|
||
|
||
* database/init-database.sql:
|
||
|
||
2012-11-28 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor: Allow multiple metrics per test
|
||
<rdar://problem/12773506>
|
||
|
||
Rubber-stamped by Mark Rowe.
|
||
|
||
Introduce a new table test_metrics. This table represents metrics each test can have
|
||
such as time, memory allocation, frame rate as well as aggregation such as arithmetic mean
|
||
and geometric mean.
|
||
|
||
Updated admin/tests.php and index.html accordingly.
|
||
|
||
Also create few indexes based on postgres' "explain analysis" as suggested by Mark.
|
||
|
||
* database/generate-manifest.js:
|
||
(buildPlatformMapIfPossible):
|
||
* database/generate-runs.js:
|
||
(fetchRuns):
|
||
* database/init-database.sql:
|
||
* database/schema.graffle:
|
||
* public/admin/admin.css:
|
||
(table):
|
||
(tbody.odd):
|
||
* public/admin/tests.php:
|
||
* public/index.html:
|
||
|
||
2012-11-27 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
SafariPerfMonitor: Improve the webkit-perf migration tool
|
||
<rdar://problem/12760882>
|
||
|
||
Reviewed by Mark Rowe.
|
||
|
||
Make the migrator tool skip runs when fetching runs failed since webkit-perf.appspot.com is unreliable
|
||
and we don't want to pause the whole importation process until the user comes back to decide whether
|
||
to retry or not.
|
||
|
||
Also place form controls next to each test in tests.php so that users don't have to scroll all the way
|
||
down to make modifications.
|
||
|
||
Finally, add unique constraint to (run_config, run_build) in test_runs table in order to optimize a query
|
||
of the form: "SELECT run_id FROM test_runs WHERE run_config = $1 AND run_build = $2",
|
||
|
||
* database/init-database.sql:
|
||
* database/perf-webkit-migrator.js:
|
||
(migrateTestConfig):
|
||
* database/schema.graffle:
|
||
* public/admin/admin.css:
|
||
(table):
|
||
* public/admin/tests.php:
|
||
|
||
2012-11-16 Ryosuke Niwa <rniwa@webkit.org>
|
||
|
||
Create a new performance dashboard
|
||
<rdar://problem/12625582>
|
||
|
||
Rubber-stamped by Mark Rowe.
|
||
|
||
Add the initial implementation of the perf dashboard.
|
||
|
||
* database: Added.
|
||
* database/config.json: Added.
|
||
* database/database-common.js: Added.
|
||
(connect):
|
||
(fetchTable):
|
||
(manifestPath):
|
||
(pathToRunsJSON):
|
||
(pathToLocalScript):
|
||
(config):
|
||
* database/generate-manifest.js: Added.
|
||
(ensureProperty):
|
||
(buildTestMap):
|
||
(buildPlatformMapIfPossible):
|
||
(generateFileIfPossible):
|
||
* database/perf-webkit-migrator.js: Added.
|
||
* database/process-jobs.js: Added.
|
||
* database/sample-data.sql: Added.
|
||
* database/schema.graffle: Added.
|
||
* public: Added.
|
||
* public/admin: Added.
|
||
* public/admin/README: Added.
|
||
* public/admin/admin.css: Added.
|
||
* public/admin/footer.php: Added.
|
||
* public/admin/header.php: Added.
|
||
* public/admin/index.php: Added.
|
||
* public/admin/jobs.php: Added.
|
||
* public/admin/tests.php: Added.
|
||
* public/common.css: Added.
|
||
* public/data: Added.
|
||
* public/db.php: Added.
|
||
* public/index.html: Added.
|
||
* public/js: Added.
|
||
* public/js/helper-classes.js: Added.
|
||
* public/js/jquery-1.8.2.min.js: Added.
|
||
* public/js/jquery.flot.min.js: Added.
|
||
* public/js/jquery.flot.plugins.js: Added.
|
||
* public/js/shared.js: Added.
|
||
(fileNameFromPlatformAndTest):
|
||
* public/js/statistics.js: Added.
|
||
|