drone-hugo/download/download.go
Bo-Yi Wu 9b5c18bcdd feat(vendor): switch dep to go module
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2019-01-09 15:18:15 +08:00

87 lines
1.6 KiB
Go

package download
import (
"archive/tar"
"compress/gzip"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"os"
"runtime"
"strings"
"github.com/pkg/errors"
)
var (
_downloadURL = "https://github.com/gohugoio/hugo/releases/download/v%s/hugo_%s_Linux-%s.tar.gz"
)
func downloadURL(version string) string {
var archType string
switch runtime.GOARCH {
case "amd64":
archType = "64bit"
case "arm64":
archType = "arm64"
case "arm":
archType = "arm"
case "386":
archType = "32bit"
default:
archType = "unsupported"
}
return fmt.Sprintf(_downloadURL, version, version, archType)
}
func getTempFile() (string, io.WriteCloser, error) {
d, err := ioutil.TempDir("", "")
if err != nil {
return "", nil, errors.Wrap(err, "")
}
f, err := ioutil.TempFile(d, "")
return f.Name(), f, err
}
// Get will download the specified hugo verion
func Get(version string) (string, error) {
resp, err := http.Get(downloadURL(version))
if err != nil {
return "", errors.Wrap(err, "")
}
defer resp.Body.Close()
gz, err := gzip.NewReader(resp.Body)
if err != nil {
return "", errors.Wrap(err, "")
}
defer gz.Close()
targz := tar.NewReader(gz)
hugoPath, hugoBin, err := getTempFile()
if err != nil {
log.Printf("ERROR: %s", err)
return "", errors.Wrap(err, "")
}
defer hugoBin.Close()
for {
h, err := targz.Next()
if err == io.EOF {
return "", errors.New("no hugo binary found")
}
if err != nil {
return "", errors.Wrap(err, "")
}
if strings.HasSuffix(h.Name, "hugo") {
io.Copy(hugoBin, targz)
if err := os.Chmod(hugoPath, 0755); err != nil {
log.Fatal(err)
}
return hugoPath, nil
}
}
}