drone-hugo/plugin.go
Thomas Boerger b4fa179180
Compile Hugo on our own, fix extended version and refactoring
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++.
2020-05-15 02:13:51 +02:00

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, " "))
}