difftastic/vendored_parsers/tree-sitter-php/script/parse-examples.js

102 lines
3.4 KiB
JavaScript

const fs = require('fs')
const os = require('os')
const util = require('util');
const { exec, execSync } = require('child_process')
const shell = require('shelljs')
function main() {
checkoutExampleProjects([
{ dir: 'laravel', repository: 'https://github.com/laravel/laravel', sha: '9d0862b3340c8243ee072afc181e315ffa35e110' },
{ dir: 'framework', repository: 'https://github.com/laravel/framework', sha: '45d439e98a6b14afde8911f7d22a265948adbf72' },
{ dir: 'phabricator', repository: 'https://github.com/phacility/phabricator', sha: 'd0b01a41f2498fb2a6487c2d6704dc7acfd4675f' },
{ dir: 'phpunit', repository: 'https://github.com/sebastianbergmann/phpunit', sha: '5e523bdc7dd4d90fed9fb29d1df05347b3e7eaba' },
{ dir: 'WordPress', repository: 'https://github.com/WordPress/WordPress', sha: '45286c5bb3f6fe5005567903ec858d87077eae2c' },
{ dir: 'mediawiki', repository: 'https://github.com/wikimedia/mediawiki', sha: 'b6b88cbf98fb0c7891324709a85eabc290ed28b4' },
])
parseExamples()
}
function parseExamples() {
const knownFailures = loadKnownFailures().split(/\r\n|\n/).filter(line => line.length > 0)
let excludeString = knownFailures.join(" !")
if (knownFailures.length > 0) {
excludeString = "!" + excludeString
}
if (os.platform == 'win32') {
excludeString = convertToWindowsPath(excludeString)
}
exec('"./node_modules/.bin/tree-sitter" parse -q examples/**/*.php ' + excludeString, (err, stdout) => {
const failures = extractFailureFilePaths(stdout)
failures.forEach(failure => {
if (!knownFailures.includes(failure)) {
console.error(`Unknown failure occurred: ${failure}`)
}
})
const failureCount = failures.length + knownFailures.length
const exampleCount = countExampleFiles()
const successCount = exampleCount - failureCount;
const successPercent = 100 * successCount / exampleCount
console.log(`Successfully parsed ${successCount} of ${exampleCount} example files (${successPercent.toFixed(2)}%)`)
})
}
function extractFailureFilePaths(stdout) {
return stdout.split(/\r\n|\n/).filter(line => line.length > 0).map(line => convertToUnixPath(line.substring(0, line.indexOf(" "))))
}
function convertToUnixPath(filePathString) {
return filePathString.split("\\").join("/")
}
function convertToWindowsPath(filePathString) {
return filePathString.split("/").join("\\")
}
function countExampleFiles() {
return shell.find('./examples').filter((file) => { return file.match(/\.php$/) }).length
}
function createExamplesDirectoryIfNotExists() {
const dir = './examples'
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir)
}
}
function checkoutExampleProjects(projects) {
createExamplesDirectoryIfNotExists()
checkoutPromise = util.promisify(checkoutExampleProject)
Promise.all(projects.map((project) => checkoutPromise(project)))
}
function checkoutExampleProject(project) {
const projectDir = './examples/' + project.dir
if (!fs.existsSync(projectDir)) {
cloneRepository(project)
}
checkoutCommit(project)
}
function cloneRepository(project) {
execSync('cd examples && git clone --quiet ' + project.repository + ' ' + project.dir + ' && cd ..')
}
function checkoutCommit(project) {
execSync('cd examples/' + project.dir + ' && git fetch --quiet && git reset --quiet --hard "' + project.sha + '" && cd ../..')
}
function loadKnownFailures() {
return fs.readFileSync('./script/known-failures.txt').toString()
}
main()