123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- //https://github.com/nkolban/esp32-snippets/blob/master/tools/sdkconfig_compare/sdkconfig_compare.js
- // Node.js application for comparing two ESP-IDF configuration files (sdkconfig)
- const fs = require("fs"); // Require the file system processing library
- const readline = require("readline"); // Require the readline processing library
- var map_types = {
- "UNSET": 0,
- "VALUE": 1,
- "COMMENT": 2
- };
- // buildMap
- // Read the sdkconfig file specified by fileName and produce a map of the name/value pairs contained
- // within. A Promise is returned that is fulfilled when the file has been read.
- function buildMap(fileName) {
- const promise = new Promise(function (resolve, reject) {
- var readStream = fs.createReadStream(fileName);
- readStream.on("error", (err) => {
- reject(err);
- });
- const map = {};
- const lines_index = [];
- var lineNo = 1;
- const lineReader = readline.createInterface({
- input: readStream,
- crlfDelay: Infinity
- });
-
- // Called when a new line has been read from the file.
- lineReader.on("line", (line) => {
- line = line.trim(); // Trim whitespace from the line.
- if (line.length == 0) { // Ignore empty lines
- return;
- }
-
- // split lines using named capture group regex, and loop through the resulting array
- var regexp = /^\s*[#]\s*(?<unset_key>CONFIG[^\s]*) is not set\s*$|^\s*(?<comment>[#].*)$|^\s*(?<key>[^#]{1}[^\s=]*)=(?<value>.*)$/gm;
- var match = regexp.exec(line);
- var key="";
- var map_entry={};
- while (match != null) {
- if (match.groups.unset_key) {
- key = match.groups.unset_key;
- map_entry = {
- key:key,
- type: map_types.UNSET,
- value: undefined,
- index: lineNo++,
- };
- } else if (match.groups.comment) {
- // accumulate comments in an array
- map_entry={
- type: map_types.COMMENT,
- value: match.groups.comment,
- index: lineNo++,
- };
- }
- else {
- key = match.groups.key;
- map_entry = {
- key:key,
- type: map_types.VALUE,
- value: match.groups.value,
- index: lineNo++,
- };
- }
- if(map_entry.type!=map_types.COMMENT){
- map[key] = map_entry;
- }
- lines_index.push(map_entry);
- match = regexp.exec(line);
- }
- }); // on(line)
- // Called when all the lines from the file have been consumed.
- lineReader.on("close", () => {
- resolve({map, lines_index});
- }); // on(close)
- });
- return promise;
- } // buildMap
- const args = process.argv;
- if (args.length != 3) {
- console.log("Usage: node sdkconfig_compare file1 ");
- process.exit();
- }
- const sdkconfig = "./sdkconfig";
- const comparedFile = args[2];
- buildMap(sdkconfig).then((sdkConfigResult ) => {
- var sdkconfigMap = sdkConfigResult.map;
- var sdkconfigLines = sdkConfigResult.lines_index;
- buildMap(comparedFile).then((comparedResult) => {
- var comparedFileMap = comparedResult.map;
- var comparedLines = comparedResult.lines_index;
- buildMap("./sdkconfig.defaults").then((sdkconfigResults) => {
- var sdkconfig_defaults = sdkconfigResults.map;
- var sdkconfig_defaults_lines = sdkconfigResults.lines_index;
- // Three passes
- // In A and not B
- // in B and not A
- // value different in A and B
- var newmap = {};
- var entry={};
- console.log(`\n\n${sdkconfig} properties that are missing in ${comparedFile}\n**************************`);
- for (const prop in sdkconfigMap) {
- entry = sdkconfigMap[prop];
- if(entry.type==map_types.COMMENT || entry.type== map_types.UNSET) continue;
- if (!comparedFileMap.hasOwnProperty(prop) && !sdkconfig_defaults.hasOwnProperty(prop)) {
- newmap[prop] = entry;
- console.log(`${prop}=${entry.value}`);
- }
- else if(comparedFileMap.hasOwnProperty(prop)){
- newmap[prop] =entry;
- }
- }
- console.log(`\n\n${comparedFile} properties that are missing in ${sdkconfig}\n**************************`);
- for (const prop in comparedFileMap) {
- entry = comparedFileMap[prop];
- if(entry.type==map_types.COMMENT || entry.type== map_types.UNSET) continue;
- if (comparedFileMap.hasOwnProperty(prop)) {
- if (!sdkconfigMap.hasOwnProperty(prop) && !sdkconfig_defaults.hasOwnProperty(prop)) {
- console.log(`${prop}=${entry.value}`);
- }
- }
- }
- console.log(`\n\nproperties that are different ${sdkconfig}<->${comparedFile} \n**************************`);
- for (const prop in sdkconfigMap) {
- entry = sdkconfigMap[prop];
- if(entry.type==map_types.COMMENT) continue;
- if (sdkconfigMap.hasOwnProperty(prop)) {
- if (comparedFileMap.hasOwnProperty(prop)) {
- if (entry.value != comparedFileMap[prop].value) {
- console.log(`${prop} : [${entry.value}] != [${comparedFileMap[prop].value}]`);
- }
- }
- }
- }
- var newlines = [];
- for(const prop in newmap){
- newlines.splice(newmap[prop].index,0, `${prop}=${newmap[prop].value}`);
- }
- comparedLines.forEach(line=>{
- if(line.type==map_types.COMMENT ) {
- newlines.splice(line.index,0, line.value);
- }
- else if(line.type==map_types.UNSET){
- newlines.splice(line.index,0, `# ${line.key} is not set`);
- }
- });
-
- console.log(`\n\n${comparedFile} with missing properties\n**************************`);
- newlines.forEach(line => {
- console.log(line);
- });
- }).catch((err) => {
- console.log(err);
- process.exit();
- });
- }).catch((err) => {
- console.log(err);
- process.exit();
- });
- }).catch((err) => {
- console.log(err);
- process.exit();
- }
- );
|