github.com/Azure/draft-classic@v0.16.0/cmd/draft/plugin_install.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  
     7  	"github.com/spf13/cobra"
     8  
     9  	"github.com/Azure/draft/pkg/draft/draftpath"
    10  	"github.com/Azure/draft/pkg/plugin"
    11  	"github.com/Azure/draft/pkg/plugin/installer"
    12  )
    13  
    14  type pluginInstallCmd struct {
    15  	source  string
    16  	version string
    17  	home    draftpath.Home
    18  	out     io.Writer
    19  	args    []string
    20  }
    21  
    22  func newPluginInstallCmd(out io.Writer) *cobra.Command {
    23  	pcmd := &pluginInstallCmd{
    24  		out:  out,
    25  		args: []string{"plugin"},
    26  	}
    27  
    28  	cmd := &cobra.Command{
    29  		Use:   "install [options] <path|url>...",
    30  		Short: "install one or more Draft plugins",
    31  		PreRunE: func(cmd *cobra.Command, args []string) error {
    32  			return pcmd.complete(args)
    33  		},
    34  		RunE: func(cmd *cobra.Command, args []string) error {
    35  			return pcmd.run()
    36  		},
    37  	}
    38  	cmd.Flags().StringVar(&pcmd.version, "version", "", "specify a version constraint. If this is not specified, the latest version is installed")
    39  	return cmd
    40  }
    41  
    42  func (pcmd *pluginInstallCmd) complete(args []string) error {
    43  	if err := validateArgs(args, pcmd.args); err != nil {
    44  		return err
    45  	}
    46  	pcmd.source = args[0]
    47  	pcmd.home = draftpath.Home(homePath())
    48  	return nil
    49  }
    50  
    51  func (pcmd *pluginInstallCmd) run() error {
    52  	installer.Debug = flagDebug
    53  
    54  	i, err := installer.New(pcmd.source, pcmd.version, pcmd.home)
    55  	if err != nil {
    56  		return err
    57  	}
    58  
    59  	debug("installing plugin from %s", pcmd.source)
    60  	if err := installer.Install(i); err != nil {
    61  		return err
    62  	}
    63  
    64  	debug("loading plugin from %s", i.Path())
    65  	p, err := plugin.LoadDir(i.Path())
    66  	if err != nil {
    67  		return err
    68  	}
    69  
    70  	debug("running any install instructions for plugin: %s", p.Metadata.Name)
    71  	if err := runHook(p, plugin.Install); err != nil {
    72  		return err
    73  	}
    74  
    75  	fmt.Fprintf(pcmd.out, "Installed plugin: %s\n", p.Metadata.Name)
    76  	return nil
    77  }