Cache-control should be set only on api/runs
[WebKit-https.git] / Websites / perf.webkit.org / ChangeLog
1 2015-01-09  Ryosuke Niwa  <rniwa@webkit.org>
2
3         Cache-control should be set only on api/runs
4         https://bugs.webkit.org/show_bug.cgi?id=140312
5
6         Reviewed by Andreas Kling.
7
8         Some JSON APIs such as api/analysis-tasks can't be cached even for a short period of time (e.g. a few minutes)
9         since they can be modified by the user on demand. Since only api/runs.php takes a long time to generate JSONs,
10         just set cache-control there instead of json-header.php which is used by other JSON APIs.
11
12         Also set date_default_timezone_set in db.php since we never use non-UTC timezone in our scripts.
13
14         * public/api/analysis-tasks.php:
15         * public/api/runs.php: Set the cache control headers.
16         * public/api/test-groups.php:
17         * public/include/db.php: Set the default timezone to UTC.
18         * public/include/json-header.php: Don't set the cache control headers.
19
20 2015-01-09  Ryosuke Niwa  <rniwa@webkit.org>
21
22         api/report-commit should authenticate with a slave name and password
23         https://bugs.webkit.org/show_bug.cgi?id=140308
24
25         Reviewed by Benjamin Poulain.
26
27         Use a slave name and a password to authenticate new commit reports.
28
29         * public/api/report-commits.php:
30         (main):
31         * public/include/json-header.php:
32         (verify_slave): Renamed and repurposed from verify_builder in report-commits.php. Now authenticates with
33         a slave name and a password instead of a builder name and a password.
34         * tests/api-report-commits.js: Updated tests.
35         * tools/pull-svn.py:
36         (main): Renamed variables.
37         (submit_commits): Submits slaveName and slavePassword instead of builderName and builderPassword.
38
39 2014-12-19  Ryosuke Niwa  <rniwa@webkit.org>
40
41         Perf dashboard should support authentication via a slave password
42         https://bugs.webkit.org/show_bug.cgi?id=139837
43
44         Reviewed by Andreas Kling.
45
46         For historical reasons, perf dashboard conflated builders and build slaves. As a result we ended up
47         having to add multiple builders with the same password when a single build slave is shared among them.
48
49         This patch introduces the concept of build_slave into the perf dashboard to end this madness.
50
51         * init-database.sql: Added build_slave table as well as references to it in builds and reports.
52
53         * public/admin/build-slaves.php: Added.
54
55         * public/admin/builders.php: Added the support for updating passwords.
56
57         * public/include/admin-header.php:
58         (update_field): Takes an extra argument when a new value needs to be supplied by the caller instead of
59         being retrieved from $_POST.
60         (AdministrativePage::render_table): Use array_get to retrieve a value out of the database row since
61         the raw may not exist (e.g. new_password).
62         (AdministrativePage::render_form_to_add): Added the support for post_insertion. Don't render the form
63         control here when this flag evaluates to TRUE.
64
65         * public/include/report-processor.php:
66         (ReportProcessor::process): Added the logic to authenticate with slaveName and slavePassword if those
67         values are present in the report. In addition, try authenticating builderName with slavePassword if
68         builderPassword is not specified. When neither password is specified, exit with BuilderNotFound.
69         Also insert the slave or the builder whichever is missing after we've successfully authenticated.
70         (ReportProcessor::construct_build_data): Takes a builder ID and an optional slave ID instead of
71         a builder row.
72         (ReportProcessor::store_report): Store the slave ID with the report.
73         (ReportProcessor::resolve_build_id): Exit with MismatchingBuildSlave when the slave associated with
74         the matching build is different from what's being reported.
75
76         * tests/api-report.js: Added a bunch of tests to test the new features of /api/report.
77         (.addSlave): Added.
78
79 2014-12-18  Ryosuke Niwa  <rniwa@webkit.org>
80
81         New perf dashboard should not duplicate author information in each commit
82         https://bugs.webkit.org/show_bug.cgi?id=139756
83
84         Reviewed by Darin Adler.
85
86         Instead of each commit having author name and email, make it reference a newly added committers table.
87         Also replace "email" by "account" since some repositories don't use emails as account names.
88
89         This improves the keyword search performance in commits.php since LIKE now runs on committers table,
90         which only contains as many rows as there are accounts in each repository, instead of commits table
91         which contains every commit ever happened in each repository.
92
93         To migrate an existing database into match the new schema, run:
94
95         BEGIN;
96
97         INSERT INTO committers (committer_repository, committer_name, committer_email)
98             (SELECT DISTINCT commit_repository, commit_author_name, commit_author_email
99                 FROM commits WHERE commit_author_email IS NOT NULL);
100
101         ALTER TABLE commits ADD COLUMN commit_committer integer REFERENCES committers ON DELETE CASCADE;
102
103         UPDATE commits SET commit_committer = committer_id FROM committers
104             WHERE commit_repository = committer_repository AND commit_author_email = committer_email;
105
106         ALTER TABLE commits DROP COLUMN commit_author_name CASCADE;
107         ALTER TABLE commits DROP COLUMN commit_author_email CASCADE;
108
109         COMMIT;
110
111         * init-database.sql: Added committers table, and replaced author columns in commits table by a foreign
112         reference to committers. Also added the missing drop table statements.
113
114         * public/api/commits.php:
115         (main): Fetch the corresponding committers row for a single commit. Also wrap a single commit by
116         an array here instead of doing it in format_commit.
117         (fetch_commits_between): Updated queries to JOIN commits with committers.
118         (format_commit): Takes both commit and committers rows. Also don't wrap the result in an array as that
119         is now done in main.
120
121         * public/api/report-commits.php:
122         (main): Store the reported committer information or update the existing entry if there is one.
123
124         * tests/admin-regenerate-manifest.js: Fixed tests.
125
126         * tests/api-report-commits.js: Ditto. Also added a test for updating an existing committer entry.
127
128         * tools/pull-svn.py: Renamed email to account.
129         (main):
130         (fetch_commit_and_resolve_author):
131         (fetch_commit):
132         (resolve_author_name_from_account):
133         (resolve_author_name_from_email): Deleted.
134
135 2014-12-17  Ryosuke Niwa  <rniwa@webkit.org>
136
137         Unreviewed build fix.
138
139         * public/v2/index.html: Include js files we extracted in r177424.
140
141 2014-12-16  Ryosuke Niwa  <rniwa@webkit.org>
142
143         Unreviewed. Adding the forgotten svnprop.
144
145         * tools/pull-svn.py: Added property svn:executable.
146
147 2014-12-16  Ryosuke Niwa  <rniwa@webkit.org>
148
149         Split InteractiveChartComponent and CommitsViewerComponent into separate files
150         https://bugs.webkit.org/show_bug.cgi?id=139716
151
152         Rubber-stamped by Benjamin Poulain.
153
154         Refactored InteractiveChartComponent and CommitsViewerComponent out of app.js into commits-viewer.js
155         and interactive-chart.js respectively since app.js has gotten really large.
156
157         * public/v2/app.js:
158         * public/v2/commits-viewer.js: Added.
159         * public/v2/interactive-chart.js: Added.
160
161 2014-12-02  Ryosuke Niwa  <rniwa@webkit.org>
162
163         New perf dashboard's chart UI is buggy
164         https://bugs.webkit.org/show_bug.cgi?id=139214
165
166         Reviewed by Chris Dumez.
167
168         The bugginess was caused by weird interactions between charts and panes. Rewrote the code to fix it.
169
170         Superfluous selectionChanged and domainChanged "event" actions were removed from the interactive chart
171         component. This is not how Ember.js components should interact to begin with. The component now exposes
172         selectedPoints and always updates selection instead of sharedSelection.
173
174         * public/v2/app.js:
175         (App.ChartsController.present): Added. We can't call Date.now() in various points in our code as that
176         would lead to infinite mutual recursions since X-axis domain values wouldn't match up.
177         (App.ChartsController.updateSharedDomain): This function was completely useless. The overview's start
178         and end time should be completely determined by "since" and the present time.
179         (App.ChartsController._startTimeChanged): Ditto.
180         (App.ChartsController._scheduleQueryStringUpdate):
181         (App.ChartsController._updateQueryString): Set "zoom" only if it's different from the shared domain.
182
183         (App.domainsAreEqual): Moved from InteractiveChartComponent._xDomainsAreSame.
184
185         (App.PaneController.actions.createAnalysisTask): Use selectedPoints property set by the chart.
186         (App.PaneController.actions.overviewDomainChanged): Removed; only needed to call updateSharedDomain.
187         (App.PaneController.actions.rangeChanged): Removed. _showDetails (renamed to _updateDetails) directly
188         observes the changes to selectedPoints property as it gets updated by the main chart.
189         (App.PaneController._overviewSelectionChanged): This was previously a dead code. Now it's used again
190         with a bug fix. When the overview selection is cleared, we use the same domain in the main chart and
191         the overview chart.
192         (App.PaneController._sharedDomainChanged): Fixed a but that it erroneously updates the overview domain
193         when domain arrays aren't identical. This was causing a subtle race with other logic.
194         (App.PaneController._sharedZoomChanged): Ditto. Also don't set mainPlotDomain here as any changes to
195         overviewSelection will automatically propagate to the main plot's domain as they're aliased.
196         (App.PaneController._currentItemChanged): Merged into _updateDetails (renamed from _showDetails).
197         (App.PaneController._updateDetails): Previously, this function took points and inspected _hasRange to
198         see if those two points correspond to a range or a single data point. Rewrote all that logic by
199         directly observing selectedPoints and currentItem properties instead of taking points and relying on
200         an instance variable, which was a terrible API.
201         (App.PaneController._updateCanAnalyze): Use selectedPoints property. Since this property is only set
202         when the main plot has a selected range, we don't have to check this._hasRange anymore.
203
204         (App.InteractiveChartComponent._updateDomain): No longer sends domainChanged "event" action.
205         (App.InteractiveChartComponent._sharedSelectionChanged): Removed. This is a dead code.
206         (App.InteractiveChartComponent._updateSelection):
207         (App.InteractiveChartComponent._xDomainsAreSame): Moved to App.domainsAreEqual.
208         (App.InteractiveChartComponent._setCurrentSelection): Update the selection only if needed. Also set
209         selectedPoints property.
210
211         (App.AnalysisTaskController._fetchedRuns):
212         (App.AnalysisTaskController._rootChangedForTestSet):
213
214         * public/v2/index.html:
215         Removed non-functional sharedSelection and superfluous selectionChanged and domainChanged actions.
216
217 2014-11-21  Ryosuke Niwa  <rniwa@webkit.org>
218
219         Unreviewed. Fixed syntax errors.
220
221         * init-database.sql:
222         * public/api/commits.php:
223
224 2014-11-21  Ryosuke Niwa  <rniwa@webkit.org>
225
226         The dashboard on new perf monitor should be configurable
227         https://bugs.webkit.org/show_bug.cgi?id=138994
228
229         Reviewed by Benjamin Poulain.
230
231         For now, make it configurable via config.json. We should eventually make it configurable via
232         an administrative page but this will do for now.
233
234         * config.json: Added the empty dashboard configuration.
235
236         * public/include/manifest.php: Include the dashboard configuration in the manifest file.
237
238         * public/v2/app.js:
239         (App.IndexController): Removed defaultTable since this is now dynamically obtained via App.Manifest.
240         (App.IndexController.gridChanged): Use App.Dashboard to parse the dashboard configuration.
241         Also obtain the default configuration from App.Manifest.
242         (App.IndexController._normalizeTable): Moved to App.Dashboard.
243
244         * public/v2/manifest.js:
245         (App.Repository.urlForRevision): Fixed the position of the open curly bracket.
246         (App.Repository.urlForRevisionRange): Ditto.
247         (App.Dashboard): Added.
248         (App.Dashboard.table): Extracted from App.IndexController.gridChanged.
249         (App.Dashboard.rows): Ditto.
250         (App.Dashboard.headerColumns): Ditto.
251         (App.Dashboard._normalizeTable): Moved from App.IndexController._normalizeTable.
252         (App.MetricSerializer.normalizePayload): Synthesize a dashboard record from the configuration.
253         Since there is exactly one dashboard object per app, it's okay to hard code an id here.
254         (App.Manifest._fetchedManifest): Set defaultDashboard to the one and only one dashboard we have.
255
256 2014-11-21  Ryosuke Niwa  <rniwa@webkit.org>
257
258         There should be a way to associate bugs with analysis tasks
259         https://bugs.webkit.org/show_bug.cgi?id=138977
260
261         Reviewed by Benjamin Poulain.
262
263         Updated associate-bug.php to match the new database schema.
264
265         * public/include/json-header.php:
266         (require_format): Removed the call to camel_case_words_separated_by_underscore since the name is
267         already camel-cased in require_existence_of. This makes the function usable elsewhere.
268
269         * public/privileged-api/associate-bug.php:
270         (main): Changed the API to take run, bugTracker, and number to match the new database schema.
271         Also verify that those values are integers using require_format.
272
273         * public/v2/analysis.js:
274         (App.AnalysisTask.label): Added. Concatenates the task's name with the bug numbers.
275         (App.Bug.label): Added.
276         (App.BugAdapter): Added.
277         (App.BugAdapter.createRecord): Use PrivilegedAPI instead of the builtin ajax call.
278         (App.BuildRequest): Inherit from newly added App.Model, which is set to DS.Model right now.
279
280         * public/v2/app.css: Renamed .test-groups to .analysis-group. Also added new rules for the table
281         containing the bug information.
282
283         * public/v2/app.js:
284         (App.InteractiveChartComponent._rangesChanged): Added label to range bar objects.
285         (App.AnalysisTaskRoute):
286         (App.AnalysisTaskController): Replaced the functionality of App.AnalysisTaskViewModel.
287         (App.AnalysisTaskController._fetchedManifest): Added.
288         (App.AnalysisTaskController.actions.associateBug): Added.
289
290         * public/v2/chart-pane.css: Renamed .bugs-pane to .analysis-pane.
291
292         * public/v2/data.js:
293         (Measurement.prototype.associateBug): Deleted.
294
295         * public/v2/index.html: Renamed .bugs-pane to .analysis-pane and .test-groups to .analysis-group.
296         Added a table show the bug information. Also hide the chart until chartData is available.
297
298         * public/v2/manifest.js:
299         (App.Model): Added.
300
301 2014-11-20  Ryosuke Niwa  <rniwa@webkit.org>
302
303         Fix misc bugs and typos in app.js
304         https://bugs.webkit.org/show_bug.cgi?id=138946
305
306         Reviewed by Benjamin Poulain.
307
308         * public/v2/app.js:
309         (App.DashboardPaneProxyForPicker._platformOrMetricIdChanged):
310         (App.ChartsController.init):
311         (App.buildPopup): Renamed from App.BuildPopup.
312         (App.InteractiveChartComponent._constructGraphIfPossible): Fixed the bug that we were calling
313         remove() on the wrong object (an array as opposed to elements in the array).
314         (App.InteractiveChartComponent._highlightedItemsChanged): Check the length of _highlights as
315         _highlights is always an array and evalutes to true.
316
317 2014-11-20  Ryosuke Niwa  <rniwa@webkit.org>
318
319         New perf dashboard should provide UI to create a new analysis task
320         https://bugs.webkit.org/show_bug.cgi?id=138910
321
322         Reviewed by Benjamin Poulain.
323
324         This patch reverts some parts of r175006 and re-introduces bugs associated with analysis tasks.
325         I'll add UI to show and edit bug numbers associated with an analysis task in a follow up patch.
326
327         With this patch, we can create a new analysis task by selection a range of points and opening
328         "analysis pane" (renamed from "bugs pane"). Each analysis task created is represented by a yellow bar
329         in the chart hyperlinked to the analysis task.
330
331         * init-database.sql: Redefined the bugs to be associated with an analysis task instead of a test run.
332
333         * public/api/analysis-tasks.php: Added the support for querying analysis tasks for a specific metric
334         on a specific platform. Also retrieve and return all bugs associated with analysis tasks.
335         (main):
336         (fetch_and_push_bugs_to_tasks): Added. Fetches all bugs associated with an array of analysis tasks
337         and adds the associated bugs to each task in the array.
338         (format_task):
339
340         * public/api/runs.php: Reverted changes made in r175006.
341         (fetch_runs_for_config):
342         (format_run): 
343
344         * public/api/test-groups.php:
345         (fetch_test_groups_for_task): Use the newly added Database::select_rows.
346
347         * public/include/db.php:
348         (Database::select_first_or_last_row):
349         (Database::select_rows): Extracted from select_first_or_last_row.
350
351         * public/v2/analysis.js:
352         (App.AnalysisTask): Added "bugs" property.
353         (App.Bug): Added now that bugs are regular data store objects.
354
355         * public/v2/app.js:
356         (App.Pane._fetch): Calls this.fetchAnalyticRanges to fetch analysis tasks as well as test runs.
357         (App.Pane.fetchAnalyticRanges): Added. Fetches analysis tasks for the current metric on the current
358         platform that are associated with a specific range of runs.
359         (App.PaneController.actions.toggleBugsPane): Updated per showingBugsPane to showingAnalysisPane rename.
360         (App.PaneController.actions.associateBug): Deleted.
361         (App.PaneController.actions.createAnalysisTask): Replaced the pre-condition checks with assertions as
362         this action should never be triggered when the pre-condition is not met. Also re-fetch analysis tasks
363         once we've created one.
364         (App.PaneController.toggleSearchPane): Updated per showingBugsPane to showingAnalysisPane rename.
365         (App.PaneController._detailsChanged): Ditto. Removed selectedSinglePoint since it's no longer used.
366         (App.PaneController._showDetails): Call _updateCanAnalyze to update the status of "Analyze" button.
367         (App.PaneController._updateBugs): Deleted.
368         (App.PaneController._updateMarkedPoints): Deleted.
369         (App.PaneController._updateCanAnalyze): Added. Disables the button to create an analysis task when
370         the name is missing or when at most one point is selected.
371         
372         (App.InteractiveChartComponent._constructGraphIfPossible): Update the locations of range rects.
373         (App.InteractiveChartComponent._relayoutDataAndAxes): Ditto.
374         (App.InteractiveChartComponent._mousePointInGraph): Don't return a point unless the mouse cursor is
375         on our svg element to avoid locking the current item when a bar shown for an analysis task is clicked.
376         (App.InteractiveChartComponent._rangesChanged): Added. Creates an array of objects representing
377         clickable bars for analysis tasks.
378         (App.InteractiveChartComponent._updateRangeBarRects): Computes the inline style used by each clickable
379         bar for analysis tasks to place them at the right location.
380         (App.InteractiveChartComponent.actions.openRange): Added. Forwards the action to the parent controller.
381
382         * public/v2/chart-pane.css:
383         (.chart .extent): Use the same color as the vertical indicator in the highlight behind the selection.
384         (.chart .rangeBar): Added.
385
386         * public/v2/data.js:
387         (TimeSeries.prototype.nextPoint): Added. Used by _rangesChanged.
388
389         * public/v2/index.html: Renamed "bugs pane" to "analysis pane" and removed the UI to associate bugs.
390         This ability will be reinstated in a follow up patch. Also added a container div and spans for analysis
391         task bars in the interactive chart component.
392
393 2014-11-19  Ryosuke Niwa  <rniwa@webkit.org>
394
395         Fix typos in r176203.
396
397         * public/v2/app.js:
398         (App.ChartsController.actions.addPaneByMetricAndPlatform):
399         (App.AnalysisTaskRoute):
400
401 2014-11-18  Ryosuke Niwa  <rniwa@webkit.org>
402
403         Unreviewed. Updated the install instruction.
404
405         * Install.md:
406
407 2014-11-17  Ryosuke Niwa  <rniwa@webkit.org>
408
409         App.Manifest shouldn't use App.__container__.lookup
410         https://bugs.webkit.org/show_bug.cgi?id=138768
411
412         Reviewed by Andreas Kling.
413
414         Removed the hack to find the store object via App.__container__.lookup.
415         Pass around the store object instead.
416
417         * public/v2/app.js:
418         (App.DashboardRow._createPane): Add "store" property to the pane.
419         (App.DashboardPaneProxyForPicker._platformOrMetricIdChanged): Ditto.
420         (App.IndexController.gridChanged): Ditto.
421         (App.IndexController.actions.addRow): Ditto.
422         (App.IndexController.init): Ditto.
423         (App.Pane._fetch): Ditto.
424         (App.ChartsController._parsePaneList): Ditto.
425         (App.ChartsController._updateQueryString): Ditto.
426         (App.ChartsController.actions.addPaneByMetricAndPlatform): Ditto.
427         (App.BuildPopup): Ditto.
428         (App.AnalysisTaskRoute.model): Ditto.
429         (App.AnalysisTaskViewModel._taskUpdated): Ditto.
430
431         * public/v2/manifest.js:
432         (App.Manifest.fetch): Removed the code to find the store object.
433
434 2014-11-08  Ryosuke Niwa  <rniwa@webkit.org>
435
436         Fix Ember.js warnings the new perf dashboard
437         https://bugs.webkit.org/show_bug.cgi?id=138531
438
439         Reviewed by Darin Adler.
440
441         Fixed various warnings.
442
443         * public/v2/app.js:
444         (App.InteractiveChartComponent._relayoutDataAndAxes): We can't use "rem". Use this._rem as done for x.
445         * public/v2/data.js:
446         (PrivilegedAPI._post): Removed the superfluous console.log.
447         (CommitLogs.fetchForTimeRange): Ditto.
448         * public/v2/index.html: Added tbody as required by the HTML specification.
449
450 2014-11-07  Ryosuke Niwa  <rniwa@webkit.org>
451
452         Fix typos in r175768.
453
454         * public/v2/app.js:
455         (App.AnalysisTaskViewModel.roots):
456
457 2014-11-07  Ryosuke Niwa  <rniwa@webkit.org>
458
459         Introduce the concept of analysis task to perf dashboard
460         https://bugs.webkit.org/show_bug.cgi?id=138517
461
462         Reviewed by Andreas Kling.
463
464         Introduced the concept of an analysis task, which is created for a range of measurements for a given metric on
465         a single platform and used to bisect regressions in the range.
466         
467         Added a new page to see the list of active analysis tasks and a page to view the contents of an analysis task.
468
469         * init-database.sql: Added a bunch of tables to store information about analysis tasks.
470             analysis_tasks - Represents each analysis task. Associated with a platform and a metric and possibly with two
471             test runs. Analysis tasks not associated with test runs are used for try new patches.
472             analysis_test_groups - A test group in an analysis task represents a bunch of related A/B testing results.
473             root_sets - A root set represents a set of roots (or packages) installed in each A/B testing.
474             build_requests - A build request represents a single pending build for A/B testing.
475
476         * public/api/analysis-tasks.php: Added. Returns the specified analysis task or all analysis tasks in an array.
477         (main):
478         (format_task):
479
480         * public/api/test-groups.php: Added. Returns analysis task groups for the specified analysis task or returns
481         the specified analysis task group as well as build requests associated with them.
482         (main):
483         (fetch_test_groups_for_task):
484         (fetch_build_requests_for_task):
485         (fetch_build_requests_for_group):
486         (format_test_group):
487         (format_build_request):
488
489         * public/include/json-header.php:
490         (remote_user_name): Extracted from compute_token so that we can use it in create-analysis-task.php.
491         (compute_token):
492
493         * public/privileged-api/associate-bug.php:
494         (main): Fixed a typo.
495
496         * public/privileged-api/create-analysis-task.php: Added. Creates a new analysis task for a given test run range.
497         (main):
498         (ensure_row_by_id):
499         (ensure_config_from_runs):
500
501         * public/privileged-api/generate-csrf-token.php: Use remote_user_name.
502
503         * public/v2/analysis.js: Added. Various Ember data store models to represent analysis tasks and related objects.
504         (App.AnalysisTask):
505         (App.AnalysisTask.create):
506         (App.TestGroup):
507         (App.TestGroupAdapter):
508         (App.AnalysisTaskSerializer):
509         (App.TestGroupSerializer):
510         (App.BuildRequest):
511
512         * public/v2/app.css: Added style rules for the analysis page.
513
514         * public/v2/app.js:
515         (App.Pane._fetch): Use fetchRunsWithPlatformAndMetric, which has been refactored into App.Manifest.
516
517         (App.PaneController.actions.toggleBugsPane): Show bugs pane even when there are no bug trackers or there is not
518         exactly one selected point as we can still create an analysis task.
519         (App.PaneController.actions.associateBug): Renamed singlySelectedPoint to selectedSinglePoint to be more
520         grammatical and also alert'ed the error message when there is one.
521         (App.PaneController.actions.createAnalysisTask): Added. Creates a new analysis task and opens it in a new tab.
522         Since window.open only works during the click, we open the new "window" preemptively and navigates or closes it
523         once XHR request has completed.
524         (App.PaneController._detailsChanged): Changes due to singlySelectedPoint to selectedSinglePoint rename.
525         (App.PaneController._updateBugs): Fixed a bug that we were showing bugs in the previous point when a single point
526         is selected in the details pane.
527
528         (App.AnalysisRoute): Added.
529         (App.AnalysisTaskRoute): Added.
530         (App.AnalysisTaskViewModel): Added.
531         (App.AnalysisTaskViewModel._taskUpdated): Fetch runs for the associated platform and metric.
532         (App.AnalysisTaskViewModel._fetchedRuns): Setup the chart data to show.
533         (App.AnalysisTaskViewModel.testSets): The computed property used to update roots for all repositories/projects.
534         (App.AnalysisTaskViewModel._rootChangedForTestSet): Updates root selections for all repositories/projects when
535         the user selects an option for all roots in A or B configuration.
536         (App.AnalysisTaskViewModel.roots): The computed property used to show root choices for each repository/project.
537
538         * public/v2/chart-pane.css: Added style rules for details view in the analysis task page.
539
540         * public/v2/data.js:
541         (Measurement.prototype._formatRevisionRange): Don't prefix a revision number with "At " when there is no previous
542         point so that we can use it in App.AnalysisTaskViewModel.roots.
543         (TimeSeries.prototype.findPointByMeasurementId): Added.
544         (TimeSeries.prototype.seriesBetweenPoints): Added.
545
546         * public/v2/index.html: Use Metric.fullName since the same value is needed in the analysis task page. Also added
547         a button to create an analysis task, and made bugs pane button always enabled since we can an analysis task even
548         when multiple points are selected. Finally, added a new template for the analysis task page.
549
550         * public/v2/manifest.js:
551         (App.Metric.fullName): Added to share code between the charts page and the analysis task page.
552         (App.Manifest.fetchRunsWithPlatformAndMetric): Extracted from App.Pane._fetch to be reused in
553         App.AnalysisTaskViewModel._taskUpdated.
554
555 2014-10-28  Ryosuke Niwa  <rniwa@webkit.org>
556
557         Remove App.PaneController.bugsChangeCount in the new perf dashboard
558         https://bugs.webkit.org/show_bug.cgi?id=138111
559
560         Reviewed by Darin Adler.
561
562         * public/v2/app.js:
563         (App.PaneController.bugsChangeCount): Removed.
564         (App.PaneController.actions.associateBug): Call _updateMarkedPoints instead of incrementing bugsChangeCount.
565         (App.PaneController._updateMarkedPoints): Extracted from App.InteractiveChartComponent._updateDotsWithBugs.
566         Finds the list of current run's points that are associated with bugs.
567         (App.InteractiveChartComponent._updateMarkedDots): Renamed from _updateDotsWithBugs.
568         * public/v2/chart-pane.css:
569         (.chart .marked): Renamed from .hasBugs.
570         * public/v2/index.html: Specify chartPointRadius and markedPoints.
571
572 2014-10-27  Ryosuke Niwa  <rniwa@webkit.org>
573
574         REGRESSION: commit logs are not shown sometimes on the new dashboard UI
575         https://bugs.webkit.org/show_bug.cgi?id=138099
576
577         Reviewed by Benjamin Poulain.
578
579         The bug was caused by _currentItemChanged not passing the previous point in the list of points and also
580         _showDetails inverting the order of the current and old measurements.
581
582         * public/v2/app.js:
583         (App.PaneController._currentItemChanged): Pass in the previous point to _showDetails when there is one.
584         (App.PaneController._showDetails): Since points are ordered chronologically, the last point is the
585         current (latest) measurement and the first point is the oldest measurement.
586         (App.CommitsViewerComponent.commitsChanged): Don't show a single measurement as a range for clarity.
587
588 2014-10-18  Ryosuke Niwa  <rniwa@webkit.org>
589
590         Perf dashboard should provide a way to associate bugs with a test run
591         https://bugs.webkit.org/show_bug.cgi?id=137857
592
593         Reviewed by Andreas Kling.
594
595         Added a "privileged" API, /privileged-api/associate-bug, to associate a bug with a test run.
596         /privileged-api/ is to be protected by an authentication mechanism such as DigestAuth over https by
597         the Apache configuration.
598
599
600         The Cross Site Request (CSRF) Forgery prevention for privileged APIs work as follows. When a user is
601         about to make a privileged API access, the front end code obtains a CSRF token generated by POST'ing
602         to privileged-api/generate-csrf-token; the page sets a randomly generated salt and an expiration time
603         via the cookie and returns a token computed from those two values as well as the remote username.
604
605         The font end code then POST's the request along with the returned token. The server side code verifies
606         that the specified token can be generated from the salt and the expiration time set in the cookie, and
607         the token hasn't expired.
608
609
610         * init-database.sql: Added bug_url to bug_trackers table, and added bugs table. Each bug tracker will
611         have zero or exactly one bug associated with a test run.
612
613         * public/admin/bug-trackers.php: Added the support for editing bug_url.
614         * public/api/runs.php:
615         (fetch_runs_for_config): Modified the query to fetch bugs associated with test_runs.
616         (parse_bugs_array): Added. Parses the aggregated bugs and creates a dictionary that maps a tracker id to
617         an associated bug if there is one.
618         (format_run): Calls parse_bugs_array.
619
620         * public/include/json-header.php: Added helper functions to deal for CSRF prevention.
621         (ensure_privileged_api_data): Added. Dies immediately if the request's method is not POST or doesn't
622         have a valid JSON payload.
623         (ensure_privileged_api_data_and_token): Ditto. Also checks that the CSRF prevention token is valid.
624         (compute_token): Computes a CSRF token using the REMOTE_USER (e.g. set via BasicAuth), the salt, and
625         the expiration time stored in the cookie.
626         (verify_token): Returns true iff the specified token matches what compute_token returns from the cookie.
627
628         * public/include/manifest.php:
629         (ManifestGenerator::bug_trackers): Include bug_url as bugUrl in the manifest. Also use tracker_id instead
630         of tracker_name as the key in the manifest. This requires changes to both v1 and v2 front end.
631
632         * public/index.html:
633         (Chart..showTooltipWithResults): Updated for the manifest format changed mentioned above.
634
635         * public/privileged-api/associate-bug.php: Added.
636         (main): Added. Associates or dissociates a bug with a test run inside a transaction. It prevent a CSRF
637         attack via ensure_privileged_api_data_and_token, which calls verify_token.
638
639         * public/privileged-api/generate-csrf-token.php: Added. Generates a CSRF token valid for one hour.
640
641         * public/v2/app.css:
642         (.disabled .icon-button:hover g): Used by the "bugs" icon when a range of points or no points are
643         selected in a chart.
644
645         * public/v2/app.js:
646         (App.PaneController.actions.toggleBugsPane): Added. Toggles the visibility of the bugs pane when exactly
647         one point is selected in the chart. Also hides the search pane when making the bugs pane visible since
648         they would overlap on each other if both of them are shown.
649         (App.PaneController.actions.associateBug): Makes a privileged API request to associate the specified bug
650         with the currently selected point (test run). Updates the bug information in "details" and colors of dots
651         in the charts to reflect new states. Because chart data objects aren't real Ember objects for performance
652         reasons, we have to use a dirty hack of modifying a dummy counter bugsChangeCount.
653         (App.PaneController.actions.toggleSearchPane): Renamed from toggleSearch. Also hides the bugs pane when
654         showing the search pane.
655         (App.PaneController.actions.rangeChanged): Takes all selected points as the second argument instead of
656         taking start and end points as the second and the third arguments so that _showDetails can enumerate all
657         bugs in the selected range.
658
659         (App.PaneController._detailsChanged): Added. Hide the bugs pane whenever a new point is selected.
660         Also update singlySelectedPoint, which is used by toggleBugsPane and associateBug.
661         (App.PaneController._currentItemChanged): Updated for the _showDetails change.
662         (App.PaneController._showDetails): Takes an array of selected points in place of old arguments.
663         Simplified the code to compute the revision information. Calls _updateBugs to format the associated bugs.
664         (App.PaneController._updateBugs): Sets details.bugTrackers to a dictionary that maps a bug tracker id to
665         a bug tracker proxy with an array of (bugNumber, bugUrl) pairs and also editedBugNumber, which is used by
666         the bugs pane to associate or dissociate a bug number, if exactly one point is selected.
667
668         (App.InteractiveChartComponent._updateDotsWithBugs): Added. Sets hasBugs class on dots as needed.
669         (App.InteractiveChartComponent._setCurrentSelection): Finds and passes all points in the selected range
670         to selectionChanged action instead of just finding the first and the last points.
671
672         * public/v2/chart-pane.css: Updated the style.
673
674         * public/v2/data.js:
675         (PrivilegedAPI): Added. A wrapper for privileged APIs' CSRF tokens.
676         (PrivilegedAPI.sendRequest): Makes a privileged API call. Fetches a new CSRF token if needed.
677         (PrivilegedAPI._generateTokenInServerIfNeeded): Makes a request to privileged-api/generate-csrf-token if
678         we haven't already obtained a CSRF token or if the token has already been expired.
679         (PrivilegedAPI._post): Makes a single POST request to /privileged-api/* with a JSON payload.
680
681         (Measurement.prototype.bugs): Added.
682         (Measurement.prototype.hasBugs): Returns true iff bugs has more than one bug number.
683         (Measurement.prototype.associateBug): Associates a bug with a test run via privileged-api/associate-bug.
684
685         * public/v2/index.html: Added the bugs pane. Also added a list of bugs associated with the current run in
686         the details.
687
688         * public/v2/manifest.js:
689         (App.BugTracker.bugUrl):
690         (App.BugTracker.newBugUrl): Added.
691         (App.BugTracker.repositories): Added. This was a missing back reference to repositories.
692         (App.MetricSerializer.normalizePayload): Now parses/loads the list of bug trackers from the manifest.
693         (App.Manifest.repositoriesWithReportedCommits): Now initialized to an empty array instead of null.
694         (App.Manifest.bugTrackers): Added.
695         (App.Manifest._fetchedManifest): Sets App.Manifest.bugTrackers. Also sorts the list of repositories by
696         their respective ids to make the ordering stable.
697
698 2014-10-14  Ryosuke Niwa  <rniwa@webkit.org>
699
700         Remove unused jobs table
701         https://bugs.webkit.org/show_bug.cgi?id=137724
702
703         Reviewed by Daniel Bates.
704
705         Removed jobs table in the database as well as related code.
706
707         * init-database.sql:
708         * public/admin/jobs.php: Removed.
709         * public/admin/tests.php:
710         * public/include/admin-header.php:
711
712 2014-10-13  Ryosuke Niwa  <rniwa@webkit.org>
713
714         New perf dashboard should have an ability to search commits by a keyword
715         https://bugs.webkit.org/show_bug.cgi?id=137675
716
717         Reviewed by Geoffrey Garen.
718
719         /api/commits/ now accepts query parameters to search a commit by a keyword. Its output format changed to
720         include "authorEmail" and "authorName" directly as columns instead of including an "author" object.
721         This API change allows fetch_commits_between to generate results without processing Postgres query results.
722
723         In the front end side, we've added a search pane in pane controller, and the interactive chart component
724         now has a concept of highlighted items which is used to indicate commits found by the search pane.
725
726         * public/api/commits.php:
727         (main): Extract query parameters: keyword, from, and to and use that to fetch appropriate commits.
728         (fetch_commits_between): Moved some code from main. Now takes a search term as the third argument.
729         We look for a commit if its author name or email contains the keyword or if its revision matches the keyword.
730         (format_commit): Renamed from format_commits. Now only formats one commit.
731
732         * public/include/db.php:
733         (Database::query_and_fetch_all): Now returns array() when the query results is empty (instead of false).
734
735         * public/v2/app.css: Renamed .close-button to .icon-button since it's used by a search button as well.
736
737         * public/v2/app.js:
738         (App.Pane.searchCommit): Added. Finds the commits by a search term and assigns 'highlightedItems',
739         which is a hash table that contains highlighted items' measurements' ids as keys.
740         (App.PaneController.actions.toggleSearch): Toggles the visibility of the search pane. Also sets
741         the default commit repository.
742         (App.PaneController.actions.searchCommit): Delegates the work to App.Pane.searchCommit.
743         (App.InteractiveChartComponent._constructGraphIfPossible): Fixed a bug that we weren't removing old this._dots.
744         Added the code to initialize this._highlights.
745         (App.InteractiveChartComponent._updateDimensionsIfNeeded): Updates dimensions of highlight lines.
746         (App.InteractiveChartComponent._updateHighlightPositions): Added. Ditto.
747         (App.InteractiveChartComponent._highlightedItemsChanged): Adds vertical lines for highlighted items and deletes
748         the existing lines for the old highlighted items.
749         (App.CommitsViewerComponent.commitsChanged): Updated the code per JSON API change mentioned above.
750         Also fixed a bug that the code tries to update the commits viewer even if the viewer had already been destroyed. 
751
752         * public/v2/chart-pane.css: Added style for the search pane and the search button.
753
754         * public/v2/data.js: Turned FetchCommitsForTimeRange into a class: CommitLogs.
755         (CommitLogs): Added.
756         (CommitLogs.fetchForTimeRange): Renamed from FetchCommitsForTimeRange. Takes a search term as an argument.
757         (CommitLogs._cachedCommitsBetween): Extracted from FetchCommitsForTimeRange.
758         (CommitLogs._cacheConsecutiveCommits): Ditto.
759         (FetchCommitsForTimeRange._cachedCommitsByRepository): Deleted.
760         (Measurement.prototype.commitTimeForRepository): Extracted from formattedRevisions.
761         (Measurement.prototype.formattedRevisions): Uses formattedRevisions. Deleted the unused code for commitTime.
762
763         * public/v2/index.html: Added the search pane and the search button. Also removed the unused attribute binding
764         for showingDetails since this property is no longer used.
765
766         * public/v2/manifest.js:
767         (App.Manifest.repositories): Added.
768         (App.Manifest.repositoriesWithReportedCommits): Ditto. Used by App.PaneController.actions.toggleSearch to find
769         the default repository to search.
770         (App.Manifest._fetchedManifest): Populates repositories and repositoriesWithReportedCommits.
771
772 2014-10-13  Ryosuke Niwa  <rniwa@webkit.org>
773
774         Unreviewed build fix after r174555.
775
776         * public/include/manifest.php:
777         (ManifestGenerator::generate): Assign an empty array to $repositories_with_commit when there are no commits.
778         * tests/admin-regenerate-manifest.js: Fixed the test case.
779
780 2014-10-09  Ryosuke Niwa  <rniwa@webkit.org>
781
782         New perf dashboard UI tries to fetch commits all the time
783         https://bugs.webkit.org/show_bug.cgi?id=137592
784
785         Reviewed by Andreas Kling.
786
787         Added hasReportedCommits boolean to repository meta data in manifest.json, and used that in
788         the front end to avoid issuing HTTP requests to fetch commit logs for repositories with
789         no reported commits as they are all going to fail.
790
791         Also added an internal cache to FetchCommitsForTimeRange in the front end to avoid fetching
792         the same commit logs repeatedly. There are two data structures we cache: commitsByRevision
793         which maps a given commit revision/hash to a commit object; and commitsByTime which is an array
794         of commits sorted chronologically by time.
795
796         * public/include/manifest.php:
797
798         * public/v2/app.js:
799         (App.CommitsViewerComponent.commitsChanged):
800
801         * public/v2/data.js:
802         (FetchCommitsForTimeRange):
803         (FetchCommitsForTimeRange._cachedCommitsByRepository):
804
805         * public/v2/manifest.js:
806         (App.Repository):
807
808 2014-10-08  Ryosuke Niwa  <rniwa@webkit.org>
809
810         Another unreviewed build fix after r174477.
811
812         Don't try to insert a duplicated row into build_commits as it results in a database constraint error.
813
814         This has been caught by a test in /api/report. I don't know why I thought all tests were passing.
815
816         * public/include/report-processor.php:
817
818 2014-10-08  Ryosuke Niwa  <rniwa@webkit.org>
819
820         Unreviewed build fix after r174477.
821
822         * init-database.sql: Removed build_commits_index since it's redundant with build_commit's primary key.
823         Also fixed a syntax error that we were missing "," after line that declared build_commit column.
824
825         * public/api/runs.php: Fixed the query so that test_runs without commits data will be retrieved.
826         This is necessary for baseline and target values manually added via admin pages.
827
828 2014-10-08  Ryosuke Niwa  <rniwa@webkit.org>
829
830         Add v2 UI for the perf dashboard
831         https://bugs.webkit.org/show_bug.cgi?id=137537
832
833         Rubber-stamped by Andreas Kling.
834
835         * public/v2: Added.
836         * public/v2/app.css: Added.
837         * public/v2/app.js: Added.
838         * public/v2/chart-pane.css: Added.
839         * public/v2/data.js: Added.
840         * public/v2/index.html: Added.
841         * public/v2/js: Added.
842         * public/v2/js/d3: Added.
843         * public/v2/js/d3/LICENSE: Added.
844         * public/v2/js/d3/d3.js: Added.
845         * public/v2/js/d3/d3.min.js: Added.
846         * public/v2/js/ember-data.js: Added.
847         * public/v2/js/ember.js: Added.
848         * public/v2/js/handlebars.js: Added.
849         * public/v2/js/jquery.min.js: Added.
850         * public/v2/js/statistics.js: Added.
851         * public/v2/manifest.js: Added.
852         * public/v2/popup.js: Added.
853
854 2014-10-08  Ryosuke Niwa  <rniwa@webkit.org>
855
856         Remove superfluously duplicated code in public/api/report-commits.php.
857
858 2014-10-08  Ryosuke Niwa  <rniwa@webkit.org>
859
860         Perf dashboard should store commit logs
861         https://bugs.webkit.org/show_bug.cgi?id=137510
862
863         Reviewed by Darin Adler.
864
865         For the v2 version of the perf dashboard, we would like to be able to see commit logs in the dashboard itself.
866
867         This patch replaces "build_revisions" table with "commits" and "build_commits" relations to store commit logs,
868         and add JSON APIs to report and retrieve them. It also adds a tools/pull-svn.py to pull commit logs from
869         a subversion directory. The git version of this script will be added in a follow up patch.
870
871
872         In the new database schema, each revision in each repository is represented by exactly one row in "commits"
873         instead of one row for each build in "build_revisions". "commits" and "builds" now have a proper many-to-many
874         relationship via "build_commits" relations.
875
876         In order to migrate an existing instance of this application, run the following SQL commands:
877
878         BEGIN;
879
880         INSERT INTO commits (commit_repository, commit_revision, commit_time)
881             (SELECT DISTINCT ON (revision_repository, revision_value)
882                 revision_repository, revision_value, revision_time FROM build_revisions);
883
884         INSERT INTO build_commits (commit_build, build_commit) SELECT revision_build, commit_id
885             FROM commits, build_revisions
886             WHERE commit_repository = revision_repository AND commit_revision = revision_value;
887
888         DROP TABLE build_revisions;
889
890         COMMIT;
891
892
893         The helper script to submit commit logs can be used as follows:
894
895         python ./tools/pull-svn.py "WebKit" https://svn.webkit.org/repository/webkit/ https://perf.webkit.org
896             feeder-slave feeder-slave-password 60 "webkit-patch find-users"
897
898         The above command will pull the subversion server at https://svn.webkit.org/repository/webkit/ every 60 seconds
899         to retrieve at most 10 commits, and submits the results to https://perf.webkit.org using "feeder-slave" and
900         "feeder-slave-password" as the builder name and the builder password respectively.
901
902         The last, optional, argument is the shell command to convert a subversion account to the corresponding username.
903         e.g. "webkit-patch find-users rniwa@webkit.org" yields "Ryosuke Niwa" <rniwa@webkit.org> in the stdout.
904
905
906         * init-database.sql: Replaced "build_revisions" relation with "commits" and "build_commits" relations.
907
908         * public/api/commits.php: Added. Retrieves a list of commits based on arguments in its path of the form
909             /api/commits/<repository-name>/<filter>. The behavior of this API depends on <filter> as follows:
910
911             - Not specified - It returns every single commit for a given repository.
912             - Matches "oldest" - It returns the commit with the oldest timestamp.
913             - Matches "latest" - It returns the commit with the latest timestamp.
914             - Matches "last-reported" - It returns the commit with the latest timestamp added via report-commits.php.
915             - Is entirely alphanumeric - It returns the commit whose revision matches the filter.
916             - Is of the form <alphanumeric>:<alphanumeric> or <alphanumeric>-<alphanumeric> - It retrieves the list
917             of commits added via report-commits.php between two timestamps retrieved from commits whose revisions
918             match the two alphanumeric values specified. Because it retrieves commits based on their timestamps,
919             the list may contain commits that do not appear as neither hash's ancestor in git/mercurial.
920         (main):
921         (commit_from_revision):
922         (fetch_commits_between):
923         (format_commits):
924
925         * public/api/report-commits.php: Added. A JSON API to report new subversion, git, or mercurial commits.
926         See tests/api-report-commits.js for examples on how to use this API.
927
928         * public/api/runs.php: Updated the query to use "commit_builds" and "commits" relations instead of
929         "build_revisions". Regrettably, the new query is 20% slower but I'm going to wait until the new UI is ready
930         to optimize this and other JSON APIs.
931
932         * public/include/db.php:
933         (Database::select_or_insert_row):
934         (Database::update_or_insert_row): Added.
935         (Database::_select_update_or_insert_row): Extracted from select_or_insert_row. Try to update first and then
936         insert if the update fails for update_or_insert_row. Preserves the old behavior when $should_update is false.
937
938         (Database::select_first_row):
939         (Database::select_last_row): Added.
940         (Database::select_first_or_last_row): Extracted from select_first_row. Fixed a bug that we were asserting
941         $order_by to be not alphanumeric/underscore. Retrieve the last row instead of the first if $descending_order.
942
943         * public/include/report-processor.php:
944         (ReportProcessor::resolve_build_id): Store commits instead of build_revisions. We don't worry about the race
945         condition for adding "build_commits" rows since we shouldn't have a single tester submitting the same result
946         concurrently. Even if it happened, it will only result in a PHP error and the database will stay consistent.
947
948         * run-tests.js:
949         (pathToTests): Don't call path.resolve with "undefined" testName; It throws an exception in the latest node.js.
950
951         * tests/api-report-commits.js: Added.
952         * tests/api-report.js: Fixed a test per build_revisions to build_commits/commits replacement.
953
954         * tools: Added.
955         * tools/pull-svn.py: Added. See above for how to use this script.
956         (main):
957         (determine_first_revision_to_fetch):
958         (fetch_revision_from_dasbhoard):
959         (fetch_commit_and_resolve_author):
960         (fetch_commit):
961         (textContent):
962         (resolve_author_name_from_email):
963         (submit_commits):
964
965 2014-09-30  Ryosuke Niwa  <rniwa@webkit.org>
966
967         Update Install.md for Mavericks and fix typos
968         https://bugs.webkit.org/show_bug.cgi?id=137276
969
970         Reviewed by Benjamin Poulain.
971
972         Add the instruction to copy php.ini to enable the Postgres extension in PHP.
973
974         Also use perf.webkit.org as the directory name instead of WebKitPerfMonitor.
975
976         Finally, init-database.sql is no longer located inside database directory.
977
978         * Install.md:
979
980 2014-08-11  Ryosuke Niwa  <rniwa@webkit.org>
981
982         Report run id's in api/runs.php for the new dashboard UI
983         https://bugs.webkit.org/show_bug.cgi?id=135813
984
985         Reviewed by Andreas Kling.
986
987         Include run_id in the generated JSON.
988
989         * public/api/runs.php:
990         (fetch_runs_for_config): Don't sort results by time since that has been done in the front end for ages now.
991         (format_run):
992
993 2014-08-11  Ryosuke Niwa  <rniwa@webkit.org>
994
995         Merging platforms mixes baselines and targets into reported data
996         https://bugs.webkit.org/show_bug.cgi?id=135260
997
998         Reviewed by Andreas Kling.
999
1000         When merging two platforms, move test configurations of a different type (baseline, target)
1001         as well as of different metric (Time, Runs).
1002
1003         Also avoid fetching the entire table of runs just to see if there are no remaining runs.
1004         It's sufficient to detect one such test_runs object.
1005
1006         * public/admin/platforms.php:
1007         (merge_platforms):
1008
1009 2014-07-30  Ryosuke Niwa  <rniwa@webkit.org>
1010
1011         Merging platforms mixes baselines and targets into reported data
1012         https://bugs.webkit.org/show_bug.cgi?id=135260
1013
1014         Reviewed by Geoffrey Garen.
1015
1016         Make sure two test configurations we're merging are of the same type (e.g. baseline, target, current).
1017         Otherwise, we'll erroneously mix up runs for baseline, target, and current (reported values).
1018
1019         * public/admin/platforms.php:
1020
1021 2014-07-23  Ryosuke Niwa  <rniwa@webkit.org>
1022
1023         Build fix after r171361.
1024
1025         * public/js/helper-classes.js:
1026         (.this.formattedBuildTime):
1027
1028 2014-07-22  Ryosuke Niwa  <rniwa@webkit.org>
1029
1030         Perf dashboard spends 2s processing JSON data during the page loads
1031         https://bugs.webkit.org/show_bug.cgi?id=135152
1032
1033         Reviewed by Andreas Kling.
1034
1035         In the Apple internal dashboard, we were spending as much as 2 seconds
1036         converting raw JSON data into proper JS objects while loading the dashboard.
1037
1038         This caused the apparent unresponsiveness of the dashboard despite of the fact
1039         charts themselves updated almost instantaneously.
1040
1041         * public/index.html:
1042         * public/js/helper-classes.js:
1043         (TestBuild): Compute the return values of formattedTime and formattedBuildTime
1044         lazily as creating new Date objects and running string replace is expensive.
1045         (TestBuild.formattedTime):
1046         (TestBuild.formattedBuildTime):
1047         (PerfTestRuns.setResults): Added. Pushing each result was the biggest bottle neck.
1048         (PerfTestRuns.addResult): Deleted.
1049
1050 2014-07-18  Ryosuke Niwa  <rniwa@webkit.org>
1051
1052         Perf dashboard shouldn't show the full git hash
1053         https://bugs.webkit.org/show_bug.cgi?id=135083
1054
1055         Reviewed by Benjamin Poulain.
1056
1057         Detect Git/Mercurial hash by checking the length.
1058
1059         If it's a hash, use the first 8 characters in the label
1060         while retaining the full length to be used in hyperlinks.
1061
1062         * public/js/helper-classes.js:
1063         (.this.formattedRevisions):
1064         (TestBuild):
1065
1066 2014-05-29  Ryosuke Niwa  <rniwa@webkit.org>
1067
1068         Add an instruction on how to backup the database.
1069         https://bugs.webkit.org/show_bug.cgi?id=133391
1070
1071         Rubber-stamped by Andreas Kling.
1072
1073         * Install.md:
1074
1075 2014-04-08  Ryosuke Niwa  <rniwa@webkit.org>
1076
1077         Build fix after r166479. 'bytes' is now abbreviated as 'B'.
1078
1079         * public/js/helper-classes.js:
1080         (PerfTestRuns.smallerIsBetter):
1081
1082 2014-04-08  Ryosuke Niwa  <rniwa@webkit.org>
1083
1084         Some CSS teaks.
1085
1086         * public/common.css:
1087         (#title):
1088         * public/index.html:
1089         (#charts .pane):
1090         (#charts .arrow):
1091
1092 2014-04-03  Ryosuke Niwa  <rniwa@webkit.org>
1093
1094         WebKitPerfMonitor: There should be a way to add all metrics of a suite without also adding subtests
1095         https://bugs.webkit.org/show_bug.cgi?id=131157
1096
1097         Reviewed by Andreas Kling.
1098
1099         Split "all metrics" into all metrics of a test suite and all subtests of the suite.
1100         This allows, for example, adding all metrics such as Arithmetic and Geometric for
1101         a given test suite without also adding its subtests.
1102
1103         * public/index.html:
1104         (init.showCharts):
1105         (init):
1106
1107 2014-04-03  Ryosuke Niwa  <rniwa@webkit.org>
1108
1109         WebKitPerfMonitor: Tooltips cannot be pinned after using browser's back button
1110         https://bugs.webkit.org/show_bug.cgi?id=131155
1111
1112         Reviewed by Andreas Kling.
1113
1114         The bug was caused by Chart.attach binding event listeners on plot container on each call.
1115         This resulted in the click event handler toggling the visiblity of the tooltip twice upon
1116         click when attach() has been called even number of times, keeping the tooltip invisible.
1117
1118         Fixed the bug by extracting the code to bind event listeners outside of Chart.attach as
1119         a separate function, bindPlotEventHandlers, and calling it exactly once when Chart.attach
1120         is called for the first time.
1121
1122         * public/index.html:
1123         (Chart.attach):
1124         (Chart..bindPlotEventHandlers):
1125
1126 2014-04-03  Ryosuke Niwa  <rniwa@webkit.org>
1127
1128         WebKitPerfMonitor: Tooltips can be cut off at the top
1129         https://bugs.webkit.org/show_bug.cgi?id=130960
1130
1131         Reviewed by Andreas Kling.
1132
1133         * public/common.css:
1134         (#title): Removed the gradients, box shadows, and border from the header.
1135         (#title h1): Reduce the font size.
1136         (#title ul): Use line-height to vertically align the navigation bar instead of specifying a padding atop.
1137         * public/index.html:
1138         (.tooltop:before): Added. Identical to .tooltop:after except it's upside down (arrow facing up).
1139         (.tooltip.inverted:before): Show the arrow facing up when .inverted is set.
1140         (.tooltip.inverted:before): Hide the arrow facing down when .inverted is set.
1141         * public/js/helper-classes.js:
1142         (Tooltip.show): Show the tooltip below the point if placing it above the point results in the top of the
1143         tooltip extending above y=0.
1144
1145 2014-04-03  Ryosuke Niwa  <rniwa@webkit.org>
1146
1147         WebKitPerfMonitor: Y-axis adjustment is too aggressive
1148         https://bugs.webkit.org/show_bug.cgi?id=130937
1149
1150         Reviewed by Andreas Kling.
1151
1152         Previously, adjusted min. and max. were defined as the two standards deviations away from EWMA of measured
1153         results. This had two major problems:
1154         1. Two standard deviations can be too small to show the confidence interval for results.
1155         2. Sometimes baseline and target can be more than two standards deviations away.
1156
1157         Fixed the bug by completely rewriting the algorithm to compute the interval. Instead of blindly using two
1158         standard deviations as margins, we keep adding quarter the standard deviation on each side until more than 90%
1159         of points lie in the interval or we've expanded 4 standard deviations. Once this condition is met, we reduce
1160         the margin on each side separately to reduce the empty space on either side.
1161
1162         A more rigorous approach would involve computing least squared value of results with respect to intervals
1163         but that seems like an overkill for a simple UI problem; it's also computationally expensive.
1164
1165         * public/index.html:
1166         (Chart..adjustedIntervalForRun): Extracted from computeYAxisBoundsToFitLines.
1167         (Chart..computeYAxisBoundsToFitLines): Compute the min. and max. adjusted intervals out of adjusted intervals
1168         for each runs (current, baseline, and target) so that at least one point from each set of results is shown.
1169         We wouldn't see the difference between measured values versus baseline and target values otherwise.
1170         * public/js/helper-classes.js:
1171         (PerfTestResult.unscaledConfidenceIntervalDelta): Returns the default value if the confidence
1172         interval delta cannot be computed.
1173         (PerfTestResult.isInUnscaledInterval): Added. Returns true iff the confidence intervals lies
1174         within the given interval.
1175         (PerfTestRuns..filteredResults): Extracted from unscaledMeansForAllResults now that PerfTestRuns.min and
1176         PerfTestRuns.max need to use both mean and confidence interval delta for each result.
1177         (PerfTestRuns..unscaledMeansForAllResults):
1178         (PerfTestRuns.min): Take the confidence interval delta into account.
1179         (PerfTestRuns.max): Ditto.
1180         (PerfTestRuns.countResults): Returns the number of results in the given time frame (> minTime).
1181         (PerfTestRuns.countResultsInInterval): Returns the number of results whose confidence interval lie within the
1182         given interval.
1183         (PerfTestRuns.exponentialMovingArithmeticMean): Fixed the typo so that it actually computes the EWMA.
1184
1185 2014-03-31  Ryosuke Niwa  <rniwa@webkit.org>
1186
1187         Some CSS tweaks after r166477 and r166479,
1188
1189         * public/index.html:
1190
1191 2014-03-30  Ryosuke Niwa  <rniwa@webkit.org>
1192
1193         WebKitPerfMonitor: Sometimes text inside panes overlap
1194         https://bugs.webkit.org/show_bug.cgi?id=130956
1195
1196         Reviewed by Gyuyoung Kim.
1197
1198         Revamped the pane UI. Now build info uses table element instead of plane text with BRs. The computed status of
1199         the latest result against baseline/target such as "3% until target" is now shown above the current value. This
1200         reduces the total height of the pane and fits more information per screen capita on the dashboard.
1201
1202         * public/index.html: Updated and added a bunch of CSS rules for the new look.
1203         (.computeStatus): Don't append the build info here. The build info is constructed as a separate table now.
1204         (.createSummaryRowMarkup): Use th instead of td for "Current", "Baseline", and "Target" in the summary table.
1205         (.buildLabelWithLinks): Construct table rows instead of br separated lines of text. This streamlines the look
1206         of the build info shown in a chart pane and a tooltip.
1207         (Chart): Made .status a table.
1208         (Chart.populate): Prepend status.text, which contains text such as "3% until target", into the summary rows
1209         right above "Current" value, and populate .status with buildLabelWithLinks manually instead of status.text
1210         now that status.text no longer contains it.
1211         (Chart..showTooltipWithResults):  Wrap buildLabelWithLinks with a table element.
1212
1213         * public/js/helper-classes.js:
1214         (TestBuild.formattedRevisions): Don't include repository names in labels since repository names are now added
1215         by buildLabelWithLinks inside th elements. Also place spaces around '-' between two different OS X versions.
1216         e.g. "OS X 10.8 - OS X 10.9" instead of "OS X 10.8-OS X 10.9".
1217         (PerfTestRuns): Use "/s" for "runs/s" and "B" for "bytes" to make text shorter in .status and .summaryTable.
1218         (PerfTestRuns..computeScalingFactorIfNeeded): Avoid placing a space between 'M' and a unit starting with a
1219         capital letter; e.g. "MB" instead of "M B".
1220
1221 2014-03-30  Ryosuke Niwa  <rniwa@webkit.org>
1222
1223         WebKitPerfMonitor: Header and number-of-days slider takes up too much space
1224         https://bugs.webkit.org/show_bug.cgi?id=130957
1225
1226         Reviewed by Gyuyoung Kim.
1227
1228         Moved the slider into the header. Also reduced the spacing between the header and platform names.
1229         This reclaims 50px × width of the screen real estate.
1230
1231         * public/common.css:
1232         (#title): Reduced the space below the header from 20px to 10px.
1233         * public/index.html:
1234         (#numberOfDaysPicker): Removed the rounded border around the number-of-days slider.
1235         (#dashboard > tbody > tr > td): Added a 1.5em padding at the bottom.
1236         (#dashboard > thead th): That allows us to remove the padding at the top here. This reduces the wasted screen
1237         real estate between the header and the platform names.
1238
1239 2014-03-10  Zoltan Horvath  <zoltan@webkit.org>
1240
1241         Update the install guidelines for perf.webkit.org
1242         https://bugs.webkit.org/show_bug.cgi?id=129895
1243
1244         Reviewed by Ryosuke Niwa.
1245
1246         The current install guideline for perf.webkit.org discourages the use of the installed
1247         Server application. I've actualized the documentation for Mavericks, and modified the
1248         guideline to include the instructions for Server.app also.
1249
1250         * Install.md:
1251
1252 2014-03-08  Zoltan Horvath  <zoltan@webkit.org>
1253
1254         Update perf.webkit.org json example
1255         https://bugs.webkit.org/show_bug.cgi?id=129907
1256
1257         Reviewed by Andreas Kling.
1258
1259         The current example is not valid json syntax. I fixed the syntax errors and indented the code properly.
1260
1261         * ReadMe.md:
1262
1263 2014-01-31  Ryosuke Niwa  <rniwa@webkit.org>
1264
1265         Merge database-common.js and utility.js into run-tests.js.
1266
1267         Reviewed by Matthew Hanson.
1268
1269         Now that run-tests is the only node.js script, merged database-common.js and utility.js into it.
1270         Also moved init-database.sql out of the database directory and removed the directory entirely.
1271
1272         * database: Removed.
1273         * database/database-common.js: Removed.
1274         * database/utility.js: Removed.
1275         * init-database.sql: Moved from database/init-database.sql.
1276         * run-tests.js:
1277         (connect): Moved from database-common.js.
1278         (pathToDatabseSQL): Extracted from pathToLocalScript.
1279         (pathToTests): Moved from database-common.js.
1280         (config): Ditto.
1281         (TaskQueue): Ditto.
1282         (SerializedTaskQueue): Ditto.
1283         (main):
1284         (initializeDatabase):
1285         (TestEnvironment.it):
1286         (TestEnvironment.queryAndFetchAll):
1287         (sendHttpRequest):
1288
1289 2014-01-30  Ryosuke Niwa  <rniwa@webkit.org>
1290
1291         Remove the dependency on node.js from the production code.
1292
1293         Reviewed by Ricky Mondello.
1294
1295         Work towards <rdar://problem/15955053> Upstream SafariPerfMonitor.
1296
1297         Removed node.js dependency from TestRunsGenerator. It was really a design mistake to invoke node.js from php.
1298         It added so much complexity with only theoretical extensibility of adding aggregators.  It turns out that
1299         many aggregators we'd like to add are a lot more complicated than ones that could be written under the current
1300         infrastructure, and we need to make the other aspects (e.g. the level of aggregations) a lot more extensible.
1301         Removing and simplifying TestRunsGenerator allows us to implement such extensions in the future.
1302
1303         Also removed the js files that are no longer used.
1304
1305         * config.json: Moved from database/config.json.
1306         * database/aggregate.js: Removed. No longer used.
1307         * database/database-common.js: Removed unused functions, and updated the path to config.json.
1308         * database/process-jobs.js: Removed. No longer used.
1309         * database/sample-data.sql: Removed. We have a much better corpus of data now.
1310         * database/schema.graffle: Removed. It's completely obsolete.
1311         * public/include/db.php: Updated the path to config.json.
1312         * public/include/evaluator.js: Removed.
1313
1314         * public/include/report-processor.php:
1315         (TestRunsGenerator::aggregate): Directly aggregate values via newly added aggregate_values method instead of
1316         storing values into $expressions and calling evaluate_expressions_by_node.
1317         (TestRunsGenerator::aggregate_values): Added.
1318         (TestRunsGenerator::compute_caches): Directly compute the caches.
1319
1320 2014-01-30  Ryosuke Niwa  <rniwa@webkit.org>
1321
1322         Build fix. Don't fail the platform merges even if there are no test configurations to be moved to the new platform.
1323
1324         * public/admin/platforms.php:
1325         * public/include/db.php:
1326
1327 2014-01-30  Ryosuke Niwa  <rniwa@webkit.org>
1328
1329         Zoomed y-axis view is ununsable when the last result is an outlier.
1330
1331         Reviewed by Stephanie Lewis.
1332
1333         Show two standard deviations from the exponential moving average with alpha = 0.3 instead of the mean of
1334         the last result so that the graph looks sane if the last result was an outlier. However, always show
1335         the last result's mean even if it was an outlier.
1336
1337         * public/index.html:
1338         * public/js/helper-classes.js:
1339         (unscaledMeansForAllResults): Extracted from min/max/sampleStandardDeviation.
1340         Also added the ability to cache the unscaled means to avoid recomputation.
1341         (PerfTestRuns.min): Refactored to use unscaledMeansForAllResults.
1342         (PerfTestRuns.max): Ditto.
1343         (PerfTestRuns.sampleStandardDeviation): Ditto.
1344         (PerfTestRuns.exponentialMovingArithmeticMean): Added.
1345
1346 2014-01-30  Ryosuke Niwa  <rniwa@webkit.org>
1347
1348         Minor fixes.
1349
1350         * public/admin/tests.php:
1351         * public/js/helper-classes.js:
1352
1353 2014-01-29  Ryosuke Niwa  <rniwa@webkit.org>
1354
1355         Use two standard deviations instead as I mentioned in the mailing list.
1356
1357         * public/index.html:
1358
1359 2014-01-28  Ryosuke Niwa  <rniwa@webkit.org>
1360
1361         The performance dashboard erroneously shows upward arrow for combined metrics.
1362
1363         A single outlier can ruin the zoomed y-axis view.
1364
1365         Rubber-stamped by Antti Koivisto.
1366
1367         * public/index.html:
1368         (computeYAxisBoundsToFitLines): Added adjustedMax and adjustedMin, which are pegged at 4 standard deviations
1369         from the latest results' mean.
1370         (Chart): Renamed shouldStartYAxisAtZero to shouldShowEntireYAxis.
1371         (Chart.attachMainPlot): Use the adjusted max and min when we're not showing the entire y-axis.
1372         (Chart.toggleYAxis):
1373         * public/js/helper-classes.js:
1374         (PerfTestRuns.sampleStandardDeviation): Added.
1375         (PerfTestRuns.smallerIsBetter): 'Combined' is a smaller is better metric.
1376
1377 2014-01-28  Ryosuke Niwa  <rniwa@webkit.org>
1378
1379         Don't include the confidence interval when computing the y-axis.
1380
1381         Rubber-stamped by Simon Fraser.
1382
1383         * public/js/helper-classes.js:
1384         (PerfTestRuns.min):
1385         (PerfTestRuns.max):
1386
1387 2014-01-25  Ryosuke Niwa  <rniwa@webkit.org>
1388
1389         Tiny CSS tweak for tooltips.
1390
1391         * public/index.html:
1392
1393 2014-01-25  Ryosuke Niwa  <rniwa@webkit.org>
1394
1395         Remove the erroneously repeated code.
1396
1397         * public/admin/test-configurations.php:
1398
1399 2014-01-24  Ryosuke Niwa  <rniwa@webkit.org>
1400
1401         <rdar://problem/15704893> perf dashboard should show baseline numbers
1402
1403         Reviewed by Stephanie Lewis.
1404
1405         * public/admin/bug-trackers.php:
1406         (associated_repositories): Return an array of HTMLs instead of echo'ing as expected by AdministrativePage.
1407         Also fixed a typo.
1408
1409         * public/admin/platforms.php:
1410         (merge_list): Ditto.
1411
1412         * public/admin/test-configurations.php: Added.
1413         (add_run): Adds a "synthetic" test run and a corresponding build. It doesn't create run_iterations and
1414         build_revisions as they're not meaningful for baseline / target numbers.
1415         (delete_run): Deletes a synthetic test run and its build. It verifies that the specified build has exactly
1416         one test run so that we don't accidentally delete a reported test run.
1417         (generate_rows_for_configurations): Generates rows of configuration IDs and types.
1418         (generate_rows_for_test_runs): Ditto for test runs. It also emits the form to add new "synthetic" test runs
1419         and delete existing ones.
1420
1421         * public/admin/tests.php: We wrongfully assumed there is exactly one test configuration for each metric
1422         on each platform; there could be configurations of distinct types such as "current" and "baseline".
1423         Thus, update all test configurations for a given metric when updating config_is_in_dashboard.
1424
1425         * public/api/runs.php: Remove the NotImplemented when we have multiple test configurations.
1426         (fetch_runs_for_config): "Synthetic" test runs created on test-configurations page are missing revision
1427         data so we need to left-outer-join (instead of inner-join) build_revisions. To avoid making the query
1428         unreadable, don't join revision_repository here. Instead, fetch the list of repositories upfront and
1429         resolve names in parse_revisions_array. This actually reduces the query time by ~10%.
1430
1431         (parse_revisions_array): Skip an empty array created for "synthetic" test runs.
1432
1433         * public/include/admin-header.php:
1434         (AdministrativePage::render_table): Now custom columns support sub columns. e.g. a configuration column may
1435         have id and type sub columns, and each custom column could generate multiple rows.
1436
1437         Any table with sub columns now generates two rows for thead. We generate td's in in the first row without
1438         sub columns with rowspan of 2, and generate ones with sub columns with colspan set to the sub column count.
1439         We then proceed to generate the second header row with sub column names.
1440
1441         When generating the actual content, we first generate all custom columns as they may have multiple rows in
1442         which case regular columns need rowspan set to the maximum number of rows.
1443
1444         Once we've generated the first row, we proceed to generate subsequent rows for those custom columns that
1445         have multiple rows.
1446
1447         (AdministrativePage::render_custom_cells): Added. This function is responsible for generating table cells
1448         for a given row in a given custom column. It generates an empty td when the custom column doesn't have
1449         enough rows. It also generates empty an td when it doesn't have enough columns in some rows except when
1450         the entire row consists of exactly one cell for a custom column with sub columns, in which case the cell is
1451         expanded to occupy all sub columns.
1452
1453         * public/include/manifest.php:
1454         (ManifestGenerator::platforms): Don't add the metric more than once.
1455
1456         * public/include/test-name-resolver.php:
1457         (TestNameResolver::__construct): We had wrongfully assumed that we have exactly one test configuration on
1458         each platform for each metric like tests.php. Fixed that. Also fetch the list of aggregators to compute the
1459         full metric name later.
1460         (TestNameResolver::map_metrics_to_tests): Populate $this->id_to_metric.
1461         (TestNameResolver::test_id_for_full_name): Simplified the code using array_get.
1462         (TestNameResolver::full_name_for_test): Added.
1463         (TestNameResolver::full_name_for_metric): Added.
1464         (TestNameResolver::configurations_for_metric_and_platform): Renamed as it returns multiple configurations.
1465
1466         * public/js/helper-classes.js:
1467         (TestBuild): Use the build time as the maximum time when revision information is missing for "synthetic"
1468         test runs created to set baseline and target points.
1469
1470 2014-01-24  Ryosuke Niwa  <rniwa@webkit.org>
1471
1472         Build fix after r57928. Removed a superfluous close parenthesis.
1473
1474         * public/api/runs.php:
1475
1476 2014-01-24  Ryosuke Niwa  <rniwa@webkit.org>
1477
1478         Unreviewed build & typo fixes.
1479
1480         * public/admin/platforms.php:
1481         * tests/admin-platforms.js:
1482
1483 2014-01-24  Ryosuke Niwa  <rniwa@webkit.org>
1484
1485         <rdar://problem/15704893> perf dashboard should show baseline numbers
1486
1487         Rubber-stamped by Antti Koivisto.
1488
1489         Organize some code into functions in runs.php.
1490
1491         Also added back $paths that was erroneously removed in r57925 from json-header.php.
1492
1493         * public/api/runs.php:
1494         (fetch_runs_for_config): Extracted.
1495         (format_run): Ditto.
1496
1497 2014-01-23  Ryosuke Niwa  <rniwa@webkit.org>
1498
1499         Merge the upstream json-shared.php as of https://trac.webkit.org/r162693.
1500
1501         * database/config.json:
1502         * public/admin/reprocess-report.php:
1503         * public/api/report.php:
1504         * public/api/runs.php:
1505         * public/include/json-header.php:
1506
1507 2014-01-23  Ryosuke Niwa  <rniwa@webkit.org>
1508
1509         Commit yet another forgotten change.
1510
1511         Something went horribly wrong with my merge :(
1512
1513         * database/init-database.sql:
1514
1515 2014-01-23  Ryosuke Niwa  <rniwa@webkit.org>
1516
1517         Commit one more forgotten change. Sorry for making a mess here.
1518
1519 2014-01-23  Ryosuke Niwa  <rniwa@webkit.org>
1520
1521         Commit the forgotten files.
1522
1523         * public/admin/platforms.php: Added.
1524         * tests/admin-platforms.js: Added.
1525
1526 2014-01-23  Ryosuke Niwa  <rniwa@webkit.org>
1527
1528         <rdar://problem/15889905> SafariPerfMonitor: there should be a way to merge and hide platforms
1529
1530         Reviewed by Stephanie Lewis.
1531
1532         Added /admin/platforms/ page to hide and merge platforms.
1533
1534         Merging two platforms is tricky because we need to migrate test runs as well as some test configurations.
1535         Recall that each test (e.g. Dromaeo) can have many "test metrics" (e.g. MaxAllocations, EndAllocations),
1536         and they have a distinct "test configuration" for each platform (e.g. MaxAllocation on Mountain Lion), and
1537         each test configuration a distinct "test run" for each build.
1538
1539         In order to merge platform A into platform B, we must migrate all test runs that belong to platform A via
1540         their test configurations into platform B.
1541
1542         Suppose we're migrating a test run R for test configuration T_A in platform A for metric M. Since M exists
1543         independent of platforms, R should continue to relate to M through some test configuration. Unfortunately,
1544         we can't simply move T_A into platform B since we may already have a test configuration T_B for metric M
1545         in platform B, in which case R should relate to T_B instead.
1546
1547         Thus, we first migrate all test runs for which we already have corresponding test configurations in the
1548         new platform. We then migrate the test configurations of the remaining test runs.
1549
1550         * database/init-database.sql: Added platform_hidden.
1551
1552         * public/admin/platforms.php: Added.
1553         (merge_platforms): Added. Implements the algorithm described above.
1554         (merge_list): Added.
1555
1556         * public/admin/tests.php: Disable the checkbox to show a test configuration on the dashboard if its platform
1557         is hidden since it doesn't do anything.
1558
1559         * public/include/admin-header.php: Added the hyperlink to /admin/platforms.
1560         (update_field): Don't bail out if the newly added "update-column" is set to the field name even if $_POST is
1561         missing it since unchecked checkbox doesn't set the value in $_POST.
1562         (AdministrativePage::render_form_control_for_column): Added the support for boolean edit mode. Also used
1563         switch statement instead of repeated if's.
1564         (AdministrativePage::render_table): Emit "update-column" for update_field.
1565
1566         * public/include/db.php: Disable warnings when we're not in the debug mode.
1567
1568         * public/include/manifest.php:
1569         (ManifestGenerator::platforms): Skip platforms that have been hidden.
1570
1571         * run-tests.js:
1572         (TestEnvironment.postJSON):
1573         (TestEnvironment.httpGet):
1574         (TestEnvironment.httpPost): Added.
1575         (sendHttpRequest): Set the content type if specified.
1576
1577         * tests/admin-platforms.js: Added tests.
1578
1579 2014-01-22  Ryosuke Niwa  <rniwa@webkit.org>
1580
1581         Extract the code to compute full test names from tests.php.
1582
1583         Reviewed by Stephanie Lewis.
1584
1585         Extracted TestNameResolver out of tests.php. This reduces the number of global variables in tests.php
1586         and paves our way to re-use the code in other pages.
1587
1588         * public/admin/tests.php:
1589
1590         * public/include/db.php:
1591         (array_set_default): Renamed from array_item_set_default and moved from tests.php as it's used in both
1592         tests.php and test-name-resolver.php.
1593
1594         * public/include/test-name-resolver.php: Added.
1595         (TestNameResolver::__construct):
1596         (TestNameResolver::compute_full_name): Moved from tests.php.
1597         (TestNameResolver::map_metrics_to_tests): Ditto.
1598         (TestNameResolver::sort_tests_by_full_name): Ditto.
1599         (TestNameResolver::tests): Added.
1600         (TestNameResolver::test_id_for_full_name): Ditto.
1601         (TestNameResolver::metrics_for_test_id): Ditto.
1602         (TestNameResolver::child_metrics_for_test_id): Ditto.
1603         (TestNameResolver::configuration_for_metric_and_platform): Ditto.
1604
1605 2014-01-21  Ryosuke Niwa  <rniwa@webkit.org>
1606
1607         <rdar://problem/15867325> Perf dashboard is erroneously associating reported results with old revisions
1608
1609         Reviewed by Stephanie Lewis.
1610
1611         Add the ability to reprocess reports so that I can re-associate wrongfully associated reports.
1612
1613         Added public/admin/reprocess-report.php. It doesn't have any nice UI to find reports and it returns JSON
1614         but that's sufficient to correct the wrongfully processed reports for now.
1615
1616         * public/admin/reprocess-report.php: Added. Takes a report id in $_GET or $_POST and process the report.
1617         We should eventually add a nice UI to find and reprocess reports.
1618
1619         * public/api/report.php: ReportProcessor and TestRunsGenerator have been removed.
1620
1621         * public/include/db.php: Added the forgotten call to prefixed_column_names.
1622
1623         * public/include/report-processor.php: Copied from public/api/report.php.
1624         (ReportProcessor::__construct): Fetch the list of aggregators here for simplicity.
1625         (ReportProcessor::process): Optionally takes $existing_report_id. When this value is specified, we don't
1626         create a new report or authenticate the builder password (the password is never stored in the report).
1627         Also use select_first_row instead of query_and_fetch_all to find the builder for simplicity.
1628         (ReportProcessor::construct_build_data): Extracted from store_report_and_get_build_data.
1629         (ReportProcessor::store_report): Ditto.
1630
1631         * tests/admin-reprocess-report.js: Added.
1632
1633 2014-01-21  Ryosuke Niwa  <rniwa@webkit.org>
1634
1635         <rdar://problem/15867325> Perf dashboard is erroneously associating reported results with old revisions
1636
1637         Reviewed by Ricky Mondello.
1638
1639         The bug was caused by a build fix r57645. It attempted to treat multiple reports from the same builder
1640         for the same build number as a single build by ignoring build time. This was necessary to associate
1641         multiple reports by a single build - e.g. for different performance test suites - because the scripts
1642         we use to submit results computed its own "build time" when they're called.
1643
1644         An unintended consequence of this change was revealed when we moved a buildbot master to the new machine
1645         last week; new reports were wrongfully associated with old build numbers.
1646
1647         Fixed the bug by not allowing reports made more than 1 day after the initial build time to be assigned
1648         to the same build. Instead, we create a new build object for those reports. Since the longest set of
1649         tests we have only take a couple of hours to run, 24 hours should be more than enough.
1650
1651         * database/init-database.sql: We can no longer constrain that each build number is unique to a builder
1652         or that build number and build time pair is unique. Instead, constrain the uniqueness of the tuple
1653         (builder, build number, build time).
1654
1655         * public/api/report.php:
1656         (ReportProcessor::resolve_build_id): Look for any builds made within the past one day. Create a new build
1657         when no such build exists. This prevents a report from being associated with a very old build of the same
1658         build number.
1659
1660         Also check that revision numbers or hashes match when we're adding revision info. This will let us catch
1661         a similar bug in the future sooner.
1662
1663         * tests/api-report.js: Added three test cases.
1664
1665 2014-01-20  Ryosuke Niwa  <rniwa@webkit.org>
1666
1667         Merged the upstream changes to db.php
1668         See http://trac.webkit.org/browser/trunk/Websites/test-results/public/include/db.php
1669
1670         * public/include/db.php:
1671
1672 2014-01-20  Ryosuke Niwa  <rniwa@webkit.org>
1673
1674         Update other scripts and tests per previous patch.
1675
1676         * public/include/manifest.php:
1677         * tests/admin-regenerate-manifest.js:
1678
1679 2014-01-20  Ryosuke Niwa  <rniwa@webkit.org>
1680
1681         Remove metrics_unit.
1682
1683         Reviewed by Ricky Mondello.
1684
1685         This column is no longer used by the front-end code since r48360.
1686
1687         * database/init-database.sql:
1688         * public/admin/tests.php:
1689
1690 2014-01-16  Ryosuke Niwa  <rniwa@webkit.org>
1691
1692         Unreviewed build fix.
1693
1694         * public/api/report.php:
1695
1696 2014-01-15  Ryosuke Niwa  <rniwa@webkit.org>
1697
1698         <rdar://problem/15832456> Automate DoYouEvenBench (124497)
1699
1700         Reviewed by Ricky Mondello.
1701
1702         Support a new alternative format for aggregated results where we have raw values as well as
1703         the list aggregators so that instead of
1704         "metrics": {"Time": ["Arithmetic"]}
1705         we can have
1706         "metrics": {"Time": { "aggregators" : ["Arithmetic"], "current": [300, 310, 320, 330] }}
1707
1708         This allows single JSON generated by run-perf-tests in WebKit to be shared between the perf
1709         dashboard and the generated results page, which doesn't know how to aggregate values.
1710
1711         We need to keep the support for the old format because all other existing performance tests
1712         all rely on the old format. Even if we updated the tests, we need the dashboard to support
1713         the old format during the transition.
1714
1715         * public/api/report.php:
1716         (ReportProcessor::recursively_ensure_tests): Support the new format in addition to the old one.
1717         (ReportProcessor::aggregator_list_if_exists): Replaced is_list_of_aggregators.
1718
1719         * tests/api-report.js: Updated one of aggregator test cases to test the new format.
1720
1721 2013-05-31  Ryosuke Niwa  <rniwa@webkit.org>
1722
1723         Unreviewed; Tweak the CSS so that chart panes align vertically.
1724
1725         * public/index.html:
1726
1727 2013-05-31  Ryosuke Niwa  <rniwa@webkit.org>
1728
1729         SafariPerfMonitor should support Combined metric.
1730
1731         * public/js/helper-classes.js:
1732         (PerfTestRuns): Added 'Combined' metric. In general, it could be used for smaller-is-better
1733         value as well but assume it to be greater-is-better for now.
1734
1735 2013-05-30  Ryosuke Niwa  <rniwa@webkit.org>
1736
1737         Commit the forgotten init-database change to add iteration_relative_time.
1738
1739         * database/init-database.sql:
1740
1741 2013-05-30  Ryosuke Niwa  <rniwa@webkit.org>
1742
1743         <rdar://problem/13993069> SafariPerfMonitor: Support accepting (relative time, value) pairs
1744
1745         Reviewed by Ricky Mondello.
1746
1747         Add the support for each value to have a relative time. This is necessary for frame rate history
1748         since a frame rate needs to be associated with a time it was sampled.
1749
1750         * database/init-database.sql: Added iteration_relative_time to run_iterations.
1751
1752         * public/api/report.php:
1753         (TestRunsGenerator::test_value_list_to_values_by_iterations): Reject any non-numeral values here.
1754         This code is used to aggregate values but it doesn't make sense to aggregate iteration values
1755         with relative time since taking the average of two frame rates for two subtests taken at two
1756         different times doesn't make any sense.
1757         (TestRunsGenerator::compute_caches): When we encounter an array value while computing sum, mean,
1758         etc..., use the second element since we assume values are of the form (relative time, frame rate).
1759         Also exit early with an error if the number of elements in the array is not a pair.
1760         (TestRunsGenerator::commit): Store the relative time and the frame rate as needed.
1761
1762         * tests/api-report.js: Added a test case. Also modified existing test cases to account for
1763         iteration_relative_time.
1764
1765 2013-05-27  Ryosuke Niwa  <rniwa@webkit.org>
1766
1767         <rdar://problem/13654488> SafariPerfMonitor: Support accepting single-value results
1768
1769         Reviewed by Ricky Mondello.
1770
1771         Support that. It's one line change.
1772
1773         * public/api/report.php:
1774         (ReportProcessor.recursively_ensure_tests): When there is exactly one value, wrap it inside an array
1775         to match the convention assumed elsewhere.
1776         * tests/api-report.js: Added a test case.
1777
1778 2013-05-26  Ryosuke Niwa  <rniwa@webkit.org>
1779
1780         SafariPerfMonitor shows popups for points outside of the visible region.
1781
1782         Rubber-stamped by Simon Fraser.
1783
1784         * public/index.html:
1785         (Chart.closestItemForPageXRespectingPlotOffset): renamed from closestItemForPageX.
1786         (Chart.attach): Always use closestItemForPageXRespectingPlotOffset to work around the fact flot
1787         may return an item underneath y-axis labels.
1788
1789 2013-05-26  Ryosuke Niwa  <rniwa@webkit.org>
1790
1791         Tweak the CSS a little to avoid the test name overlapping with the summary table.
1792
1793         * public/index.html:
1794
1795 2013-05-26  Ryosuke Niwa  <rniwa@webkit.org>
1796
1797         Unreviewed. Fix the typo. The anchor element should wrap the svg element, not the other way around.
1798
1799         * public/index.html:
1800
1801 2013-05-26  Ryosuke Niwa  <rniwa@webkit.org>
1802
1803         <rdar://problem/13992266> Should be a toggle to show entire Y-axis range
1804         <rdar://problem/13992271> Should scale Y axis to include error ranges
1805
1806         Reviewed by Ricky Mondello.
1807
1808         Add the feature. Also made adjust y-axis respect confidence interval delta so that the gray shade behind
1809         the main graph doesn't go outside the graph even when the y-axis is adjusted.
1810
1811         * database/config.json:
1812         * public/index.html:
1813         (Chart): Add a SVG arrow to toggle y-axis mode, and bind click on the arrow to toggleYAxis().
1814         (Chart.attachMainPlot): Respect shouldStartYAxisAtZero.
1815         (Chart.toggleYAxis): Toggle the y-axis mode of this chart by toggling shouldStartYAxisAtZero and calling
1816         attachMainPlot.
1817         * public/js/helper-classes.js:
1818         (PerfTestResult.confidenceIntervalDelta):
1819         (PerfTestResult.unscaledConfidenceIntervalDelta): Extracted.
1820         (PerfTestRuns.min): Take confidence interval delta into account.
1821         (PerfTestRuns.max): Ditto.
1822         (PerfTestRuns.hasConfidenceInterval): Not sure why this function was checking the typeof. Just use isNaN.
1823
1824 2013-04-26  Ryosuke Niwa  <rniwa@webkit.org>
1825
1826         A build fix of the previous. Don't look for a test with NULL parent because NULL != NULL in our beloved SQL.
1827
1828         * public/api/report.php:
1829         (ReportProcessor::recursively_ensure_tests):
1830         * tests/api-report.js: Added a test.
1831
1832 2013-04-26  Ryosuke Niwa  <rniwa@webkit.org>
1833
1834         Unreviewed build fixes.
1835
1836         * public/api/report.php:
1837         (ReportProcessor::process): Explicitly exit with error when builder name or build time is missing.
1838         Also, tolerate reports without any revision information.
1839
1840         (ReportProcessor::recursively_ensure_tests): When looking for a test, don't forget to compare its
1841         parent test.
1842
1843         * tests/api-report.js: Added few test cases.
1844
1845 2013-04-26  Ryosuke Niwa  <rniwa@webkit.org>
1846
1847         Commit another change that was supposed to be committed in r50331.
1848
1849         * run-tests.js:
1850         (TestEnvironment.this.postJSON):
1851         (TestEnvironment.this.httpGet):
1852         (sendHttpRequest):
1853
1854 2013-04-09  Ryosuke Niwa  <rniwa@webkit.org>
1855
1856         Commit the remaining files.
1857
1858         * public/admin/regenerate-manifest.php:
1859         * public/include/admin-header.php:
1860         * public/include/json-header.php:
1861         * public/include/manifest.php:
1862         * run-tests.js:
1863         (TestEnvironment.this.postJSON):
1864         (TestEnvironment.this.httpGet):
1865         (sendHttpRequest):
1866
1867 2013-03-15  Ryosuke Niwa  <rniwa@webkit.org>
1868
1869         SafariPerfMonitor: Add some tests for admin/regenerate-manifest.
1870
1871         Reviewed by Ricky Mondello.
1872
1873         Added some tests for admin/regenerate-manifest.
1874
1875         * public/admin/regenerate-manifest.php: Use require_once instead of require.
1876         * public/include/admin-header.php: Ditto.
1877         * public/include/json-header.php: Ditto.
1878
1879         * public/include/manifest.php:
1880         (ManifestGenerator::builders): Removed a reference to a non-existent variable.
1881         When there are no builders, simply return an empty array.
1882
1883         * run-tests.js:
1884         (TestEnvironment.postJSON):
1885         (TestEnvironment.httpGet): Added.
1886         (sendHttpRequest): Renamed from postHttpRequest as it now takes method as an argument.
1887
1888         * tests/admin-regenerate-manifest.js: Added with a bunch of test cases.
1889
1890 2013-03-14  Ryosuke Niwa  <rniwa@webkit.org>
1891
1892         Unreviewed. Added more tests for api/report to ensure it creates tests, metrics, test_runs,
1893         and run_iterations. Also fixed a typo in report.php found by new tests.
1894
1895         * public/api/report.php:
1896         (main): Fix a bug in the regular expression to wrap numbers with double quotations.
1897         * tests/api-report.js: Added more test cases.
1898
1899 2013-03-12  Ryosuke Niwa  <rniwa@webkit.org>
1900
1901         <rdar://problem/13399038> SafariPerfMonitor: Need integration tests
1902
1903         Reviewed by Ricky Mondello.
1904
1905         Add a test runner script and some simple test cases.
1906
1907         * database/config.json: Added the configuration for "testServer".
1908         * database/database-common.js:
1909         (pathToTests): Added.
1910         * run-tests.js: Added.
1911         (main):
1912
1913         (confirmUserWantsDatabaseToBeInitializedIfNeeded): Checks whether there are any non-empty tables,
1914         and if there are, asks the user if it’s okay to delete all of the data contained therein.
1915         (confirmUserWantsDatabaseToBeInitializedIfNeeded.findNonEmptyTable): Find a table with non-zero
1916         number of rows.
1917         (confirmUserWantsDatabaseToBeInitializedIfNeeded.fetchTableNames): Fetch the list of all tables
1918         in the current database using PostgreSQL's information_schema.
1919         (askYesOrNoQuestion):
1920
1921         (initializeDatabase): Executes init-database.sql. It drops all tables and creates them again.
1922
1923         (TestEnvironment): The global object exposed in tests. Provides various utility functions.
1924         (TestEnvironment.assert): Exposes assert to tests.
1925         (TestEnvironment.console): Exposes console to tests.
1926         (TestEnvironment.describe): Adds a description.
1927         (TestEnvironment.it): Adds a test case.
1928         (TestEnvironment.postJSON):
1929         (TestEnvironment.queryAndFetchAll):
1930         (TestEnvironment.sha256):
1931         (TestEnvironment.notifyDone): Ends the current test case.
1932
1933         (postHttpRequest):
1934
1935         (TestContext): An object created for each test case. Conceptually, this object is always on
1936         "stack" when a test case is running. TestEnvironment and an uncaughtException handler accesses
1937         this object via currentTestContext.
1938         (TestContext.description):
1939         (TestContext.done):
1940         (TestContext.logError):
1941
1942         * tests: Added.
1943         * tests/api-report.js: Added some basic tests for /api/report.php.
1944
1945 2013-03-08  Ryosuke Niwa  <rniwa@webkit.org>
1946
1947         Unreviewed administrative page fix. Make it possible to remove all configuration from dashboard.
1948
1949         The problem was that we were detecting whether we're updating dashboard or not by checking
1950         the existence of metric_configurations in $_POST but this key doesn't exist when we're removing
1951         all configurations. Use separate 'dashboard' action to execute the code even when
1952         metric_configurations is empty.
1953
1954         * public/admin/tests.php:
1955
1956 2013-03-08  Ryosuke Niwa  <rniwa@webkit.org>
1957
1958         SafariPerfMonitor: Extract a class to aggregate and store values from ReportProcessor.
1959
1960         Reviewed by Ricky Mondello.
1961
1962         This patch extracts TestRunsGenerator, which aggregates and compute caches of values,
1963         from ReportProcessor as a preparation to replace deprecated aggregate.js.
1964
1965         * public/api/report.php:
1966         (ReportProcessor::exit_with_error): Moved.
1967         (ReportProcessor::process): Use the extracted TestRunsGenerator.
1968         (TestRunsGenerator): Added.
1969         (TestRunsGenerator::exit_with_error): Copied from ReportProcessor.
1970         (TestRunsGenerator::add_aggregated_metric): Moved.
1971         (TestRunsGenerator::add_values_for_aggregation): Moved. Made public.
1972         (TestRunsGenerator::aggregate): Moved. Made public.
1973         (TestRunsGenerator::aggregate_current_test_level): Moved.
1974         (TestRunsGenerator::test_value_list_to_values_by_iterations): Moved.
1975         (TestRunsGenerator::evaluate_expressions_by_node): Moved.
1976         (TestRunsGenerator::compute_caches): Moved. Made public.
1977         (TestRunsGenerator::add_values_to_commit): Moved. Made public.
1978         (TestRunsGenerator::commit): Moved. Made public. Also takes build_id and platform_id.
1979         (TestRunsGenerator::rollback_with_error): Moved.
1980
1981 2013-03-08  Ryosuke Niwa  <rniwa@webkit.org>
1982
1983         SafariPerfMonitor: Administrative pages should update manifest JSON as needed.
1984
1985         Reviewed by Remy Demarest.
1986
1987         Regenerate the manifest file when updating fields or adding new items that are included in
1988         the manifest JSON.
1989
1990         * public/admin/bug-trackers.php:
1991         * public/admin/builders.php:
1992         * public/admin/regenerate-manifest.php:
1993         * public/admin/repositories.php:
1994         * public/admin/tests.php:
1995         * public/include/admin-header.php:
1996         (regenerate_manifest): Extracted from regenerate-manifest.php.
1997
1998 2013-03-08  Ryosuke Niwa  <rniwa@webkit.org>
1999
2000         Unreviewed build fix for memory test results.
2001
2002         Make aggregation work in the nested cases. We start from the "leaf" tests and move our ways up,
2003         aggregating at each level.
2004
2005         * public/api/report.php:
2006         (ReportProcessor::recursively_ensure_tests):
2007         (ReportProcessor::add_aggregated_metric): Renamed from ensure_aggregated_metric.
2008         (ReportProcessor::add_values_for_aggregation):
2009         (ReportProcessor::aggregate):
2010         (ReportProcessor::aggregate_current_test_level): Extracted from aggregate.
2011
2012 2013-03-02  Ryosuke Niwa  <rniwa@webkit.org>
2013
2014         Build fixes. iteration_count_cache should be the total number of values in all iteration group,
2015         not the number of iteration groups. Also, don't set group number when the entire run belongs
2016         a single iteration group.
2017
2018         * public/api/report.php:
2019         (ReportProcessor::commit):
2020
2021 2013-03-01  Ryosuke Niwa  <rniwa@webkit.org>
2022
2023         SafariPerfMonitor: Introduce iteration groups
2024
2025         Reviewed by Remy Demarest.
2026
2027         In WebKit land, we're going to use multiple instances of DumpRenderTree or WebKitTestRunner to amortize
2028         the runtime environment variances to get more stable results. And it's desirable to keep track of
2029         the instance of DumpRenderTree or WebKitTestRunner used to generate each iteration value.
2030
2031         This patch introduces "iteration groups" to keep track of this extra information.
2032
2033         Instead of receiving a flat array of iteration values, we can now receive a two dimensional array where
2034         the outer array denotes iteration groups and each inner array contains iteration values for each group.
2035
2036
2037         * database/init-database.sql: Add iteration_group column.
2038         * public/api/report.php:
2039         (ReportProcessor::recursively_ensure_tests): Always use the two dimensional array internally.
2040
2041         (ReportProcessor::aggregate): test_value_list_to_values_by_iterations now returns an associative array
2042         contains the list of values indexed by the iteration order and group sizes. Store the group size so
2043         that we can restore the iteration groups before passing it to node.js and restore them later.
2044
2045         (ReportProcessor::test_value_list_to_values_by_iterations): Flatten iteration groups into an array
2046         of values and construct group_size array to restore the groups later in ReportProcessor::aggregate.
2047
2048         Also check that each iteration group in each subtest are consistent with one another. To see why we need
2049         to do this, suppose we're aggregating two tests T1 and T2 with the following values. Then it's important
2050         that each iteration group in T1 and T2 have the same size:
2051         T1 = [[1, 2], [3, 4, 5]]
2052         T2 = [[6, 7], [8, 9, 10]]
2053
2054         so that the aggregated result (the sum in this case) can have the same groups as in:
2055         T  = [[7, 9], [11, 13, 15]]
2056
2057         If some iteration groups in T1 and T2 had a different size as in:
2058         T1 = [[1, 2, 3], [4, 5]]
2059         T2 = [[6, 7], [8, 9, 10]]
2060
2061         Then iteration groups of the aggregated T is ambiguous.
2062
2063         (ReportProcessor::compute_caches): Flatten iteration groups to compute caches (e.g. mean, stdev, etc...)
2064         (ReportProcessor::commit): Store iteration_group values.
2065
2066 2013-03-01  Ryosuke Niwa  <rniwa@webkit.org>
2067
2068         Unreviewed. Delete the migration tool for webkit-perf.appspot.com now that we have successfully
2069         migrated to perf.webkit.org.
2070
2071         * database/perf-webkit-migrator.js: Removed.
2072
2073 2013-03-01  Ryosuke Niwa  <rniwa@webkit.org>
2074
2075         Build fix. Don't forget to add metrics of the top level tests e.g. Dromaeo:Time:Arithmetic.
2076
2077         * public/index.html:
2078         (.showCharts):
2079
2080 2013-03-01  Ryosuke Niwa  <rniwa@webkit.org>
2081
2082         SafariPerfMonitor: Make it possible to add charts for all subtests or all platforms.
2083
2084         Reviewed by Ricky Mondello.
2085
2086         It is often desirable to see charts of a given test for all platforms, or to be able to see
2087         charts of all subtests on a given platform when trying to triage perf. regressions.
2088
2089         Support this use case by adding the ability to do so on the charts page.
2090
2091         Also, we used to disable items on the test list based on the platform chosen. This turned out
2092         to be a bad UI because in many situations you want to be able to compare results of the same test
2093         on multiple platforms.
2094
2095         In this new UI, we have three select elements, each of which selects the following:
2096         1. Top-level test - Test suite such as Dromaeo
2097         2. Metric - Pages and subtests under the suite such as www.webkit.org for dom-modify:Runs
2098            (where dom-modify is the name of the subtest and Runs is a metric in that subtest) for Dromaeo.
2099         3. Platform - Mountain Lion, Qt, etc...
2100
2101         A user can select "all" for metric and platform but we disallow doing both at once since adding
2102         all metrics on all platforms tends to add way too many charts and hang the browser. I also can't
2103         think of a use case where you want to look at that many charts at once. We can support this later
2104         if valid use cases come up.
2105
2106         * public/index.html:
2107         (.showCharts.addOption): Extracted.
2108         (.showCharts): Added "metricList" that shows the list of test and metrics (in the form of
2109         relative metrics paths such as "DOMWalk:Time") for each top-level test selected in testList.
2110         metricList has onchange handler that enables/disables items on platformList.
2111         
2112         (init): Sort tests and test metrics here instead of doing that in showCharts.
2113
2114 2013-02-28  Ryosuke Niwa  <rniwa@webkit.org>
2115
2116         <rdar://problem/13316756> SafariPerfMonitor: tooltip should include a link to build URLs
2117
2118         Reviewed by Remy Demarest and Ricky Mondello.
2119
2120         Added a hyperlink to build page in tooltips. Repeating the entire build URL in each build
2121         was a bad idea because it bloats the resultant JSON file too much. So move the build URL
2122         templates to the manifest file instead. Each build now only contains the builder id.
2123
2124         * public/api/runs.php: Removed the part of the query that joined builders table. This
2125         speeds up the query quite a bit.
2126
2127         * public/include/manifest.php:
2128         (ManifestGenerator::generate): Generate builders field.
2129         (ManifestGenerator::builders): Added. Returns an associative array of builder ids to an
2130         associative array that contains name and its build URL template.
2131
2132         * public/index.html:
2133         (.buildLabelWithLinks.linkifyIfNotNull): Renamed from linkifiedLabel. Take a label and url
2134         instead of a revision since this function is used for revisions and build page URLs now.
2135         (.buildLabelWithLinks): Include the linkified build number.
2136
2137         * public/js/helper-classes.js:
2138         (TestBuild.builder): Added.
2139         (TestBuild.buildNumber): Added.
2140         (TestBuild.buildUrl): Returns the build URL. The variable name in the URL template has been
2141         changed from %s to $buildNumber to be more descriptive and consistent with other URL templates.
2142
2143 2013-02-27  Ryosuke Niwa  <rniwa@webkit.org>
2144
2145         Tooltips interfere with user interactions
2146
2147         Rubber-stamped by Simon Fraser.
2148
2149         Disable tooltip on the dashboard page since graphs are too small to be useful there.
2150         Also, show graphs for only 10 days by default as opposed to 20.
2151         Finally, dismiss the hovering tooltip when mouse enters a "pinned" tooltip.
2152
2153         * public/index.html:
2154         * public/js/helper-classes.js:
2155
2156 2013-02-24  Ryosuke Niwa  <rniwa@webkit.org>
2157
2158         Fix some serious typo. We're supposed to be using SHA-256, not SHA-1 to hash our passwords,
2159         to be compatible with webkit-perf.appspot.com.
2160
2161         * public/admin/builders.php:
2162         * public/api/report.php:
2163
2164 2013-02-23  Ryosuke Niwa  <rniwa@webkit.org>
2165
2166         Unreviewed.
2167
2168         Add a missing constraint on builds table. For a given builder, there should be exactly
2169         one build for a given build number.
2170
2171         Also add report_committed_at to reports table to record the time at which a given report
2172         was processed and test_runs and run_iterations rows were committed into the database.
2173
2174         * database/config.json:
2175         * public/api/report.php:
2176
2177 2013-02-22  Ryosuke Niwa  <rniwa@webkit.org>
2178
2179         Unreviewed. Add more checks for empty SQL query results.
2180
2181         * public/include/manifest.php:
2182
2183 2013-02-21  Ryosuke Niwa  <rniwa@webkit.org>
2184
2185         More build fixes on perf.webkit.org.
2186
2187         * public/api/runs.php: Make PostgreSQL happier.
2188         * public/include/manifest.php: Don't assume we always have bug trackers.
2189
2190 2013-02-21  Ryosuke Niwa  <rniwa@webkit.org>
2191
2192         SafariPerfMonitor: index.html duplicates the code in PerfTestRuns to determine smallerIsBetter
2193         and fix other miscellaneous UI bugs.
2194
2195         Rubber-stamped by Simon Fraser.
2196
2197         Removed the code to determine whether smaller value is better or not for a given test in index.html
2198         in the favor of using that of PerfTestRuns.
2199
2200         * public/include/manifest.php: Fixed a typo.
2201         * public/index.html:
2202         (Chart):
2203         (Chart.attachMainPlot): Fixed a bug to access previousPoint.left even when previousPoint is null.
2204
2205         * public/js/helper-classes.js:
2206         (PerfTestRuns): Added EndAllocations, MaxAllocations, and MeanAllocations.
2207
2208         (PerfTestRuns.computeScalingFactorIfNeeded): When the mean is almost 10,000 units, we may end up
2209         using 5 digits instead of 4, resulting in the use of scientific notations. Go up to the next unit
2210         at roughly 2,000 units to avoid this.
2211
2212         (Tooltip.show): Show the tooltip even when the new content is identical to the previous content.
2213         The only thing we can avoid is innerHTML.
2214
2215 2013-02-21  Ryosuke Niwa  <rniwa@webkit.org>
2216
2217         Another build fix. The path to node is /usr/local/bin/node, not /usr/bin/local/node
2218
2219         * public/include/evaluator.js:
2220
2221 2013-02-21  Ryosuke Niwa  <rniwa@webkit.org>
2222
2223         <rdar://problem/13267898> SafariPerfMonitor: Bug trackers should be configurable
2224
2225         Reviewed by Remy Demarest.
2226
2227         Made the list of bug trackers configurable. Namely, each bug tracker can be added in
2228         admin/bug-trackers.php and can be associated with multiple repositories.
2229
2230         The association between bug trackers and repositories (such as WebKit, Safari, etc...) are used
2231         to determine the set of bug trackers to show for a given set of blame lists.
2232         e.g. if a test regressed due to a change in Safari, then we don't want to show WebKit Bugzilla as
2233         a place to file bugs against the regression.
2234 F
2235         * database/init-database.sql: Added bug_trackers and tracker_repositories.
2236         Also drop those tables before creating them (note "DROP TABLE reports" was missing).
2237
2238         * public/admin/bug-trackers.php: Added. The administrative interface for adding and managing
2239         bug trackers, namely associated repositories.
2240
2241         * public/include/admin-header.php: Added a link to bug-trackers.php
2242         * public/include/manifest.php:
2243         (ManifestGenerator::generate): Include the list of bug trackers in the manifest.
2244         Also moved the code to fetch repositories table here from ManifestGenerator::repositories.
2245
2246         (ManifestGenerator::repositories):
2247
2248         (ManifestGenerator::bug_trackers): Added. Generates an associative array of bug trackers where
2249         keys are names of bug trackers and values are associative arrays with keys 'new_bug_url' and
2250         'repositories' where the latter contains the list of associated repository names.
2251
2252         * public/index.html:
2253         (Chart): Takes bugTrackers as as argument.
2254         (Chart.showTooltipWithResults): Removed the hard-coded list.
2255         (init):
2256         (init.addPlatformsToDashboard):
2257         (init.showCharts.createChartFromListPair):
2258         (init): Stores the list of bug trackers in the manifest to a local variable.
2259
2260 2013-02-21  Ryosuke Niwa  <rniwa@webkit.org>
2261
2262         A follow up on the previous build fix. When using proc_open, we need to make evalulator.js executable.
2263
2264         * public/include/evaluator.js:
2265
2266 2013-02-21  Ryosuke Niwa  <rniwa@webkit.org>
2267
2268         SafariPerfMonitor: Extract the code to generate tabular view in administrative pages
2269
2270         Reviewed by Remy Demarest.
2271
2272         Extracted AdministrativePage to share the code to generate a tabular view of data and a form to insert
2273         new row into the database.
2274
2275         * public/admin/aggregators.php: Use AdministrativePage.
2276         * public/admin/builders.php: Ditto.
2277         * public/admin/repositories.php: Ditto.
2278         * public/include/admin-header.php:
2279         (AdministrativePage): Added.
2280         (AdministrativePage::__construct): column_info is an associative array that maps a SQL column name
2281         to an associative array that describes the column.
2282             - editing_mode: Specifies the type of form ('text', 'url', or 'string') to show for this column.
2283             - label: Human readable name of the column.
2284             - pre_insertion: Signifies that this column exists only before the row is inserted. e.g. password
2285               column exists only before we create password_hash column at the insertion time.
2286
2287         (AdministrativePage::name_to_titlecase): Converts an underscored lowercase name to a human readable
2288         titlecase (e.g. new_bug is converted to New Bug).
2289         (AdministrativePage::column_label): Obtains the label specified in column_info or titlecased column name.
2290         (AdministrativePage::render_form_control_for_column): "Renders" a text form control such as input and
2291         textarea for a given editing mode ('text', 'url', or 'string').
2292         (AdministrativePage::render_table): Renders a whole SQL table after sorting rows by the specified column.
2293         (AdministrativePage::render_form_to_add): Renders a form to insert new row.
2294
2295 2013-02-20  Ryosuke Niwa  <rniwa@webkit.org>
2296
2297         Build fix. Some systems don't support r+. Use proc_open instead.
2298
2299         * public/api/report.php:
2300
2301 2013-02-15  Ryosuke Niwa  <rniwa@webkit.org>
2302
2303         Build fix. Use the mean data series as supposed to upper or lower confidence bounds
2304         when computing the y-axis of data points to show tooltips at.
2305
2306         * public/index.html:
2307
2308 2013-02-15  Ryosuke Niwa  <rniwa@webkit.org>
2309
2310         Unreviewed. Removed .htaccess in favor of directly putting directives in httpd.conf.
2311
2312         * Install.md:
2313         * public/.htaccess: Removed.
2314
2315 2013-02-14  Ryosuke Niwa  <rniwa@webkit.org>
2316
2317         Unreviewed.
2318
2319         * public/include/manifest.php: Build fix. db is on this.
2320         * public/js/statistics.js:
2321         (Statistics.confidenceInterval): Added. An utility function for debugging purposes.
2322
2323 2013-02-13  Ryosuke Niwa  <rniwa@webkit.org>
2324
2325         <rdar://problem/13165667> SafariPerfMonitor doesn't work on perf.webkit.org (Part 2)
2326
2327         Reviewed by Anders Carlsson.
2328
2329         Rewrote and merged populate-from-report.js into report.php.
2330
2331         * database/config.json: Added a path to node.js.
2332
2333         * database/init-database.sql: Don't require unit to be always present since it's no longer used by the front end.
2334         Once we land this patch and update the administrative pages, we can remove this column.
2335
2336         Also add a new reports table to store JSON reported by builders. We used to store everything in jobs table but
2337         that table is going away once we remove the node.js backend.
2338
2339         * database/populate-from-report.js: Removed.
2340         * public/api/report.php: Added.
2341         (ReportProcessor):
2342         (ReportProcessor.__construct):
2343         (ReportProcessor.process):
2344
2345         (ReportProcessor.store_report_and_get_build_data): We store the report into the database as soon as it has been
2346         verified to be submitted by a known builder.
2347
2348         (ReportProcessor.exit_with_error): Store the error message and details in the database if the report had been
2349         stored. If not, then notify that to the client via 'failureStored' in the JSON response.
2350         (ReportProcessor.resolve_build_id): Insert build and build_revisions rows if needed. We don't do this atomically
2351         inside a transaction because there could be multiple reports for a single build, each containing results for
2352         different tests.
2353
2354         (ReportProcessor.recursively_ensure_tests): Parse a tree of tests and insert tests and test_metrics rows as
2355         needed. It also computes the metrics to aggregate and prepares values to commit via ensure_aggregated_metric,
2356         add_values_to_commit, and add_values_for_aggregation.
2357
2358         (ReportProcessor.is_list_of_aggregators): When a metric is an aggregation, it contains an array of aggregator
2359         names, e.g. ["Arithmetic", "Geometric"], instead of a dictionary of configuration types to their values,
2360         e.g. {Time: {current: [1, 2, 3,]}}. This function detects the former. (Note that dictionary and list are both
2361         array's in PHP).
2362
2363         (ReportProcessor.ensure_aggregated_metric): Create a metric with aggregator to add it to the list of metrics
2364         to be aggregated in ReportProcessor.aggregate.
2365
2366         (ReportProcessor.add_values_for_aggregation): Called by test metrics with aggregated parent test metrics.
2367
2368         (ReportProcessor.aggregate): Compute results for aggregated metrics. Consider a matrix with rows representing
2369         child tests and columns representing "iterations" for a given aggregated metrics M. Initially, we have values
2370         given for each row (child metrics of M). This function extracts each column (iteration) via
2371         test_value_list_to_values_by_iterations, and feeds it into evaluate_expressions_by_node to get aggregated values
2372         for each column (iteration of M). Finally, it registers those aggregated values to be committed.
2373
2374         Note that we don't want to start a new node.js process for each aggregation, so we accumulate all values to be
2375         aggregated in node.js in $expressions. Each entry in $expressions is a JSON string that contains code and
2376         values to be aggregated. node.js gives us back a list of JSON strings that contain aggregated values.
2377
2378         (ReportProcessor.test_value_list_to_values_by_iterations): See above.
2379         (ReportProcessor.evaluate_expressions_by_node): See above.
2380
2381         (ReportProcessor.compute_caches): Compute cached mean, sum, and square sums for each run we're about to add
2382         using evaluate_expressions_by_node. We can't do this before computing aggregated results since those aggregated
2383         results also need the said caches.
2384
2385         (ReportProcessor.add_values_to_commit):
2386
2387         (ReportProcessor.commit): Add test_runs and run_iterations atomically inside a transaction, rolling back
2388         the transaction as needed if anything goes wrong.
2389
2390         (ReportProcessor.rollback_with_error)
2391         (main):
2392         * public/include/db.php:
2393         (Database.prepare_params): Use $values (instead of $placeholders) to compute the current index since
2394         placeholders ($1, $2, etc...) may be split up into multiple arrays given they may not necessarily show up
2395         contiguously in a SQL statement.
2396
2397         (Database.select_or_insert_row): Added. Selects a row if the attempt to insert the same row fails. It
2398         automatically creates a query string from a dictionary of unprefixed column names and table. It returns
2399         a column value of the choice.
2400
2401         (Database.begin_transaction): Added.
2402         (Database.commit_transaction): Added.
2403         (Database.rollback_transaction): Added.
2404
2405         * public/include/evaluator.js: Added.
2406         * public/include/json-header.php:
2407         (exit_with_error): Take error details and merge it with "additional details". This allows report.php to provide
2408         context under which the request failed.
2409         (successful_exit): Merge "additional details".
2410         (set_exit_detail): Added. Sets "additional details" to the JSON returned by exit_with_error or successful_exit.
2411         (merge_additional_details):
2412
2413 2013-02-12  Ryosuke Niwa  <rniwa@webkit.org>
2414
2415         SafariPerfMonitor: Add more helper functions to db.php
2416
2417         Reviewed by Remy Demarest.
2418
2419         Added Database::insert_row and array_get to make common database operations easier.
2420
2421         * public/admin/aggregators.php: Use Database::insert_row instead of
2422         execute_query_and_expect_one_row_to_be_affected.
2423
2424         * public/admin/builders.php: Ditto.
2425
2426         * public/admin/tests.php: Ditto; We used to run a separate SELECT query just to get the id after
2427         inserting a row. With insert_row, we don't need that.
2428
2429         * public/include/admin-header.php: Ditto.
2430
2431         * public/include/db.php:
2432         (array_get): Added. It returns the value of an array given a key if the key exists; otherwise
2433         return the default value (defaults to NULL) if the key doesn't exist.
2434
2435         (Database::column_names): Added. Prefixes an array of column names and creates a comma separated
2436         list of the names.
2437
2438         (Database::prepare_params): Added. Takes an associative array of column names and their values,
2439         and builds up arrays for placeholder (e.g. $1, $2, etc...) and values, then returns an array of
2440         column names all in the same order.
2441
2442         (Database::insert_row): Added. Inserts a new row into the specified table where column names have
2443         the given prefix. Values are given in a form of an associative array where keys are unprefixed
2444         column names and values are corresponding values. When the row is successfully inserted, it returns
2445         the specified column's value (defaults to prefix_id). If NULL is specified, it returns a boolean
2446         indicating the success of the insertion.
2447
2448 2013-02-11  Ryosuke Niwa  <rniwa@webkit.org>
2449
2450         <rdar://problem/13165667> SafariPerfMonitor doesn't work on perf.webkit.org (Part 1)
2451
2452         Reviewed by Conrad Shultz.
2453
2454         Rewrote the manifest generator in PHP.
2455
2456         * database/generate-manifest.js: Removed.
2457         * public/admin/regenerate-manifest.php: Added. Use ManifestGenerator to generate and store the manifest.
2458         * public/include/db.php:
2459         (array_ensure_item_has_array): Added.
2460         * public/include/evaluator.js: Added.
2461         * public/include/json-header.php:
2462         * public/include/manifest.php: Added.
2463
2464 2013-02-11  Ryosuke Niwa  <rniwa@webkit.org>
2465
2466         Dates on overflow plot are overlapping
2467
2468         Rubber-stamped by Simon Fraser.
2469
2470         Don't show more than 5 days.
2471
2472         * public/index.html:
2473         * public/js/helper-classes.js:
2474         (TestBuild.UTCtoPST):
2475         (TestBuild.now):
2476
2477 2013-02-07  Ryosuke Niwa  <rniwa@webkit.org>
2478
2479         Show build time as well as commit time on the dashboard and tooltips.
2480
2481         Rubber-stamped by Simon Fraser.
2482
2483         Include both the maximum commit time and build time in buildLabelWithLinks.
2484         Also use ISO format to save the screen real estate.
2485
2486         * public/index.html:
2487         (buildLabelWithLinks):
2488         * public/js/helper-classes.js:
2489         (TestBuild):
2490         (TestBuild.buildTime):
2491         (TestBuild.formattedBuildTime):
2492
2493 2013-02-08  Ryosuke Niwa  <rniwa@webkit.org>
2494
2495         Unreviewed; Convert metric.name to metric.unit in the front end.
2496
2497         * public/js/helper-classes.js:
2498
2499 2013-02-07  Ryosuke Niwa  <rniwa@webkit.org>
2500
2501         <rdar://problem/13166276> SafariPerfMonitor: Need hyperlinks to file bugs
2502
2503         Rubber-stamped by Simon Fraser.
2504
2505         This patch adds hyperlinks to file new bugs on Radar and WebKit Bugzilla. Because we want to include information
2506         such as the degree of progression or regression and the regression ranges when filing new bugs, broke various
2507         label() functions into smaller pieces to be used in both generating tooltips and the hyperlinks.
2508
2509         * public/index.html:
2510         (.buildLabelWithLinks): Extracted from TestBuild.label.
2511         (.showTooltipWithResults): Extracted from Tooltip.show. Also added the code to generate hyperlinks to file new bugs
2512         on Radar and WebKit Bugzilla.
2513         * public/js/helper-classes.js:
2514         (PerfTestResult.metric): Replaced test() as runs.test() no longer exists.
2515         (PerfTestResult.isBetterThan): Added.
2516         (PerfTestResult.formattedRelativeDifference): Extracted from PerfTestResult.label.
2517         (PerfTestResult.formattedProgressionOrRegression): Ditto. Also use "better" and "worse" instead of arrow symbols
2518         to indicate progressions or regressions.
2519         (PerfTestResult.label):
2520         (TestBuild.formattedTime): Added.
2521         (TestBuild.platform): Added.
2522         (TestBuild.formattedRevisions): Extracted from TestBuild.label. Merged a part of linkifyLabel.
2523         (TestBuild.smallerIsBetter): Added.
2524         (Tooltip.show): Take a raw markup instead of two results.
2525
2526 2013-02-06  Ryosuke Niwa  <rniwa@webkit.org>
2527
2528         <rdar://problem/13151520> SafariPerfMonitor: Dashboard can cause excessive horizontal scrolling when there are many platforms
2529
2530         Rubber-stamped by Tim Horton.
2531
2532         Stack platforms when there are more than 3 of them since making the layout adaptive is tricky
2533         since each platform may have a different number of tests to be shown on the dashboard.
2534
2535         * public/index.html:
2536
2537 2013-02-05  Ryosuke Niwa  <rniwa@webkit.org>
2538
2539         Build fix. Don't prefix a SVn revision with 'r' when constructing a changeset / blame URL.
2540
2541         * public/js/helper-classes.js:
2542         (TestBuild.label):
2543
2544 2013-02-05  Ryosuke Niwa  <rniwa@webkit.org>
2545
2546         SafariPerfMonitor: repository names or revisions are double-quoted when they contain a space
2547
2548         Rubber-stamped by Tim Horton.
2549
2550         The bug was in the PHP code that parsed Postgres array. Trim double quotations as needed.
2551
2552         Also fixed a bug in TestBuild where we used to show the revision range as r1234-1250 when
2553         the revision r1234 was the revision used in the previous build.
2554
2555         * public/api/runs.php:
2556         (parse_revisions_array): Trim double quotations around repository names and revisions.
2557         * public/js/helper-classes.js:
2558         (TestBuild.label):
2559
2560 2013-02-05  Ryosuke Niwa  <rniwa@webkit.org>
2561
2562         <rdar://problem/13151558> SafariPerfMonitor: Tooltip is unusable
2563
2564         Rubber-stamped by Tim Horton.
2565
2566         * public/index.html:
2567         (Chart.attachMainPlot): Disable auto highlighting (circle around a data point that shows up on hover)
2568         on the dashboard page as it's way too noisy.
2569
2570         (Chart.hideTooltip): Added. Hides the tooltip that shows up on hover.
2571
2572         (.toggleClickTooltip): Extracted from the code for "mouseout" bind (now replaced by "mouseleave").
2573         Pins or unpins a tooltip. When pinning a tooltip, we create a tooltip behind the scene and show that
2574         so that the tooltip for hover can be reused further.
2575
2576         (.closestItemForPageX): Find the closest item given pageX. We iterate data points from left to right,
2577         and find the first point that lies on the right of the cursor position. We then compute the midpoint
2578         between this and the previous point and pick the closer of the two. It returns an item-like object
2579         that has all properties we need since flot doesn't provide an API to retrieve the real item object.
2580
2581         (Chart): Call toggleClickTooltip when a (hover) tooltip is clicked.
2582
2583         (Chart.attach): In "plothover" bind, call closestItemForPageX when item is not provided by flot on
2584         the first or "current" data points (as opposed to target or baseline data points).
2585
2586         Also bind the code to clear crosshair and hide tooltips to "mouseleave" instead of "mouseout", and
2587         avoid triggering this code when the cursor is still within the plot's rectangle (e.g. when a cursor
2588         moves onto a tooltip) to avoid the premature dismissal of a tooltip.
2589
2590         * public/js/helper-classes.js:
2591         (Tooltip.ensureContainer): Don't automatically close then the user clicks on tooltip. Delegate this
2592         work to the client via bindClick.
2593
2594         (Tooltip.show): Move tooltip up by 5px. Also added a FIXME to move this offset computation to the client.
2595
2596         (Tooltip.bindClick): Added.
2597
2598 2013-02-03  Ryosuke Niwa  <rniwa@webkit.org>
2599
2600         Yet another build fix. metricId*s*.
2601
2602         * public/admin/tests.php:
2603
2604 2013-02-03  Ryosuke Niwa  <rniwa@webkit.org>
2605
2606         Another build fix. Use the new payload format for the aggregate job.
2607
2608         * public/admin/tests.php:
2609
2610 2013-02-03  Ryosuke Niwa  <rniwa@webkit.org>
2611
2612         Build fixes.
2613
2614         * database/aggregate.js: Use variables that actually exist.
2615         * database/database-common.js:
2616         (ensureConfigurationIdFromList): Add the newly added configuration to the list so that subsequent
2617         function calls will find this configuration.
2618
2619 2013-01-31  Ryosuke Niwa  <rniwa@webkit.org>
2620
2621         <rdar://problem/13130139> SafariPerfMonitor: Add ReadMe
2622
2623         Reviewed by Ricky Mondello.
2624
2625         Turned InstallManual into a proper markdown document and added ReadMe.md.
2626
2627         * InstallManual: Removed.
2628         * InstallManual.md: Moved from InstallManual.
2629         * ReadMe.md: Added.
2630
2631 2013-01-31  Ryosuke Niwa  <rniwa@webkit.org>
2632
2633         <rdar://problem/13109335> SafariPerfMonitor: Add baseline and target lines
2634
2635         Reviewed by Ricky Mondello.
2636
2637         This patch prepares the front end code to process baseline and target results properly.
2638
2639         * public/index.html:
2640         (fetchTest.createRunAndResults): Extracted.
2641         (fetchTest): Call createRunAndResults on current, baseline, and target values of the JSON.
2642         Deleted the comment about how sorting will be unnecessary once we start results in the server side
2643         since sorting by the maximum revision commit time turned out to be non-trivial in php.
2644
2645 2013-01-29  Ryosuke Niwa  <rniwa@webkit.org>
2646
2647         <rdar://problem/13057071> SafariPerfMonitor: Use newer version of flot that supports timezone properly
2648
2649         Reviewed by Tim Horton.
2650
2651         Use flot at https://github.com/flot/flot/commit/ec168da2cb8619ebf59c7e721d12c44a7960ff41.
2652         These files are "dynamically linked" to our app.
2653
2654         * public/index.html:
2655         * public/js/jquery-1.8.2.min.js: Removed.
2656         * public/js/jquery.colorhelpers.js: Added.
2657         * public/js/jquery.flot.categories.js: Added.
2658         * public/js/jquery.flot.crosshair.js: Added.
2659         * public/js/jquery.flot.errorbars.js: Added.
2660         * public/js/jquery.flot.fillbetween.js: Added.
2661         * public/js/jquery.flot.js: Added.
2662         * public/js/jquery.flot.min.js: Removed.
2663         * public/js/jquery.flot.navigate.js: Added.
2664         * public/js/jquery.flot.resize.js: Added.
2665         * public/js/jquery.flot.selection.js: Added.
2666         * public/js/jquery.flot.stack.js: Added.
2667         * public/js/jquery.flot.symbol.js: Added.
2668         * public/js/jquery.flot.threshold.js: Added.
2669         * public/js/jquery.flot.time.js: Added.
2670         * public/js/jquery.js: Added.
2671
2672 2013-01-29  Ryosuke Niwa  <rniwa@webkit.org>
2673
2674         Return NaN instead of throwing when there aren't enough samples.
2675
2676         Reviewed by Sam Weinig.
2677
2678         It's better to return NaN when we don't have enough samples so that we can treat it
2679         as if we don't have any confidence interval.
2680
2681         * public/js/statistics.js:
2682         (Statistics.new):
2683
2684 2013-01-28  Ryosuke Niwa  <rniwa@webkit.org>
2685
2686         Build fix. Apparently Safari sometimes appends / at the end of hash location. Remove that.
2687
2688         * public/js/helper-classes.js:
2689         (URLState.parseIfNeeded):
2690
2691 2013-01-28  Ryosuke Niwa  <rniwa@webkit.org>
2692
2693         <rdar://problem/13081582> SafariPerfMonitor: Always use parameterized SQL functions in php code
2694
2695         Reviewed by Ricky Mondello.
2696
2697         Parameterized execute_query_and_expect_one_row_to_be_affected and updated the code accordingly.
2698
2699         * public/admin/aggregators.php: Use heredoc.
2700         * public/admin/builders.php:
2701         * public/admin/jobs.php:
2702         * public/admin/repositories.php:
2703         * public/admin/tests.php: Updated the forms to use unprefixed field names to match other pages.
2704         This allows us to use update_field when updating test's url and metric's unit. Changed the action
2705         to regenerate aggregated matrix from "update" to "add" to simplify the dependencies in if-else.
2706         Also removed a stray code to update unit and url simultaneously since it's never used.
2707         * public/include/admin-header.php:
2708         (execute_query_and_expect_one_row_to_be_affected): Added $params. Also automatically convert
2709         empty strings to NULL as it was previously done via $db->quote_string_or_null_if_empty in callers.
2710         (update_field): Moved from repositories.php.
2711         (add_job):
2712         * public/include/db.php:
2713         (quote_string_or_null_if_empty): Removed now that nobody uses this function.
2714
2715 2013-01-25  Ryosuke Niwa  <rniwa@webkit.org>
2716
2717         Build fixes. Treat mean, sum, and square sum as float, not int.
2718
2719         Also use 95% confidence interval instead of 90% confidence interval.
2720
2721         * public/api/runs.php:
2722         * public/js/helper-classes.js:
2723         (.this.confidenceIntervalDelta):
2724
2725 2013-01-24  Ryosuke Niwa  <rniwa@webkit.org>
2726
2727         Add an administrative page to edit repository information.
2728
2729         Reviewed by Ricky Mondello.
2730
2731         * public/admin/repositories.php: Added.
2732         * public/include/admin-header.php:
2733
2734 2013-01-23  Ryosuke Niwa  <rniwa@webkit.org>
2735
2736         <rdar://problem/13067539> SafariPerfMonitor: Automatically create aggregated metrics from builder reports
2737
2738         Reviewed by Ricky Mondello.
2739
2740         Auto-create aggregated matrix such as arithmetic means and geometric means as requested and add a job
2741         to aggregate results for those matrix in populate-from-report.js.
2742
2743         * database/generate-manifest.js:
2744         (.): Include aggregator names such as Arithmetic and Geometric in the list of metrics.
2745         * database/init-database.sql: Remove an erroneous unique constraint. There could be multiple matrix that share
2746         the same test and name (e.g. Dromaeo, Time) with different aggregators (e.g. Arithmetic and Geometric).
2747         * database/populate-from-report.js:
2748         (main):
2749         (getReport): No change even though the diff looks as if it moved.
2750         (processReport): Extracted from main. Fetch the list of aggregators, pass that to recursivelyEnsureTestsIdsAndMetricsIds
2751         to obtain the list of aggregated metrics (such as arithmetic means) that need to be passed to aggregate.js
2752         (scheduleJobs): Extracted from processReport. Add a job to aggregate results.
2753         (recursivelyEnsureTestsIdsAndMetricsIds): When a metric is a list of names, assume them as aggregator names,
2754         and add corresponding metrics for them. Note we convert those names to ids using the dictionary we obtained
2755         in processReport.
2756         (ensureMetricId): Take an aggregator id as an argument.
2757         * database/process-jobs.js: Support multiple metric ids and build id. Note that aggregate.js aggregates results
2758         for all builds when the build id is not specified.
2759         * public/admin/tests.php:
2760         * public/index.html: Include the aggregator name in the full name since there could be multiple metrics
2761         of the same name with different aggregators.
2762
2763 2013-01-22  Ryosuke Niwa  <rniwa@webkit.org>
2764
2765         Build fix. Don't pass in arguments to in the wrong order.
2766
2767         * database/aggregate.js:
2768
2769 2013-01-21  Ryosuke Niwa  <rniwa@webkit.org>
2770
2771         <rdar://problem/13057110> SafariPerfMonitor: x-axis is messed up
2772
2773         Reviewed by Ricky Mondello.
2774
2775         Since the version of flot we use doesn't support showing graphs in the current locate or
2776         in a specific timezone, convert all timestamps to PST manually (Date's constructor will still
2777         treat them as in UTC). We don't want to use the current locate because other websites on
2778         webkit.org assume PST.
2779
2780         Also append this information to build's label.
2781
2782         * public/js/helper-classes.js:
2783         (TestBuild):
2784         (TestBuild.label):
2785
2786 2013-01-21  Ryosuke Niwa  <rniwa@webkit.org>
2787
2788         Store test URLs reported by builders.
2789
2790         Reviewed by Ricky Mondello.
2791
2792         * database/populate-from-report.js:
2793         (recursivelyEnsureTestsIdsAndMetricsIds): Pass in the test url.
2794         (ensureTestId): Store the URL.
2795
2796 2013-01-20  Ryosuke Niwa  <rniwa@webkit.org>
2797
2798         Yet another build fix; don't blow up even if we didn't have any test configurations.
2799
2800         * public/admin/tests.php:
2801
2802 2013-01-21  Ryosuke Niwa  <rniwa@webkit.org>
2803
2804         Build fix; don't instantiate Date when a timestamp wasn't provided.
2805
2806         * database/populate-from-report.js:
2807
2808 2013-01-18  Ryosuke Niwa  <rniwa@webkit.org>
2809
2810         Rename SafariPerfDashboard to SafariPerfMonitor and add a install manual.
2811
2812         Reviewed by Tim Horton.
2813
2814         Added an install manual.
2815
2816         * InstallManual: Added.
2817
2818 2012-12-21  Ryosuke Niwa  <rniwa@webkit.org>
2819
2820         Minor build fix. Don't unset builderPassword when it's not set.
2821
2822         * public/api/report.php:
2823
2824 2012-12-18  Ryosuke Niwa  <rniwa@webkit.org>
2825
2826         Prettify JSON payloads and make very large payloads not explode the table in jobs.php.
2827
2828         Reviewed by Ricky Mondello.
2829
2830         * public/admin/admin.css: Make a very large payload scrollable.
2831         * public/admin/jobs.php: Format JSONs.
2832
2833 2012-12-19  Ryosuke Niwa  <rniwa@webkit.org>
2834
2835         <rdar://problem/12897424> SafariPerfMonitor: Add ability to report results from bots
2836
2837         Reviewed by Ricky Mondello.
2838
2839         Add report.php and populate-from-report.js that process JSON files submitted by builders.
2840
2841         * database/populate-from-report.js: Added.
2842         (main):
2843         (getReport): Obtains the payload (the actual report) from "jobs" table.
2844         (recursivelyEnsureTestsIdsAndMetricsIds): "reports.tests" contain a tree of tests, test metrics,
2845         and their results. This function recursively traverses tests and metrics and ensure their ids.
2846         (ensureTestId):
2847         (metricToUnit): Maps a metric name to a unit. This should really be done in the client side since
2848         there is no point in storing unit given that every metric maps to exactly one unit (i.e. the mapping
2849         is a "function" in mathematical sense).
2850         (ensureMetricId):
2851         (ensureRepositoryIdsForAllRevisions):
2852         (getIdOrCreateBuildWithRevisions):
2853         (ensureBuildIdAndRevisions): Obtains a build id given a builder name, a build number, and a build time
2854         if one already exists. If not, then inserts a new build and corresponding revisions information (e.g.
2855         build 123 may contain WebKit revision r456789). We don't retrieve rows for revisions since we don't use
2856         it elsewhere.
2857         (insertRun): Insert new rows into "test_runs" and "run_iterations" tables, thereby recording the new
2858         test results all in a single transaction. This allows us to keep the database consistent in that either
2859         a build has been reported or not at least in "test_runs" and "run_iterations" tables. It'll be ideal if
2860         we could do the same for "builds" and "build_revisions" but that's not a hard requirement as far as
2861         other parts of the application are concerned.
2862         (scheduleQueriesToInsertRun):
2863         * database/process-jobs.js: Add a call to populate-from-report.js.
2864         * public/api/report.php: Added. Adds a new job named "report" to be processed by populate-from-report.js.
2865         * public/include/db.php: Support parameterized query.
2866         * public/include/json-header.php: Always include 'status' in the response so that builder submitting
2867         a test result could confirm that the submission indeed succeeded.
2868
2869 2012-12-18  Ryosuke Niwa  <rniwa@webkit.org>
2870
2871         Rename get(Id)OrCreate*(Id) to ensure*Id as suggested by Ricky on one of his code reviews.
2872
2873         * database/aggregate.js:
2874         * database/database-common.js:
2875         (selectColumnCreatingRowIfNeeded):
2876         (ensureRepositoryId):
2877         (ensureConfigurationIdFromList):
2878         * database/perf-webkit-migrator.js:
2879         (.migrateStat.):
2880         (.migrateStat):
2881         (getOrCreateBuildId):
2882
2883 2012-12-17  Ryosuke Niwa  <rniwa@webkit.org>
2884
2885         Extract commonly-used functions from aggregate.js and perf-webkit-migrator.js.
2886
2887         Reviewed by Ricky Mondello.
2888
2889         As a preparation to add report.js that processes a JSON file submitted by bots, extract various functions
2890         and classes from aggregate.js and perf-webkit-migrator.js to be shared.
2891
2892         * database/aggregate.js: Extracted TaskQueue and SerializedTaskQueue into utility.js.
2893         (main):
2894         (processBuild):
2895         (saveAggregatedResults):
2896         * database/database-common.js:
2897         (getIdOrCreatePlatform): Extracted from webkit-perf-migrator.js.
2898         (getIdOrCreateRepository): Ditto.
2899         (getConfigurationsForPlatformAndMetrics): Renamed from fetchConfigurations. Extracted from aggregator.js.
2900         (getIdFromListOrInsertConfiguration): Renamed from getOrInsertConfiguration. Extracted from aggregator.js.
2901         * database/perf-webkit-migrator.js:
2902         * database/utility.js: Added.
2903         (TaskQueue): Extracted from aggregator.js. Fixed a bug that prevented tasks added after start() is called
2904         from being executed.
2905         (TaskQueue.startTasksInQueue): Execute remaining tasks without serializing them. If the queue is empty,
2906         call the callback passed into start().
2907         (TaskQueue.taskCallback): The function each task calls back. Decrement the counter and call statTasksInQueue.
2908         (TaskQueue.addTask):
2909         (TaskQueue.start):
2910         (SerializedTaskQueue): Unlike TaskQueue, this class executes each task sequentially.
2911         (SerializedTaskQueue.executeNextTask):
2912         (SerializedTaskQueue.addTask):
2913         (SerializedTaskQueue.start):
2914
2915 2012-12-18  Ryosuke Niwa  <rniwa@webkit.org>
2916
2917         Revert erroneously committed changes.
2918
2919         * database/config.json:
2920
2921 2012-12-18  Ryosuke Niwa  <rniwa@webkit.org>
2922
2923         aggregator.js should be able to accept multiple metric ids and a single build id.
2924
2925         Reviewed by Ricky Mondello.
2926
2927         Make aggregator.js accept multiple ids and generate results for single build when bots are
2928         reporting new results.
2929
2930         * database/aggregate.js:
2931         (parseArgv): Added. Returns an object containing the parsed representation of argv,
2932         which currently contains metricIDs and buildIds.
2933         (main): Use parseArgv and processConfigurations
2934         (processPlatform): Use build ids passed in or obtain all builds for the given platform.
2935         (processPlatform.processConfigurations): Extracted.
2936
2937 2012-12-17  Ryosuke Niwa  <rniwa@webkit.org>
2938
2939         Add an administrative page for builders.
2940
2941         Reviewed by Ricky Mondello.
2942
2943         We need an administrative page to add and edit builder information.
2944         Also renamed "slaves" to "builders" in order to reduce the amount of technical jargon we use.
2945
2946         * database/init-database.sql: Renamed slaves table to builders. Drop slave_os and slave_spec
2947         since we don't have plans to use those columns in near future. Also make builder_name unique
2948         as required by the rest of the app.
2949         * public/admin/builders.php: Added.
2950         * public/api/runs.php: Updated per the table rename.
2951         * public/include/admin-header.php: Added a link to builders.php.
2952
2953 2012-12-14  Ryosuke Niwa  <rniwa@webkit.org>
2954
2955         Build fixes for r46982.
2956
2957         * database/aggregate.js:
2958         (fetchConfigurations):  Bind i so that it's not always metricIds.length.
2959         (fetchBuildsForPlatform): Return run_build as build_id since that's what caller expects.
2960         (processBuild): Don't print "." until we've committed transactions. It's misleading.
2961
2962 2012-12-13  Ryosuke Niwa  <rniwa@webkit.org>
2963
2964         Unreviewed. Move some php files to public/include as suggested by Mark on a code review.
2965
2966         * public/admin/aggregators.php:
2967         * public/admin/footer.php: Removed.
2968         * public/admin/header.php: Removed.
2969         * public/admin/index.php:
2970         * public/admin/jobs.php:
2971         * public/admin/tests.php:
2972         * public/api/json-header.php: Removed.
2973         * public/api/runs.php:
2974         * public/db.php: Removed.
2975         * public/include: Added.
2976         * public/include/admin-footer.php: Copied from public/admin/footer.php.
2977         * public/include/admin-header.php: Copied from public/admin/header.php.
2978         * public/include/db.php: Copied from public/db.php.
2979         * public/include/json-header.php: Copied from public/api/json-header.php.
2980
2981 2012-12-13  Ryosuke Niwa  <rniwa@webkit.org>
2982
2983         <rdar://problem/12822613> SafariPerfMonitor: implement naive value aggregation mechanism
2984
2985         Reviewed by Ricky Mondello.
2986
2987         Added the initial implementation of value aggregation.
2988         Also added abilities to configure the dashboard page in tests.php.
2989
2990         * database/aggregate.js: Added.
2991         (TaskQueue): Added. Execute all tasks at once and waits for those tasks to complete.
2992         (TaskQueue.addTask):
2993         (TaskQueue.start):
2994         (SerializedTaskQueue): Added. Execute tasks sequentially after one another until all of them are completed.
2995         (SerializedTaskQueue.addTask):
2996         (SerializedTaskQueue.start):
2997         (main):
2998         (processPlatform):
2999         (fetchConfigurations):
3000         (fetchBuildsForPlatform):
3001         (processBuild):
3002         (testsWithDifferentIterationCounts):
3003         (aggregateIterationsForMetric): Retrieve run_iterations and aggregate results in memory.
3004         (saveAggregatedResults): Insert into test_runs and test_config in transactions.
3005         (getOrInsertConfiguration):
3006         (fetchAggregators):
3007         * database/database-common.js:
3008         (fetchTable): Log an error as an error.
3009         (getOrCreateId): Extracted from perf-webkit-migrator.
3010         (statistics): Added.
3011         * database/perf-webkit-migrator.js:
3012         (migrateTestConfig): Converted units to respective metric names. Also removed the code to add jobs to update
3013         runs JSON since runs JSONs are generated on demand now.
3014         (migrateStat):
3015         (getOrCreatePlatformId):
3016         (getOrCreateTestId):
3017         (getOrCreateConfigurationId):
3018         (getOrCreateRevisionId):
3019         (getOrCreateRepositoryId):
3020         (getOrCreateBuildId):
3021         * database/process-jobs.js:
3022         (processJob): Handle 'aggregate' type.
3023
3024 2012-12-11  Ryosuke Niwa  <rniwa@webkit.org>
3025
3026         Fix the dashboard after adding test_metrics.
3027
3028         Reviewed by Ricky Mondello.
3029
3030         Rename test to metrics in various functions and sort tests on the charts page.
3031         Also representing whether a test appears or not by setting a flag on dashboard
3032         was bogus because test objects are shared by multiple platforms. Instead, store
3033         dashboard platform list as intended by the manifest JSON.
3034
3035         * public/index.html:
3036         (PerfTestRuns): Renamed test to metric.
3037         (fetchTest): Ditto.
3038         (showCharts): Ditto; also sort metrics' full names before adding them to the select element.
3039         (fullName): Moved so that it appears above where it's called.
3040         * public/js/helper-classes.js:
3041
3042 2012-12-10  Ryosuke Niwa  <rniwa@webkit.org>
3043
3044         Update tests.php to reflect recent changes in the database schema.
3045
3046         Reviewed by Conrad Shultz.
3047
3048         Made the following changes to tests.php:
3049         1. Disallow adding metrics to tests without subtests.
3050         2. Made dashboard configurable by adding checkboxes for each platform on each metric.
3051         3. Linkified tests with subtests instead of showing all them at once.
3052
3053         * public/admin/admin.css:
3054         (.action-field, .notice):
3055         (label):
3056         * public/admin/header.php: Specify paths by absolute paths so that tests.php can use PATH_INFO.
3057         (execute_query_and_expect_one_row_to_be_affected): Return a boolean. Used in tests.php while adding test_metrics.
3058         (add_job): Extracted.
3059         * public/admin/tests.php: See above.
3060         (array_item_set_default): Added.
3061         (array_item_or_default): Renamed from get_value_with_default.
3062         (compute_full_name): Extracted.
3063         (sort_tests): Ditto.
3064         (map_metrics_to_tests): Ditto.
3065
3066 2012-12-06  Ryosuke Niwa  <rniwa@webkit.org>
3067
3068         <rdar://problem/12832324> SafariPerfMonitor: Linkify test names
3069
3070         Reviewed by Simon Fraser.
3071
3072         Linkify the headers using metric.test.url when it's provided.
3073
3074         * public/index.html:
3075
3076 2012-12-03  Ryosuke Niwa  <rniwa@webkit.org>
3077
3078         Use parameterized pg_query_params in query_and_fetch_all
3079
3080         Reviewed by Conrad Shultz.
3081
3082         Address a review comment by Mark by using pg_query_params instead of pg_query in query_and_fetch_all.
3083
3084         * public/api/runs.php:
3085         * public/db.php:
3086         (ctype_alnum_underscore): Added.
3087
3088 2012-12-04  Ryosuke Niwa  <rniwa@webkit.org>
3089
3090         Update the migration tool to support test_metrics.
3091
3092         Reviewed by Mark Rowe.
3093
3094         Updated the migration tool from webkit-perf.appspot.com to support test_metrics.
3095         Also import run_iteration rows as runs JSON files now include individual values.
3096
3097         * database/database-common.js:
3098         (addJob): Extracted.
3099         * database/perf-webkit-migrator.js:
3100         (migrateTestConfig): Interchange the order in which we fetch runs and add configurations
3101         so that we can pass in the metric name and unit to getOrCreateConfigurationId.
3102         (getOrCreateConfigurationId): Updated to add both test configuration and test metric.
3103         (ensureCheckout):
3104
3105 2012-12-03  Ryosuke Niwa  <rniwa@webkit.org>
3106
3107         Build fix. Suppress "Undefined index" warning.
3108
3109         * public/admin/tests.php:
3110
3111 2012-12-03  Ryosuke Niwa  <rniwa@webkit.org>
3112
3113         Fix a commit error in r46756. api/ should obviously be added under public/
3114
3115         * api: Removed.
3116         * api/json-header.php: Removed.
3117         * api/runs.php: Removed.
3118         * public/api: Copied from api.
3119
3120 2012-12-03  Ryosuke Niwa  <rniwa@webkit.org>
3121
3122         SafariPerfMonitor: Linkify revisions and revisions range
3123         <rdar://problem/12801010>
3124
3125         Reviewed by Mark Rowe.
3126
3127         Linkify revisions in TestBuild.label. Pass in manifest.repositories to TestBuild's constructor
3128         since it needs to know "url" and "blameUrl".
3129
3130         Also tweaked the appearance of graphs on charts page to better align graphs when unit names are long.
3131
3132         * public/index.html:
3133         * public/js/helper-classes.js:
3134         (TestBuild):
3135         (TestBuild.revision): Renamed from webkitRevision. Now returns an arbitrary revision number.
3136         (TestBuild.label): Add labels for all revisions.
3137         (TestBuild):
3138         (.ensureContainer):
3139
3140 2012-12-03  Ryosuke Niwa  <rniwa@webkit.org>
3141
3142         Make the generation of "runs" JSON dynamic and support test_metrics.
3143
3144         Reviewed by Mark Rowe.
3145
3146         It turned out that we can fetch all runs for a given configuration in roughly 100-200ms.
3147
3148         Since there could be hundreds, if not thousands, of tests for each configuration and users
3149         aren't necessarily interested in looking at all test results, it's much more efficient to
3150         generate runs JSON dynamically (i.e. polling) upon a request instead of generating all of them
3151         when bots report new results (i.e. pushing).
3152
3153         Rewrote the script to generate runs JSON in php and also supported test_metrics table.
3154
3155         * api: Added.
3156         * api/json-header.php: Added. Sets Content-Type and cache policies (10 minutes by default).
3157         (exit_with_error): Added.
3158         (successful_exit): Added.
3159         * api/runs.php: Added. Ported database/database-common.js. It's much shorter in php!
3160         * database/generate-runs.js: Removed.
3161         * database/process-jobs.js: No longer supports "runs".
3162         * public/.htaccess: Added. Always add MultiView so that api/runs can receive a path info.
3163         * public/db.php: Print "Nothing to see here." when it's accessed directly.
3164         (ends_with): Added.
3165         * public/index.html: Fetch runs JSONs from /api/runs/ instead of data/.
3166
3167 2012-12-03  Ryosuke Niwa  <rniwa@webkit.org>
3168
3169         Update tests.php and sample-data.sql per addition of test_metrics.
3170
3171         Rubber-stamped by Timothy Hatcher.
3172
3173         Remove a useless code from tests.php that used to update the unit and the url of a test
3174         since it's no longer used, and add the UI and the ability to add a new aggregator to a test.
3175
3176         Also update the sample data to reflect the addition of test_metrics.
3177
3178         * database/sample-data.sql:
3179         * public/admin/tests.php:
3180
3181 2012-11-30  Ryosuke Niwa  <rniwa@webkit.org>
3182
3183         Share more code between admin pages.
3184
3185         Reviewed by Timothy Hatcher.
3186
3187         Added notice and execute_query_and_expect_one_row_to_be_affected helper functions to share more code
3188         between admin pages.
3189
3190         Also moved the code to connect to the database into header.php to be shared. Admin pages just need
3191         to check the nullity of global $db now.
3192
3193         * public/admin/aggregators.php:
3194         * public/admin/header.php:
3195         (notice): Added
3196         (execute_query_and_expect_one_row_to_be_affected): Added.
3197         * public/admin/index.php:
3198         * public/admin/jobs.php:
3199         * public/admin/tests.php:
3200
3201 2012-11-29  Ryosuke Niwa  <rniwa@webkit.org>
3202
3203         SafariPerfMonitor: Add admin page to edit aggregators
3204         <rdar://problem/12782687>
3205
3206         Reviewed by Mark Rowe.
3207
3208         Add aggregators.php. It's very simple. We should probably share more code between various admin pages.
3209
3210         * public/admin/aggregators.php: Added.
3211         * public/admin/header.php:
3212         * public/admin/jobs.php: Removed an erroneous hidden input element.
3213
3214 2012-11-28  Ryosuke Niwa  <rniwa@webkit.org>
3215
3216         Fix a syntax error in init-database.sql and add the missing drop table at the beginning.
3217
3218         * database/init-database.sql:
3219
3220 2012-11-28  Ryosuke Niwa  <rniwa@webkit.org>
3221
3222         SafariPerfMonitor: Allow multiple metrics per test
3223         <rdar://problem/12773506>
3224
3225         Rubber-stamped by Mark Rowe.
3226
3227         Introduce a new table test_metrics. This table represents metrics each test can have
3228         such as time, memory allocation, frame rate as well as aggregation such as arithmetic mean
3229         and geometric mean.
3230
3231         Updated admin/tests.php and index.html accordingly.
3232
3233         Also create few indexes based on postgres' "explain analysis" as suggested by Mark.
3234
3235         * database/generate-manifest.js:
3236         (buildPlatformMapIfPossible):
3237         * database/generate-runs.js:
3238         (fetchRuns):
3239         * database/init-database.sql:
3240         * database/schema.graffle:
3241         * public/admin/admin.css:
3242         (table):
3243         (tbody.odd):
3244         * public/admin/tests.php:
3245         * public/index.html:
3246
3247 2012-11-27  Ryosuke Niwa  <rniwa@webkit.org>
3248
3249         SafariPerfMonitor: Improve the webkit-perf migration tool
3250         <rdar://problem/12760882>
3251
3252         Reviewed by Mark Rowe.
3253
3254         Make the migrator tool skip runs when fetching runs failed since webkit-perf.appspot.com is unreliable
3255         and we don't want to pause the whole importation process until the user comes back to decide whether
3256         to retry or not.
3257
3258         Also place form controls next to each test in tests.php so that users don't have to scroll all the way
3259         down to make modifications.
3260
3261         Finally, add unique constraint to (run_config, run_build) in test_runs table in order to optimize a query
3262         of the form: "SELECT run_id FROM test_runs WHERE run_config = $1 AND run_build = $2",
3263
3264         * database/init-database.sql:
3265         * database/perf-webkit-migrator.js:
3266         (migrateTestConfig):
3267         * database/schema.graffle:
3268         * public/admin/admin.css:
3269         (table):
3270         * public/admin/tests.php:
3271
3272 2012-11-16  Ryosuke Niwa  <rniwa@webkit.org>
3273
3274         Create a new performance dashboard
3275         <rdar://problem/12625582>
3276
3277         Rubber-stamped by Mark Rowe.
3278
3279         Add the initial implementation of the perf dashboard.
3280
3281         * database: Added.
3282         * database/config.json: Added.
3283         * database/database-common.js: Added.
3284         (connect):
3285         (fetchTable):
3286         (manifestPath):
3287         (pathToRunsJSON):
3288         (pathToLocalScript):
3289         (config):
3290         * database/generate-manifest.js: Added.
3291         (ensureProperty):
3292         (buildTestMap):
3293         (buildPlatformMapIfPossible):
3294         (generateFileIfPossible):
3295         * database/perf-webkit-migrator.js: Added.
3296         * database/process-jobs.js: Added.
3297         * database/sample-data.sql: Added.
3298         * database/schema.graffle: Added.
3299         * public: Added.
3300         * public/admin: Added.
3301         * public/admin/README: Added.
3302         * public/admin/admin.css: Added.
3303         * public/admin/footer.php: Added.
3304         * public/admin/header.php: Added.
3305         * public/admin/index.php: Added.
3306         * public/admin/jobs.php: Added.
3307         * public/admin/tests.php: Added.
3308         * public/common.css: Added.
3309         * public/data: Added.
3310         * public/db.php: Added.
3311         * public/index.html: Added.
3312         * public/js: Added.
3313         * public/js/helper-classes.js: Added.
3314         * public/js/jquery-1.8.2.min.js: Added.
3315         * public/js/jquery.flot.min.js: Added.
3316         * public/js/jquery.flot.plugins.js: Added.
3317         * public/js/shared.js: Added.
3318         (fileNameFromPlatformAndTest):
3319         * public/js/statistics.js: Added.
3320