github.com/leg100/ots@v0.0.7-0.20210919080622-034055ced4bd/delete_backend_config.go (about)

     1  package ots
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"os"
     7  	"path/filepath"
     8  
     9  	"github.com/hashicorp/hcl/v2"
    10  	"github.com/hashicorp/hcl/v2/hclwrite"
    11  )
    12  
    13  func deleteBackendConfigFromDirectory(ctx context.Context, exe *Executor) error {
    14  	return filepath.Walk(exe.Path, func(path string, info os.FileInfo, err error) error {
    15  		if err != nil {
    16  			return nil
    17  		}
    18  
    19  		if exe.Path != path && info.IsDir() {
    20  			return filepath.SkipDir
    21  		}
    22  
    23  		if filepath.Ext(path) != ".tf" {
    24  			return nil
    25  		}
    26  
    27  		in, err := os.ReadFile(path)
    28  		if err != nil {
    29  			return nil
    30  		}
    31  
    32  		deleted, out, err := deleteBackendConfig(in)
    33  		if err != nil {
    34  			return nil
    35  		}
    36  
    37  		if deleted {
    38  			if err := os.WriteFile(path, out, 0644); err != nil {
    39  				return err
    40  			}
    41  		}
    42  
    43  		return nil
    44  	})
    45  }
    46  
    47  func deleteBackendConfig(config []byte) (bool, []byte, error) {
    48  	var deleted bool
    49  
    50  	f, diags := hclwrite.ParseConfig([]byte(config), "", hcl.Pos{Line: 1, Column: 1})
    51  	if diags.HasErrors() {
    52  		return false, nil, fmt.Errorf("unable to parse HCL: %s", diags.Error())
    53  	}
    54  
    55  OuterLoop:
    56  	for _, block := range f.Body().Blocks() {
    57  		if block.Type() == "terraform" {
    58  			for _, b2 := range block.Body().Blocks() {
    59  				if b2.Type() == "backend" {
    60  					block.Body().RemoveBlock(b2)
    61  					deleted = true
    62  					break OuterLoop
    63  				}
    64  			}
    65  		}
    66  	}
    67  
    68  	return deleted, f.Bytes(), nil
    69  }