Skip to content

Commit 987c28c

Browse files
committed
generate devpkg.Package from Config
1 parent 485ec44 commit 987c28c

File tree

3 files changed

+80
-21
lines changed

3 files changed

+80
-21
lines changed

internal/devconfig/packages.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,7 @@ type Packages struct {
3636
func (pkgs *Packages) VersionedNames() []string {
3737
result := make([]string, 0, len(pkgs.Collection))
3838
for _, p := range pkgs.Collection {
39-
name := p.name
40-
if p.Version != "" {
41-
name += "@" + p.Version
42-
}
43-
result = append(result, name)
39+
result = append(result, p.VersionedName())
4440
}
4541
return result
4642
}
@@ -159,6 +155,19 @@ func NewPackage(name string, values map[string]any) Package {
159155
}
160156
}
161157

158+
func (p *Package) VersionedName() string {
159+
name := p.name
160+
if p.Version != "" {
161+
name += "@" + p.Version
162+
}
163+
return name
164+
}
165+
166+
func (p *Package) IsEnabledOnPlatform() (bool, error) {
167+
// TODO savil. Next PR will update this implementation
168+
return true, nil
169+
}
170+
162171
func (p *Package) UnmarshalJSON(data []byte) error {
163172
// First, attempt to unmarshal as a version-only string
164173
var version string

internal/devpkg/package.go

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"go.jetpack.io/devbox/internal/boxcli/featureflag"
1919
"go.jetpack.io/devbox/internal/boxcli/usererr"
2020
"go.jetpack.io/devbox/internal/cuecfg"
21+
"go.jetpack.io/devbox/internal/devconfig"
2122
"go.jetpack.io/devbox/internal/lock"
2223
"go.jetpack.io/devbox/internal/nix"
2324
"go.jetpack.io/devbox/internal/vercheck"
@@ -46,6 +47,9 @@ type Package struct {
4647
// example: github:nixos/nixpkgs/5233fd2ba76a3accb5aaa999c00509a11fd0793c#hello
4748
Raw string
4849

50+
// isInstallable is true if the package is may be enabled on the current platform.
51+
isInstallable bool
52+
4953
normalizedPackageAttributePathCache string // memoized value from normalizedPackageAttributePath()
5054
}
5155

@@ -59,9 +63,26 @@ func PackageFromStrings(rawNames []string, l lock.Locker) []*Package {
5963
return packages
6064
}
6165

66+
func PackagesFromConfig(config *devconfig.Config, l lock.Locker) ([]*Package, error) {
67+
result := []*Package{}
68+
for _, pkg := range config.Packages.Collection {
69+
isInstallable, err := pkg.IsEnabledOnPlatform()
70+
if err != nil {
71+
return nil, err
72+
}
73+
result = append(result, newPackage(pkg.VersionedName(), isInstallable, l))
74+
}
75+
return result, nil
76+
}
77+
6278
// PackageFromString constructs Package from the raw name provided.
6379
// The raw name corresponds to a devbox package from the devbox.json config.
6480
func PackageFromString(raw string, locker lock.Locker) *Package {
81+
// For now, assume packages are installable by default
82+
return newPackage(raw, true /*isInstallable*/, locker)
83+
}
84+
85+
func newPackage(raw string, isInstallable bool, locker lock.Locker) *Package {
6586
// TODO: We should handle this error
6687
// TODO: URL might not be best representation since most packages are not urls
6788
pkgURL, _ := url.Parse(raw)
@@ -79,7 +100,7 @@ func PackageFromString(raw string, locker lock.Locker) *Package {
79100
pkgURL, _ = url.Parse(normalizedURL)
80101
}
81102

82-
return &Package{URL: *pkgURL, lockfile: locker, Raw: raw}
103+
return &Package{URL: *pkgURL, lockfile: locker, Raw: raw, isInstallable: isInstallable}
83104
}
84105

85106
// isLocal specifies whether this package is a local flake.
@@ -146,6 +167,12 @@ func (p *Package) URLForFlakeInput() string {
146167
return p.urlWithoutFragment()
147168
}
148169

170+
// IsInstallable returns whether this package is installable. Not to be confused
171+
// with the Installable() method which returns the corresponding nix concept.
172+
func (p *Package) IsInstallable() bool {
173+
return p.isInstallable
174+
}
175+
149176
// Installable for this package. Installable is a nix concept defined here:
150177
// https://nixos.org/manual/nix/stable/command-ref/new-cli/nix.html#installables
151178
func (p *Package) Installable() (string, error) {

internal/impl/devbox.go

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,14 @@ func Open(opts *devopt.Opts) (*Devbox, error) {
110110
)
111111
box.lockfile = lock
112112

113+
hasDeprecated, err := box.HasDeprecatedPackages()
114+
if err != nil {
115+
return nil, err
116+
}
117+
113118
if !opts.IgnoreWarnings &&
114119
!legacyPackagesWarningHasBeenShown &&
115-
box.HasDeprecatedPackages() {
120+
hasDeprecated {
116121
legacyPackagesWarningHasBeenShown = true
117122
globalPath, err := GlobalDataPath()
118123
if err != nil {
@@ -138,7 +143,11 @@ func (d *Devbox) Config() *devconfig.Config {
138143
}
139144

140145
func (d *Devbox) ConfigHash() (string, error) {
141-
pkgHashes := lo.Map(d.ConfigPackages(), func(i *devpkg.Package, _ int) string { return i.Hash() })
146+
pkgs, err := d.ConfigPackages()
147+
if err != nil {
148+
return "", err
149+
}
150+
pkgHashes := lo.Map(pkgs, func(i *devpkg.Package, _ int) string { return i.Hash() })
142151
includeHashes := lo.Map(d.Includes(), func(i plugin.Includable, _ int) string { return i.Hash() })
143152
h, err := d.cfg.Hash()
144153
if err != nil {
@@ -934,28 +943,35 @@ func (d *Devbox) nixFlakesFilePath() string {
934943

935944
// ConfigPackageNames returns the package names as defined in devbox.json
936945
func (d *Devbox) ConfigPackageNames() []string {
946+
// TODO savil: centralize implementation by calling d.ConfigPackages and getting pkg.Raw
937947
return d.cfg.Packages.VersionedNames()
938948
}
939949

940950
// InstallablePackageNames returns the names of packages that are to be installed
941951
func (d *Devbox) InstallablePackageNames() ([]string, error) {
942-
// TODO: next PR replaces this implementation
952+
// TODO savil. centralize implementation by calling d.InstallablePackages and getting pkg.Raw
943953
return d.cfg.Packages.VersionedNamesForPlatform()
944954
}
945955

946956
// ConfigPackages returns the packages that are defined in devbox.json
947957
// NOTE: the return type is different from devconfig.Packages
948-
func (d *Devbox) ConfigPackages() []*devpkg.Package {
949-
return devpkg.PackageFromStrings(d.ConfigPackageNames(), d.lockfile)
958+
func (d *Devbox) ConfigPackages() ([]*devpkg.Package, error) {
959+
pkgs, err := devpkg.PackagesFromConfig(d.cfg, d.lockfile)
960+
if err != nil {
961+
return nil, err
962+
}
963+
return pkgs, nil
950964
}
951965

952966
// InstallablePackages returns the packages that are to be installed
953967
func (d *Devbox) InstallablePackages() ([]*devpkg.Package, error) {
954-
names, err := d.InstallablePackageNames()
968+
pkgs, err := d.ConfigPackages()
955969
if err != nil {
956970
return nil, err
957971
}
958-
return devpkg.PackageFromStrings(names, d.lockfile), nil
972+
return lo.Filter(pkgs, func(pkg *devpkg.Package, _ int) bool {
973+
return pkg.IsInstallable()
974+
}), nil
959975
}
960976

961977
func (d *Devbox) Includes() []plugin.Includable {
@@ -968,21 +984,28 @@ func (d *Devbox) Includes() []plugin.Includable {
968984
return includes
969985
}
970986

971-
func (d *Devbox) HasDeprecatedPackages() bool {
972-
for _, pkg := range d.ConfigPackages() {
987+
func (d *Devbox) HasDeprecatedPackages() (bool, error) {
988+
pkgs, err := d.ConfigPackages()
989+
if err != nil {
990+
return false, err
991+
}
992+
for _, pkg := range pkgs {
973993
if pkg.IsLegacy() {
974-
return true
994+
return true, nil
975995
}
976996
}
977-
return false
997+
return false, nil
978998
}
979999

9801000
func (d *Devbox) findPackageByName(name string) (string, error) {
1001+
pkgs, err := d.ConfigPackages()
1002+
if err != nil {
1003+
return "", err
1004+
}
9811005
results := map[string]bool{}
982-
for _, pkg := range d.ConfigPackageNames() {
983-
i := devpkg.PackageFromString(pkg, d.lockfile)
984-
if i.String() == name || i.CanonicalName() == name {
985-
results[i.String()] = true
1006+
for _, pkg := range pkgs {
1007+
if pkg.String() == name || pkg.CanonicalName() == name {
1008+
results[pkg.String()] = true
9861009
}
9871010
}
9881011
if len(results) > 1 {

0 commit comments

Comments
 (0)