Merge pull request #29492 from hashicorp/jbardin/staticcheck
Add staticcheck to CI
This commit is contained in:
commit
05f21cdff8
|
@ -26,7 +26,8 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
- run: go mod verify
|
- run: go mod verify
|
||||||
- run: make fmtcheck generate
|
- run: go install honnef.co/go/tools/cmd/staticcheck
|
||||||
|
- run: make fmtcheck generate staticcheck
|
||||||
- run:
|
- run:
|
||||||
name: verify no code was generated
|
name: verify no code was generated
|
||||||
command: |
|
command: |
|
||||||
|
|
5
Makefile
5
Makefile
|
@ -20,6 +20,9 @@ protobuf:
|
||||||
fmtcheck:
|
fmtcheck:
|
||||||
@sh -c "'$(CURDIR)/scripts/gofmtcheck.sh'"
|
@sh -c "'$(CURDIR)/scripts/gofmtcheck.sh'"
|
||||||
|
|
||||||
|
staticcheck:
|
||||||
|
@sh -c "'$(CURDIR)/scripts/staticcheck.sh'"
|
||||||
|
|
||||||
website:
|
website:
|
||||||
ifeq (,$(wildcard $(GOPATH)/src/$(WEBSITE_REPO)))
|
ifeq (,$(wildcard $(GOPATH)/src/$(WEBSITE_REPO)))
|
||||||
echo "$(WEBSITE_REPO) not found in your GOPATH (necessary for layouts and assets), get-ting..."
|
echo "$(WEBSITE_REPO) not found in your GOPATH (necessary for layouts and assets), get-ting..."
|
||||||
|
@ -46,4 +49,4 @@ endif
|
||||||
# under parallel conditions.
|
# under parallel conditions.
|
||||||
.NOTPARALLEL:
|
.NOTPARALLEL:
|
||||||
|
|
||||||
.PHONY: fmtcheck generate protobuf website website-test
|
.PHONY: fmtcheck generate protobuf website website-test staticcheck
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -14,6 +14,7 @@ require (
|
||||||
github.com/Azure/go-autorest/logger v0.2.1 // indirect
|
github.com/Azure/go-autorest/logger v0.2.1 // indirect
|
||||||
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
|
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
|
||||||
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c // indirect
|
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c // indirect
|
||||||
|
github.com/BurntSushi/toml v0.3.1 // indirect
|
||||||
github.com/ChrisTrenkamp/goxpath v0.0.0-20190607011252-c5096ec8773d // indirect
|
github.com/ChrisTrenkamp/goxpath v0.0.0-20190607011252-c5096ec8773d // indirect
|
||||||
github.com/Masterminds/goutils v1.1.0 // indirect
|
github.com/Masterminds/goutils v1.1.0 // indirect
|
||||||
github.com/Masterminds/semver v1.5.0 // indirect
|
github.com/Masterminds/semver v1.5.0 // indirect
|
||||||
|
@ -172,6 +173,7 @@ require (
|
||||||
gopkg.in/inf.v0 v0.9.0 // indirect
|
gopkg.in/inf.v0 v0.9.0 // indirect
|
||||||
gopkg.in/ini.v1 v1.42.0 // indirect
|
gopkg.in/ini.v1 v1.42.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.3.0 // indirect
|
gopkg.in/yaml.v2 v2.3.0 // indirect
|
||||||
|
honnef.co/go/tools v0.0.1-2020.1.4
|
||||||
k8s.io/api v0.0.0-20190620084959-7cf5895f2711
|
k8s.io/api v0.0.0-20190620084959-7cf5895f2711
|
||||||
k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655
|
k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655
|
||||||
k8s.io/client-go v10.0.0+incompatible
|
k8s.io/client-go v10.0.0+incompatible
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -74,6 +74,7 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp
|
||||||
github.com/Azure/go-ntlmssp v0.0.0-20180810175552-4a21cbd618b4/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
|
github.com/Azure/go-ntlmssp v0.0.0-20180810175552-4a21cbd618b4/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
|
||||||
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28=
|
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28=
|
||||||
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
|
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
|
||||||
|
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||||
github.com/ChrisTrenkamp/goxpath v0.0.0-20170922090931-c385f95c6022/go.mod h1:nuWgzSkT5PnyOd+272uUmV0dnAnAn42Mk7PiQC5VzN4=
|
github.com/ChrisTrenkamp/goxpath v0.0.0-20170922090931-c385f95c6022/go.mod h1:nuWgzSkT5PnyOd+272uUmV0dnAnAn42Mk7PiQC5VzN4=
|
||||||
|
@ -1061,6 +1062,7 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh
|
||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
|
honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
k8s.io/api v0.0.0-20190620084959-7cf5895f2711 h1:BblVYz/wE5WtBsD/Gvu54KyBUTJMflolzc5I2DTvh50=
|
k8s.io/api v0.0.0-20190620084959-7cf5895f2711 h1:BblVYz/wE5WtBsD/Gvu54KyBUTJMflolzc5I2DTvh50=
|
||||||
k8s.io/api v0.0.0-20190620084959-7cf5895f2711/go.mod h1:TBhBqb1AWbBQbW3XRusr7n7E4v2+5ZY8r8sAMnyFC5A=
|
k8s.io/api v0.0.0-20190620084959-7cf5895f2711/go.mod h1:TBhBqb1AWbBQbW3XRusr7n7E4v2+5ZY8r8sAMnyFC5A=
|
||||||
|
|
|
@ -194,14 +194,10 @@ func (r AbsResource) absMoveableSigil() {
|
||||||
// AbsResource is moveable
|
// AbsResource is moveable
|
||||||
}
|
}
|
||||||
|
|
||||||
type absResourceKey string
|
|
||||||
|
|
||||||
func (r AbsResource) UniqueKey() UniqueKey {
|
func (r AbsResource) UniqueKey() UniqueKey {
|
||||||
return absResourceInstanceKey(r.String())
|
return absResourceInstanceKey(r.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rk absResourceKey) uniqueKeySigil() {}
|
|
||||||
|
|
||||||
// AbsResourceInstance is an absolute address for a resource instance under a
|
// AbsResourceInstance is an absolute address for a resource instance under a
|
||||||
// given module path.
|
// given module path.
|
||||||
type AbsResourceInstance struct {
|
type AbsResourceInstance struct {
|
||||||
|
|
|
@ -888,7 +888,7 @@ func (b *Remote) VerifyWorkspaceTerraformVersion(workspaceName string) tfdiags.D
|
||||||
|
|
||||||
// If the workspace has remote operations disabled, the remote Terraform
|
// If the workspace has remote operations disabled, the remote Terraform
|
||||||
// version is effectively meaningless, so we'll skip version verification.
|
// version is effectively meaningless, so we'll skip version verification.
|
||||||
if workspace.Operations == false {
|
if !workspace.Operations {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -963,22 +963,6 @@ func (b *Remote) IsLocalOperations() bool {
|
||||||
return b.forceLocal
|
return b.forceLocal
|
||||||
}
|
}
|
||||||
|
|
||||||
// Colorize returns the Colorize structure that can be used for colorizing
|
|
||||||
// output. This is guaranteed to always return a non-nil value and so useful
|
|
||||||
// as a helper to wrap any potentially colored strings.
|
|
||||||
//
|
|
||||||
// TODO SvH: Rename this back to Colorize as soon as we can pass -no-color.
|
|
||||||
func (b *Remote) cliColorize() *colorstring.Colorize {
|
|
||||||
if b.CLIColor != nil {
|
|
||||||
return b.CLIColor
|
|
||||||
}
|
|
||||||
|
|
||||||
return &colorstring.Colorize{
|
|
||||||
Colors: colorstring.DefaultColors,
|
|
||||||
Disable: true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func generalError(msg string, err error) error {
|
func generalError(msg string, err error) error {
|
||||||
var diags tfdiags.Diagnostics
|
var diags tfdiags.Diagnostics
|
||||||
|
|
||||||
|
|
|
@ -1594,7 +1594,7 @@ func TestRemote_applyVersionCheck(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// RUN: prepare the apply operation and run it
|
// RUN: prepare the apply operation and run it
|
||||||
op, configCleanup, done := testOperationApply(t, "./testdata/apply")
|
op, configCleanup, _ := testOperationApply(t, "./testdata/apply")
|
||||||
defer configCleanup()
|
defer configCleanup()
|
||||||
|
|
||||||
streams, done := terminal.StreamsForTesting(t)
|
streams, done := terminal.StreamsForTesting(t)
|
||||||
|
|
|
@ -45,8 +45,7 @@ func (c *ApplyCommand) Run(rawArgs []string) int {
|
||||||
|
|
||||||
// Instantiate the view, even if there are flag errors, so that we render
|
// Instantiate the view, even if there are flag errors, so that we render
|
||||||
// diagnostics according to the desired view
|
// diagnostics according to the desired view
|
||||||
var view views.Apply
|
view := views.NewApply(args.ViewType, c.Destroy, c.View)
|
||||||
view = views.NewApply(args.ViewType, c.Destroy, c.View)
|
|
||||||
|
|
||||||
if diags.HasErrors() {
|
if diags.HasErrors() {
|
||||||
view.Diagnostics(diags)
|
view.Diagnostics(diags)
|
||||||
|
|
|
@ -1779,6 +1779,7 @@ func TestApply_terraformEnvNonDefault(t *testing.T) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if code := newCmd.Run([]string{"test"}); code != 0 {
|
if code := newCmd.Run([]string{"test"}); code != 0 {
|
||||||
|
t.Fatal("error creating workspace")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1792,6 +1793,7 @@ func TestApply_terraformEnvNonDefault(t *testing.T) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if code := selCmd.Run(args); code != 0 {
|
if code := selCmd.Run(args); code != 0 {
|
||||||
|
t.Fatal("error switching workspace")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ func ResourceChange(
|
||||||
buf.WriteString(color.Color(fmt.Sprintf("[bold] # %s[reset] will be [bold][red]destroyed", dispAddr)))
|
buf.WriteString(color.Color(fmt.Sprintf("[bold] # %s[reset] will be [bold][red]destroyed", dispAddr)))
|
||||||
if change.DeposedKey != states.NotDeposed {
|
if change.DeposedKey != states.NotDeposed {
|
||||||
// Some extra context about this unusual situation.
|
// Some extra context about this unusual situation.
|
||||||
buf.WriteString(color.Color(fmt.Sprint("\n # (left over from a partially-failed replacement of this instance)")))
|
buf.WriteString(color.Color("\n # (left over from a partially-failed replacement of this instance)"))
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
// should never happen, since the above is exhaustive
|
// should never happen, since the above is exhaustive
|
||||||
|
@ -755,8 +755,6 @@ func (p *blockBodyDiffPrinter) writeNestedAttrDiff(
|
||||||
p.buf.WriteString(" -> (known after apply)")
|
p.buf.WriteString(" -> (known after apply)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *blockBodyDiffPrinter) writeNestedBlockDiffs(name string, blockS *configschema.NestedBlock, old, new cty.Value, blankBefore bool, indent int, path cty.Path) int {
|
func (p *blockBodyDiffPrinter) writeNestedBlockDiffs(name string, blockS *configschema.NestedBlock, old, new cty.Value, blankBefore bool, indent int, path cty.Path) int {
|
||||||
|
|
|
@ -274,28 +274,3 @@ func marshalPlanModules(
|
||||||
|
|
||||||
return ret, nil
|
return ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// marshalSensitiveValues returns a map of sensitive attributes, with the value
|
|
||||||
// set to true. It returns nil if the value is nil or if there are no sensitive
|
|
||||||
// vals.
|
|
||||||
func marshalSensitiveValues(value cty.Value) map[string]bool {
|
|
||||||
if value.RawEquals(cty.NilVal) || value.IsNull() {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
ret := make(map[string]bool)
|
|
||||||
|
|
||||||
it := value.ElementIterator()
|
|
||||||
for it.Next() {
|
|
||||||
k, v := it.Element()
|
|
||||||
s := jsonstate.SensitiveAsBool(v)
|
|
||||||
if !s.RawEquals(cty.False) {
|
|
||||||
ret[k.AsString()] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(ret) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
|
@ -311,13 +311,9 @@ func (c *LoginCommand) outputDefaultTFELoginSuccess(dispHostname string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *LoginCommand) outputDefaultTFCLoginSuccess() {
|
func (c *LoginCommand) outputDefaultTFCLoginSuccess() {
|
||||||
c.Ui.Output(
|
c.Ui.Output(c.Colorize().Color(strings.TrimSpace(`
|
||||||
fmt.Sprintf(
|
|
||||||
c.Colorize().Color(strings.TrimSpace(`
|
|
||||||
[green][bold]Success![reset] [bold]Logged in to Terraform Cloud[reset]
|
[green][bold]Success![reset] [bold]Logged in to Terraform Cloud[reset]
|
||||||
`)),
|
` + "\n")))
|
||||||
) + "\n",
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *LoginCommand) logMOTDError(err error) {
|
func (c *LoginCommand) logMOTDError(err error) {
|
||||||
|
|
|
@ -15,8 +15,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
plugin "github.com/hashicorp/go-plugin"
|
plugin "github.com/hashicorp/go-plugin"
|
||||||
"github.com/hashicorp/hcl/v2"
|
|
||||||
"github.com/hashicorp/hcl/v2/hclsyntax"
|
|
||||||
"github.com/hashicorp/terraform-svchost/disco"
|
"github.com/hashicorp/terraform-svchost/disco"
|
||||||
"github.com/hashicorp/terraform/internal/addrs"
|
"github.com/hashicorp/terraform/internal/addrs"
|
||||||
"github.com/hashicorp/terraform/internal/backend"
|
"github.com/hashicorp/terraform/internal/backend"
|
||||||
|
@ -554,43 +552,6 @@ func (m *Meta) extendedFlagSet(n string) *flag.FlagSet {
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseTargetFlags must be called for any commands supporting -target
|
|
||||||
// arguments. This method attempts to parse each -target flag into an
|
|
||||||
// addrs.Target, storing in the Meta.targets slice.
|
|
||||||
//
|
|
||||||
// If any flags cannot be parsed, we rewrap the first error diagnostic with a
|
|
||||||
// custom title to clarify the source of the error. The normal approach of
|
|
||||||
// directly returning the diags from HCL or the addrs package results in
|
|
||||||
// confusing incorrect "source" results when presented.
|
|
||||||
func (m *Meta) parseTargetFlags() tfdiags.Diagnostics {
|
|
||||||
var diags tfdiags.Diagnostics
|
|
||||||
m.targets = nil
|
|
||||||
for _, tf := range m.targetFlags {
|
|
||||||
traversal, syntaxDiags := hclsyntax.ParseTraversalAbs([]byte(tf), "", hcl.Pos{Line: 1, Column: 1})
|
|
||||||
if syntaxDiags.HasErrors() {
|
|
||||||
diags = diags.Append(tfdiags.Sourceless(
|
|
||||||
tfdiags.Error,
|
|
||||||
fmt.Sprintf("Invalid target %q", tf),
|
|
||||||
syntaxDiags[0].Detail,
|
|
||||||
))
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
target, targetDiags := addrs.ParseTarget(traversal)
|
|
||||||
if targetDiags.HasErrors() {
|
|
||||||
diags = diags.Append(tfdiags.Sourceless(
|
|
||||||
tfdiags.Error,
|
|
||||||
fmt.Sprintf("Invalid target %q", tf),
|
|
||||||
targetDiags[0].Description().Detail,
|
|
||||||
))
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
m.targets = append(m.targets, target.Subject)
|
|
||||||
}
|
|
||||||
return diags
|
|
||||||
}
|
|
||||||
|
|
||||||
// process will process any -no-color entries out of the arguments. This
|
// process will process any -no-color entries out of the arguments. This
|
||||||
// will potentially modify the args in-place. It will return the resulting
|
// will potentially modify the args in-place. It will return the resulting
|
||||||
// slice, and update the Meta and Ui.
|
// slice, and update the Meta and Ui.
|
||||||
|
|
|
@ -12,7 +12,6 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hashicorp/errwrap"
|
|
||||||
"github.com/hashicorp/hcl/v2"
|
"github.com/hashicorp/hcl/v2"
|
||||||
"github.com/hashicorp/hcl/v2/hcldec"
|
"github.com/hashicorp/hcl/v2/hcldec"
|
||||||
"github.com/hashicorp/terraform/internal/backend"
|
"github.com/hashicorp/terraform/internal/backend"
|
||||||
|
@ -244,7 +243,7 @@ func (m *Meta) BackendForPlan(settings plans.Backend) (backend.Enhanced, tfdiags
|
||||||
schema := b.ConfigSchema()
|
schema := b.ConfigSchema()
|
||||||
configVal, err := settings.Config.Decode(schema.ImpliedType())
|
configVal, err := settings.Config.Decode(schema.ImpliedType())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
diags = diags.Append(errwrap.Wrapf("saved backend configuration is invalid: {{err}}", err))
|
diags = diags.Append(fmt.Errorf("saved backend configuration is invalid: %w", err))
|
||||||
return nil, diags
|
return nil, diags
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,8 +26,7 @@ func (c *RefreshCommand) Run(rawArgs []string) int {
|
||||||
|
|
||||||
// Instantiate the view, even if there are flag errors, so that we render
|
// Instantiate the view, even if there are flag errors, so that we render
|
||||||
// diagnostics according to the desired view
|
// diagnostics according to the desired view
|
||||||
var view views.Refresh
|
view := views.NewRefresh(args.ViewType, c.View)
|
||||||
view = views.NewRefresh(args.ViewType, c.View)
|
|
||||||
|
|
||||||
if diags.HasErrors() {
|
if diags.HasErrors() {
|
||||||
view.Diagnostics(diags)
|
view.Diagnostics(diags)
|
||||||
|
|
|
@ -121,7 +121,7 @@ func (c *StateMeta) lookupResourceInstanceAddr(state *states.State, allowMissing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if found == false && !allowMissing {
|
if !found && !allowMissing {
|
||||||
diags = diags.Append(tfdiags.Sourceless(
|
diags = diags.Append(tfdiags.Sourceless(
|
||||||
tfdiags.Error,
|
tfdiags.Error,
|
||||||
"Unknown module",
|
"Unknown module",
|
||||||
|
|
|
@ -9,17 +9,11 @@ import (
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp"
|
"github.com/google/go-cmp/cmp"
|
||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
"github.com/mitchellh/colorstring"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/internal/addrs"
|
"github.com/hashicorp/terraform/internal/addrs"
|
||||||
"github.com/hashicorp/terraform/internal/states"
|
"github.com/hashicorp/terraform/internal/states"
|
||||||
)
|
)
|
||||||
|
|
||||||
var disabledColorize = &colorstring.Colorize{
|
|
||||||
Colors: colorstring.DefaultColors,
|
|
||||||
Disable: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestStateMv(t *testing.T) {
|
func TestStateMv(t *testing.T) {
|
||||||
state := states.BuildState(func(s *states.SyncState) {
|
state := states.BuildState(func(s *states.SyncState) {
|
||||||
s.SetResourceInstanceCurrent(
|
s.SetResourceInstanceCurrent(
|
||||||
|
|
|
@ -256,7 +256,7 @@ func (v *addHuman) writeConfigNestedBlock(buf *strings.Builder, name string, sch
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *addHuman) writeConfigNestedTypeAttribute(buf *strings.Builder, name string, schema *configschema.Attribute, indent int) error {
|
func (v *addHuman) writeConfigNestedTypeAttribute(buf *strings.Builder, name string, schema *configschema.Attribute, indent int) error {
|
||||||
if schema.Required == false && v.optional == false {
|
if !schema.Required && !v.optional {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -521,7 +521,6 @@ func writeAttrTypeConstraint(buf *strings.Builder, schema *configschema.Attribut
|
||||||
} else {
|
} else {
|
||||||
buf.WriteString(fmt.Sprintf("%s\n", schema.Type.FriendlyName()))
|
buf.WriteString(fmt.Sprintf("%s\n", schema.Type.FriendlyName()))
|
||||||
}
|
}
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeBlockTypeConstraint(buf *strings.Builder, schema *configschema.NestedBlock) {
|
func writeBlockTypeConstraint(buf *strings.Builder, schema *configschema.NestedBlock) {
|
||||||
|
@ -530,7 +529,6 @@ func writeBlockTypeConstraint(buf *strings.Builder, schema *configschema.NestedB
|
||||||
} else {
|
} else {
|
||||||
buf.WriteString(" # OPTIONAL block\n")
|
buf.WriteString(" # OPTIONAL block\n")
|
||||||
}
|
}
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// copied from command/format/diff
|
// copied from command/format/diff
|
||||||
|
|
|
@ -74,6 +74,9 @@ func TestOutputsFromMap(t *testing.T) {
|
||||||
func TestOutputsFromChanges(t *testing.T) {
|
func TestOutputsFromChanges(t *testing.T) {
|
||||||
root := addrs.RootModuleInstance
|
root := addrs.RootModuleInstance
|
||||||
num, err := plans.NewDynamicValue(cty.NumberIntVal(1234), cty.Number)
|
num, err := plans.NewDynamicValue(cty.NumberIntVal(1234), cty.Number)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unexpected error creating dynamic value: %v", err)
|
||||||
|
}
|
||||||
str, err := plans.NewDynamicValue(cty.StringVal("1234"), cty.String)
|
str, err := plans.NewDynamicValue(cty.StringVal("1234"), cty.String)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error creating dynamic value: %v", err)
|
t.Fatalf("unexpected error creating dynamic value: %v", err)
|
||||||
|
|
|
@ -105,10 +105,6 @@ func (v *OutputHuman) Diagnostics(diags tfdiags.Diagnostics) {
|
||||||
// type of an output value is not important.
|
// type of an output value is not important.
|
||||||
type OutputRaw struct {
|
type OutputRaw struct {
|
||||||
view *View
|
view *View
|
||||||
|
|
||||||
// Unit tests may set rawPrint to capture the output from the Output
|
|
||||||
// method, which would normally go to stdout directly.
|
|
||||||
rawPrint func(string)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ Output = (*OutputRaw)(nil)
|
var _ Output = (*OutputRaw)(nil)
|
||||||
|
|
|
@ -19,7 +19,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/apparentlymart/go-shquot/shquot"
|
"github.com/apparentlymart/go-shquot/shquot"
|
||||||
"github.com/hashicorp/errwrap"
|
|
||||||
"github.com/hashicorp/terraform/internal/communicator/remote"
|
"github.com/hashicorp/terraform/internal/communicator/remote"
|
||||||
"github.com/hashicorp/terraform/internal/provisioners"
|
"github.com/hashicorp/terraform/internal/provisioners"
|
||||||
"github.com/zclconf/go-cty/cty"
|
"github.com/zclconf/go-cty/cty"
|
||||||
|
@ -192,7 +191,7 @@ func (c *Communicator) Connect(o provisioners.UIOutput) (err error) {
|
||||||
log.Printf("[DEBUG] Connection established. Handshaking for user %v", c.connInfo.User)
|
log.Printf("[DEBUG] Connection established. Handshaking for user %v", c.connInfo.User)
|
||||||
sshConn, sshChan, req, err := ssh.NewClientConn(c.conn, hostAndPort, c.config.config)
|
sshConn, sshChan, req, err := ssh.NewClientConn(c.conn, hostAndPort, c.config.config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = errwrap.Wrapf(fmt.Sprintf("SSH authentication failed (%s@%s): {{err}}", c.connInfo.User, hostAndPort), err)
|
err = fmt.Errorf("SSH authentication failed (%s@%s): %w", c.connInfo.User, hostAndPort, err)
|
||||||
|
|
||||||
// While in theory this should be a fatal error, some hosts may start
|
// While in theory this should be a fatal error, some hosts may start
|
||||||
// the ssh service before it is properly configured, or before user
|
// the ssh service before it is properly configured, or before user
|
||||||
|
|
|
@ -86,6 +86,7 @@ func decodeRequiredProvidersBlock(block *hcl.Block) (*RequiredProviders, hcl.Dia
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOOP:
|
||||||
for _, kv := range kvs {
|
for _, kv := range kvs {
|
||||||
key, keyDiags := kv.Key.Value(nil)
|
key, keyDiags := kv.Key.Value(nil)
|
||||||
if keyDiags.HasErrors() {
|
if keyDiags.HasErrors() {
|
||||||
|
@ -213,7 +214,7 @@ func decodeRequiredProvidersBlock(block *hcl.Block) (*RequiredProviders, hcl.Dia
|
||||||
Detail: `required_providers objects can only contain "version", "source" and "configuration_aliases" attributes. To configure a provider, use a "provider" block.`,
|
Detail: `required_providers objects can only contain "version", "source" and "configuration_aliases" attributes. To configure a provider, use a "provider" block.`,
|
||||||
Subject: kv.Key.Range().Ptr(),
|
Subject: kv.Key.Range().Ptr(),
|
||||||
})
|
})
|
||||||
break
|
break LOOP
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -160,7 +160,9 @@ func marshalVertexID(v Vertex) string {
|
||||||
case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer:
|
case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer:
|
||||||
return strconv.Itoa(int(val.Pointer()))
|
return strconv.Itoa(int(val.Pointer()))
|
||||||
case reflect.Interface:
|
case reflect.Interface:
|
||||||
return strconv.Itoa(int(val.InterfaceData()[1]))
|
// A vertex shouldn't contain another layer of interface, but handle
|
||||||
|
// this just in case.
|
||||||
|
return fmt.Sprintf("%#v", val.Interface())
|
||||||
}
|
}
|
||||||
|
|
||||||
if v, ok := v.(Hashable); ok {
|
if v, ok := v.(Hashable); ok {
|
||||||
|
|
|
@ -306,6 +306,7 @@ func (c *Context) prePlanFindAndApplyMoves(config *configs.Config, prevRunState
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//lint:ignore SA9003 TODO
|
||||||
if !matchesTarget {
|
if !matchesTarget {
|
||||||
// TODO: Return an error stating that a targeted plan is
|
// TODO: Return an error stating that a targeted plan is
|
||||||
// only valid if it includes this address that was moved.
|
// only valid if it includes this address that was moved.
|
||||||
|
|
|
@ -6,20 +6,6 @@ import (
|
||||||
"github.com/hashicorp/terraform/internal/dag"
|
"github.com/hashicorp/terraform/internal/dag"
|
||||||
)
|
)
|
||||||
|
|
||||||
// testGraphContains is an assertion helper that tests that a node is
|
|
||||||
// contained in the graph.
|
|
||||||
func testGraphContains(t *testing.T, g *Graph, name string) {
|
|
||||||
for _, v := range g.Vertices() {
|
|
||||||
if dag.VertexName(v) == name {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
t.Fatalf(
|
|
||||||
"Expected %q in:\n\n%s",
|
|
||||||
name, g.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
// testGraphnotContains is an assertion helper that tests that a node is
|
// testGraphnotContains is an assertion helper that tests that a node is
|
||||||
// NOT contained in the graph.
|
// NOT contained in the graph.
|
||||||
func testGraphNotContains(t *testing.T, g *Graph, name string) {
|
func testGraphNotContains(t *testing.T, g *Graph, name string) {
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
package terraform
|
|
||||||
|
|
||||||
const errPluginInit = `
|
|
||||||
Plugins are external binaries that Terraform uses to access and manipulate
|
|
||||||
resources. The configuration provided requires plugins which can't be located,
|
|
||||||
don't satisfy the version constraints, or are otherwise incompatible.
|
|
||||||
|
|
||||||
Terraform automatically discovers provider requirements from your
|
|
||||||
configuration, including providers used in child modules. To see the
|
|
||||||
requirements and constraints, run "terraform providers".
|
|
||||||
|
|
||||||
%s
|
|
||||||
|
|
||||||
Plugin reinitialization required. Please address the above error(s) and run
|
|
||||||
"terraform init".
|
|
||||||
`
|
|
|
@ -46,33 +46,6 @@ func mockProviderWithResourceTypeSchema(name string, schema *configschema.Block)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// mockProviderWithProviderSchema is a test helper to create a mock provider
|
|
||||||
// from an existing ProviderSchema.
|
|
||||||
func mockProviderWithProviderSchema(providerSchema ProviderSchema) *MockProvider {
|
|
||||||
p := &MockProvider{
|
|
||||||
GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{
|
|
||||||
Provider: providers.Schema{
|
|
||||||
Block: providerSchema.Provider,
|
|
||||||
},
|
|
||||||
ResourceTypes: map[string]providers.Schema{},
|
|
||||||
DataSources: map[string]providers.Schema{},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for name, schema := range providerSchema.ResourceTypes {
|
|
||||||
p.GetProviderSchemaResponse.ResourceTypes[name] = providers.Schema{
|
|
||||||
Block: schema,
|
|
||||||
Version: int64(providerSchema.ResourceTypeSchemaVersions[name]),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for name, schema := range providerSchema.DataSources {
|
|
||||||
p.GetProviderSchemaResponse.DataSources[name] = providers.Schema{Block: schema}
|
|
||||||
}
|
|
||||||
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// getProviderSchemaResponseFromProviderSchema is a test helper to convert a
|
// getProviderSchemaResponseFromProviderSchema is a test helper to convert a
|
||||||
// ProviderSchema to a GetProviderSchemaResponse for use when building a mock provider.
|
// ProviderSchema to a GetProviderSchemaResponse for use when building a mock provider.
|
||||||
func getProviderSchemaResponseFromProviderSchema(providerSchema *ProviderSchema) *providers.GetProviderSchemaResponse {
|
func getProviderSchemaResponseFromProviderSchema(providerSchema *ProviderSchema) *providers.GetProviderSchemaResponse {
|
||||||
|
|
|
@ -2,11 +2,11 @@
|
||||||
|
|
||||||
# Check go fmt
|
# Check go fmt
|
||||||
echo "==> Checking that code complies with go fmt requirements..."
|
echo "==> Checking that code complies with go fmt requirements..."
|
||||||
gofmt_files=$(gofmt -l `find . -name '*.go' | grep -v vendor`)
|
gofmt_files=$(go fmt ./...)
|
||||||
if [[ -n ${gofmt_files} ]]; then
|
if [[ -n ${gofmt_files} ]]; then
|
||||||
echo 'gofmt needs running on the following files:'
|
echo 'gofmt needs running on the following files:'
|
||||||
echo "${gofmt_files}"
|
echo "${gofmt_files}"
|
||||||
echo "You can use the command: \`gofmt -w .\` to reformat code."
|
echo "You can use the command: \`go fmt\` to reformat code."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
echo "==> Checking that code complies with static analysis requirements..."
|
||||||
|
# Skip legacy code which is frozen, and can be removed once we can refactor the
|
||||||
|
# remote backends to no longer require it.
|
||||||
|
skip="internal/legacy|backend/remote-state/"
|
||||||
|
|
||||||
|
# Skip generated code for protobufs.
|
||||||
|
skip=$skip"|internal/planproto|internal/tfplugin5|internal/tfplugin6"
|
||||||
|
|
||||||
|
packages=$(go list ./... | egrep -v ${skip})
|
||||||
|
|
||||||
|
# We are skipping style-related checks, since terraform intentionally breaks
|
||||||
|
# some of these. The goal here is to find issues that reduce code clarity, or
|
||||||
|
# may result in bugs.
|
||||||
|
staticcheck -checks 'all,-ST*' ${packages}
|
|
@ -80,7 +80,7 @@ func main() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
protocGenGoGrpcExec, err := buildProtocGenGoGrpc(workDir)
|
_, err = buildProtocGenGoGrpc(workDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,7 @@ func main() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
protocGenGoGrpcExec, err = filepath.Abs(protocGenGoExec)
|
protocGenGoGrpcExec, err := filepath.Abs(protocGenGoExec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,4 +10,5 @@ import (
|
||||||
_ "golang.org/x/tools/cmd/cover"
|
_ "golang.org/x/tools/cmd/cover"
|
||||||
_ "golang.org/x/tools/cmd/stringer"
|
_ "golang.org/x/tools/cmd/stringer"
|
||||||
_ "google.golang.org/grpc/cmd/protoc-gen-go-grpc"
|
_ "google.golang.org/grpc/cmd/protoc-gen-go-grpc"
|
||||||
|
_ "honnef.co/go/tools/cmd/staticcheck"
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue