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.

