|  | package tfexec | 
|  |  | 
|  | import ( | 
|  | "context" | 
|  | "fmt" | 
|  | "os/exec" | 
|  | ) | 
|  |  | 
|  | type upgrade012Config struct { | 
|  | dir   string | 
|  | force bool | 
|  |  | 
|  | reattachInfo ReattachInfo | 
|  | } | 
|  |  | 
|  | var defaultUpgrade012Options = upgrade012Config{ | 
|  | force: false, | 
|  | } | 
|  |  | 
|  | // Upgrade012Option represents options used in the Destroy method. | 
|  | type Upgrade012Option interface { | 
|  | configureUpgrade012(*upgrade012Config) | 
|  | } | 
|  |  | 
|  | func (opt *DirOption) configureUpgrade012(conf *upgrade012Config) { | 
|  | conf.dir = opt.path | 
|  | } | 
|  |  | 
|  | func (opt *ForceOption) configureUpgrade012(conf *upgrade012Config) { | 
|  | conf.force = opt.force | 
|  | } | 
|  |  | 
|  | func (opt *ReattachOption) configureUpgrade012(conf *upgrade012Config) { | 
|  | conf.reattachInfo = opt.info | 
|  | } | 
|  |  | 
|  | // Upgrade012 represents the terraform 0.12upgrade subcommand. | 
|  | func (tf *Terraform) Upgrade012(ctx context.Context, opts ...Upgrade012Option) error { | 
|  | cmd, err := tf.upgrade012Cmd(ctx, opts...) | 
|  | if err != nil { | 
|  | return err | 
|  | } | 
|  | return tf.runTerraformCmd(ctx, cmd) | 
|  | } | 
|  |  | 
|  | func (tf *Terraform) upgrade012Cmd(ctx context.Context, opts ...Upgrade012Option) (*exec.Cmd, error) { | 
|  | err := tf.compatible(ctx, tf0_12_0, tf0_13_0) | 
|  | if err != nil { | 
|  | return nil, fmt.Errorf("terraform 0.12upgrade is only supported in 0.12 releases: %w", err) | 
|  | } | 
|  |  | 
|  | c := defaultUpgrade012Options | 
|  |  | 
|  | for _, o := range opts { | 
|  | o.configureUpgrade012(&c) | 
|  | } | 
|  |  | 
|  | args := []string{"0.12upgrade", "-no-color", "-yes"} | 
|  |  | 
|  | // boolean opts: only pass if set | 
|  | if c.force { | 
|  | args = append(args, "-force") | 
|  | } | 
|  |  | 
|  | // optional positional argument | 
|  | if c.dir != "" { | 
|  | args = append(args, c.dir) | 
|  | } | 
|  |  | 
|  | mergeEnv := map[string]string{} | 
|  | if c.reattachInfo != nil { | 
|  | reattachStr, err := c.reattachInfo.marshalString() | 
|  | if err != nil { | 
|  | return nil, err | 
|  | } | 
|  | mergeEnv[reattachEnvVar] = reattachStr | 
|  | } | 
|  |  | 
|  | return tf.buildTerraformCmd(ctx, mergeEnv, args...), nil | 
|  | } |