feat: Allow merging lock dependencies to tolerate a nil. This enables use of -safe-init and -intput=false; can write a dep lock file when init stops after downloading config-derived providers only.

pss/discovery-block-download-via-download-event-callbacks
Sarah French 2 weeks ago
parent 411840f9e8
commit e2cd45fa4b

@ -79,10 +79,20 @@ func (m *Meta) replaceLockedDependencies(new *depsfile.Locks) tfdiags.Diagnostic
// This method supports downloading providers in 2 steps, and is used during the second download step and
// while updating the dependency lock file.
func (m *Meta) mergeLockedDependencies(baseLocks, additionalLocks *depsfile.Locks) *depsfile.Locks {
if baseLocks == nil && additionalLocks == nil {
return depsfile.NewLocks() // empty locks
}
if additionalLocks == nil {
return baseLocks
}
if baseLocks == nil {
return additionalLocks
}
mergedLocks := baseLocks.DeepCopy()
// Here we know that there are two sets of locks to combine and return
// Append locks derived from the state to locks derived from config.
mergedLocks := baseLocks.DeepCopy()
for _, lock := range additionalLocks.AllProviders() {
match := mergedLocks.Provider(lock.Provider())
if match != nil {

@ -17,7 +17,6 @@ import (
// This tests combining locks from config and state. Locks derived from state are always unconstrained, i.e. no version constraint data,
// so this test
func Test_mergeLockedDependencies_config_and_state(t *testing.T) {
providerA := tfaddr.NewProvider(tfaddr.DefaultProviderRegistryHost, "my-org", "providerA")
providerB := tfaddr.NewProvider(tfaddr.DefaultProviderRegistryHost, "my-org", "providerB")
v1_0_0 := providerreqs.MustParseVersion("1.0.0")
@ -38,6 +37,37 @@ func Test_mergeLockedDependencies_config_and_state(t *testing.T) {
stateLocks: depsfile.NewLocks(),
expectedLocks: depsfile.NewLocks(),
},
"nil config locks": {
configLocks: nil,
stateLocks: func() *depsfile.Locks {
configLocks := depsfile.NewLocks()
configLocks.SetProvider(providerA, v1_0_0, versionConstraintv1, hashesProviderA)
return configLocks
}(),
expectedLocks: func() *depsfile.Locks {
combinedLocks := depsfile.NewLocks()
combinedLocks.SetProvider(providerA, v1_0_0, versionConstraintv1, hashesProviderA)
return combinedLocks
}(),
},
"nil state locks": {
configLocks: func() *depsfile.Locks {
configLocks := depsfile.NewLocks()
configLocks.SetProvider(providerA, v1_0_0, versionConstraintv1, hashesProviderA)
return configLocks
}(),
stateLocks: nil,
expectedLocks: func() *depsfile.Locks {
combinedLocks := depsfile.NewLocks()
combinedLocks.SetProvider(providerA, v1_0_0, versionConstraintv1, hashesProviderA)
return combinedLocks
}(),
},
"all nil locks": {
configLocks: nil,
stateLocks: nil,
expectedLocks: depsfile.NewLocks(),
},
"when provider only described in config, output locks have matching constraints": {
configLocks: func() *depsfile.Locks {
configLocks := depsfile.NewLocks()

Loading…
Cancel
Save