From 7a289d410cda7ba63efcabca24ca287f8edcb48c Mon Sep 17 00:00:00 2001 From: vantezzen Date: Fri, 6 Mar 2020 11:45:10 +0100 Subject: Add verify-all script --- .gitignore | 1 + scripts/package.json | 1 + scripts/verify-all.js | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 scripts/verify-all.js diff --git a/.gitignore b/.gitignore index 2e0b495..0b61f08 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store scripts/node_modules scripts/recipe_src/* +scripts/uncompressed/* !scripts/recipe_src/readme.txt \ No newline at end of file diff --git a/scripts/package.json b/scripts/package.json index 56c62ed..2df0082 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -17,6 +17,7 @@ "scripts": { "package": "node package.js", "verify": "node verify.js", + "verify-all": "node verify-all.js", "update": "node update.js", "github": "node add_github.js", "load": "node load.js" diff --git a/scripts/verify-all.js b/scripts/verify-all.js new file mode 100644 index 0000000..6683d7a --- /dev/null +++ b/scripts/verify-all.js @@ -0,0 +1,77 @@ +/** + * Verify all archived recipes to match uncompressed recipes + */ +const targz = require('targz'); +const fs = require('fs-extra'); +const dircompare = require('dir-compare'); +const path = require('path'); + +// Helper: Compress src folder into dest file +const decompress = (src, dest) => new Promise((resolve, reject) => { + targz.decompress({ + src, + dest, + }, (err) => { + if (err) { + reject(err); + } else { + resolve(dest); + } + }); +}); + +// Let us work in an async environment +(async () => { + // Read list of all recipes + const allJsonPath = path.join(__dirname, '../', 'all.json'); + const all = await fs.readJSON(allJsonPath); + + const tempUncompressed = path.join(__dirname, `uncompressed/`); + + for (const recipeInfo of all) { + // Get recipe infos + const recipe = recipeInfo.id; + const recipeNum = all.findIndex(e => e === recipeInfo); + const compressedRecipe = path.join(__dirname, '../', `${recipe}.tar.gz`); + const uncompressedRecipe = path.join(__dirname, '../', 'uncompressed', recipe); + + // Check that recipe exists + if (!await fs.pathExists(compressedRecipe) || !await fs.pathExists(uncompressedRecipe)) { + console.log(`Error: Recipe "${recipe}" exists in all.json but not found.`); + process.exit(1); + } + + // Clear temporary extraction folder + if (await fs.pathExists(tempUncompressed)) { + await fs.remove(tempUncompressed); + } + await fs.mkdir(tempUncompressed); + + // Package to uncompressed recipe to .tar.gz + console.log(`Decompressing ${recipe} (${recipeNum + 1} of ${all.length})...`); + await decompress(compressedRecipe, tempUncompressed); + + // Compare directories + const compare = dircompare.compareSync(uncompressedRecipe, tempUncompressed, { + compareContent: true, + }); + + if (compare.same) { + console.log(`✓ ${recipe} is valid`); + } else { + console.log(`❌ Compressed and uncompressed files for "${recipe}" are NOT equal:`); + + // Output information about differences + for (const file of compare.diffSet) { + if (file.state !== 'equal') { + console.log(`- "${file.name1}" is not equal (${file.type1} in uncompressed, ${file.type2} in archive)`); + } + } + + process.exit(1); + } + + // Remove temporary compressed file + await fs.remove(tempUncompressed); + } +})(); \ No newline at end of file -- cgit v1.2.3-70-g09d2