Perf dashboard should automatically detect regressions
[WebKit-https.git] / Websites / perf.webkit.org / public / privileged-api / create-test-group.php
1 <?php
2
3 require_once('../include/json-header.php');
4
5 function main() {
6     $db = connect();
7     $data = ensure_privileged_api_data_and_token_or_slave($db);
8     $author = remote_user_name($data);
9
10     $task_id = array_get($data, 'task');
11     $name = array_get($data, 'name');
12     $root_sets = array_get($data, 'rootSets');
13     $repetition_count = intval(array_get($data, 'repetitionCount', 1));
14
15     if (!$name)
16         exit_with_error('MissingName');
17     if (!$root_sets)
18         exit_with_error('MissingRootSets');
19     if ($repetition_count < 1)
20         exit_with_error('InvalidRepetitionCount', array('repetitionCount' => $repetition_count));
21
22     $task = $db->select_first_row('analysis_tasks', 'task', array('id' => $task_id));
23     if (!$task)
24         exit_with_error('InvalidTask', array('task' => $task_id));
25     $triggerable = find_triggerable_for_task($db, $task_id);
26     if (!$triggerable)
27         exit_with_error('TriggerableNotFoundForTask', array('task' => $task_id));
28
29     $commit_sets = commit_sets_from_root_sets($db, $root_sets);
30
31     $db->begin_transaction();
32
33     $root_set_id_list = array();
34     foreach ($commit_sets as $commit_list) {
35         $root_set_id = $db->insert_row('root_sets', 'rootset', array());
36         foreach ($commit_list as $commit)
37             $db->insert_row('roots', 'root', array('set' => $root_set_id, 'commit' => $commit), 'commit');
38         array_push($root_set_id_list, $root_set_id);
39     }
40
41     $group_id = $db->insert_row('analysis_test_groups', 'testgroup',
42         array('task' => $task['task_id'], 'name' => $name, 'author' => $author));
43
44     $order = 0;
45     for ($i = 0; $i < $repetition_count; $i++) {
46         foreach ($root_set_id_list as $root_set_id) {
47             $db->insert_row('build_requests', 'request', array(
48                 'triggerable' => $triggerable['id'],
49                 'platform' => $triggerable['platform'],
50                 'test' => $triggerable['test'],
51                 'group' => $group_id,
52                 'order' => $order,
53                 'root_set' => $root_set_id));
54             $order++;
55         }
56     }
57
58     $db->commit_transaction();
59
60     exit_with_success(array('testGroupId' => $group_id));
61 }
62
63 function commit_sets_from_root_sets($db, $root_sets) {
64     $repository_name_to_id = array();
65     foreach ($db->fetch_table('repositories') as $row)
66         $repository_name_to_id[$row['repository_name']] = $row['repository_id'];
67
68     $commit_sets = array();
69     foreach ($root_sets as $repository_name => $revisions) {
70         $repository_id = array_get($repository_name_to_id, $repository_name);
71         if (!$repository_id)
72             exit_with_error('RepositoryNotFound', array('name' => $repository_name));
73
74         foreach ($revisions as $i => $revision) {
75             $commit = $db->select_first_row('commits', 'commit', array('repository' => $repository_id, 'revision' => $revision));
76             if (!$commit)
77                 exit_with_error('RevisionNotFound', array('repository' => $repository_name, 'revision' => $revision));
78             array_set_default($commit_sets, $i, array());
79             array_push($commit_sets[$i], $commit['commit_id']);
80         }
81     }
82
83     $commit_count_per_set = count($commit_sets[0]);
84     foreach ($commit_sets as $commits) {
85         if ($commit_count_per_set != count($commits))
86             exit_with_error('InvalidRootSets', array('rootSets' => $root_sets));
87     }
88
89     return $commit_sets;
90 }
91
92 main();
93
94 ?>