From 3d55a8da05ec661d7eb0d88172ec95162770f61a Mon Sep 17 00:00:00 2001 From: Evan Burkey Date: Fri, 25 Jul 2025 14:17:25 -0700 Subject: [PATCH 1/3] clone and build rosettax87 --- go.mod | 15 ++++ go.sum | 61 +++++++++++++- pkg/log/logging.go | 30 ++----- pkg/patching/patching.go | 146 ++++++++++++++++++++++------------ pkg/patching/patching_test.go | 15 ++++ pkg/ui/components.go | 2 +- pkg/ui/popup.go | 83 ++++++++++++++++++- pkg/ui/variables.go | 1 + 8 files changed, 272 insertions(+), 81 deletions(-) create mode 100644 pkg/patching/patching_test.go diff --git a/go.mod b/go.mod index 65a2891..5856e63 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( fyne.io/fyne/v2 v2.6.1 git.burkey.co/eburk/epochcli v0.0.0-20250724135717-365171fddc6b github.com/Masterminds/semver/v3 v3.4.0 + github.com/go-git/go-git/v6 v6.0.0-20250725064440-209d7ec3c0b2 github.com/rs/zerolog v1.34.0 github.com/zalando/go-keyring v0.2.6 gopkg.in/natefinch/lumberjack.v2 v2.2.1 @@ -16,36 +17,50 @@ require ( require ( al.essio.dev/pkg/shellescape v1.6.0 // indirect + dario.cat/mergo v1.0.1 // indirect fyne.io/systray v1.11.0 // indirect github.com/BurntSushi/toml v1.5.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/ProtonMail/go-crypto v1.3.0 // indirect + github.com/cloudflare/circl v1.6.1 // indirect + github.com/cyphar/filepath-securejoin v0.4.1 // indirect github.com/danieljoos/wincred v1.2.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emirpasic/gods v1.18.1 // indirect github.com/fredbi/uri v1.1.0 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fyne-io/gl-js v0.2.0 // indirect github.com/fyne-io/glfw-js v0.3.0 // indirect github.com/fyne-io/image v0.1.1 // indirect github.com/fyne-io/oksvg v0.1.0 // indirect + github.com/go-git/gcfg/v2 v2.0.2 // indirect + github.com/go-git/go-billy/v6 v6.0.0-20250627091229-31e2a16eef30 // indirect github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 // indirect github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728 // indirect github.com/go-text/render v0.2.0 // indirect github.com/go-text/typesetting v0.3.0 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/hack-pad/go-indexeddb v0.3.2 // indirect github.com/hack-pad/safejs v0.1.1 // indirect github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade // indirect github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/kr/text v0.2.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect github.com/nicksnyder/go-i18n/v2 v2.6.0 // indirect + github.com/pjbgf/sha1cd v0.4.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rymdport/portal v0.4.2 // indirect + github.com/sergi/go-diff v1.4.0 // indirect github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect github.com/stretchr/testify v1.10.0 // indirect github.com/yuin/goldmark v1.7.13 // indirect + golang.org/x/crypto v0.40.0 // indirect + golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b // indirect golang.org/x/image v0.29.0 // indirect golang.org/x/net v0.42.0 // indirect golang.org/x/sys v0.34.0 // indirect diff --git a/go.sum b/go.sum index 7343c6f..11823b8 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ al.essio.dev/pkg/shellescape v1.6.0 h1:NxFcEqzFSEVCGN2yq7Huv/9hyCEGVa/TncnOOBBeXHA= al.essio.dev/pkg/shellescape v1.6.0/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= fyne.io/fyne/v2 v2.6.1 h1:kjPJD4/rBS9m2nHJp+npPSuaK79yj6ObMTuzR6VQ1Is= fyne.io/fyne/v2 v2.6.1/go.mod h1:YZt7SksjvrSNJCwbWFV32WON3mE1Sr7L41D29qMZ/lU= fyne.io/systray v1.11.0 h1:D9HISlxSkx+jHSniMBR6fCFOUjk1x/OOOJLa9lJYAKg= @@ -10,12 +12,29 @@ github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= +github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= +github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= +github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0= github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= +github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= github.com/fredbi/uri v1.1.0 h1:OqLpTXtyRg9ABReqvDGdJPqZUxs8cyBDOMXBbskCaB8= @@ -30,6 +49,16 @@ github.com/fyne-io/image v0.1.1 h1:WH0z4H7qfvNUw5l4p3bC1q70sa5+YWVt6HCj7y4VNyA= github.com/fyne-io/image v0.1.1/go.mod h1:xrfYBh6yspc+KjkgdZU/ifUC9sPA5Iv7WYUBzQKK7JM= github.com/fyne-io/oksvg v0.1.0 h1:7EUKk3HV3Y2E+qypp3nWqMXD7mum0hCw2KEGhI1fnBw= github.com/fyne-io/oksvg v0.1.0/go.mod h1:dJ9oEkPiWhnTFNCmRgEze+YNprJF7YRbpjgpWS4kzoI= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= +github.com/go-git/gcfg/v2 v2.0.2 h1:MY5SIIfTGGEMhdA7d7JePuVVxtKL7Hp+ApGDJAJ7dpo= +github.com/go-git/gcfg/v2 v2.0.2/go.mod h1:/lv2NsxvhepuMrldsFilrgct6pxzpGdSRC13ydTLSLs= +github.com/go-git/go-billy/v6 v6.0.0-20250627091229-31e2a16eef30 h1:4KqVJTL5eanN8Sgg3BV6f2/QzfZEFbCd+rTak1fGRRA= +github.com/go-git/go-billy/v6 v6.0.0-20250627091229-31e2a16eef30/go.mod h1:snwvGrbywVFy2d6KJdQ132zapq4aLyzLMgpo79XdEfM= +github.com/go-git/go-git-fixtures/v5 v5.1.0 h1:b8cWxDLTk0s09Ihm9x1HvNGUzxUVlRwIH7EAM0gGDKg= +github.com/go-git/go-git-fixtures/v5 v5.1.0/go.mod h1:CdmU0oQeDuy4Xh8V0i9Ym+vsTkgDDPKEiofBFEVT+aE= +github.com/go-git/go-git/v6 v6.0.0-20250725064440-209d7ec3c0b2 h1:F7u1fj/kU3+amqn25xkiMn77oh7hw0Ac7fKnZh7lqeA= +github.com/go-git/go-git/v6 v6.0.0-20250725064440-209d7ec3c0b2/go.mod h1:gI6xSrrkXH4EKP38iovrsY2EYf2XDU3DrIZRshlNDm0= github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 h1:5BVwOaUSBTlVZowGO6VZGw2H/zl9nrd3eCZfYV+NfQA= github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728 h1:RkGhqHxEVAvPM0/R+8g7XRwQnHatO0KAuVcwHo8q9W8= @@ -43,6 +72,8 @@ github.com/go-text/typesetting-utils v0.0.0-20241103174707-87a29e9e6066/go.mod h github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 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/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= 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= @@ -56,6 +87,13 @@ github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade/go.mod h1:ZDX github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M= github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= @@ -69,30 +107,40 @@ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/nicksnyder/go-i18n/v2 v2.6.0 h1:C/m2NNWNiTB6SK4Ao8df5EWm3JETSTIGNXBpMJTxzxQ= github.com/nicksnyder/go-i18n/v2 v2.6.0/go.mod h1:88sRqr0C6OPyJn0/KRNaEz1uWorjxIKP7rUUcvycecE= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/pjbgf/sha1cd v0.4.0 h1:NXzbL1RvjTUi6kgYZCX3fPwwl27Q1LJndxtUDVfJGRY= +github.com/pjbgf/sha1cd v0.4.0/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/rymdport/portal v0.4.2 h1:7jKRSemwlTyVHHrTGgQg7gmNPJs88xkbKcIL3NlcmSU= github.com/rymdport/portal v0.4.2/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4= +github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= +github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE= 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.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 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.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 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.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= github.com/zalando/go-keyring v0.2.6 h1:r7Yc3+H+Ux0+M72zacZoItR3UDxeWfKTcabvkI8ua9s= github.com/zalando/go-keyring v0.2.6/go.mod h1:2TCrxYrbUNYfNS/Kgy/LSrkSQzZ5UPVH85RwfczwvcI= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b h1:QoALfVG9rhQ/M7vYDScfPdWjGL9dlsVVM5VGh7aKoAA= +golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ= golang.org/x/image v0.29.0 h1:HcdsyR4Gsuys/Axh0rDEmlBmB68rW1U9BUdB3UVHsas= golang.org/x/image v0.29.0/go.mod h1:RVJROnf3SLK8d26OW91j4FrIHGbsJ8QnbEocVTOWQDA= golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= @@ -102,14 +150,19 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= +golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= howett.net/plist v1.0.1 h1:37GdZ8tP09Q35o9ych3ehygcsL+HqKSwzctveSlarvM= diff --git a/pkg/log/logging.go b/pkg/log/logging.go index 0376ab5..3379009 100644 --- a/pkg/log/logging.go +++ b/pkg/log/logging.go @@ -10,8 +10,8 @@ import ( ) var ( - logger zerolog.Logger - wineLogger zerolog.Logger + logger zerolog.Logger + Writer io.Writer ) func SetupLogging() { @@ -22,30 +22,14 @@ func SetupLogging() { return } - var mw io.Writer l := createLogWriter(path, 10, 3) if l != nil { - mw = io.MultiWriter(zerolog.ConsoleWriter{Out: os.Stdout}, l) + Writer = io.MultiWriter(zerolog.ConsoleWriter{Out: os.Stdout}, l) } else { - mw = io.MultiWriter(zerolog.ConsoleWriter{Out: os.Stdout}) + Writer = os.Stdout } - logger = zerolog.New(mw).With().Timestamp().Logger() + logger = zerolog.New(Writer).With().Timestamp().Logger() SetLevelInfo() - - // Wine logs - wineLogPath, err := getWineLogfilePath() - if err != nil { - Errorf("Failed to get wine log path: %v", err) - return - } - l = createLogWriter(wineLogPath, 25, 1) - if l != nil { - mw = io.MultiWriter(zerolog.ConsoleWriter{Out: os.Stdout}, l) - } else { - mw = io.MultiWriter(zerolog.ConsoleWriter{Out: os.Stdout}) - } - wineLogger = zerolog.New(mw).With().Timestamp().Logger() - wineLogger.Level(zerolog.InfoLevel) } func createLogWriter(path string, maxSize int, maxBackups int) io.Writer { @@ -134,9 +118,9 @@ func Panicf(format string, args ...interface{}) { } func WineLoggerStdout(msg string) { - wineLogger.Info().Msgf("STDOUT: %s", msg) + logger.Info().Msgf("WINE STDOUT: %s", msg) } func WineLoggerStderr(msg string) { - wineLogger.Info().Msgf("STDERR: %s", msg) + logger.Info().Msgf("WINE STDERR: %s", msg) } diff --git a/pkg/patching/patching.go b/pkg/patching/patching.go index 0814a84..763a4a5 100644 --- a/pkg/patching/patching.go +++ b/pkg/patching/patching.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "git.burkey.co/eburk/epochcli/pkg/epoch" + "github.com/go-git/go-git/v6" "io" "os" "os/exec" @@ -84,29 +85,15 @@ func PatchEpoch(myWindow fyne.Window, updateAllStatuses func()) { log.Debugf("Successfully copied %s to %s", resourceName, destPath) } - log.Debugf("Preparing rosettax87 directory at: %s", targetRosettaX87Dir) - if err := os.RemoveAll(targetRosettaX87Dir); err != nil { - log.Debugf("Warning: could not remove existing rosettax87 folder '%s': %v", targetRosettaX87Dir, err) - } - if err := os.MkdirAll(targetRosettaX87Dir, 0755); err != nil { - errMsg := fmt.Sprintf("failed to create directory %s: %v", targetRosettaX87Dir, err) - dialog.ShowError(errors.New(errMsg), myWindow) - log.Debug(errMsg) - paths.PatchesAppliedEpoch = false - updateAllStatuses() - return - } - - rosettaFilesToCopy := map[string]string{ - "rosettax87/rosettax87": filepath.Join(targetRosettaX87Dir, "rosettax87"), - "rosettax87/libRuntimeRosettax87": filepath.Join(targetRosettaX87Dir, "libRuntimeRosettax87"), - } - - for resourceName, destPath := range rosettaFilesToCopy { - log.Debugf("Processing rosetta resource: %s to %s", resourceName, destPath) - resource, err := fyne.LoadResourceFromPath(resourceName) - if err != nil { - errMsg := fmt.Sprintf("failed to open bundled resource %s: %v", resourceName, err) + if _, err := os.Stat(filepath.Join(paths.EpochPath, "rosettax87")); err == nil { + log.Debugf("rosettax87 path already exists, skipping copy") + } else { + log.Debugf("Preparing rosettax87 directory at: %s", targetRosettaX87Dir) + if err := os.RemoveAll(targetRosettaX87Dir); err != nil { + log.Debugf("Warning: could not remove existing rosettax87 folder '%s': %v", targetRosettaX87Dir, err) + } + if err := os.MkdirAll(targetRosettaX87Dir, 0755); err != nil { + errMsg := fmt.Sprintf("failed to create directory %s: %v", targetRosettaX87Dir, err) dialog.ShowError(errors.New(errMsg), myWindow) log.Debug(errMsg) paths.PatchesAppliedEpoch = false @@ -114,40 +101,58 @@ func PatchEpoch(myWindow fyne.Window, updateAllStatuses func()) { return } - destinationFile, err := os.Create(destPath) - if err != nil { - errMsg := fmt.Sprintf("failed to create destination file %s: %v", destPath, err) - dialog.ShowError(errors.New(errMsg), myWindow) - log.Debug(errMsg) - paths.PatchesAppliedEpoch = false - updateAllStatuses() - return + rosettaFilesToCopy := map[string]string{ + "rosettax87/rosettax87": filepath.Join(targetRosettaX87Dir, "rosettax87"), + "rosettax87/libRuntimeRosettax87": filepath.Join(targetRosettaX87Dir, "libRuntimeRosettax87"), } - _, err = io.Copy(destinationFile, bytes.NewReader(resource.Content())) - if err != nil { - destinationFile.Close() - errMsg := fmt.Sprintf("failed to copy bundled resource %s to %s: %v", resourceName, destPath, err) - dialog.ShowError(errors.New(errMsg), myWindow) - log.Debug(errMsg) - paths.PatchesAppliedEpoch = false - updateAllStatuses() - return - } - destinationFile.Close() - - if filepath.Base(destPath) == "rosettax87" { - log.Debugf("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) + for resourceName, destPath := range rosettaFilesToCopy { + log.Debugf("Processing rosetta resource: %s to %s", resourceName, destPath) + resource, err := fyne.LoadResourceFromPath(resourceName) + if err != nil { + errMsg := fmt.Sprintf("failed to open bundled resource %s: %v", resourceName, err) dialog.ShowError(errors.New(errMsg), myWindow) log.Debug(errMsg) paths.PatchesAppliedEpoch = false updateAllStatuses() return } + + destinationFile, err := os.Create(destPath) + if err != nil { + errMsg := fmt.Sprintf("failed to create destination file %s: %v", destPath, err) + dialog.ShowError(errors.New(errMsg), myWindow) + log.Debug(errMsg) + paths.PatchesAppliedEpoch = false + updateAllStatuses() + return + } + + _, err = io.Copy(destinationFile, bytes.NewReader(resource.Content())) + if err != nil { + destinationFile.Close() + errMsg := fmt.Sprintf("failed to copy bundled resource %s to %s: %v", resourceName, destPath, err) + dialog.ShowError(errors.New(errMsg), myWindow) + log.Debug(errMsg) + paths.PatchesAppliedEpoch = false + updateAllStatuses() + return + } + destinationFile.Close() + + if filepath.Base(destPath) == "rosettax87" { + log.Debugf("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(errors.New(errMsg), myWindow) + log.Debug(errMsg) + paths.PatchesAppliedEpoch = false + updateAllStatuses() + return + } + } + log.Debugf("Successfully copied %s to %s", resourceName, destPath) } - log.Debugf("Successfully copied %s to %s", resourceName, destPath) } log.Debugf("Checking dlls.txt file at: %s", dllsTextFile) @@ -266,7 +271,7 @@ func PatchCrossOver(myWindow fyne.Window, updateAllStatuses func()) { if strings.Contains(err.Error(), "operation not permitted") { errMsg += "\n\nSolution: Open System Settings, go to Privacy & Security > App Management, and enable EpochSilicon." } - dialog.ShowError(fmt.Errorf(errMsg), myWindow) + dialog.ShowError(fmt.Errorf("%s", errMsg), myWindow) paths.PatchesAppliedCrossOver = false updateAllStatuses() return @@ -462,3 +467,46 @@ func isConfigSettingCorrect(configText, setting, expectedValue string) bool { currentValue := matches[1] return currentValue == expectedValue } + +func BuildRosetta() (string, string, error) { + tmpDir, err := os.MkdirTemp("", "rosettax87") + if err != nil { + return "", "", fmt.Errorf("failed to create temporary directory: %v", err) + } + + clonedDir := filepath.Join(tmpDir, "rosettax87") + + _, err = git.PlainClone(clonedDir, &git.CloneOptions{ + URL: "https://github.com/fputs/rosettax87", + Progress: log.Writer, + RecurseSubmodules: git.DefaultSubmoduleRecursionDepth, + SingleBranch: true, + }) + if err != nil { + return "", "", fmt.Errorf("failed to clone repository: %v", err) + } + + cmd := exec.Command("cmake", "-B", "build") + cmd.Dir = clonedDir + cmd.Stdout = log.Writer + cmd.Stderr = log.Writer + err = cmd.Run() + if err != nil { + return "", "", fmt.Errorf("failed to create build files: %v", err) + } + + cmd = exec.Command("cmake", "--build", "build") + cmd.Dir = clonedDir + cmd.Stdout = log.Writer + cmd.Stderr = log.Writer + err = cmd.Run() + if err != nil { + return "", "", fmt.Errorf("failed to build rosettax87: %v", err) + } + + buildDir := filepath.Join(clonedDir, "build") + rosettax87Path := filepath.Join(buildDir, "rosettax87") + librosettaPath := filepath.Join(buildDir, "libRuntimeRosettax87") + + return rosettax87Path, librosettaPath, nil +} diff --git a/pkg/patching/patching_test.go b/pkg/patching/patching_test.go new file mode 100644 index 0000000..ddd0869 --- /dev/null +++ b/pkg/patching/patching_test.go @@ -0,0 +1,15 @@ +package patching + +import ( + "fmt" + "testing" +) + +func TestBuildRosetta(t *testing.T) { + rp, lp, err := BuildRosetta() + if err != nil { + t.Error(err) + } + fmt.Println("exe path:", rp) + fmt.Println("lib path:", lp) +} diff --git a/pkg/ui/components.go b/pkg/ui/components.go index dbb18b7..4e065ae 100644 --- a/pkg/ui/components.go +++ b/pkg/ui/components.go @@ -137,7 +137,7 @@ func createBottomBar(myWindow fyne.Window) fyne.CanvasObject { }) // Git button - gitButton := widget.NewButton("Source Code", func() { + gitButton := widget.NewButton("Website", func() { githubURL := "https://git.burkey.co/eburk/epochsilicon" parsedURL, err := url.Parse(githubURL) if err != nil { diff --git a/pkg/ui/popup.go b/pkg/ui/popup.go index fafdac1..597742f 100644 --- a/pkg/ui/popup.go +++ b/pkg/ui/popup.go @@ -1,15 +1,18 @@ package ui import ( + "epochsilicon/pkg/log" + "epochsilicon/pkg/patching" + "errors" "fmt" - "os" - "path/filepath" - "strings" - "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/widget" + "os" + "os/exec" + "path/filepath" + "strings" "howett.net/plist" @@ -198,12 +201,83 @@ func showTroubleshootingPopup() { }, currentWindow).Show() }) + // --- Build Rosettax87 Locally --- + buildRosettaButton = widget.NewButton("Build", func() { + msg := "Building rosettax87 on your computer may speed up launch times. This requires xcode-commandline-tools and Cmake to be installed. See the instructions at https://git.burkey.co/eburk/epochsilicon/README.md" + dialog.NewConfirm("Build rosettax87", msg, func(confirm bool) { + if confirm { + // Check for dependencies + if _, err := exec.LookPath("clang"); err != nil { + m := fmt.Errorf("xcode command line tools are not installed on your computer. Click the Website button in the app and read the instructions on building rosettax87 before trying again") + log.Error(m.Error()) + dialog.ShowError(m, currentWindow) + return + } + if _, err := exec.LookPath("cmake"); err != nil { + m := fmt.Errorf("Cmake is not installed on your computer. Click the Website button in the app and read the instructions on building rosettax87 before trying again") + log.Error(m.Error()) + dialog.ShowError(m, currentWindow) + return + } + + xPath, lPath, err := patching.BuildRosetta() + if err != nil { + m := fmt.Errorf("Error building rosettax87: %v\nClick on File Issue to upload your logs and file a support issue", err) + log.Error(m.Error()) + dialog.ShowError(m, currentWindow) + return + } + + d := filepath.Join(paths.EpochPath, "rosettax87") + if err = os.RemoveAll(d); err != nil { + m := fmt.Errorf("Error removing existing rosettax87 directory: %v", err) + log.Error(m.Error()) + dialog.ShowError(m, currentWindow) + return + } + + if err = os.MkdirAll(d, 0755); err != nil { + m := fmt.Errorf("Error creating existing rosettax87 directory: %v", err) + log.Error(m.Error()) + dialog.ShowError(m, currentWindow) + return + } + + pathMap := map[string]string{ + xPath: filepath.Join(paths.EpochPath, "rosettax87", "rosettax87"), + lPath: filepath.Join(paths.EpochPath, "rosettax87", "libRuntimeRosettax87"), + } + + for srcPath, destPath := range pathMap { + fBytes, err := os.ReadFile(srcPath) + if err != nil { + errMsg := fmt.Sprintf("failed to read source file %s: %v", srcPath, err) + dialog.ShowError(errors.New(errMsg), currentWindow) + log.Debug(errMsg) + return + } + + err = os.WriteFile(destPath, fBytes, 0755) + if err != nil { + errMsg := fmt.Sprintf("failed to write file %s: %v", destPath, err) + dialog.ShowError(errors.New(errMsg), currentWindow) + log.Debug(errMsg) + return + } + log.Debugf("Successfully copied %s to %s", srcPath, destPath) + } + dialog.ShowInformation("Build Successful", "Rosettax87 installed successfully.", currentWindow) + } + }, currentWindow).Show() + }) + troubleshootingTitle := widget.NewLabel("Troubleshooting") troubleshootingTitle.TextStyle = fyne.TextStyle{Bold: true} rowCrossover := container.NewBorder(nil, nil, widget.NewLabel("CrossOver version:"), crossoverStatusShort, nil) rowWDB := container.NewBorder(nil, nil, widget.NewLabel("Delete WDB directory (cache):"), wdbDeleteButton, nil) rowWine := container.NewBorder(nil, nil, widget.NewLabel("Delete Wine prefixes (~/.wine & Epoch/.wine):"), wineDeleteButton, nil) + rowBuildRosetta := container.NewBorder(nil, nil, widget.NewLabel("Build Rosettax87 locally):"), buildRosettaButton, nil) appMgmtNote := widget.NewLabel("Please ensure EpochSilicon is enabled in System Settings > Privacy & Security > App Management.") appMgmtNote.Wrapping = fyne.TextWrapWord appMgmtNote.TextStyle = fyne.TextStyle{Italic: true} @@ -215,6 +289,7 @@ func showTroubleshootingPopup() { crossoverStatusDetail, rowWDB, rowWine, + rowBuildRosetta, appMgmtNote, ) diff --git a/pkg/ui/variables.go b/pkg/ui/variables.go index ed21ff4..5a9f330 100644 --- a/pkg/ui/variables.go +++ b/pkg/ui/variables.go @@ -61,6 +61,7 @@ var ( crossoverVersionStatusLabel *widget.RichText wdbDeleteButton *widget.Button wineDeleteButton *widget.Button + buildRosettaButton *widget.Button appMgmtPermissionButton *widget.Button troubleshootingCloseButton *widget.Button ) -- 2.39.5 From af8873d0efa46f6adbab2edcaf278e0e43f24d23 Mon Sep 17 00:00:00 2001 From: Evan Burkey Date: Fri, 25 Jul 2025 14:49:59 -0700 Subject: [PATCH 2/3] build --- FyneApp.toml | 2 +- pkg/patching/patching.go | 6 +----- pkg/ui/popup.go | 3 ++- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/FyneApp.toml b/FyneApp.toml index bdcda13..d16dc40 100644 --- a/FyneApp.toml +++ b/FyneApp.toml @@ -3,4 +3,4 @@ Name = "EpochSilicon" ID = "com.burkey.epochsilicon" Version = "1.0.3" - Build = 25 + Build = 27 diff --git a/pkg/patching/patching.go b/pkg/patching/patching.go index 763a4a5..0465285 100644 --- a/pkg/patching/patching.go +++ b/pkg/patching/patching.go @@ -478,7 +478,7 @@ func BuildRosetta() (string, string, error) { _, err = git.PlainClone(clonedDir, &git.CloneOptions{ URL: "https://github.com/fputs/rosettax87", - Progress: log.Writer, + Progress: os.Stdout, RecurseSubmodules: git.DefaultSubmoduleRecursionDepth, SingleBranch: true, }) @@ -488,8 +488,6 @@ func BuildRosetta() (string, string, error) { cmd := exec.Command("cmake", "-B", "build") cmd.Dir = clonedDir - cmd.Stdout = log.Writer - cmd.Stderr = log.Writer err = cmd.Run() if err != nil { return "", "", fmt.Errorf("failed to create build files: %v", err) @@ -497,8 +495,6 @@ func BuildRosetta() (string, string, error) { cmd = exec.Command("cmake", "--build", "build") cmd.Dir = clonedDir - cmd.Stdout = log.Writer - cmd.Stderr = log.Writer err = cmd.Run() if err != nil { return "", "", fmt.Errorf("failed to build rosettax87: %v", err) diff --git a/pkg/ui/popup.go b/pkg/ui/popup.go index 597742f..b43e943 100644 --- a/pkg/ui/popup.go +++ b/pkg/ui/popup.go @@ -203,7 +203,8 @@ func showTroubleshootingPopup() { // --- Build Rosettax87 Locally --- buildRosettaButton = widget.NewButton("Build", func() { - msg := "Building rosettax87 on your computer may speed up launch times. This requires xcode-commandline-tools and Cmake to be installed. See the instructions at https://git.burkey.co/eburk/epochsilicon/README.md" + msg := "Building rosettax87 on your computer may speed up launch times. This requires xcode-commandline-tools and Cmake to be installed. See the instructions at https://git.burkey.co/eburk/epochsilicon/README.md\n\n" + msg += "Click YES to start the build process. This could take up to a minute depending on the the speed of your Mac. A popup will let you know when the files have been built and copied to the right place." dialog.NewConfirm("Build rosettax87", msg, func(confirm bool) { if confirm { // Check for dependencies -- 2.39.5 From 7409abf54a6d9a8b121d9ff3189d3ce278fd3017 Mon Sep 17 00:00:00 2001 From: Evan Burkey Date: Fri, 25 Jul 2025 14:58:38 -0700 Subject: [PATCH 3/3] readme --- FyneApp.toml | 2 +- README.md | 13 ++++++++++++- pkg/ui/popup.go | 12 ++++++------ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/FyneApp.toml b/FyneApp.toml index d16dc40..d463660 100644 --- a/FyneApp.toml +++ b/FyneApp.toml @@ -3,4 +3,4 @@ Name = "EpochSilicon" ID = "com.burkey.epochsilicon" Version = "1.0.3" - Build = 27 + Build = 29 diff --git a/README.md b/README.md index 590bfb5..e4995ec 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ A user-friendly launcher for Project Epoch on Apple Silicon Macs, with one-click ## Known Issues -- For some users, it can take up to a minute for Wow to start after hitting the "Play" button. A fix is currently being worked on but will not be ready by launch +- For some users, it can take up to a minute for Wow to start after hitting the "Play" button. A possible fix is described in the Troubleshooting section, please let @Battlehammer know on the Epoch discord if this works for you ## Usage @@ -69,6 +69,17 @@ Make sure you login to Epoch with your username, not your email. Using your emai The initial patch download is quite large and can take a while if your internet is slow. The app will tell you when it's done. +### After I click Play, the game takes a minute to load + +This appears to be a problem with using a built-in version of `rosettax87`. In order to fix this, you must compile it yourself. + +1. Install Xcode command line tools by opening a terminal and typing `xcode-select --install` and following the prompts +2. Install Cmake + a. Setup [Homebrew](https://brew.sh/) if you don't have it already + b. Open a terminal and enter `brew install cmake` +3. Run EpochSilicon and click the `Troubleshooting` button +4. Find the line that says `Build Rosettax87 locally` and click the `Build` button, following the prompts + ### My resolution is super blown up and I can't see the whole screen Wine does that on first launch if you have a large widescreen monitor. diff --git a/pkg/ui/popup.go b/pkg/ui/popup.go index b43e943..f16a9a7 100644 --- a/pkg/ui/popup.go +++ b/pkg/ui/popup.go @@ -223,7 +223,7 @@ func showTroubleshootingPopup() { xPath, lPath, err := patching.BuildRosetta() if err != nil { - m := fmt.Errorf("Error building rosettax87: %v\nClick on File Issue to upload your logs and file a support issue", err) + m := fmt.Errorf("Error building rosettax87: %v\nClick Website for information on getting help", err) log.Error(m.Error()) dialog.ShowError(m, currentWindow) return @@ -278,7 +278,7 @@ func showTroubleshootingPopup() { rowCrossover := container.NewBorder(nil, nil, widget.NewLabel("CrossOver version:"), crossoverStatusShort, nil) rowWDB := container.NewBorder(nil, nil, widget.NewLabel("Delete WDB directory (cache):"), wdbDeleteButton, nil) rowWine := container.NewBorder(nil, nil, widget.NewLabel("Delete Wine prefixes (~/.wine & Epoch/.wine):"), wineDeleteButton, nil) - rowBuildRosetta := container.NewBorder(nil, nil, widget.NewLabel("Build Rosettax87 locally):"), buildRosettaButton, nil) + rowBuildRosetta := container.NewBorder(nil, nil, widget.NewLabel("Build Rosettax87 locally:"), buildRosettaButton, nil) appMgmtNote := widget.NewLabel("Please ensure EpochSilicon is enabled in System Settings > Privacy & Security > App Management.") appMgmtNote.Wrapping = fyne.TextWrapWord appMgmtNote.TextStyle = fyne.TextStyle{Italic: true} @@ -299,11 +299,11 @@ func showTroubleshootingPopup() { troubleshootingCloseButton = widget.NewButton("Close", func() {}) popupContent := container.NewBorder( - nil, // top + nil, // top container.NewCenter(troubleshootingCloseButton), // bottom - nil, // left - nil, // right - container.NewPadded(scrollContainer), // center + nil, // left + nil, // right + container.NewPadded(scrollContainer), // center ) windowSize := currentWindow.Content().Size() -- 2.39.5