forked from Ecosystem-Infra/wpt-results-analysis
-
Notifications
You must be signed in to change notification settings - Fork 0
/
git-query.js
108 lines (94 loc) · 3.35 KB
/
git-query.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
'use strict';
const flags = require('flags');
const Git = require('nodegit');
const lib = require('./lib');
flags.defineInteger('max-runs', 0, 'Query at most this many runs');
flags.parse();
function queryTree(tree) {
let counter = 0;
lib.results.walkTests(tree, (path, test, results) => {
// count non-OK/PASS statuses
if (results.status !== 'OK' && results.status !== 'PASS') {
counter++;
}
if (results.subtests) {
for (const subtest of results.subtests) {
if (subtest.status !== 'PASS') {
counter++;
}
}
}
/*
// look for non-unique subtests names
if (results.subtests.length) {
const names = new Set;
for (const subtest of results.subtests) {
names.add(subtest.name);
}
if (names.size !== results.subtests.length) {
//console.log(`${path}/${test}`);
counter++;
}
}
*/
});
return counter;
}
async function main() {
const maxRuns = flags.get('max-runs');
// bare clone of https://github.com/ecosystem-infra/wpt-results
const repo = await Git.Repository.open('wpt-results.git');
console.log('Getting master set of runs from server');
let t0 = Date.now();
let masterRuns = await lib.runs.getAll({label: 'master'});
const serverLoadTime = Date.now() - t0;
console.log(`Found ${masterRuns.length} master runs (took ${serverLoadTime} ms)`);
// Filter out runs which we don't have locally.
console.log('Getting local set of runs from repo');
t0 = Date.now();
const localRunsIds = await lib.results.getLocalRunIds(repo);
let runs = masterRuns.filter(run => localRunsIds.has(run.id));
const localRunsTime = Date.now() - t0;
console.log(`Found ${runs.length} local runs (took ${localRunsTime} ms)`);
if (maxRuns) {
console.log(`Filtering to ${maxRuns} runs`);
runs = runs.slice(0, maxRuns);
}
// Fully parallel loading is slower than loading one run after the other
// probably because it's I/O bound. Also uses more memory. But loading a few
// in parallel might be faster than this:
console.log('Iterating over all runs, loading test results');
t0 = Date.now();
const trees = new Array(runs.length);
for (const i in runs) {
const run = runs[i];
//console.log(`Loading run ${run.id} (${run.browser_name} ${run.browser_version} @ ${run.revision})`);
trees[i] = await lib.results.getGitTree(repo, run);
}
const loadTime = Date.now() - t0;
console.log(`Loading ${runs.length} runs took ${loadTime} ms`);
t0 = Date.now();
const results = [];
for (const tree of trees) {
results.push(queryTree(tree));
}
const queryTime = Date.now() - t0;
// Log results after loop so that console doesn't dominate the time.
console.log(results);
console.log(`Querying ${runs.length} runs took ${queryTime} ms`);
const treeCount = Object.keys(lib.results.treeCache).length;
const testCount = Object.keys(lib.results.testCache).length;
console.log(`${treeCount} trees in memory`);
console.log(`${testCount} tests in memory`);
if (global.gc) {
global.gc();
}
const memory = process.memoryUsage();
console.log(memory);
// For copying into spreadsheet
console.log(`${runs.length}\t${loadTime}\t${queryTime}\t${treeCount}\t${testCount}\t${memory.rss}\t${memory.heapTotal}\t${memory.heapUsed}\t${memory.external}`);
}
main().catch(reason => {
console.error(reason);
process.exit(1);
});