d1c75607cd8c6a2622b93904352adf5d9f7c3829
[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     $data = ensure_privileged_api_data_and_token();
7
8     $author = remote_user_name();
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     $db = connect();
23     $task = $db->select_first_row('analysis_tasks', 'task', array('id' => $task_id));
24     if (!$task)
25         exit_with_error('InvalidTask', array('task' => $task_id));
26     $triggerable = find_triggerable_for_task($db, $task_id);
27     if (!$triggerable)
28         exit_with_error('TriggerableNotFoundForTask', array('task' => $task_id));
29
30     $commit_sets = commit_sets_from_root_sets($db, $root_sets);
31
32     $db->begin_transaction();
33
34     $root_set_id_list = array();
35     foreach ($commit_sets as $commit_list) {
36         $root_set_id = $db->insert_row('root_sets', 'rootset', array());
37         foreach ($commit_list as $commit)
38             $db->insert_row('roots', 'root', array('set' => $root_set_id, 'commit' => $commit), 'commit');
39         array_push($root_set_id_list, $root_set_id);
40     }
41
42     $group_id = $db->insert_row('analysis_test_groups', 'testgroup',
43         array('task' => $task['task_id'], 'name' => $name, 'author' => $author));
44
45     $order = 0;
46     for ($i = 0; $i < $repetition_count; $i++) {
47         foreach ($root_set_id_list as $root_set_id) {
48             $db->insert_row('build_requests', 'request', array(
49                 'triggerable' => $triggerable['id'],
50                 'platform' => $triggerable['platform'],
51                 'test' => $triggerable['test'],
52                 'group' => $group_id,
53                 'order' => $order,
54                 'root_set' => $root_set_id));
55             $order++;
56         }
57     }
58
59     $db->commit_transaction();
60
61     exit_with_success(array('testGroupId' => $group_id));
62 }
63
64 function commit_sets_from_root_sets($db, $root_sets) {
65     $repository_name_to_id = array();
66     foreach ($db->fetch_table('repositories') as $row)
67         $repository_name_to_id[$row['repository_name']] = $row['repository_id'];
68
69     $commit_sets = array();
70     foreach ($root_sets as $repository_name => $revisions) {
71         $repository_id = array_get($repository_name_to_id, $repository_name);
72         if (!$repository_id)
73             exit_with_error('RepositoryNotFound', array('name' => $repository_name));
74
75         foreach ($revisions as $i => $revision) {
76             $commit = $db->select_first_row('commits', 'commit', array('repository' => $repository_id, 'revision' => $revision));
77             if (!$commit)
78                 exit_with_error('RevisionNotFound', array('repository' => $repository_name, 'revision' => $revision));
79             array_set_default($commit_sets, $i, array());
80             array_push($commit_sets[$i], $commit['commit_id']);
81         }
82     }
83
84     $commit_count_per_set = count($commit_sets[0]);
85     foreach ($commit_sets as $commits) {
86         if ($commit_count_per_set != count($commits))
87             exit_with_error('InvalidRootSets', array('rootSets' => $root_sets));
88     }
89
90     return $commit_sets;
91 }
92
93 main();
94
95 ?>