From a24b9c018472b37d4672b1e9e956f5d6b59d6e76 Mon Sep 17 00:00:00 2001 From: bethanyj28 Date: Thu, 22 Feb 2024 21:54:54 -0500 Subject: [PATCH] handle directories --- .../internal/download/download-artifact.ts | 47 +++++++++++++------ 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/packages/artifact/src/internal/download/download-artifact.ts b/packages/artifact/src/internal/download/download-artifact.ts index ef4d3fca..5e893b4c 100644 --- a/packages/artifact/src/internal/download/download-artifact.ts +++ b/packages/artifact/src/internal/download/download-artifact.ts @@ -72,7 +72,7 @@ export async function streamExtractExternal( const timeout = 30 * 1000 // 30 seconds - return new Promise((resolve, reject) => { + return new Promise(async (resolve, reject) => { const timerFn = (): void => { response.message.destroy( new Error(`Blob storage chunk did not respond in ${timeout}ms`) @@ -93,23 +93,42 @@ export async function streamExtractExternal( reject(error) }) .pipe(unzip.Parse()) - .on('entry', (entry: unzip.Entry) => { + .on('entry', async (entry: unzip.Entry) => { const fullPath = path.normalize(path.join(directory, entry.path)) core.debug(`Extracting artifact entry: ${fullPath}`) - const writeStream = createWriteStream(fullPath) - promises.push( - new Promise((resolve, reject) => { - writeStream.on('finish', () => resolve()) - writeStream.on('error', reject) - }) - ) - entry.pipe(writeStream) + if (entry.type === 'Directory') { + if (!(await exists(fullPath))) { + await fs.mkdir(fullPath, {recursive: true}) + } + entry.autodrain() + } else { + if (!(await exists(path.dirname(fullPath)))) { + await fs.mkdir(path.dirname(fullPath), {recursive: true}) + } + const writeStream = createWriteStream(fullPath) + promises.push( + new Promise((resolve, reject) => { + writeStream.on('finish', () => { + console.log(`Finished writing ${fullPath}`) + resolve() + }) + writeStream.on('error', reject) + }) + ) + entry.pipe(writeStream) + } }) - .on('end', () => { + .on('end', async () => { + console.log('All entries have been extracted') clearTimeout(timer) - Promise.all(promises) - .then(() => resolve()) - .catch(error => reject(error)) + try { + console.log('Waiting for all write streams to finish') + await Promise.all(promises) + console.log('All write streams have finished') + resolve() + } catch (error) { + reject(error) + } }) .on('error', (error: Error) => { reject(error)