| /* | |
| * Licensed to the Apache Software Foundation (ASF) under one | |
| * or more contributor license agreements. See the NOTICE file | |
| * distributed with this work for additional information | |
| * regarding copyright ownership. The ASF licenses this file | |
| * to you under the Apache License, Version 2.0 (the | |
| * "License"); you may not use this file except in compliance | |
| * with the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, | |
| * software distributed under the License is distributed on an | |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| * KIND, either express or implied. See the License for the | |
| * specific language governing permissions and limitations | |
| * under the License. | |
| */ | |
| const fs = require('fs'); | |
| const preamble = require('./preamble'); | |
| const pathTool = require('path'); | |
| const chalk = require('chalk'); | |
| // In the `.headerignore`, each line is a pattern in RegExp. | |
| // all relative path (based on the echarts base directory) is tested. | |
| // The pattern should match the relative path completely. | |
| const excludesPath = pathTool.join(__dirname, '../.headerignore'); | |
| const ecBasePath = pathTool.join(__dirname, '../'); | |
| const isVerbose = process.argv[2] === '--verbose'; | |
| // const lists = [ | |
| // '../src/**/*.js', | |
| // '../build/*.js', | |
| // '../benchmark/src/*.js', | |
| // '../benchmark/src/gulpfile.js', | |
| // '../extension-src/**/*.js', | |
| // '../extension/**/*.js', | |
| // '../map/js/**/*.js', | |
| // '../test/build/**/*.js', | |
| // '../test/node/**/*.js', | |
| // '../test/ut/core/*.js', | |
| // '../test/ut/spe/*.js', | |
| // '../test/ut/ut.js', | |
| // '../test/*.js', | |
| // '../theme/*.js', | |
| // '../theme/tool/**/*.js', | |
| // '../echarts.all.js', | |
| // '../echarts.blank.js', | |
| // '../echarts.common.js', | |
| // '../echarts.simple.js', | |
| // '../index.js', | |
| // '../index.common.js', | |
| // '../index.simple.js' | |
| // ]; | |
| function run() { | |
| const updatedFiles = []; | |
| const passFiles = []; | |
| const pendingFiles = []; | |
| eachFile(function (absolutePath, fileExt) { | |
| const fileStr = fs.readFileSync(absolutePath, 'utf-8'); | |
| const existLicense = preamble.extractLicense(fileStr, fileExt); | |
| if (existLicense) { | |
| passFiles.push(absolutePath); | |
| return; | |
| } | |
| // Conside binary files, only add for files with known ext. | |
| if (!preamble.hasPreamble(fileExt)) { | |
| pendingFiles.push(absolutePath); | |
| return; | |
| } | |
| fs.writeFileSync(absolutePath, preamble.addPreamble(fileStr, fileExt), 'utf-8'); | |
| updatedFiles.push(absolutePath); | |
| }); | |
| console.log('\n'); | |
| console.log('----------------------------'); | |
| console.log(' Files that exists license: '); | |
| console.log('----------------------------'); | |
| if (passFiles.length) { | |
| if (isVerbose) { | |
| passFiles.forEach(function (path) { | |
| console.log(chalk.green(path)); | |
| }); | |
| } | |
| else { | |
| console.log(chalk.green(passFiles.length + ' files. (use argument "--verbose" see details)')); | |
| } | |
| } | |
| else { | |
| console.log('Nothing.'); | |
| } | |
| console.log('\n'); | |
| console.log('--------------------'); | |
| console.log(' License added for: '); | |
| console.log('--------------------'); | |
| if (updatedFiles.length) { | |
| updatedFiles.forEach(function (path) { | |
| console.log(chalk.green(path)); | |
| }); | |
| } | |
| else { | |
| console.log('Nothing.'); | |
| } | |
| console.log('\n'); | |
| console.log('----------------'); | |
| console.log(' Pending files: '); | |
| console.log('----------------'); | |
| if (pendingFiles.length) { | |
| pendingFiles.forEach(function (path) { | |
| console.log(chalk.red(path)); | |
| }); | |
| } | |
| else { | |
| console.log('Nothing.'); | |
| } | |
| console.log('\nDone.'); | |
| } | |
| function eachFile(visit) { | |
| const excludePatterns = []; | |
| const extReg = /\.([a-zA-Z0-9_-]+)$/; | |
| prepareExcludePatterns(); | |
| travel('./'); | |
| function travel(relativePath) { | |
| if (isExclude(relativePath)) { | |
| return; | |
| } | |
| const absolutePath = pathTool.join(ecBasePath, relativePath); | |
| const stat = fs.statSync(absolutePath); | |
| if (stat.isFile()) { | |
| visit(absolutePath, getExt(absolutePath)); | |
| } | |
| else if (stat.isDirectory()) { | |
| fs.readdirSync(relativePath).forEach(function (file) { | |
| travel(pathTool.join(relativePath, file)); | |
| }); | |
| } | |
| } | |
| function prepareExcludePatterns() { | |
| const content = fs.readFileSync(excludesPath, {encoding: 'utf-8'}); | |
| content.replace(/\r/g, '\n').split('\n').forEach(function (line) { | |
| line = line.trim(); | |
| if (line && line.charAt(0) !== '#') { | |
| excludePatterns.push(new RegExp(line)); | |
| } | |
| }); | |
| } | |
| function isExclude(relativePath) { | |
| for (let i = 0; i < excludePatterns.length; i++) { | |
| if (excludePatterns[i].test(relativePath)) { | |
| return true; | |
| } | |
| } | |
| } | |
| function getExt(path) { | |
| if (path) { | |
| const mathResult = path.match(extReg); | |
| return mathResult && mathResult[1]; | |
| } | |
| } | |
| } | |
| run(); |