Skip to content

Commit 72763eb

Browse files
authored
Add custom installation support (#36)
1 parent fa57308 commit 72763eb

File tree

2 files changed

+92
-12
lines changed

2 files changed

+92
-12
lines changed

cmd/get.go

Lines changed: 62 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

6667
const (
@@ -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+
181227
type 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

190245
type hdPackage struct {

cmd/install.go

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ func NewInstallCmd() (cmd *cobra.Command) {
1919
opt := &installOption{}
2020
cmd = &cobra.Command{
2121
Use: "install",
22+
Short: "Install a package from https://github.com/LinuxSuRen/hd-home",
23+
Example: "hd install jenkins-zh/jenkins-cli/jcli -t 6",
2224
PreRunE: opt.preRunE,
2325
RunE: opt.runE,
2426
}
@@ -29,6 +31,8 @@ func NewInstallCmd() (cmd *cobra.Command) {
2931
flags.BoolVarP(&opt.ShowProgress, "show-progress", "", true, "If show the progress of download")
3032
flags.BoolVarP(&opt.Fetch, "fetch", "", true,
3133
"If fetch the latest config from https://github.com/LinuxSuRen/hd-home")
34+
flags.BoolVarP(&opt.Download, "download", "", true,
35+
"If download the package")
3236
flags.IntVarP(&opt.Thread, "thread", "t", 4,
3337
`Download file with multi-threads. It only works when its value is bigger than 1`)
3438
flags.BoolVarP(&opt.KeepPart, "keep-part", "", false,
@@ -41,7 +45,8 @@ func NewInstallCmd() (cmd *cobra.Command) {
4145

4246
type installOption struct {
4347
downloadOption
44-
Mode string
48+
Download bool
49+
Mode string
4550
}
4651

4752
func (o *installOption) preRunE(cmd *cobra.Command, args []string) (err error) {
@@ -50,8 +55,10 @@ func (o *installOption) preRunE(cmd *cobra.Command, args []string) (err error) {
5055
}
5156

5257
func (o *installOption) runE(cmd *cobra.Command, args []string) (err error) {
53-
if err = o.downloadOption.runE(cmd, args); err != nil {
54-
return
58+
if o.Download {
59+
if err = o.downloadOption.runE(cmd, args); err != nil {
60+
return
61+
}
5562
}
5663

5764
var source string
@@ -69,13 +76,31 @@ func (o *installOption) runE(cmd *cobra.Command, args []string) (err error) {
6976
}
7077

7178
if err == nil {
72-
fmt.Println("install", source, "to", target)
73-
err = o.overWriteBinary(source, target)
79+
if o.Package != nil && o.Package.PreInstall != nil {
80+
if err = execCommand(o.Package.PreInstall.Cmd, o.Package.PreInstall.Args...); err != nil {
81+
return
82+
}
83+
}
84+
85+
if o.Package != nil && o.Package.Installation != nil {
86+
err = execCommand(o.Package.Installation.Cmd, o.Package.Installation.Args...)
87+
} else {
88+
err = o.overWriteBinary(source, target)
89+
}
90+
91+
if err == nil && o.Package != nil && o.Package.PostInstall != nil {
92+
err = execCommand(o.Package.PostInstall.Cmd, o.Package.PostInstall.Args...)
93+
}
94+
95+
if err == nil && o.Package != nil && o.Package.TestInstall != nil {
96+
err = execCommand(o.Package.TestInstall.Cmd, o.Package.TestInstall.Args...)
97+
}
7498
}
7599
return
76100
}
77101

78102
func (o *installOption) overWriteBinary(sourceFile, targetPath string) (err error) {
103+
fmt.Println("install", sourceFile, "to", targetPath)
79104
switch runtime.GOOS {
80105
case "linux", "darwin":
81106
if err = execCommand("chmod", "u+x", sourceFile); err != nil {

0 commit comments

Comments
 (0)