From 46098ef5b694494dd0ae41ecc2a260bc4cd8f1b4 Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Thu, 15 Feb 2024 08:38:53 -0800 Subject: [PATCH 01/19] Basic functionality within ludo --- core/core.go | 1 + scanner/scanner.go | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/core/core.go b/core/core.go index e3aea607..79f04b39 100644 --- a/core/core.go +++ b/core/core.go @@ -111,6 +111,7 @@ func unarchiveGame(filename string) (string, int64, error) { extPrefered := make(map[string]int) extPrefered[".cue"] = 1 extPrefered[".m3u"] = 2 + extPrefered[".pbp"] = 3 err = archiver.Walk(filename, func(f archiver.File) error { fname := f.Name() diff --git a/scanner/scanner.go b/scanner/scanner.go index 4c70bbf3..bbebc391 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -135,6 +135,10 @@ func Scan(dir string, roms []string, games chan (dat.Game), n *ntf.Notification) // Look for a matching game entry in the database state.DB.FindByROMName(f, filepath.Base(f), 0, games) n.Update(ntf.Info, strconv.Itoa(i)+"/"+strconv.Itoa(len(roms))+" "+f) + case ".pbp": + // Look for a matching game entry in the database + state.DB.FindByROMName(f, filepath.Base(f), 0, games) + n.Update(ntf.Info, strconv.Itoa(i)+"/"+strconv.Itoa(len(roms))+" "+f) case ".32x", "a52", ".a78", ".col", ".crt", ".d64", ".pce", ".fds", ".gb", ".gba", ".gbc", ".gen", ".gg", ".ipf", ".j64", ".jag", ".lnx", ".md", ".n64", ".nes", ".ngc", ".nds", ".rom", ".sfc", ".sg", ".smc", ".smd", ".sms", ".ws", ".wsc": bytes, err := ioutil.ReadFile(f) if err != nil { From 5ce1b2dc26fa640d208ad3db19288f243c39e04c Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Thu, 15 Feb 2024 11:13:33 -0800 Subject: [PATCH 02/19] cleaned up the pbp file check --- scanner/scanner.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/scanner/scanner.go b/scanner/scanner.go index bbebc391..a3b57c1a 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -131,14 +131,10 @@ func Scan(dir string, roms []string, games chan (dat.Game), n *ntf.Notification) } } z.Close() - case ".cue": + case ".cue", ".pbp": // Look for a matching game entry in the database state.DB.FindByROMName(f, filepath.Base(f), 0, games) - n.Update(ntf.Info, strconv.Itoa(i)+"/"+strconv.Itoa(len(roms))+" "+f) - case ".pbp": - // Look for a matching game entry in the database - state.DB.FindByROMName(f, filepath.Base(f), 0, games) - n.Update(ntf.Info, strconv.Itoa(i)+"/"+strconv.Itoa(len(roms))+" "+f) + n.Update(ntf.Info, strconv.Itoa(i)+"/"+strconv.Itoa(len(roms))+" "+f) case ".32x", "a52", ".a78", ".col", ".crt", ".d64", ".pce", ".fds", ".gb", ".gba", ".gbc", ".gen", ".gg", ".ipf", ".j64", ".jag", ".lnx", ".md", ".n64", ".nes", ".ngc", ".nds", ".rom", ".sfc", ".sg", ".smc", ".smd", ".sms", ".ws", ".wsc": bytes, err := ioutil.ReadFile(f) if err != nil { From aa7043c6c751be43b5f569736e94cf6d4a891700 Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Thu, 15 Feb 2024 12:18:43 -0800 Subject: [PATCH 03/19] cleaned up trailing whitespace --- scanner/scanner.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scanner/scanner.go b/scanner/scanner.go index a3b57c1a..f3e0b440 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -134,7 +134,7 @@ func Scan(dir string, roms []string, games chan (dat.Game), n *ntf.Notification) case ".cue", ".pbp": // Look for a matching game entry in the database state.DB.FindByROMName(f, filepath.Base(f), 0, games) - n.Update(ntf.Info, strconv.Itoa(i)+"/"+strconv.Itoa(len(roms))+" "+f) + n.Update(ntf.Info, strconv.Itoa(i)+"/"+strconv.Itoa(len(roms))+" "+f) case ".32x", "a52", ".a78", ".col", ".crt", ".d64", ".pce", ".fds", ".gb", ".gba", ".gbc", ".gen", ".gg", ".ipf", ".j64", ".jag", ".lnx", ".md", ".n64", ".nes", ".ngc", ".nds", ".rom", ".sfc", ".sg", ".smc", ".smd", ".sms", ".ws", ".wsc": bytes, err := ioutil.ReadFile(f) if err != nil { From 5c56421faa3a5288c6d2ee843e550f248a4febef Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Thu, 15 Feb 2024 15:13:09 -0800 Subject: [PATCH 04/19] Added m3u support and improved multi disc playlist support. --- dat/dat.go | 11 +++++++---- menu/scene_playlist.go | 5 +++++ scanner/scanner.go | 3 +-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/dat/dat.go b/dat/dat.go index 210641ea..5d0b5cc0 100644 --- a/dat/dat.go +++ b/dat/dat.go @@ -101,10 +101,13 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch continue } // If the checksums match - if romName == game.ROMs[0].Name { - game.Path = romPath - game.System = system - games <- game + for _, ROM := range game.ROMs { + if romName == ROM.Name { + game.Path = romPath + game.System = system + games <- game + } + // element is the element from someSlice for where we are } } wg.Done() diff --git a/menu/scene_playlist.go b/menu/scene_playlist.go index 705cf18a..c140f192 100644 --- a/menu/scene_playlist.go +++ b/menu/scene_playlist.go @@ -26,6 +26,11 @@ func buildPlaylist(path string) Scene { for _, game := range playlists.Playlists[path] { game := game // needed for callbackOK strippedName, tags := extractTags(game.Name) + if strings.Contains(game.Name, "Disc") { + re := regexp.MustCompile(`\((Disc [1-9]?)\)`) + match := re.FindStringSubmatch(game.Name) + strippedName = strippedName + " (" + match[1] + ")" + } list.children = append(list.children, entry{ label: strippedName, gameName: game.Name, diff --git a/scanner/scanner.go b/scanner/scanner.go index f3e0b440..6953749d 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -11,7 +11,6 @@ import ( "path/filepath" "strconv" "strings" - "github.com/libretro/ludo/dat" ntf "github.com/libretro/ludo/notifications" "github.com/libretro/ludo/playlists" @@ -131,7 +130,7 @@ func Scan(dir string, roms []string, games chan (dat.Game), n *ntf.Notification) } } z.Close() - case ".cue", ".pbp": + case ".cue", ".pbp", ".m3u": // Look for a matching game entry in the database state.DB.FindByROMName(f, filepath.Base(f), 0, games) n.Update(ntf.Info, strconv.Itoa(i)+"/"+strconv.Itoa(len(roms))+" "+f) From 42b97cfdbaa76d2ee71450334d200020886248f7 Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Fri, 16 Feb 2024 19:15:25 -0800 Subject: [PATCH 05/19] Starting on fuzzy search --- dat/dat.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/dat/dat.go b/dat/dat.go index 5d0b5cc0..0366b962 100644 --- a/dat/dat.go +++ b/dat/dat.go @@ -4,9 +4,12 @@ package dat import ( "encoding/xml" + "fmt" "log" + "path/filepath" "strconv" "sync" + "container/list" ) // DB is a database that contains many Dats, mapped to their system name @@ -66,6 +69,11 @@ func Parse(dat []byte) Dat { func (db *DB) FindByCRC(romPath string, romName string, crc uint32, games chan (Game)) { var wg sync.WaitGroup wg.Add(len(*db)) + type SafeBool struct { + mu sync.Mutex + found bool + } + game_found := SafeBool{found: false} // For every Dat in the DB for system, dat := range *db { go func(dat Dat, crc uint32, system string) { @@ -79,6 +87,9 @@ func (db *DB) FindByCRC(romPath string, romName string, crc uint32, games chan ( game.Path = romPath game.System = system games <- game + game_found.mu.Lock() + game_found.found = true + game_found.mu.Unlock() } } wg.Done() @@ -86,12 +97,29 @@ func (db *DB) FindByCRC(romPath string, romName string, crc uint32, games chan ( } // Synchronize all the goroutines wg.Wait() + if !game_found.found { + fmt.Println(romName) + db.FindByROMName(romPath, filepath.Base(romPath), crc, games) + } } // FindByROMName loops over the Dats in the DB and concurrently matches ROM names. +// I'm going to update this to do fuzzy matching. To me that means: +// * try to build a list with a mutex, +// * if there is an exact name match use that +// * otherwise at the end look through the potential matches with a few +// adjustments for country codes (hoping for exact match) +// * finally try to find a match without country code +// * before failing func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games chan (Game)) { var wg sync.WaitGroup wg.Add(len(*db)) + type SafeList struct { + mu sync.Mutex + results []string + bool found + } + game_found := SafeList{results: []} // For every Dat in the DB for system, dat := range *db { go func(dat Dat, crc uint32, system string) { From 26ed69599d479b41df9d948af54ef29983d76072 Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Sat, 17 Feb 2024 14:28:09 -0800 Subject: [PATCH 06/19] I've broken something, but I'm not sure what. --- dat/dat.go | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/dat/dat.go b/dat/dat.go index 0366b962..81773e4d 100644 --- a/dat/dat.go +++ b/dat/dat.go @@ -9,7 +9,6 @@ import ( "path/filepath" "strconv" "sync" - "container/list" ) // DB is a database that contains many Dats, mapped to their system name @@ -105,21 +104,21 @@ func (db *DB) FindByCRC(romPath string, romName string, crc uint32, games chan ( // FindByROMName loops over the Dats in the DB and concurrently matches ROM names. // I'm going to update this to do fuzzy matching. To me that means: -// * try to build a list with a mutex, -// * if there is an exact name match use that -// * otherwise at the end look through the potential matches with a few -// adjustments for country codes (hoping for exact match) -// * finally try to find a match without country code -// * before failing +// - try to build a list with a mutex, +// - if there is an exact name match use that +// - otherwise at the end look through the potential matches with a few +// adjustments for country codes (hoping for exact match) +// - finally try to find a match without country code +// - before failing +type SafeLookup struct { + mu sync.Mutex + options []string + found bool +} +game_found := SafeLookup{options: [], found: false} func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games chan (Game)) { var wg sync.WaitGroup wg.Add(len(*db)) - type SafeList struct { - mu sync.Mutex - results []string - bool found - } - game_found := SafeList{results: []} // For every Dat in the DB for system, dat := range *db { go func(dat Dat, crc uint32, system string) { @@ -134,8 +133,10 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch game.Path = romPath game.System = system games <- game + game_found.mu.Lock() + game_found.found = true + game_found.mu.Unlock() } - // element is the element from someSlice for where we are } } wg.Done() From 877fc200fdcf1a3a80dcf10fccbea6d4ec8f5aa1 Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Sat, 17 Feb 2024 16:52:45 -0800 Subject: [PATCH 07/19] update to g1.18 to slices support. --- dat/dat.go | 40 +++++++++++++++---- go.mod | 29 ++++++++------ go.sum | 113 ----------------------------------------------------- 3 files changed, 50 insertions(+), 132 deletions(-) diff --git a/dat/dat.go b/dat/dat.go index 81773e4d..a65eaf26 100644 --- a/dat/dat.go +++ b/dat/dat.go @@ -5,6 +5,10 @@ package dat import ( "encoding/xml" "fmt" + "strings" + "slices" + "sort" + //"github.com/kr/pretty" "log" "path/filepath" "strconv" @@ -83,6 +87,7 @@ func (db *DB) FindByCRC(romPath string, romName string, crc uint32, games chan ( } // If the checksums match if crc == uint32(game.ROMs[0].CRC) { + fmt.Printf("CRC match: %s -> %s\n", romName, game.Name) game.Path = romPath game.System = system games <- game @@ -97,7 +102,6 @@ func (db *DB) FindByCRC(romPath string, romName string, crc uint32, games chan ( // Synchronize all the goroutines wg.Wait() if !game_found.found { - fmt.Println(romName) db.FindByROMName(romPath, filepath.Base(romPath), crc, games) } } @@ -110,13 +114,13 @@ func (db *DB) FindByCRC(romPath string, romName string, crc uint32, games chan ( // adjustments for country codes (hoping for exact match) // - finally try to find a match without country code // - before failing -type SafeLookup struct { - mu sync.Mutex - options []string - found bool -} -game_found := SafeLookup{options: [], found: false} func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games chan (Game)) { + type SafeLookup struct { + mu sync.Mutex + options []string + found bool + } + game_found := SafeLookup{found: false} var wg sync.WaitGroup wg.Add(len(*db)) // For every Dat in the DB @@ -130,12 +134,23 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch // If the checksums match for _, ROM := range game.ROMs { if romName == ROM.Name { + fmt.Printf("Exact match: %s -> %s\n", romName, game.Name) game.Path = romPath game.System = system games <- game game_found.mu.Lock() game_found.found = true game_found.mu.Unlock() + } else { + var gameName = strings.Split(romName, ".")[0] + if strings.Contains(ROM.Name, gameName){ + if slices.Contains(game_found.options, game.Name) == false { + game_found.mu.Lock() + //fmt.Println(romName, game.Name) + game_found.options = append(game_found.options, game.Name) + game_found.mu.Unlock() + } + } } } } @@ -144,4 +159,15 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch } // Synchronize all the goroutines wg.Wait() + if game_found.found == false { + slices.Sort(game_found.options) + game_found.options = slices.Compact(game_found.options) + sort.SliceStable(game_found.options, func(i, j int) bool { + return len(game_found.options[i]) < len(game_found.options[j]) + }) + for _, option := range game_found.options { + fmt.Printf("Fuzzy match: %s -> %s\n", romName, option) + break + } + } } diff --git a/go.mod b/go.mod index 9ee84837..df0fca15 100644 --- a/go.mod +++ b/go.mod @@ -2,33 +2,38 @@ module github.com/libretro/ludo require ( github.com/adrg/xdg v0.4.0 - github.com/andybalholm/brotli v1.1.0 // indirect github.com/cavaliercoder/grab v2.0.0+incompatible - github.com/davecgh/go-spew v1.1.1 // indirect github.com/disintegration/imaging v1.6.2 github.com/fatih/structs v1.1.0 github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240118000515-a250818d05e3 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 + github.com/kr/pretty v0.2.1 + github.com/lucasb-eyer/go-colorful v1.2.0 + github.com/mholt/archiver/v3 v3.5.1 + github.com/pelletier/go-toml v1.9.5 + github.com/tanema/gween v0.0.0-20221212145351-621cc8a459d1 + github.com/youpy/go-wav v0.3.2 + golang.org/x/image v0.15.0 + golang.org/x/mobile v0.0.0-20240112133503-c713f31d574b +) + +require ( + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/klauspost/compress v1.17.6 // indirect github.com/klauspost/pgzip v1.2.6 // indirect github.com/kr/text v0.2.0 // indirect - github.com/lucasb-eyer/go-colorful v1.2.0 - github.com/mholt/archiver/v3 v3.5.1 github.com/nwaples/rardecode v1.1.3 // indirect - github.com/pelletier/go-toml v1.9.5 github.com/pierrec/lz4/v4 v4.1.21 // indirect - github.com/tanema/gween v0.0.0-20221212145351-621cc8a459d1 github.com/ulikunitz/xz v0.5.11 // indirect - github.com/youpy/go-wav v0.3.2 + github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect + github.com/youpy/go-riff v0.1.0 // indirect github.com/zaf/g711 v1.4.0 // indirect - golang.org/x/image v0.15.0 - golang.org/x/mobile v0.0.0-20240112133503-c713f31d574b golang.org/x/sys v0.17.0 // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.0 // indirect ) -go 1.13 +go 1.18 diff --git a/go.sum b/go.sum index a41e92af..3393b324 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,6 @@ -dmitri.shuralyov.com/gpu/mtl v0.0.0-20221208032759-85de2813cf6b/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/cavaliercoder/grab v2.0.0+incompatible h1:wZHbBQx56+Yxjx2TCGDcenhh3cJn7cCLMfkEPmySTSE= @@ -20,13 +16,8 @@ github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj6 github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk= -github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= 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-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b h1:GgabKamyOYguHqHjSkDACcgoPIz3w0Dis/zJ1wyHHHU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240118000515-a250818d05e3 h1:nanQfMsOs3gnuKRm0E5jXWomedE/9YIFXdmHJNZYeqc= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240118000515-a250818d05e3/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= @@ -37,15 +28,11 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/jezek/xgb v1.0.0/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI= github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= @@ -60,17 +47,11 @@ github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i github.com/mholt/archiver/v3 v3.5.1 h1:rDjOBX9JSF5BvoJGvjqK479aL70qh9DIpZCl+k7Clwo= github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= -github.com/nwaples/rardecode v1.1.2 h1:Cj0yZY6T1Zx1R7AhTbyGSALm44/Mmq+BAPc4B/p/d3M= -github.com/nwaples/rardecode v1.1.2/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= -github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.12 h1:44l88ehTZAUGW4VlO1QC4zkilL99M6Y9MXNwEs0uzP8= -github.com/pierrec/lz4/v4 v4.1.12/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -82,126 +63,32 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/tanema/gween v0.0.0-20200427131925-c89ae23cc63c h1:rZz/p7IbahA51/dieoBBfzTgkTX9C8QFrTgkMh64Khg= -github.com/tanema/gween v0.0.0-20200427131925-c89ae23cc63c/go.mod h1:XXpz+9IVhUY5vTC5gXRNSjLDVwQWa5KM43NrH1GJa4M= github.com/tanema/gween v0.0.0-20221212145351-621cc8a459d1 h1:s2Tn3G6rP4VljC5XDN6hARqXogkhr3k/jAsTqawSN5U= github.com/tanema/gween v0.0.0-20221212145351-621cc8a459d1/go.mod h1:XXpz+9IVhUY5vTC5gXRNSjLDVwQWa5KM43NrH1GJa4M= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= -github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= -github.com/youpy/go-riff v0.0.0-20131220112943-557d78c11efb h1:RDh7U5Di6o7fblIBe7rVi9KnrcOXUbLwvvLLdP2InSI= -github.com/youpy/go-riff v0.0.0-20131220112943-557d78c11efb/go.mod h1:83nxdDV4Z9RzrTut9losK7ve4hUnxUR8ASSz4BsKXwQ= github.com/youpy/go-riff v0.1.0 h1:vZO/37nI4tIET8tQI0Qn0Y79qQh99aEpponTPiPut7k= github.com/youpy/go-riff v0.1.0/go.mod h1:83nxdDV4Z9RzrTut9losK7ve4hUnxUR8ASSz4BsKXwQ= -github.com/youpy/go-wav v0.3.0 h1:ma20lCWmR/Y2P8tMpsRkbuawQ6d8+ckWaoOncEvMe0A= -github.com/youpy/go-wav v0.3.0/go.mod h1:RqzyxsQMqUl31ygGi4W8YIQl5gbTXB4Al6slg/Zn2Ro= github.com/youpy/go-wav v0.3.2 h1:NLM8L/7yZ0Bntadw/0h95OyUsen+DQIVf9gay+SUsMU= github.com/youpy/go-wav v0.3.2/go.mod h1:0FCieAXAeSdcxFfwLpRuEo0PFmAoc+8NU34h7TUvk50= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zaf/g711 v0.0.0-20190814101024-76a4a538f52b h1:QqixIpc5WFIqTLxB3Hq8qs0qImAgBdq0p6rq2Qdl634= github.com/zaf/g711 v0.0.0-20190814101024-76a4a538f52b/go.mod h1:T2h1zV50R/q0CVYnsQOQ6L7P4a2ZxH47ixWcMXFGyx8= github.com/zaf/g711 v1.4.0 h1:XZYkjjiAg9QTBnHqEg37m2I9q3IIDv5JRYXs2N8ma7c= github.com/zaf/g711 v1.4.0/go.mod h1:eCDXt3dSp/kYYAoooba7ukD/Q75jvAaS4WOMr0l1Roo= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= -golang.org/x/exp/shiny v0.0.0-20230817173708-d852ddb80c63/go.mod h1:UH99kUObWAZkDnWqppdQe5ZhPYESUw8I0zVV1uWBR+0= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI= -golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= -golang.org/x/mobile v0.0.0-20211207041440-4e6c2922fdee h1:/tShaw8UTf0XzI8DOZwQHzC7d6Vi3EtrBnftiZ4vAvU= -golang.org/x/mobile v0.0.0-20211207041440-4e6c2922fdee/go.mod h1:pe2sM7Uk+2Su1y7u/6Z8KJ24D7lepUjFZbhFOrmDfuQ= golang.org/x/mobile v0.0.0-20240112133503-c713f31d574b h1:kfWLZgb8iUBHdE9WydD5V5dHIS/F6HjlBZNyJfn2bs4= golang.org/x/mobile v0.0.0-20240112133503-c713f31d574b/go.mod h1:4efzQnuA1nICq6h4kmZRMGzbPiP06lZvgADUu1VpJCE= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= From cb4772c1cde0cb7d8bb18b2867a5a73e91c1b676 Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Sat, 17 Feb 2024 17:22:50 -0800 Subject: [PATCH 08/19] fixed CRC fallthrough to name --- dat/dat.go | 27 +++++++++++++++++---------- scanner/scanner.go | 13 +++++++++---- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/dat/dat.go b/dat/dat.go index a65eaf26..0e0d5b0e 100644 --- a/dat/dat.go +++ b/dat/dat.go @@ -10,7 +10,7 @@ import ( "sort" //"github.com/kr/pretty" "log" - "path/filepath" + //"path/filepath" "strconv" "sync" ) @@ -69,9 +69,10 @@ func Parse(dat []byte) Dat { } // FindByCRC loops over the Dats in the DB and concurrently matches CRC checksums. -func (db *DB) FindByCRC(romPath string, romName string, crc uint32, games chan (Game)) { +func (db *DB) FindByCRC(romPath string, romName string, crc uint32, games chan (Game)) (bool) { var wg sync.WaitGroup wg.Add(len(*db)) + // this structure and subsequent object are remade ever run. type SafeBool struct { mu sync.Mutex found bool @@ -87,11 +88,11 @@ func (db *DB) FindByCRC(romPath string, romName string, crc uint32, games chan ( } // If the checksums match if crc == uint32(game.ROMs[0].CRC) { - fmt.Printf("CRC match: %s -> %s\n", romName, game.Name) game.Path = romPath game.System = system games <- game game_found.mu.Lock() + fmt.Printf("CRC match: %s -> %s\n", romName, game.Name) game_found.found = true game_found.mu.Unlock() } @@ -101,9 +102,13 @@ func (db *DB) FindByCRC(romPath string, romName string, crc uint32, games chan ( } // Synchronize all the goroutines wg.Wait() - if !game_found.found { - db.FindByROMName(romPath, filepath.Base(romPath), crc, games) - } + // then check if the game was found or not. If it wasn't pass it to + // FindByROMName. For some reason this isn't consistently working. + //fmt.Printf("%s: %v\n", romName, game_found.found) + return game_found.found + // if !game_found.found { + // db.FindByROMName(romPath, filepath.Base(romPath), crc, games) + // } } // FindByROMName loops over the Dats in the DB and concurrently matches ROM names. @@ -114,7 +119,7 @@ func (db *DB) FindByCRC(romPath string, romName string, crc uint32, games chan ( // adjustments for country codes (hoping for exact match) // - finally try to find a match without country code // - before failing -func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games chan (Game)) { +func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games chan (Game)) (bool) { type SafeLookup struct { mu sync.Mutex options []string @@ -143,14 +148,14 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch game_found.mu.Unlock() } else { var gameName = strings.Split(romName, ".")[0] - if strings.Contains(ROM.Name, gameName){ - if slices.Contains(game_found.options, game.Name) == false { + if (strings.Contains(ROM.Name, gameName)) && + !(slices.Contains(game_found.options, game.Name)) { game_found.mu.Lock() //fmt.Println(romName, game.Name) game_found.options = append(game_found.options, game.Name) game_found.mu.Unlock() } - } + } } } @@ -169,5 +174,7 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch fmt.Printf("Fuzzy match: %s -> %s\n", romName, option) break } + fmt.Printf("No match: %s\n", romName) } + return game_found.found } diff --git a/scanner/scanner.go b/scanner/scanner.go index 6953749d..7989d6ed 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -141,10 +141,15 @@ func Scan(dir string, roms []string, games chan (dat.Game), n *ntf.Notification) continue } crc := crc32.ChecksumIEEE(bytes) - state.DB.FindByCRC(f, utils.FileName(f), crc, games) - if headerSize, ok := headerSizes[ext]; ok { - crcHeaderless := crc32.ChecksumIEEE(bytes[headerSize:]) - state.DB.FindByCRC(f, utils.FileName(f), crcHeaderless, games) + if !state.DB.FindByCRC(f, utils.FileName(f), crc, games) { + if headerSize, ok := headerSizes[ext]; ok { + crcHeaderless := crc32.ChecksumIEEE(bytes[headerSize:]) + if !state.DB.FindByCRC(f, utils.FileName(f), crcHeaderless, games) { + state.DB.FindByROMName(f, filepath.Base(f), 0, games) + } + } else { + state.DB.FindByROMName(f, filepath.Base(f), 0, games) + } } n.Update(ntf.Info, strconv.Itoa(i)+"/"+strconv.Itoa(len(roms))+" "+f) } From 6f86332d87f8ed2831ff3a4662f0ebb95a4105bf Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Sat, 17 Feb 2024 17:29:47 -0800 Subject: [PATCH 09/19] fixed no match debugging --- dat/dat.go | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/dat/dat.go b/dat/dat.go index 0e0d5b0e..8828026e 100644 --- a/dat/dat.go +++ b/dat/dat.go @@ -165,16 +165,21 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch // Synchronize all the goroutines wg.Wait() if game_found.found == false { - slices.Sort(game_found.options) - game_found.options = slices.Compact(game_found.options) - sort.SliceStable(game_found.options, func(i, j int) bool { - return len(game_found.options[i]) < len(game_found.options[j]) - }) - for _, option := range game_found.options { - fmt.Printf("Fuzzy match: %s -> %s\n", romName, option) - break + if len(game_found.options) > 0 { + game_found.found = true + slices.Sort(game_found.options) + game_found.options = slices.Compact(game_found.options) + sort.SliceStable(game_found.options, func(i, j int) bool { + return len(game_found.options[i]) < len(game_found.options[j]) + }) + for _, option := range game_found.options { + fmt.Printf("Fuzzy match: %s -> %s\n", romName, option) + break + } + } + if !game_found.found { + fmt.Printf("No match: %s\n", romName) } - fmt.Printf("No match: %s\n", romName) } return game_found.found } From c43df735cfe9261384cc069681c77b2bf331a845 Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Sat, 17 Feb 2024 17:57:14 -0800 Subject: [PATCH 10/19] I seem to have broken my lookup for multidisc entries --- dat/dat.go | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/dat/dat.go b/dat/dat.go index 8828026e..6efb4ac9 100644 --- a/dat/dat.go +++ b/dat/dat.go @@ -6,7 +6,7 @@ import ( "encoding/xml" "fmt" "strings" - "slices" + //"slices" "sort" //"github.com/kr/pretty" "log" @@ -122,7 +122,7 @@ func (db *DB) FindByCRC(romPath string, romName string, crc uint32, games chan ( func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games chan (Game)) (bool) { type SafeLookup struct { mu sync.Mutex - options []string + options []Game found bool } game_found := SafeLookup{found: false} @@ -148,14 +148,23 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch game_found.mu.Unlock() } else { var gameName = strings.Split(romName, ".")[0] - if (strings.Contains(ROM.Name, gameName)) && - !(slices.Contains(game_found.options, game.Name)) { + if (strings.Contains(ROM.Name, gameName)) { + var option_has bool + for _, option := range game_found.options { + fmt.Println(romName, option.Name) + if strings.Contains(option.Name, game.Name) { + option_has = true + } + } + if !(option_has) { game_found.mu.Lock() //fmt.Println(romName, game.Name) - game_found.options = append(game_found.options, game.Name) + game.Path = romPath + game.System = system + game_found.options = append(game_found.options, game) game_found.mu.Unlock() } - + } } } } @@ -167,17 +176,15 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch if game_found.found == false { if len(game_found.options) > 0 { game_found.found = true - slices.Sort(game_found.options) - game_found.options = slices.Compact(game_found.options) sort.SliceStable(game_found.options, func(i, j int) bool { - return len(game_found.options[i]) < len(game_found.options[j]) + return len(game_found.options[i].Name) < len(game_found.options[j].Name) }) for _, option := range game_found.options { - fmt.Printf("Fuzzy match: %s -> %s\n", romName, option) + fmt.Printf("Fuzzy match option: %s -> %s\n", romName, option.Name) break } } - if !game_found.found { + if game_found.found == false { fmt.Printf("No match: %s\n", romName) } } From 3dd61b1599305bde087ec08c0897dbf4dba63a36 Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Sat, 17 Feb 2024 19:25:58 -0800 Subject: [PATCH 11/19] basic fuzzy search is working fully. Next up is searching without parens to help with hacks. --- dat/dat.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dat/dat.go b/dat/dat.go index 6efb4ac9..e8a7e774 100644 --- a/dat/dat.go +++ b/dat/dat.go @@ -151,8 +151,8 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch if (strings.Contains(ROM.Name, gameName)) { var option_has bool for _, option := range game_found.options { - fmt.Println(romName, option.Name) - if strings.Contains(option.Name, game.Name) { + //fmt.Println(romName, option.Name) + if option.Name == game.Name { option_has = true } } @@ -180,7 +180,8 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch return len(game_found.options[i].Name) < len(game_found.options[j].Name) }) for _, option := range game_found.options { - fmt.Printf("Fuzzy match option: %s -> %s\n", romName, option.Name) + fmt.Printf("Fuzzy match: %s -> %s\n", romName, option.Name) + games <- option break } } From 55c9427d62700258526ad98c0e44db485642ba18 Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Sat, 17 Feb 2024 20:15:33 -0800 Subject: [PATCH 12/19] configurable starting path added. --- menu/scene_tabs.go | 7 ++++--- settings/defaults.go | 1 + settings/settings.go | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/menu/scene_tabs.go b/menu/scene_tabs.go index 630d4a1a..b46401e1 100644 --- a/menu/scene_tabs.go +++ b/menu/scene_tabs.go @@ -3,7 +3,7 @@ package menu import ( "fmt" "os" - "os/user" + //"os/user" "sort" "github.com/libretro/ludo/audio" @@ -15,6 +15,7 @@ import ( "github.com/libretro/ludo/state" "github.com/libretro/ludo/utils" "github.com/libretro/ludo/video" + "github.com/libretro/ludo/settings" colorful "github.com/lucasb-eyer/go-colorful" "github.com/tanema/gween" @@ -63,8 +64,8 @@ func buildTabs() Scene { subLabel: "Scan your collection", icon: "add", callbackOK: func() { - usr, _ := user.Current() - menu.Push(buildExplorer(usr.HomeDir, nil, + //usr, _ := user.Current() + menu.Push(buildExplorer(settings.Current.FileDirectory, nil, func(path string) { scanner.ScanDir(path, refreshTabs) }, diff --git a/settings/defaults.go b/settings/defaults.go index 072615ec..47914d50 100644 --- a/settings/defaults.go +++ b/settings/defaults.go @@ -58,6 +58,7 @@ func defaultSettings() Settings { "SNK - Neo Geo Pocket": "mednafen_ngp_libretro", "Sony - PlayStation": playstationCore, }, + FileDirectory: xdg.DataHome, CoresDirectory: "./cores", AssetsDirectory: "./assets", DatabaseDirectory: "./database", diff --git a/settings/settings.go b/settings/settings.go index b3d6fb87..b03db8ac 100644 --- a/settings/settings.go +++ b/settings/settings.go @@ -36,6 +36,7 @@ type Settings struct { CoreForPlaylist map[string]string `hide:"always" toml:"core_for_playlist"` + FileDirectory string `hide:"ludos" toml:"files_dir" label:"Files Directory" fmt:"%s" widget:"dir"` CoresDirectory string `hide:"ludos" toml:"cores_dir" label:"Cores Directory" fmt:"%s" widget:"dir"` AssetsDirectory string `hide:"ludos" toml:"assets_dir" label:"Assets Directory" fmt:"%s" widget:"dir"` DatabaseDirectory string `hide:"ludos" toml:"database_dir" label:"Database Directory" fmt:"%s" widget:"dir"` From 3aed43e81d9e0d92816373e149086f6b547f172f Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Sat, 17 Feb 2024 21:48:29 -0800 Subject: [PATCH 13/19] almost there. need to update FindByROMName to take file extension into account once it hits fuzzy matching. --- dat/dat.go | 1 + scanner/scanner.go | 24 ++++++++++++++++++++++-- utils/utils.go | 18 ++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/dat/dat.go b/dat/dat.go index e8a7e774..43791c8f 100644 --- a/dat/dat.go +++ b/dat/dat.go @@ -13,6 +13,7 @@ import ( //"path/filepath" "strconv" "sync" + //"github.com/libretro/ludo/utils" ) // DB is a database that contains many Dats, mapped to their system name diff --git a/scanner/scanner.go b/scanner/scanner.go index 7989d6ed..d0fbc6f2 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -11,6 +11,7 @@ import ( "path/filepath" "strconv" "strings" + "fmt" "github.com/libretro/ludo/dat" ntf "github.com/libretro/ludo/notifications" "github.com/libretro/ludo/playlists" @@ -145,10 +146,29 @@ func Scan(dir string, roms []string, games chan (dat.Game), n *ntf.Notification) if headerSize, ok := headerSizes[ext]; ok { crcHeaderless := crc32.ChecksumIEEE(bytes[headerSize:]) if !state.DB.FindByCRC(f, utils.FileName(f), crcHeaderless, games) { - state.DB.FindByROMName(f, filepath.Base(f), 0, games) + if !state.DB.FindByROMName(f, filepath.Base(f), 0, games) { + strippedName, tags := utils.ExtractTags(filepath.Base(f)) + fmt.Println(strippedName) + for _, tag := range tags { + if state.DB.FindByROMName(f, strippedName + " " + "(" + tag + ")", 0, games) { + break + } + } + state.DB.FindByROMName(f, strippedName, 0, games) + } } } else { - state.DB.FindByROMName(f, filepath.Base(f), 0, games) + if !state.DB.FindByROMName(f, filepath.Base(f), 0, games) { + // var gameExt = strings.Split(filepath.Base(f), ".")[-1] + strippedName, tags := utils.ExtractTags(filepath.Base(f)) + fmt.Println(strippedName) + for _, tag := range tags { + if state.DB.FindByROMName(f, strippedName + " " + "(" + tag + ")", 0, games) { + break + } + } + state.DB.FindByROMName(f, strippedName, 0, games) + } } } n.Update(ntf.Info, strconv.Itoa(i)+"/"+strconv.Itoa(len(roms))+" "+f) diff --git a/utils/utils.go b/utils/utils.go index 82cde79e..85ef7ebf 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -11,8 +11,26 @@ import ( "runtime" "strings" "time" + "regexp" ) +func ExtractTags(name string) (string, []string) { + re := regexp.MustCompile(`\(.*?\)`) + pars := re.FindAllString(name, -1) + var tags []string + for _, par := range pars { + name = strings.Replace(name, par, "", -1) + par = strings.Replace(par, "(", "", -1) + par = strings.Replace(par, ")", "", -1) + results := strings.Split(par, ",") + for _, result := range results { + tags = append(tags, strings.TrimSpace(result)) + } + } + name = strings.TrimSpace(name) + return name, tags +} + // StringInSlice check wether a string is contain in a string slice. func StringInSlice(a string, list []string) bool { for _, b := range list { From 8298d8cf0bf8021aeca2e8d105b11efcc82a60b1 Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Sun, 18 Feb 2024 13:01:49 -0800 Subject: [PATCH 14/19] I'm spiraling a bit. Matches are better but I'm failing to limit to the correct console. Gonna undo some of this and try again with a more simple setup. --- scanner/scanner.go | 17 +++++++++-------- utils/utils.go | 9 ++++++++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/scanner/scanner.go b/scanner/scanner.go index d0fbc6f2..83ae5e3a 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -141,33 +141,34 @@ func Scan(dir string, roms []string, games chan (dat.Game), n *ntf.Notification) n.Update(ntf.Error, err.Error()) continue } + var gameParts = strings.Split(filepath.Base(f), ".") + var gameExt = "." + gameParts[1] + strippedName, tags := utils.ExtractTags(filepath.Base(f)) crc := crc32.ChecksumIEEE(bytes) if !state.DB.FindByCRC(f, utils.FileName(f), crc, games) { if headerSize, ok := headerSizes[ext]; ok { crcHeaderless := crc32.ChecksumIEEE(bytes[headerSize:]) if !state.DB.FindByCRC(f, utils.FileName(f), crcHeaderless, games) { if !state.DB.FindByROMName(f, filepath.Base(f), 0, games) { - strippedName, tags := utils.ExtractTags(filepath.Base(f)) - fmt.Println(strippedName) + //fmt.Println(strippedName) for _, tag := range tags { - if state.DB.FindByROMName(f, strippedName + " " + "(" + tag + ")", 0, games) { + if state.DB.FindByROMName(f, strippedName + " " + "(" + tag + ")" + gameExt, 0, games) { break } } - state.DB.FindByROMName(f, strippedName, 0, games) + state.DB.FindByROMName(f, strippedName + gameExt, 0, games) } } } else { if !state.DB.FindByROMName(f, filepath.Base(f), 0, games) { - // var gameExt = strings.Split(filepath.Base(f), ".")[-1] - strippedName, tags := utils.ExtractTags(filepath.Base(f)) + //strippedName, tags := utils.ExtractTags(filepath.Base(f)) fmt.Println(strippedName) for _, tag := range tags { - if state.DB.FindByROMName(f, strippedName + " " + "(" + tag + ")", 0, games) { + if state.DB.FindByROMName(f, strippedName + " " + "(" + tag + ")" + gameExt, 0, games) { break } } - state.DB.FindByROMName(f, strippedName, 0, games) + state.DB.FindByROMName(f, strippedName + gameExt, 0, games) } } } diff --git a/utils/utils.go b/utils/utils.go index 85ef7ebf..74f11b22 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -27,7 +27,14 @@ func ExtractTags(name string) (string, []string) { tags = append(tags, strings.TrimSpace(result)) } } - name = strings.TrimSpace(name) + namePart, extPart, result := strings.Cut(name, ".") + if result { + _ = extPart + name = strings.TrimSpace(namePart) + //fmt.Println(name + "." + extPart) + } else { + name = strings.TrimSpace(name) + } return name, tags } From 1a0ee1e14e4b5a3757b934ca06b80ecb3033c737 Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Sun, 18 Feb 2024 14:05:49 -0800 Subject: [PATCH 15/19] enforcing extension match --- dat/dat.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/dat/dat.go b/dat/dat.go index e8a7e774..159ac682 100644 --- a/dat/dat.go +++ b/dat/dat.go @@ -139,7 +139,7 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch // If the checksums match for _, ROM := range game.ROMs { if romName == ROM.Name { - fmt.Printf("Exact match: %s -> %s\n", romName, game.Name) + fmt.Printf("Exact match: %s -> %s\n", romName, ROM.Name) game.Path = romPath game.System = system games <- game @@ -148,7 +148,9 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch game_found.mu.Unlock() } else { var gameName = strings.Split(romName, ".")[0] - if (strings.Contains(ROM.Name, gameName)) { + var gameExt = strings.Split(romName, ".")[1] + if (strings.Contains(ROM.Name, gameName)) && + (strings.Contains(ROM.Name, gameExt)) { var option_has bool for _, option := range game_found.options { //fmt.Println(romName, option.Name) @@ -180,7 +182,7 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch return len(game_found.options[i].Name) < len(game_found.options[j].Name) }) for _, option := range game_found.options { - fmt.Printf("Fuzzy match: %s -> %s\n", romName, option.Name) + fmt.Printf("Fuzzy match: %s -> %s for %s\n", romName, option.Name, option.System) games <- option break } From 30a284006e2cdce879f559eeace7f5853c11469a Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Sun, 18 Feb 2024 14:25:47 -0800 Subject: [PATCH 16/19] I broke n64 somehow, but everything else is working. --- dat/dat.go | 9 +++++---- scanner/scanner.go | 6 ++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/dat/dat.go b/dat/dat.go index cb94bafc..87d9c49f 100644 --- a/dat/dat.go +++ b/dat/dat.go @@ -13,6 +13,7 @@ import ( //"path/filepath" "strconv" "sync" + "path/filepath" //"github.com/libretro/ludo/utils" ) @@ -183,14 +184,14 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch return len(game_found.options[i].Name) < len(game_found.options[j].Name) }) for _, option := range game_found.options { - fmt.Printf("Fuzzy match: %s -> %s for %s\n", romName, option.Name, option.System) + fmt.Printf("Fuzzy match: %s -> %s for %s\n", filepath.Base(romPath), option.Name, option.System) games <- option break } } - if game_found.found == false { - fmt.Printf("No match: %s\n", romName) - } + //if game_found.found == false { + // fmt.Printf("No match: %s\n", romName) + //} } return game_found.found } diff --git a/scanner/scanner.go b/scanner/scanner.go index 83ae5e3a..77a9ea45 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -162,13 +162,15 @@ func Scan(dir string, roms []string, games chan (dat.Game), n *ntf.Notification) } else { if !state.DB.FindByROMName(f, filepath.Base(f), 0, games) { //strippedName, tags := utils.ExtractTags(filepath.Base(f)) - fmt.Println(strippedName) + //fmt.Println(strippedName) for _, tag := range tags { if state.DB.FindByROMName(f, strippedName + " " + "(" + tag + ")" + gameExt, 0, games) { break } } - state.DB.FindByROMName(f, strippedName + gameExt, 0, games) + if !state.DB.FindByROMName(f, strippedName + gameExt, 0, games) { + fmt.Printf("No match: %s\n", filepath.Base(f)) + } } } } From 6463e75671bed60bff007be47d5bca445dc1a956 Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Sun, 18 Feb 2024 14:32:17 -0800 Subject: [PATCH 17/19] fixed n64 support by adding .z64 to the scanner matches. --- scanner/scanner.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scanner/scanner.go b/scanner/scanner.go index 77a9ea45..b4cf41d5 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -135,7 +135,7 @@ func Scan(dir string, roms []string, games chan (dat.Game), n *ntf.Notification) // Look for a matching game entry in the database state.DB.FindByROMName(f, filepath.Base(f), 0, games) n.Update(ntf.Info, strconv.Itoa(i)+"/"+strconv.Itoa(len(roms))+" "+f) - case ".32x", "a52", ".a78", ".col", ".crt", ".d64", ".pce", ".fds", ".gb", ".gba", ".gbc", ".gen", ".gg", ".ipf", ".j64", ".jag", ".lnx", ".md", ".n64", ".nes", ".ngc", ".nds", ".rom", ".sfc", ".sg", ".smc", ".smd", ".sms", ".ws", ".wsc": + case ".32x", "a52", ".a78", ".col", ".crt", ".d64", ".pce", ".fds", ".gb", ".gba", ".gbc", ".gen", ".gg", ".ipf", ".j64", ".jag", ".lnx", ".md", ".n64", ".nes", ".ngc", ".nds", ".rom", ".sfc", ".sg", ".smc", ".smd", ".sms", ".ws", ".wsc", ".z64": bytes, err := ioutil.ReadFile(f) if err != nil { n.Update(ntf.Error, err.Error()) From 4837758e137d23616606284d679c1cf3522fbba4 Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Mon, 26 Feb 2024 08:38:39 -0800 Subject: [PATCH 18/19] satisfy staticcheck --- dat/dat.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dat/dat.go b/dat/dat.go index 87d9c49f..82400bb1 100644 --- a/dat/dat.go +++ b/dat/dat.go @@ -177,7 +177,7 @@ func (db *DB) FindByROMName(romPath string, romName string, crc uint32, games ch } // Synchronize all the goroutines wg.Wait() - if game_found.found == false { + if !game_found.found { if len(game_found.options) > 0 { game_found.found = true sort.SliceStable(game_found.options, func(i, j int) bool { From fa831fff3c1a144c3119bfbf143883b16060ad2e Mon Sep 17 00:00:00 2001 From: Stephen Ancona Date: Tue, 5 Mar 2024 10:10:41 -0800 Subject: [PATCH 19/19] hopefully this fixes the build errors in x86 linux. --- go.mod | 8 +------ go.sum | 75 ---------------------------------------------------------- 2 files changed, 1 insertion(+), 82 deletions(-) diff --git a/go.mod b/go.mod index 6d815881..4e64a805 100644 --- a/go.mod +++ b/go.mod @@ -8,14 +8,13 @@ require ( github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240118000515-a250818d05e3 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 - github.com/kr/pretty v0.2.1 github.com/lucasb-eyer/go-colorful v1.2.0 github.com/mholt/archiver/v3 v3.5.1 github.com/pelletier/go-toml v1.9.5 github.com/tanema/gween v0.0.0-20221212145351-621cc8a459d1 github.com/youpy/go-wav v0.3.2 golang.org/x/image v0.15.0 - golang.org/x/mobile v0.0.0-20240112133503-c713f31d574b + golang.org/x/mobile v0.0.0-20240213143359-d1f7d3436075 ) require ( @@ -25,7 +24,6 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/klauspost/compress v1.17.7 // indirect github.com/klauspost/pgzip v1.2.6 // indirect - github.com/kr/text v0.2.0 // indirect github.com/nwaples/rardecode v1.1.3 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/ulikunitz/xz v0.5.11 // indirect @@ -33,10 +31,6 @@ require ( github.com/youpy/go-riff v0.1.0 // indirect github.com/zaf/g711 v1.4.0 // indirect golang.org/x/sys v0.17.0 // indirect - golang.org/x/image v0.15.0 - golang.org/x/mobile v0.0.0-20240213143359-d1f7d3436075 - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.0 // indirect ) diff --git a/go.sum b/go.sum index 0cfb03df..30ebca2c 100644 --- a/go.sum +++ b/go.sum @@ -5,7 +5,6 @@ github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1 github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/cavaliercoder/grab v2.0.0+incompatible h1:wZHbBQx56+Yxjx2TCGDcenhh3cJn7cCLMfkEPmySTSE= github.com/cavaliercoder/grab v2.0.0+incompatible/go.mod h1:tTBkfNqSBfuMmMBFaO2phgyhdYhiZQ/+iXCZDzcDsMI= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 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= @@ -18,7 +17,6 @@ github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= 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-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240118000515-a250818d05e3 h1:nanQfMsOs3gnuKRm0E5jXWomedE/9YIFXdmHJNZYeqc= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240118000515-a250818d05e3/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= @@ -37,12 +35,6 @@ github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgo github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mholt/archiver/v3 v3.5.1 h1:rDjOBX9JSF5BvoJGvjqK479aL70qh9DIpZCl+k7Clwo= @@ -76,85 +68,18 @@ github.com/youpy/go-riff v0.1.0 h1:vZO/37nI4tIET8tQI0Qn0Y79qQh99aEpponTPiPut7k= github.com/youpy/go-riff v0.1.0/go.mod h1:83nxdDV4Z9RzrTut9losK7ve4hUnxUR8ASSz4BsKXwQ= github.com/youpy/go-wav v0.3.2 h1:NLM8L/7yZ0Bntadw/0h95OyUsen+DQIVf9gay+SUsMU= github.com/youpy/go-wav v0.3.2/go.mod h1:0FCieAXAeSdcxFfwLpRuEo0PFmAoc+8NU34h7TUvk50= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zaf/g711 v0.0.0-20190814101024-76a4a538f52b/go.mod h1:T2h1zV50R/q0CVYnsQOQ6L7P4a2ZxH47ixWcMXFGyx8= github.com/zaf/g711 v1.4.0 h1:XZYkjjiAg9QTBnHqEg37m2I9q3IIDv5JRYXs2N8ma7c= github.com/zaf/g711 v1.4.0/go.mod h1:eCDXt3dSp/kYYAoooba7ukD/Q75jvAaS4WOMr0l1Roo= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= -golang.org/x/exp/shiny v0.0.0-20230817173708-d852ddb80c63/go.mod h1:UH99kUObWAZkDnWqppdQe5ZhPYESUw8I0zVV1uWBR+0= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mobile v0.0.0-20240213143359-d1f7d3436075 h1:iZzqyDd8gFkJZpsJNzveyScRBcQlsveheh6Q77LzhPY= golang.org/x/mobile v0.0.0-20240213143359-d1f7d3436075/go.mod h1:Y8Bnziw2dX69ZhYuqQB8Ihyjks1Q6fMmbg17j9+ISNA= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=