Skip to content

Commit 4cda29e

Browse files
authored
Refactor: Update GooDB.FetchPkg to accept goolib.PackageInfo. (#199)
1 parent 2e6ba54 commit 4cda29e

8 files changed

Lines changed: 57 additions & 28 deletions

File tree

cli/install/install.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ func (i *installer) installFromFile(path string) error {
174174
func (i *installer) installFromRepo(ctx context.Context, name string, archs []string) error {
175175
pi := goolib.PkgNameSplit(name)
176176
if i.shouldReinstall {
177-
ps, err := i.db.FetchPkg(pi.Name)
177+
ps, err := i.db.FetchPkg(pi)
178178
if err != nil {
179179
return fmt.Errorf("unable to fetch %v: %v", pi.Name, err)
180180
}

cli/remove/remove.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func (cmd *removeCmd) Execute(ctx context.Context, flags *flag.FlagSet, _ ...int
8484

8585
func (cmd *removeCmd) removeOne(ctx context.Context, pkgName string, downloader *client.Downloader, db *googetdb.GooDB) error {
8686
pi := goolib.PkgNameSplit(pkgName)
87-
ps, err := db.FetchPkg(pi.Name)
87+
ps, err := db.FetchPkg(pi)
8888
if err != nil {
8989
return err
9090
}

cli/verify/verify.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func (cmd *verifyCmd) Execute(ctx context.Context, flags *flag.FlagSet, _ ...int
7171

7272
for _, arg := range flags.Args() {
7373
pi := goolib.PkgNameSplit(arg)
74-
ps, err := db.FetchPkg(pi.Name)
74+
ps, err := db.FetchPkg(pi)
7575
if err != nil {
7676
logger.Errorf("Package %q not installed, cannot verify.", arg)
7777
continue

googet.goospec

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{{$version := "3.2.0@0" -}}
1+
{{$version := "3.2.1@0" -}}
22
{
33
"name": "googet",
44
"version": "{{$version}}",
@@ -15,6 +15,7 @@
1515
"path": "install.ps1"
1616
},
1717
"releaseNotes": [
18+
"3.2.1 - Refactor: Update GooDB.FetchPkg to accept goolib.PackageInfo.",
1819
"3.2.0 - Add Provides functionality and field to the GooGet PkgSpec.",
1920
"3.1.0 - Introduce a dry_run flag for update, install, and remove subcommands.",
2021
"3.0.0 - Replace googet state file with sqlite database. Add json output for installed command.",

googetdb/googetdb.go

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"time"
2525

2626
"github.com/google/googet/v2/client"
27+
"github.com/google/googet/v2/goolib"
2728
"github.com/google/googet/v2/settings"
2829
"github.com/google/googet/v2/system"
2930
"github.com/google/logger"
@@ -152,45 +153,46 @@ func (g *GooDB) RemovePkg(pkgName, arch string) error {
152153
}
153154

154155
// FetchPkg exports a single package from the googet database
155-
func (g *GooDB) FetchPkg(pkgName string) (client.PackageState, error) {
156-
var pkgState client.PackageState
157-
156+
func (g *GooDB) FetchPkg(pi goolib.PackageInfo) (client.PackageState, error) {
158157
selectSpecQuery :=
159158
`SELECT
160159
pkg_json
161160
FROM
162161
InstalledPackages
163162
WHERE pkg_name = ?
164-
ORDER BY pkg_name
163+
ORDER BY pkg_arch, pkg_ver
165164
`
166-
spec, err := g.db.Query(selectSpecQuery, pkgName)
165+
spec, err := g.db.Query(selectSpecQuery, pi.Name)
167166
if err != nil {
168-
return client.PackageState{}, nil
167+
return client.PackageState{}, err
169168
}
170169
defer spec.Close()
170+
171+
var lastPkgState client.PackageState
171172
for spec.Next() {
172173
var jsonState string
173-
err = spec.Scan(
174-
&jsonState,
175-
)
176-
if err != nil {
177-
return pkgState, err
174+
if err := spec.Scan(&jsonState); err != nil {
175+
return client.PackageState{}, err
178176
}
179-
err = json.Unmarshal([]byte(jsonState), &pkgState)
180-
if err != nil {
181-
return pkgState, err
177+
var pkgState client.PackageState
178+
if err := json.Unmarshal([]byte(jsonState), &pkgState); err != nil {
179+
return client.PackageState{}, err
180+
}
181+
if pkgState.Match(pi) {
182+
return pkgState, nil
182183
}
184+
lastPkgState = pkgState
183185
}
184-
return pkgState, nil
186+
return lastPkgState, nil
185187
}
186188

187189
// FetchPkgs exports all of the current packages in the googet database
188190
func (g *GooDB) FetchPkgs(pkgName string) (client.GooGetState, error) {
189191
var state client.GooGetState
190-
query := `SELECT pkg_json FROM InstalledPackages ORDER BY pkg_name`
192+
query := `SELECT pkg_json FROM InstalledPackages ORDER BY pkg_name, pkg_arch`
191193
var args []any
192194
if pkgName != "" {
193-
query = `SELECT pkg_json FROM InstalledPackages WHERE pkg_name LIKE ? ORDER BY pkg_name`
195+
query = `SELECT pkg_json FROM InstalledPackages WHERE pkg_name LIKE ? ORDER BY pkg_name, pkg_arch`
194196
args = []any{pkgName}
195197
}
196198
rows, err := g.db.Query(query, args...)

googetdb/googetdb_test.go

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,9 @@ func TestFetchPkgsReturnsDistinctEntriesForDifferentArches(t *testing.T) {
128128
defer db.Close()
129129

130130
want := client.GooGetState{
131-
client.PackageState{PackageSpec: &goolib.PkgSpec{Name: "test-pkg", Arch: "amd64", Version: "1"}, InstallDate: 123456789},
132-
client.PackageState{PackageSpec: &goolib.PkgSpec{Name: "test-pkg", Arch: "i386", Version: "1"}, InstallDate: 123456789},
131+
client.PackageState{PackageSpec: &goolib.PkgSpec{Name: "test-pkg", Arch: "arm64", Version: "1"}, InstallDate: 123456789},
132+
client.PackageState{PackageSpec: &goolib.PkgSpec{Name: "test-pkg", Arch: "x86_32", Version: "1"}, InstallDate: 123456789},
133+
client.PackageState{PackageSpec: &goolib.PkgSpec{Name: "test-pkg", Arch: "x86_64", Version: "1"}, InstallDate: 123456789},
133134
}
134135
if err := db.WriteStateToDB(want); err != nil {
135136
t.Fatalf("db.WriteStateToDB(%v): %v", want, err)
@@ -143,6 +144,32 @@ func TestFetchPkgsReturnsDistinctEntriesForDifferentArches(t *testing.T) {
143144
if diff := cmp.Diff(want, got, cmpopts.EquateEmpty()); diff != "" {
144145
t.Fatalf("FetchPkgs got unexpected diff (-want +got):\n%v", diff)
145146
}
147+
148+
gotPkg, err := db.FetchPkg(goolib.PackageInfo{Name: "test-pkg", Arch: "x86_32"})
149+
if err != nil {
150+
t.Fatalf("db.FetchPkg: %v", err)
151+
}
152+
if diff := cmp.Diff(want[1], gotPkg, cmpopts.EquateEmpty()); diff != "" {
153+
t.Fatalf("FetchPkg got unexpected diff (-want +got):\n%v", diff)
154+
}
155+
156+
// If only name is provided, arm64 should be matched first based on sort order.
157+
gotPkg, err = db.FetchPkg(goolib.PackageInfo{Name: "test-pkg"})
158+
if err != nil {
159+
t.Fatalf("db.FetchPkg: %v", err)
160+
}
161+
if diff := cmp.Diff(want[0], gotPkg, cmpopts.EquateEmpty()); diff != "" {
162+
t.Fatalf("FetchPkg got unexpected diff (-want +got):\n%v", diff)
163+
}
164+
165+
// If no arch matches, the last processed package (x86_64) should be returned.
166+
gotPkg, err = db.FetchPkg(goolib.PackageInfo{Name: "test-pkg", Arch: "none"})
167+
if err != nil {
168+
t.Fatalf("db.FetchPkg: %v", err)
169+
}
170+
if diff := cmp.Diff(want[2], gotPkg, cmpopts.EquateEmpty()); diff != "" {
171+
t.Fatalf("FetchPkg got unexpected diff (-want +got):\n%v", diff)
172+
}
146173
}
147174

148175
func TestCreateIfMissing(t *testing.T) {

install/install.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ var toRemove []string
3939

4040
// minInstalled reports whether the package is installed at the given version or greater.
4141
func minInstalled(pi goolib.PackageInfo, db *googetdb.GooDB) (bool, error) {
42-
p, err := db.FetchPkg(pi.Name)
42+
p, err := db.FetchPkg(pi)
4343
if err != nil {
4444
return false, err
4545
}
@@ -199,7 +199,7 @@ func FromRepo(ctx context.Context, pi goolib.PackageInfo, repo, cache string, rm
199199
logger.Infof("Installation of %s.%s.%s completed", pi.Name, pi.Arch, pi.Ver)
200200
fmt.Printf("Installation of %s.%s.%s and all dependencies completed\n", pi.Name, pi.Arch, pi.Ver)
201201
// Clean up old version, if applicable.
202-
ps, err := db.FetchPkg(pi.Name)
202+
ps, err := db.FetchPkg(pi)
203203
if err != nil {
204204
return err
205205
}
@@ -360,7 +360,7 @@ func copyPkg(src, dst string) (retErr error) {
360360

361361
// NeedsInstallation checks if a package version needs installation.
362362
func NeedsInstallation(pi goolib.PackageInfo, db *googetdb.GooDB) (bool, error) {
363-
p, err := db.FetchPkg(pi.Name)
363+
p, err := db.FetchPkg(pi)
364364
if err != nil {
365365
return true, err
366366
}
@@ -481,7 +481,6 @@ func cleanOld(st client.PackageState, insFiles map[string]string, dbOnly bool) {
481481
if st.UnpackDir != "" && oswrap.RemoveAll(st.UnpackDir) != nil {
482482
logger.Error("Unable to remove old unpack dir")
483483
}
484-
return
485484
}
486485

487486
func cleanOldFiles(oldState client.PackageState, insFiles map[string]string) {

remove/remove.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import (
3131

3232
func uninstallPkg(ctx context.Context, pi goolib.PackageInfo, dbOnly bool, downloader *client.Downloader, db *googetdb.GooDB) error {
3333
logger.Infof("Executing removal of package %q", pi.Name)
34-
ps, err := db.FetchPkg(pi.Name)
34+
ps, err := db.FetchPkg(pi)
3535
if err != nil {
3636
return fmt.Errorf("package not found in state file: %v", err)
3737
}

0 commit comments

Comments
 (0)