diff --git a/api/src/ppman/package.js b/api/src/ppman/package.js index 0f4c78d..0be9822 100644 --- a/api/src/ppman/package.js +++ b/api/src/ppman/package.js @@ -131,6 +131,28 @@ class Package { }; } + + async uninstall(){ + logger.info(`Uninstalling ${this.language}-${this.version.raw}`); + + logger.debug("Finding runtime") + const runtime = runtime.get_latest_runtime_matching_language_version(this.language, this.version.raw); + + logger.debug("Unregistering runtime") + runtime.unregister(); + + logger.debug("Cleaning files from disk") + await fs.rmdir(this.install_path, {recursive: true}) + + logger.info(`Uninstalled ${this.language}-${this.version.raw}`) + + return { + language: this.language, + version: this.version.raw + }; + + } + } module.exports = { diff --git a/api/src/ppman/routes.js b/api/src/ppman/routes.js index fc8bbaf..4df95f6 100644 --- a/api/src/ppman/routes.js +++ b/api/src/ppman/routes.js @@ -91,11 +91,33 @@ module.exports = { // DELETE /packages/:language/:version async package_uninstall(req, res) { - return res - .status(500) - .send({ - message: 'Not implemented' - }); + logger.debug('Request to install package'); + + const pkg = await get_package(req.params.language, req.params.version); + + if (pkg == null) { + return res + .status(404) + .send({ + message: `Requested package ${req.params.language}-${req.params.version} does not exist` + }); + } + + try { + const response = await pkg.uninstall(); + + return res + .status(200) + .send(response); + } catch(e) { + logger.error(`Error while uninstalling package ${pkg.language}-${pkg.version}:`, e.message); + + return res + .status(500) + .send({ + message: e.message + }); + } } }; diff --git a/api/src/runtime.js b/api/src/runtime.js index 8d0604e..c5239c3 100644 --- a/api/src/runtime.js +++ b/api/src/runtime.js @@ -63,6 +63,11 @@ class Runtime { toString() { return `${this.language}-${this.version.raw}`; } + + unregister() { + const index = runtimes.indexOf(this); + runtimes.splice(index, 1); //Remove from runtimes list + } } module.exports = runtimes; diff --git a/cli/commands/ppman_commands/uninstall.js b/cli/commands/ppman_commands/uninstall.js new file mode 100644 index 0000000..11c7e4c --- /dev/null +++ b/cli/commands/ppman_commands/uninstall.js @@ -0,0 +1,23 @@ +const chalk = require('chalk'); + +exports.command = ['uninstall '] +exports.aliases = ['u'] +exports.describe = 'Installs the named package' + + +const msg_format = { + 'color': p => `${p.language ? chalk.green.bold('✓') : chalk.red.bold('❌')} Uninstallation ${p.language ? "succeeded" : "failed: " + p.message}`, + 'monochrome': p => `Uninstallation ${p.language ? "succeeded" : "failed: " + p.message}`, + 'json': JSON.stringify + +} + +exports.handler = async function({axios, language, languageVersion}){ + try{ + const install = await axios.delete(`/packages/${language}/${languageVersion}`) + + console.log(msg_format.color(install.data)); + }catch({response}){ + console.error(response.data.message) + } +} \ No newline at end of file