plugin_install.go 1.9 KB
Newer Older
1 2 3 4 5 6
package cmd

import (
	"fmt"
	"log"

LinuxSuRen's avatar
LinuxSuRen 已提交
7
	"github.com/AlecAivazis/survey/v2"
8
	"github.com/jenkins-zh/jenkins-cli/client"
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
	"github.com/spf13/cobra"
)

func init() {
	pluginCmd.AddCommand(pluginInstallCmd)
}

var pluginInstallCmd = &cobra.Command{
	Use:   "install [pluginName]",
	Short: "Install the plugins",
	Long:  `Install the plugins`,
	Run: func(cmd *cobra.Command, args []string) {
		jenkins := getCurrentJenkins()
		jclient := &client.PluginManager{}
		jclient.URL = jenkins.URL
		jclient.UserName = jenkins.UserName
		jclient.Token = jenkins.Token
		jclient.Proxy = jenkins.Proxy
		jclient.ProxyAuth = jenkins.ProxyAuth
		plugins := make([]string, len(args))
		plugins = append(plugins, args...)

		if len(plugins) == 0 {
			for {
				var keyword string
				prompt := &survey.Input{Message: "Please input the keyword to search your plugin!"}
				if err := survey.AskOne(prompt, &keyword); err != nil {
					log.Fatal(err)
				}

				if availablePlugins, err := jclient.GetAvailablePlugins(); err == nil {
					matchedPlugins := searchPlugins(availablePlugins, keyword)
					optinalPlugins := convertToArray(matchedPlugins)

					if len(optinalPlugins) == 0 {
						fmt.Println("Cannot find any plugins by your keyword, or they already installed.")
						continue
					}

					prompt := &survey.MultiSelect{
						Message: "Please select the plugins whose you want to install:",
						Options: convertToArray(matchedPlugins),
					}
					selectedPlugins := []string{}
					survey.AskOne(prompt, &selectedPlugins)
					plugins = append(plugins, selectedPlugins...)

					break
				} else {
					log.Fatal(err)
				}
			}

			fmt.Println("Going to install", plugins)
		}

		jclient.InstallPlugin(plugins)
	},
}

func convertToArray(aviablePlugins []client.AvailablePlugin) (plugins []string) {
	plugins = make([]string, 0)

	for _, plugin := range aviablePlugins {
		if plugin.Installed {
			continue
		}

		plugins = append(plugins, plugin.Name)
	}
	return
}