]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
CLI: plugins install command accept a --plugin-version parameter. (#4599)
authorJohn Livingston <38844060+JohnXLivingston@users.noreply.github.com>
Fri, 3 Dec 2021 09:14:01 +0000 (10:14 +0100)
committerGitHub <noreply@github.com>
Fri, 3 Dec 2021 09:14:01 +0000 (10:14 +0100)
* CLI: plugins install command accept a --plugin-version parameter.

* Unit tests for plugins install --plugin-version.

* Fix linting.

* Styling

Co-authored-by: Chocobozzz <me@florianbigard.com>
server/controllers/api/plugins.ts
server/middlewares/validators/plugins.ts
server/tests/cli/peertube.ts
server/tools/peertube-plugins.ts
shared/extra-utils/server/plugins-command.ts
shared/models/plugins/server/api/install-plugin.model.ts

index 2de7fe41f48e826cea5e9a8d729021a45faee500..de9e055dc0fe4b9bf7db4b7c0a5484237a44ebc9 100644 (file)
@@ -144,8 +144,13 @@ async function installPlugin (req: express.Request, res: express.Response) {
 
   const fromDisk = !!body.path
   const toInstall = body.npmName || body.path
+
+  const pluginVersion = body.pluginVersion && body.npmName
+    ? body.pluginVersion
+    : undefined
+
   try {
-    const plugin = await PluginManager.Instance.install(toInstall, undefined, fromDisk)
+    const plugin = await PluginManager.Instance.install(toInstall, pluginVersion, fromDisk)
 
     return res.json(plugin.toFormattedJSON())
   } catch (err) {
index 21171af236e36cc2152a83b51f76cd7ec8c9f0d0..c1e9ebefbb25f8aa2af3a9d6bf642426ab2d24a1 100644 (file)
@@ -116,6 +116,9 @@ const installOrUpdatePluginValidator = [
   body('npmName')
     .optional()
     .custom(isNpmPluginNameValid).withMessage('Should have a valid npm name'),
+  body('pluginVersion')
+    .optional()
+    .custom(isPluginVersionValid).withMessage('Should have a valid plugin version'),
   body('path')
     .optional()
     .custom(isSafePath).withMessage('Should have a valid safe path'),
@@ -129,6 +132,9 @@ const installOrUpdatePluginValidator = [
     if (!body.path && !body.npmName) {
       return res.fail({ message: 'Should have either a npmName or a path' })
     }
+    if (body.pluginVersion && !body.npmName) {
+      return res.fail({ message: 'Should have a npmName when specifying a pluginVersion' })
+    }
 
     return next()
   }
index f2a9849628547a11b853a35b05e13c96297a9f68..3ac440f841aea58c7bde291c121a7ead926fed45 100644 (file)
@@ -207,6 +207,25 @@ describe('Test CLI wrapper', function () {
 
       expect(res).to.not.contain('peertube-plugin-hello-world')
     })
+
+    it('Should install a plugin in requested version', async function () {
+      this.timeout(60000)
+
+      await cliCommand.execWithEnv(`${cmd} plugins install --npm-name peertube-plugin-hello-world --plugin-version 0.0.17`)
+    })
+
+    it('Should list installed plugins, in correct version', async function () {
+      const res = await cliCommand.execWithEnv(`${cmd} plugins list`)
+
+      expect(res).to.contain('peertube-plugin-hello-world')
+      expect(res).to.contain('0.0.17')
+    })
+
+    it('Should uninstall the plugin again', async function () {
+      const res = await cliCommand.execWithEnv(`${cmd} plugins uninstall --npm-name peertube-plugin-hello-world`)
+
+      expect(res).to.not.contain('peertube-plugin-hello-world')
+    })
   })
 
   describe('Manage video redundancies', function () {
index ae625114d2012d7597deed308f7610e0e63d9746..9dd3f08c90095a2d20bf3670a3553c2394c7ffd6 100644 (file)
@@ -31,6 +31,7 @@ program
   .option('-p, --password <token>', 'Password')
   .option('-P --path <path>', 'Install from a path')
   .option('-n, --npm-name <npmName>', 'Install from npm')
+  .option('--plugin-version <pluginVersion>', 'Specify the plugin version to install (only available when installing from npm)')
   .action((options, command) => installPluginCLI(command, options))
 
 program
@@ -109,7 +110,7 @@ async function installPluginCLI (command: Command, options: OptionValues) {
   await assignToken(server, username, password)
 
   try {
-    await server.plugins.install({ npmName: options.npmName, path: options.path })
+    await server.plugins.install({ npmName: options.npmName, path: options.path, pluginVersion: options.pluginVersion })
   } catch (err) {
     console.error('Cannot install plugin.', err)
     process.exit(-1)
index b944475a264647e83bcff2023844752c7cbae68d..9bf24afffc3aab16a98b92e6ce99ec0700123d00 100644 (file)
@@ -158,15 +158,16 @@ export class PluginsCommand extends AbstractCommand {
   install (options: OverrideCommandOptions & {
     path?: string
     npmName?: string
+    pluginVersion?: string
   }) {
-    const { npmName, path } = options
+    const { npmName, path, pluginVersion } = options
     const apiPath = '/api/v1/plugins/install'
 
     return this.postBodyRequest({
       ...options,
 
       path: apiPath,
-      fields: { npmName, path },
+      fields: { npmName, path, pluginVersion },
       implicitToken: true,
       defaultExpectedStatus: HttpStatusCode.OK_200
     })
index 5a268ebe18b436d852d1eb07c6f90451133c01c0..a1d009a00e1f7a7ccabe93fa59caf7f3d4068ee4 100644 (file)
@@ -1,4 +1,5 @@
 export interface InstallOrUpdatePlugin {
   npmName?: string
+  pluginVersion?: string
   path?: string
 }