Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 15 additions & 5 deletions internal/boxcli/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ import (
)

type updateCmdFlags struct {
config configFlags
sync bool
config configFlags
sync bool
ReferenceLockFilePath string
}

func updateCmd() *cobra.Command {
Expand All @@ -39,7 +40,15 @@ func updateCmd() *cobra.Command {
"sync-lock",
false,
"Sync all devbox.lock dependencies in multiple projects. "+
"Dependencies will sync to the latest local version.",
"Dependencies will sync to the latest resolved local version.",
)
command.Flags().StringVar(
&flags.ReferenceLockFilePath,
"sync-lock-reference",
"",
"Path to a devbox.lock file to use as a reference when syncing lockfiles. "+
"If none is provided then most recent last modified dependency is used. "+
"Must be used with --sync-lock flag.",
)
return command
}
Expand All @@ -58,7 +67,8 @@ func updateCmdFunc(cmd *cobra.Command, args []string, flags *updateCmdFlags) err
}

return box.Update(cmd.Context(), devopt.UpdateOpts{
Pkgs: args,
Sync: flags.sync,
Pkgs: args,
ReferenceLockFilePath: flags.ReferenceLockFilePath,
Sync: flags.sync,
})
}
5 changes: 3 additions & 2 deletions internal/impl/devopt/devboxopts.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ type Credentials struct {
}

type UpdateOpts struct {
Pkgs []string
Sync bool
Pkgs []string
ReferenceLockFilePath string
Sync bool
}
2 changes: 1 addition & 1 deletion internal/impl/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import (

func (d *Devbox) Update(ctx context.Context, opts devopt.UpdateOpts) error {
if opts.Sync {
return lock.SyncLockfiles()
return lock.SyncLockfiles(opts)
}

inputs, err := d.inputsToUpdate(opts.Pkgs...)
Expand Down
31 changes: 21 additions & 10 deletions internal/lock/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,36 +8,47 @@ import (

"go.jetpack.io/devbox/internal/cuecfg"
"go.jetpack.io/devbox/internal/debug"
"go.jetpack.io/devbox/internal/impl/devopt"
)

func SyncLockfiles() error {
func SyncLockfiles(opts devopt.UpdateOpts) error {
lockfilePaths, err := collectLockfiles()
if err != nil {
return err
}

latestPackages, err := latestPackages(lockfilePaths)
preferredPackages, err := latestPackages(lockfilePaths)
if err != nil {
return err
}

if opts.ReferenceLockFilePath != "" {
var referenceLockFile File
if err := cuecfg.ParseFile(opts.ReferenceLockFilePath, &referenceLockFile); err != nil {
return err
}
for key, pkg := range referenceLockFile.Packages {
preferredPackages[key] = pkg
}
}

for _, lockfilePath := range lockfilePaths {
var lockFile File
if err := cuecfg.ParseFile(lockfilePath, &lockFile); err != nil {
return err
}

changed := false
for key, latestPkg := range latestPackages {
for key, preferredPkg := range preferredPackages {
if pkg, exists := lockFile.Packages[key]; exists {
if pkg.LastModified != latestPkg.LastModified {
lockFile.Packages[key].AllowInsecure = latestPkg.AllowInsecure
lockFile.Packages[key].LastModified = latestPkg.LastModified
if pkg.LastModified != preferredPkg.LastModified {
lockFile.Packages[key].AllowInsecure = preferredPkg.AllowInsecure
lockFile.Packages[key].LastModified = preferredPkg.LastModified
// PluginVersion is intentionally omitted
lockFile.Packages[key].Resolved = latestPkg.Resolved
lockFile.Packages[key].Source = latestPkg.Source
lockFile.Packages[key].Version = latestPkg.Version
lockFile.Packages[key].Systems = latestPkg.Systems
lockFile.Packages[key].Resolved = preferredPkg.Resolved
lockFile.Packages[key].Source = preferredPkg.Source
lockFile.Packages[key].Version = preferredPkg.Version
lockFile.Packages[key].Systems = preferredPkg.Systems
changed = true
}
}
Expand Down