CLI: plugins install command accept a --plugin-version parameter. (#4599)

* 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>
pull/4606/head
John Livingston 2021-12-03 10:14:01 +01:00 committed by GitHub
parent 37cb07eae2
commit 3a1157a68a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 37 additions and 4 deletions

View 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) {

View 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()
}

View 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 () {

View 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)

View 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
})

View File

@ -1,4 +1,5 @@
export interface InstallOrUpdatePlugin {
npmName?: string
pluginVersion?: string
path?: string
}