From 9d3e9abebfbd6797ee04621d8a9841b500e3cdbc Mon Sep 17 00:00:00 2001 From: Christopher Monsanto Date: Wed, 5 Apr 2023 00:40:07 -0400 Subject: [PATCH] deploy: add basic hash support so we can Just Ship It --- pnpm-lock.yaml | 14 ++++++++++++++ smogon.deploy.js | 8 +++++--- tools/deploy/package.json | 1 + tools/deploy/script.ts | 15 ++++++++++++++- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2dfedf78..5652ec0c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,6 +30,7 @@ importers: tools/deploy: specifiers: '@types/tar-stream': ^2.2.2 + base32-encode: ^2.0.0 commander: ^5.1.0 debug: ^4.1.1 expect: ^26.4.1 @@ -37,6 +38,7 @@ importers: tar-stream: ^3.0.0 dependencies: '@types/tar-stream': 2.2.2 + base32-encode: 2.0.0 commander: 5.1.0 debug: 4.1.1 tar-stream: 3.0.0 @@ -321,6 +323,13 @@ packages: resolution: {integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c=} dev: true + /base32-encode/2.0.0: + resolution: {integrity: sha512-mlmkfc2WqdDtMl/id4qm3A7RjW6jxcbAoMjdRmsPiwQP0ufD4oXItYMnPgVHe80lnAIy+1xwzhHE1s4FoIceSw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + to-data-view: 2.0.0 + dev: false + /base64-js/1.3.1: resolution: {integrity: sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==} dev: false @@ -1991,6 +2000,11 @@ packages: xtend: 4.0.2 dev: false + /to-data-view/2.0.0: + resolution: {integrity: sha512-RGEM5KqlPHr+WVTPmGNAXNeFEmsBnlkxXaIfEpUYV0AST2Z5W1EGq9L/MENFrMMmL2WQr1wjkmZy/M92eKhjYA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} diff --git a/smogon.deploy.js b/smogon.deploy.js index ce47ecaf..f4ea942b 100644 --- a/smogon.deploy.js +++ b/smogon.deploy.js @@ -17,7 +17,7 @@ function spritecopy(f, {dir, ext}) { if (sn.extra.has("a") || sn.extra.has("b") || sn.extra.has("s")) { return; } - + if (sn.extension) { // Skip this, we don't use Unknown/Substitute return; @@ -34,7 +34,7 @@ function spritecopy(f, {dir, ext}) { if (sn.extra.has("g")) { name += "-gmax"; } - + copy(f, {dir, ext, name}); } @@ -82,9 +82,11 @@ for (const f of list("build/item-minisprites-trimmed")) { itemspritecopy(f, {dir: "xyitems"}); } +let h = hash(...list("build/smogon/minisprites")); for (const f of list("build/smogon/minisprites")) { - newspritecopy(f, {dir: "minisprites"}); + newspritecopy(f, {dir: "minisprites/" + h}); } +write("minisprites/hash.txt", h); for (const f of list("build/item-minisprites-padded")) { itemspritecopy(f, {dir: "forumsprites"}); diff --git a/tools/deploy/package.json b/tools/deploy/package.json index 1a2c09ed..55a78152 100644 --- a/tools/deploy/package.json +++ b/tools/deploy/package.json @@ -1,6 +1,7 @@ { "dependencies": { "@types/tar-stream": "^2.2.2", + "base32-encode": "^2.0.0", "commander": "^5.1.0", "debug": "^4.1.1", "tar-stream": "^3.0.0" diff --git a/tools/deploy/script.ts b/tools/deploy/script.ts index a7beee19..224916c5 100644 --- a/tools/deploy/script.ts +++ b/tools/deploy/script.ts @@ -5,7 +5,8 @@ import vm from 'vm'; import * as pathlib from './path.js'; import * as spritedata from '@smogon/sprite-data'; import tar from 'tar-stream'; - +import crypto from 'crypto'; +import b32encode from 'base32-encode'; type Op = { type : 'Write', @@ -240,6 +241,18 @@ function makeEnv2(srcDir : string, queue: ActionQueue) { return fs.readFileSync(nodePath.join(srcDir, src), 'utf8'); }, + hash(...srcps : pathlib.PathLike[]) : string { + let hash = crypto.createHash("sha256"); + let srcs = srcps.map(srcp => pathlib.format(pathlib.path(srcp))).sort(); + for (let src of srcs) { + let data = fs.readFileSync(nodePath.join(srcDir, src)); + hash.update(data); + } + let buffer = hash.digest() + // Similar to esbuild? + return b32encode(buffer, 'RFC4648').slice(0, 8); + }, + write(dstp : pathlib.PathLike, data : string) { const dst = pathlib.format(pathlib.path(dstp)); queue.write(data, dst);