App.Manifest shouldn't use App.__container__.lookup
[WebKit-https.git] / Websites / perf.webkit.org / ChangeLog
index eaaaa84..835c6e0 100644 (file)
@@ -1,3 +1,589 @@
+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