Skip to content

Commit b8ef803

Browse files
authored
Moved process-compose into a generic utilities Devbox project (#2122)
## Summary Moved process-compose into a generic utilities Devbox project. This PR deletes `addDevboxUtilityPackage` and `removeDevboxUtilityPackage`, since they're no longer used. ## Motivation #2106 ## How was it tested? 1. Manually deleted `~/.local/share/devbox/util` directory and verified that it is re-created when starting a service, and that process-compose is correctly added as a dependency with the binary present at the expected path. 2. Ensured that `devbox services up nginx` starts the service and that the process-compose UI is displayed correctly.
1 parent 3bb13c1 commit b8ef803

File tree

2 files changed

+56
-102
lines changed

2 files changed

+56
-102
lines changed

internal/devbox/devbox.go

Lines changed: 19 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
"os"
1414
"os/exec"
1515
"path/filepath"
16-
"regexp"
1716
"runtime/trace"
1817
"slices"
1918
"strconv"
@@ -24,29 +23,27 @@ import (
2423
"github.com/briandowns/spinner"
2524
"github.com/pkg/errors"
2625
"github.com/samber/lo"
27-
"go.jetpack.io/devbox/internal/cachehash"
28-
"go.jetpack.io/devbox/internal/devbox/envpath"
29-
"go.jetpack.io/devbox/internal/devbox/generate"
30-
"go.jetpack.io/devbox/internal/devpkg"
31-
"go.jetpack.io/devbox/internal/devpkg/pkgtype"
32-
"go.jetpack.io/devbox/internal/searcher"
33-
"go.jetpack.io/devbox/internal/shellgen"
34-
"go.jetpack.io/devbox/internal/telemetry"
35-
"go.jetpack.io/devbox/internal/vercheck"
36-
3726
"go.jetpack.io/devbox/internal/boxcli/usererr"
27+
"go.jetpack.io/devbox/internal/cachehash"
3828
"go.jetpack.io/devbox/internal/cmdutil"
3929
"go.jetpack.io/devbox/internal/conf"
4030
"go.jetpack.io/devbox/internal/debug"
4131
"go.jetpack.io/devbox/internal/devbox/devopt"
32+
"go.jetpack.io/devbox/internal/devbox/envpath"
33+
"go.jetpack.io/devbox/internal/devbox/generate"
4234
"go.jetpack.io/devbox/internal/devconfig"
35+
"go.jetpack.io/devbox/internal/devpkg"
36+
"go.jetpack.io/devbox/internal/devpkg/pkgtype"
4337
"go.jetpack.io/devbox/internal/envir"
4438
"go.jetpack.io/devbox/internal/fileutil"
4539
"go.jetpack.io/devbox/internal/lock"
4640
"go.jetpack.io/devbox/internal/nix"
4741
"go.jetpack.io/devbox/internal/plugin"
4842
"go.jetpack.io/devbox/internal/redact"
43+
"go.jetpack.io/devbox/internal/searcher"
4944
"go.jetpack.io/devbox/internal/services"
45+
"go.jetpack.io/devbox/internal/shellgen"
46+
"go.jetpack.io/devbox/internal/telemetry"
5047
"go.jetpack.io/devbox/internal/ux"
5148
)
5249

@@ -768,7 +765,12 @@ func (d *Devbox) StartProcessManager(
768765
}
769766
}
770767

771-
servicesProcessComposeOpts, err := d.configureProcessCompose(ctx, processComposeOpts)
768+
err = initDevboxUtilityProject(ctx, d.stderr)
769+
if err != nil {
770+
return err
771+
}
772+
773+
processComposeBinPath, err := utilityLookPath("process-compose")
772774
if err != nil {
773775
return err
774776
}
@@ -780,55 +782,14 @@ func (d *Devbox) StartProcessManager(
780782
requestedServices,
781783
svcs,
782784
d.projectDir,
783-
*servicesProcessComposeOpts,
785+
services.ProcessComposeOpts{
786+
BinPath: processComposeBinPath,
787+
Background: processComposeOpts.Background,
788+
ExtraFlags: processComposeOpts.ExtraFlags,
789+
},
784790
)
785791
}
786792

787-
func (d *Devbox) configureProcessCompose(ctx context.Context, processComposeOpts devopt.ProcessComposeOpts) (*services.ProcessComposeOpts, error) {
788-
processComposePath, err := utilityLookPath("process-compose")
789-
if err != nil {
790-
fmt.Fprintln(d.stderr, "Installing process-compose. This may take a minute but will only happen once.")
791-
if err = d.addDevboxUtilityPackage(ctx, "github:F1bonacc1/process-compose/"+processComposeTargetVersion); err != nil {
792-
return nil, err
793-
}
794-
795-
// re-lookup the path to process-compose
796-
processComposePath, err = utilityLookPath("process-compose")
797-
if err != nil {
798-
fmt.Fprintln(d.stderr, "failed to find process-compose after installing it.")
799-
return nil, err
800-
}
801-
}
802-
re := regexp.MustCompile(`(?m)Version:\s*(v\d*\.\d*\.\d*)`)
803-
pcVersionString, err := exec.Command(processComposePath, "version").Output()
804-
if err != nil {
805-
fmt.Fprintln(d.stderr, "failed to get process-compose version")
806-
return nil, err
807-
}
808-
809-
pcVersion := re.FindStringSubmatch(strings.TrimSpace(string(pcVersionString)))[1]
810-
811-
if vercheck.SemverCompare(pcVersion, processComposeTargetVersion) < 0 {
812-
fmt.Fprintln(d.stderr, "Upgrading process-compose to "+processComposeTargetVersion+"...")
813-
oldProcessComposePkg := "github:F1bonacc1/process-compose/" + pcVersion + "#defaultPackage." + nix.System()
814-
newProcessComposePkg := "github:F1bonacc1/process-compose/" + processComposeTargetVersion
815-
// Find the old process Compose package
816-
if err := d.removeDevboxUtilityPackage(ctx, oldProcessComposePkg); err != nil {
817-
return nil, err
818-
}
819-
820-
if err = d.addDevboxUtilityPackage(ctx, newProcessComposePkg); err != nil {
821-
return nil, err
822-
}
823-
}
824-
825-
return &services.ProcessComposeOpts{
826-
BinPath: processComposePath,
827-
Background: processComposeOpts.Background,
828-
ExtraFlags: processComposeOpts.ExtraFlags,
829-
}, nil
830-
}
831-
832793
// computeEnv computes the set of environment variables that define a Devbox
833794
// environment. The "devbox run" and "devbox shell" commands source these
834795
// variables into a shell before executing a command or showing an interactive

internal/devbox/util.go

Lines changed: 37 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5,73 +5,65 @@ package devbox
55

66
import (
77
"context"
8+
"io"
89
"io/fs"
910
"os"
1011
"path/filepath"
1112

1213
"github.com/pkg/errors"
13-
"go.jetpack.io/devbox/internal/devpkg"
14-
"go.jetpack.io/devbox/internal/nix"
1514

15+
"go.jetpack.io/devbox/internal/devbox/devopt"
1616
"go.jetpack.io/devbox/internal/xdg"
1717
)
1818

19-
// addDevboxUtilityPackage adds a package to the devbox utility profile.
20-
// It's used to install applications devbox might need, like process-compose
21-
// This is an alternative to a global install which would modify a user's
22-
// environment.
23-
func (d *Devbox) addDevboxUtilityPackage(ctx context.Context, pkgName string) error {
24-
pkg := devpkg.PackageFromStringWithDefaults(pkgName, d.lockfile)
25-
installables, err := pkg.Installables()
19+
const processComposeVersion = "1.5.0"
20+
21+
var utilProjectConfigPath string
22+
23+
func initDevboxUtilityProject(ctx context.Context, stderr io.Writer) error {
24+
devboxUtilityProjectPath, err := ensureDevboxUtilityConfig()
2625
if err != nil {
2726
return err
2827
}
29-
profilePath, err := utilityNixProfilePath()
28+
29+
box, err := Open(&devopt.Opts{
30+
Dir: devboxUtilityProjectPath,
31+
Stderr: stderr,
32+
})
3033
if err != nil {
34+
return errors.WithStack(err)
35+
}
36+
37+
// Add all utilities here.
38+
utilities := []string{
39+
"process-compose@" + processComposeVersion,
40+
}
41+
if err = box.Add(ctx, utilities, devopt.AddOpts{}); err != nil {
3142
return err
3243
}
3344

34-
for _, installable := range installables {
45+
return box.Install(ctx)
46+
}
3547

36-
err = nix.ProfileInstall(ctx, &nix.ProfileInstallArgs{
37-
Installable: installable,
38-
ProfilePath: profilePath,
39-
Writer: d.stderr,
40-
})
41-
if err != nil {
42-
return err
43-
}
48+
func ensureDevboxUtilityConfig() (string, error) {
49+
if utilProjectConfigPath != "" {
50+
return utilProjectConfigPath, nil
4451
}
45-
return nil
46-
}
4752

48-
func (d *Devbox) removeDevboxUtilityPackage(
49-
ctx context.Context, pkgName string,
50-
) error {
51-
pkg := devpkg.PackageFromStringWithDefaults(pkgName, d.lockfile)
52-
installables, err := pkg.Installables()
53+
path, err := utilityDataPath()
5354
if err != nil {
54-
return err
55+
return "", err
5556
}
5657

57-
utilityProfilePath, err := utilityNixProfilePath()
58+
_, err = InitConfig(path)
5859
if err != nil {
59-
return err
60+
return "", err
6061
}
6162

62-
for _, installable := range installables {
63-
storePaths, err := nix.StorePathsFromInstallable(ctx, installable, false)
64-
if err != nil {
65-
return err
66-
}
67-
68-
for _, storePath := range storePaths {
69-
if err = nix.ProfileRemove(utilityProfilePath, storePath); err != nil {
70-
return err
71-
}
72-
}
73-
}
74-
return nil
63+
// Avoids unnecessarily initializing the config again by caching the path
64+
utilProjectConfigPath = path
65+
66+
return path, nil
7567
}
7668

7769
func utilityLookPath(binName string) (string, error) {
@@ -97,13 +89,14 @@ func utilityNixProfilePath() (string, error) {
9789
if err != nil {
9890
return "", err
9991
}
100-
return filepath.Join(path, "profile"), nil
92+
return filepath.Join(path, ".devbox/nix/profile"), nil
10193
}
10294

10395
func utilityBinPath() (string, error) {
10496
nixProfilePath, err := utilityNixProfilePath()
10597
if err != nil {
10698
return "", err
10799
}
108-
return filepath.Join(nixProfilePath, "bin"), nil
100+
101+
return filepath.Join(nixProfilePath, "default/bin"), nil
109102
}

0 commit comments

Comments
 (0)