Since the extended version is only available for amd64 I have started to build Hugo on our own in a multi stage Dockerfile. Now we are installing both binaries, regular hugo and extended hugo, bundled into the Docker image. Beside that the download for regular hugo and extended hugo should also be more solid now. After that I have also added more aliases for the environment variables. As mentioned on some GitHub issue we are also installing more required packages for a downloaded extended Hugo version as this relies on libc6-compat and libstdc++.
161 lines
2.8 KiB
Go
161 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
|
|
"github.com/drone-plugins/drone-hugo/download"
|
|
)
|
|
|
|
type (
|
|
Plugin struct {
|
|
Config Config
|
|
BuildInVersion string
|
|
}
|
|
|
|
Config struct {
|
|
URL string
|
|
Drafts bool
|
|
Expired bool
|
|
Future bool
|
|
Validate bool
|
|
Cache string
|
|
Config string
|
|
Content string
|
|
Layout string
|
|
Output string
|
|
Source string
|
|
Theme string
|
|
Version string
|
|
Extended bool
|
|
}
|
|
)
|
|
|
|
var (
|
|
hugoExecutable = "hugo"
|
|
)
|
|
|
|
// Exec executes the plugins functionality
|
|
func (p Plugin) Exec() error {
|
|
var cmds = make([]*exec.Cmd, 0)
|
|
|
|
if p.Config.Extended {
|
|
hugoExecutable = "hugo-extended"
|
|
}
|
|
|
|
// Check if buildIn plugin version equals
|
|
// plugin version declared in drone.yml
|
|
if !versionsEqual(p.BuildInVersion, p.Config.Version) {
|
|
version := p.Config.Version
|
|
|
|
if version == "" {
|
|
version = p.BuildInVersion
|
|
}
|
|
|
|
executable, err := download.Get(version, p.Config.Extended)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
hugoExecutable = executable
|
|
}
|
|
|
|
if p.Config.Validate {
|
|
cmds = append(cmds, commandValidate(p.Config))
|
|
}
|
|
|
|
cmds = append(cmds, commandBuild(p.Config))
|
|
return execAll(cmds)
|
|
}
|
|
|
|
func commandValidate(config Config) *exec.Cmd {
|
|
args := []string{"check"}
|
|
|
|
if config.Config != "" {
|
|
args = append(args, "--config", config.Config)
|
|
}
|
|
|
|
return exec.Command(hugoExecutable, args...)
|
|
}
|
|
|
|
func commandBuild(config Config) *exec.Cmd {
|
|
var args = make([]string, 0)
|
|
|
|
if config.Drafts {
|
|
args = append(args, "-D")
|
|
}
|
|
|
|
if config.Expired {
|
|
args = append(args, "-E")
|
|
}
|
|
|
|
if config.Future {
|
|
args = append(args, "-F")
|
|
}
|
|
|
|
if config.Cache != "" {
|
|
args = append(args, "--cacheDir", config.Cache)
|
|
}
|
|
|
|
if config.Config != "" {
|
|
args = append(args, "--config", config.Config)
|
|
}
|
|
|
|
if config.Content != "" {
|
|
args = append(args, "--contentDir", config.Content)
|
|
}
|
|
|
|
if config.Layout != "" {
|
|
args = append(args, "--layoutDir", config.Layout)
|
|
}
|
|
|
|
if config.Output != "" {
|
|
args = append(args, "--destination", config.Output)
|
|
}
|
|
|
|
if config.Source != "" {
|
|
args = append(args, "--source", config.Source)
|
|
}
|
|
|
|
if config.Theme != "" {
|
|
args = append(args, "--theme", config.Theme)
|
|
}
|
|
|
|
if config.URL != "" {
|
|
args = append(args, "--baseURL", config.URL)
|
|
}
|
|
|
|
return exec.Command(hugoExecutable, args...)
|
|
}
|
|
|
|
// execAll executes a slice of commands as a batch job
|
|
func execAll(cmds []*exec.Cmd) error {
|
|
for _, cmd := range cmds {
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
trace(cmd)
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func versionsEqual(version string, toCompare string) bool {
|
|
if toCompare == version || toCompare == "" {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// trace writes each command to stdout with the command wrapped in an xml
|
|
// tag so that it can be extracted and displayed in the logs.
|
|
func trace(cmd *exec.Cmd) {
|
|
fmt.Fprintf(os.Stdout, "+ %s\n", strings.Join(cmd.Args, " "))
|
|
}
|