deploy: add basic hash support so we can Just Ship It

This commit is contained in:
Christopher Monsanto 2023-04-05 00:40:07 -04:00
parent 0bc74044c6
commit 9d3e9abebf
4 changed files with 34 additions and 4 deletions

View File

@ -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'}

View File

@ -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"});

View File

@ -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"

View File

@ -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);