diff --git a/NodeApp/src/commander/CommanderApp.ts b/NodeApp/src/commander/CommanderApp.ts index 1f3619e55f76e4d40af303dc9fa0f39969521f03..fa4460ed8e072392ee19c1d90e4718d21d82db58 100644 --- a/NodeApp/src/commander/CommanderApp.ts +++ b/NodeApp/src/commander/CommanderApp.ts @@ -11,6 +11,7 @@ import Config from '../config/Config'; import CompletionCommand from './completion/CompletionCommand'; import AuthCommand from './auth/AuthCommand'; import SessionCommand from './auth/SessionCommand'; +import UpgradeCommand from './UpgradeCommand'; class CommanderApp { @@ -116,6 +117,7 @@ https://gitedu.hesge.ch/dojo_project/projects/ui/dojocli/-/releases/Latest`, { AssignmentCommand.registerOnCommand(this.program); ExerciseCommand.registerOnCommand(this.program); CompletionCommand.registerOnCommand(this.program); + UpgradeCommand.registerOnCommand(this.program); } } diff --git a/NodeApp/src/commander/UpgradeCommand.ts b/NodeApp/src/commander/UpgradeCommand.ts new file mode 100644 index 0000000000000000000000000000000000000000..b0ba3dddee68e41a8dcb57130b7da7aa286adad8 --- /dev/null +++ b/NodeApp/src/commander/UpgradeCommand.ts @@ -0,0 +1,61 @@ +import CommanderCommand from './CommanderCommand'; +import ora from 'ora'; +import Config from '../config/Config'; +import TextStyle from '../types/TextStyle'; +import os from 'os'; +import { spawn } from 'child_process'; + + +class UpgradeCommand extends CommanderCommand { + protected commandName: string = 'upgrade'; + + protected defineCommand() { + this.command.description('upgrade the DojoCLI.') + .option('--pre-alpha', 'upgrade to the latest pre-alpha (dev) version. Attention it\'s an unstable version without support.') + .option('-o, --instructions', 'only display upgrade instructions.') + .action(this.commandAction.bind(this)); + } + + private displayInstructions(upgradeCommand: string, preAlpha: boolean) { + console.log(TextStyle.BLOCK(`You can upgrade DojoCLI on ${ os.platform() === 'darwin' ? 'macOS' : 'Linux' }:`)); + ora().start().info(`By executing this command: ${ TextStyle.CODE(' ' + upgradeCommand + ' ') }`); + console.log('or'); + ora().start().info(`By downloading the release from: ${ preAlpha ? Config.gitlab.cliPreAlphaReleasePage : Config.gitlab.cliReleasePage }`); + } + + private upgrade(upgradeCommand: string) { + const upgradeSpinner = ora().start('DojoCLI upgrade is in progress. Please wait...'); + + const upgradeProcess = spawn(upgradeCommand, { + shell: true + }); + + upgradeProcess.on('exit', code => { + code === null || code !== 0 ? upgradeSpinner.fail('DojoCLI upgrade failed... Please try again manually.') : upgradeSpinner.succeed('DojoCLI upgrade is successful.'); + }); + } + + protected async commandAction(options: { preAlpha: boolean, instructions: boolean }): Promise<void> { + if ( os.platform() === 'win32' ) { + if ( !options.instructions ) { + ora().start().warn('Automatic upgrade is not supported on Windows. \n'); + } + + console.log(TextStyle.BLOCK('You can upgrade DojoCLI on Windows:')); + ora().start().info(`By downloading the release from: ${ options.preAlpha ? Config.gitlab.cliPreAlphaReleasePage : Config.gitlab.cliReleasePage }`); + + return; + } + + const upgradeCommand = `curl -L "https://dojo.isc-hesge.ch/installer.sh" | sh /dev/stdin${ options.preAlpha ? ' installer=pre-alpha' : '' }`; + + if ( options.instructions ) { + this.displayInstructions(upgradeCommand, options.preAlpha); + } else { + this.upgrade(upgradeCommand); + } + } +} + + +export default new UpgradeCommand(); \ No newline at end of file