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