From b723c5cd9f9d6d51696ab43cf032193bedc88d61 Mon Sep 17 00:00:00 2001 From: lot Date: Mon, 14 Aug 2023 23:54:28 +0800 Subject: [PATCH] conf: --- main.mjs | 111 +++++++++++++++++++++++++++++++++++++++++++++++++ repo-config.js | 20 +++++++++ 2 files changed, 131 insertions(+) create mode 100644 main.mjs create mode 100644 repo-config.js diff --git a/main.mjs b/main.mjs new file mode 100644 index 0000000..bdb7abf --- /dev/null +++ b/main.mjs @@ -0,0 +1,111 @@ +import readdir from 'readdir-enhanced'; +import fs from 'fs'; +import crypto from 'crypto'; +import multimatch from 'multimatch'; +import { cfg } from './repo-config.js'; + +function applyExcludeFilter(stat, excludeFilters) { + // match exclude, return immediatley + if (excludeFilters.length > 0) { + // todo this could be a performance problem... + const pathWithFolderSlash = stat.path + (stat.isDirectory() ? '/' : ''); + const excludeMatch = multimatch(pathWithFolderSlash, excludeFilters, { matchBase: true, dot: true }); + + if (excludeMatch.length > 0) { + return false; + } + } + + return true; +} + +/** + * @param algorithm : "md5" | "sha1" | "sha256" | "sha512" + */ +async function fileHash(filename, algorithm) { + return new Promise((resolve, reject) => { + // Algorithm depends on availability of OpenSSL on platform + // Another algorithms: "sha1", "md5", "sha256", "sha512" ... + let shasum = crypto.createHash(algorithm); + try { + let s = fs.createReadStream(filename); + s.on('data', function (data) { + shasum.update(data); + }); + + s.on('error', function (error) { + reject(error); + }); + + // making digest + s.on('end', function () { + const hash = shasum.digest('hex'); + return resolve(hash); + }); + } catch (error) { + return reject('calc fail'); + } + }); +} + +function createLocalState(localFiles, args) { + console.log(`Creating local state at ${args['local-dir']}${args['state-name']}`); + fs.writeFileSync(`${args['local-dir']}${args['state-name']}`, JSON.stringify(localFiles, undefined, 4), { encoding: 'utf8' }); + console.log('Local state created'); +} +async function getLocalFiles(args) { + const files = await readdir.async(args['local-dir'], { deep: true, stats: true, sep: '/', filter: (stat) => applyExcludeFilter(stat, args.exclude) }); + let records = []; + console.log(files.length, 'items'); + for (let stat of files) { + if (stat.isDirectory()) { + records.push({ + type: 'folder', + name: stat.path, + size: undefined, + }); + + continue; + } + + if (stat.isFile()) { + records.push({ + type: 'file', + name: stat.path, + size: stat.size, + hash: await fileHash(args['local-dir'] + stat.path, 'sha256'), + }); + + continue; + } + + if (stat.isSymbolicLink()) { + console.warn('This script is currently unable to handle symbolic links - please add a feature request if you need this'); + } + } + + return { + description: "Don't delete. Generate local", + version: '1.0.0', + generatedTime: new Date().getTime(), + generatedTimeString: new Date().toLocaleString(), + data: records, + }; +} + +try { + const [, , repoArg] = process.argv; + if (!repoArg) { + throw "error: Pls input repo: info | ghh | XX"; + } + const filename = `.generate-file-hash.json`; + const _args = { + 'local-dir': `./../${cfg[repoArg].folder}/`, + 'state-name': filename, + 'exclude': [filename, 'ftp-state/**'].concat(cfg[repoArg].exclude), + }; + const localFiles = await getLocalFiles(_args); + createLocalState(localFiles, _args); +} catch (error) { + console.log(error); +} diff --git a/repo-config.js b/repo-config.js new file mode 100644 index 0000000..d232320 --- /dev/null +++ b/repo-config.js @@ -0,0 +1,20 @@ +const defaultExclude = [ + '**/node_modules/**', '**/.git*/**', '**/.git*', + '*.{exe,docx}', + '**/cache*/**', '**/tmp*/**' +]; + +export const cfg = { + 'info': { + folder: 'HN-information-system', + exclude: [].concat(defaultExclude, ['{document,download_statement,sample}/**']), + }, + 'gh': { + folder: 'HN-globalhighlights.com', + exclude: [].concat(defaultExclude, ['**/{image,design,system}/**']), + }, + 'ch': { + folder: 'HN-chinahighlights.com', + exclude: [].concat(defaultExclude, ['**/{image,design,system,pdf}/**']), + }, +};