From 2a85bce0559bf1ee3f67060da1fe50c08b11e2f3 Mon Sep 17 00:00:00 2001 From: sewn Date: Thu, 7 Mar 2024 19:41:17 +0300 Subject: [PATCH] cmd/vinegar: change from download-then-extract to download-and-extract --- cmd/vinegar/binary_setup.go | 65 +++++++++++++++---------------------- 1 file changed, 26 insertions(+), 39 deletions(-) diff --git a/cmd/vinegar/binary_setup.go b/cmd/vinegar/binary_setup.go index 8fdf20c2..e1526317 100644 --- a/cmd/vinegar/binary_setup.go +++ b/cmd/vinegar/binary_setup.go @@ -112,14 +112,8 @@ func (b *Binary) Install() error { return pm.Packages[i].ZipSize < pm.Packages[j].ZipSize }) - b.Splash.SetMessage("Downloading " + b.Alias) - if err := b.DownloadPackages(&pm); err != nil { - return fmt.Errorf("download: %w", err) - } - - b.Splash.SetMessage("Extracting " + b.Alias) - if err := b.ExtractPackages(&pm); err != nil { - return fmt.Errorf("extract: %w", err) + if err := b.SetupPackages(&pm); err != nil { + return fmt.Errorf("setup: %w", err) } if b.Type == roblox.Studio { @@ -148,21 +142,38 @@ func (b *Binary) Install() error { return nil } -func (b *Binary) PerformPackages(pm *boot.PackageManifest, fn func(boot.Package) error) error { - donePkgs := 0 - pkgsLen := len(pm.Packages) +func (b *Binary) SetupPackages(pm *boot.PackageManifest) error { + dests := boot.BinaryDirectories(b.Type) + d := 0 + n := len(pm.Packages) * 2 // download & extraction eg := new(errgroup.Group) + done := func() { + d++ + b.Splash.SetProgress(float32(d) / float32(n)) + } + + slog.Info("Installing Packages", "guid", pm.Deployment.GUID, "count", n) for _, p := range pm.Packages { p := p + eg.Go(func() error { - err := fn(p) - if err != nil { + dest, ok := dests[p.Name] + src := filepath.Join(dirs.Downloads, p.Checksum) + + if !ok { + return fmt.Errorf("unhandled package: %s", p.Name) + } + + if err := p.Download(src, pm.DeployURL); err != nil { return err } + done() - donePkgs++ - b.Splash.SetProgress(float32(donePkgs) / float32(pkgsLen)) + if err := p.Extract(src, filepath.Join(b.Dir, dest)); err != nil { + return err + } + done() return nil }) @@ -171,30 +182,6 @@ func (b *Binary) PerformPackages(pm *boot.PackageManifest, fn func(boot.Package) return eg.Wait() } -func (b *Binary) DownloadPackages(pm *boot.PackageManifest) error { - slog.Info("Downloading Packages", "guid", pm.Deployment.GUID, "count", len(pm.Packages)) - - return b.PerformPackages(pm, func(pkg boot.Package) error { - return pkg.Download(filepath.Join(dirs.Downloads, pkg.Checksum), pm.DeployURL) - }) -} - -func (b *Binary) ExtractPackages(pm *boot.PackageManifest) error { - slog.Info("Extracting Packages", "guid", pm.Deployment.GUID, "count", len(pm.Packages)) - - pkgDirs := boot.BinaryDirectories(b.Type) - - return b.PerformPackages(pm, func(pkg boot.Package) error { - dest, ok := pkgDirs[pkg.Name] - - if !ok { - return fmt.Errorf("unhandled package: %s", pkg.Name) - } - - return pkg.Extract(filepath.Join(dirs.Downloads, pkg.Checksum), filepath.Join(b.Dir, dest)) - }) -} - func (b *Binary) SetupDxvk() error { if b.State.DxvkVersion != "" && !b.Config.Dxvk { b.Splash.SetMessage("Uninstalling DXVK")