96 lines
2.9 KiB
Go
96 lines
2.9 KiB
Go
package run
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/homarr-labs/homarr/tools/homarr-dev/internal/docker"
|
|
)
|
|
|
|
func BuildCurrentImage(tag, directory string) error {
|
|
return buildCurrentImage(context.Background(), tag, directory, os.Stdout, os.Stderr)
|
|
}
|
|
|
|
func buildCurrentImage(ctx context.Context, tag, directory string, stdout, stderr io.Writer) error {
|
|
options, err := CurrentBuildOptions(ctx, tag, directory)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return docker.BuildContext(ctx, options, stdout, stderr)
|
|
}
|
|
|
|
func BuildPRImage(number int, tag string) error {
|
|
return buildPRImage(context.Background(), number, tag, os.Stdout, os.Stderr)
|
|
}
|
|
|
|
func buildPRImage(ctx context.Context, number int, tag string, stdout, stderr io.Writer) error {
|
|
options, cleanup, err := PRBuildOptions(ctx, number, tag, func(line string) {
|
|
_, _ = fmt.Fprintln(stdout, line)
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer cleanup()
|
|
return docker.BuildContext(ctx, options, stdout, stderr)
|
|
}
|
|
|
|
func prFetchArgs(repoURL, refSpec string) []string {
|
|
return []string{"fetch", "--depth=1", repoURL, refSpec}
|
|
}
|
|
|
|
func RebuildImage(image docker.Image) error {
|
|
return RebuildImageContext(context.Background(), image, os.Stdout, os.Stderr)
|
|
}
|
|
|
|
func RebuildImageContext(ctx context.Context, image docker.Image, stdout, stderr io.Writer) error {
|
|
if image.PRNumber > 0 {
|
|
return buildPRImage(ctx, image.PRNumber, image.Tag, stdout, stderr)
|
|
}
|
|
if image.Source == "" {
|
|
return fmt.Errorf("homarr:%s has no build source metadata", image.Tag)
|
|
}
|
|
if info, err := os.Stat(image.Source); err != nil || !info.IsDir() {
|
|
return fmt.Errorf("build source %s is no longer available", image.Source)
|
|
}
|
|
return buildCurrentImage(ctx, image.Tag, image.Source, stdout, stderr)
|
|
}
|
|
|
|
func checkoutDetails(ctx context.Context, directory string) (root string, revision string, err error) {
|
|
cmdRoot := exec.CommandContext(ctx, "git", "-C", directory, "rev-parse", "--show-toplevel")
|
|
cmdRoot.Env = append(
|
|
os.Environ(),
|
|
"MISE_TRUSTED_CONFIG_PATHS=*",
|
|
"MISE_QUIET=1",
|
|
"MISE_SILENT=1",
|
|
"MISE_YES=1",
|
|
"MISE_OVERRIDE_CONFIG_FILENAMES=",
|
|
)
|
|
rootOutput, err := cmdRoot.CombinedOutput()
|
|
if err != nil {
|
|
return "", "", fmt.Errorf("find Homarr checkout: %w: %s", err, strings.TrimSpace(string(rootOutput)))
|
|
}
|
|
root = strings.TrimSpace(string(rootOutput))
|
|
if _, err := os.Stat(filepath.Join(root, "Dockerfile")); err != nil {
|
|
return "", "", fmt.Errorf("%s is not a Homarr checkout", root)
|
|
}
|
|
cmdRev := exec.CommandContext(ctx, "git", "-C", root, "rev-parse", "HEAD")
|
|
cmdRev.Env = append(
|
|
os.Environ(),
|
|
"MISE_TRUSTED_CONFIG_PATHS=*",
|
|
"MISE_QUIET=1",
|
|
"MISE_SILENT=1",
|
|
"MISE_YES=1",
|
|
"MISE_OVERRIDE_CONFIG_FILENAMES=",
|
|
)
|
|
revisionOutput, err := cmdRev.CombinedOutput()
|
|
if err != nil {
|
|
return "", "", fmt.Errorf("read checkout revision: %w: %s", err, strings.TrimSpace(string(revisionOutput)))
|
|
}
|
|
return root, strings.TrimSpace(string(revisionOutput)), nil
|
|
}
|