From 45d57a35a5b324cdfd1bd610255a94ecebc1d842 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 22 Jan 2026 11:49:50 +0000 Subject: [PATCH 1/2] Initial plan From eb5605b0092d558a66d01e7f56b070172f5335eb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 22 Jan 2026 11:52:36 +0000 Subject: [PATCH 2/2] Add try-finally block for temp file cleanup Co-authored-by: madebydavid <5401249+madebydavid@users.noreply.github.com> --- src/utils/query/useShip.ts | 122 +++++++++++++++++++------------------ 1 file changed, 63 insertions(+), 59 deletions(-) diff --git a/src/utils/query/useShip.ts b/src/utils/query/useShip.ts index 6ee8d6a..2f740b9 100644 --- a/src/utils/query/useShip.ts +++ b/src/utils/query/useShip.ts @@ -77,66 +77,70 @@ export async function ship({command, log = () => {}, shipFlags}: ShipOptions): P }, }) - const {size} = fs.statSync(tmpZipFile) - - verbose && log('Requesting upload ticket...') - const uploadTicket = await getNewUploadTicket(projectConfig.project.id) - - log('Uploading zip file...') - const zipStream = fs.createReadStream(tmpZipFile) - - const response = await uploadZip({ - url: uploadTicket.url, - zipStream, - zipSize: size, - onProgress: (data) => { - log(formatProgressLog('Uploading', data, 'loadedBytes', 'totalBytes', false)) - }, - }) - - verbose && log('Computing zip file hash...') - const zipFileMd5 = await getFileHash(tmpZipFile) - - verbose && log('Cleaning up temporary zip file...') - fs.unlinkSync(tmpZipFile) - - if (!response.ok) { - throw new Error(`Upload failed: ${response.status} ${response.statusText}`) - } - - log(`Upload complete`) - - verbose && log('Fetching Git info...') - const gitInfo = await getCWDGitInfo() - const uploadDetails: UploadDetails = { - ...gitInfo, - zipFileMd5, - } - - verbose && log('Starting jobs from upload...') - - const startJobsOptions = { - ...uploadDetails, - platform: finalFlags.platform?.toUpperCase() as Platform, - skipPublish: finalFlags.skipPublish, - verbose: finalFlags.verbose, - useDemoCredentials: isUsingDemoCredentials, - gameEngineVersion: finalFlags.gameEngineVersion, + try { + const {size} = fs.statSync(tmpZipFile) + + verbose && log('Requesting upload ticket...') + const uploadTicket = await getNewUploadTicket(projectConfig.project.id) + + log('Uploading zip file...') + const zipStream = fs.createReadStream(tmpZipFile) + + const response = await uploadZip({ + url: uploadTicket.url, + zipStream, + zipSize: size, + onProgress: (data) => { + log(formatProgressLog('Uploading', data, 'loadedBytes', 'totalBytes', false)) + }, + }) + + verbose && log('Computing zip file hash...') + const zipFileMd5 = await getFileHash(tmpZipFile) + + if (!response.ok) { + throw new Error(`Upload failed: ${response.status} ${response.statusText}`) + } + + log(`Upload complete`) + + verbose && log('Fetching Git info...') + const gitInfo = await getCWDGitInfo() + const uploadDetails: UploadDetails = { + ...gitInfo, + zipFileMd5, + } + + verbose && log('Starting jobs from upload...') + + const startJobsOptions = { + ...uploadDetails, + platform: finalFlags.platform?.toUpperCase() as Platform, + skipPublish: finalFlags.skipPublish, + verbose: finalFlags.verbose, + useDemoCredentials: isUsingDemoCredentials, + gameEngineVersion: finalFlags.gameEngineVersion, + } + + const jobs = await startJobsFromUpload(uploadTicket.id, startJobsOptions) + + verbose && log('Job submission complete.') + + if (jobs.length === 0) { + throw new Error('No jobs were created. Please check your game configuration and try again.') + } + + if (finalFlags?.follow) { + log('Waiting for job to start...') + } + + return jobs + } finally { + verbose && log('Cleaning up temporary zip file...') + if (fs.existsSync(tmpZipFile)) { + fs.unlinkSync(tmpZipFile) + } } - - const jobs = await startJobsFromUpload(uploadTicket.id, startJobsOptions) - - verbose && log('Job submission complete.') - - if (jobs.length === 0) { - throw new Error('No jobs were created. Please check your game configuration and try again.') - } - - if (finalFlags?.follow) { - log('Waiting for job to start...') - } - - return jobs } export const useShip = () =>