@@ -59,8 +59,9 @@ type downloadOption struct {
5959 KeepPart bool
6060
6161 // inner fields
62- name string
63- Tar bool
62+ name string
63+ Tar bool
64+ Package * hdConfig
6465}
6566
6667const (
@@ -122,13 +123,14 @@ func (o *downloadOption) providerURLParse(path string) (url string, err error) {
122123 cfg := hdConfig {}
123124
124125 if err = yaml .Unmarshal (data , & cfg ); err == nil {
125- hdPackage := & hdPackage {
126+ hdPkg := & hdPackage {
126127 Name : o .name ,
127128 Version : version ,
128129 OS : getReplacement (runtime .GOOS , cfg .Replacements ),
129130 Arch : getReplacement (runtime .GOARCH , cfg .Replacements ),
130131 VersionNum : strings .TrimPrefix (version , "v" ),
131132 }
133+ o .Package = & cfg
132134
133135 if version == "latest" {
134136 ghClient := pkg.ReleaseClient {
@@ -137,8 +139,8 @@ func (o *downloadOption) providerURLParse(path string) (url string, err error) {
137139 }
138140 ghClient .Init ()
139141 if asset , err := ghClient .GetLatestJCLIAsset (); err == nil {
140- hdPackage .Version = asset .TagName
141- hdPackage .VersionNum = strings .TrimPrefix (asset .TagName , "v" )
142+ hdPkg .Version = asset .TagName
143+ hdPkg .VersionNum = strings .TrimPrefix (asset .TagName , "v" )
142144 } else {
143145 fmt .Println (err , "cannot get the asset" )
144146 }
@@ -149,7 +151,7 @@ func (o *downloadOption) providerURLParse(path string) (url string, err error) {
149151 tmp , _ := template .New ("hd" ).Parse (cfg .URL )
150152
151153 var buf bytes.Buffer
152- if err = tmp .Execute (& buf , hdPackage ); err == nil {
154+ if err = tmp .Execute (& buf , hdPkg ); err == nil {
153155 url = buf .String ()
154156 } else {
155157 return
@@ -158,7 +160,7 @@ func (o *downloadOption) providerURLParse(path string) (url string, err error) {
158160 tmp , _ := template .New ("hd" ).Parse (cfg .Filename )
159161
160162 var buf bytes.Buffer
161- if err = tmp .Execute (& buf , hdPackage ); err == nil {
163+ if err = tmp .Execute (& buf , hdPkg ); err == nil {
162164 url = fmt .Sprintf ("https://github.com/%s/%s/releases/%s/download/%s" ,
163165 org , repo , version , buf .String ())
164166
@@ -168,8 +170,24 @@ func (o *downloadOption) providerURLParse(path string) (url string, err error) {
168170 }
169171 }
170172
173+ if err = renderCmdWithArgs (cfg .PreInstall , hdPkg ); err != nil {
174+ return
175+ }
176+ if err = renderCmdWithArgs (cfg .Installation , hdPkg ); err != nil {
177+ return
178+ }
179+ if err = renderCmdWithArgs (cfg .PostInstall , hdPkg ); err != nil {
180+ return
181+ }
182+ if err = renderCmdWithArgs (cfg .TestInstall , hdPkg ); err != nil {
183+ return
184+ }
185+
171186 o .Tar = cfg .Tar != "false"
172187 if cfg .Binary != "" {
188+ if cfg .Binary , err = renderTemplate (cfg .Binary , hdPkg ); err != nil {
189+ return
190+ }
173191 o .name = cfg .Binary
174192 }
175193 }
@@ -178,13 +196,50 @@ func (o *downloadOption) providerURLParse(path string) (url string, err error) {
178196 return
179197}
180198
199+ func renderTemplate (text string , hdPkg * hdPackage ) (result string , err error ) {
200+ tmp , _ := template .New ("hd" ).Parse (text )
201+
202+ var buf bytes.Buffer
203+ if err = tmp .Execute (& buf , hdPkg ); err == nil {
204+ result = buf .String ()
205+ }
206+ return
207+ }
208+
209+ func renderCmdWithArgs (cmd * cmdWithArgs , hdPkg * hdPackage ) (err error ) {
210+ if cmd == nil {
211+ return
212+ }
213+
214+ if cmd .Cmd , err = renderTemplate (cmd .Cmd , hdPkg ); err != nil {
215+ return
216+ }
217+
218+ for i := range cmd .Args {
219+ arg := cmd .Args [i ]
220+ if cmd .Args [i ], err = renderTemplate (arg , hdPkg ); err != nil {
221+ return
222+ }
223+ }
224+ return
225+ }
226+
181227type hdConfig struct {
182228 Name string
183229 Filename string
184230 Binary string
185231 URL string `yaml:"url"`
186232 Tar string
187233 Replacements map [string ]string
234+ Installation * cmdWithArgs
235+ PreInstall * cmdWithArgs
236+ PostInstall * cmdWithArgs
237+ TestInstall * cmdWithArgs
238+ }
239+
240+ type cmdWithArgs struct {
241+ Cmd string
242+ Args []string
188243}
189244
190245type hdPackage struct {
0 commit comments