(
target: string | undefined,
options: RollbackOptions = {},
)
| 156 | } |
| 157 | |
| 158 | export async function rollback( |
| 159 | target: string | undefined, |
| 160 | options: RollbackOptions = {}, |
| 161 | ): Promise<void> { |
| 162 | try { |
| 163 | if (options.list) { |
| 164 | await listVersions() |
| 165 | return |
| 166 | } |
| 167 | |
| 168 | const resolvedTarget = await resolveRollbackTarget(target, options) |
| 169 | if (options.dryRun) { |
| 170 | writeToStdout( |
| 171 | `Would roll back from ${MACRO.VERSION} to ${resolvedTarget}.\n`, |
| 172 | ) |
| 173 | await gracefulShutdown(0) |
| 174 | return |
| 175 | } |
| 176 | |
| 177 | writeToStdout( |
| 178 | chalk.yellow(`Rolling back from ${MACRO.VERSION} to ${resolvedTarget}...`) + |
| 179 | '\n', |
| 180 | ) |
| 181 | |
| 182 | const result = await installLatest(resolvedTarget, false) |
| 183 | if (result.lockFailed) { |
| 184 | const pidInfo = result.lockHolderPid |
| 185 | ? ` (PID ${result.lockHolderPid})` |
| 186 | : '' |
| 187 | writeToStderr( |
| 188 | `Another Code process${pidInfo} is currently running. Please try again in a moment.\n`, |
| 189 | ) |
| 190 | await gracefulShutdown(1) |
| 191 | return |
| 192 | } |
| 193 | |
| 194 | if (!result.latestVersion) { |
| 195 | writeToStderr('Rollback failed: unable to install the requested version.\n') |
| 196 | await gracefulShutdown(1) |
| 197 | return |
| 198 | } |
| 199 | |
| 200 | if (result.latestVersion === MACRO.VERSION) { |
| 201 | writeToStdout( |
| 202 | chalk.yellow(`Already running ${result.latestVersion}.`) + '\n', |
| 203 | ) |
| 204 | await gracefulShutdown(0) |
| 205 | return |
| 206 | } |
| 207 | |
| 208 | writeToStdout( |
| 209 | chalk.green(`Rolled back to ${result.latestVersion}.`) + '\n', |
| 210 | ) |
| 211 | await gracefulShutdown(0) |
| 212 | } catch (error) { |
| 213 | writeToStderr(`Rollback failed: ${error instanceof Error ? error.message : String(error)}\n`) |
| 214 | await gracefulShutdown(1) |
| 215 | } |
no test coverage detected