Perf dashboard shouldn't show the full git hash
[WebKit-https.git] / Websites / perf.webkit.org / ChangeLog
1 2014-07-18  Ryosuke Niwa  <rniwa@webkit.org>
2
3         Perf dashboard shouldn't show the full git hash
4         https://bugs.webkit.org/show_bug.cgi?id=135083
5
6         Reviewed by Benjamin Poulain.
7
8         Detect Git/Mercurial hash by checking the length.
9
10         If it's a hash, use the first 8 characters in the label
11         while retaining the full length to be used in hyperlinks.
12
13         * public/js/helper-classes.js:
14         (.this.formattedRevisions):
15         (TestBuild):
16
17 2014-05-29  Ryosuke Niwa  <rniwa@webkit.org>
18
19         Add an instruction on how to backup the database.
20         https://bugs.webkit.org/show_bug.cgi?id=133391
21
22         Rubber-stamped by Andreas Kling.
23
24         * Install.md:
25
26 2014-04-08  Ryosuke Niwa  <rniwa@webkit.org>
27
28         Build fix after r166479. 'bytes' is now abbreviated as 'B'.
29
30         * public/js/helper-classes.js:
31         (PerfTestRuns.smallerIsBetter):
32
33 2014-04-08  Ryosuke Niwa  <rniwa@webkit.org>
34
35         Some CSS teaks.
36
37         * public/common.css:
38         (#title):
39         * public/index.html:
40         (#charts .pane):
41         (#charts .arrow):
42
43 2014-04-03  Ryosuke Niwa  <rniwa@webkit.org>
44
45         WebKitPerfMonitor: There should be a way to add all metrics of a suite without also adding subtests
46         https://bugs.webkit.org/show_bug.cgi?id=131157
47
48         Reviewed by Andreas Kling.
49
50         Split "all metrics" into all metrics of a test suite and all subtests of the suite.
51         This allows, for example, adding all metrics such as Arithmetic and Geometric for
52         a given test suite without also adding its subtests.
53
54         * public/index.html:
55         (init.showCharts):
56         (init):
57
58 2014-04-03  Ryosuke Niwa  <rniwa@webkit.org>
59
60         WebKitPerfMonitor: Tooltips cannot be pinned after using browser's back button
61         https://bugs.webkit.org/show_bug.cgi?id=131155
62
63         Reviewed by Andreas Kling.
64
65         The bug was caused by Chart.attach binding event listeners on plot container on each call.
66         This resulted in the click event handler toggling the visiblity of the tooltip twice upon
67         click when attach() has been called even number of times, keeping the tooltip invisible.
68
69         Fixed the bug by extracting the code to bind event listeners outside of Chart.attach as
70         a separate function, bindPlotEventHandlers, and calling it exactly once when Chart.attach
71         is called for the first time.
72
73         * public/index.html:
74         (Chart.attach):
75         (Chart..bindPlotEventHandlers):
76
77 2014-04-03  Ryosuke Niwa  <rniwa@webkit.org>
78
79         WebKitPerfMonitor: Tooltips can be cut off at the top
80         https://bugs.webkit.org/show_bug.cgi?id=130960
81
82         Reviewed by Andreas Kling.
83
84         * public/common.css:
85         (#title): Removed the gradients, box shadows, and border from the header.
86         (#title h1): Reduce the font size.
87         (#title ul): Use line-height to vertically align the navigation bar instead of specifying a padding atop.
88         * public/index.html:
89         (.tooltop:before): Added. Identical to .tooltop:after except it's upside down (arrow facing up).
90         (.tooltip.inverted:before): Show the arrow facing up when .inverted is set.
91         (.tooltip.inverted:before): Hide the arrow facing down when .inverted is set.
92         * public/js/helper-classes.js:
93         (Tooltip.show): Show the tooltip below the point if placing it above the point results in the top of the
94         tooltip extending above y=0.
95
96 2014-04-03  Ryosuke Niwa  <rniwa@webkit.org>
97
98         WebKitPerfMonitor: Y-axis adjustment is too aggressive
99         https://bugs.webkit.org/show_bug.cgi?id=130937
100
101         Reviewed by Andreas Kling.
102
103         Previously, adjusted min. and max. were defined as the two standards deviations away from EWMA of measured
104         results. This had two major problems:
105         1. Two standard deviations can be too small to show the confidence interval for results.
106         2. Sometimes baseline and target can be more than two standards deviations away.
107
108         Fixed the bug by completely rewriting the algorithm to compute the interval. Instead of blindly using two
109         standard deviations as margins, we keep adding quarter the standard deviation on each side until more than 90%
110         of points lie in the interval or we've expanded 4 standard deviations. Once this condition is met, we reduce
111         the margin on each side separately to reduce the empty space on either side.
112
113         A more rigorous approach would involve computing least squared value of results with respect to intervals
114         but that seems like an overkill for a simple UI problem; it's also computationally expensive.
115
116         * public/index.html:
117         (Chart..adjustedIntervalForRun): Extracted from computeYAxisBoundsToFitLines.
118         (Chart..computeYAxisBoundsToFitLines): Compute the min. and max. adjusted intervals out of adjusted intervals
119         for each runs (current, baseline, and target) so that at least one point from each set of results is shown.
120         We wouldn't see the difference between measured values versus baseline and target values otherwise.
121         * public/js/helper-classes.js:
122         (PerfTestResult.unscaledConfidenceIntervalDelta): Returns the default value if the confidence
123         interval delta cannot be computed.
124         (PerfTestResult.isInUnscaledInterval): Added. Returns true iff the confidence intervals lies
125         within the given interval.
126         (PerfTestRuns..filteredResults): Extracted from unscaledMeansForAllResults now that PerfTestRuns.min and
127         PerfTestRuns.max need to use both mean and confidence interval delta for each result.
128         (PerfTestRuns..unscaledMeansForAllResults):
129         (PerfTestRuns.min): Take the confidence interval delta into account.
130         (PerfTestRuns.max): Ditto.
131         (PerfTestRuns.countResults): Returns the number of results in the given time frame (> minTime).
132         (PerfTestRuns.countResultsInInterval): Returns the number of results whose confidence interval lie within the
133         given interval.
134         (PerfTestRuns.exponentialMovingArithmeticMean): Fixed the typo so that it actually computes the EWMA.
135
136 2014-03-31  Ryosuke Niwa  <rniwa@webkit.org>
137
138         Some CSS tweaks after r166477 and r166479,
139
140         * public/index.html:
141
142 2014-03-30  Ryosuke Niwa  <rniwa@webkit.org>
143
144         WebKitPerfMonitor: Sometimes text inside panes overlap
145         https://bugs.webkit.org/show_bug.cgi?id=130956
146
147         Reviewed by Gyuyoung Kim.
148
149         Revamped the pane UI. Now build info uses table element instead of plane text with BRs. The computed status of
150         the latest result against baseline/target such as "3% until target" is now shown above the current value. This
151         reduces the total height of the pane and fits more information per screen capita on the dashboard.
152
153         * public/index.html: Updated and added a bunch of CSS rules for the new look.
154         (.computeStatus): Don't append the build info here. The build info is constructed as a separate table now.
155         (.createSummaryRowMarkup): Use th instead of td for "Current", "Baseline", and "Target" in the summary table.
156         (.buildLabelWithLinks): Construct table rows instead of br separated lines of text. This streamlines the look
157         of the build info shown in a chart pane and a tooltip.
158         (Chart): Made .status a table.
159         (Chart.populate): Prepend status.text, which contains text such as "3% until target", into the summary rows
160         right above "Current" value, and populate .status with buildLabelWithLinks manually instead of status.text
161         now that status.text no longer contains it.
162         (Chart..showTooltipWithResults):  Wrap buildLabelWithLinks with a table element.
163
164         * public/js/helper-classes.js:
165         (TestBuild.formattedRevisions): Don't include repository names in labels since repository names are now added
166         by buildLabelWithLinks inside th elements. Also place spaces around '-' between two different OS X versions.
167         e.g. "OS X 10.8 - OS X 10.9" instead of "OS X 10.8-OS X 10.9".
168         (PerfTestRuns): Use "/s" for "runs/s" and "B" for "bytes" to make text shorter in .status and .summaryTable.
169         (PerfTestRuns..computeScalingFactorIfNeeded): Avoid placing a space between 'M' and a unit starting with a
170         capital letter; e.g. "MB" instead of "M B".
171
172 2014-03-30  Ryosuke Niwa  <rniwa@webkit.org>
173
174         WebKitPerfMonitor: Header and number-of-days slider takes up too much space
175         https://bugs.webkit.org/show_bug.cgi?id=130957
176
177         Reviewed by Gyuyoung Kim.
178
179         Moved the slider into the header. Also reduced the spacing between the header and platform names.
180         This reclaims 50px × width of the screen real estate.
181
182         * public/common.css:
183         (#title): Reduced the space below the header from 20px to 10px.
184         * public/index.html:
185         (#numberOfDaysPicker): Removed the rounded border around the number-of-days slider.
186         (#dashboard > tbody > tr > td): Added a 1.5em padding at the bottom.
187         (#dashboard > thead th): That allows us to remove the padding at the top here. This reduces the wasted screen
188         real estate between the header and the platform names.
189
190 2014-03-10  Zoltan Horvath  <zoltan@webkit.org>
191
192         Update the install guidelines for perf.webkit.org
193         https://bugs.webkit.org/show_bug.cgi?id=129895
194
195         Reviewed by Ryosuke Niwa.
196
197         The current install guideline for perf.webkit.org discourages the use of the installed
198         Server application. I've actualized the documentation for Mavericks, and modified the
199         guideline to include the instructions for Server.app also.
200
201         * Install.md:
202
203 2014-03-08  Zoltan Horvath  <zoltan@webkit.org>
204
205         Update perf.webkit.org json example
206         https://bugs.webkit.org/show_bug.cgi?id=129907
207
208         Reviewed by Andreas Kling.
209
210         The current example is not valid json syntax. I fixed the syntax errors and indented the code properly.
211
212         * ReadMe.md:
213
214 2014-01-31  Ryosuke Niwa  <rniwa@webkit.org>
215
216         Merge database-common.js and utility.js into run-tests.js.
217
218         Reviewed by Matthew Hanson.
219
220         Now that run-tests is the only node.js script, merged database-common.js and utility.js into it.
221         Also moved init-database.sql out of the database directory and removed the directory entirely.
222
223         * database: Removed.
224         * database/database-common.js: Removed.
225         * database/utility.js: Removed.
226         * init-database.sql: Moved from database/init-database.sql.
227         * run-tests.js:
228         (connect): Moved from database-common.js.
229         (pathToDatabseSQL): Extracted from pathToLocalScript.
230         (pathToTests): Moved from database-common.js.
231         (config): Ditto.
232         (TaskQueue): Ditto.
233         (SerializedTaskQueue): Ditto.
234         (main):
235         (initializeDatabase):
236         (TestEnvironment.it):
237         (TestEnvironment.queryAndFetchAll):
238         (sendHttpRequest):
239
240 2014-01-30  Ryosuke Niwa  <rniwa@webkit.org>
241
242         Remove the dependency on node.js from the production code.
243
244         Reviewed by Ricky Mondello.
245
246         Work towards <rdar://problem/15955053> Upstream SafariPerfMonitor.
247
248         Removed node.js dependency from TestRunsGenerator. It was really a design mistake to invoke node.js from php.
249         It added so much complexity with only theoretical extensibility of adding aggregators.  It turns out that
250         many aggregators we'd like to add are a lot more complicated than ones that could be written under the current
251         infrastructure, and we need to make the other aspects (e.g. the level of aggregations) a lot more extensible.
252         Removing and simplifying TestRunsGenerator allows us to implement such extensions in the future.
253
254         Also removed the js files that are no longer used.
255
256         * config.json: Moved from database/config.json.
257         * database/aggregate.js: Removed. No longer used.
258         * database/database-common.js: Removed unused functions, and updated the path to config.json.
259         * database/process-jobs.js: Removed. No longer used.
260         * database/sample-data.sql: Removed. We have a much better corpus of data now.
261         * database/schema.graffle: Removed. It's completely obsolete.
262         * public/include/db.php: Updated the path to config.json.
263         * public/include/evaluator.js: Removed.
264
265         * public/include/report-processor.php:
266         (TestRunsGenerator::aggregate): Directly aggregate values via newly added aggregate_values method instead of
267         storing values into $expressions and calling evaluate_expressions_by_node.
268         (TestRunsGenerator::aggregate_values): Added.
269         (TestRunsGenerator::compute_caches): Directly compute the caches.
270
271 2014-01-30  Ryosuke Niwa  <rniwa@webkit.org>
272
273         Build fix. Don't fail the platform merges even if there are no test configurations to be moved to the new platform.
274
275         * public/admin/platforms.php:
276         * public/include/db.php:
277
278 2014-01-30  Ryosuke Niwa  <rniwa@webkit.org>
279
280         Zoomed y-axis view is ununsable when the last result is an outlier.
281
282         Reviewed by Stephanie Lewis.
283
284         Show two standard deviations from the exponential moving average with alpha = 0.3 instead of the mean of
285         the last result so that the graph looks sane if the last result was an outlier. However, always show
286         the last result's mean even if it was an outlier.
287
288         * public/index.html:
289         * public/js/helper-classes.js:
290         (unscaledMeansForAllResults): Extracted from min/max/sampleStandardDeviation.
291         Also added the ability to cache the unscaled means to avoid recomputation.
292         (PerfTestRuns.min): Refactored to use unscaledMeansForAllResults.
293         (PerfTestRuns.max): Ditto.
294         (PerfTestRuns.sampleStandardDeviation): Ditto.
295         (PerfTestRuns.exponentialMovingArithmeticMean): Added.
296
297 2014-01-30  Ryosuke Niwa  <rniwa@webkit.org>
298
299         Minor fixes.
300
301         * public/admin/tests.php:
302         * public/js/helper-classes.js:
303
304 2014-01-29  Ryosuke Niwa  <rniwa@webkit.org>
305
306         Use two standard deviations instead as I mentioned in the mailing list.
307
308         * public/index.html:
309
310 2014-01-28  Ryosuke Niwa  <rniwa@webkit.org>
311
312         The performance dashboard erroneously shows upward arrow for combined metrics.
313
314         A single outlier can ruin the zoomed y-axis view.
315
316         Rubber-stamped by Antti Koivisto.
317
318         * public/index.html:
319         (computeYAxisBoundsToFitLines): Added adjustedMax and adjustedMin, which are pegged at 4 standard deviations
320         from the latest results' mean.
321         (Chart): Renamed shouldStartYAxisAtZero to shouldShowEntireYAxis.
322         (Chart.attachMainPlot): Use the adjusted max and min when we're not showing the entire y-axis.
323         (Chart.toggleYAxis):
324         * public/js/helper-classes.js:
325         (PerfTestRuns.sampleStandardDeviation): Added.
326         (PerfTestRuns.smallerIsBetter): 'Combined' is a smaller is better metric.
327
328 2014-01-28  Ryosuke Niwa  <rniwa@webkit.org>
329
330         Don't include the confidence interval when computing the y-axis.
331
332         Rubber-stamped by Simon Fraser.
333
334         * public/js/helper-classes.js:
335         (PerfTestRuns.min):
336         (PerfTestRuns.max):
337
338 2014-01-25  Ryosuke Niwa  <rniwa@webkit.org>
339
340         Tiny CSS tweak for tooltips.
341
342         * public/index.html:
343
344 2014-01-25  Ryosuke Niwa  <rniwa@webkit.org>
345
346         Remove the erroneously repeated code.
347
348         * public/admin/test-configurations.php:
349
350 2014-01-24  Ryosuke Niwa  <rniwa@webkit.org>
351
352         <rdar://problem/15704893> perf dashboard should show baseline numbers
353
354         Reviewed by Stephanie Lewis.
355
356         * public/admin/bug-trackers.php:
357         (associated_repositories): Return an array of HTMLs instead of echo'ing as expected by AdministrativePage.
358         Also fixed a typo.
359
360         * public/admin/platforms.php:
361         (merge_list): Ditto.
362
363         * public/admin/test-configurations.php: Added.
364         (add_run): Adds a "synthetic" test run and a corresponding build. It doesn't create run_iterations and
365         build_revisions as they're not meaningful for baseline / target numbers.
366         (delete_run): Deletes a synthetic test run and its build. It verifies that the specified build has exactly
367         one test run so that we don't accidentally delete a reported test run.
368         (generate_rows_for_configurations): Generates rows of configuration IDs and types.
369         (generate_rows_for_test_runs): Ditto for test runs. It also emits the form to add new "synthetic" test runs
370         and delete existing ones.
371
372         * public/admin/tests.php: We wrongfully assumed there is exactly one test configuration for each metric
373         on each platform; there could be configurations of distinct types such as "current" and "baseline".
374         Thus, update all test configurations for a given metric when updating config_is_in_dashboard.
375
376         * public/api/runs.php: Remove the NotImplemented when we have multiple test configurations.
377         (fetch_runs_for_config): "Synthetic" test runs created on test-configurations page are missing revision
378         data so we need to left-outer-join (instead of inner-join) build_revisions. To avoid making the query
379         unreadable, don't join revision_repository here. Instead, fetch the list of repositories upfront and
380         resolve names in parse_revisions_array. This actually reduces the query time by ~10%.
381
382         (parse_revisions_array): Skip an empty array created for "synthetic" test runs.
383
384         * public/include/admin-header.php:
385         (AdministrativePage::render_table): Now custom columns support sub columns. e.g. a configuration column may
386         have id and type sub columns, and each custom column could generate multiple rows.
387
388         Any table with sub columns now generates two rows for thead. We generate td's in in the first row without
389         sub columns with rowspan of 2, and generate ones with sub columns with colspan set to the sub column count.
390         We then proceed to generate the second header row with sub column names.
391
392         When generating the actual content, we first generate all custom columns as they may have multiple rows in
393         which case regular columns need rowspan set to the maximum number of rows.
394
395         Once we've generated the first row, we proceed to generate subsequent rows for those custom columns that
396         have multiple rows.
397
398         (AdministrativePage::render_custom_cells): Added. This function is responsible for generating table cells
399         for a given row in a given custom column. It generates an empty td when the custom column doesn't have
400         enough rows. It also generates empty an td when it doesn't have enough columns in some rows except when
401         the entire row consists of exactly one cell for a custom column with sub columns, in which case the cell is
402         expanded to occupy all sub columns.
403
404         * public/include/manifest.php:
405         (ManifestGenerator::platforms): Don't add the metric more than once.
406
407         * public/include/test-name-resolver.php:
408         (TestNameResolver::__construct): We had wrongfully assumed that we have exactly one test configuration on
409         each platform for each metric like tests.php. Fixed that. Also fetch the list of aggregators to compute the
410         full metric name later.
411         (TestNameResolver::map_metrics_to_tests): Populate $this->id_to_metric.
412         (TestNameResolver::test_id_for_full_name): Simplified the code using array_get.
413         (TestNameResolver::full_name_for_test): Added.
414         (TestNameResolver::full_name_for_metric): Added.
415         (TestNameResolver::configurations_for_metric_and_platform): Renamed as it returns multiple configurations.
416
417         * public/js/helper-classes.js:
418         (TestBuild): Use the build time as the maximum time when revision information is missing for "synthetic"
419         test runs created to set baseline and target points.
420
421 2014-01-24  Ryosuke Niwa  <rniwa@webkit.org>
422
423         Build fix after r57928. Removed a superfluous close parenthesis.
424
425         * public/api/runs.php:
426
427 2014-01-24  Ryosuke Niwa  <rniwa@webkit.org>
428
429         Unreviewed build & typo fixes.
430
431         * public/admin/platforms.php:
432         * tests/admin-platforms.js:
433
434 2014-01-24  Ryosuke Niwa  <rniwa@webkit.org>
435
436         <rdar://problem/15704893> perf dashboard should show baseline numbers
437
438         Rubber-stamped by Antti Koivisto.
439
440         Organize some code into functions in runs.php.
441
442         Also added back $paths that was erroneously removed in r57925 from json-header.php.
443
444         * public/api/runs.php:
445         (fetch_runs_for_config): Extracted.
446         (format_run): Ditto.
447
448 2014-01-23  Ryosuke Niwa  <rniwa@webkit.org>
449
450         Merge the upstream json-shared.php as of https://trac.webkit.org/r162693.
451
452         * database/config.json:
453         * public/admin/reprocess-report.php:
454         * public/api/report.php:
455         * public/api/runs.php:
456         * public/include/json-header.php:
457
458 2014-01-23  Ryosuke Niwa  <rniwa@webkit.org>
459
460         Commit yet another forgotten change.
461
462         Something went horribly wrong with my merge :(
463
464         * database/init-database.sql:
465
466 2014-01-23  Ryosuke Niwa  <rniwa@webkit.org>
467
468         Commit one more forgotten change. Sorry for making a mess here.
469
470 2014-01-23  Ryosuke Niwa  <rniwa@webkit.org>
471
472         Commit the forgotten files.
473
474         * public/admin/platforms.php: Added.
475         * tests/admin-platforms.js: Added.
476
477 2014-01-23  Ryosuke Niwa  <rniwa@webkit.org>
478
479         <rdar://problem/15889905> SafariPerfMonitor: there should be a way to merge and hide platforms
480
481         Reviewed by Stephanie Lewis.
482
483         Added /admin/platforms/ page to hide and merge platforms.
484
485         Merging two platforms is tricky because we need to migrate test runs as well as some test configurations.
486         Recall that each test (e.g. Dromaeo) can have many "test metrics" (e.g. MaxAllocations, EndAllocations),
487         and they have a distinct "test configuration" for each platform (e.g. MaxAllocation on Mountain Lion), and
488         each test configuration a distinct "test run" for each build.
489
490         In order to merge platform A into platform B, we must migrate all test runs that belong to platform A via
491         their test configurations into platform B.
492
493         Suppose we're migrating a test run R for test configuration T_A in platform A for metric M. Since M exists
494         independent of platforms, R should continue to relate to M through some test configuration. Unfortunately,
495         we can't simply move T_A into platform B since we may already have a test configuration T_B for metric M
496         in platform B, in which case R should relate to T_B instead.
497
498         Thus, we first migrate all test runs for which we already have corresponding test configurations in the
499         new platform. We then migrate the test configurations of the remaining test runs.
500
501         * database/init-database.sql: Added platform_hidden.
502
503         * public/admin/platforms.php: Added.
504         (merge_platforms): Added. Implements the algorithm described above.
505         (merge_list): Added.
506
507         * public/admin/tests.php: Disable the checkbox to show a test configuration on the dashboard if its platform
508         is hidden since it doesn't do anything.
509
510         * public/include/admin-header.php: Added the hyperlink to /admin/platforms.
511         (update_field): Don't bail out if the newly added "update-column" is set to the field name even if $_POST is
512         missing it since unchecked checkbox doesn't set the value in $_POST.
513         (AdministrativePage::render_form_control_for_column): Added the support for boolean edit mode. Also used
514         switch statement instead of repeated if's.
515         (AdministrativePage::render_table): Emit "update-column" for update_field.
516
517         * public/include/db.php: Disable warnings when we're not in the debug mode.
518
519         * public/include/manifest.php:
520         (ManifestGenerator::platforms): Skip platforms that have been hidden.
521
522         * run-tests.js:
523         (TestEnvironment.postJSON):
524         (TestEnvironment.httpGet):
525         (TestEnvironment.httpPost): Added.
526         (sendHttpRequest): Set the content type if specified.
527
528         * tests/admin-platforms.js: Added tests.
529
530 2014-01-22  Ryosuke Niwa  <rniwa@webkit.org>
531
532         Extract the code to compute full test names from tests.php.
533
534         Reviewed by Stephanie Lewis.
535
536         Extracted TestNameResolver out of tests.php. This reduces the number of global variables in tests.php
537         and paves our way to re-use the code in other pages.
538
539         * public/admin/tests.php:
540
541         * public/include/db.php:
542         (array_set_default): Renamed from array_item_set_default and moved from tests.php as it's used in both
543         tests.php and test-name-resolver.php.
544
545         * public/include/test-name-resolver.php: Added.
546         (TestNameResolver::__construct):
547         (TestNameResolver::compute_full_name): Moved from tests.php.
548         (TestNameResolver::map_metrics_to_tests): Ditto.
549         (TestNameResolver::sort_tests_by_full_name): Ditto.
550         (TestNameResolver::tests): Added.
551         (TestNameResolver::test_id_for_full_name): Ditto.
552         (TestNameResolver::metrics_for_test_id): Ditto.
553         (TestNameResolver::child_metrics_for_test_id): Ditto.
554         (TestNameResolver::configuration_for_metric_and_platform): Ditto.
555
556 2014-01-21  Ryosuke Niwa  <rniwa@webkit.org>
557
558         <rdar://problem/15867325> Perf dashboard is erroneously associating reported results with old revisions
559
560         Reviewed by Stephanie Lewis.
561
562         Add the ability to reprocess reports so that I can re-associate wrongfully associated reports.
563
564         Added public/admin/reprocess-report.php. It doesn't have any nice UI to find reports and it returns JSON
565         but that's sufficient to correct the wrongfully processed reports for now.
566
567         * public/admin/reprocess-report.php: Added. Takes a report id in $_GET or $_POST and process the report.
568         We should eventually add a nice UI to find and reprocess reports.
569
570         * public/api/report.php: ReportProcessor and TestRunsGenerator have been removed.
571
572         * public/include/db.php: Added the forgotten call to prefixed_column_names.
573
574         * public/include/report-processor.php: Copied from public/api/report.php.
575         (ReportProcessor::__construct): Fetch the list of aggregators here for simplicity.
576         (ReportProcessor::process): Optionally takes $existing_report_id. When this value is specified, we don't
577         create a new report or authenticate the builder password (the password is never stored in the report).
578         Also use select_first_row instead of query_and_fetch_all to find the builder for simplicity.
579         (ReportProcessor::construct_build_data): Extracted from store_report_and_get_build_data.
580         (ReportProcessor::store_report): Ditto.
581
582         * tests/admin-reprocess-report.js: Added.
583
584 2014-01-21  Ryosuke Niwa  <rniwa@webkit.org>
585
586         <rdar://problem/15867325> Perf dashboard is erroneously associating reported results with old revisions
587
588         Reviewed by Ricky Mondello.
589
590         The bug was caused by a build fix r57645. It attempted to treat multiple reports from the same builder
591         for the same build number as a single build by ignoring build time. This was necessary to associate
592         multiple reports by a single build - e.g. for different performance test suites - because the scripts
593         we use to submit results computed its own "build time" when they're called.
594
595         An unintended consequence of this change was revealed when we moved a buildbot master to the new machine
596         last week; new reports were wrongfully associated with old build numbers.
597
598         Fixed the bug by not allowing reports made more than 1 day after the initial build time to be assigned
599         to the same build. Instead, we create a new build object for those reports. Since the longest set of
600         tests we have only take a couple of hours to run, 24 hours should be more than enough.
601
602         * database/init-database.sql: We can no longer constrain that each build number is unique to a builder
603         or that build number and build time pair is unique. Instead, constrain the uniqueness of the tuple
604         (builder, build number, build time).
605
606         * public/api/report.php:
607         (ReportProcessor::resolve_build_id): Look for any builds made within the past one day. Create a new build
608         when no such build exists. This prevents a report from being associated with a very old build of the same
609         build number.
610
611         Also check that revision numbers or hashes match when we're adding revision info. This will let us catch
612         a similar bug in the future sooner.
613
614         * tests/api-report.js: Added three test cases.
615
616 2014-01-20  Ryosuke Niwa  <rniwa@webkit.org>
617
618         Merged the upstream changes to db.php
619         See http://trac.webkit.org/browser/trunk/Websites/test-results/public/include/db.php
620
621         * public/include/db.php:
622
623 2014-01-20  Ryosuke Niwa  <rniwa@webkit.org>
624
625         Update other scripts and tests per previous patch.
626
627         * public/include/manifest.php:
628         * tests/admin-regenerate-manifest.js:
629
630 2014-01-20  Ryosuke Niwa  <rniwa@webkit.org>
631
632         Remove metrics_unit.
633
634         Reviewed by Ricky Mondello.
635
636         This column is no longer used by the front-end code since r48360.
637
638         * database/init-database.sql:
639         * public/admin/tests.php:
640
641 2014-01-16  Ryosuke Niwa  <rniwa@webkit.org>
642
643         Unreviewed build fix.
644
645         * public/api/report.php:
646
647 2014-01-15  Ryosuke Niwa  <rniwa@webkit.org>
648
649         <rdar://problem/15832456> Automate DoYouEvenBench (124497)
650
651         Reviewed by Ricky Mondello.
652
653         Support a new alternative format for aggregated results where we have raw values as well as
654         the list aggregators so that instead of
655         "metrics": {"Time": ["Arithmetic"]}
656         we can have
657         "metrics": {"Time": { "aggregators" : ["Arithmetic"], "current": [300, 310, 320, 330] }}
658
659         This allows single JSON generated by run-perf-tests in WebKit to be shared between the perf
660         dashboard and the generated results page, which doesn't know how to aggregate values.
661
662         We need to keep the support for the old format because all other existing performance tests
663         all rely on the old format. Even if we updated the tests, we need the dashboard to support
664         the old format during the transition.
665
666         * public/api/report.php:
667         (ReportProcessor::recursively_ensure_tests): Support the new format in addition to the old one.
668         (ReportProcessor::aggregator_list_if_exists): Replaced is_list_of_aggregators.
669
670         * tests/api-report.js: Updated one of aggregator test cases to test the new format.
671
672 2013-05-31  Ryosuke Niwa  <rniwa@webkit.org>
673
674         Unreviewed; Tweak the CSS so that chart panes align vertically.
675
676         * public/index.html:
677
678 2013-05-31  Ryosuke Niwa  <rniwa@webkit.org>
679
680         SafariPerfMonitor should support Combined metric.
681
682         * public/js/helper-classes.js:
683         (PerfTestRuns): Added 'Combined' metric. In general, it could be used for smaller-is-better
684         value as well but assume it to be greater-is-better for now.
685
686 2013-05-30  Ryosuke Niwa  <rniwa@webkit.org>
687
688         Commit the forgotten init-database change to add iteration_relative_time.
689
690         * database/init-database.sql:
691
692 2013-05-30  Ryosuke Niwa  <rniwa@webkit.org>
693
694         <rdar://problem/13993069> SafariPerfMonitor: Support accepting (relative time, value) pairs
695
696         Reviewed by Ricky Mondello.
697
698         Add the support for each value to have a relative time. This is necessary for frame rate history
699         since a frame rate needs to be associated with a time it was sampled.
700
701         * database/init-database.sql: Added iteration_relative_time to run_iterations.
702
703         * public/api/report.php:
704         (TestRunsGenerator::test_value_list_to_values_by_iterations): Reject any non-numeral values here.
705         This code is used to aggregate values but it doesn't make sense to aggregate iteration values
706         with relative time since taking the average of two frame rates for two subtests taken at two
707         different times doesn't make any sense.
708         (TestRunsGenerator::compute_caches): When we encounter an array value while computing sum, mean,
709         etc..., use the second element since we assume values are of the form (relative time, frame rate).
710         Also exit early with an error if the number of elements in the array is not a pair.
711         (TestRunsGenerator::commit): Store the relative time and the frame rate as needed.
712
713         * tests/api-report.js: Added a test case. Also modified existing test cases to account for
714         iteration_relative_time.
715
716 2013-05-27  Ryosuke Niwa  <rniwa@webkit.org>
717
718         <rdar://problem/13654488> SafariPerfMonitor: Support accepting single-value results
719
720         Reviewed by Ricky Mondello.
721
722         Support that. It's one line change.
723
724         * public/api/report.php:
725         (ReportProcessor.recursively_ensure_tests): When there is exactly one value, wrap it inside an array
726         to match the convention assumed elsewhere.
727         * tests/api-report.js: Added a test case.
728
729 2013-05-26  Ryosuke Niwa  <rniwa@webkit.org>
730
731         SafariPerfMonitor shows popups for points outside of the visible region.
732
733         Rubber-stamped by Simon Fraser.
734
735         * public/index.html:
736         (Chart.closestItemForPageXRespectingPlotOffset): renamed from closestItemForPageX.
737         (Chart.attach): Always use closestItemForPageXRespectingPlotOffset to work around the fact flot
738         may return an item underneath y-axis labels.
739
740 2013-05-26  Ryosuke Niwa  <rniwa@webkit.org>
741
742         Tweak the CSS a little to avoid the test name overlapping with the summary table.
743
744         * public/index.html:
745
746 2013-05-26  Ryosuke Niwa  <rniwa@webkit.org>
747
748         Unreviewed. Fix the typo. The anchor element should wrap the svg element, not the other way around.
749
750         * public/index.html:
751
752 2013-05-26  Ryosuke Niwa  <rniwa@webkit.org>
753
754         <rdar://problem/13992266> Should be a toggle to show entire Y-axis range
755         <rdar://problem/13992271> Should scale Y axis to include error ranges
756
757         Reviewed by Ricky Mondello.
758
759         Add the feature. Also made adjust y-axis respect confidence interval delta so that the gray shade behind
760         the main graph doesn't go outside the graph even when the y-axis is adjusted.
761
762         * database/config.json:
763         * public/index.html:
764         (Chart): Add a SVG arrow to toggle y-axis mode, and bind click on the arrow to toggleYAxis().
765         (Chart.attachMainPlot): Respect shouldStartYAxisAtZero.
766         (Chart.toggleYAxis): Toggle the y-axis mode of this chart by toggling shouldStartYAxisAtZero and calling
767         attachMainPlot.
768         * public/js/helper-classes.js:
769         (PerfTestResult.confidenceIntervalDelta):
770         (PerfTestResult.unscaledConfidenceIntervalDelta): Extracted.
771         (PerfTestRuns.min): Take confidence interval delta into account.
772         (PerfTestRuns.max): Ditto.
773         (PerfTestRuns.hasConfidenceInterval): Not sure why this function was checking the typeof. Just use isNaN.
774
775 2013-04-26  Ryosuke Niwa  <rniwa@webkit.org>
776
777         A build fix of the previous. Don't look for a test with NULL parent because NULL != NULL in our beloved SQL.
778
779         * public/api/report.php:
780         (ReportProcessor::recursively_ensure_tests):
781         * tests/api-report.js: Added a test.
782
783 2013-04-26  Ryosuke Niwa  <rniwa@webkit.org>
784
785         Unreviewed build fixes.
786
787         * public/api/report.php:
788         (ReportProcessor::process): Explicitly exit with error when builder name or build time is missing.
789         Also, tolerate reports without any revision information.
790
791         (ReportProcessor::recursively_ensure_tests): When looking for a test, don't forget to compare its
792         parent test.
793
794         * tests/api-report.js: Added few test cases.
795
796 2013-04-26  Ryosuke Niwa  <rniwa@webkit.org>
797
798         Commit another change that was supposed to be committed in r50331.
799
800         * run-tests.js:
801         (TestEnvironment.this.postJSON):
802         (TestEnvironment.this.httpGet):
803         (sendHttpRequest):
804
805 2013-04-09  Ryosuke Niwa  <rniwa@webkit.org>
806
807         Commit the remaining files.
808
809         * public/admin/regenerate-manifest.php:
810         * public/include/admin-header.php:
811         * public/include/json-header.php:
812         * public/include/manifest.php:
813         * run-tests.js:
814         (TestEnvironment.this.postJSON):
815         (TestEnvironment.this.httpGet):
816         (sendHttpRequest):
817
818 2013-03-15  Ryosuke Niwa  <rniwa@webkit.org>
819
820         SafariPerfMonitor: Add some tests for admin/regenerate-manifest.
821
822         Reviewed by Ricky Mondello.
823
824         Added some tests for admin/regenerate-manifest.
825
826         * public/admin/regenerate-manifest.php: Use require_once instead of require.
827         * public/include/admin-header.php: Ditto.
828         * public/include/json-header.php: Ditto.
829
830         * public/include/manifest.php:
831         (ManifestGenerator::builders): Removed a reference to a non-existent variable.
832         When there are no builders, simply return an empty array.
833
834         * run-tests.js:
835         (TestEnvironment.postJSON):
836         (TestEnvironment.httpGet): Added.
837         (sendHttpRequest): Renamed from postHttpRequest as it now takes method as an argument.
838
839         * tests/admin-regenerate-manifest.js: Added with a bunch of test cases.
840
841 2013-03-14  Ryosuke Niwa  <rniwa@webkit.org>
842
843         Unreviewed. Added more tests for api/report to ensure it creates tests, metrics, test_runs,
844         and run_iterations. Also fixed a typo in report.php found by new tests.
845
846         * public/api/report.php:
847         (main): Fix a bug in the regular expression to wrap numbers with double quotations.
848         * tests/api-report.js: Added more test cases.
849
850 2013-03-12  Ryosuke Niwa  <rniwa@webkit.org>
851
852         <rdar://problem/13399038> SafariPerfMonitor: Need integration tests
853
854         Reviewed by Ricky Mondello.
855
856         Add a test runner script and some simple test cases.
857
858         * database/config.json: Added the configuration for "testServer".
859         * database/database-common.js:
860         (pathToTests): Added.
861         * run-tests.js: Added.
862         (main):
863
864         (confirmUserWantsDatabaseToBeInitializedIfNeeded): Checks whether there are any non-empty tables,
865         and if there are, asks the user if it’s okay to delete all of the data contained therein.
866         (confirmUserWantsDatabaseToBeInitializedIfNeeded.findNonEmptyTable): Find a table with non-zero
867         number of rows.
868         (confirmUserWantsDatabaseToBeInitializedIfNeeded.fetchTableNames): Fetch the list of all tables
869         in the current database using PostgreSQL's information_schema.
870         (askYesOrNoQuestion):
871
872         (initializeDatabase): Executes init-database.sql. It drops all tables and creates them again.
873
874         (TestEnvironment): The global object exposed in tests. Provides various utility functions.
875         (TestEnvironment.assert): Exposes assert to tests.
876         (TestEnvironment.console): Exposes console to tests.
877         (TestEnvironment.describe): Adds a description.
878         (TestEnvironment.it): Adds a test case.
879         (TestEnvironment.postJSON):
880         (TestEnvironment.queryAndFetchAll):
881         (TestEnvironment.sha256):
882         (TestEnvironment.notifyDone): Ends the current test case.
883
884         (postHttpRequest):
885
886         (TestContext): An object created for each test case. Conceptually, this object is always on
887         "stack" when a test case is running. TestEnvironment and an uncaughtException handler accesses
888         this object via currentTestContext.
889         (TestContext.description):
890         (TestContext.done):
891         (TestContext.logError):
892
893         * tests: Added.
894         * tests/api-report.js: Added some basic tests for /api/report.php.
895
896 2013-03-08  Ryosuke Niwa  <rniwa@webkit.org>
897
898         Unreviewed administrative page fix. Make it possible to remove all configuration from dashboard.
899
900         The problem was that we were detecting whether we're updating dashboard or not by checking
901         the existence of metric_configurations in $_POST but this key doesn't exist when we're removing
902         all configurations. Use separate 'dashboard' action to execute the code even when
903         metric_configurations is empty.
904
905         * public/admin/tests.php:
906
907 2013-03-08  Ryosuke Niwa  <rniwa@webkit.org>
908
909         SafariPerfMonitor: Extract a class to aggregate and store values from ReportProcessor.
910
911         Reviewed by Ricky Mondello.
912
913         This patch extracts TestRunsGenerator, which aggregates and compute caches of values,
914         from ReportProcessor as a preparation to replace deprecated aggregate.js.
915
916         * public/api/report.php:
917         (ReportProcessor::exit_with_error): Moved.
918         (ReportProcessor::process): Use the extracted TestRunsGenerator.
919         (TestRunsGenerator): Added.
920         (TestRunsGenerator::exit_with_error): Copied from ReportProcessor.
921         (TestRunsGenerator::add_aggregated_metric): Moved.
922         (TestRunsGenerator::add_values_for_aggregation): Moved. Made public.
923         (TestRunsGenerator::aggregate): Moved. Made public.
924         (TestRunsGenerator::aggregate_current_test_level): Moved.
925         (TestRunsGenerator::test_value_list_to_values_by_iterations): Moved.
926         (TestRunsGenerator::evaluate_expressions_by_node): Moved.
927         (TestRunsGenerator::compute_caches): Moved. Made public.
928         (TestRunsGenerator::add_values_to_commit): Moved. Made public.
929         (TestRunsGenerator::commit): Moved. Made public. Also takes build_id and platform_id.
930         (TestRunsGenerator::rollback_with_error): Moved.
931
932 2013-03-08  Ryosuke Niwa  <rniwa@webkit.org>
933
934         SafariPerfMonitor: Administrative pages should update manifest JSON as needed.
935
936         Reviewed by Remy Demarest.
937
938         Regenerate the manifest file when updating fields or adding new items that are included in
939         the manifest JSON.
940
941         * public/admin/bug-trackers.php:
942         * public/admin/builders.php:
943         * public/admin/regenerate-manifest.php:
944         * public/admin/repositories.php:
945         * public/admin/tests.php:
946         * public/include/admin-header.php:
947         (regenerate_manifest): Extracted from regenerate-manifest.php.
948
949 2013-03-08  Ryosuke Niwa  <rniwa@webkit.org>
950
951         Unreviewed build fix for memory test results.
952
953         Make aggregation work in the nested cases. We start from the "leaf" tests and move our ways up,
954         aggregating at each level.
955
956         * public/api/report.php:
957         (ReportProcessor::recursively_ensure_tests):
958         (ReportProcessor::add_aggregated_metric): Renamed from ensure_aggregated_metric.
959         (ReportProcessor::add_values_for_aggregation):
960         (ReportProcessor::aggregate):
961         (ReportProcessor::aggregate_current_test_level): Extracted from aggregate.
962
963 2013-03-02  Ryosuke Niwa  <rniwa@webkit.org>
964
965         Build fixes. iteration_count_cache should be the total number of values in all iteration group,
966         not the number of iteration groups. Also, don't set group number when the entire run belongs
967         a single iteration group.
968
969         * public/api/report.php:
970         (ReportProcessor::commit):
971
972 2013-03-01  Ryosuke Niwa  <rniwa@webkit.org>
973
974         SafariPerfMonitor: Introduce iteration groups
975
976         Reviewed by Remy Demarest.
977
978         In WebKit land, we're going to use multiple instances of DumpRenderTree or WebKitTestRunner to amortize
979         the runtime environment variances to get more stable results. And it's desirable to keep track of
980         the instance of DumpRenderTree or WebKitTestRunner used to generate each iteration value.
981
982         This patch introduces "iteration groups" to keep track of this extra information.
983
984         Instead of receiving a flat array of iteration values, we can now receive a two dimensional array where
985         the outer array denotes iteration groups and each inner array contains iteration values for each group.
986
987
988         * database/init-database.sql: Add iteration_group column.
989         * public/api/report.php:
990         (ReportProcessor::recursively_ensure_tests): Always use the two dimensional array internally.
991
992         (ReportProcessor::aggregate): test_value_list_to_values_by_iterations now returns an associative array
993         contains the list of values indexed by the iteration order and group sizes. Store the group size so
994         that we can restore the iteration groups before passing it to node.js and restore them later.
995
996         (ReportProcessor::test_value_list_to_values_by_iterations): Flatten iteration groups into an array
997         of values and construct group_size array to restore the groups later in ReportProcessor::aggregate.
998
999         Also check that each iteration group in each subtest are consistent with one another. To see why we need
1000         to do this, suppose we're aggregating two tests T1 and T2 with the following values. Then it's important
1001         that each iteration group in T1 and T2 have the same size:
1002         T1 = [[1, 2], [3, 4, 5]]
1003         T2 = [[6, 7], [8, 9, 10]]
1004
1005         so that the aggregated result (the sum in this case) can have the same groups as in:
1006         T  = [[7, 9], [11, 13, 15]]
1007
1008         If some iteration groups in T1 and T2 had a different size as in:
1009         T1 = [[1, 2, 3], [4, 5]]
1010         T2 = [[6, 7], [8, 9, 10]]
1011
1012         Then iteration groups of the aggregated T is ambiguous.
1013
1014         (ReportProcessor::compute_caches): Flatten iteration groups to compute caches (e.g. mean, stdev, etc...)
1015         (ReportProcessor::commit): Store iteration_group values.
1016
1017 2013-03-01  Ryosuke Niwa  <rniwa@webkit.org>
1018
1019         Unreviewed. Delete the migration tool for webkit-perf.appspot.com now that we have successfully
1020         migrated to perf.webkit.org.
1021
1022         * database/perf-webkit-migrator.js: Removed.
1023
1024 2013-03-01  Ryosuke Niwa  <rniwa@webkit.org>
1025
1026         Build fix. Don't forget to add metrics of the top level tests e.g. Dromaeo:Time:Arithmetic.
1027
1028         * public/index.html:
1029         (.showCharts):
1030
1031 2013-03-01  Ryosuke Niwa  <rniwa@webkit.org>
1032
1033         SafariPerfMonitor: Make it possible to add charts for all subtests or all platforms.
1034
1035         Reviewed by Ricky Mondello.
1036
1037         It is often desirable to see charts of a given test for all platforms, or to be able to see
1038         charts of all subtests on a given platform when trying to triage perf. regressions.
1039
1040         Support this use case by adding the ability to do so on the charts page.
1041
1042         Also, we used to disable items on the test list based on the platform chosen. This turned out
1043         to be a bad UI because in many situations you want to be able to compare results of the same test
1044         on multiple platforms.
1045
1046         In this new UI, we have three select elements, each of which selects the following:
1047         1. Top-level test - Test suite such as Dromaeo
1048         2. Metric - Pages and subtests under the suite such as www.webkit.org for dom-modify:Runs
1049            (where dom-modify is the name of the subtest and Runs is a metric in that subtest) for Dromaeo.
1050         3. Platform - Mountain Lion, Qt, etc...
1051
1052         A user can select "all" for metric and platform but we disallow doing both at once since adding
1053         all metrics on all platforms tends to add way too many charts and hang the browser. I also can't
1054         think of a use case where you want to look at that many charts at once. We can support this later
1055         if valid use cases come up.
1056
1057         * public/index.html:
1058         (.showCharts.addOption): Extracted.
1059         (.showCharts): Added "metricList" that shows the list of test and metrics (in the form of
1060         relative metrics paths such as "DOMWalk:Time") for each top-level test selected in testList.
1061         metricList has onchange handler that enables/disables items on platformList.
1062         
1063         (init): Sort tests and test metrics here instead of doing that in showCharts.
1064
1065 2013-02-28  Ryosuke Niwa  <rniwa@webkit.org>
1066
1067         <rdar://problem/13316756> SafariPerfMonitor: tooltip should include a link to build URLs
1068
1069         Reviewed by Remy Demarest and Ricky Mondello.
1070
1071         Added a hyperlink to build page in tooltips. Repeating the entire build URL in each build
1072         was a bad idea because it bloats the resultant JSON file too much. So move the build URL
1073         templates to the manifest file instead. Each build now only contains the builder id.
1074
1075         * public/api/runs.php: Removed the part of the query that joined builders table. This
1076         speeds up the query quite a bit.
1077
1078         * public/include/manifest.php:
1079         (ManifestGenerator::generate): Generate builders field.
1080         (ManifestGenerator::builders): Added. Returns an associative array of builder ids to an
1081         associative array that contains name and its build URL template.
1082
1083         * public/index.html:
1084         (.buildLabelWithLinks.linkifyIfNotNull): Renamed from linkifiedLabel. Take a label and url
1085         instead of a revision since this function is used for revisions and build page URLs now.
1086         (.buildLabelWithLinks): Include the linkified build number.
1087
1088         * public/js/helper-classes.js:
1089         (TestBuild.builder): Added.
1090         (TestBuild.buildNumber): Added.
1091         (TestBuild.buildUrl): Returns the build URL. The variable name in the URL template has been
1092         changed from %s to $buildNumber to be more descriptive and consistent with other URL templates.
1093
1094 2013-02-27  Ryosuke Niwa  <rniwa@webkit.org>
1095
1096         Tooltips interfere with user interactions
1097
1098         Rubber-stamped by Simon Fraser.
1099
1100         Disable tooltip on the dashboard page since graphs are too small to be useful there.
1101         Also, show graphs for only 10 days by default as opposed to 20.
1102         Finally, dismiss the hovering tooltip when mouse enters a "pinned" tooltip.
1103
1104         * public/index.html:
1105         * public/js/helper-classes.js:
1106
1107 2013-02-24  Ryosuke Niwa  <rniwa@webkit.org>
1108
1109         Fix some serious typo. We're supposed to be using SHA-256, not SHA-1 to hash our passwords,
1110         to be compatible with webkit-perf.appspot.com.
1111
1112         * public/admin/builders.php:
1113         * public/api/report.php:
1114
1115 2013-02-23  Ryosuke Niwa  <rniwa@webkit.org>
1116
1117         Unreviewed.
1118
1119         Add a missing constraint on builds table. For a given builder, there should be exactly
1120         one build for a given build number.
1121
1122         Also add report_committed_at to reports table to record the time at which a given report
1123         was processed and test_runs and run_iterations rows were committed into the database.
1124
1125         * database/config.json:
1126         * public/api/report.php:
1127
1128 2013-02-22  Ryosuke Niwa  <rniwa@webkit.org>
1129
1130         Unreviewed. Add more checks for empty SQL query results.
1131
1132         * public/include/manifest.php:
1133
1134 2013-02-21  Ryosuke Niwa  <rniwa@webkit.org>
1135
1136         More build fixes on perf.webkit.org.
1137
1138         * public/api/runs.php: Make PostgreSQL happier.
1139         * public/include/manifest.php: Don't assume we always have bug trackers.
1140
1141 2013-02-21  Ryosuke Niwa  <rniwa@webkit.org>
1142
1143         SafariPerfMonitor: index.html duplicates the code in PerfTestRuns to determine smallerIsBetter
1144         and fix other miscellaneous UI bugs.
1145
1146         Rubber-stamped by Simon Fraser.
1147
1148         Removed the code to determine whether smaller value is better or not for a given test in index.html
1149         in the favor of using that of PerfTestRuns.
1150
1151         * public/include/manifest.php: Fixed a typo.
1152         * public/index.html:
1153         (Chart):
1154         (Chart.attachMainPlot): Fixed a bug to access previousPoint.left even when previousPoint is null.
1155
1156         * public/js/helper-classes.js:
1157         (PerfTestRuns): Added EndAllocations, MaxAllocations, and MeanAllocations.
1158
1159         (PerfTestRuns.computeScalingFactorIfNeeded): When the mean is almost 10,000 units, we may end up
1160         using 5 digits instead of 4, resulting in the use of scientific notations. Go up to the next unit
1161         at roughly 2,000 units to avoid this.
1162
1163         (Tooltip.show): Show the tooltip even when the new content is identical to the previous content.
1164         The only thing we can avoid is innerHTML.
1165
1166 2013-02-21  Ryosuke Niwa  <rniwa@webkit.org>
1167
1168         Another build fix. The path to node is /usr/local/bin/node, not /usr/bin/local/node
1169
1170         * public/include/evaluator.js:
1171
1172 2013-02-21  Ryosuke Niwa  <rniwa@webkit.org>
1173
1174         <rdar://problem/13267898> SafariPerfMonitor: Bug trackers should be configurable
1175
1176         Reviewed by Remy Demarest.
1177
1178         Made the list of bug trackers configurable. Namely, each bug tracker can be added in
1179         admin/bug-trackers.php and can be associated with multiple repositories.
1180
1181         The association between bug trackers and repositories (such as WebKit, Safari, etc...) are used
1182         to determine the set of bug trackers to show for a given set of blame lists.
1183         e.g. if a test regressed due to a change in Safari, then we don't want to show WebKit Bugzilla as
1184         a place to file bugs against the regression.
1185 F
1186         * database/init-database.sql: Added bug_trackers and tracker_repositories.
1187         Also drop those tables before creating them (note "DROP TABLE reports" was missing).
1188
1189         * public/admin/bug-trackers.php: Added. The administrative interface for adding and managing
1190         bug trackers, namely associated repositories.
1191
1192         * public/include/admin-header.php: Added a link to bug-trackers.php
1193         * public/include/manifest.php:
1194         (ManifestGenerator::generate): Include the list of bug trackers in the manifest.
1195         Also moved the code to fetch repositories table here from ManifestGenerator::repositories.
1196
1197         (ManifestGenerator::repositories):
1198
1199         (ManifestGenerator::bug_trackers): Added. Generates an associative array of bug trackers where
1200         keys are names of bug trackers and values are associative arrays with keys 'new_bug_url' and
1201         'repositories' where the latter contains the list of associated repository names.
1202
1203         * public/index.html:
1204         (Chart): Takes bugTrackers as as argument.
1205         (Chart.showTooltipWithResults): Removed the hard-coded list.
1206         (init):
1207         (init.addPlatformsToDashboard):
1208         (init.showCharts.createChartFromListPair):
1209         (init): Stores the list of bug trackers in the manifest to a local variable.
1210
1211 2013-02-21  Ryosuke Niwa  <rniwa@webkit.org>
1212
1213         A follow up on the previous build fix. When using proc_open, we need to make evalulator.js executable.
1214
1215         * public/include/evaluator.js:
1216
1217 2013-02-21  Ryosuke Niwa  <rniwa@webkit.org>
1218
1219         SafariPerfMonitor: Extract the code to generate tabular view in administrative pages
1220
1221         Reviewed by Remy Demarest.
1222
1223         Extracted AdministrativePage to share the code to generate a tabular view of data and a form to insert
1224         new row into the database.
1225
1226         * public/admin/aggregators.php: Use AdministrativePage.
1227         * public/admin/builders.php: Ditto.
1228         * public/admin/repositories.php: Ditto.
1229         * public/include/admin-header.php:
1230         (AdministrativePage): Added.
1231         (AdministrativePage::__construct): column_info is an associative array that maps a SQL column name
1232         to an associative array that describes the column.
1233             - editing_mode: Specifies the type of form ('text', 'url', or 'string') to show for this column.
1234             - label: Human readable name of the column.
1235             - pre_insertion: Signifies that this column exists only before the row is inserted. e.g. password
1236               column exists only before we create password_hash column at the insertion time.
1237
1238         (AdministrativePage::name_to_titlecase): Converts an underscored lowercase name to a human readable
1239         titlecase (e.g. new_bug is converted to New Bug).
1240         (AdministrativePage::column_label): Obtains the label specified in column_info or titlecased column name.
1241         (AdministrativePage::render_form_control_for_column): "Renders" a text form control such as input and
1242         textarea for a given editing mode ('text', 'url', or 'string').
1243         (AdministrativePage::render_table): Renders a whole SQL table after sorting rows by the specified column.
1244         (AdministrativePage::render_form_to_add): Renders a form to insert new row.
1245
1246 2013-02-20  Ryosuke Niwa  <rniwa@webkit.org>
1247
1248         Build fix. Some systems don't support r+. Use proc_open instead.
1249
1250         * public/api/report.php:
1251
1252 2013-02-15  Ryosuke Niwa  <rniwa@webkit.org>
1253
1254         Build fix. Use the mean data series as supposed to upper or lower confidence bounds
1255         when computing the y-axis of data points to show tooltips at.
1256
1257         * public/index.html:
1258
1259 2013-02-15  Ryosuke Niwa  <rniwa@webkit.org>
1260
1261         Unreviewed. Removed .htaccess in favor of directly putting directives in httpd.conf.
1262
1263         * Install.md:
1264         * public/.htaccess: Removed.
1265
1266 2013-02-14  Ryosuke Niwa  <rniwa@webkit.org>
1267
1268         Unreviewed.
1269
1270         * public/include/manifest.php: Build fix. db is on this.
1271         * public/js/statistics.js:
1272         (Statistics.confidenceInterval): Added. An utility function for debugging purposes.
1273
1274 2013-02-13  Ryosuke Niwa  <rniwa@webkit.org>
1275
1276         <rdar://problem/13165667> SafariPerfMonitor doesn't work on perf.webkit.org (Part 2)
1277
1278         Reviewed by Anders Carlsson.
1279
1280         Rewrote and merged populate-from-report.js into report.php.
1281
1282         * database/config.json: Added a path to node.js.
1283
1284         * database/init-database.sql: Don't require unit to be always present since it's no longer used by the front end.
1285         Once we land this patch and update the administrative pages, we can remove this column.
1286
1287         Also add a new reports table to store JSON reported by builders. We used to store everything in jobs table but
1288         that table is going away once we remove the node.js backend.
1289
1290         * database/populate-from-report.js: Removed.
1291         * public/api/report.php: Added.
1292         (ReportProcessor):
1293         (ReportProcessor.__construct):
1294         (ReportProcessor.process):
1295
1296         (ReportProcessor.store_report_and_get_build_data): We store the report into the database as soon as it has been
1297         verified to be submitted by a known builder.
1298
1299         (ReportProcessor.exit_with_error): Store the error message and details in the database if the report had been
1300         stored. If not, then notify that to the client via 'failureStored' in the JSON response.
1301         (ReportProcessor.resolve_build_id): Insert build and build_revisions rows if needed. We don't do this atomically
1302         inside a transaction because there could be multiple reports for a single build, each containing results for
1303         different tests.
1304
1305         (ReportProcessor.recursively_ensure_tests): Parse a tree of tests and insert tests and test_metrics rows as
1306         needed. It also computes the metrics to aggregate and prepares values to commit via ensure_aggregated_metric,
1307         add_values_to_commit, and add_values_for_aggregation.
1308
1309         (ReportProcessor.is_list_of_aggregators): When a metric is an aggregation, it contains an array of aggregator
1310         names, e.g. ["Arithmetic", "Geometric"], instead of a dictionary of configuration types to their values,
1311         e.g. {Time: {current: [1, 2, 3,]}}. This function detects the former. (Note that dictionary and list are both
1312         array's in PHP).
1313
1314         (ReportProcessor.ensure_aggregated_metric): Create a metric with aggregator to add it to the list of metrics
1315         to be aggregated in ReportProcessor.aggregate.
1316
1317         (ReportProcessor.add_values_for_aggregation): Called by test metrics with aggregated parent test metrics.
1318
1319         (ReportProcessor.aggregate): Compute results for aggregated metrics. Consider a matrix with rows representing
1320         child tests and columns representing "iterations" for a given aggregated metrics M. Initially, we have values
1321         given for each row (child metrics of M). This function extracts each column (iteration) via
1322         test_value_list_to_values_by_iterations, and feeds it into evaluate_expressions_by_node to get aggregated values
1323         for each column (iteration of M). Finally, it registers those aggregated values to be committed.
1324
1325         Note that we don't want to start a new node.js process for each aggregation, so we accumulate all values to be
1326         aggregated in node.js in $expressions. Each entry in $expressions is a JSON string that contains code and
1327         values to be aggregated. node.js gives us back a list of JSON strings that contain aggregated values.
1328
1329         (ReportProcessor.test_value_list_to_values_by_iterations): See above.
1330         (ReportProcessor.evaluate_expressions_by_node): See above.
1331
1332         (ReportProcessor.compute_caches): Compute cached mean, sum, and square sums for each run we're about to add
1333         using evaluate_expressions_by_node. We can't do this before computing aggregated results since those aggregated
1334         results also need the said caches.
1335
1336         (ReportProcessor.add_values_to_commit):
1337
1338         (ReportProcessor.commit): Add test_runs and run_iterations atomically inside a transaction, rolling back
1339         the transaction as needed if anything goes wrong.
1340
1341         (ReportProcessor.rollback_with_error)
1342         (main):
1343         * public/include/db.php:
1344         (Database.prepare_params): Use $values (instead of $placeholders) to compute the current index since
1345         placeholders ($1, $2, etc...) may be split up into multiple arrays given they may not necessarily show up
1346         contiguously in a SQL statement.
1347
1348         (Database.select_or_insert_row): Added. Selects a row if the attempt to insert the same row fails. It
1349         automatically creates a query string from a dictionary of unprefixed column names and table. It returns
1350         a column value of the choice.
1351
1352         (Database.begin_transaction): Added.
1353         (Database.commit_transaction): Added.
1354         (Database.rollback_transaction): Added.
1355
1356         * public/include/evaluator.js: Added.
1357         * public/include/json-header.php:
1358         (exit_with_error): Take error details and merge it with "additional details". This allows report.php to provide
1359         context under which the request failed.
1360         (successful_exit): Merge "additional details".
1361         (set_exit_detail): Added. Sets "additional details" to the JSON returned by exit_with_error or successful_exit.
1362         (merge_additional_details):
1363
1364 2013-02-12  Ryosuke Niwa  <rniwa@webkit.org>
1365
1366         SafariPerfMonitor: Add more helper functions to db.php
1367
1368         Reviewed by Remy Demarest.
1369
1370         Added Database::insert_row and array_get to make common database operations easier.
1371
1372         * public/admin/aggregators.php: Use Database::insert_row instead of
1373         execute_query_and_expect_one_row_to_be_affected.
1374
1375         * public/admin/builders.php: Ditto.
1376
1377         * public/admin/tests.php: Ditto; We used to run a separate SELECT query just to get the id after
1378         inserting a row. With insert_row, we don't need that.
1379
1380         * public/include/admin-header.php: Ditto.
1381
1382         * public/include/db.php:
1383         (array_get): Added. It returns the value of an array given a key if the key exists; otherwise
1384         return the default value (defaults to NULL) if the key doesn't exist.
1385
1386         (Database::column_names): Added. Prefixes an array of column names and creates a comma separated
1387         list of the names.
1388
1389         (Database::prepare_params): Added. Takes an associative array of column names and their values,
1390         and builds up arrays for placeholder (e.g. $1, $2, etc...) and values, then returns an array of
1391         column names all in the same order.
1392
1393         (Database::insert_row): Added. Inserts a new row into the specified table where column names have
1394         the given prefix. Values are given in a form of an associative array where keys are unprefixed
1395         column names and values are corresponding values. When the row is successfully inserted, it returns
1396         the specified column's value (defaults to prefix_id). If NULL is specified, it returns a boolean
1397         indicating the success of the insertion.
1398
1399 2013-02-11  Ryosuke Niwa  <rniwa@webkit.org>
1400
1401         <rdar://problem/13165667> SafariPerfMonitor doesn't work on perf.webkit.org (Part 1)
1402
1403         Reviewed by Conrad Shultz.
1404
1405         Rewrote the manifest generator in PHP.
1406
1407         * database/generate-manifest.js: Removed.
1408         * public/admin/regenerate-manifest.php: Added. Use ManifestGenerator to generate and store the manifest.
1409         * public/include/db.php:
1410         (array_ensure_item_has_array): Added.
1411         * public/include/evaluator.js: Added.
1412         * public/include/json-header.php:
1413         * public/include/manifest.php: Added.
1414
1415 2013-02-11  Ryosuke Niwa  <rniwa@webkit.org>
1416
1417         Dates on overflow plot are overlapping
1418
1419         Rubber-stamped by Simon Fraser.
1420
1421         Don't show more than 5 days.
1422
1423         * public/index.html:
1424         * public/js/helper-classes.js:
1425         (TestBuild.UTCtoPST):
1426         (TestBuild.now):
1427
1428 2013-02-07  Ryosuke Niwa  <rniwa@webkit.org>
1429
1430         Show build time as well as commit time on the dashboard and tooltips.
1431
1432         Rubber-stamped by Simon Fraser.
1433
1434         Include both the maximum commit time and build time in buildLabelWithLinks.
1435         Also use ISO format to save the screen real estate.
1436
1437         * public/index.html:
1438         (buildLabelWithLinks):
1439         * public/js/helper-classes.js:
1440         (TestBuild):
1441         (TestBuild.buildTime):
1442         (TestBuild.formattedBuildTime):
1443
1444 2013-02-08  Ryosuke Niwa  <rniwa@webkit.org>
1445
1446         Unreviewed; Convert metric.name to metric.unit in the front end.
1447
1448         * public/js/helper-classes.js:
1449
1450 2013-02-07  Ryosuke Niwa  <rniwa@webkit.org>
1451
1452         <rdar://problem/13166276> SafariPerfMonitor: Need hyperlinks to file bugs
1453
1454         Rubber-stamped by Simon Fraser.
1455
1456         This patch adds hyperlinks to file new bugs on Radar and WebKit Bugzilla. Because we want to include information
1457         such as the degree of progression or regression and the regression ranges when filing new bugs, broke various
1458         label() functions into smaller pieces to be used in both generating tooltips and the hyperlinks.
1459
1460         * public/index.html:
1461         (.buildLabelWithLinks): Extracted from TestBuild.label.
1462         (.showTooltipWithResults): Extracted from Tooltip.show. Also added the code to generate hyperlinks to file new bugs
1463         on Radar and WebKit Bugzilla.
1464         * public/js/helper-classes.js:
1465         (PerfTestResult.metric): Replaced test() as runs.test() no longer exists.
1466         (PerfTestResult.isBetterThan): Added.
1467         (PerfTestResult.formattedRelativeDifference): Extracted from PerfTestResult.label.
1468         (PerfTestResult.formattedProgressionOrRegression): Ditto. Also use "better" and "worse" instead of arrow symbols
1469         to indicate progressions or regressions.
1470         (PerfTestResult.label):
1471         (TestBuild.formattedTime): Added.
1472         (TestBuild.platform): Added.
1473         (TestBuild.formattedRevisions): Extracted from TestBuild.label. Merged a part of linkifyLabel.
1474         (TestBuild.smallerIsBetter): Added.
1475         (Tooltip.show): Take a raw markup instead of two results.
1476
1477 2013-02-06  Ryosuke Niwa  <rniwa@webkit.org>
1478
1479         <rdar://problem/13151520> SafariPerfMonitor: Dashboard can cause excessive horizontal scrolling when there are many platforms
1480
1481         Rubber-stamped by Tim Horton.
1482
1483         Stack platforms when there are more than 3 of them since making the layout adaptive is tricky
1484         since each platform may have a different number of tests to be shown on the dashboard.
1485
1486         * public/index.html:
1487
1488 2013-02-05  Ryosuke Niwa  <rniwa@webkit.org>
1489
1490         Build fix. Don't prefix a SVn revision with 'r' when constructing a changeset / blame URL.
1491
1492         * public/js/helper-classes.js:
1493         (TestBuild.label):
1494
1495 2013-02-05  Ryosuke Niwa  <rniwa@webkit.org>
1496
1497         SafariPerfMonitor: repository names or revisions are double-quoted when they contain a space
1498
1499         Rubber-stamped by Tim Horton.
1500
1501         The bug was in the PHP code that parsed Postgres array. Trim double quotations as needed.
1502
1503         Also fixed a bug in TestBuild where we used to show the revision range as r1234-1250 when
1504         the revision r1234 was the revision used in the previous build.
1505
1506         * public/api/runs.php:
1507         (parse_revisions_array): Trim double quotations around repository names and revisions.
1508         * public/js/helper-classes.js:
1509         (TestBuild.label):
1510
1511 2013-02-05  Ryosuke Niwa  <rniwa@webkit.org>
1512
1513         <rdar://problem/13151558> SafariPerfMonitor: Tooltip is unusable
1514
1515         Rubber-stamped by Tim Horton.
1516
1517         * public/index.html:
1518         (Chart.attachMainPlot): Disable auto highlighting (circle around a data point that shows up on hover)
1519         on the dashboard page as it's way too noisy.
1520
1521         (Chart.hideTooltip): Added. Hides the tooltip that shows up on hover.
1522
1523         (.toggleClickTooltip): Extracted from the code for "mouseout" bind (now replaced by "mouseleave").
1524         Pins or unpins a tooltip. When pinning a tooltip, we create a tooltip behind the scene and show that
1525         so that the tooltip for hover can be reused further.
1526
1527         (.closestItemForPageX): Find the closest item given pageX. We iterate data points from left to right,
1528         and find the first point that lies on the right of the cursor position. We then compute the midpoint
1529         between this and the previous point and pick the closer of the two. It returns an item-like object
1530         that has all properties we need since flot doesn't provide an API to retrieve the real item object.
1531
1532         (Chart): Call toggleClickTooltip when a (hover) tooltip is clicked.
1533
1534         (Chart.attach): In "plothover" bind, call closestItemForPageX when item is not provided by flot on
1535         the first or "current" data points (as opposed to target or baseline data points).
1536
1537         Also bind the code to clear crosshair and hide tooltips to "mouseleave" instead of "mouseout", and
1538         avoid triggering this code when the cursor is still within the plot's rectangle (e.g. when a cursor
1539         moves onto a tooltip) to avoid the premature dismissal of a tooltip.
1540
1541         * public/js/helper-classes.js:
1542         (Tooltip.ensureContainer): Don't automatically close then the user clicks on tooltip. Delegate this
1543         work to the client via bindClick.
1544
1545         (Tooltip.show): Move tooltip up by 5px. Also added a FIXME to move this offset computation to the client.
1546
1547         (Tooltip.bindClick): Added.
1548
1549 2013-02-03  Ryosuke Niwa  <rniwa@webkit.org>
1550
1551         Yet another build fix. metricId*s*.
1552
1553         * public/admin/tests.php:
1554
1555 2013-02-03  Ryosuke Niwa  <rniwa@webkit.org>
1556
1557         Another build fix. Use the new payload format for the aggregate job.
1558
1559         * public/admin/tests.php:
1560
1561 2013-02-03  Ryosuke Niwa  <rniwa@webkit.org>
1562
1563         Build fixes.
1564
1565         * database/aggregate.js: Use variables that actually exist.
1566         * database/database-common.js:
1567         (ensureConfigurationIdFromList): Add the newly added configuration to the list so that subsequent
1568         function calls will find this configuration.
1569
1570 2013-01-31  Ryosuke Niwa  <rniwa@webkit.org>
1571
1572         <rdar://problem/13130139> SafariPerfMonitor: Add ReadMe
1573
1574         Reviewed by Ricky Mondello.
1575
1576         Turned InstallManual into a proper markdown document and added ReadMe.md.
1577
1578         * InstallManual: Removed.
1579         * InstallManual.md: Moved from InstallManual.
1580         * ReadMe.md: Added.
1581
1582 2013-01-31  Ryosuke Niwa  <rniwa@webkit.org>
1583
1584         <rdar://problem/13109335> SafariPerfMonitor: Add baseline and target lines
1585
1586         Reviewed by Ricky Mondello.
1587
1588         This patch prepares the front end code to process baseline and target results properly.
1589
1590         * public/index.html:
1591         (fetchTest.createRunAndResults): Extracted.
1592         (fetchTest): Call createRunAndResults on current, baseline, and target values of the JSON.
1593         Deleted the comment about how sorting will be unnecessary once we start results in the server side
1594         since sorting by the maximum revision commit time turned out to be non-trivial in php.
1595
1596 2013-01-29  Ryosuke Niwa  <rniwa@webkit.org>
1597
1598         <rdar://problem/13057071> SafariPerfMonitor: Use newer version of flot that supports timezone properly
1599
1600         Reviewed by Tim Horton.
1601
1602         Use flot at https://github.com/flot/flot/commit/ec168da2cb8619ebf59c7e721d12c44a7960ff41.
1603         These files are "dynamically linked" to our app.
1604
1605         * public/index.html:
1606         * public/js/jquery-1.8.2.min.js: Removed.
1607         * public/js/jquery.colorhelpers.js: Added.
1608         * public/js/jquery.flot.categories.js: Added.
1609         * public/js/jquery.flot.crosshair.js: Added.
1610         * public/js/jquery.flot.errorbars.js: Added.
1611         * public/js/jquery.flot.fillbetween.js: Added.
1612         * public/js/jquery.flot.js: Added.
1613         * public/js/jquery.flot.min.js: Removed.
1614         * public/js/jquery.flot.navigate.js: Added.
1615         * public/js/jquery.flot.resize.js: Added.
1616         * public/js/jquery.flot.selection.js: Added.
1617         * public/js/jquery.flot.stack.js: Added.
1618         * public/js/jquery.flot.symbol.js: Added.
1619         * public/js/jquery.flot.threshold.js: Added.
1620         * public/js/jquery.flot.time.js: Added.
1621         * public/js/jquery.js: Added.
1622
1623 2013-01-29  Ryosuke Niwa  <rniwa@webkit.org>
1624
1625         Return NaN instead of throwing when there aren't enough samples.
1626
1627         Reviewed by Sam Weinig.
1628
1629         It's better to return NaN when we don't have enough samples so that we can treat it
1630         as if we don't have any confidence interval.
1631
1632         * public/js/statistics.js:
1633         (Statistics.new):
1634
1635 2013-01-28  Ryosuke Niwa  <rniwa@webkit.org>
1636
1637         Build fix. Apparently Safari sometimes appends / at the end of hash location. Remove that.
1638
1639         * public/js/helper-classes.js:
1640         (URLState.parseIfNeeded):
1641
1642 2013-01-28  Ryosuke Niwa  <rniwa@webkit.org>
1643
1644         <rdar://problem/13081582> SafariPerfMonitor: Always use parameterized SQL functions in php code
1645
1646         Reviewed by Ricky Mondello.
1647
1648         Parameterized execute_query_and_expect_one_row_to_be_affected and updated the code accordingly.
1649
1650         * public/admin/aggregators.php: Use heredoc.
1651         * public/admin/builders.php:
1652         * public/admin/jobs.php:
1653         * public/admin/repositories.php:
1654         * public/admin/tests.php: Updated the forms to use unprefixed field names to match other pages.
1655         This allows us to use update_field when updating test's url and metric's unit. Changed the action
1656         to regenerate aggregated matrix from "update" to "add" to simplify the dependencies in if-else.
1657         Also removed a stray code to update unit and url simultaneously since it's never used.
1658         * public/include/admin-header.php:
1659         (execute_query_and_expect_one_row_to_be_affected): Added $params. Also automatically convert
1660         empty strings to NULL as it was previously done via $db->quote_string_or_null_if_empty in callers.
1661         (update_field): Moved from repositories.php.
1662         (add_job):
1663         * public/include/db.php:
1664         (quote_string_or_null_if_empty): Removed now that nobody uses this function.
1665
1666 2013-01-25  Ryosuke Niwa  <rniwa@webkit.org>
1667
1668         Build fixes. Treat mean, sum, and square sum as float, not int.
1669
1670         Also use 95% confidence interval instead of 90% confidence interval.
1671
1672         * public/api/runs.php:
1673         * public/js/helper-classes.js:
1674         (.this.confidenceIntervalDelta):
1675
1676 2013-01-24  Ryosuke Niwa  <rniwa@webkit.org>
1677
1678         Add an administrative page to edit repository information.
1679
1680         Reviewed by Ricky Mondello.
1681
1682         * public/admin/repositories.php: Added.
1683         * public/include/admin-header.php:
1684
1685 2013-01-23  Ryosuke Niwa  <rniwa@webkit.org>
1686
1687         <rdar://problem/13067539> SafariPerfMonitor: Automatically create aggregated metrics from builder reports
1688
1689         Reviewed by Ricky Mondello.
1690
1691         Auto-create aggregated matrix such as arithmetic means and geometric means as requested and add a job
1692         to aggregate results for those matrix in populate-from-report.js.
1693
1694         * database/generate-manifest.js:
1695         (.): Include aggregator names such as Arithmetic and Geometric in the list of metrics.
1696         * database/init-database.sql: Remove an erroneous unique constraint. There could be multiple matrix that share
1697         the same test and name (e.g. Dromaeo, Time) with different aggregators (e.g. Arithmetic and Geometric).
1698         * database/populate-from-report.js:
1699         (main):
1700         (getReport): No change even though the diff looks as if it moved.
1701         (processReport): Extracted from main. Fetch the list of aggregators, pass that to recursivelyEnsureTestsIdsAndMetricsIds
1702         to obtain the list of aggregated metrics (such as arithmetic means) that need to be passed to aggregate.js
1703         (scheduleJobs): Extracted from processReport. Add a job to aggregate results.
1704         (recursivelyEnsureTestsIdsAndMetricsIds): When a metric is a list of names, assume them as aggregator names,
1705         and add corresponding metrics for them. Note we convert those names to ids using the dictionary we obtained
1706         in processReport.
1707         (ensureMetricId): Take an aggregator id as an argument.
1708         * database/process-jobs.js: Support multiple metric ids and build id. Note that aggregate.js aggregates results
1709         for all builds when the build id is not specified.
1710         * public/admin/tests.php:
1711         * public/index.html: Include the aggregator name in the full name since there could be multiple metrics
1712         of the same name with different aggregators.
1713
1714 2013-01-22  Ryosuke Niwa  <rniwa@webkit.org>
1715
1716         Build fix. Don't pass in arguments to in the wrong order.
1717
1718         * database/aggregate.js:
1719
1720 2013-01-21  Ryosuke Niwa  <rniwa@webkit.org>
1721
1722         <rdar://problem/13057110> SafariPerfMonitor: x-axis is messed up
1723
1724         Reviewed by Ricky Mondello.
1725
1726         Since the version of flot we use doesn't support showing graphs in the current locate or
1727         in a specific timezone, convert all timestamps to PST manually (Date's constructor will still
1728         treat them as in UTC). We don't want to use the current locate because other websites on
1729         webkit.org assume PST.
1730
1731         Also append this information to build's label.
1732
1733         * public/js/helper-classes.js:
1734         (TestBuild):
1735         (TestBuild.label):
1736
1737 2013-01-21  Ryosuke Niwa  <rniwa@webkit.org>
1738
1739         Store test URLs reported by builders.
1740
1741         Reviewed by Ricky Mondello.
1742
1743         * database/populate-from-report.js:
1744         (recursivelyEnsureTestsIdsAndMetricsIds): Pass in the test url.
1745         (ensureTestId): Store the URL.
1746
1747 2013-01-20  Ryosuke Niwa  <rniwa@webkit.org>
1748
1749         Yet another build fix; don't blow up even if we didn't have any test configurations.
1750
1751         * public/admin/tests.php:
1752
1753 2013-01-21  Ryosuke Niwa  <rniwa@webkit.org>
1754
1755         Build fix; don't instantiate Date when a timestamp wasn't provided.
1756
1757         * database/populate-from-report.js:
1758
1759 2013-01-18  Ryosuke Niwa  <rniwa@webkit.org>
1760
1761         Rename SafariPerfDashboard to SafariPerfMonitor and add a install manual.
1762
1763         Reviewed by Tim Horton.
1764
1765         Added an install manual.
1766
1767         * InstallManual: Added.
1768
1769 2012-12-21  Ryosuke Niwa  <rniwa@webkit.org>
1770
1771         Minor build fix. Don't unset builderPassword when it's not set.
1772
1773         * public/api/report.php:
1774
1775 2012-12-18  Ryosuke Niwa  <rniwa@webkit.org>
1776
1777         Prettify JSON payloads and make very large payloads not explode the table in jobs.php.
1778
1779         Reviewed by Ricky Mondello.
1780
1781         * public/admin/admin.css: Make a very large payload scrollable.
1782         * public/admin/jobs.php: Format JSONs.
1783
1784 2012-12-19  Ryosuke Niwa  <rniwa@webkit.org>
1785
1786         <rdar://problem/12897424> SafariPerfMonitor: Add ability to report results from bots
1787
1788         Reviewed by Ricky Mondello.
1789
1790         Add report.php and populate-from-report.js that process JSON files submitted by builders.
1791
1792         * database/populate-from-report.js: Added.
1793         (main):
1794         (getReport): Obtains the payload (the actual report) from "jobs" table.
1795         (recursivelyEnsureTestsIdsAndMetricsIds): "reports.tests" contain a tree of tests, test metrics,
1796         and their results. This function recursively traverses tests and metrics and ensure their ids.
1797         (ensureTestId):
1798         (metricToUnit): Maps a metric name to a unit. This should really be done in the client side since
1799         there is no point in storing unit given that every metric maps to exactly one unit (i.e. the mapping
1800         is a "function" in mathematical sense).
1801         (ensureMetricId):
1802         (ensureRepositoryIdsForAllRevisions):
1803         (getIdOrCreateBuildWithRevisions):
1804         (ensureBuildIdAndRevisions): Obtains a build id given a builder name, a build number, and a build time
1805         if one already exists. If not, then inserts a new build and corresponding revisions information (e.g.
1806         build 123 may contain WebKit revision r456789). We don't retrieve rows for revisions since we don't use
1807         it elsewhere.
1808         (insertRun): Insert new rows into "test_runs" and "run_iterations" tables, thereby recording the new
1809         test results all in a single transaction. This allows us to keep the database consistent in that either
1810         a build has been reported or not at least in "test_runs" and "run_iterations" tables. It'll be ideal if
1811         we could do the same for "builds" and "build_revisions" but that's not a hard requirement as far as
1812         other parts of the application are concerned.
1813         (scheduleQueriesToInsertRun):
1814         * database/process-jobs.js: Add a call to populate-from-report.js.
1815         * public/api/report.php: Added. Adds a new job named "report" to be processed by populate-from-report.js.
1816         * public/include/db.php: Support parameterized query.
1817         * public/include/json-header.php: Always include 'status' in the response so that builder submitting
1818         a test result could confirm that the submission indeed succeeded.
1819
1820 2012-12-18  Ryosuke Niwa  <rniwa@webkit.org>
1821
1822         Rename get(Id)OrCreate*(Id) to ensure*Id as suggested by Ricky on one of his code reviews.
1823
1824         * database/aggregate.js:
1825         * database/database-common.js:
1826         (selectColumnCreatingRowIfNeeded):
1827         (ensureRepositoryId):
1828         (ensureConfigurationIdFromList):
1829         * database/perf-webkit-migrator.js:
1830         (.migrateStat.):
1831         (.migrateStat):
1832         (getOrCreateBuildId):
1833
1834 2012-12-17  Ryosuke Niwa  <rniwa@webkit.org>
1835
1836         Extract commonly-used functions from aggregate.js and perf-webkit-migrator.js.
1837
1838         Reviewed by Ricky Mondello.
1839
1840         As a preparation to add report.js that processes a JSON file submitted by bots, extract various functions
1841         and classes from aggregate.js and perf-webkit-migrator.js to be shared.
1842
1843         * database/aggregate.js: Extracted TaskQueue and SerializedTaskQueue into utility.js.
1844         (main):
1845         (processBuild):
1846         (saveAggregatedResults):
1847         * database/database-common.js:
1848         (getIdOrCreatePlatform): Extracted from webkit-perf-migrator.js.
1849         (getIdOrCreateRepository): Ditto.
1850         (getConfigurationsForPlatformAndMetrics): Renamed from fetchConfigurations. Extracted from aggregator.js.
1851         (getIdFromListOrInsertConfiguration): Renamed from getOrInsertConfiguration. Extracted from aggregator.js.
1852         * database/perf-webkit-migrator.js:
1853         * database/utility.js: Added.
1854         (TaskQueue): Extracted from aggregator.js. Fixed a bug that prevented tasks added after start() is called
1855         from being executed.
1856         (TaskQueue.startTasksInQueue): Execute remaining tasks without serializing them. If the queue is empty,
1857         call the callback passed into start().
1858         (TaskQueue.taskCallback): The function each task calls back. Decrement the counter and call statTasksInQueue.
1859         (TaskQueue.addTask):
1860         (TaskQueue.start):
1861         (SerializedTaskQueue): Unlike TaskQueue, this class executes each task sequentially.
1862         (SerializedTaskQueue.executeNextTask):
1863         (SerializedTaskQueue.addTask):
1864         (SerializedTaskQueue.start):
1865
1866 2012-12-18  Ryosuke Niwa  <rniwa@webkit.org>
1867
1868         Revert erroneously committed changes.
1869
1870         * database/config.json:
1871
1872 2012-12-18  Ryosuke Niwa  <rniwa@webkit.org>
1873
1874         aggregator.js should be able to accept multiple metric ids and a single build id.
1875
1876         Reviewed by Ricky Mondello.
1877
1878         Make aggregator.js accept multiple ids and generate results for single build when bots are
1879         reporting new results.
1880
1881         * database/aggregate.js:
1882         (parseArgv): Added. Returns an object containing the parsed representation of argv,
1883         which currently contains metricIDs and buildIds.
1884         (main): Use parseArgv and processConfigurations
1885         (processPlatform): Use build ids passed in or obtain all builds for the given platform.
1886         (processPlatform.processConfigurations): Extracted.
1887
1888 2012-12-17  Ryosuke Niwa  <rniwa@webkit.org>
1889
1890         Add an administrative page for builders.
1891
1892         Reviewed by Ricky Mondello.
1893
1894         We need an administrative page to add and edit builder information.
1895         Also renamed "slaves" to "builders" in order to reduce the amount of technical jargon we use.
1896
1897         * database/init-database.sql: Renamed slaves table to builders. Drop slave_os and slave_spec
1898         since we don't have plans to use those columns in near future. Also make builder_name unique
1899         as required by the rest of the app.
1900         * public/admin/builders.php: Added.
1901         * public/api/runs.php: Updated per the table rename.
1902         * public/include/admin-header.php: Added a link to builders.php.
1903
1904 2012-12-14  Ryosuke Niwa  <rniwa@webkit.org>
1905
1906         Build fixes for r46982.
1907
1908         * database/aggregate.js:
1909         (fetchConfigurations):  Bind i so that it's not always metricIds.length.
1910         (fetchBuildsForPlatform): Return run_build as build_id since that's what caller expects.
1911         (processBuild): Don't print "." until we've committed transactions. It's misleading.
1912
1913 2012-12-13  Ryosuke Niwa  <rniwa@webkit.org>
1914
1915         Unreviewed. Move some php files to public/include as suggested by Mark on a code review.
1916
1917         * public/admin/aggregators.php:
1918         * public/admin/footer.php: Removed.
1919         * public/admin/header.php: Removed.
1920         * public/admin/index.php:
1921         * public/admin/jobs.php:
1922         * public/admin/tests.php:
1923         * public/api/json-header.php: Removed.
1924         * public/api/runs.php:
1925         * public/db.php: Removed.
1926         * public/include: Added.
1927         * public/include/admin-footer.php: Copied from public/admin/footer.php.
1928         * public/include/admin-header.php: Copied from public/admin/header.php.
1929         * public/include/db.php: Copied from public/db.php.
1930         * public/include/json-header.php: Copied from public/api/json-header.php.
1931
1932 2012-12-13  Ryosuke Niwa  <rniwa@webkit.org>
1933
1934         <rdar://problem/12822613> SafariPerfMonitor: implement naive value aggregation mechanism
1935
1936         Reviewed by Ricky Mondello.
1937
1938         Added the initial implementation of value aggregation.
1939         Also added abilities to configure the dashboard page in tests.php.
1940
1941         * database/aggregate.js: Added.
1942         (TaskQueue): Added. Execute all tasks at once and waits for those tasks to complete.
1943         (TaskQueue.addTask):
1944         (TaskQueue.start):
1945         (SerializedTaskQueue): Added. Execute tasks sequentially after one another until all of them are completed.
1946         (SerializedTaskQueue.addTask):
1947         (SerializedTaskQueue.start):
1948         (main):
1949         (processPlatform):
1950         (fetchConfigurations):
1951         (fetchBuildsForPlatform):
1952         (processBuild):
1953         (testsWithDifferentIterationCounts):
1954         (aggregateIterationsForMetric): Retrieve run_iterations and aggregate results in memory.
1955         (saveAggregatedResults): Insert into test_runs and test_config in transactions.
1956         (getOrInsertConfiguration):
1957         (fetchAggregators):
1958         * database/database-common.js:
1959         (fetchTable): Log an error as an error.
1960         (getOrCreateId): Extracted from perf-webkit-migrator.
1961         (statistics): Added.
1962         * database/perf-webkit-migrator.js:
1963         (migrateTestConfig): Converted units to respective metric names. Also removed the code to add jobs to update
1964         runs JSON since runs JSONs are generated on demand now.
1965         (migrateStat):
1966         (getOrCreatePlatformId):
1967         (getOrCreateTestId):
1968         (getOrCreateConfigurationId):
1969         (getOrCreateRevisionId):
1970         (getOrCreateRepositoryId):
1971         (getOrCreateBuildId):
1972         * database/process-jobs.js:
1973         (processJob): Handle 'aggregate' type.
1974
1975 2012-12-11  Ryosuke Niwa  <rniwa@webkit.org>
1976
1977         Fix the dashboard after adding test_metrics.
1978
1979         Reviewed by Ricky Mondello.
1980
1981         Rename test to metrics in various functions and sort tests on the charts page.
1982         Also representing whether a test appears or not by setting a flag on dashboard
1983         was bogus because test objects are shared by multiple platforms. Instead, store
1984         dashboard platform list as intended by the manifest JSON.
1985
1986         * public/index.html:
1987         (PerfTestRuns): Renamed test to metric.
1988         (fetchTest): Ditto.
1989         (showCharts): Ditto; also sort metrics' full names before adding them to the select element.
1990         (fullName): Moved so that it appears above where it's called.
1991         * public/js/helper-classes.js:
1992
1993 2012-12-10  Ryosuke Niwa  <rniwa@webkit.org>
1994
1995         Update tests.php to reflect recent changes in the database schema.
1996
1997         Reviewed by Conrad Shultz.
1998
1999         Made the following changes to tests.php:
2000         1. Disallow adding metrics to tests without subtests.
2001         2. Made dashboard configurable by adding checkboxes for each platform on each metric.
2002         3. Linkified tests with subtests instead of showing all them at once.
2003
2004         * public/admin/admin.css:
2005         (.action-field, .notice):
2006         (label):
2007         * public/admin/header.php: Specify paths by absolute paths so that tests.php can use PATH_INFO.
2008         (execute_query_and_expect_one_row_to_be_affected): Return a boolean. Used in tests.php while adding test_metrics.
2009         (add_job): Extracted.
2010         * public/admin/tests.php: See above.
2011         (array_item_set_default): Added.
2012         (array_item_or_default): Renamed from get_value_with_default.
2013         (compute_full_name): Extracted.
2014         (sort_tests): Ditto.
2015         (map_metrics_to_tests): Ditto.
2016
2017 2012-12-06  Ryosuke Niwa  <rniwa@webkit.org>
2018
2019         <rdar://problem/12832324> SafariPerfMonitor: Linkify test names
2020
2021         Reviewed by Simon Fraser.
2022
2023         Linkify the headers using metric.test.url when it's provided.
2024
2025         * public/index.html:
2026
2027 2012-12-03  Ryosuke Niwa  <rniwa@webkit.org>
2028
2029         Use parameterized pg_query_params in query_and_fetch_all
2030
2031         Reviewed by Conrad Shultz.
2032
2033         Address a review comment by Mark by using pg_query_params instead of pg_query in query_and_fetch_all.
2034
2035         * public/api/runs.php:
2036         * public/db.php:
2037         (ctype_alnum_underscore): Added.
2038
2039 2012-12-04  Ryosuke Niwa  <rniwa@webkit.org>
2040
2041         Update the migration tool to support test_metrics.
2042
2043         Reviewed by Mark Rowe.
2044
2045         Updated the migration tool from webkit-perf.appspot.com to support test_metrics.
2046         Also import run_iteration rows as runs JSON files now include individual values.
2047
2048         * database/database-common.js:
2049         (addJob): Extracted.
2050         * database/perf-webkit-migrator.js:
2051         (migrateTestConfig): Interchange the order in which we fetch runs and add configurations
2052         so that we can pass in the metric name and unit to getOrCreateConfigurationId.
2053         (getOrCreateConfigurationId): Updated to add both test configuration and test metric.
2054         (ensureCheckout):
2055
2056 2012-12-03  Ryosuke Niwa  <rniwa@webkit.org>
2057
2058         Build fix. Suppress "Undefined index" warning.
2059
2060         * public/admin/tests.php:
2061
2062 2012-12-03  Ryosuke Niwa  <rniwa@webkit.org>
2063
2064         Fix a commit error in r46756. api/ should obviously be added under public/
2065
2066         * api: Removed.
2067         * api/json-header.php: Removed.
2068         * api/runs.php: Removed.
2069         * public/api: Copied from api.
2070
2071 2012-12-03  Ryosuke Niwa  <rniwa@webkit.org>
2072
2073         SafariPerfMonitor: Linkify revisions and revisions range
2074         <rdar://problem/12801010>
2075
2076         Reviewed by Mark Rowe.
2077
2078         Linkify revisions in TestBuild.label. Pass in manifest.repositories to TestBuild's constructor
2079         since it needs to know "url" and "blameUrl".
2080
2081         Also tweaked the appearance of graphs on charts page to better align graphs when unit names are long.
2082
2083         * public/index.html:
2084         * public/js/helper-classes.js:
2085         (TestBuild):
2086         (TestBuild.revision): Renamed from webkitRevision. Now returns an arbitrary revision number.
2087         (TestBuild.label): Add labels for all revisions.
2088         (TestBuild):
2089         (.ensureContainer):
2090
2091 2012-12-03  Ryosuke Niwa  <rniwa@webkit.org>
2092
2093         Make the generation of "runs" JSON dynamic and support test_metrics.
2094
2095         Reviewed by Mark Rowe.
2096
2097         It turned out that we can fetch all runs for a given configuration in roughly 100-200ms.
2098
2099         Since there could be hundreds, if not thousands, of tests for each configuration and users
2100         aren't necessarily interested in looking at all test results, it's much more efficient to
2101         generate runs JSON dynamically (i.e. polling) upon a request instead of generating all of them
2102         when bots report new results (i.e. pushing).
2103
2104         Rewrote the script to generate runs JSON in php and also supported test_metrics table.
2105
2106         * api: Added.
2107         * api/json-header.php: Added. Sets Content-Type and cache policies (10 minutes by default).
2108         (exit_with_error): Added.
2109         (successful_exit): Added.
2110         * api/runs.php: Added. Ported database/database-common.js. It's much shorter in php!
2111         * database/generate-runs.js: Removed.
2112         * database/process-jobs.js: No longer supports "runs".
2113         * public/.htaccess: Added. Always add MultiView so that api/runs can receive a path info.
2114         * public/db.php: Print "Nothing to see here." when it's accessed directly.
2115         (ends_with): Added.
2116         * public/index.html: Fetch runs JSONs from /api/runs/ instead of data/.
2117
2118 2012-12-03  Ryosuke Niwa  <rniwa@webkit.org>
2119
2120         Update tests.php and sample-data.sql per addition of test_metrics.
2121
2122         Rubber-stamped by Timothy Hatcher.
2123
2124         Remove a useless code from tests.php that used to update the unit and the url of a test
2125         since it's no longer used, and add the UI and the ability to add a new aggregator to a test.
2126
2127         Also update the sample data to reflect the addition of test_metrics.
2128
2129         * database/sample-data.sql:
2130         * public/admin/tests.php:
2131
2132 2012-11-30  Ryosuke Niwa  <rniwa@webkit.org>
2133
2134         Share more code between admin pages.
2135
2136         Reviewed by Timothy Hatcher.
2137
2138         Added notice and execute_query_and_expect_one_row_to_be_affected helper functions to share more code
2139         between admin pages.
2140
2141         Also moved the code to connect to the database into header.php to be shared. Admin pages just need
2142         to check the nullity of global $db now.
2143
2144         * public/admin/aggregators.php:
2145         * public/admin/header.php:
2146         (notice): Added
2147         (execute_query_and_expect_one_row_to_be_affected): Added.
2148         * public/admin/index.php:
2149         * public/admin/jobs.php:
2150         * public/admin/tests.php:
2151
2152 2012-11-29  Ryosuke Niwa  <rniwa@webkit.org>
2153
2154         SafariPerfMonitor: Add admin page to edit aggregators
2155         <rdar://problem/12782687>
2156
2157         Reviewed by Mark Rowe.
2158
2159         Add aggregators.php. It's very simple. We should probably share more code between various admin pages.
2160
2161         * public/admin/aggregators.php: Added.
2162         * public/admin/header.php:
2163         * public/admin/jobs.php: Removed an erroneous hidden input element.
2164
2165 2012-11-28  Ryosuke Niwa  <rniwa@webkit.org>
2166
2167         Fix a syntax error in init-database.sql and add the missing drop table at the beginning.
2168
2169         * database/init-database.sql:
2170
2171 2012-11-28  Ryosuke Niwa  <rniwa@webkit.org>
2172
2173         SafariPerfMonitor: Allow multiple metrics per test
2174         <rdar://problem/12773506>
2175
2176         Rubber-stamped by Mark Rowe.
2177
2178         Introduce a new table test_metrics. This table represents metrics each test can have
2179         such as time, memory allocation, frame rate as well as aggregation such as arithmetic mean
2180         and geometric mean.
2181
2182         Updated admin/tests.php and index.html accordingly.
2183
2184         Also create few indexes based on postgres' "explain analysis" as suggested by Mark.
2185
2186         * database/generate-manifest.js:
2187         (buildPlatformMapIfPossible):
2188         * database/generate-runs.js:
2189         (fetchRuns):
2190         * database/init-database.sql:
2191         * database/schema.graffle:
2192         * public/admin/admin.css:
2193         (table):
2194         (tbody.odd):
2195         * public/admin/tests.php:
2196         * public/index.html:
2197
2198 2012-11-27  Ryosuke Niwa  <rniwa@webkit.org>
2199
2200         SafariPerfMonitor: Improve the webkit-perf migration tool
2201         <rdar://problem/12760882>
2202
2203         Reviewed by Mark Rowe.
2204
2205         Make the migrator tool skip runs when fetching runs failed since webkit-perf.appspot.com is unreliable
2206         and we don't want to pause the whole importation process until the user comes back to decide whether
2207         to retry or not.
2208
2209         Also place form controls next to each test in tests.php so that users don't have to scroll all the way
2210         down to make modifications.
2211
2212         Finally, add unique constraint to (run_config, run_build) in test_runs table in order to optimize a query
2213         of the form: "SELECT run_id FROM test_runs WHERE run_config = $1 AND run_build = $2",
2214
2215         * database/init-database.sql:
2216         * database/perf-webkit-migrator.js:
2217         (migrateTestConfig):
2218         * database/schema.graffle:
2219         * public/admin/admin.css:
2220         (table):
2221         * public/admin/tests.php:
2222
2223 2012-11-16  Ryosuke Niwa  <rniwa@webkit.org>
2224
2225         Create a new performance dashboard
2226         <rdar://problem/12625582>
2227
2228         Rubber-stamped by Mark Rowe.
2229
2230         Add the initial implementation of the perf dashboard.
2231
2232         * database: Added.
2233         * database/config.json: Added.
2234         * database/database-common.js: Added.
2235         (connect):
2236         (fetchTable):
2237         (manifestPath):
2238         (pathToRunsJSON):
2239         (pathToLocalScript):
2240         (config):
2241         * database/generate-manifest.js: Added.
2242         (ensureProperty):
2243         (buildTestMap):
2244         (buildPlatformMapIfPossible):
2245         (generateFileIfPossible):
2246         * database/perf-webkit-migrator.js: Added.
2247         * database/process-jobs.js: Added.
2248         * database/sample-data.sql: Added.
2249         * database/schema.graffle: Added.
2250         * public: Added.
2251         * public/admin: Added.
2252         * public/admin/README: Added.
2253         * public/admin/admin.css: Added.
2254         * public/admin/footer.php: Added.
2255         * public/admin/header.php: Added.
2256         * public/admin/index.php: Added.
2257         * public/admin/jobs.php: Added.
2258         * public/admin/tests.php: Added.
2259         * public/common.css: Added.
2260         * public/data: Added.
2261         * public/db.php: Added.
2262         * public/index.html: Added.
2263         * public/js: Added.
2264         * public/js/helper-classes.js: Added.
2265         * public/js/jquery-1.8.2.min.js: Added.
2266         * public/js/jquery.flot.min.js: Added.
2267         * public/js/jquery.flot.plugins.js: Added.
2268         * public/js/shared.js: Added.
2269         (fileNameFromPlatformAndTest):
2270         * public/js/statistics.js: Added.
2271