|  | /* | 
|  | * 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(); |