Skip to content

Commit 6e6d3fb

Browse files
committed
feat: add rudimentary support for cobra based cli's
1 parent 5c5957a commit 6e6d3fb

File tree

3 files changed

+58
-17
lines changed

3 files changed

+58
-17
lines changed

build/build.go

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package build
22

33
import (
4+
"bytes"
45
"fmt"
56
"io"
6-
"io/ioutil"
77
"log"
88
"os"
99
"os/exec"
@@ -15,6 +15,7 @@ import (
1515
type Binary struct {
1616
Container string
1717
Name string
18+
CmdPath string
1819
Source string
1920
Dest string
2021
OS string
@@ -71,12 +72,12 @@ func (bin *Binary) WriteBuild(writer io.Writer) error {
7172
return err
7273
}
7374

74-
err = bin.createTempMainFile(dir)
75+
err = bin.addAsDep(dir)
7576
if err != nil {
7677
return err
7778
}
7879

79-
err = bin.addAsDep(dir)
80+
err = bin.createTempMainFile(dir)
8081
if err != nil {
8182
return err
8283
}
@@ -86,16 +87,25 @@ func (bin *Binary) WriteBuild(writer io.Writer) error {
8687
return err
8788
}
8889

89-
err = bin.quickBuildBinary(dir)
90+
err = bin.createTempMainFile(dir)
9091
if err != nil {
91-
log.Println("Failed to quick build, attempting manual build")
92-
err = bin.buildBinary(dir)
92+
return err
93+
}
94+
95+
err = nil
96+
if !bin.isUsingCobra(dir) {
97+
err = bin.quickBuildBinary(dir)
9398
if err != nil {
94-
log.Println("Failed to manual build as fell")
95-
return err
99+
log.Println("Failed to quick build, attempting manual build")
96100
}
97101
}
98102

103+
err = bin.buildBinary(dir)
104+
if err != nil {
105+
log.Println("Failed to manual build as fell")
106+
return err
107+
}
108+
99109
f, err := os.Open(bin.Dest)
100110
if err != nil {
101111
return err
@@ -146,10 +156,22 @@ func (bin *Binary) newModule(dir string) error {
146156

147157
func (bin *Binary) createTempMainFile(dir string) error {
148158
var fileDetails strings.Builder
159+
160+
isCobraBuilt := bin.isUsingCobra(dir)
161+
149162
fileDetails.Write([]byte("package main\n"))
150-
fileDetails.Write([]byte("import(\""))
151-
fileDetails.Write([]byte(bin.Path))
163+
if isCobraBuilt {
164+
fileDetails.Write([]byte("import( cli \""))
165+
} else {
166+
fileDetails.Write([]byte("import(\""))
167+
}
168+
fileDetails.Write([]byte(bin.Path + bin.CmdPath))
152169
fileDetails.Write([]byte("\")"))
170+
171+
if isCobraBuilt {
172+
fileDetails.Write([]byte("\nfunc main(){ cli.Run()}"))
173+
}
174+
153175
filePath := path.Join(dir, "main.go")
154176
file, err := os.Create(filePath)
155177
if err != nil {
@@ -168,6 +190,20 @@ func (bin *Binary) runModTidy(dir string) error {
168190
return command(cmd)
169191
}
170192

193+
func (bin *Binary) isUsingCobra(dir string) bool {
194+
modFile, err := os.ReadFile(filepath.Join(dir, "go.mod"))
195+
196+
if err != nil {
197+
return false
198+
}
199+
200+
if !bytes.Contains(modFile, []byte("github.com/spf13/cobra")) {
201+
return false
202+
}
203+
204+
return true
205+
}
206+
171207
func (bin *Binary) quickBuildBinary(dir string) error {
172208
dst, err := tempFilename()
173209

@@ -176,7 +212,7 @@ func (bin *Binary) quickBuildBinary(dir string) error {
176212
}
177213

178214
bin.Dest = dst
179-
cmd := exec.Command("go", "build", "-o", bin.Dest, bin.Module)
215+
cmd := exec.Command("go", "build", "-o", bin.Dest, bin.Module+bin.CmdPath)
180216
cmd.Env = environ()
181217
cmd.Env = append(cmd.Env, "CGO_ENABLED=0")
182218
cmd.Env = append(cmd.Env, "GOOS="+bin.OS)
@@ -214,17 +250,16 @@ func (bin *Binary) Cleanup() error {
214250

215251
// tempFilename returns a new temporary file name.
216252
func tempFilename() (string, error) {
217-
f, err := ioutil.TempFile(os.TempDir(), "goblin")
253+
f, err := os.MkdirTemp(os.TempDir(), "goblin")
218254
if err != nil {
219255
return "", err
220256
}
221-
defer f.Close()
222-
defer os.Remove(f.Name())
223-
return f.Name(), nil
257+
defer os.Remove(f)
258+
return f, nil
224259
}
225260

226261
func tempDirectory() (string, error) {
227-
dir, err := ioutil.TempDir(os.TempDir(), "goblin")
262+
dir, err := os.MkdirTemp(os.TempDir(), "goblin")
228263
if err != nil {
229264
return "", err
230265
}

cmd/goblin-api/main.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ func parsePackage(path string) (pkg, mod, version, bin string) {
118118
modp := strings.Split(pkg, "/")
119119
if len(modp) >= 3 {
120120
mod = strings.Join(modp[:3], "/")
121+
} else {
122+
mod = pkg
121123
}
122124

123125
// version after @
@@ -214,10 +216,13 @@ func fetchBinary(rw http.ResponseWriter, req *http.Request) {
214216
binName = name
215217
}
216218

219+
cmdPath := req.URL.Query().Get("cmd")
220+
217221
bin := &build.Binary{
218222
Path: pkg,
219223
Version: version,
220224
OS: goos,
225+
CmdPath: cmdPath,
221226
Arch: arch,
222227
Name: binName,
223228
Module: mod,

templates/install.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,15 @@ start() {
167167
prefix=${PREFIX:-"/usr/local/bin"}
168168
out=${OUT:-"$bin"}
169169
tmp="$(mktmpdir)/$out"
170+
cmd=${CMD_PATH:-""}
170171

171172
echo
172173
log_info "Downloading $pkg@$original_version"
173174
if [ "$original_version" != "$version" ]; then
174175
log_info "Resolved version $original_version to $version"
175176
fi
176177
log_info "Building binary for $os $arch ... Please wait"
177-
http_download $tmp "$api/binary/$pkg?os=$os&arch=$arch&version=$version&out=$out"
178+
http_download $tmp "$api/binary/$pkg?os=$os&arch=$arch&version=$version&out=$out&cmd=$cmd"
178179

179180
# check if the directory exists and also check if it requires write permissions
180181
if [ ! -d "$prefix" ]; then

0 commit comments

Comments
 (0)