Better binary defaults
continuous-integration/drone/pr Build is passing
Details
continuous-integration/drone/pr Build is passing
Details
Signed-off-by: jolheiser <john.olheiser@gmail.com>pull/2/head
parent
b561b7c7ca
commit
6ed733d794
|
@ -4,6 +4,10 @@
|
||||||
|
|
||||||
**NOTE:** This URL may not remain permanent, it is simply usable at the time of writing this library.
|
**NOTE:** This URL may not remain permanent, it is simply usable at the time of writing this library.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
`go install git.jojodev.com/golang/dl/cmd/godl@main`
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
[MIT](LICENSE)
|
[MIT](LICENSE)
|
122
cmd/godl/godl.go
122
cmd/godl/godl.go
|
@ -2,6 +2,7 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
@ -18,8 +19,8 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
downloadFlag := flag.Bool("download", false, "Download latest Go")
|
||||||
installFlag := flag.Bool("install", false, "Install/Update Go (Linux only)")
|
installFlag := flag.Bool("install", false, "Install/Update Go (Linux only)")
|
||||||
versionFlag := flag.Bool("version", false, "Only print version")
|
|
||||||
outFlag := flag.String("out", ".", "Where to put the downloaded file")
|
outFlag := flag.String("out", ".", "Where to put the downloaded file")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
|
@ -29,63 +30,47 @@ func main() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if *versionFlag {
|
if !*downloadFlag && !*installFlag {
|
||||||
fmt.Println(latest.Version)
|
ver, err := goVersion()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Printf("Current: %sLatest: %s\n", ver, latest.Version)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
outPath, err := download(latest.Filename, *outFlag)
|
outPath := filepath.Join(*outFlag, latest.Filename)
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fmt.Println(outPath)
|
|
||||||
|
|
||||||
if !*installFlag {
|
if *downloadFlag {
|
||||||
return
|
if err := download(latest.Filename, outPath); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println(outPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !strings.EqualFold(runtime.GOOS, "linux") {
|
if *installFlag {
|
||||||
fmt.Println("Install option is only for Linux. Mac and Windows users should run the downloaded installer.")
|
if err := install(outPath); err != nil {
|
||||||
return
|
fmt.Println(err)
|
||||||
}
|
return
|
||||||
|
}
|
||||||
if os.Geteuid() != 0 {
|
ver, err := goVersion()
|
||||||
fmt.Println(`This command must be run as root to perform the install.
|
if err != nil {
|
||||||
Alternatively, you can run the following command manually, which is taken from https://golang.org/doc/install#install
|
fmt.Println(err)
|
||||||
|
return
|
||||||
rm -rf /usr/local/go && tar -C /usr/local -xzf ` + outPath)
|
}
|
||||||
return
|
fmt.Printf("Successfully installed: %s\n", ver)
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("removing local installation")
|
|
||||||
rm := exec.Command("rm", "-rf", "/usr/local/go")
|
|
||||||
if err := rm.Run(); err != nil {
|
|
||||||
fmt.Printf("could not remove local go installation: %v\n", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("extracting new installation")
|
|
||||||
tar := exec.Command("tar", "-C", "/usr/local", "-xzf", outPath)
|
|
||||||
if err := tar.Run(); err != nil {
|
|
||||||
fmt.Printf("could not extract new installation: %v\n", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
rmDl := exec.Command("rm", outPath)
|
|
||||||
if err := rmDl.Run(); err != nil {
|
|
||||||
fmt.Printf("could not remove downloaded file: %v\n", err)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func goVersion() (string, error) {
|
||||||
goVersion := exec.Command("/usr/local/go/bin/go", "version")
|
goVersion := exec.Command("/usr/local/go/bin/go", "version")
|
||||||
out, err := goVersion.Output()
|
out, err := goVersion.Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("could not check go version: %v\n", err)
|
return "", fmt.Errorf("could not check go version: %v", err)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
return string(out), nil
|
||||||
fmt.Printf("Successfully installed: %s\n", string(out))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func latestVersion() (*dl.File, error) {
|
func latestVersion() (*dl.File, error) {
|
||||||
|
@ -111,23 +96,22 @@ func latestVersion() (*dl.File, error) {
|
||||||
return &version, nil
|
return &version, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func download(filename, out string) (string, error) {
|
func download(filename, outPath string) error {
|
||||||
outPath := filepath.Join(out, filename)
|
|
||||||
outFile, err := os.Create(outPath)
|
outFile, err := os.Create(outPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return outPath, fmt.Errorf("could not create file for download: %v", err)
|
return fmt.Errorf("could not create file for download: %v", err)
|
||||||
}
|
}
|
||||||
defer outFile.Close()
|
defer outFile.Close()
|
||||||
|
|
||||||
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("https://golang.org/dl/%s", filename), nil)
|
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("https://golang.org/dl/%s", filename), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return outPath, fmt.Errorf("could not create request: %v", err)
|
return fmt.Errorf("could not create request: %v", err)
|
||||||
}
|
}
|
||||||
req.Header.Set("User-Agent", "git.jojodev.com/golang/dl/cmd/godl")
|
req.Header.Set("User-Agent", "git.jojodev.com/golang/dl/cmd/godl")
|
||||||
|
|
||||||
res, err := http.DefaultClient.Do(req)
|
res, err := http.DefaultClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return outPath, fmt.Errorf("could not download file: %v", err)
|
return fmt.Errorf("could not download file: %v", err)
|
||||||
}
|
}
|
||||||
defer res.Body.Close()
|
defer res.Body.Close()
|
||||||
|
|
||||||
|
@ -137,8 +121,40 @@ func download(filename, out string) (string, error) {
|
||||||
)
|
)
|
||||||
|
|
||||||
if _, err := io.Copy(io.MultiWriter(outFile, bar), res.Body); err != nil {
|
if _, err := io.Copy(io.MultiWriter(outFile, bar), res.Body); err != nil {
|
||||||
return outPath, err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return outPath, nil
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func install(outPath string) error {
|
||||||
|
if !strings.EqualFold(runtime.GOOS, "linux") {
|
||||||
|
return errors.New("Install option is only for Linux. Mac and Windows users should run the downloaded installer.")
|
||||||
|
}
|
||||||
|
|
||||||
|
if os.Geteuid() != 0 {
|
||||||
|
return fmt.Errorf(`This command must be run as root to perform the install.
|
||||||
|
Alternatively, you can run the following command manually, which is taken from https://golang.org/doc/install#install
|
||||||
|
|
||||||
|
rm -rf /usr/local/go && tar -C /usr/local -xzf ` + outPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("removing local installation")
|
||||||
|
rm := exec.Command("rm", "-rf", "/usr/local/go")
|
||||||
|
if err := rm.Run(); err != nil {
|
||||||
|
return fmt.Errorf("could not remove local go installation: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("extracting new installation")
|
||||||
|
tar := exec.Command("tar", "-C", "/usr/local", "-xzf", outPath)
|
||||||
|
if err := tar.Run(); err != nil {
|
||||||
|
return fmt.Errorf("could not extract new installation: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
rmDl := exec.Command("rm", outPath)
|
||||||
|
if err := rmDl.Run(); err != nil {
|
||||||
|
return fmt.Errorf("could not remove downloaded file: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue