@@ -24,6 +24,9 @@ type InstallCmd struct {
24
24
cfg * config.Config
25
25
Cmd * cobra.Command
26
26
fs afero.Fs
27
+
28
+ archiveURL string
29
+ archivePath string
27
30
}
28
31
29
32
// NewInstallCmd creates a command for installing plugins
@@ -34,13 +37,16 @@ func NewInstallCmd(config *config.Config) *InstallCmd {
34
37
35
38
ic .Cmd = & cobra.Command {
36
39
Use : "install" ,
37
- Args : validators .ExactArgs (1 ),
40
+ Args : validators .MaximumNArgs (1 ),
38
41
Short : "Install a Stripe CLI plugin" ,
39
42
Long : `Install a Stripe CLI plugin. To download a specific version, run stripe install [plugin_name]@[version].
40
43
By default, the most recent version will be installed.` ,
41
44
RunE : ic .runInstallCmd ,
42
45
}
43
46
47
+ ic .Cmd .Flags ().StringVar (& ic .archiveURL , "archive-url" , "" , "Install a plugin by an archive URL" )
48
+ ic .Cmd .Flags ().StringVar (& ic .archivePath , "archive" , "" , "Install a plugin by an archive path" )
49
+
44
50
return ic
45
51
}
46
52
@@ -58,15 +64,8 @@ func parseInstallArg(arg string) (string, string) {
58
64
return plugin , version
59
65
}
60
66
61
- func (ic * InstallCmd ) runInstallCmd (cmd * cobra.Command , args []string ) error {
62
- // Refresh the plugin before proceeding
63
- err := plugins .RefreshPluginManifest (cmd .Context (), ic .cfg , ic .fs , stripe .DefaultAPIBaseURL )
64
-
65
- if err != nil {
66
- return err
67
- }
68
-
69
- pluginName , version := parseInstallArg (args [0 ])
67
+ func (ic * InstallCmd ) installPluginByName (cmd * cobra.Command , arg string ) error {
68
+ pluginName , version := parseInstallArg (arg )
70
69
plugin , err := plugins .LookUpPlugin (cmd .Context (), ic .cfg , ic .fs , pluginName )
71
70
72
71
if err != nil {
@@ -85,12 +84,53 @@ func (ic *InstallCmd) runInstallCmd(cmd *cobra.Command, args []string) error {
85
84
86
85
err = plugin .Install (ctx , ic .cfg , ic .fs , version , stripe .DefaultAPIBaseURL )
87
86
87
+ return err
88
+ }
89
+
90
+ func (ic * InstallCmd ) installPluginByArchive (cmd * cobra.Command ) error {
91
+ if ic .archiveURL == "" && ic .archivePath == "" {
92
+ return fmt .Errorf ("please provide the plugin name or the archive URL/path to install" )
93
+ }
94
+
95
+ if ic .archiveURL != "" {
96
+ err := plugins .FetchAndExtractRemoteArchive (cmd .Context (), ic .cfg , ic .archiveURL )
97
+ if err != nil {
98
+ return err
99
+ }
100
+ } else if ic .archivePath != "" {
101
+ err := plugins .ExtractLocalArchive (cmd .Context (), ic .cfg , ic .archivePath )
102
+ if err != nil {
103
+ return err
104
+ }
105
+ }
106
+
107
+ return nil
108
+ }
109
+
110
+ func (ic * InstallCmd ) runInstallCmd (cmd * cobra.Command , args []string ) error {
111
+ var err error
112
+
113
+ if len (args ) == 0 {
114
+ err = ic .installPluginByArchive (cmd )
115
+ } else {
116
+ // Refresh the plugin before proceeding
117
+ err = plugins .RefreshPluginManifest (cmd .Context (), ic .cfg , ic .fs , stripe .DefaultAPIBaseURL )
118
+ if err != nil {
119
+ return err
120
+ }
121
+
122
+ err = ic .installPluginByName (cmd , args [0 ])
123
+ if err != nil {
124
+ return err
125
+ }
126
+ }
127
+
88
128
if err == nil {
89
129
color := ansi .Color (os .Stdout )
90
130
fmt .Println (color .Green ("✔ installation complete." ))
91
131
}
92
132
93
- return err
133
+ return nil
94
134
}
95
135
96
136
func withSIGTERMCancel (ctx context.Context , onCancel func ()) context.Context {
0 commit comments