From c98872166e4f89caa7b3bdaf93099e359c3d88a0 Mon Sep 17 00:00:00 2001 From: Sergey Dolin Date: Thu, 22 Jun 2023 14:20:56 +0200 Subject: [PATCH] Handle error during rehydration --- dist/index.js | 29 ++++++++++++++++++----------- src/classes/state.ts | 42 ++++++++++++++++++++++++++++-------------- 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/dist/index.js b/dist/index.js index 23f10cdaf..25fa4a0c5 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1560,6 +1560,7 @@ const crypto_1 = __importDefault(__nccwpck_require__(6113)); const fs_1 = __importDefault(__nccwpck_require__(7147)); const path_1 = __importDefault(__nccwpck_require__(1017)); const artifact = __importStar(__nccwpck_require__(2605)); +const core = __importStar(__nccwpck_require__(2186)); class State { constructor() { this.processedIssuesIDs = new Set(); @@ -1590,18 +1591,24 @@ class State { const tmpDir = os_1.default.tmpdir(); const artifactClient = artifact.create(); const downloadResponse = yield artifactClient.downloadArtifact(State.ARTIFACT_NAME, tmpDir); - const downloadedFiles = fs_1.default.readdirSync(downloadResponse.downloadPath); - if (downloadedFiles.length === 0) { - // TODO: handle error + try { + const downloadedFiles = fs_1.default.readdirSync(downloadResponse.downloadPath); + if (downloadedFiles.length === 0) { + throw Error('There is no data in the state artifact, probably because of the previous run failed'); + } + const serialized = fs_1.default.readFileSync(path_1.default.join(downloadResponse.downloadPath, downloadedFiles[0]), { encoding: 'utf8' }); + if (serialized.length === 0) + return; + const issueIDs = serialized + .split('|') + .map(parseInt) + .filter(i => !isNaN(i)); + this.processedIssuesIDs = new Set(issueIDs); + core.debug(`Rehydrated state includes info about ${issueIDs.length} issue(s)`); + } + catch (error) { + core.warning(`Rehydrating the state was not successful due to "${error.message || 'unknown reason'}"`); } - const serialized = fs_1.default.readFileSync(path_1.default.join(downloadResponse.downloadPath, downloadedFiles[0]), { encoding: 'utf8' }); - if (serialized.length === 0) - return; - const issueIDs = serialized - .split('|') - .map(parseInt) - .filter(i => !isNaN(i)); - this.processedIssuesIDs = new Set(issueIDs); }); } } diff --git a/src/classes/state.ts b/src/classes/state.ts index 326189a93..c9931eb71 100644 --- a/src/classes/state.ts +++ b/src/classes/state.ts @@ -5,6 +5,7 @@ import crypto from 'crypto'; import fs from 'fs'; import path from 'path'; import * as artifact from '@actions/artifact'; +import * as core from '@actions/core'; type IssueID = number; export class State implements IState { @@ -48,22 +49,35 @@ export class State implements IState { tmpDir ); - const downloadedFiles = fs.readdirSync(downloadResponse.downloadPath); - if (downloadedFiles.length === 0) { - // TODO: handle error - } - const serialized = fs.readFileSync( - path.join(downloadResponse.downloadPath, downloadedFiles[0]), - {encoding: 'utf8'} - ); + try { + const downloadedFiles = fs.readdirSync(downloadResponse.downloadPath); + if (downloadedFiles.length === 0) { + throw Error( + 'There is no data in the state artifact, probably because of the previous run failed' + ); + } + const serialized = fs.readFileSync( + path.join(downloadResponse.downloadPath, downloadedFiles[0]), + {encoding: 'utf8'} + ); - if (serialized.length === 0) return; + if (serialized.length === 0) return; - const issueIDs = serialized - .split('|') - .map(parseInt) - .filter(i => !isNaN(i)); + const issueIDs = serialized + .split('|') + .map(parseInt) + .filter(i => !isNaN(i)); - this.processedIssuesIDs = new Set(issueIDs); + this.processedIssuesIDs = new Set(issueIDs); + core.debug( + `Rehydrated state includes info about ${issueIDs.length} issue(s)` + ); + } catch (error) { + core.warning( + `Rehydrating the state was not successful due to "${ + error.message || 'unknown reason' + }"` + ); + } } }