cli: Only rewrite provider locks file if changed

If the provider locks have not changed, there is no need to rewrite the
locks file. Preventing this needless rewrite should allow Terraform to
operate in a read-only directory, so long as the provider requirements
don't change.
This commit is contained in:
Alisdair McDiarmid 2021-03-29 16:03:29 -04:00
parent 340543d122
commit 786d99207e
2 changed files with 10 additions and 8 deletions

View File

@ -798,16 +798,11 @@ Terraform has made some changes to the provider dependency selections recorded
in the .terraform.lock.hcl file. Review those changes and commit them to your in the .terraform.lock.hcl file. Review those changes and commit them to your
version control system if they represent changes you intended to make.`)) version control system if they represent changes you intended to make.`))
} }
moreDiags = c.replaceLockedDependencies(newLocks)
diags = diags.Append(moreDiags)
} }
// TODO: Check whether newLocks is different from previousLocks and mention
// in the UI if so. We should emit a different message if previousLocks was
// empty, because that indicates we were creating a lock file for the first
// time and so we need to introduce the user to the idea of it.
moreDiags = c.replaceLockedDependencies(newLocks)
diags = diags.Append(moreDiags)
return true, false, diags return true, false, diags
} }

View File

@ -1618,6 +1618,13 @@ provider "registry.terraform.io/hashicorp/test" {
if diff := cmp.Diff(wantLockFile, string(buf)); diff != "" { if diff := cmp.Diff(wantLockFile, string(buf)); diff != "" {
t.Errorf("wrong dependency lock file contents\n%s", diff) t.Errorf("wrong dependency lock file contents\n%s", diff)
} }
// Make the local directory read-only, and verify that rerunning init
// succeeds, to ensure that we don't try to rewrite an unchanged lock file
os.Chmod(".", 0555)
if code := c.Run(args); code != 0 {
t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
}
} }
func TestInit_providerLockFileReadonly(t *testing.T) { func TestInit_providerLockFileReadonly(t *testing.T) {