Skip to content

Commit 3e1be89

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

File tree

3 files changed

+53
-18
lines changed

3 files changed

+53
-18
lines changed

internal/devbox/packages.go

Lines changed: 45 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,47 @@ 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 recomputeState {
299+
if err := d.lockfile.Save(); err != nil {
300+
return err
301+
}
302+
return d.lockfile.UpdateAndSaveLocalLock()
303+
}
304+
// if we are not recomputing state, then we are only updating the lockfile
305+
// and we do not update the local.lock file
306+
return d.lockfile.Save()
307+
}
308+
309+
// recomputeState updates the local state comprising of:
310+
// - plugins directories
311+
// - devbox.lock file
312+
// - the generated flake
313+
// - the nix-profile
314+
func (d *Devbox) recomputeState(ctx context.Context, mode installMode) error {
273315
// Create plugin directories first because packages might need them
274316
for _, pkg := range d.InstallablePackages() {
275317
if err := d.PluginManager().Create(pkg); err != nil {
@@ -310,18 +352,7 @@ func (d *Devbox) ensureStateIsUpToDate(ctx context.Context, mode installMode) er
310352
}
311353
}
312354

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()
355+
return nil
325356
}
326357

327358
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: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,10 @@ func (m *Manager) create(pkg Includable, locked *lock.Package) error {
124124
locked.PluginVersion = cfg.Version
125125
}
126126

127-
return m.lockfile.Save()
127+
if err := m.lockfile.Save(); err != nil {
128+
return err
129+
}
130+
return m.lockfile.UpdateAndSaveLocalLock()
128131
}
129132

130133
func (m *Manager) createFile(

0 commit comments

Comments
 (0)