summaryrefslogtreecommitdiff
path: root/tests/download_deps.ts
diff options
context:
space:
mode:
authorIm-Beast <franik.mateusz@gmail.com>2025-01-03 19:45:53 +0100
committerIm-Beast <franik.mateusz@gmail.com>2025-01-03 19:45:53 +0100
commit753998450c6579fa5e369b7f889c156583816b8e (patch)
tree1e43e28bd5556334b0b37068fd3ea97916f50add /tests/download_deps.ts
parent804f1a8e3332bcdbff5f8c02547e57a80c4deb20 (diff)
chore: support fallback names in the download_deps utilzano
Diffstat (limited to 'tests/download_deps.ts')
-rw-r--r--tests/download_deps.ts171
1 files changed, 107 insertions, 64 deletions
diff --git a/tests/download_deps.ts b/tests/download_deps.ts
index 808640e..8871fa5 100644
--- a/tests/download_deps.ts
+++ b/tests/download_deps.ts
@@ -4,8 +4,11 @@ import { Coin, getMoneroCTags } from "./utils.ts";
export type Target = `${typeof Deno["build"]["os"]}_${typeof Deno["build"]["arch"]}`;
interface FileInfo {
- overrideMirrors?: string[];
- name: string;
+ // List of mirrors that override DownloadInfo mirrors for this FileInfo
+ overrideMirrors?: [mainFilePath: string, ...fallbacks: string[]];
+ // List of file names that fallback if previous failed
+ // If first name failed and got fallbacked by another, it will get renamed to the first entry
+ names: string[];
sha256?: string;
}
@@ -21,7 +24,7 @@ export function getFileInfo(
downloadInfo: DownloadInfo,
target: Target = `${Deno.build.os}_${Deno.build.arch}`,
): FileInfo {
- const fileInfo = "name" in downloadInfo.file ? downloadInfo.file : downloadInfo.file[target];
+ const fileInfo = "names" in downloadInfo.file ? downloadInfo.file : downloadInfo.file[target];
if (!fileInfo) {
throw new Error(`No fileInfo set for target: ${target}`);
}
@@ -37,6 +40,61 @@ export async function downloadDependencies(...infos: DownloadInfo[]): Promise<vo
return await downloadFiles("./tests/dependencies", `${Deno.build.os}_${Deno.build.arch}`, ...infos);
}
+async function tryToDownloadFile(
+ mirror: string,
+ fileInfo: FileInfo,
+ fileName: string,
+): Promise<Uint8Array | undefined> {
+ const url = `${mirror}/${fileName}`;
+
+ const response = await fetch(url);
+ if (!response.ok) {
+ console.warn(`Could not reach file ${fileName} on mirror: ${mirror}`);
+ await response.body?.cancel();
+ return;
+ }
+
+ const responseBuffer = await response.bytes();
+
+ if (fileInfo.sha256) {
+ const responseChecksum = await sha256(responseBuffer);
+ if (responseChecksum !== fileInfo.sha256) {
+ console.warn(
+ `Checksum mismatch on file ${fileName} on mirror: ${mirror} (${responseChecksum} != ${fileInfo.sha256})`,
+ );
+ return;
+ }
+ }
+
+ return responseBuffer;
+}
+
+async function validFileExists(filePath: string, fileInfo: FileInfo): Promise<boolean> {
+ const [mainFileName] = fileInfo.names;
+
+ let fileBuffer: Uint8Array;
+ try {
+ fileBuffer = await Deno.readFile(filePath);
+ } catch {
+ return false;
+ }
+
+ // File exists, make sure checksum matches
+ if (fileInfo.sha256) {
+ const fileChecksum = await sha256(fileBuffer);
+ if (fileChecksum !== fileInfo.sha256) {
+ console.log(
+ `File ${mainFileName} already exists, but checksum is mismatched (${fileChecksum} != ${fileInfo.sha256}), redownloading`,
+ );
+ await Deno.remove(filePath);
+ return false;
+ }
+ }
+
+ console.log(`File ${mainFileName} already exists, skipping`);
+ return true;
+}
+
export async function downloadFiles(outDir: string, target: Target, ...infos: DownloadInfo[]): Promise<void> {
try {
await Deno.mkdir(outDir, { recursive: true });
@@ -48,65 +106,40 @@ export async function downloadFiles(outDir: string, target: Target, ...infos: Do
for (const info of infos) {
const fileInfo = getFileInfo(info, target);
- const fileName = fileInfo.name;
- const filePath = join(outDir, info.outDir ?? "", fileName);
-
- file_might_exist: try {
- const fileBuffer = await Deno.readFile(filePath);
-
- // File exists, make sure checksum matches
- if (fileInfo.sha256) {
- const fileChecksum = await sha256(fileBuffer);
- if (fileChecksum !== fileInfo.sha256) {
- console.log(
- `File ${fileName} already exists, but checksum is mismatched (${fileChecksum} != ${fileInfo.sha256}), redownloading`,
- );
- await Deno.remove(filePath);
- break file_might_exist;
- }
- }
-
- console.log(`File ${fileName} already exists, skipping`);
+ const [mainFileName] = fileInfo.names;
+
+ if (
+ await validFileExists(
+ join(outDir, info.outDir || ""),
+ fileInfo,
+ )
+ ) {
continue;
- } catch { /**/ }
+ }
let buffer: Uint8Array | undefined;
+ outer: for (const mirror of fileInfo.overrideMirrors ?? info.mirrors) {
+ for (const fileName of fileInfo.names) {
+ buffer = await tryToDownloadFile(mirror, fileInfo, fileName);
- for (const mirror of fileInfo.overrideMirrors ?? info.mirrors) {
- const url = `${mirror}/${fileName}`;
-
- const response = await fetch(url);
- if (!response.ok) {
- console.warn(`Could not reach file ${fileName} on mirror: ${mirror}`);
- await response.body?.cancel();
- continue;
- }
-
- const responseBuffer = await response.bytes();
-
- if (fileInfo.sha256) {
- const responseChecksum = await sha256(responseBuffer);
- if (responseChecksum !== fileInfo.sha256) {
- console.warn(
- `Checksum mismatch on file ${fileName} on mirror: ${mirror} (${responseChecksum} != ${fileInfo.sha256})`,
- );
- continue;
+ if (buffer) {
+ break outer;
}
}
-
- buffer = responseBuffer;
}
if (!buffer) {
- throw new Error(`None of the mirrors for ${fileName} are available`);
+ throw new Error(`None of the mirrors for ${fileInfo.names} are available`);
}
+ const filePath = join(outDir, info.outDir ?? "", mainFileName);
+
await Deno.mkdir(resolve(filePath, ".."), {
recursive: true,
}).catch(() => {});
await Deno.writeFile(filePath, buffer);
- console.info("Downloaded file", fileInfo.name);
+ console.info("Downloaded file", filePath);
}
}
@@ -117,25 +150,25 @@ export const wowneroCliInfo: DownloadInfo = {
],
file: {
linux_aarch64: {
- name: "wownero-aarch64-linux-gnu-59db3fe8d.tar.bz2",
+ names: ["wownero-aarch64-linux-gnu-59db3fe8d.tar.bz2"],
sha256: "07ce678302c07a6e79d90be65cbda243d843d414fbadb30f972d6c226575cfa7",
},
linux_x86_64: {
- name: "wownero-x86_64-linux-gnu-59db3fe8d.tar.bz2",
+ names: ["wownero-x86_64-linux-gnu-59db3fe8d.tar.bz2"],
sha256: "03880967c70cc86558d962b8a281868c3934238ea457a36174ba72b99d70107e",
},
darwin_aarch64: {
- name: "wownero-aarch64-apple-darwin11-59db3fe8d.tar.bz2",
+ names: ["wownero-aarch64-apple-darwin11-59db3fe8d.tar.bz2"],
sha256: "25ff454a92b1cf036df5f28cdd2c63dcaf4b03da7da9403087371f868827c957",
},
darwin_x86_64: {
- name: "wownero-x86_64-apple-darwin11-59db3fe8d.tar.bz2",
+ names: ["wownero-x86_64-apple-darwin11-59db3fe8d.tar.bz2"],
sha256: "7e9b6a84a560ed7a9ed7117c6f07fb228d77a06afac863d0ea1dbf833c4eddf6",
},
windows_x86_64: {
- name: "wownero-x86_64-w64-mingw32-59db3fe8d.zip",
+ names: ["wownero-x86_64-w64-mingw32-59db3fe8d.zip"],
sha256: "7e0ed84afa51e3b403d635c706042859094eb6850de21c9e82cb0a104425510e",
},
@@ -144,7 +177,7 @@ export const wowneroCliInfo: DownloadInfo = {
"https://static.mrcyjanek.net/download_mirror/",
"https://codeberg.org/wownero/wownero/releases/download/v0.11.1.0/",
],
- name: "wownero-aarch64-linux-android-v0.11.1.0.tar.bz2",
+ names: ["wownero-aarch64-linux-android-v0.11.1.0.tar.bz2"],
sha256: "236188f8d8e7fad2ff35973f8c2417afffa8855d1a57b4c682fff5b199ea40f5",
},
},
@@ -157,30 +190,30 @@ export const moneroCliInfo: DownloadInfo = {
],
file: {
linux_aarch64: {
- name: "monero-linux-armv8-v0.18.3.4.tar.bz2",
+ names: ["monero-linux-armv8-v0.18.3.4.tar.bz2"],
sha256: "33ca2f0055529d225b61314c56370e35606b40edad61c91c859f873ed67a1ea7",
},
linux_x86_64: {
- name: "monero-linux-x64-v0.18.3.4.tar.bz2",
+ names: ["monero-linux-x64-v0.18.3.4.tar.bz2"],
sha256: "51ba03928d189c1c11b5379cab17dd9ae8d2230056dc05c872d0f8dba4a87f1d",
},
darwin_aarch64: {
- name: "monero-mac-armv8-v0.18.3.4.tar.bz2",
+ names: ["monero-mac-armv8-v0.18.3.4.tar.bz2"],
sha256: "44520cb3a05c2518ca9aeae1b2e3080fe2bba1e3596d014ceff1090dfcba8ab4",
},
darwin_x86_64: {
- name: "monero-mac-x64-v0.18.3.4.tar.bz2",
+ names: ["monero-mac-x64-v0.18.3.4.tar.bz2"],
sha256: "32c449f562216d3d83154e708471236d07db7477d6b67f1936a0a85a5005f2b8",
},
windows_x86_64: {
- name: "monero-win-x64-v0.18.3.4.zip",
+ names: ["monero-win-x64-v0.18.3.4.zip"],
sha256: "54a66db6c892b2a0999754841f4ca68511741b88ea3ab20c7cd504a027f465f5",
},
android_aarch64: {
- name: "monero-android-armv8-v0.18.3.4.tar.bz2",
+ names: ["monero-android-armv8-v0.18.3.4.tar.bz2"],
sha256: "d9c9249d1408822ce36b346c6b9fb6b896cda16714d62117fb1c588a5201763c",
},
},
@@ -199,12 +232,22 @@ for (const tag of await getMoneroCTags()) {
`https://github.com/MrCyjaneK/monero_c/releases/download/${tag}/`,
],
file: {
- linux_aarch64: { name: `${coin}_aarch64-linux-gnu_libwallet2_api_c.so.xz` },
- linux_x86_64: { name: `${coin}_x86_64-linux-gnu_libwallet2_api_c.so.xz` },
- darwin_aarch64: { name: `${coin}_aarch64-apple-darwin11_libwallet2_api_c.dylib.xz` },
- darwin_x86_64: { name: `${coin}_x86_64-apple-darwin11_libwallet2_api_c.dylib.xz` },
- windows_x86_64: { name: `${coin}_x86_64-w64-mingw32_libwallet2_api_c.dll.xz` },
- android_aarch64: { name: `${coin}_aarch64-linux-android_libwallet2_api_c.so.xz` },
+ linux_aarch64: { names: [`${coin}_aarch64-linux-gnu_libwallet2_api_c.so.xz`] },
+ linux_x86_64: { names: [`${coin}_x86_64-linux-gnu_libwallet2_api_c.so.xz`] },
+ darwin_aarch64: {
+ names: [
+ `${coin}_aarch64-apple-darwin11_libwallet2_api_c.dylib.xz`,
+ `${coin}_aarch64-apple-darwin_libwallet2_api_c.dylib.xz`,
+ ],
+ },
+ darwin_x86_64: {
+ names: [
+ `${coin}_x86_64-apple-darwin11_libwallet2_api_c.dylib.xz`,
+ `${coin}_x86_64-apple-darwin_libwallet2_api_c.dylib.xz`,
+ ],
+ },
+ windows_x86_64: { names: [`${coin}_x86_64-w64-mingw32_libwallet2_api_c.dll.xz`] },
+ android_aarch64: { names: [`${coin}_aarch64-linux-android_libwallet2_api_c.so.xz`] },
},
outDir: `libs/${tag}`,
});