backup_water_source.cjs 1.2 KB

123456789101112131415161718192021222324
  1. const fs = require('fs'), p = require('path'), c = require('crypto')
  2. const root = p.resolve(__dirname, '../..')
  3. const dest = fs.readFileSync(p.join(root, 'server/docs/cleanup-backup-location.txt'), 'utf8').replace(/^\uFEFF/, '').trim()
  4. const skip = new Set(['node_modules', 'vendor', 'runtime', 'dist', '.git'])
  5. const manifest = []
  6. const hash = x => c.createHash('sha256').update(fs.readFileSync(x)).digest('hex')
  7. function walk(d) {
  8. for (const e of fs.readdirSync(d, { withFileTypes: true })) {
  9. if (skip.has(e.name) || e.name.startsWith('.env') || e.name.endsWith('.zip') || e.isSymbolicLink()) continue
  10. const src = p.join(d, e.name)
  11. if (e.isDirectory()) walk(src)
  12. else {
  13. const rel = p.relative(root, src), out = p.join(dest, 'source', rel)
  14. fs.mkdirSync(p.dirname(out), { recursive: true })
  15. if (fs.existsSync(out)) throw Error('Backup already exists: ' + rel)
  16. fs.copyFileSync(src, out)
  17. if (hash(src) !== hash(out)) throw Error('Verification failed: ' + rel)
  18. manifest.push({ path: rel, sha256: hash(src) })
  19. }
  20. }
  21. }
  22. walk(root)
  23. fs.writeFileSync(p.join(dest, 'source-manifest.json'), JSON.stringify(manifest, null, 2))
  24. console.log('Verified source files:', manifest.length)