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