From 801967a530df1c00b55f1c0b2ec0d82372a18471 Mon Sep 17 00:00:00 2001 From: Michael Manganiello Date: Tue, 5 Mar 2024 09:49:10 -0300 Subject: [PATCH] misc: Upgrade Go to v1.21 Upgrade to 1.21 as 1.20 is now unmaintained. Most changes are related to the new `slices` package from standard library, which can replace some existing custom functions. --- .github/workflows/build-macos.yml | 4 +- .github/workflows/build-ubuntu.yml | 2 +- .github/workflows/build-windows.yml | 2 +- backend/app.go | 4 +- backend/mediaprovider/helpers/iterators.go | 4 +- backend/util/util.go | 9 ----- go.mod | 2 +- go.sum | 1 + sharedutil/sharedutil.go | 44 +++------------------- sharedutil/sharedutil_test.go | 13 ++----- ui/browsing/albumspage.go | 5 ++- ui/browsing/nowplayingpage.go | 7 ++-- ui/browsing/playlistpage.go | 3 +- ui/theme/theme.go | 10 ++--- ui/theme/themefile.go | 6 +-- ui/util/tracklistutil.go | 22 +++-------- ui/widgets/albumfilterbutton.go | 4 +- ui/widgets/gridviewitem.go | 4 +- ui/widgets/tracklist.go | 5 ++- 19 files changed, 47 insertions(+), 104 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 913aedc..02b61ad 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -24,7 +24,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: '1.20' + go-version: '1.21' - name: Install Dependencies run: brew install --force mpv && brew install dylibbundler @@ -60,4 +60,4 @@ jobs: with: name: Supersonic_mac_x64_HighSierra+.zip path: Supersonic_HighSierra+.zip - + diff --git a/.github/workflows/build-ubuntu.yml b/.github/workflows/build-ubuntu.yml index 0d91661..840d0eb 100644 --- a/.github/workflows/build-ubuntu.yml +++ b/.github/workflows/build-ubuntu.yml @@ -18,7 +18,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: '1.20' + go-version: '1.21' - name: Install dependencies run: sudo apt update && sudo apt install libmpv-dev gcc libegl1-mesa-dev xorg-dev diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 4f3abef..2395777 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -29,7 +29,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: '1.20' + go-version: '1.21' - name: Install Dependencies run: > diff --git a/backend/app.go b/backend/app.go index caa745d..9034890 100644 --- a/backend/app.go +++ b/backend/app.go @@ -8,12 +8,12 @@ import ( "os" "path" "reflect" + "slices" "time" "github.com/dweymouth/supersonic/backend/player" "github.com/dweymouth/supersonic/backend/player/mpv" "github.com/dweymouth/supersonic/backend/util" - "github.com/dweymouth/supersonic/sharedutil" "github.com/fsnotify/fsnotify" "github.com/google/uuid" @@ -233,7 +233,7 @@ func (a *App) setupMPV() error { a.LocalPlayer.SetAudioDevice(desiredDevice) rgainOpts := []string{ReplayGainNone, ReplayGainAlbum, ReplayGainTrack, ReplayGainAuto} - if !sharedutil.SliceContains(rgainOpts, a.Config.ReplayGain.Mode) { + if !slices.Contains(rgainOpts, a.Config.ReplayGain.Mode) { a.Config.ReplayGain.Mode = ReplayGainNone } mode := player.ReplayGainNone diff --git a/backend/mediaprovider/helpers/iterators.go b/backend/mediaprovider/helpers/iterators.go index 77170b6..5898813 100644 --- a/backend/mediaprovider/helpers/iterators.go +++ b/backend/mediaprovider/helpers/iterators.go @@ -64,9 +64,7 @@ func (r *baseIter[T]) Next() *T { } r.serverPos += len(items) if !r.filter.IsNil() { - items = sharedutil.FilterSlice(items, func(al *T) bool { - return r.filter.Matches(al) - }) + items = sharedutil.FilterSlice(items, r.filter.Matches) } r.prefetched = items if len(items) > 0 { diff --git a/backend/util/util.go b/backend/util/util.go index 26ad5f8..9111db8 100644 --- a/backend/util/util.go +++ b/backend/util/util.go @@ -5,15 +5,6 @@ import ( "os" ) -// Return a slice of range [0, n) -func Range(n int) []int { - s := make([]int, n) - for i := 0; i < n; i++ { - s[i] = i - } - return s -} - func CopyFile(srcPath, dstPath string) error { fin, err := os.Open(srcPath) if err != nil { diff --git a/go.mod b/go.mod index abde19e..6e39c67 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/dweymouth/supersonic -go 1.20 +go 1.21 require ( fyne.io/fyne/v2 v2.4.4 diff --git a/go.sum b/go.sum index 45ed838..feb47c5 100644 --- a/go.sum +++ b/go.sum @@ -110,6 +110,7 @@ github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8/go.mod h1:h29xCucjN github.com/go-text/typesetting v0.1.0 h1:vioSaLPYcHwPEPLT7gsjCGDCoYSbljxoHJzMnKwVvHw= github.com/go-text/typesetting v0.1.0/go.mod h1:d22AnmeKq/on0HNv73UFriMKc4Ez6EqZAofLhAzpSzI= github.com/go-text/typesetting-utils v0.0.0-20231211103740-d9332ae51f04 h1:zBx+p/W2aQYtNuyZNcTfinWvXBQwYtDfme051PR/lAY= +github.com/go-text/typesetting-utils v0.0.0-20231211103740-d9332ae51f04/go.mod h1:DDxDdQEnB70R8owOx3LVpEFvpMK9eeH1o2r0yZhFI9o= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= diff --git a/sharedutil/sharedutil.go b/sharedutil/sharedutil.go index b1c60d3..4e6e4e8 100644 --- a/sharedutil/sharedutil.go +++ b/sharedutil/sharedutil.go @@ -2,32 +2,11 @@ package sharedutil import ( "math" - "sort" + "slices" "github.com/dweymouth/supersonic/backend/mediaprovider" ) -func SliceEqual[T comparable](a []T, b []T) bool { - if len(a) != len(b) { - return false - } - for i := 0; i < len(a); i++ { - if a[i] != b[i] { - return false - } - } - return true -} - -func SliceContains[T comparable](ts []T, t T) bool { - for _, x := range ts { - if x == t { - return true - } - } - return false -} - func FilterSlice[T any](ss []T, test func(T) bool) []T { if ss == nil { return nil @@ -52,19 +31,6 @@ func MapSlice[T any, U any](ts []T, f func(T) U) []U { return result } -func Find[T any](ts []T, f func(T) bool) int { - for i, tt := range ts { - if f(tt) { - return i - } - } - return -1 -} - -func IndexOf[T comparable](ts []T, t T) int { - return Find(ts, func(tt T) bool { return t == tt }) -} - func Reversed[T any](ts []T) []T { if ts == nil { return nil @@ -133,7 +99,7 @@ func ReorderTracks(tracks []*mediaprovider.Track, idxToMove []int, op TrackReord topIdx := 0 botIdx := len(idxToMove) for i, t := range tracks { - if SliceContains(idxToMove, i) { + if slices.Contains(idxToMove, i) { newTracks[topIdx] = t topIdx++ } else { @@ -145,7 +111,7 @@ func ReorderTracks(tracks []*mediaprovider.Track, idxToMove []int, op TrackReord topIdx := 0 botIdx := len(tracks) - len(idxToMove) for i, t := range tracks { - if SliceContains(idxToMove, i) { + if slices.Contains(idxToMove, i) { newTracks[botIdx] = t botIdx++ } else { @@ -178,7 +144,7 @@ func ReorderTracks(tracks []*mediaprovider.Track, idxToMove []int, op TrackReord func firstIdxCanMoveUp(idxs []int) int { prevIdx := -1 - sort.Ints(idxs) + slices.Sort(idxs) for _, idx := range idxs { if idx > prevIdx+1 { return idx @@ -190,7 +156,7 @@ func firstIdxCanMoveUp(idxs []int) int { func lastIdxCanMoveDown(idxs []int, lenSlice int) int { prevIdx := lenSlice - sort.Ints(idxs) + slices.Sort(idxs) for i := len(idxs) - 1; i >= 0; i-- { idx := idxs[i] if idx < prevIdx-1 { diff --git a/sharedutil/sharedutil_test.go b/sharedutil/sharedutil_test.go index 4e7332f..05b5312 100644 --- a/sharedutil/sharedutil_test.go +++ b/sharedutil/sharedutil_test.go @@ -1,6 +1,7 @@ package sharedutil import ( + "slices" "testing" "github.com/dweymouth/supersonic/backend/mediaprovider" @@ -79,13 +80,7 @@ func Test_ReorderTracks(t *testing.T) { func tracklistsEqual(t *testing.T, a, b []*mediaprovider.Track) bool { t.Helper() - if len(a) != len(b) { - return false - } - for i, _ := range a { - if a[i].ID != b[i].ID { - return false - } - } - return true + return slices.EqualFunc(a, b, func(a, b *mediaprovider.Track) bool { + return a.ID == b.ID + }) } diff --git a/ui/browsing/albumspage.go b/ui/browsing/albumspage.go index c93074c..cf4d0c4 100644 --- a/ui/browsing/albumspage.go +++ b/ui/browsing/albumspage.go @@ -1,11 +1,12 @@ package browsing import ( + "slices" + "fyne.io/fyne/v2" "fyne.io/fyne/v2/widget" "github.com/dweymouth/supersonic/backend" "github.com/dweymouth/supersonic/backend/mediaprovider" - "github.com/dweymouth/supersonic/sharedutil" "github.com/dweymouth/supersonic/ui/controller" myTheme "github.com/dweymouth/supersonic/ui/theme" "github.com/dweymouth/supersonic/ui/util" @@ -37,7 +38,7 @@ func (a *albumsPageAdapter) Route() controller.Route { return controller.AlbumsR func (a *albumsPageAdapter) SortOrders() ([]string, string) { orders := a.mp.AlbumSortOrders() sortOrder := a.cfg.SortOrder - if !sharedutil.SliceContains(orders, sortOrder) { + if !slices.Contains(orders, sortOrder) { sortOrder = string(orders[0]) } return orders, sortOrder diff --git a/ui/browsing/nowplayingpage.go b/ui/browsing/nowplayingpage.go index 702f7b3..8f9d0ab 100644 --- a/ui/browsing/nowplayingpage.go +++ b/ui/browsing/nowplayingpage.go @@ -5,6 +5,7 @@ import ( "fmt" "image" "log" + "slices" "strings" "github.com/dweymouth/supersonic/backend" @@ -106,13 +107,13 @@ func NewNowPlayingPage( } a.queueList.OnSetRating = func(trackIDs []string, rating int) { contr.SetTrackRatings(trackIDs, rating) - if sharedutil.SliceContains(trackIDs, a.nowPlayingID) { + if slices.Contains(trackIDs, a.nowPlayingID) { a.card.SetDisplayedRating(rating) } } a.queueList.OnSetFavorite = func(trackIDs []string, fav bool) { contr.SetTrackFavorites(trackIDs, fav) - if sharedutil.SliceContains(trackIDs, a.nowPlayingID) { + if slices.Contains(trackIDs, a.nowPlayingID) { a.card.SetDisplayedFavorite(fav) } } @@ -232,7 +233,7 @@ func (a *NowPlayingPage) Tapped(*fyne.PointEvent) { func (a *NowPlayingPage) doSetNewTrackOrder(trackIDs []string, op sharedutil.TrackReorderOp) { idxs := make([]int, 0, len(trackIDs)) for i, tr := range a.queue { - if sharedutil.SliceContains(trackIDs, tr.ID) { + if slices.Contains(trackIDs, tr.ID) { idxs = append(idxs, i) } } diff --git a/ui/browsing/playlistpage.go b/ui/browsing/playlistpage.go index 63b394e..33d5219 100644 --- a/ui/browsing/playlistpage.go +++ b/ui/browsing/playlistpage.go @@ -3,6 +3,7 @@ package browsing import ( "fmt" "log" + "slices" "github.com/dweymouth/supersonic/backend" "github.com/dweymouth/supersonic/backend/mediaprovider" @@ -183,7 +184,7 @@ func (a *PlaylistPage) doSetNewTrackOrder(op sharedutil.TrackReorderOp) { ids := a.tracklist.SelectedTrackIDs() idxs := make([]int, 0, len(ids)) for i, tr := range a.tracks { - if sharedutil.SliceContains(ids, tr.ID) { + if slices.Contains(ids, tr.ID) { idxs = append(idxs, i) } } diff --git a/ui/theme/theme.go b/ui/theme/theme.go index b0773db..64f0296 100644 --- a/ui/theme/theme.go +++ b/ui/theme/theme.go @@ -4,15 +4,15 @@ import ( "bytes" "errors" "image/color" - "io/ioutil" "log" + "os" "path" "path/filepath" + "slices" "strings" "github.com/dweymouth/supersonic/backend" "github.com/dweymouth/supersonic/res" - "github.com/dweymouth/supersonic/sharedutil" "fyne.io/fyne/v2" "fyne.io/fyne/v2/theme" @@ -200,7 +200,7 @@ func (m *MyTheme) Font(style fyne.TextStyle) fyne.Resource { } case fyne.TextStyle{Bold: true}: if m.BoldFont != "" && boldFont == nil { - if content, err := ioutil.ReadFile(m.BoldFont); err != nil { + if content, err := os.ReadFile(m.BoldFont); err != nil { m.BoldFont = "" } else { normalFont = fyne.NewStaticResource("boldFont", content) @@ -222,7 +222,7 @@ func (m *MyTheme) Size(name fyne.ThemeSizeName) float32 { func (m *MyTheme) getVariant() fyne.ThemeVariant { v := DefaultAppearance // default if config has invalid or missing setting - if sharedutil.SliceContains( + if slices.Contains( []string{string(AppearanceLight), string(AppearanceDark), string(AppearanceAuto)}, m.config.Appearance) { v = AppearanceMode(m.config.Appearance) @@ -242,7 +242,7 @@ func readTTFFile(filepath string) ([]byte, error) { log.Printf("error loading custom font %q: %s", filepath, err.Error()) return nil, err } - content, err := ioutil.ReadFile(filepath) + content, err := os.ReadFile(filepath) if err != nil { log.Printf("error loading custom font %q: %s", filepath, err.Error()) } diff --git a/ui/theme/themefile.go b/ui/theme/themefile.go index 2578b78..a656b62 100644 --- a/ui/theme/themefile.go +++ b/ui/theme/themefile.go @@ -7,11 +7,11 @@ import ( "image/color" "io" "os" + "slices" "strings" "fyne.io/fyne/v2" "fyne.io/fyne/v2/theme" - "github.com/dweymouth/supersonic/sharedutil" "github.com/pelletier/go-toml/v2" ) @@ -109,7 +109,7 @@ func DecodeThemeFile(reader io.Reader) (*ThemeFile, error) { return nil, err } - if theme.SupersonicTheme.Name == "" || !sharedutil.SliceContains(validThemeVersions, theme.SupersonicTheme.Version) { + if theme.SupersonicTheme.Name == "" || !slices.Contains(validThemeVersions, theme.SupersonicTheme.Version) { return nil, errors.New("invalid theme file name or version") } if !(theme.SupersonicTheme.SupportsDark || theme.SupersonicTheme.SupportsLight) { @@ -129,7 +129,7 @@ func (t *ThemeFile) SupportsVariant(v fyne.ThemeVariant) bool { // Parses a CSS-style #RRGGBB or #RRGGBBAA string func ColorStringToColor(colorStr string) (color.Color, error) { - if !strings.HasPrefix(colorStr, "#") || !sharedutil.SliceContains([]int{7, 9}, len(colorStr)) { + if !strings.HasPrefix(colorStr, "#") || !slices.Contains([]int{7, 9}, len(colorStr)) { return color.Black, errors.New("invalid color string") } colorBytes := make([]byte, 4) diff --git a/ui/util/tracklistutil.go b/ui/util/tracklistutil.go index f94049c..08da6d0 100644 --- a/ui/util/tracklistutil.go +++ b/ui/util/tracklistutil.go @@ -1,6 +1,8 @@ package util import ( + "slices" + "github.com/dweymouth/supersonic/backend/mediaprovider" "github.com/dweymouth/supersonic/sharedutil" ) @@ -69,15 +71,15 @@ func SelectTrackRange(tracks []*TrackListModel, idx int) { tracks[idx].Selected = true return } - from := minInt(idx, lastSelected) - to := maxInt(idx, lastSelected) + from := min(idx, lastSelected) + to := max(idx, lastSelected) for i := from; i <= to; i++ { tracks[i].Selected = true } } func FindTrackByID(tracks []*TrackListModel, id string) (*mediaprovider.Track, int) { - idx := sharedutil.Find(tracks, func(tr *TrackListModel) bool { + idx := slices.IndexFunc(tracks, func(tr *TrackListModel) bool { return tr.Track.ID == id }) if idx >= 0 { @@ -85,17 +87,3 @@ func FindTrackByID(tracks []*TrackListModel, id string) (*mediaprovider.Track, i } return nil, -1 } - -func minInt(a, b int) int { - if a < b { - return a - } - return b -} - -func maxInt(a, b int) int { - if a > b { - return a - } - return b -} diff --git a/ui/widgets/albumfilterbutton.go b/ui/widgets/albumfilterbutton.go index 59ace53..9a6b546 100644 --- a/ui/widgets/albumfilterbutton.go +++ b/ui/widgets/albumfilterbutton.go @@ -2,7 +2,7 @@ package widgets import ( "fmt" - "sort" + "slices" "strconv" "strings" "sync" @@ -49,7 +49,7 @@ func NewAlbumFilterButton(filter *mediaprovider.AlbumFilter, fetchGenresFunc fun genreNames := sharedutil.MapSlice(genres, func(g *mediaprovider.Genre) string { return g.Name }) - sort.Strings(genreNames) + slices.Sort(genreNames) a.genreListChan <- genreNames } }() diff --git a/ui/widgets/gridviewitem.go b/ui/widgets/gridviewitem.go index 400e3dc..3ef0555 100644 --- a/ui/widgets/gridviewitem.go +++ b/ui/widgets/gridviewitem.go @@ -3,9 +3,9 @@ package widgets import ( "image" "image/color" + "slices" "github.com/dweymouth/supersonic/res" - "github.com/dweymouth/supersonic/sharedutil" "github.com/dweymouth/supersonic/ui/layouts" "github.com/dweymouth/supersonic/ui/util" @@ -205,7 +205,7 @@ func (g *GridViewItem) createContainer() { } func (g *GridViewItem) NeedsUpdate(model GridViewItemModel) bool { - return g.itemID != model.ID || !sharedutil.SliceEqual(g.secondaryIDs, model.SecondaryIDs) + return g.itemID != model.ID || !slices.Equal(g.secondaryIDs, model.SecondaryIDs) } func (g *GridViewItem) Update(model GridViewItemModel) { diff --git a/ui/widgets/tracklist.go b/ui/widgets/tracklist.go index 27c4076..e3db393 100644 --- a/ui/widgets/tracklist.go +++ b/ui/widgets/tracklist.go @@ -3,6 +3,7 @@ package widgets import ( "fmt" "log" + "slices" "sort" "strconv" "strings" @@ -271,7 +272,7 @@ func (t *Tracklist) Sorting() TracklistSort { func (t *Tracklist) SetSorting(sorting TracklistSort) { if sorting.ColumnName == "" { // nil case - reset current sort - if sharedutil.SliceContains(columns, t.sorting.ColumnName) { + if slices.Contains(columns, t.sorting.ColumnName) { t.hdr.SetSorting(ListHeaderSort{ColNumber: ColNumber(t.sorting.ColumnName), Type: SortNone}) } return @@ -667,7 +668,7 @@ func (t *Tracklist) lenTracks() int { } func ColNumber(colName string) int { - i := sharedutil.IndexOf(columns, colName) + i := slices.Index(columns, colName) if i < 0 { log.Printf("error: Tracklist: invalid column name %s", colName) }