@tyvm/knowhow 0.0.109-dev.05fe5a0 → 0.0.109-dev.e88af1e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/fileSync.ts +20 -12
- package/src/hashes.ts +35 -13
- package/ts_build/package.json +1 -1
- package/ts_build/src/fileSync.d.ts +2 -2
- package/ts_build/src/fileSync.js +13 -11
- package/ts_build/src/fileSync.js.map +1 -1
- package/ts_build/src/hashes.d.ts +2 -2
- package/ts_build/src/hashes.js +35 -9
- package/ts_build/src/hashes.js.map +1 -1
package/package.json
CHANGED
package/src/fileSync.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { loadJwt } from "./login";
|
|
|
6
6
|
import { getConfig } from "./config";
|
|
7
7
|
import { services } from "./services";
|
|
8
8
|
import { S3Service } from "./services/S3";
|
|
9
|
-
import { getHashes, hasFileChangedSinceUpload, saveUploadHash, isLocalFileMatchingRemote, isLocalFileMatchingDownloadHash, saveDownloadHash } from "./hashes";
|
|
9
|
+
import { getHashes, saveHashes, hasFileChangedSinceUpload, saveUploadHash, isLocalFileMatchingRemote, isLocalFileMatchingDownloadHash, saveDownloadHash } from "./hashes";
|
|
10
10
|
|
|
11
11
|
export const DEFAULT_BATCH_SIZE = 5;
|
|
12
12
|
|
|
@@ -165,7 +165,8 @@ export async function downloadFile(
|
|
|
165
165
|
s3Service: S3Service,
|
|
166
166
|
remotePath: string,
|
|
167
167
|
localPath: string,
|
|
168
|
-
dryRun: boolean
|
|
168
|
+
dryRun: boolean,
|
|
169
|
+
hashes?: any
|
|
169
170
|
): Promise<void> {
|
|
170
171
|
console.log(`⬇️ Downloading ${remotePath} → ${localPath}`);
|
|
171
172
|
|
|
@@ -176,8 +177,7 @@ export async function downloadFile(
|
|
|
176
177
|
|
|
177
178
|
try {
|
|
178
179
|
// Fast-path: check stored download hash before hitting the API
|
|
179
|
-
|
|
180
|
-
if (await isLocalFileMatchingDownloadHash(localPath, hashes)) {
|
|
180
|
+
if (hashes && await isLocalFileMatchingDownloadHash(localPath, hashes)) {
|
|
181
181
|
console.log(` ✓ Skipping ${localPath} (matches stored download hash)`);
|
|
182
182
|
return;
|
|
183
183
|
}
|
|
@@ -189,7 +189,7 @@ export async function downloadFile(
|
|
|
189
189
|
if (isLocalFileMatchingRemote(localPath, checksumSHA256)) {
|
|
190
190
|
console.log(` ✓ Skipping ${localPath} (matches remote checksum)`);
|
|
191
191
|
// Store the hash so future syncs can skip without hitting the API
|
|
192
|
-
await saveDownloadHash(localPath);
|
|
192
|
+
await saveDownloadHash(localPath, hashes);
|
|
193
193
|
return;
|
|
194
194
|
}
|
|
195
195
|
|
|
@@ -203,7 +203,7 @@ export async function downloadFile(
|
|
|
203
203
|
await s3Service.downloadFromPresignedUrl(downloadUrl, localPath);
|
|
204
204
|
|
|
205
205
|
// Save download hash so we can skip unchanged files next time
|
|
206
|
-
await saveDownloadHash(localPath);
|
|
206
|
+
await saveDownloadHash(localPath, hashes);
|
|
207
207
|
|
|
208
208
|
// Get file size for logging
|
|
209
209
|
const stats = fs.statSync(localPath);
|
|
@@ -221,7 +221,8 @@ export async function uploadFile(
|
|
|
221
221
|
s3Service: S3Service,
|
|
222
222
|
remotePath: string,
|
|
223
223
|
localPath: string,
|
|
224
|
-
dryRun: boolean
|
|
224
|
+
dryRun: boolean,
|
|
225
|
+
hashes?: any
|
|
225
226
|
): Promise<void> {
|
|
226
227
|
console.log(`⬆️ Uploading ${localPath} → ${remotePath}`);
|
|
227
228
|
|
|
@@ -237,8 +238,7 @@ export async function uploadFile(
|
|
|
237
238
|
}
|
|
238
239
|
|
|
239
240
|
// Skip upload if file hasn't changed since last upload
|
|
240
|
-
const
|
|
241
|
-
const changed = await hasFileChangedSinceUpload(localPath, hashes);
|
|
241
|
+
const changed = hashes ? await hasFileChangedSinceUpload(localPath, hashes) : true;
|
|
242
242
|
if (!changed) {
|
|
243
243
|
console.log(` ✓ Skipping ${localPath} (unchanged since last upload)`);
|
|
244
244
|
return;
|
|
@@ -254,7 +254,7 @@ export async function uploadFile(
|
|
|
254
254
|
await client.markOrgFileUploadComplete(remotePath);
|
|
255
255
|
|
|
256
256
|
// Save upload hash so we can skip unchanged files next time
|
|
257
|
-
await saveUploadHash(localPath);
|
|
257
|
+
await saveUploadHash(localPath, hashes);
|
|
258
258
|
|
|
259
259
|
const stats = fs.statSync(localPath);
|
|
260
260
|
console.log(` ✓ Uploaded ${stats.size} bytes`);
|
|
@@ -276,6 +276,8 @@ export async function uploadDirectory(
|
|
|
276
276
|
|
|
277
277
|
console.log(`⬆️ Uploading directory ${localDir} → ${remoteDir}`);
|
|
278
278
|
|
|
279
|
+
const hashes = await getHashes();
|
|
280
|
+
|
|
279
281
|
if (!fs.existsSync(localDir)) {
|
|
280
282
|
console.warn(` ⚠️ Local directory not found: ${localDir}`);
|
|
281
283
|
return 0;
|
|
@@ -295,7 +297,7 @@ export async function uploadDirectory(
|
|
|
295
297
|
const localFilePath = localDir + relFile;
|
|
296
298
|
const remoteFilePath = remoteDir + relFile;
|
|
297
299
|
try {
|
|
298
|
-
await uploadFile(client, s3Service, remoteFilePath, localFilePath, dryRun);
|
|
300
|
+
await uploadFile(client, s3Service, remoteFilePath, localFilePath, dryRun, hashes);
|
|
299
301
|
return 1;
|
|
300
302
|
} catch (error) {
|
|
301
303
|
console.error(
|
|
@@ -306,6 +308,8 @@ export async function uploadDirectory(
|
|
|
306
308
|
});
|
|
307
309
|
|
|
308
310
|
const counts = await batchRun(tasks);
|
|
311
|
+
await saveHashes(hashes);
|
|
312
|
+
|
|
309
313
|
return counts.reduce((sum, n) => sum + n, 0);
|
|
310
314
|
}
|
|
311
315
|
|
|
@@ -325,6 +329,8 @@ export async function downloadDirectory(
|
|
|
325
329
|
|
|
326
330
|
console.log(`⬇️ Downloading directory ${remoteDir} → ${localDir}`);
|
|
327
331
|
|
|
332
|
+
const hashes = await getHashes();
|
|
333
|
+
|
|
328
334
|
// List all org files and find those in the remote directory
|
|
329
335
|
const response = await client.listOrgFiles();
|
|
330
336
|
const allFiles = response.data;
|
|
@@ -352,10 +358,12 @@ export async function downloadDirectory(
|
|
|
352
358
|
// Strip the base remote dir prefix to get relative path
|
|
353
359
|
const relativePath = fullRemotePath.slice(remoteDir.length);
|
|
354
360
|
const localFilePath = localDir + relativePath;
|
|
355
|
-
await downloadFile(client, s3Service, fullRemotePath, localFilePath, dryRun);
|
|
361
|
+
await downloadFile(client, s3Service, fullRemotePath, localFilePath, dryRun, hashes);
|
|
356
362
|
return 1;
|
|
357
363
|
});
|
|
358
364
|
|
|
359
365
|
const counts = await batchRun(tasks);
|
|
366
|
+
await saveHashes(hashes);
|
|
367
|
+
|
|
360
368
|
return counts.reduce((sum, n) => sum + n, 0);
|
|
361
369
|
}
|
package/src/hashes.ts
CHANGED
|
@@ -1,16 +1,35 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import * as crypto from "crypto";
|
|
3
3
|
import { Hashes } from "./types";
|
|
4
|
-
import { readFile
|
|
4
|
+
import { readFile } from "./utils";
|
|
5
5
|
import { convertToText } from "./conversion";
|
|
6
6
|
|
|
7
7
|
export async function getHashes() {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
try {
|
|
9
|
+
const hashes = JSON.parse(await readFile(".knowhow/.hashes.json", "utf8"));
|
|
10
|
+
return hashes as Hashes;
|
|
11
|
+
} catch (err: any) {
|
|
12
|
+
if (err.code === "ENOENT") {
|
|
13
|
+
return {} as Hashes;
|
|
14
|
+
}
|
|
15
|
+
throw err;
|
|
16
|
+
}
|
|
10
17
|
}
|
|
11
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Atomically save hashes to disk — writes to a temp file then renames,
|
|
21
|
+
* preventing concurrent writes from producing corrupted/truncated JSON.
|
|
22
|
+
*/
|
|
12
23
|
export async function saveHashes(hashes: any) {
|
|
13
|
-
|
|
24
|
+
const target = ".knowhow/.hashes.json";
|
|
25
|
+
const tmp = `${target}.tmp.${process.pid}`;
|
|
26
|
+
try {
|
|
27
|
+
fs.writeFileSync(tmp, JSON.stringify(hashes, null, 2));
|
|
28
|
+
fs.renameSync(tmp, target);
|
|
29
|
+
} catch (err) {
|
|
30
|
+
try { fs.unlinkSync(tmp); } catch (_) {}
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
14
33
|
}
|
|
15
34
|
|
|
16
35
|
export async function md5Hash(str: string) {
|
|
@@ -90,17 +109,19 @@ export async function hasFileChangedSinceUpload(
|
|
|
90
109
|
}
|
|
91
110
|
|
|
92
111
|
/**
|
|
93
|
-
*
|
|
112
|
+
* Mutates the provided hashes object with the upload hash for localPath.
|
|
113
|
+
* If no hashes object is provided, loads, mutates, and saves independently.
|
|
94
114
|
*/
|
|
95
|
-
export async function saveUploadHash(localPath: string) {
|
|
96
|
-
const
|
|
115
|
+
export async function saveUploadHash(localPath: string, hashes?: any) {
|
|
116
|
+
const standalone = !hashes;
|
|
117
|
+
if (standalone) hashes = await getHashes();
|
|
97
118
|
const content = fs.readFileSync(localPath);
|
|
98
119
|
const currentHash = crypto.createHash("md5").update(content).digest("hex");
|
|
99
120
|
if (!hashes[localPath]) {
|
|
100
121
|
hashes[localPath] = { fileHash: currentHash, promptHash: "" };
|
|
101
122
|
}
|
|
102
123
|
hashes[localPath][UPLOAD_KEY] = currentHash;
|
|
103
|
-
await saveHashes(hashes);
|
|
124
|
+
if (standalone) await saveHashes(hashes);
|
|
104
125
|
}
|
|
105
126
|
|
|
106
127
|
/**
|
|
@@ -120,18 +141,19 @@ export async function isLocalFileMatchingDownloadHash(
|
|
|
120
141
|
}
|
|
121
142
|
|
|
122
143
|
/**
|
|
123
|
-
*
|
|
124
|
-
*
|
|
144
|
+
* Mutates the provided hashes object with the download hash for localPath.
|
|
145
|
+
* If no hashes object is provided, loads, mutates, and saves independently.
|
|
125
146
|
*/
|
|
126
|
-
export async function saveDownloadHash(localPath: string) {
|
|
127
|
-
const
|
|
147
|
+
export async function saveDownloadHash(localPath: string, hashes?: any) {
|
|
148
|
+
const standalone = !hashes;
|
|
149
|
+
if (standalone) hashes = await getHashes();
|
|
128
150
|
const content = fs.readFileSync(localPath);
|
|
129
151
|
const currentHash = crypto.createHash("sha256").update(content).digest("base64");
|
|
130
152
|
if (!hashes[localPath]) {
|
|
131
153
|
hashes[localPath] = { fileHash: currentHash, promptHash: "" };
|
|
132
154
|
}
|
|
133
155
|
hashes[localPath][DOWNLOAD_KEY] = currentHash;
|
|
134
|
-
await saveHashes(hashes);
|
|
156
|
+
if (standalone) await saveHashes(hashes);
|
|
135
157
|
}
|
|
136
158
|
|
|
137
159
|
/**
|
package/ts_build/package.json
CHANGED
|
@@ -11,7 +11,7 @@ export interface FileSyncOptions {
|
|
|
11
11
|
export declare function batchRun<T>(tasks: (() => Promise<T>)[], batchSize?: number): Promise<T[]>;
|
|
12
12
|
export declare function listFilesRecursively(dir: string): string[];
|
|
13
13
|
export declare function fileSync(options?: FileSyncOptions): Promise<void>;
|
|
14
|
-
export declare function downloadFile(client: KnowhowSimpleClient, s3Service: S3Service, remotePath: string, localPath: string, dryRun: boolean): Promise<void>;
|
|
15
|
-
export declare function uploadFile(client: KnowhowSimpleClient, s3Service: S3Service, remotePath: string, localPath: string, dryRun: boolean): Promise<void>;
|
|
14
|
+
export declare function downloadFile(client: KnowhowSimpleClient, s3Service: S3Service, remotePath: string, localPath: string, dryRun: boolean, hashes?: any): Promise<void>;
|
|
15
|
+
export declare function uploadFile(client: KnowhowSimpleClient, s3Service: S3Service, remotePath: string, localPath: string, dryRun: boolean, hashes?: any): Promise<void>;
|
|
16
16
|
export declare function uploadDirectory(client: KnowhowSimpleClient, s3Service: S3Service, remotePath: string, localPath: string, dryRun: boolean): Promise<number>;
|
|
17
17
|
export declare function downloadDirectory(client: KnowhowSimpleClient, s3Service: S3Service, remotePath: string, localPath: string, dryRun: boolean): Promise<number>;
|
package/ts_build/src/fileSync.js
CHANGED
|
@@ -145,22 +145,21 @@ async function fileSync(options = {}) {
|
|
|
145
145
|
process.exit(1);
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
|
-
async function downloadFile(client, s3Service, remotePath, localPath, dryRun) {
|
|
148
|
+
async function downloadFile(client, s3Service, remotePath, localPath, dryRun, hashes) {
|
|
149
149
|
console.log(`⬇️ Downloading ${remotePath} → ${localPath}`);
|
|
150
150
|
if (dryRun) {
|
|
151
151
|
console.log(` [DRY RUN] Would download to ${localPath}`);
|
|
152
152
|
return;
|
|
153
153
|
}
|
|
154
154
|
try {
|
|
155
|
-
|
|
156
|
-
if (await (0, hashes_1.isLocalFileMatchingDownloadHash)(localPath, hashes)) {
|
|
155
|
+
if (hashes && await (0, hashes_1.isLocalFileMatchingDownloadHash)(localPath, hashes)) {
|
|
157
156
|
console.log(` ✓ Skipping ${localPath} (matches stored download hash)`);
|
|
158
157
|
return;
|
|
159
158
|
}
|
|
160
159
|
const { downloadUrl, checksumSHA256 } = await client.getOrgFilePresignedDownloadUrl(remotePath);
|
|
161
160
|
if ((0, hashes_1.isLocalFileMatchingRemote)(localPath, checksumSHA256)) {
|
|
162
161
|
console.log(` ✓ Skipping ${localPath} (matches remote checksum)`);
|
|
163
|
-
await (0, hashes_1.saveDownloadHash)(localPath);
|
|
162
|
+
await (0, hashes_1.saveDownloadHash)(localPath, hashes);
|
|
164
163
|
return;
|
|
165
164
|
}
|
|
166
165
|
const dir = path.dirname(localPath);
|
|
@@ -168,7 +167,7 @@ async function downloadFile(client, s3Service, remotePath, localPath, dryRun) {
|
|
|
168
167
|
fs.mkdirSync(dir, { recursive: true });
|
|
169
168
|
}
|
|
170
169
|
await s3Service.downloadFromPresignedUrl(downloadUrl, localPath);
|
|
171
|
-
await (0, hashes_1.saveDownloadHash)(localPath);
|
|
170
|
+
await (0, hashes_1.saveDownloadHash)(localPath, hashes);
|
|
172
171
|
const stats = fs.statSync(localPath);
|
|
173
172
|
console.log(` ✓ Downloaded ${stats.size} bytes`);
|
|
174
173
|
}
|
|
@@ -176,7 +175,7 @@ async function downloadFile(client, s3Service, remotePath, localPath, dryRun) {
|
|
|
176
175
|
throw error;
|
|
177
176
|
}
|
|
178
177
|
}
|
|
179
|
-
async function uploadFile(client, s3Service, remotePath, localPath, dryRun) {
|
|
178
|
+
async function uploadFile(client, s3Service, remotePath, localPath, dryRun, hashes) {
|
|
180
179
|
console.log(`⬆️ Uploading ${localPath} → ${remotePath}`);
|
|
181
180
|
if (dryRun) {
|
|
182
181
|
console.log(` [DRY RUN] Would upload from ${localPath}`);
|
|
@@ -186,8 +185,7 @@ async function uploadFile(client, s3Service, remotePath, localPath, dryRun) {
|
|
|
186
185
|
console.warn(` ⚠️ Local file not found: ${localPath}`);
|
|
187
186
|
return;
|
|
188
187
|
}
|
|
189
|
-
const
|
|
190
|
-
const changed = await (0, hashes_1.hasFileChangedSinceUpload)(localPath, hashes);
|
|
188
|
+
const changed = hashes ? await (0, hashes_1.hasFileChangedSinceUpload)(localPath, hashes) : true;
|
|
191
189
|
if (!changed) {
|
|
192
190
|
console.log(` ✓ Skipping ${localPath} (unchanged since last upload)`);
|
|
193
191
|
return;
|
|
@@ -195,7 +193,7 @@ async function uploadFile(client, s3Service, remotePath, localPath, dryRun) {
|
|
|
195
193
|
const presignedUrl = await client.getOrgFilePresignedUploadUrl(remotePath, localPath);
|
|
196
194
|
await s3Service.uploadToPresignedUrl(presignedUrl, localPath);
|
|
197
195
|
await client.markOrgFileUploadComplete(remotePath);
|
|
198
|
-
await (0, hashes_1.saveUploadHash)(localPath);
|
|
196
|
+
await (0, hashes_1.saveUploadHash)(localPath, hashes);
|
|
199
197
|
const stats = fs.statSync(localPath);
|
|
200
198
|
console.log(` ✓ Uploaded ${stats.size} bytes`);
|
|
201
199
|
}
|
|
@@ -203,6 +201,7 @@ async function uploadDirectory(client, s3Service, remotePath, localPath, dryRun)
|
|
|
203
201
|
const remoteDir = remotePath.endsWith("/") ? remotePath : remotePath + "/";
|
|
204
202
|
const localDir = localPath.endsWith("/") ? localPath : localPath + "/";
|
|
205
203
|
console.log(`⬆️ Uploading directory ${localDir} → ${remoteDir}`);
|
|
204
|
+
const hashes = await (0, hashes_1.getHashes)();
|
|
206
205
|
if (!fs.existsSync(localDir)) {
|
|
207
206
|
console.warn(` ⚠️ Local directory not found: ${localDir}`);
|
|
208
207
|
return 0;
|
|
@@ -217,7 +216,7 @@ async function uploadDirectory(client, s3Service, remotePath, localPath, dryRun)
|
|
|
217
216
|
const localFilePath = localDir + relFile;
|
|
218
217
|
const remoteFilePath = remoteDir + relFile;
|
|
219
218
|
try {
|
|
220
|
-
await uploadFile(client, s3Service, remoteFilePath, localFilePath, dryRun);
|
|
219
|
+
await uploadFile(client, s3Service, remoteFilePath, localFilePath, dryRun, hashes);
|
|
221
220
|
return 1;
|
|
222
221
|
}
|
|
223
222
|
catch (error) {
|
|
@@ -226,12 +225,14 @@ async function uploadDirectory(client, s3Service, remotePath, localPath, dryRun)
|
|
|
226
225
|
}
|
|
227
226
|
});
|
|
228
227
|
const counts = await batchRun(tasks);
|
|
228
|
+
await (0, hashes_1.saveHashes)(hashes);
|
|
229
229
|
return counts.reduce((sum, n) => sum + n, 0);
|
|
230
230
|
}
|
|
231
231
|
async function downloadDirectory(client, s3Service, remotePath, localPath, dryRun) {
|
|
232
232
|
const remoteDir = remotePath.endsWith("/") ? remotePath : remotePath + "/";
|
|
233
233
|
const localDir = localPath.endsWith("/") ? localPath : localPath + "/";
|
|
234
234
|
console.log(`⬇️ Downloading directory ${remoteDir} → ${localDir}`);
|
|
235
|
+
const hashes = await (0, hashes_1.getHashes)();
|
|
235
236
|
const response = await client.listOrgFiles();
|
|
236
237
|
const allFiles = response.data;
|
|
237
238
|
const matchingFiles = allFiles.filter((f) => {
|
|
@@ -251,10 +252,11 @@ async function downloadDirectory(client, s3Service, remotePath, localPath, dryRu
|
|
|
251
252
|
: f.folderPath + "/" + f.fileName;
|
|
252
253
|
const relativePath = fullRemotePath.slice(remoteDir.length);
|
|
253
254
|
const localFilePath = localDir + relativePath;
|
|
254
|
-
await downloadFile(client, s3Service, fullRemotePath, localFilePath, dryRun);
|
|
255
|
+
await downloadFile(client, s3Service, fullRemotePath, localFilePath, dryRun, hashes);
|
|
255
256
|
return 1;
|
|
256
257
|
});
|
|
257
258
|
const counts = await batchRun(tasks);
|
|
259
|
+
await (0, hashes_1.saveHashes)(hashes);
|
|
258
260
|
return counts.reduce((sum, n) => sum + n, 0);
|
|
259
261
|
}
|
|
260
262
|
//# sourceMappingURL=fileSync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileSync.js","sourceRoot":"","sources":["../../src/fileSync.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,4BAWC;AAsBD,oDAeC;AAKD,4BAgFC;AAKD,oCAmDC;AAKD,gCA0CC;AAKD,
|
|
1
|
+
{"version":3,"file":"fileSync.js","sourceRoot":"","sources":["../../src/fileSync.ts"],"names":[],"mappings":"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"}
|
package/ts_build/src/hashes.d.ts
CHANGED
|
@@ -5,8 +5,8 @@ export declare function md5Hash(str: string): Promise<string>;
|
|
|
5
5
|
export declare function checkNoFilesChanged(files: string[], promptHash: string, hashes: any): Promise<boolean>;
|
|
6
6
|
export declare function saveAllFileHashes(files: string[], promptHash: string): Promise<void>;
|
|
7
7
|
export declare function hasFileChangedSinceUpload(localPath: string, hashes: any): Promise<boolean>;
|
|
8
|
-
export declare function saveUploadHash(localPath: string): Promise<void>;
|
|
8
|
+
export declare function saveUploadHash(localPath: string, hashes?: any): Promise<void>;
|
|
9
9
|
export declare function isLocalFileMatchingDownloadHash(localPath: string, hashes: any): Promise<boolean>;
|
|
10
|
-
export declare function saveDownloadHash(localPath: string): Promise<void>;
|
|
10
|
+
export declare function saveDownloadHash(localPath: string, hashes?: any): Promise<void>;
|
|
11
11
|
export declare function computeSHA256Base64(filePath: string): string;
|
|
12
12
|
export declare function isLocalFileMatchingRemote(localPath: string, remoteChecksumSHA256: string | null): boolean;
|
package/ts_build/src/hashes.js
CHANGED
|
@@ -52,11 +52,31 @@ const crypto = __importStar(require("crypto"));
|
|
|
52
52
|
const utils_1 = require("./utils");
|
|
53
53
|
const conversion_1 = require("./conversion");
|
|
54
54
|
async function getHashes() {
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
try {
|
|
56
|
+
const hashes = JSON.parse(await (0, utils_1.readFile)(".knowhow/.hashes.json", "utf8"));
|
|
57
|
+
return hashes;
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
if (err.code === "ENOENT") {
|
|
61
|
+
return {};
|
|
62
|
+
}
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
57
65
|
}
|
|
58
66
|
async function saveHashes(hashes) {
|
|
59
|
-
|
|
67
|
+
const target = ".knowhow/.hashes.json";
|
|
68
|
+
const tmp = `${target}.tmp.${process.pid}`;
|
|
69
|
+
try {
|
|
70
|
+
fs_1.default.writeFileSync(tmp, JSON.stringify(hashes, null, 2));
|
|
71
|
+
fs_1.default.renameSync(tmp, target);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
try {
|
|
75
|
+
fs_1.default.unlinkSync(tmp);
|
|
76
|
+
}
|
|
77
|
+
catch (_) { }
|
|
78
|
+
throw err;
|
|
79
|
+
}
|
|
60
80
|
}
|
|
61
81
|
async function md5Hash(str) {
|
|
62
82
|
return crypto.createHash("md5").update(str).digest("hex");
|
|
@@ -106,15 +126,18 @@ async function hasFileChangedSinceUpload(localPath, hashes) {
|
|
|
106
126
|
const currentHash = crypto.createHash("md5").update(content).digest("hex");
|
|
107
127
|
return hashes[localPath]?.[UPLOAD_KEY] !== currentHash;
|
|
108
128
|
}
|
|
109
|
-
async function saveUploadHash(localPath) {
|
|
110
|
-
const
|
|
129
|
+
async function saveUploadHash(localPath, hashes) {
|
|
130
|
+
const standalone = !hashes;
|
|
131
|
+
if (standalone)
|
|
132
|
+
hashes = await getHashes();
|
|
111
133
|
const content = fs_1.default.readFileSync(localPath);
|
|
112
134
|
const currentHash = crypto.createHash("md5").update(content).digest("hex");
|
|
113
135
|
if (!hashes[localPath]) {
|
|
114
136
|
hashes[localPath] = { fileHash: currentHash, promptHash: "" };
|
|
115
137
|
}
|
|
116
138
|
hashes[localPath][UPLOAD_KEY] = currentHash;
|
|
117
|
-
|
|
139
|
+
if (standalone)
|
|
140
|
+
await saveHashes(hashes);
|
|
118
141
|
}
|
|
119
142
|
async function isLocalFileMatchingDownloadHash(localPath, hashes) {
|
|
120
143
|
if (!fs_1.default.existsSync(localPath))
|
|
@@ -126,15 +149,18 @@ async function isLocalFileMatchingDownloadHash(localPath, hashes) {
|
|
|
126
149
|
const currentHash = crypto.createHash("sha256").update(content).digest("base64");
|
|
127
150
|
return storedHash === currentHash;
|
|
128
151
|
}
|
|
129
|
-
async function saveDownloadHash(localPath) {
|
|
130
|
-
const
|
|
152
|
+
async function saveDownloadHash(localPath, hashes) {
|
|
153
|
+
const standalone = !hashes;
|
|
154
|
+
if (standalone)
|
|
155
|
+
hashes = await getHashes();
|
|
131
156
|
const content = fs_1.default.readFileSync(localPath);
|
|
132
157
|
const currentHash = crypto.createHash("sha256").update(content).digest("base64");
|
|
133
158
|
if (!hashes[localPath]) {
|
|
134
159
|
hashes[localPath] = { fileHash: currentHash, promptHash: "" };
|
|
135
160
|
}
|
|
136
161
|
hashes[localPath][DOWNLOAD_KEY] = currentHash;
|
|
137
|
-
|
|
162
|
+
if (standalone)
|
|
163
|
+
await saveHashes(hashes);
|
|
138
164
|
}
|
|
139
165
|
function computeSHA256Base64(filePath) {
|
|
140
166
|
const content = fs_1.default.readFileSync(filePath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hashes.js","sourceRoot":"","sources":["../../src/hashes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,
|
|
1
|
+
{"version":3,"file":"hashes.js","sourceRoot":"","sources":["../../src/hashes.ts"],"names":[],"mappings":"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"}
|