@@ -16,6 +16,7 @@ import (
16
16
"go.jetpack.io/devbox/internal/debug"
17
17
"go.jetpack.io/devbox/internal/devpkg/pkgtype"
18
18
"go.jetpack.io/devbox/internal/nix"
19
+ "go.jetpack.io/devbox/internal/redact"
19
20
"go.jetpack.io/devbox/internal/searcher"
20
21
"golang.org/x/sync/errgroup"
21
22
)
@@ -42,6 +43,9 @@ func (f *File) FetchResolvedPackage(pkg string) (*Package, error) {
42
43
Version : ref .Version ,
43
44
}, nil
44
45
}
46
+ if featureflag .ResolveV2 .Enabled () {
47
+ return resolveV2 (context .TODO (), name , version )
48
+ }
45
49
46
50
packageVersion , err := searcher .Client ().Resolve (name , version )
47
51
if err != nil {
@@ -55,9 +59,9 @@ func (f *File) FetchResolvedPackage(pkg string) (*Package, error) {
55
59
return nil , err
56
60
}
57
61
}
58
- packageInfo , err := selectForSystem (packageVersion )
62
+ packageInfo , err := selectForSystem (packageVersion . Systems )
59
63
if err != nil {
60
- return nil , err
64
+ return nil , fmt . Errorf ( "no systems found for package %q" , name )
61
65
}
62
66
63
67
if len (packageInfo .AttrPaths ) == 0 {
@@ -78,17 +82,45 @@ func (f *File) FetchResolvedPackage(pkg string) (*Package, error) {
78
82
}, nil
79
83
}
80
84
81
- func selectForSystem (pkg * searcher.PackageVersion ) (searcher.PackageInfo , error ) {
82
- if pi , ok := pkg .Systems [nix .System ()]; ok {
83
- return pi , nil
85
+ func resolveV2 (ctx context.Context , name , version string ) (* Package , error ) {
86
+ resolved , err := searcher .Client ().ResolveV2 (ctx , name , version )
87
+ if errors .Is (err , searcher .ErrNotFound ) {
88
+ return nil , redact .Errorf ("%s@%s: %w" , name , version , nix .ErrPackageNotFound )
89
+ }
90
+ if err != nil {
91
+ return nil , err
92
+ }
93
+
94
+ // /v2/resolve never returns a success with no systems.
95
+ sysPkg , _ := selectForSystem (resolved .Systems )
96
+ pkg := & Package {
97
+ LastModified : sysPkg .LastUpdated .Format (time .RFC3339 ),
98
+ Resolved : sysPkg .FlakeInstallable .String (),
99
+ Source : devboxSearchSource ,
100
+ Version : resolved .Version ,
101
+ Systems : make (map [string ]* SystemInfo , len (resolved .Systems )),
84
102
}
85
- if pi , ok := pkg .Systems ["x86_64-linux" ]; ok {
86
- return pi , nil
103
+ for sys , info := range resolved .Systems {
104
+ if len (info .Outputs ) != 0 {
105
+ pkg .Systems [sys ] = & SystemInfo {
106
+ StorePath : info .Outputs [0 ].Path ,
107
+ }
108
+ }
109
+ }
110
+ return pkg , nil
111
+ }
112
+
113
+ func selectForSystem [V any ](systems map [string ]V ) (v V , err error ) {
114
+ if v , ok := systems [nix .System ()]; ok {
115
+ return v , nil
116
+ }
117
+ if v , ok := systems ["x86_64-linux" ]; ok {
118
+ return v , nil
87
119
}
88
- for _ , v := range pkg . Systems {
120
+ for _ , v := range systems {
89
121
return v , nil
90
122
}
91
- return searcher. PackageInfo {}, fmt .Errorf ("no systems found for package %q" , pkg . Name )
123
+ return v , redact .Errorf ("no systems found" )
92
124
}
93
125
94
126
func buildLockSystemInfos (pkg * searcher.PackageVersion ) (map [string ]* SystemInfo , error ) {
0 commit comments