fix stuck progress at 80% - part deux

This commit is contained in:
Andy Miller
2025-10-16 21:28:43 -06:00
parent ca657708f3
commit 4a2b386b51
3 changed files with 138 additions and 33 deletions

View File

@@ -186,6 +186,78 @@ class SafeUpgradeManager
$this->writeManifest($data); $this->writeManifest($data);
} }
public function ensureJobResult(array $result): void
{
if (!$this->jobManifestPath) {
return;
}
$status = $result['status'] ?? null;
$progress = $this->getProgress();
if ($status === 'success') {
$targetVersion = $result['version'] ?? ($result['manifest']['target_version'] ?? null);
$manifest = $result['manifest'] ?? null;
if (($progress['stage'] ?? null) !== 'complete') {
$extras = [];
if ($targetVersion !== null) {
$extras['target_version'] = $targetVersion;
}
if ($manifest !== null) {
$extras['manifest'] = $manifest;
}
$this->setProgress('complete', 'Upgrade complete.', 100, $extras);
$progress = $this->getProgress();
}
$this->updateJob([
'status' => 'success',
'completed_at' => time(),
'result' => $result,
'progress' => $progress,
]);
return;
}
if ($status === 'error') {
$message = $result['message'] ?? 'Safe upgrade failed.';
if (($progress['stage'] ?? null) !== 'error') {
$this->setProgress('error', $message, null, ['message' => $message]);
$progress = $this->getProgress();
}
$this->updateJob([
'status' => 'error',
'completed_at' => time(),
'result' => $result,
'progress' => $progress,
'error' => $message,
]);
return;
}
if ($status === 'noop' || $status === 'finalized') {
if (($progress['stage'] ?? null) !== 'complete') {
$this->setProgress('complete', $progress['message'] ?? 'Upgrade complete.', 100, [
'target_version' => $result['version'] ?? null,
'manifest' => $result['manifest'] ?? null,
]);
$progress = $this->getProgress();
}
$this->updateJob([
'status' => $status,
'completed_at' => time(),
'result' => $result,
'progress' => $progress,
]);
}
}
public function markJobError(string $message): void public function markJobError(string $message): void
{ {
$this->setProgress('error', $message, null, ['message' => $message]); $this->setProgress('error', $message, null, ['message' => $message]);

View File

@@ -445,8 +445,9 @@ export default class SafeUpgrade {
this.pollTimer = null; this.pollTimer = null;
let nextStage = null; let nextStage = null;
let jobComplete = false;
let shouldContinue = true; let jobFailed = false;
let shouldReload = false;
console.debug('[SafeUpgrade] poll status'); console.debug('[SafeUpgrade] poll status');
@@ -464,6 +465,7 @@ export default class SafeUpgrade {
}); });
} }
nextStage = 'error'; nextStage = 'error';
jobFailed = true;
return; return;
} }
@@ -475,16 +477,32 @@ export default class SafeUpgrade {
this.renderProgress(data, job); this.renderProgress(data, job);
if (job.status === 'error') { if (job.status === 'error') {
shouldContinue = false;
nextStage = 'error'; nextStage = 'error';
const message = job.error || data.message || t('SAFE_UPGRADE_GENERIC_ERROR', 'Safe upgrade could not complete. See Grav logs for details.'); const message = job.error || data.message || t('SAFE_UPGRADE_GENERIC_ERROR', 'Safe upgrade could not complete. See Grav logs for details.');
this.renderResult({ status: 'error', message }); this.renderProgress({
} else if (job.status === 'success' && data.stage === 'complete') { stage: 'error',
shouldContinue = false; message,
nextStage = 'complete'; percent: null
if (job.result) { }, job);
this.renderResult(job.result); jobFailed = true;
} else if (job.status === 'success') {
if (data.stage !== 'complete') {
const completePayload = {
stage: 'complete',
message: t('SAFE_UPGRADE_STAGE_COMPLETE', 'Upgrade complete'),
percent: 100,
target_version: (job.result && job.result.version) || data.target_version || null,
manifest: (job.result && job.result.manifest) || data.manifest || null
};
this.renderProgress(completePayload, job);
nextStage = 'complete';
} }
jobComplete = true;
shouldReload = true;
} else if (!job.status && data.stage === 'complete') {
jobComplete = true;
shouldReload = true;
} }
}); });
@@ -495,17 +513,17 @@ export default class SafeUpgrade {
return; return;
} }
if (nextStage === 'complete' || nextStage === 'error') { if (jobFailed) {
this.stopPolling(); this.stopPolling();
this.jobId = null; this.jobId = null;
if (nextStage === 'complete') { } else if (jobComplete || nextStage === 'complete') {
this.stopPolling();
this.jobId = null;
if (shouldReload) {
setTimeout(() => window.location.reload(), 2500); setTimeout(() => window.location.reload(), 2500);
} }
} else if (shouldContinue) {
this.schedulePoll();
} else { } else {
this.stopPolling(); this.schedulePoll();
this.jobId = null;
} }
}; };

View File

@@ -4923,7 +4923,9 @@ var SafeUpgrade = /*#__PURE__*/function () {
} }
this.pollTimer = null; this.pollTimer = null;
var nextStage = null; var nextStage = null;
var shouldContinue = true; var jobComplete = false;
var jobFailed = false;
var shouldReload = false;
console.debug('[SafeUpgrade] poll status'); console.debug('[SafeUpgrade] poll status');
var statusUrl = this.jobId ? "".concat(this.urls.status, "?job=").concat(encodeURIComponent(this.jobId)) : this.urls.status; var statusUrl = this.jobId ? "".concat(this.urls.status, "?job=").concat(encodeURIComponent(this.jobId)) : this.urls.status;
this.statusRequest = utils_request(statusUrl, function (response) { this.statusRequest = utils_request(statusUrl, function (response) {
@@ -4937,6 +4939,7 @@ var SafeUpgrade = /*#__PURE__*/function () {
}); });
} }
nextStage = 'error'; nextStage = 'error';
jobFailed = true;
return; return;
} }
var payload = response.data || {}; var payload = response.data || {};
@@ -4945,19 +4948,31 @@ var SafeUpgrade = /*#__PURE__*/function () {
nextStage = data.stage || null; nextStage = data.stage || null;
_this6.renderProgress(data, job); _this6.renderProgress(data, job);
if (job.status === 'error') { if (job.status === 'error') {
shouldContinue = false;
nextStage = 'error'; nextStage = 'error';
var message = job.error || data.message || t('SAFE_UPGRADE_GENERIC_ERROR', 'Safe upgrade could not complete. See Grav logs for details.'); var message = job.error || data.message || t('SAFE_UPGRADE_GENERIC_ERROR', 'Safe upgrade could not complete. See Grav logs for details.');
_this6.renderResult({ _this6.renderProgress({
status: 'error', stage: 'error',
message: message message: message,
}); percent: null
} else if (job.status === 'success' && data.stage === 'complete') { }, job);
shouldContinue = false; jobFailed = true;
nextStage = 'complete'; } else if (job.status === 'success') {
if (job.result) { if (data.stage !== 'complete') {
_this6.renderResult(job.result); var completePayload = {
stage: 'complete',
message: t('SAFE_UPGRADE_STAGE_COMPLETE', 'Upgrade complete'),
percent: 100,
target_version: job.result && job.result.version || data.target_version || null,
manifest: job.result && job.result.manifest || data.manifest || null
};
_this6.renderProgress(completePayload, job);
nextStage = 'complete';
} }
jobComplete = true;
shouldReload = true;
} else if (!job.status && data.stage === 'complete') {
jobComplete = true;
shouldReload = true;
} }
}); });
var finalize = function finalize() { var finalize = function finalize() {
@@ -4965,19 +4980,19 @@ var SafeUpgrade = /*#__PURE__*/function () {
if (!_this6.isPolling) { if (!_this6.isPolling) {
return; return;
} }
if (nextStage === 'complete' || nextStage === 'error') { if (jobFailed) {
_this6.stopPolling(); _this6.stopPolling();
_this6.jobId = null; _this6.jobId = null;
if (nextStage === 'complete') { } else if (jobComplete || nextStage === 'complete') {
_this6.stopPolling();
_this6.jobId = null;
if (shouldReload) {
setTimeout(function () { setTimeout(function () {
return window.location.reload(); return window.location.reload();
}, 2500); }, 2500);
} }
} else if (shouldContinue) {
_this6.schedulePoll();
} else { } else {
_this6.stopPolling(); _this6.schedulePoll();
_this6.jobId = null;
} }
}; };
this.statusRequest.then(finalize, finalize); this.statusRequest.then(finalize, finalize);
@@ -14246,4 +14261,4 @@ external_jQuery_default()(__webpack_require__.g).on('sidebar_state._grav', funct
/******/ Grav = __webpack_exports__; /******/ Grav = __webpack_exports__;
/******/ /******/
/******/ })() /******/ })()
; ;