diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8604e9a..cc66cbe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.24.3' + go-version: '1.21' - name: Install Fyne dependencies run: | @@ -26,6 +26,12 @@ jobs: - name: Install Fyne CLI run: go install fyne.io/fyne/v2/cmd/fyne@latest + - name: Set environment variables + run: | + echo "CGO_ENABLED=1" >> $GITHUB_ENV + echo "GOOS=darwin" >> $GITHUB_ENV + echo "GOARCH=arm64" >> $GITHUB_ENV + - name: Cache Go modules uses: actions/cache@v4 with: @@ -40,6 +46,17 @@ jobs: - name: Verify dependencies run: go mod verify + - name: Check code formatting + run: | + if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then + echo "Code is not properly formatted. Please run 'gofmt -s -w .'" + gofmt -s -l . + exit 1 + fi + + - name: Run go vet + run: go vet ./... + - name: Run tests run: go test -v ./... diff --git a/FyneApp.toml b/FyneApp.toml index 2081263..1b563f2 100644 --- a/FyneApp.toml +++ b/FyneApp.toml @@ -3,4 +3,4 @@ Name = "TurtleSilicon" ID = "com.tairasu.turtlesilicon" Version = "1.1.2" - Build = 25 + Build = 26 diff --git a/go.mod b/go.mod index c606545..8ee45a0 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,11 @@ module turtlesilicon -go 1.24.3 +go 1.21 -require fyne.io/fyne/v2 v2.6.1 +require ( + fyne.io/fyne/v2 v2.6.1 + github.com/zalando/go-keyring v0.2.6 +) require ( al.essio.dev/pkg/shellescape v1.5.1 // indirect @@ -34,7 +37,6 @@ require ( github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect github.com/stretchr/testify v1.10.0 // indirect github.com/yuin/goldmark v1.7.8 // indirect - github.com/zalando/go-keyring v0.2.6 // indirect golang.org/x/image v0.24.0 // indirect golang.org/x/net v0.35.0 // indirect golang.org/x/sys v0.30.0 // indirect diff --git a/go.sum b/go.sum index 06e7af5..c9273a2 100644 --- a/go.sum +++ b/go.sum @@ -39,6 +39,8 @@ github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/hack-pad/go-indexeddb v0.3.2 h1:DTqeJJYc1usa45Q5r52t01KhvlSN02+Oq+tQbSBI91A= github.com/hack-pad/go-indexeddb v0.3.2/go.mod h1:QvfTevpDVlkfomY498LhstjwbPW6QC4VC/lxYb0Kom0= github.com/hack-pad/safejs v0.1.0 h1:qPS6vjreAqh2amUqj4WNG1zIw7qlRQJ9K10eDKMCnE8= @@ -65,6 +67,8 @@ github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiY github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= diff --git a/pkg/patching/patching.go b/pkg/patching/patching.go index c9584c3..ad76af3 100644 --- a/pkg/patching/patching.go +++ b/pkg/patching/patching.go @@ -2,6 +2,7 @@ package patching import ( "bytes" + "errors" "fmt" "io" "log" @@ -10,10 +11,11 @@ import ( "path/filepath" "strings" - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/dialog" "turtlesilicon/pkg/paths" // Corrected import path "turtlesilicon/pkg/utils" // Corrected import path + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/dialog" ) func PatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { @@ -39,7 +41,7 @@ func PatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { resource, err := fyne.LoadResourceFromPath(resourceName) if err != nil { errMsg := fmt.Sprintf("failed to open bundled resource %s: %v", resourceName, err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) paths.PatchesAppliedTurtleWoW = false updateAllStatuses() @@ -49,7 +51,7 @@ func PatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { destinationFile, err := os.Create(destPath) if err != nil { errMsg := fmt.Sprintf("failed to create destination file %s: %v", destPath, err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) paths.PatchesAppliedTurtleWoW = false updateAllStatuses() @@ -60,7 +62,7 @@ func PatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { _, err = io.Copy(destinationFile, bytes.NewReader(resource.Content())) if err != nil { errMsg := fmt.Sprintf("failed to copy bundled resource %s to %s: %v", resourceName, destPath, err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) paths.PatchesAppliedTurtleWoW = false updateAllStatuses() @@ -75,7 +77,7 @@ func PatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { } if err := os.MkdirAll(targetRosettaX87Dir, 0755); err != nil { errMsg := fmt.Sprintf("failed to create directory %s: %v", targetRosettaX87Dir, err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) paths.PatchesAppliedTurtleWoW = false updateAllStatuses() @@ -92,7 +94,7 @@ func PatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { resource, err := fyne.LoadResourceFromPath(resourceName) if err != nil { errMsg := fmt.Sprintf("failed to open bundled resource %s: %v", resourceName, err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) paths.PatchesAppliedTurtleWoW = false updateAllStatuses() @@ -102,7 +104,7 @@ func PatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { destinationFile, err := os.Create(destPath) if err != nil { errMsg := fmt.Sprintf("failed to create destination file %s: %v", destPath, err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) paths.PatchesAppliedTurtleWoW = false updateAllStatuses() @@ -113,7 +115,7 @@ func PatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { if err != nil { destinationFile.Close() errMsg := fmt.Sprintf("failed to copy bundled resource %s to %s: %v", resourceName, destPath, err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) paths.PatchesAppliedTurtleWoW = false updateAllStatuses() @@ -125,7 +127,7 @@ func PatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { log.Printf("Setting execute permission for %s", destPath) if err := os.Chmod(destPath, 0755); err != nil { errMsg := fmt.Sprintf("failed to set execute permission for %s: %v", destPath, err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) paths.PatchesAppliedTurtleWoW = false updateAllStatuses() @@ -162,7 +164,7 @@ func PatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { fileContentBytes, err = os.ReadFile(dllsTextFile) if err != nil { errMsg := fmt.Sprintf("failed to read dlls.txt for update: %v", err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) } } @@ -189,7 +191,7 @@ func PatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { if err := os.WriteFile(dllsTextFile, []byte(updatedContent), 0644); err != nil { errMsg := fmt.Sprintf("failed to update dlls.txt: %v", err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) } else { log.Printf("Successfully updated dlls.txt") @@ -232,7 +234,7 @@ func PatchCrossOver(myWindow fyne.Window, updateAllStatuses func()) { combinedOutput, err := cmd.CombinedOutput() if err != nil { derrMsg := fmt.Sprintf("failed to remove signature from %s: %v\nOutput: %s", wineloaderCopy, err, string(combinedOutput)) - dialog.ShowError(fmt.Errorf(derrMsg), myWindow) + dialog.ShowError(errors.New(derrMsg), myWindow) log.Println(derrMsg) paths.PatchesAppliedCrossOver = false if err := os.Remove(wineloaderCopy); err != nil { @@ -246,7 +248,7 @@ func PatchCrossOver(myWindow fyne.Window, updateAllStatuses func()) { log.Printf("Setting execute permissions for %s", wineloaderCopy) if err := os.Chmod(wineloaderCopy, 0755); err != nil { errMsg := fmt.Sprintf("failed to set executable permissions for %s: %v", wineloaderCopy, err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) paths.PatchesAppliedCrossOver = false updateAllStatuses() @@ -278,7 +280,7 @@ func UnpatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { log.Printf("Removing directory: %s", rosettaX87DirPath) if err := os.RemoveAll(rosettaX87DirPath); err != nil { errMsg := fmt.Sprintf("failed to remove directory %s: %v", rosettaX87DirPath, err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) } else { log.Printf("Successfully removed directory: %s", rosettaX87DirPath) @@ -292,7 +294,7 @@ func UnpatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { log.Printf("Removing file: %s", file) if err := os.Remove(file); err != nil { errMsg := fmt.Sprintf("failed to remove file %s: %v", file, err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) } else { log.Printf("Successfully removed file: %s", file) @@ -306,7 +308,7 @@ func UnpatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { content, err := os.ReadFile(dllsTextFile) if err != nil { errMsg := fmt.Sprintf("failed to read dlls.txt file: %v", err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) } else { lines := strings.Split(string(content), "\n") @@ -322,7 +324,7 @@ func UnpatchTurtleWoW(myWindow fyne.Window, updateAllStatuses func()) { updatedContent := strings.Join(filteredLines, "\n") if err := os.WriteFile(dllsTextFile, []byte(updatedContent), 0644); err != nil { errMsg := fmt.Sprintf("failed to update dlls.txt file: %v", err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) } else { log.Printf("Successfully updated dlls.txt file") @@ -349,7 +351,7 @@ func UnpatchCrossOver(myWindow fyne.Window, updateAllStatuses func()) { log.Printf("Removing file: %s", wineloaderCopy) if err := os.Remove(wineloaderCopy); err != nil { errMsg := fmt.Sprintf("failed to remove file %s: %v", wineloaderCopy, err) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) updateAllStatuses() return diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 0d8f5f4..7a64588 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -2,6 +2,7 @@ package utils import ( "encoding/json" + "errors" "fmt" "io" "log" @@ -99,7 +100,7 @@ func RunOsascript(scriptString string, myWindow fyne.Window) bool { output, err := cmd.CombinedOutput() if err != nil { errMsg := fmt.Sprintf("AppleScript failed: %v\nOutput: %s", err, string(output)) - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(errors.New(errMsg), myWindow) log.Println(errMsg) return false }