blob: 0fc343f709d8365b219a827358355f0ed40dd10b [file]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Script that can automatically add missing license headers to Python-like
// files, including `.gn`, `.py`, `.gni` files.
const readline = require('readline');
const path = require('path');
const fs = require('fs');
const glob = require('glob');
const ROOT_DIRECTORY = path.join(__dirname, '..', '..');
const FRONT_END_DIRECTORY = path.join(ROOT_DIRECTORY, 'front_end');
const TEST_DIRECTORY = path.join(ROOT_DIRECTORY, 'test');
const SCRIPTS_DIRECTORY = path.join(ROOT_DIRECTORY, 'scripts');
const INSPECTOR_OVERLAY_DIRECTORY = path.join(ROOT_DIRECTORY, 'inspector_overlay');
const CONFIG_DIRECTORY = path.join(ROOT_DIRECTORY, 'config');
const CURRENT_YEAR = new Date().getFullYear();
const LINE_LICENSE_HEADER = [
`# Copyright ${CURRENT_YEAR} The Chromium Authors. All rights reserved.`,
'# Use of this source code is governed by a BSD-style license that can be',
'# found in the LICENSE file.',
];
const LINE_REGEXES =
LINE_LICENSE_HEADER.map(line => new RegExp(line.replace(String(CURRENT_YEAR), '(\\(c\\) )?\\d{4}') + '$'));
/**
* @param {string} fileLocation
*/
async function checkAndMaybeAddLicenseHeader(fileLocation) {
const fileStream = fs.createReadStream(fileLocation);
const fileReader = readline.createInterface({input: fileStream});
try {
await new Promise((resolve, reject) => {
let i = 0;
fileReader.on('line', line => {
if (LINE_REGEXES[i].exec(line)) {
i++;
if (i === LINE_REGEXES.length) {
fileReader.close();
fileReader.removeAllListeners();
resolve();
}
} else {
reject(`Invalid license header for file ${fileLocation}`);
}
});
});
} catch (checkError) {
try {
fixLicenseHeaderForFile(fileLocation);
} catch (writeError) {
console.error('Unable to automatically fix license header for file');
console.error(`Error when checking: ${checkError}`);
console.error(`Error when writing: ${writeError}`);
process.exit(1);
}
} finally {
fileStream.close();
}
}
/**
* @param {string} fileLocation
*/
function fixLicenseHeaderForFile(fileLocation) {
fs.writeFileSync(
fileLocation,
Buffer.concat([Buffer.from(LINE_LICENSE_HEADER.join('\n') + '\n\n'), fs.readFileSync(fileLocation)]));
}
let filesToLint = process.argv.slice(2);
if (filesToLint.length === 0) {
const topLevelDirectories =
[FRONT_END_DIRECTORY, SCRIPTS_DIRECTORY, TEST_DIRECTORY, INSPECTOR_OVERLAY_DIRECTORY, CONFIG_DIRECTORY].join(',');
filesToLint = glob.sync(`{${topLevelDirectories}}/**/{BUILD.gn,*.gni}`);
}
for (const fileLocation of filesToLint) {
checkAndMaybeAddLicenseHeader(fileLocation);
}