Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package terraform for openSUSE:Factory checked in at 2022-07-18 18:37:45 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/terraform (Old) and /work/SRC/openSUSE:Factory/.terraform.new.1523 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "terraform" Mon Jul 18 18:37:45 2022 rev:37 rq:989978 version:1.2.5 Changes: -------- --- /work/SRC/openSUSE:Factory/terraform/terraform.changes 2022-07-04 11:32:54.516026376 +0200 +++ /work/SRC/openSUSE:Factory/.terraform.new.1523/terraform.changes 2022-07-18 18:37:46.546103661 +0200 @@ -1,0 +2,8 @@ +Sat Jul 16 19:11:52 UTC 2022 - Johannes Kastl <ka...@b1-systems.de> + +- update to 1.2.5: + * BUG FIXES: + - Report correct error message when a prerelease field is included in the required_version global constraint. (#31331) + - Fix case when extra blank lines were inserted into the plan for unchanged blocks. (#31330) + +------------------------------------------------------------------- Old: ---- terraform-1.2.4.obscpio terraform-1.2.4.tar.gz New: ---- terraform-1.2.5.obscpio terraform-1.2.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ terraform.spec ++++++ --- /var/tmp/diff_new_pack.0sT0wg/_old 2022-07-18 18:37:47.786105551 +0200 +++ /var/tmp/diff_new_pack.0sT0wg/_new 2022-07-18 18:37:47.790105558 +0200 @@ -17,7 +17,7 @@ Name: terraform -Version: 1.2.4 +Version: 1.2.5 Release: 0 Summary: Tool for building infrastructure safely and efficiently License: MPL-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.0sT0wg/_old 2022-07-18 18:37:47.830105618 +0200 +++ /var/tmp/diff_new_pack.0sT0wg/_new 2022-07-18 18:37:47.834105624 +0200 @@ -3,8 +3,8 @@ <param name="url">https://github.com/hashicorp/terraform</param> <param name="scm">git</param> <param name="filename">terraform</param> - <param name="versionformat">1.2.4</param> - <param name="revision">v1.2.4</param> + <param name="versionformat">1.2.5</param> + <param name="revision">v1.2.5</param> <param name="exclude">.git</param> </service> <service name="tar" mode="disabled"/> @@ -16,7 +16,7 @@ <param name="basename">terraform</param> </service> <service name="go_modules" mode="disabled"> - <param name="archive">terraform-1.2.4.tar.gz</param> + <param name="archive">terraform-1.2.5.tar.gz</param> </service> </services> ++++++ terraform-1.2.4.obscpio -> terraform-1.2.5.obscpio ++++++ /work/SRC/openSUSE:Factory/terraform/terraform-1.2.4.obscpio /work/SRC/openSUSE:Factory/.terraform.new.1523/terraform-1.2.5.obscpio differ: char 49, line 1 ++++++ terraform-1.2.4.tar.gz -> terraform-1.2.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/CHANGELOG.md new/terraform-1.2.5/CHANGELOG.md --- old/terraform-1.2.4/CHANGELOG.md 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/CHANGELOG.md 2022-07-13 12:14:18.000000000 +0200 @@ -1,3 +1,10 @@ +## 1.2.5 (July 13, 2022) + +BUG FIXES: + +* Report correct error message when a prerelease field is included in the `required_version` global constraint. ([#31331](https://github.com/hashicorp/terraform/issues/31331)) +* Fix case when extra blank lines were inserted into the plan for unchanged blocks. ([#31330](https://github.com/hashicorp/terraform/issues/31330)) + ## 1.2.4 (June 29, 2022) ENHANCEMENTS: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/go.mod new/terraform-1.2.5/go.mod --- old/terraform-1.2.4/go.mod 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/go.mod 2022-07-13 12:14:18.000000000 +0200 @@ -43,7 +43,7 @@ github.com/hashicorp/go-retryablehttp v0.7.0 github.com/hashicorp/go-tfe v1.0.0 github.com/hashicorp/go-uuid v1.0.2 - github.com/hashicorp/go-version v1.3.0 + github.com/hashicorp/go-version v1.6.0 github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f github.com/hashicorp/hcl/v2 v2.12.0 github.com/hashicorp/terraform-config-inspect v0.0.0-20210209133302-4fd17a0faac2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/go.sum new/terraform-1.2.5/go.sum --- old/terraform-1.2.4/go.sum 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/go.sum 2022-07-13 12:14:18.000000000 +0200 @@ -428,8 +428,9 @@ github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.3.0 h1:McDWVJIU/y+u1BRV06dPaLfLCaT7fUTJLp5r04x7iNw= github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/internal/command/fmt.go new/terraform-1.2.5/internal/command/fmt.go --- old/terraform-1.2.4/internal/command/fmt.go 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/internal/command/fmt.go 2022-07-13 12:14:18.000000000 +0200 @@ -528,15 +528,18 @@ func (c *FmtCommand) Help() string { helpText := ` -Usage: terraform [global options] fmt [options] [DIR] +Usage: terraform [global options] fmt [options] [TARGET] - Rewrites all Terraform configuration files to a canonical format. Both - configuration files (.tf) and variables files (.tfvars) are updated. - JSON files (.tf.json or .tfvars.json) are not modified. - - If DIR is not specified then the current working directory will be used. - If DIR is "-" then content will be read from STDIN. The given content must - be in the Terraform language native syntax; JSON is not supported. + Rewrites all Terraform configuration files to a canonical format. Both + configuration files (.tf) and variables files (.tfvars) are updated. + JSON files (.tf.json or .tfvars.json) are not modified. + + If TARGET is not specified, the command uses the current working directory. + If TARGET is a file, the command only uses the specified file. If TARGET + is "-" then the command reads from STDIN. + + The content must be in the Terraform language native syntax; JSON is not + supported. Options: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/internal/command/format/diff.go new/terraform-1.2.5/internal/command/format/diff.go --- old/terraform-1.2.4/internal/command/format/diff.go 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/internal/command/format/diff.go 2022-07-13 12:14:18.000000000 +0200 @@ -310,7 +310,7 @@ if result.skippedBlocks == 1 { noun = "block" } - p.buf.WriteString("\n") + p.buf.WriteString("\n\n") p.buf.WriteString(strings.Repeat(" ", indent+2)) p.buf.WriteString(fmt.Sprintf(p.color.Color("[dark_gray]# (%d unchanged %s hidden)[reset]"), result.skippedBlocks, noun)) } @@ -326,8 +326,6 @@ path cty.Path, result *blockBodyDiffResult) bool { - blankBeforeBlocks := false - attrNames := make([]string, 0, len(attrsS)) displayAttrNames := make(map[string]string, len(attrsS)) attrNameLen := 0 @@ -349,8 +347,8 @@ } } sort.Strings(attrNames) - if len(attrNames) > 0 { - blankBeforeBlocks = true + if len(attrNames) == 0 { + return false } for _, name := range attrNames { @@ -365,7 +363,7 @@ } } - return blankBeforeBlocks + return true } // getPlanActionAndShow returns the action value @@ -754,10 +752,7 @@ action = plans.Update } - if blankBefore { - p.buf.WriteRune('\n') - } - skipped := p.writeNestedBlockDiff(name, nil, &blockS.Block, action, old, new, indent, path) + skipped := p.writeNestedBlockDiff(name, nil, &blockS.Block, action, old, new, indent, blankBefore, path) if skipped { return 1 } @@ -790,10 +785,7 @@ commonLen = len(newItems) } - if blankBefore && (len(oldItems) > 0 || len(newItems) > 0) { - p.buf.WriteRune('\n') - } - + blankBeforeInner := blankBefore for i := 0; i < commonLen; i++ { path := append(path, cty.IndexStep{Key: cty.NumberIntVal(int64(i))}) oldItem := oldItems[i] @@ -802,27 +794,33 @@ if oldItem.RawEquals(newItem) { action = plans.NoOp } - skipped := p.writeNestedBlockDiff(name, nil, &blockS.Block, action, oldItem, newItem, indent, path) + skipped := p.writeNestedBlockDiff(name, nil, &blockS.Block, action, oldItem, newItem, indent, blankBeforeInner, path) if skipped { skippedBlocks++ + } else { + blankBeforeInner = false } } for i := commonLen; i < len(oldItems); i++ { path := append(path, cty.IndexStep{Key: cty.NumberIntVal(int64(i))}) oldItem := oldItems[i] newItem := cty.NullVal(oldItem.Type()) - skipped := p.writeNestedBlockDiff(name, nil, &blockS.Block, plans.Delete, oldItem, newItem, indent, path) + skipped := p.writeNestedBlockDiff(name, nil, &blockS.Block, plans.Delete, oldItem, newItem, indent, blankBeforeInner, path) if skipped { skippedBlocks++ + } else { + blankBeforeInner = false } } for i := commonLen; i < len(newItems); i++ { path := append(path, cty.IndexStep{Key: cty.NumberIntVal(int64(i))}) newItem := newItems[i] oldItem := cty.NullVal(newItem.Type()) - skipped := p.writeNestedBlockDiff(name, nil, &blockS.Block, plans.Create, oldItem, newItem, indent, path) + skipped := p.writeNestedBlockDiff(name, nil, &blockS.Block, plans.Create, oldItem, newItem, indent, blankBeforeInner, path) if skipped { skippedBlocks++ + } else { + blankBeforeInner = false } } case configschema.NestingSet: @@ -845,10 +843,7 @@ allItems = append(allItems, newItems...) all := cty.SetVal(allItems) - if blankBefore { - p.buf.WriteRune('\n') - } - + blankBeforeInner := blankBefore for it := all.ElementIterator(); it.Next(); { _, val := it.Element() var action plans.Action @@ -871,9 +866,11 @@ newValue = val } path := append(path, cty.IndexStep{Key: val}) - skipped := p.writeNestedBlockDiff(name, nil, &blockS.Block, action, oldValue, newValue, indent, path) + skipped := p.writeNestedBlockDiff(name, nil, &blockS.Block, action, oldValue, newValue, indent, blankBeforeInner, path) if skipped { skippedBlocks++ + } else { + blankBeforeInner = false } } @@ -904,10 +901,7 @@ } sort.Strings(allKeysOrder) - if blankBefore { - p.buf.WriteRune('\n') - } - + blankBeforeInner := blankBefore for _, k := range allKeysOrder { var action plans.Action oldValue := oldItems[k] @@ -926,9 +920,11 @@ } path := append(path, cty.IndexStep{Key: cty.StringVal(k)}) - skipped := p.writeNestedBlockDiff(name, &k, &blockS.Block, action, oldValue, newValue, indent, path) + skipped := p.writeNestedBlockDiff(name, &k, &blockS.Block, action, oldValue, newValue, indent, blankBeforeInner, path) if skipped { skippedBlocks++ + } else { + blankBeforeInner = false } } } @@ -974,11 +970,15 @@ p.buf.WriteString("}") } -func (p *blockBodyDiffPrinter) writeNestedBlockDiff(name string, label *string, blockS *configschema.Block, action plans.Action, old, new cty.Value, indent int, path cty.Path) bool { +func (p *blockBodyDiffPrinter) writeNestedBlockDiff(name string, label *string, blockS *configschema.Block, action plans.Action, old, new cty.Value, indent int, blankBefore bool, path cty.Path) bool { if action == plans.NoOp && !p.verbose { return true } + if blankBefore { + p.buf.WriteRune('\n') + } + p.buf.WriteString("\n") p.buf.WriteString(strings.Repeat(" ", indent)) p.writeActionSymbol(action) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/internal/command/format/diff_test.go new/terraform-1.2.5/internal/command/format/diff_test.go --- old/terraform-1.2.4/internal/command/format/diff_test.go 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/internal/command/format/diff_test.go 2022-07-13 12:14:18.000000000 +0200 @@ -3744,6 +3744,7 @@ + new_field = "new_value" + volume_type = "gp2" } + # (1 unchanged block hidden) } `, @@ -3809,6 +3810,7 @@ ~ root_block_device "a" { # forces replacement ~ volume_type = "gp2" -> "different" } + # (1 unchanged block hidden) } `, @@ -3973,6 +3975,599 @@ } `, }, + "in-place update - multiple unchanged blocks": { + Action: plans.Update, + Mode: addrs.ManagedResourceMode, + Before: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-BEFORE"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + After: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-AFTER"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + RequiredReplace: cty.NewPathSet(), + Schema: testSchema(configschema.NestingMap), + ExpectedOutput: ` # test_instance.example will be updated in-place + ~ resource "test_instance" "example" { + ~ ami = "ami-BEFORE" -> "ami-AFTER" + id = "i-02ae66f368e8518a9" + # (1 unchanged attribute hidden) + + # (2 unchanged blocks hidden) + } +`, + }, + "in-place update - multiple blocks first changed": { + Action: plans.Update, + Mode: addrs.ManagedResourceMode, + Before: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-BEFORE"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + After: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-AFTER"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp3"), + }), + }), + }), + RequiredReplace: cty.NewPathSet(), + Schema: testSchema(configschema.NestingMap), + ExpectedOutput: ` # test_instance.example will be updated in-place + ~ resource "test_instance" "example" { + ~ ami = "ami-BEFORE" -> "ami-AFTER" + id = "i-02ae66f368e8518a9" + # (1 unchanged attribute hidden) + + ~ root_block_device "b" { + ~ volume_type = "gp2" -> "gp3" + } + + # (1 unchanged block hidden) + } +`, + }, + "in-place update - multiple blocks second changed": { + Action: plans.Update, + Mode: addrs.ManagedResourceMode, + Before: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-BEFORE"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + After: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-AFTER"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp3"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + RequiredReplace: cty.NewPathSet(), + Schema: testSchema(configschema.NestingMap), + ExpectedOutput: ` # test_instance.example will be updated in-place + ~ resource "test_instance" "example" { + ~ ami = "ami-BEFORE" -> "ami-AFTER" + id = "i-02ae66f368e8518a9" + # (1 unchanged attribute hidden) + + ~ root_block_device "a" { + ~ volume_type = "gp2" -> "gp3" + } + + # (1 unchanged block hidden) + } +`, + }, + "in-place update - multiple blocks changed": { + Action: plans.Update, + Mode: addrs.ManagedResourceMode, + Before: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-BEFORE"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + After: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-AFTER"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp3"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp3"), + }), + }), + }), + RequiredReplace: cty.NewPathSet(), + Schema: testSchema(configschema.NestingMap), + ExpectedOutput: ` # test_instance.example will be updated in-place + ~ resource "test_instance" "example" { + ~ ami = "ami-BEFORE" -> "ami-AFTER" + id = "i-02ae66f368e8518a9" + # (1 unchanged attribute hidden) + + ~ root_block_device "a" { + ~ volume_type = "gp2" -> "gp3" + } + ~ root_block_device "b" { + ~ volume_type = "gp2" -> "gp3" + } + } +`, + }, + "in-place update - multiple different unchanged blocks": { + Action: plans.Update, + Mode: addrs.ManagedResourceMode, + Before: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-BEFORE"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + "leaf_block_device": cty.MapVal(map[string]cty.Value{ + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + After: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-AFTER"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + "leaf_block_device": cty.MapVal(map[string]cty.Value{ + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + RequiredReplace: cty.NewPathSet(), + Schema: testSchemaMultipleBlocks(configschema.NestingMap), + ExpectedOutput: ` # test_instance.example will be updated in-place + ~ resource "test_instance" "example" { + ~ ami = "ami-BEFORE" -> "ami-AFTER" + id = "i-02ae66f368e8518a9" + # (1 unchanged attribute hidden) + + # (2 unchanged blocks hidden) + } +`, + }, + "in-place update - multiple different blocks first changed": { + Action: plans.Update, + Mode: addrs.ManagedResourceMode, + Before: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-BEFORE"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + "leaf_block_device": cty.MapVal(map[string]cty.Value{ + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + After: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-AFTER"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + "leaf_block_device": cty.MapVal(map[string]cty.Value{ + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp3"), + }), + }), + }), + RequiredReplace: cty.NewPathSet(), + Schema: testSchemaMultipleBlocks(configschema.NestingMap), + ExpectedOutput: ` # test_instance.example will be updated in-place + ~ resource "test_instance" "example" { + ~ ami = "ami-BEFORE" -> "ami-AFTER" + id = "i-02ae66f368e8518a9" + # (1 unchanged attribute hidden) + + ~ leaf_block_device "b" { + ~ volume_type = "gp2" -> "gp3" + } + + # (1 unchanged block hidden) + } +`, + }, + "in-place update - multiple different blocks second changed": { + Action: plans.Update, + Mode: addrs.ManagedResourceMode, + Before: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-BEFORE"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + "leaf_block_device": cty.MapVal(map[string]cty.Value{ + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + After: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-AFTER"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp3"), + }), + }), + "leaf_block_device": cty.MapVal(map[string]cty.Value{ + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + RequiredReplace: cty.NewPathSet(), + Schema: testSchemaMultipleBlocks(configschema.NestingMap), + ExpectedOutput: ` # test_instance.example will be updated in-place + ~ resource "test_instance" "example" { + ~ ami = "ami-BEFORE" -> "ami-AFTER" + id = "i-02ae66f368e8518a9" + # (1 unchanged attribute hidden) + + ~ root_block_device "a" { + ~ volume_type = "gp2" -> "gp3" + } + + # (1 unchanged block hidden) + } +`, + }, + "in-place update - multiple different blocks changed": { + Action: plans.Update, + Mode: addrs.ManagedResourceMode, + Before: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-BEFORE"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + "leaf_block_device": cty.MapVal(map[string]cty.Value{ + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + After: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-AFTER"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp3"), + }), + }), + "leaf_block_device": cty.MapVal(map[string]cty.Value{ + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp3"), + }), + }), + }), + RequiredReplace: cty.NewPathSet(), + Schema: testSchemaMultipleBlocks(configschema.NestingMap), + ExpectedOutput: ` # test_instance.example will be updated in-place + ~ resource "test_instance" "example" { + ~ ami = "ami-BEFORE" -> "ami-AFTER" + id = "i-02ae66f368e8518a9" + # (1 unchanged attribute hidden) + + ~ leaf_block_device "b" { + ~ volume_type = "gp2" -> "gp3" + } + + ~ root_block_device "a" { + ~ volume_type = "gp2" -> "gp3" + } + } +`, + }, + "in-place update - mixed blocks unchanged": { + Action: plans.Update, + Mode: addrs.ManagedResourceMode, + Before: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-BEFORE"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + "leaf_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + After: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-AFTER"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + "leaf_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + RequiredReplace: cty.NewPathSet(), + Schema: testSchemaMultipleBlocks(configschema.NestingMap), + ExpectedOutput: ` # test_instance.example will be updated in-place + ~ resource "test_instance" "example" { + ~ ami = "ami-BEFORE" -> "ami-AFTER" + id = "i-02ae66f368e8518a9" + # (1 unchanged attribute hidden) + + # (4 unchanged blocks hidden) + } +`, + }, + "in-place update - mixed blocks changed": { + Action: plans.Update, + Mode: addrs.ManagedResourceMode, + Before: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-BEFORE"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + "leaf_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + }), + }), + After: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("i-02ae66f368e8518a9"), + "ami": cty.StringVal("ami-AFTER"), + "disks": cty.MapVal(map[string]cty.Value{ + "disk_a": cty.ObjectVal(map[string]cty.Value{ + "mount_point": cty.StringVal("/var/diska"), + "size": cty.StringVal("50GB"), + }), + }), + "root_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp3"), + }), + }), + "leaf_block_device": cty.MapVal(map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp2"), + }), + "b": cty.ObjectVal(map[string]cty.Value{ + "volume_type": cty.StringVal("gp3"), + }), + }), + }), + RequiredReplace: cty.NewPathSet(), + Schema: testSchemaMultipleBlocks(configschema.NestingMap), + ExpectedOutput: ` # test_instance.example will be updated in-place + ~ resource "test_instance" "example" { + ~ ami = "ami-BEFORE" -> "ami-AFTER" + id = "i-02ae66f368e8518a9" + # (1 unchanged attribute hidden) + + ~ leaf_block_device "b" { + ~ volume_type = "gp2" -> "gp3" + } + + ~ root_block_device "b" { + ~ volume_type = "gp2" -> "gp3" + } + + # (2 unchanged blocks hidden) + } +`, + }, } runTestCases(t, testCases) } @@ -5447,6 +6042,50 @@ Block: configschema.Block{ Attributes: map[string]*configschema.Attribute{ "volume_type": { + Type: cty.String, + Optional: true, + Computed: true, + }, + }, + }, + Nesting: nesting, + }, + }, + } +} + +func testSchemaMultipleBlocks(nesting configschema.NestingMode) *configschema.Block { + return &configschema.Block{ + Attributes: map[string]*configschema.Attribute{ + "id": {Type: cty.String, Optional: true, Computed: true}, + "ami": {Type: cty.String, Optional: true}, + "disks": { + NestedType: &configschema.Object{ + Attributes: map[string]*configschema.Attribute{ + "mount_point": {Type: cty.String, Optional: true}, + "size": {Type: cty.String, Optional: true}, + }, + Nesting: nesting, + }, + }, + }, + BlockTypes: map[string]*configschema.NestedBlock{ + "root_block_device": { + Block: configschema.Block{ + Attributes: map[string]*configschema.Attribute{ + "volume_type": { + Type: cty.String, + Optional: true, + Computed: true, + }, + }, + }, + Nesting: nesting, + }, + "leaf_block_device": { + Block: configschema.Block{ + Attributes: map[string]*configschema.Attribute{ + "volume_type": { Type: cty.String, Optional: true, Computed: true, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/internal/terraform/context_test.go new/terraform-1.2.5/internal/terraform/context_test.go --- old/terraform-1.2.4/internal/terraform/context_test.go 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/internal/terraform/context_test.go 2022-07-13 12:14:18.000000000 +0200 @@ -68,6 +68,22 @@ }, { + "prerelease doesn't match with inequality", + "", + "0.8.0", + "> 0.7.0-beta", + true, + }, + + { + "prerelease doesn't match with equality", + "", + "0.7.0", + "0.7.0-beta", + true, + }, + + { "module matches", "context-required-version-module", "0.5.0", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/internal/terraform/version_required.go new/terraform-1.2.5/internal/terraform/version_required.go --- old/terraform-1.2.4/internal/terraform/version_required.go 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/internal/terraform/version_required.go 2022-07-13 12:14:18.000000000 +0200 @@ -27,6 +27,29 @@ module := config.Module for _, constraint := range module.CoreVersionConstraints { + // Before checking if the constraints are met, check that we are not using any prerelease fields as these + // are not currently supported. + var prereleaseDiags tfdiags.Diagnostics + for _, required := range constraint.Required { + if required.Prerelease() { + prereleaseDiags = prereleaseDiags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Invalid required_version constraint", + Detail: fmt.Sprintf( + "Prerelease version constraints are not supported: %s. Remove the prerelease information from the constraint. Prerelease versions of terraform will match constraints using their version core only.", + required.String()), + Subject: constraint.DeclRange.Ptr(), + }) + } + } + + if len(prereleaseDiags) > 0 { + // There were some prerelease fields in the constraints. Don't check the constraints as they will + // fail, and populate the diagnostics for these constraints with the prerelease diagnostics. + diags = diags.Append(prereleaseDiags) + continue + } + if !constraint.Required.Check(tfversion.SemVer) { switch { case len(config.Path) == 0: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/version/version.go new/terraform-1.2.5/version/version.go --- old/terraform-1.2.4/version/version.go 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/version/version.go 2022-07-13 12:14:18.000000000 +0200 @@ -11,7 +11,7 @@ ) // The main version number that is being run at the moment. -var Version = "1.2.4" +var Version = "1.2.5" // A pre-release marker for the version. If this is "" (empty string) // then it means that it is a final release. Otherwise, this is a pre-release diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/website/docs/cli/commands/fmt.mdx new/terraform-1.2.5/website/docs/cli/commands/fmt.mdx --- old/terraform-1.2.4/website/docs/cli/commands/fmt.mdx 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/website/docs/cli/commands/fmt.mdx 2022-07-13 12:14:18.000000000 +0200 @@ -45,12 +45,10 @@ ## Usage -Usage: `terraform fmt [options] [DIR]` +Usage: `terraform fmt [options] [TARGET]` By default, `fmt` scans the current directory for configuration files. If -the `dir` argument is provided then it will scan that given directory -instead. If `dir` is a single dash (`-`) then `fmt` will read from standard -input (STDIN). +you provide a directory for the `target` argument, then `fmt` will scan that directory instead. If you provide a file, then `fmt` will process just that file. If you provide a single dash (`-`), then `fmt` will read from standard input (STDIN). The command-line flags are all optional. The list of available flags are: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/website/docs/cli/install/apt.mdx new/terraform-1.2.5/website/docs/cli/install/apt.mdx --- old/terraform-1.2.4/website/docs/cli/install/apt.mdx 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/website/docs/cli/install/apt.mdx 2022-07-13 12:14:18.000000000 +0200 @@ -27,34 +27,45 @@ ## Repository Configuration -The Terraform packages are signed using a private key controlled by HashiCorp, -so in most situations the first step would be to configure your system to trust -that HashiCorp key for package authentication. For example: - -```bash -wget -qO - terraform.gpg https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/terraform-archive-keyring.gpg -``` - -After registering the key, you can add the official HashiCorp repository to -your system: - -```bash -sudo echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/terraform-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" > /etc/apt/sources.list.d/terraform.list -``` - -The above command line uses the following sub-shell commands: - -* `dpkg --print-architecture` to determine your system's primary APT - architecture/ABI, such as `amd64`. -* `lsb_release -cs` to find the distribution release codename for your current - system, such as `buster`, `groovy`, or `sid`. - -To install Terraform from the new repository: - -```bash -sudo apt update -sudo apt install terraform -``` +The Terraform packages are signed using a private key controlled by HashiCorp, so you must configure your system to trust that HashiCorp key for package authentication. + +To configure your repository: + +1. Download the signing key to a new keyring. + + ```bash + $ wget -O- https://apt.releases.hashicorp.com/gpg | \ + gpg --dearmor | \ + sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg + +1. Verify the key's fingerprint. + + ```bash + $ gpg --no-default-keyring \ + --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg \ + --fingerprint + ``` + The fingerprint must match `E8A0 32E0 94D8 EB4E A189 D270 DA41 8C88 A321 9F7B`. You can also verify the key on [Security at HashiCorp](https://www.hashicorp.com/security) under **Linux Package Checksum Verification**. + +1. Add the official HashiCorp repository to your system. The `lsb_release -cs` command finds the distribution release codename for your current system, such as `buster`, `groovy`, or `sid`. + + ```bash + $ echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \ + https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \ + sudo tee /etc/apt/sources.list.d/hashicorp.list + ``` + +1. Download the package information from HashiCorp. + + ```bash + $ sudo apt update + ``` + +1. Install Terraform from the new repository. + + ```bash + $ sudo apt install terraform + ``` ## Supported Architectures diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/website/docs/docs/glossary.mdx new/terraform-1.2.5/website/docs/docs/glossary.mdx --- old/terraform-1.2.4/website/docs/docs/glossary.mdx 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/website/docs/docs/glossary.mdx 2022-07-13 12:14:18.000000000 +0200 @@ -12,8 +12,8 @@ <div style={{ columnWidth: '14em' }}> - [API](#api) -- [Apply (noun)](#apply-noun-) -- [Apply (verb)](#apply-verb-) +- [Apply (noun)](#apply-noun) +- [Apply (verb)](#apply-verb) - [Argument](#argument) - [Attribute](#attribute) - [Backend](#backend) @@ -48,16 +48,16 @@ - [Output Values](#output-values) - [OSS](#oss) - [Permissions](#permissions) -- [Plan (verb)](#plan-verb-) -- [Plan (noun, 1)](#plan-noun-1-) +- [Plan (verb)](#plan-verb) +- [Plan (noun, 1)](#plan-noun-1) - [Plan File](#plan-file) - [Policy](#policy) - [Policy Check](#policy-check) - [Policy Set](#policy-set) - [Private Terraform Registry](#private-terraform-registry) -- [Private Terraform Enterprise (PTFE)](#private-terraform-enterprise-ptfe-) +- [Private Terraform Enterprise (PTFE)](#private-terraform-enterprise-ptfe) - [(Terraform) Provider](#terraform-provider) -- [Pull Request (PR)](#pull-request-pr-) +- [Pull Request (PR)](#pull-request-pr) - [Queue](#queue) - [(Terraform) Registry](#terraform-registry) - [Remote Operations](#remote-operations) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/website/docs/docs/terraform-tools.mdx new/terraform-1.2.5/website/docs/docs/terraform-tools.mdx --- old/terraform-1.2.4/website/docs/docs/terraform-tools.mdx 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/website/docs/docs/terraform-tools.mdx 2022-07-13 12:14:18.000000000 +0200 @@ -11,7 +11,7 @@ |Name | Maintainer |Description| Tutorial | |-----|------------|-----------|----------| -|[Cloud Development Kit for Terraform (CDKTF)](/docs/cdktf/index.html)| HashiCorp | Use familiar programming languages to define and provision infrastructure. CDKTF currently supports TypeScript, Python, Java, C#, and Go (experimental).| [Write CDK for Terraform configurations](https://learn.hashicorp.com/collections/terraform/cdktf) | +|[Cloud Development Kit for Terraform (CDKTF)](/cdktf)| HashiCorp | Use familiar programming languages to define and provision infrastructure. CDKTF currently supports TypeScript, Python, Java, C#, and Go (experimental).| [Write CDK for Terraform configurations](https://learn.hashicorp.com/collections/terraform/cdktf) | |[Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform) | HashiCorp | Enable syntax highlighting and other editing features in VS Code using the Terraform Language Server.| | |[Language Server](https://github.com/hashicorp/terraform-ls) | HashiCorp | Add support for the Terraform configuration language to editors that use the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/), like Sublime Text, vim, emacs, etc.| | |[console](https://www.terraform.io/docs/cli/commands/console.html) | HashiCorp | Evaluate Terraform expressions and explore your Terraform project's state. The console helps you develop and debug your configuration, especially when working with complex state data and Terraform expressions.| [Develop Configuration with the Console](https://learn.hashicorp.com/tutorials/terraform/console) | diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/website/docs/language/functions/format.mdx new/terraform-1.2.5/website/docs/language/functions/format.mdx --- old/terraform-1.2.4/website/docs/language/functions/format.mdx 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/website/docs/language/functions/format.mdx 2022-07-13 12:14:18.000000000 +0200 @@ -7,7 +7,7 @@ # `format` Function -`format` produces a string by formatting a number of other values according +The `format` function produces a string by formatting a number of other values according to a specification string. It is similar to the `printf` function in C, and other similar functions in other programming languages. @@ -25,7 +25,7 @@ ``` Simple format verbs like `%s` and `%d` behave similarly to template -interpolation syntax, which is often more readable: +interpolation syntax, which is often more readable. ``` > format("Hello, %s!", var.name) @@ -34,8 +34,24 @@ Hello, Valentina! ``` -The `format` function is therefore more useful when you use more complex format -specifications, as described in the following section. +The formatting verb `%#v` accepts a value of any type and presents it using JSON encoding, similar to jsonencode. This can be useful for describing the values given to a module in [custom condition check](/language/expressions/custom-conditions#error-messages) error messages. + +``` +> format("%#v", "hello") +"\"hello\"" +> format("%#v", true) +"true" +> format("%#v", 1) +"1" +> format("%#v", {a = 1}) +"{\"a\":1}" +> format("%#v", [true]) +"[true]" +> format("%#v", null) +"null" +``` + +The `format` function is most useful when you use more complex format specifications. ## Specification Syntax @@ -45,13 +61,25 @@ consecutive arguments and formatted as directed, as long as each given argument is convertible to the type required by the format verb. -The specification may contain the following verbs: +By default, `%` sequences consume successive arguments starting with the first. +Introducing a `[n]` sequence immediately before the verb letter, where `n` is a +decimal integer, explicitly chooses a particular value argument by its +one-based index. Subsequent calls without an explicit index will then proceed +with `n`+1, `n`+2, etc. + +The function produces an error if the format string requests an impossible +conversion or access more arguments than are given. An error is produced also +for an unsupported format verb. + +### Verbs + +The specification may contain the following verbs. | Verb | Result | | ----- | ----------------------------------------------------------------------------------------- | | `%%` | Literal percent sign, consuming no value. | -| `%v` | Default formatting based on the value type, as described below. | -| `%#v` | JSON serialization of the value, as with `jsonencode`. | +| `%v` | Default formatting based on the [value type](#default-format-verbs). Accepts all types, including items of `null`, `list`, and `map` types. | +| `%#v` | JSON serialization of the value, as with `jsonencode`. Accepts all types, including items of `null`, `list`, and `map` types. | | `%t` | Convert to boolean and produce `true` or `false`. | | `%b` | Convert to integer number and produce binary representation. | | `%d` | Convert to integer number and produce decimal representation. | @@ -66,7 +94,9 @@ | `%s` | Convert to string and insert the string's characters. | | `%q` | Convert to string and produce a JSON quoted string representation. | -When `%v` is used, one of the following format verbs is chosen based on the value type: +### Default Format Verbs + +When `%v` is used, Terraform chooses the appropriate format verb based on the value type. | Type | Verb | | --------- | ----- | @@ -75,14 +105,14 @@ | `bool` | `%t` | | any other | `%#v` | -Null values produce the string `null` if formatted with `%v` or `%#v`, and -cause an error for other verbs. +Null values produce the string `null` if formatted with `%v` or `%#v`, and cause an error for other verbs. + +### Width Modifier + +Use a width modifier with an optional decimal number immediately +preceding the verb letter to specify how many characters will be used to represent the value. You can specify precision after the (optional) width with a period (`.`) followed by a decimal number. If width or precision are omitted, Terraform selects default values based on the given value. -A width modifier can be included with an optional decimal number immediately -preceding the verb letter, to specify how many characters will be used to -represent the value. Precision can be specified after the (optional) width -with a period (`.`) followed by a decimal number. If width or precision are -omitted then default values are selected based on the given value. For example: +The following examples demonstrate example use cases for the width modifier. | Sequence | Result | | -------- | ---------------------------- | @@ -91,8 +121,13 @@ | `%.2f` | Default width, precision 2. | | `%9.2f` | Width 9, precision 2. | -The following additional symbols can be used immediately after the `%` symbol -to set additional flags: +-> **Note:** Width and precision modifiers with non-numeric types such as +strings (`%s`) are interpreted differently. Setting either width or precision to +zero is the same as not including them at all. + +### Additional Format Options + +Use the following symbols immediately after the `%` symbol to set additional formatting requirements. | Symbol | Result | | ------ | -------------------------------------------------------------- | @@ -101,19 +136,6 @@ | `-` | Pad the width with spaces on the right rather than the left. | | `0` | Pad the width with leading zeros rather than spaces. | -By default, `%` sequences consume successive arguments starting with the first. -Introducing a `[n]` sequence immediately before the verb letter, where `n` is a -decimal integer, explicitly chooses a particular value argument by its -one-based index. Subsequent calls without an explicit index will then proceed -with `n`+1, `n`+2, etc. - -The function produces an error if the format string requests an impossible -conversion or access more arguments than are given. An error is produced also -for an unsupported format verb. - --> **Note:** Width and precision modifiers with non-numeric types such as -strings (`%s`) are interpreted differently. Setting either width or precision to -zero is the same as not including them at all. ## Related Functions diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/website/docs/language/resources/provisioners/remote-exec.mdx new/terraform-1.2.5/website/docs/language/resources/provisioners/remote-exec.mdx --- old/terraform-1.2.4/website/docs/language/resources/provisioners/remote-exec.mdx 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/website/docs/language/resources/provisioners/remote-exec.mdx 2022-07-13 12:14:18.000000000 +0200 @@ -48,8 +48,9 @@ The following arguments are supported: -* `inline` - This is a list of command strings. They are executed in the order - they are provided. This cannot be provided with `script` or `scripts`. +* `inline` - This is a list of command strings. The provisioner uses a default + shell unless you specify a shell as the first command (eg., `#!/bin/bash`). + You cannot provide this with `script` or `scripts`. * `script` - This is a path (relative or absolute) to a local script that will be copied to the remote resource and then executed. This cannot be provided diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/website/docs/language/settings/backends/artifactory.mdx new/terraform-1.2.5/website/docs/language/settings/backends/artifactory.mdx --- old/terraform-1.2.4/website/docs/language/settings/backends/artifactory.mdx 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/website/docs/language/settings/backends/artifactory.mdx 2022-07-13 12:14:18.000000000 +0200 @@ -3,7 +3,9 @@ description: Terraform can store state in artifactory. --- -# artifactory +# artifactory (deprecated) + +-> **Note:** The `artifactory` backend is deprecated and will be removed in a future Terraform release. Stores the state as an artifact in a given repository in [Artifactory](https://www.jfrog.com/artifactory/). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/website/docs/language/settings/backends/etcd.mdx new/terraform-1.2.5/website/docs/language/settings/backends/etcd.mdx --- old/terraform-1.2.4/website/docs/language/settings/backends/etcd.mdx 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/website/docs/language/settings/backends/etcd.mdx 2022-07-13 12:14:18.000000000 +0200 @@ -3,7 +3,9 @@ description: Terraform can store state remotely in etcd 2.x. --- -# etcd +# etcd (deprecated) + +-> **Note:** The `etcd` backend is deprecated and will be removed in a future Terraform release. Stores the state in [etcd 2.x](https://coreos.com/etcd/docs/latest/v2/README.html) at a given path. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/website/docs/language/settings/backends/etcdv3.mdx new/terraform-1.2.5/website/docs/language/settings/backends/etcdv3.mdx --- old/terraform-1.2.4/website/docs/language/settings/backends/etcdv3.mdx 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/website/docs/language/settings/backends/etcdv3.mdx 2022-07-13 12:14:18.000000000 +0200 @@ -3,7 +3,9 @@ description: Terraform can store state remotely in etcd 3.x. --- -# etcdv3 +# etcdv3 (deprecated) + +-> **Note:** The `etcdv3` backend is deprecated and will be removed in a future Terraform release. Stores the state in the [etcd](https://etcd.io/) KV store with a given prefix. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/website/docs/language/settings/backends/manta.mdx new/terraform-1.2.5/website/docs/language/settings/backends/manta.mdx --- old/terraform-1.2.4/website/docs/language/settings/backends/manta.mdx 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/website/docs/language/settings/backends/manta.mdx 2022-07-13 12:14:18.000000000 +0200 @@ -3,7 +3,9 @@ description: Terraform can store state in manta. --- -# manta +# manta (deprecated) + +-> **Note:** The `manta` backend is deprecated and will be removed in a future Terraform release. Stores the state as an artifact in [Manta](https://www.joyent.com/manta). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/website/docs/language/settings/backends/swift.mdx new/terraform-1.2.5/website/docs/language/settings/backends/swift.mdx --- old/terraform-1.2.4/website/docs/language/settings/backends/swift.mdx 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/website/docs/language/settings/backends/swift.mdx 2022-07-13 12:14:18.000000000 +0200 @@ -3,7 +3,9 @@ description: Terraform can store state remotely in Swift. --- -# swift +# swift (deprecated) + +-> **Note:** The `swift` backend is deprecated and will be removed in a future Terraform release. Stores the state as an artifact in [Swift](http://docs.openstack.org/developer/swift/latest/). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terraform-1.2.4/website/docs/language/settings/terraform-cloud.mdx new/terraform-1.2.5/website/docs/language/settings/terraform-cloud.mdx --- old/terraform-1.2.4/website/docs/language/settings/terraform-cloud.mdx 2022-06-29 19:05:59.000000000 +0200 +++ new/terraform-1.2.5/website/docs/language/settings/terraform-cloud.mdx 2022-07-13 12:14:18.000000000 +0200 @@ -29,7 +29,7 @@ } ``` -If you do not specify the `hostname`, it defaults to `app.terraform.io` for Terraform Cloud. For Terraform Enterprise installations, include the `hostname` configuration argument. +If you do not specify the `hostname`, it defaults to `app.terraform.io` for Terraform Cloud. For Terraform Enterprise installations, include the [hostname](/cli/cloud/settings#hostname) configuration argument. You cannot use the CLI integration and a [state backend](/language/settings/backends) in the same configuration; they are mutually exclusive. A configuration can only provide one `cloud` block and the `cloud` block cannot refer to named values like input variables, locals, or data source attributes. Binary files old/terraform-1.2.4/website/img/docs/concrete-plan.png and new/terraform-1.2.5/website/img/docs/concrete-plan.png differ ++++++ terraform.obsinfo ++++++ --- /var/tmp/diff_new_pack.0sT0wg/_old 2022-07-18 18:37:48.830107142 +0200 +++ /var/tmp/diff_new_pack.0sT0wg/_new 2022-07-18 18:37:48.830107142 +0200 @@ -1,5 +1,5 @@ name: terraform -version: 1.2.4 -mtime: 1656522359 -commit: 9cc7dbd4f514431cee31155663c16d4f7f77f979 +version: 1.2.5 +mtime: 1657707258 +commit: 5139b2c096c474e8b077a3c92a0b132ae322a80d ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/terraform/vendor.tar.gz /work/SRC/openSUSE:Factory/.terraform.new.1523/vendor.tar.gz differ: char 5, line 1