Merge pull request #3151 from github/koesie10/variant-analysis-yauzl
Switch to `yauzl` for variant analysis results
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
import { Entry as ZipEntry, open, Options as ZipOptions, ZipFile } from "yauzl";
|
||||
import { Readable } from "stream";
|
||||
import { dirname, join } from "path";
|
||||
import { WriteStream } from "fs";
|
||||
import { createWriteStream, ensureDir } from "fs-extra";
|
||||
|
||||
// We can't use promisify because it picks up the wrong overload.
|
||||
export function openZip(
|
||||
@@ -82,3 +85,63 @@ export async function openZipBuffer(
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function copyStream(
|
||||
readable: Readable,
|
||||
writeStream: WriteStream,
|
||||
): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
readable.on("error", (err) => {
|
||||
reject(err);
|
||||
});
|
||||
readable.on("end", () => {
|
||||
resolve();
|
||||
});
|
||||
|
||||
readable.pipe(writeStream);
|
||||
});
|
||||
}
|
||||
|
||||
export async function unzipToDirectory(
|
||||
archivePath: string,
|
||||
destinationPath: string,
|
||||
): Promise<void> {
|
||||
const zipFile = await openZip(archivePath, {
|
||||
autoClose: false,
|
||||
strictFileNames: true,
|
||||
lazyEntries: true,
|
||||
});
|
||||
|
||||
try {
|
||||
const entries = await readZipEntries(zipFile);
|
||||
|
||||
for (const entry of entries) {
|
||||
const path = join(destinationPath, entry.fileName);
|
||||
|
||||
if (/\/$/.test(entry.fileName)) {
|
||||
// Directory file names end with '/'
|
||||
|
||||
await ensureDir(path);
|
||||
} else {
|
||||
// Ensure the directory exists
|
||||
await ensureDir(dirname(path));
|
||||
|
||||
const readable = await openZipReadStream(zipFile, entry);
|
||||
|
||||
let mode: number | undefined = entry.externalFileAttributes >>> 16;
|
||||
if (mode <= 0) {
|
||||
mode = undefined;
|
||||
}
|
||||
|
||||
const writeStream = createWriteStream(path, {
|
||||
autoClose: true,
|
||||
mode,
|
||||
});
|
||||
|
||||
await copyStream(readable, writeStream);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
zipFile.close();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
import { Open } from "unzipper";
|
||||
|
||||
/**
|
||||
* Unzips a zip file to a directory.
|
||||
* @param sourcePath The path to the zip file.
|
||||
* @param destinationPath The path to the directory to unzip to.
|
||||
*/
|
||||
export async function unzipFile(sourcePath: string, destinationPath: string) {
|
||||
const file = await Open.file(sourcePath);
|
||||
await file.extract({ path: destinationPath });
|
||||
}
|
||||
@@ -16,7 +16,7 @@ import {
|
||||
} from "./shared/variant-analysis";
|
||||
import { DisposableObject, DisposeHandler } from "../common/disposable-object";
|
||||
import { EventEmitter } from "vscode";
|
||||
import { unzipFile } from "../common/zip";
|
||||
import { unzipToDirectory } from "../common/unzip";
|
||||
import { readRepoTask, writeRepoTask } from "./repo-tasks-store";
|
||||
|
||||
type CacheKey = `${number}/${string}`;
|
||||
@@ -106,7 +106,7 @@ export class VariantAnalysisResultsManager extends DisposableObject {
|
||||
VariantAnalysisResultsManager.RESULTS_DIRECTORY,
|
||||
);
|
||||
|
||||
await unzipFile(zipFilePath, unzippedFilesDirectory);
|
||||
await unzipToDirectory(zipFilePath, unzippedFilesDirectory);
|
||||
|
||||
this._onResultDownloaded.fire({
|
||||
variantAnalysisId,
|
||||
|
||||
@@ -54,8 +54,8 @@ describe(VariantAnalysisResultsManager.name, () => {
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
if (fs.existsSync(variantAnalysisStoragePath)) {
|
||||
fs.rmSync(variantAnalysisStoragePath, { recursive: true });
|
||||
if (await fs.pathExists(variantAnalysisStoragePath)) {
|
||||
await fs.remove(variantAnalysisStoragePath);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user