From d487297215269adb641697ba9f8594b0c862e99e Mon Sep 17 00:00:00 2001 From: John-Michael Mulesa Date: Wed, 4 Mar 2026 10:57:20 -0500 Subject: [PATCH 1/9] Refactor: Update GooDB.FetchPkg to accept goolib.PackageInfo. The FetchPkg function now takes a goolib.PackageInfo and uses it to match the specific package state, including version and architecture, rather than just the package name. Call sites have been updated to pass the full PackageInfo. --- cli/install/install.go | 2 +- cli/remove/remove.go | 2 +- cli/verify/verify.go | 2 +- googetdb/googetdb.go | 8 ++++++-- install/install.go | 7 +++---- remove/remove.go | 2 +- 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/cli/install/install.go b/cli/install/install.go index 513a338..3abd3ed 100644 --- a/cli/install/install.go +++ b/cli/install/install.go @@ -174,7 +174,7 @@ func (i *installer) installFromFile(path string) error { func (i *installer) installFromRepo(ctx context.Context, name string, archs []string) error { pi := goolib.PkgNameSplit(name) if i.shouldReinstall { - ps, err := i.db.FetchPkg(pi.Name) + ps, err := i.db.FetchPkg(pi) if err != nil { return fmt.Errorf("unable to fetch %v: %v", pi.Name, err) } diff --git a/cli/remove/remove.go b/cli/remove/remove.go index 89e5614..18e1c32 100644 --- a/cli/remove/remove.go +++ b/cli/remove/remove.go @@ -84,7 +84,7 @@ func (cmd *removeCmd) Execute(ctx context.Context, flags *flag.FlagSet, _ ...int func (cmd *removeCmd) removeOne(ctx context.Context, pkgName string, downloader *client.Downloader, db *googetdb.GooDB) error { pi := goolib.PkgNameSplit(pkgName) - ps, err := db.FetchPkg(pi.Name) + ps, err := db.FetchPkg(pi) if err != nil { return err } diff --git a/cli/verify/verify.go b/cli/verify/verify.go index b3be9ee..5364b05 100644 --- a/cli/verify/verify.go +++ b/cli/verify/verify.go @@ -71,7 +71,7 @@ func (cmd *verifyCmd) Execute(ctx context.Context, flags *flag.FlagSet, _ ...int for _, arg := range flags.Args() { pi := goolib.PkgNameSplit(arg) - ps, err := db.FetchPkg(pi.Name) + ps, err := db.FetchPkg(pi) if err != nil { logger.Errorf("Package %q not installed, cannot verify.", arg) continue diff --git a/googetdb/googetdb.go b/googetdb/googetdb.go index 3e2ce8d..8234320 100644 --- a/googetdb/googetdb.go +++ b/googetdb/googetdb.go @@ -24,6 +24,7 @@ import ( "time" "github.com/google/googet/v2/client" + "github.com/google/googet/v2/goolib" "github.com/google/googet/v2/settings" "github.com/google/googet/v2/system" "github.com/google/logger" @@ -152,7 +153,7 @@ func (g *GooDB) RemovePkg(pkgName, arch string) error { } // FetchPkg exports a single package from the googet database -func (g *GooDB) FetchPkg(pkgName string) (client.PackageState, error) { +func (g *GooDB) FetchPkg(pi goolib.PackageInfo) (client.PackageState, error) { var pkgState client.PackageState selectSpecQuery := @@ -163,7 +164,7 @@ func (g *GooDB) FetchPkg(pkgName string) (client.PackageState, error) { WHERE pkg_name = ? ORDER BY pkg_name ` - spec, err := g.db.Query(selectSpecQuery, pkgName) + spec, err := g.db.Query(selectSpecQuery, pi.Name) if err != nil { return client.PackageState{}, nil } @@ -180,6 +181,9 @@ func (g *GooDB) FetchPkg(pkgName string) (client.PackageState, error) { if err != nil { return pkgState, err } + if pkgState.Match(pi) { + return pkgState, nil + } } return pkgState, nil } diff --git a/install/install.go b/install/install.go index eab1bf2..76025fa 100644 --- a/install/install.go +++ b/install/install.go @@ -39,7 +39,7 @@ var toRemove []string // minInstalled reports whether the package is installed at the given version or greater. func minInstalled(pi goolib.PackageInfo, db *googetdb.GooDB) (bool, error) { - p, err := db.FetchPkg(pi.Name) + p, err := db.FetchPkg(pi) if err != nil { return false, err } @@ -203,7 +203,7 @@ func FromRepo(ctx context.Context, pi goolib.PackageInfo, repo, cache string, rm logger.Infof("Installation of %s.%s.%s completed", pi.Name, pi.Arch, pi.Ver) fmt.Printf("Installation of %s.%s.%s and all dependencies completed\n", pi.Name, pi.Arch, pi.Ver) // Clean up old version, if applicable. - ps, err := db.FetchPkg(pi.Name) + ps, err := db.FetchPkg(pi) if err != nil { return err } @@ -364,7 +364,7 @@ func copyPkg(src, dst string) (retErr error) { // NeedsInstallation checks if a package version needs installation. func NeedsInstallation(pi goolib.PackageInfo, db *googetdb.GooDB) (bool, error) { - p, err := db.FetchPkg(pi.Name) + p, err := db.FetchPkg(pi) if err != nil { return true, err } @@ -485,7 +485,6 @@ func cleanOld(st client.PackageState, insFiles map[string]string, dbOnly bool) { if st.UnpackDir != "" && oswrap.RemoveAll(st.UnpackDir) != nil { logger.Error("Unable to remove old unpack dir") } - return } func cleanOldFiles(oldState client.PackageState, insFiles map[string]string) { diff --git a/remove/remove.go b/remove/remove.go index 008fccd..6b120b1 100644 --- a/remove/remove.go +++ b/remove/remove.go @@ -31,7 +31,7 @@ import ( func uninstallPkg(ctx context.Context, pi goolib.PackageInfo, dbOnly bool, downloader *client.Downloader, db *googetdb.GooDB) error { logger.Infof("Executing removal of package %q", pi.Name) - ps, err := db.FetchPkg(pi.Name) + ps, err := db.FetchPkg(pi) if err != nil { return fmt.Errorf("package not found in state file: %v", err) } From ed1b042712956a274a1156ce632b2de22b1c2ac4 Mon Sep 17 00:00:00 2001 From: John-Michael Mulesa Date: Wed, 4 Mar 2026 11:02:36 -0500 Subject: [PATCH 2/9] Bump version to 3.3.0 and update release notes Updated version to 3.3.0 and added release notes for the new version. --- googet.goospec | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/googet.goospec b/googet.goospec index fa262a4..5c72ed7 100644 --- a/googet.goospec +++ b/googet.goospec @@ -1,4 +1,4 @@ -{{$version := "3.2.0@0" -}} +{{$version := "3.3.0@0" -}} { "name": "googet", "version": "{{$version}}", @@ -15,6 +15,7 @@ "path": "install.ps1" }, "releaseNotes": [ + "3.3.0 - Refactor: Update GooDB.FetchPkg to accept goolib.PackageInfo.", "3.2.0 - Add Provides functionality and field to the GooGet PkgSpec.", "3.1.0 - Introduce a dry_run flag for update, install, and remove subcommands.", "3.0.0 - Replace googet state file with sqlite database. Add json output for installed command.", From 2be3b187a8de87418fe1de54ceec0b745277787e Mon Sep 17 00:00:00 2001 From: John-Michael Mulesa Date: Thu, 5 Mar 2026 09:55:50 -0500 Subject: [PATCH 3/9] Set version to 3.2.2 --- googet.goospec | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/googet.goospec b/googet.goospec index 5c72ed7..60d1c34 100644 --- a/googet.goospec +++ b/googet.goospec @@ -1,4 +1,4 @@ -{{$version := "3.3.0@0" -}} +{{$version := "3.2.2@0" -}} { "name": "googet", "version": "{{$version}}", @@ -15,7 +15,8 @@ "path": "install.ps1" }, "releaseNotes": [ - "3.3.0 - Refactor: Update GooDB.FetchPkg to accept goolib.PackageInfo.", + "3.2.2 - Refactor: Update GooDB.FetchPkg to accept goolib.PackageInfo.", + "3.2.1 - Remove offsets for semver to better support upgrading versions from X.X.X to Y.Y" "3.2.0 - Add Provides functionality and field to the GooGet PkgSpec.", "3.1.0 - Introduce a dry_run flag for update, install, and remove subcommands.", "3.0.0 - Replace googet state file with sqlite database. Add json output for installed command.", From a8ed876eb326d41a00e094ae4f9fa4b545622b74 Mon Sep 17 00:00:00 2001 From: John-Michael Mulesa Date: Thu, 5 Mar 2026 09:56:07 -0500 Subject: [PATCH 4/9] Fix formatting of release notes in googet.goospec --- googet.goospec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/googet.goospec b/googet.goospec index 60d1c34..d7c229a 100644 --- a/googet.goospec +++ b/googet.goospec @@ -16,7 +16,7 @@ }, "releaseNotes": [ "3.2.2 - Refactor: Update GooDB.FetchPkg to accept goolib.PackageInfo.", - "3.2.1 - Remove offsets for semver to better support upgrading versions from X.X.X to Y.Y" + "3.2.1 - Remove offsets for semver to better support upgrading versions from X.X.X to Y.Y", "3.2.0 - Add Provides functionality and field to the GooGet PkgSpec.", "3.1.0 - Introduce a dry_run flag for update, install, and remove subcommands.", "3.0.0 - Replace googet state file with sqlite database. Add json output for installed command.", From e42b73ff8312b724e167d64f057cbc12340f17f2 Mon Sep 17 00:00:00 2001 From: John-Michael Mulesa Date: Thu, 5 Mar 2026 09:57:55 -0500 Subject: [PATCH 5/9] Update version to 3.2.1 and adjust release notes --- googet.goospec | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/googet.goospec b/googet.goospec index d7c229a..8fbf3ba 100644 --- a/googet.goospec +++ b/googet.goospec @@ -1,4 +1,4 @@ -{{$version := "3.2.2@0" -}} +{{$version := "3.2.1@0" -}} { "name": "googet", "version": "{{$version}}", @@ -15,8 +15,7 @@ "path": "install.ps1" }, "releaseNotes": [ - "3.2.2 - Refactor: Update GooDB.FetchPkg to accept goolib.PackageInfo.", - "3.2.1 - Remove offsets for semver to better support upgrading versions from X.X.X to Y.Y", + "3.2.1 - Refactor: Update GooDB.FetchPkg to accept goolib.PackageInfo.", "3.2.0 - Add Provides functionality and field to the GooGet PkgSpec.", "3.1.0 - Introduce a dry_run flag for update, install, and remove subcommands.", "3.0.0 - Replace googet state file with sqlite database. Add json output for installed command.", From ac256abc5acc8aa9a4df39afde5369fa7ccb92f1 Mon Sep 17 00:00:00 2001 From: John-Michael Mulesa Date: Fri, 6 Mar 2026 09:32:34 -0500 Subject: [PATCH 6/9] Change ORDER BY clause to sort by pkg_arch --- googetdb/googetdb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/googetdb/googetdb.go b/googetdb/googetdb.go index 8234320..c6c5679 100644 --- a/googetdb/googetdb.go +++ b/googetdb/googetdb.go @@ -162,7 +162,7 @@ func (g *GooDB) FetchPkg(pi goolib.PackageInfo) (client.PackageState, error) { FROM InstalledPackages WHERE pkg_name = ? - ORDER BY pkg_name + ORDER BY pkg_arch ` spec, err := g.db.Query(selectSpecQuery, pi.Name) if err != nil { From ec960fb39175d02b02dab50f38c18456498252cd Mon Sep 17 00:00:00 2001 From: John-Michael Mulesa Date: Fri, 6 Mar 2026 09:49:10 -0500 Subject: [PATCH 7/9] Enhance FetchPkg and FetchPkgs queries with version --- googetdb/googetdb.go | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/googetdb/googetdb.go b/googetdb/googetdb.go index c6c5679..e74b1b2 100644 --- a/googetdb/googetdb.go +++ b/googetdb/googetdb.go @@ -154,47 +154,45 @@ func (g *GooDB) RemovePkg(pkgName, arch string) error { // FetchPkg exports a single package from the googet database func (g *GooDB) FetchPkg(pi goolib.PackageInfo) (client.PackageState, error) { - var pkgState client.PackageState - selectSpecQuery := `SELECT pkg_json FROM InstalledPackages WHERE pkg_name = ? - ORDER BY pkg_arch + ORDER BY pkg_arch, pkg_ver ` spec, err := g.db.Query(selectSpecQuery, pi.Name) if err != nil { - return client.PackageState{}, nil + return client.PackageState{}, err } defer spec.Close() + + var lastPkgState client.PackageState for spec.Next() { var jsonState string - err = spec.Scan( - &jsonState, - ) - if err != nil { - return pkgState, err + if err := spec.Scan(&jsonState); err != nil { + return client.PackageState{}, err } - err = json.Unmarshal([]byte(jsonState), &pkgState) - if err != nil { - return pkgState, err + var pkgState client.PackageState + if err := json.Unmarshal([]byte(jsonState), &pkgState); err != nil { + return client.PackageState{}, err } if pkgState.Match(pi) { return pkgState, nil } + lastPkgState = pkgState } - return pkgState, nil + return lastPkgState, nil } // FetchPkgs exports all of the current packages in the googet database func (g *GooDB) FetchPkgs(pkgName string) (client.GooGetState, error) { var state client.GooGetState - query := `SELECT pkg_json FROM InstalledPackages ORDER BY pkg_name` + query := `SELECT pkg_json FROM InstalledPackages ORDER BY pkg_name, pkg_arch` var args []any if pkgName != "" { - query = `SELECT pkg_json FROM InstalledPackages WHERE pkg_name LIKE ? ORDER BY pkg_name` + query = `SELECT pkg_json FROM InstalledPackages WHERE pkg_name LIKE ? ORDER BY pkg_name, pkg_arch` args = []any{pkgName} } rows, err := g.db.Query(query, args...) From 6c5f71373b0665ccf704581191aad8e428e39fee Mon Sep 17 00:00:00 2001 From: John-Michael Mulesa Date: Fri, 6 Mar 2026 09:51:13 -0500 Subject: [PATCH 8/9] Add tests for FetchPkg function in googetdb --- googetdb/googetdb_test.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/googetdb/googetdb_test.go b/googetdb/googetdb_test.go index 1dc71b2..a4c0191 100644 --- a/googetdb/googetdb_test.go +++ b/googetdb/googetdb_test.go @@ -143,6 +143,32 @@ func TestFetchPkgsReturnsDistinctEntriesForDifferentArches(t *testing.T) { if diff := cmp.Diff(want, got, cmpopts.EquateEmpty()); diff != "" { t.Fatalf("FetchPkgs got unexpected diff (-want +got):\n%v", diff) } + + gotPkg, err := db.FetchPkg(goolib.PackageInfo{Name: "test-pkg", Arch: "x86_32"}) + if err != nil { + t.Fatalf("db.FetchPkg: %v", err) + } + if diff := cmp.Diff(want[1], gotPkg, cmpopts.EquateEmpty()); diff != "" { + t.Fatalf("FetchPkg got unexpected diff (-want +got):\n%v", diff) + } + + // If only name is provided, arm64 should be matched first based on sort order. + gotPkg, err = db.FetchPkg(goolib.PackageInfo{Name: "test-pkg"}) + if err != nil { + t.Fatalf("db.FetchPkg: %v", err) + } + if diff := cmp.Diff(want[0], gotPkg, cmpopts.EquateEmpty()); diff != "" { + t.Fatalf("FetchPkg got unexpected diff (-want +got):\n%v", diff) + } + + // If no arch matches, the last processed package (x86_64) should be returned. + gotPkg, err = db.FetchPkg(goolib.PackageInfo{Name: "test-pkg", Arch: "none"}) + if err != nil { + t.Fatalf("db.FetchPkg: %v", err) + } + if diff := cmp.Diff(want[2], gotPkg, cmpopts.EquateEmpty()); diff != "" { + t.Fatalf("FetchPkg got unexpected diff (-want +got):\n%v", diff) + } } func TestCreateIfMissing(t *testing.T) { From 1b883667bfb57b73e584f340949ea43b77bf4ac7 Mon Sep 17 00:00:00 2001 From: John-Michael Mulesa Date: Fri, 6 Mar 2026 10:13:17 -0500 Subject: [PATCH 9/9] test: update expected package architectures in googetdb state test. --- googetdb/googetdb_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/googetdb/googetdb_test.go b/googetdb/googetdb_test.go index a4c0191..750f210 100644 --- a/googetdb/googetdb_test.go +++ b/googetdb/googetdb_test.go @@ -128,8 +128,9 @@ func TestFetchPkgsReturnsDistinctEntriesForDifferentArches(t *testing.T) { defer db.Close() want := client.GooGetState{ - client.PackageState{PackageSpec: &goolib.PkgSpec{Name: "test-pkg", Arch: "amd64", Version: "1"}, InstallDate: 123456789}, - client.PackageState{PackageSpec: &goolib.PkgSpec{Name: "test-pkg", Arch: "i386", Version: "1"}, InstallDate: 123456789}, + client.PackageState{PackageSpec: &goolib.PkgSpec{Name: "test-pkg", Arch: "arm64", Version: "1"}, InstallDate: 123456789}, + client.PackageState{PackageSpec: &goolib.PkgSpec{Name: "test-pkg", Arch: "x86_32", Version: "1"}, InstallDate: 123456789}, + client.PackageState{PackageSpec: &goolib.PkgSpec{Name: "test-pkg", Arch: "x86_64", Version: "1"}, InstallDate: 123456789}, } if err := db.WriteStateToDB(want); err != nil { t.Fatalf("db.WriteStateToDB(%v): %v", want, err)