1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-04-03 20:32:07 -04:00

matugen: skip theme refreshes if no colors changed

This commit is contained in:
bbedward
2026-02-24 13:27:48 -05:00
parent 8e2cd21be8
commit b83256c83a
4 changed files with 61 additions and 25 deletions

View File

@@ -3,7 +3,9 @@ package main
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"os"
"time" "time"
"github.com/AvengeMedia/DankMaterialShell/core/internal/log" "github.com/AvengeMedia/DankMaterialShell/core/internal/log"
@@ -95,7 +97,11 @@ func buildMatugenOptions(cmd *cobra.Command) matugen.Options {
func runMatugenGenerate(cmd *cobra.Command, args []string) { func runMatugenGenerate(cmd *cobra.Command, args []string) {
opts := buildMatugenOptions(cmd) opts := buildMatugenOptions(cmd)
if err := matugen.Run(opts); err != nil { err := matugen.Run(opts)
switch {
case errors.Is(err, matugen.ErrNoChanges):
os.Exit(2)
case err != nil:
log.Fatalf("Theme generation failed: %v", err) log.Fatalf("Theme generation failed: %v", err)
} }
} }
@@ -129,7 +135,11 @@ func runMatugenQueue(cmd *cobra.Command, args []string) {
if !wait { if !wait {
if err := sendServerRequestFireAndForget(request); err != nil { if err := sendServerRequestFireAndForget(request); err != nil {
log.Info("Server unavailable, running synchronously") log.Info("Server unavailable, running synchronously")
if err := matugen.Run(opts); err != nil { err := matugen.Run(opts)
switch {
case errors.Is(err, matugen.ErrNoChanges):
os.Exit(2)
case err != nil:
log.Fatalf("Theme generation failed: %v", err) log.Fatalf("Theme generation failed: %v", err)
} }
return return
@@ -146,11 +156,15 @@ func runMatugenQueue(cmd *cobra.Command, args []string) {
resp, ok := tryServerRequest(request) resp, ok := tryServerRequest(request)
if !ok { if !ok {
log.Info("Server unavailable, running synchronously") log.Info("Server unavailable, running synchronously")
if err := matugen.Run(opts); err != nil { err := matugen.Run(opts)
switch {
case errors.Is(err, matugen.ErrNoChanges):
resultCh <- matugen.ErrNoChanges
case err != nil:
resultCh <- err resultCh <- err
return default:
resultCh <- nil
} }
resultCh <- nil
return return
} }
if resp.Error != "" { if resp.Error != "" {
@@ -162,7 +176,10 @@ func runMatugenQueue(cmd *cobra.Command, args []string) {
select { select {
case err := <-resultCh: case err := <-resultCh:
if err != nil { switch {
case errors.Is(err, matugen.ErrNoChanges):
os.Exit(2)
case err != nil:
log.Fatalf("Theme generation failed: %v", err) log.Fatalf("Theme generation failed: %v", err)
} }
fmt.Println("Theme generation completed") fmt.Println("Theme generation completed")

View File

@@ -1,7 +1,9 @@
package matugen package matugen
import ( import (
"bytes"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"math" "math"
"os" "os"
@@ -19,6 +21,8 @@ import (
"github.com/lucasb-eyer/go-colorful" "github.com/lucasb-eyer/go-colorful"
) )
var ErrNoChanges = errors.New("no color changes")
type ColorMode string type ColorMode string
const ( const (
@@ -160,39 +164,45 @@ func Run(opts Options) error {
log.Infof("Building theme: %s %s (%s)", opts.Kind, opts.Value, opts.Mode) log.Infof("Building theme: %s %s (%s)", opts.Kind, opts.Value, opts.Mode)
buildErr := buildOnce(&opts) changed, buildErr := buildOnce(&opts)
if buildErr != nil {
return buildErr
}
if !changed {
log.Info("No color changes detected, skipping refresh")
return ErrNoChanges
}
if opts.SyncModeWithPortal { if opts.SyncModeWithPortal {
syncColorScheme(opts.Mode) syncColorScheme(opts.Mode)
} }
if buildErr != nil {
return buildErr
}
log.Info("Done") log.Info("Done")
return nil return nil
} }
func buildOnce(opts *Options) error { func buildOnce(opts *Options) (bool, error) {
cfgFile, err := os.CreateTemp("", "matugen-config-*.toml") cfgFile, err := os.CreateTemp("", "matugen-config-*.toml")
if err != nil { if err != nil {
return fmt.Errorf("failed to create temp config: %w", err) return false, fmt.Errorf("failed to create temp config: %w", err)
} }
defer os.Remove(cfgFile.Name()) defer os.Remove(cfgFile.Name())
defer cfgFile.Close() defer cfgFile.Close()
tmpDir, err := os.MkdirTemp("", "matugen-templates-*") tmpDir, err := os.MkdirTemp("", "matugen-templates-*")
if err != nil { if err != nil {
return fmt.Errorf("failed to create temp dir: %w", err) return false, fmt.Errorf("failed to create temp dir: %w", err)
} }
defer os.RemoveAll(tmpDir) defer os.RemoveAll(tmpDir)
if err := buildMergedConfig(opts, cfgFile, tmpDir); err != nil { if err := buildMergedConfig(opts, cfgFile, tmpDir); err != nil {
return fmt.Errorf("failed to build config: %w", err) return false, fmt.Errorf("failed to build config: %w", err)
} }
cfgFile.Close() cfgFile.Close()
oldColors, _ := os.ReadFile(opts.ColorsOutput())
var primaryDark, primaryLight, surface string var primaryDark, primaryLight, surface string
var dank16JSON string var dank16JSON string
var importArgs []string var importArgs []string
@@ -204,7 +214,7 @@ func buildOnce(opts *Options) error {
surface = extractNestedColor(opts.StockColors, "surface", "dark") surface = extractNestedColor(opts.StockColors, "surface", "dark")
if primaryDark == "" { if primaryDark == "" {
return fmt.Errorf("failed to extract primary dark from stock colors") return false, fmt.Errorf("failed to extract primary dark from stock colors")
} }
if primaryLight == "" { if primaryLight == "" {
primaryLight = primaryDark primaryLight = primaryDark
@@ -218,14 +228,14 @@ func buildOnce(opts *Options) error {
args := []string{"color", "hex", primaryDark, "-m", string(opts.Mode), "-t", opts.MatugenType, "-c", cfgFile.Name()} args := []string{"color", "hex", primaryDark, "-m", string(opts.Mode), "-t", opts.MatugenType, "-c", cfgFile.Name()}
args = append(args, importArgs...) args = append(args, importArgs...)
if err := runMatugen(args); err != nil { if err := runMatugen(args); err != nil {
return err return false, err
} }
} else { } else {
log.Infof("Using dynamic theme from %s: %s", opts.Kind, opts.Value) log.Infof("Using dynamic theme from %s: %s", opts.Kind, opts.Value)
matJSON, err := runMatugenDryRun(opts) matJSON, err := runMatugenDryRun(opts)
if err != nil { if err != nil {
return fmt.Errorf("matugen dry-run failed: %w", err) return false, fmt.Errorf("matugen dry-run failed: %w", err)
} }
primaryDark = extractMatugenColor(matJSON, "primary", "dark") primaryDark = extractMatugenColor(matJSON, "primary", "dark")
@@ -233,7 +243,7 @@ func buildOnce(opts *Options) error {
surface = extractMatugenColor(matJSON, "surface", "dark") surface = extractMatugenColor(matJSON, "surface", "dark")
if primaryDark == "" { if primaryDark == "" {
return fmt.Errorf("failed to extract primary color") return false, fmt.Errorf("failed to extract primary color")
} }
if primaryLight == "" { if primaryLight == "" {
primaryLight = primaryDark primaryLight = primaryDark
@@ -254,10 +264,15 @@ func buildOnce(opts *Options) error {
args = append(args, "-m", string(opts.Mode), "-t", opts.MatugenType, "-c", cfgFile.Name()) args = append(args, "-m", string(opts.Mode), "-t", opts.MatugenType, "-c", cfgFile.Name())
args = append(args, importArgs...) args = append(args, importArgs...)
if err := runMatugen(args); err != nil { if err := runMatugen(args); err != nil {
return err return false, err
} }
} }
newColors, _ := os.ReadFile(opts.ColorsOutput())
if bytes.Equal(oldColors, newColors) && len(oldColors) > 0 {
return false, nil
}
if isDMSGTKActive(opts.ConfigDir) { if isDMSGTKActive(opts.ConfigDir) {
switch opts.Mode { switch opts.Mode {
case ColorModeLight: case ColorModeLight:
@@ -275,7 +290,7 @@ func buildOnce(opts *Options) error {
signalTerminals(opts) signalTerminals(opts)
return nil return true, nil
} }
func buildMergedConfig(opts *Options, cfgFile *os.File, tmpDir string) error { func buildMergedConfig(opts *Options, cfgFile *os.File, tmpDir string) error {

View File

@@ -2,6 +2,7 @@ package matugen
import ( import (
"context" "context"
"errors"
"sync" "sync"
"github.com/AvengeMedia/DankMaterialShell/core/internal/log" "github.com/AvengeMedia/DankMaterialShell/core/internal/log"
@@ -93,10 +94,13 @@ func (q *Queue) runWorker() {
err := Run(job.Options) err := Run(job.Options)
var result Result var result Result
if err != nil { switch {
result = Result{Success: false, Error: err} case err == nil:
} else {
result = Result{Success: true} result = Result{Success: true}
case errors.Is(err, ErrNoChanges):
result = Result{Success: true}
default:
result = Result{Success: false, Error: err}
} }
q.finishJob(result) q.finishJob(result)

View File

@@ -66,7 +66,7 @@ Singleton {
Timer { Timer {
id: suppressResetTimer id: suppressResetTimer
interval: 2000 interval: 5000
onTriggered: root.matugenSuppression = false onTriggered: root.matugenSuppression = false
} }