Files
build-emacs-for-macos/pkg/dmgbuild/dmgbuild.go

85 lines
1.5 KiB
Go

package dmgbuild
import (
"context"
"fmt"
"os"
"os/exec"
"strings"
"github.com/hashicorp/go-hclog"
)
func Build(ctx context.Context, settings *Settings) error {
if settings == nil {
return fmt.Errorf("no settings provided")
}
logger := hclog.NewNullLogger()
if settings.Logger != nil {
logger = settings.Logger
}
if !strings.HasSuffix(logger.Name(), "dmgbuild") {
logger = logger.Named("dmgbuild")
}
_, err := os.Stat(settings.Filename)
if !os.IsNotExist(err) {
return fmt.Errorf("output dmg exists: %s", settings.Filename)
}
baseCmd := settings.Command
if baseCmd == "" {
path, err2 := exec.LookPath("dmgbuild")
if err2 != nil {
return err2
}
baseCmd = path
}
file, err := settings.TempFile()
if err != nil {
return err
}
defer os.Remove(file)
args := []string{"-s", file, settings.VolumeName, settings.Filename}
if logger.IsDebug() {
content, err2 := os.ReadFile(file)
if err2 != nil {
return err2
}
logger.Debug("using settings", file, string(content))
logger.Debug("executing", "command", baseCmd, "args", args)
}
cmd := exec.CommandContext(ctx, baseCmd, args...)
if settings.Stdout != nil {
cmd.Stdout = settings.Stdout
}
if settings.Stderr != nil {
cmd.Stderr = settings.Stderr
}
err = cmd.Run()
if err != nil {
return err
}
f, err := os.Stat(settings.Filename)
if err != nil {
if os.IsNotExist(err) {
return fmt.Errorf("output DMG file is missing")
}
return err
}
if !f.Mode().IsRegular() {
return fmt.Errorf("output DMG file is not a file")
}
return nil
}