99 lines
1.6 KiB
Go
99 lines
1.6 KiB
Go
package hugo
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"regexp"
|
|
"runtime"
|
|
"runtime/debug"
|
|
|
|
"github.com/mitchellh/go-homedir"
|
|
)
|
|
|
|
// This is automatically set on `go generate`
|
|
const version = "UNDEFINED"
|
|
|
|
// GetPath retrives the Hugo path for the user or install it if it's not found
|
|
func getPath() string {
|
|
homedir, err := homedir.Dir()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(-1)
|
|
}
|
|
|
|
caddy := filepath.Join(homedir, ".caddy")
|
|
bin := filepath.Join(caddy, "bin")
|
|
hugo := ""
|
|
found := false
|
|
|
|
// Check if Hugo is already on $PATH
|
|
if hugo, err = exec.LookPath("hugo"); err == nil {
|
|
if checkVersion(hugo) {
|
|
return hugo
|
|
}
|
|
|
|
found = true
|
|
}
|
|
|
|
if !found {
|
|
hugo = filepath.Join(bin, "hugo")
|
|
|
|
if runtime.GOOS == "windows" {
|
|
hugo += ".exe"
|
|
}
|
|
|
|
// Check if Hugo is on $HOME/.caddy/bin
|
|
if _, err = os.Stat(hugo); err == nil {
|
|
if checkVersion(hugo) {
|
|
return hugo
|
|
}
|
|
|
|
found = true
|
|
}
|
|
}
|
|
|
|
if found {
|
|
fmt.Println("We will update your hugo to the newest version.")
|
|
} else {
|
|
fmt.Println("Unable to find Hugo on your computer.")
|
|
}
|
|
|
|
// Create the neccessary folders
|
|
os.MkdirAll(caddy, 0774)
|
|
os.Mkdir(bin, 0774)
|
|
|
|
binary, err := Asset("hugo")
|
|
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(-1)
|
|
}
|
|
|
|
err = ioutil.WriteFile(hugo, binary, 0644)
|
|
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(-1)
|
|
}
|
|
|
|
binary = nil
|
|
|
|
// Force memory RAM garbage collector
|
|
debug.FreeOSMemory()
|
|
|
|
fmt.Println("Hugo installed at " + hugo)
|
|
return hugo
|
|
}
|
|
|
|
func checkVersion(hugo string) bool {
|
|
out, _ := exec.Command(hugo, "version").Output()
|
|
|
|
r := regexp.MustCompile(`v\d\.\d{2}`)
|
|
v := r.FindStringSubmatch(string(out))[0]
|
|
|
|
return (v == version)
|
|
}
|