Skip to content

Commit 6788172

Browse files
committed
[Refactor ensureStateIsUpToDate] split into two modes for when to recompute state
1 parent 63093e2 commit 6788172

File tree

3 files changed

+51
-18
lines changed

3 files changed

+51
-18
lines changed

internal/devbox/packages.go

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -255,13 +255,14 @@ func (d *Devbox) ensureStateIsUpToDate(ctx context.Context, mode installMode) er
255255
defer trace.StartRegion(ctx, "devboxEnsureStateIsUpToDate").End()
256256
defer debug.FunctionTimer().End()
257257

258-
// if mode is install or uninstall, then we need to update the nix-profile
259-
// and lockfile, so we must continue below.
260258
upToDate, err := d.lockfile.IsUpToDateAndInstalled()
261259
if err != nil {
262260
return err
263261
}
264262

263+
// if mode is install or uninstall, then we need to compute some state
264+
// like updating the flake or installing packages locally, so must continue
265+
// below
265266
if mode == ensure {
266267
// if mode is ensure and we are up to date, then we can skip the rest
267268
if upToDate {
@@ -270,6 +271,48 @@ func (d *Devbox) ensureStateIsUpToDate(ctx context.Context, mode installMode) er
270271
fmt.Fprintln(d.stderr, "Ensuring packages are installed.")
271272
}
272273

274+
recomputeState := mode == ensure || d.IsEnvEnabled()
275+
if recomputeState {
276+
if err := d.recomputeState(ctx, mode); err != nil {
277+
return err
278+
}
279+
} else {
280+
// TODO: in the next PR, we will only `nix build` the packages that are being
281+
// added or updated. For now, we continue to call recomputeState here.
282+
if err := d.recomputeState(ctx, mode); err != nil {
283+
return err
284+
}
285+
}
286+
287+
// If we're in a devbox shell (global or project), then the environment might
288+
// be out of date after the user installs something. If have direnv active
289+
// it should reload automatically so we don't need to refresh.
290+
if d.IsEnvEnabled() && !upToDate && !d.IsDirenvActive() {
291+
ux.Fwarning(
292+
d.stderr,
293+
"Your shell environment may be out of date. Run `%s` to update it.\n",
294+
d.refreshAliasOrCommand(),
295+
)
296+
}
297+
298+
if err := d.lockfile.Save(); err != nil {
299+
return err
300+
}
301+
302+
// If we are recomputing state, then we need to update the local.lock file.
303+
// If not, we leave the local.lock in a stale state.
304+
if recomputeState {
305+
return d.lockfile.UpdateAndSaveLocalLock()
306+
}
307+
return nil
308+
}
309+
310+
// recomputeState updates the local state comprising of:
311+
// - plugins directories
312+
// - devbox.lock file
313+
// - the generated flake
314+
// - the nix-profile
315+
func (d *Devbox) recomputeState(ctx context.Context, mode installMode) error {
273316
// Create plugin directories first because packages might need them
274317
for _, pkg := range d.InstallablePackages() {
275318
if err := d.PluginManager().Create(pkg); err != nil {
@@ -310,18 +353,7 @@ func (d *Devbox) ensureStateIsUpToDate(ctx context.Context, mode installMode) er
310353
}
311354
}
312355

313-
// If we're in a devbox shell (global or project), then the environment might
314-
// be out of date after the user installs something. If have direnv active
315-
// it should reload automatically so we don't need to refresh.
316-
if d.IsEnvEnabled() && !upToDate && !d.IsDirenvActive() {
317-
ux.Fwarning(
318-
d.stderr,
319-
"Your shell environment may be out of date. Run `%s` to update it.\n",
320-
d.refreshAliasOrCommand(),
321-
)
322-
}
323-
324-
return d.lockfile.Save()
356+
return nil
325357
}
326358

327359
func (d *Devbox) profilePath() (string, error) {

internal/lock/lockfile.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,10 @@ func (f *File) ForceResolve(pkg string) (*Package, error) {
9898
}
9999

100100
func (f *File) Save() error {
101-
if err := cuecfg.WriteFile(lockFilePath(f.devboxProject), f); err != nil {
102-
return err
103-
}
101+
return cuecfg.WriteFile(lockFilePath(f.devboxProject), f)
102+
}
103+
104+
func (f *File) UpdateAndSaveLocalLock() error {
104105
return updateLocal(f.devboxProject)
105106
}
106107

internal/plugin/plugin.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ func (m *Manager) create(pkg Includable, locked *lock.Package) error {
124124
locked.PluginVersion = cfg.Version
125125
}
126126

127-
return m.lockfile.Save()
127+
return nil
128128
}
129129

130130
func (m *Manager) createFile(

0 commit comments

Comments
 (0)