| 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 libraryconst readline = require("readline");      // Require the readline processing libraryvar 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;} // buildMapconst 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 between the 2 files \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\${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();});
 |