Skip to content

Commit 7ffb7b2

Browse files
committed
[run] Add --all-projects flag
1 parent 02917f4 commit 7ffb7b2

File tree

3 files changed

+87
-22
lines changed

3 files changed

+87
-22
lines changed
Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,71 @@
11
{
22
"lockfile_version": "1",
33
"packages": {
4+
"darwin.apple_sdk.frameworks.CoreServices": {
5+
"resolved": "github:NixOS/nixpkgs/3a05eebede89661660945da1f151959900903b6a?narHash=sha256-Ly2fBL1LscV%2BKyCqPRufUBuiw%2BzmWrlJzpWOWbahplg%3D#darwin.apple_sdk.frameworks.CoreServices",
6+
"source": "nixpkg",
7+
"systems": {
8+
"aarch64-darwin": {
9+
"outputs": [
10+
{
11+
"path": "/nix/store/mpq140x7nsx9gz73h4nfp9kpp297mshh-CoreServices-11.0",
12+
"default": true
13+
}
14+
]
15+
}
16+
}
17+
},
418
"elixir@latest": {
5-
"last_modified": "2024-11-28T07:51:56Z",
19+
"last_modified": "2024-12-27T03:08:00Z",
620
"plugin_version": "0.0.1",
7-
"resolved": "github:NixOS/nixpkgs/226216574ada4c3ecefcbbec41f39ce4655f78ef#elixir",
21+
"resolved": "github:NixOS/nixpkgs/7cc0bff31a3a705d3ac4fdceb030a17239412210#elixir",
822
"source": "devbox-search",
9-
"version": "1.17.3",
23+
"version": "1.18.1",
1024
"systems": {
1125
"aarch64-darwin": {
1226
"outputs": [
1327
{
1428
"name": "out",
15-
"path": "/nix/store/91w79z55qsjkhnbs3a21l3h27va98mf6-elixir-1.17.3",
29+
"path": "/nix/store/hdd9x34p0gplcl1bramq80lqi76xrd87-elixir-1.18.1",
1630
"default": true
1731
}
1832
],
19-
"store_path": "/nix/store/91w79z55qsjkhnbs3a21l3h27va98mf6-elixir-1.17.3"
33+
"store_path": "/nix/store/hdd9x34p0gplcl1bramq80lqi76xrd87-elixir-1.18.1"
2034
},
2135
"aarch64-linux": {
2236
"outputs": [
2337
{
2438
"name": "out",
25-
"path": "/nix/store/pz4hk0sp4zj76waaprlfdmvc4xdblz55-elixir-1.17.3",
39+
"path": "/nix/store/a4g29icpil9b1hsniqspz5k110h4df8v-elixir-1.18.1",
2640
"default": true
2741
}
2842
],
29-
"store_path": "/nix/store/pz4hk0sp4zj76waaprlfdmvc4xdblz55-elixir-1.17.3"
43+
"store_path": "/nix/store/a4g29icpil9b1hsniqspz5k110h4df8v-elixir-1.18.1"
3044
},
3145
"x86_64-darwin": {
3246
"outputs": [
3347
{
3448
"name": "out",
35-
"path": "/nix/store/gnjg57wv71svvqw7s3rxyjc6lkps2r95-elixir-1.17.3",
49+
"path": "/nix/store/b3h6f36zd4gjivb76lvvs6a9bi1mq9q8-elixir-1.18.1",
3650
"default": true
3751
}
3852
],
39-
"store_path": "/nix/store/gnjg57wv71svvqw7s3rxyjc6lkps2r95-elixir-1.17.3"
53+
"store_path": "/nix/store/b3h6f36zd4gjivb76lvvs6a9bi1mq9q8-elixir-1.18.1"
4054
},
4155
"x86_64-linux": {
4256
"outputs": [
4357
{
4458
"name": "out",
45-
"path": "/nix/store/rx7qr8bar4qldx6yg3njvm8hn84d3yyk-elixir-1.17.3",
59+
"path": "/nix/store/3zd200bq28mv3pdbii7rijzmb0gmhhs3-elixir-1.18.1",
4660
"default": true
4761
}
4862
],
49-
"store_path": "/nix/store/rx7qr8bar4qldx6yg3njvm8hn84d3yyk-elixir-1.17.3"
63+
"store_path": "/nix/store/3zd200bq28mv3pdbii7rijzmb0gmhhs3-elixir-1.18.1"
5064
}
5165
}
66+
},
67+
"github:NixOS/nixpkgs/nixpkgs-unstable": {
68+
"resolved": "github:NixOS/nixpkgs/3a05eebede89661660945da1f151959900903b6a?lastModified=1740547748&narHash=sha256-Ly2fBL1LscV%2BKyCqPRufUBuiw%2BzmWrlJzpWOWbahplg%3D"
5269
}
5370
}
5471
}

internal/boxcli/run.go

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ import (
99
"slices"
1010
"strings"
1111

12+
"github.com/pkg/errors"
1213
"github.com/samber/lo"
1314
"github.com/spf13/cobra"
1415
"github.com/spf13/pflag"
1516

17+
"go.jetify.com/devbox/internal/boxcli/multi"
1618
"go.jetify.com/devbox/internal/boxcli/usererr"
1719
"go.jetify.com/devbox/internal/devbox"
1820
"go.jetify.com/devbox/internal/devbox/devopt"
@@ -27,6 +29,7 @@ type runCmdFlags struct {
2729
pure bool
2830
listScripts bool
2931
recomputeEnv bool
32+
allProjects bool
3033
}
3134

3235
// runFlagDefaults are the flag default values that differ
@@ -65,24 +68,43 @@ func runCmd(defaults runFlagDefaults) *cobra.Command {
6568
)
6669
_ = command.Flags().MarkHidden("omit-nix-env")
6770
command.Flags().BoolVar(&flags.recomputeEnv, "recompute", true, "recompute environment if needed")
71+
command.Flags().BoolVar(
72+
&flags.allProjects,
73+
"all-projects",
74+
false,
75+
"run command in all projects in the working directory, recursively. If command is not found in any project, it will be skipped.",
76+
)
6877

6978
command.ValidArgs = listScripts(command, flags)
7079

7180
return command
7281
}
7382

7483
func listScripts(cmd *cobra.Command, flags runCmdFlags) []string {
75-
box, err := devbox.Open(&devopt.Opts{
84+
devboxOpts := &devopt.Opts{
7685
Dir: flags.config.path,
7786
Environment: flags.config.environment,
7887
Stderr: cmd.ErrOrStderr(),
7988
IgnoreWarnings: true,
80-
})
89+
}
90+
91+
if flags.allProjects {
92+
boxes, err := multi.Open(devboxOpts)
93+
if err != nil {
94+
slog.Error("failed to open devbox", "err", err)
95+
return nil
96+
}
97+
scripts := []string{}
98+
for _, box := range boxes {
99+
scripts = append(scripts, box.ListScripts()...)
100+
}
101+
return scripts
102+
}
103+
box, err := devbox.Open(devboxOpts)
81104
if err != nil {
82105
slog.Error("failed to open devbox", "err", err)
83106
return nil
84107
}
85-
86108
return box.ListScripts()
87109
}
88110

@@ -112,15 +134,25 @@ func runScriptCmd(cmd *cobra.Command, args []string, flags runCmdFlags) error {
112134
return err
113135
}
114136

115-
// Check the directory exists.
116-
box, err := devbox.Open(&devopt.Opts{
137+
boxes := []*devbox.Devbox{}
138+
devboxOpts := &devopt.Opts{
117139
Dir: path,
118140
Env: env,
119141
Environment: flags.config.environment,
120142
Stderr: cmd.ErrOrStderr(),
121-
})
122-
if err != nil {
123-
return redact.Errorf("error reading devbox.json: %w", err)
143+
}
144+
145+
if flags.allProjects {
146+
boxes, err = multi.Open(devboxOpts)
147+
if err != nil {
148+
return errors.WithStack(err)
149+
}
150+
} else {
151+
box, err := devbox.Open(devboxOpts)
152+
if err != nil {
153+
return redact.Errorf("error reading devbox.json: %w", err)
154+
}
155+
boxes = append(boxes, box)
124156
}
125157

126158
envOpts := devopt.EnvOptions{
@@ -140,8 +172,23 @@ func runScriptCmd(cmd *cobra.Command, args []string, flags runCmdFlags) error {
140172
Pure: flags.pure,
141173
SkipRecompute: !flags.recomputeEnv,
142174
}
143-
if err := box.RunScript(ctx, envOpts, script, scriptArgs); err != nil {
144-
return redact.Errorf("error running script %q in Devbox: %w", script, err)
175+
176+
if flags.allProjects {
177+
boxes = lo.Filter(boxes, func(box *devbox.Devbox, _ int) bool {
178+
return slices.Contains(box.ListScripts(), script)
179+
})
180+
}
181+
182+
for _, box := range boxes {
183+
ux.Finfof(
184+
cmd.ErrOrStderr(),
185+
"Running script %q on %s\n",
186+
script,
187+
box.ProjectDir(),
188+
)
189+
if err := box.RunScript(ctx, envOpts, script, scriptArgs); err != nil {
190+
return redact.Errorf("error running script %q in Devbox: %w", script, err)
191+
}
145192
}
146193
return nil
147194
}

internal/devbox/devbox.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,9 @@ func Open(opts *devopt.Opts) (*Devbox, error) {
165165
}
166166
ux.Fwarningf(
167167
os.Stderr, // Always stderr. box.writer should probably always be err.
168-
"Your devbox.json contains packages in legacy format. "+
168+
"Your devbox.json at %s contains packages in legacy format. "+
169169
"Please run `devbox %supdate` to update your devbox.json.\n",
170+
box.projectDir,
170171
lo.Ternary(box.projectDir == globalPath, "global ", ""),
171172
)
172173
}

0 commit comments

Comments
 (0)