github.com/hashicorp/packer@v1.14.3/cmd/generate-fixer-deprecations/main.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package main
     5  
     6  import (
     7  	"bytes"
     8  	"flag"
     9  	"fmt"
    10  	"go/format"
    11  	"os"
    12  	"path/filepath"
    13  	"strings"
    14  	"text/template"
    15  
    16  	"github.com/hashicorp/packer/fix"
    17  )
    18  
    19  var deprecatedOptsTemplate = template.Must(template.New("deprecatedOptsTemplate").Funcs(template.FuncMap{"StringsJoin": strings.Join}).Parse(`//<!-- Code generated by generate-fixer-deprecations; DO NOT EDIT MANUALLY -->
    20  
    21  package config
    22  
    23  var DeprecatedOptions = map[string][]string{
    24  {{- range $key, $value := .DeprecatedOpts}}
    25  	"{{$key}}": []string{"{{ StringsJoin . "\", \"" }}"},
    26  {{- end}}
    27  }
    28  `))
    29  
    30  type executeOpts struct {
    31  	DeprecatedOpts map[string][]string
    32  }
    33  
    34  func main() {
    35  	// Figure out location in directory structure
    36  	args := flag.Args()
    37  	if len(args) == 0 {
    38  		// Default: process the file
    39  		args = []string{os.Getenv("GOFILE")}
    40  	}
    41  	fname := args[0]
    42  
    43  	absFilePath, err := filepath.Abs(fname)
    44  	if err != nil {
    45  		panic(err)
    46  	}
    47  	paths := strings.Split(absFilePath, "cmd"+string(os.PathSeparator)+
    48  		"generate-fixer-deprecations"+string(os.PathSeparator)+"main.go")
    49  	packerDir := paths[0]
    50  
    51  	// Load all deprecated options from all active fixers
    52  	allDeprecatedOpts := map[string][]string{}
    53  	for _, name := range fix.FixerOrder {
    54  		fixer, ok := fix.Fixers[name]
    55  		if !ok {
    56  			panic("fixer not found: " + name)
    57  		}
    58  
    59  		deprecated := fixer.DeprecatedOptions()
    60  		for k, v := range deprecated {
    61  			if allDeprecatedOpts[k] == nil {
    62  				allDeprecatedOpts[k] = v
    63  			} else {
    64  				allDeprecatedOpts[k] = append(allDeprecatedOpts[k], v...)
    65  			}
    66  		}
    67  	}
    68  
    69  	deprecated_path := filepath.Join(packerDir, "packer-plugin-sdk", "template",
    70  		"config", "deprecated_options.go")
    71  
    72  	buf := bytes.Buffer{}
    73  
    74  	// execute template into buffer
    75  	deprecated := &executeOpts{DeprecatedOpts: allDeprecatedOpts}
    76  	err = deprecatedOptsTemplate.Execute(&buf, deprecated)
    77  	if err != nil {
    78  		panic(err)
    79  	}
    80  	// we've written unformatted go code to the file. now we have to format it.
    81  	out, err := format.Source(buf.Bytes())
    82  	if err != nil {
    83  		panic(err)
    84  	}
    85  
    86  	outputFile, err := os.Create(deprecated_path)
    87  	if err != nil {
    88  		panic(err)
    89  	}
    90  	_, err = outputFile.Write(out)
    91  	defer outputFile.Close()
    92  	if err != nil {
    93  		fmt.Printf("%v", err)
    94  		os.Exit(1)
    95  	}
    96  }