command: Extract reused hclwrite helper code
This commit is contained in:
parent
a740b739e0
commit
e2be704d81
|
@ -267,35 +267,9 @@ func (c *ZeroThirteenUpgradeCommand) Run(args []string) int {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var out *hclwrite.File
|
// Open or create the output file
|
||||||
|
out, openDiags := c.openOrCreateFile(filename)
|
||||||
// If the output file doesn't exist, just create a new empty file
|
diags = diags.Append(openDiags)
|
||||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
|
||||||
out = hclwrite.NewEmptyFile()
|
|
||||||
} else if err != nil {
|
|
||||||
diags = diags.Append(tfdiags.Sourceless(
|
|
||||||
tfdiags.Error,
|
|
||||||
"Unable to read configuration file",
|
|
||||||
fmt.Sprintf("Error when reading configuration file %q: %s", filename, err),
|
|
||||||
))
|
|
||||||
c.showDiagnostics(diags)
|
|
||||||
return 1
|
|
||||||
} else {
|
|
||||||
// Configuration file already exists, so load and parse it
|
|
||||||
config, err := ioutil.ReadFile(filename)
|
|
||||||
if err != nil {
|
|
||||||
diags = diags.Append(tfdiags.Sourceless(
|
|
||||||
tfdiags.Error,
|
|
||||||
"Unable to read configuration file",
|
|
||||||
fmt.Sprintf("Error when reading configuration file %q: %s", filename, err),
|
|
||||||
))
|
|
||||||
c.showDiagnostics(diags)
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
var parseDiags hcl.Diagnostics
|
|
||||||
out, parseDiags = hclwrite.ParseConfig(config, filename, hcl.InitialPos)
|
|
||||||
diags = diags.Append(parseDiags)
|
|
||||||
}
|
|
||||||
|
|
||||||
if diags.HasErrors() {
|
if diags.HasErrors() {
|
||||||
c.showDiagnostics(diags)
|
c.showDiagnostics(diags)
|
||||||
|
@ -390,7 +364,7 @@ func (c *ZeroThirteenUpgradeCommand) Run(args []string) int {
|
||||||
expr := rp.Expr().BuildTokens(nil)
|
expr := rp.Expr().BuildTokens(nil)
|
||||||
|
|
||||||
// Partition the tokens into before and after the opening brace
|
// Partition the tokens into before and after the opening brace
|
||||||
before, after := partitionTokensAfter(expr, hclsyntax.TokenOBrace)
|
before, after := c.partitionTokensAfter(expr, hclsyntax.TokenOBrace)
|
||||||
|
|
||||||
// If the value is an empty object, add a newline between the
|
// If the value is an empty object, add a newline between the
|
||||||
// braces so that the comment is not on the same line as either
|
// braces so that the comment is not on the same line as either
|
||||||
|
@ -436,23 +410,9 @@ func (c *ZeroThirteenUpgradeCommand) Run(args []string) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the config back to the file
|
// Write the config back to the file
|
||||||
f, err := os.OpenFile(filename, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644)
|
writeDiags := c.writeFile(out, filename)
|
||||||
if err != nil {
|
diags = diags.Append(writeDiags)
|
||||||
diags = diags.Append(tfdiags.Sourceless(
|
if diags.HasErrors() {
|
||||||
tfdiags.Error,
|
|
||||||
"Unable to open configuration file for writing",
|
|
||||||
fmt.Sprintf("Error when reading configuration file %q: %s", filename, err),
|
|
||||||
))
|
|
||||||
c.showDiagnostics(diags)
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
_, err = out.WriteTo(f)
|
|
||||||
if err != nil {
|
|
||||||
diags = diags.Append(tfdiags.Sourceless(
|
|
||||||
tfdiags.Error,
|
|
||||||
"Unable to rewrite configuration file",
|
|
||||||
fmt.Sprintf("Error when rewriting configuration file %q: %s", filename, err),
|
|
||||||
))
|
|
||||||
c.showDiagnostics(diags)
|
c.showDiagnostics(diags)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
@ -461,35 +421,8 @@ func (c *ZeroThirteenUpgradeCommand) Run(args []string) int {
|
||||||
// update that file to set the required version constraint in the first
|
// update that file to set the required version constraint in the first
|
||||||
// terraform block.
|
// terraform block.
|
||||||
if filename != versionsFilename {
|
if filename != versionsFilename {
|
||||||
var file *hclwrite.File
|
file, openDiags := c.openOrCreateFile(versionsFilename)
|
||||||
|
diags = diags.Append(openDiags)
|
||||||
// If the versions file doesn't exist, just create a new empty file
|
|
||||||
if _, err := os.Stat(versionsFilename); os.IsNotExist(err) {
|
|
||||||
file = hclwrite.NewEmptyFile()
|
|
||||||
} else if err != nil {
|
|
||||||
diags = diags.Append(tfdiags.Sourceless(
|
|
||||||
tfdiags.Error,
|
|
||||||
"Unable to read configuration file",
|
|
||||||
fmt.Sprintf("Error when reading configuration file %q: %s", versionsFilename, err),
|
|
||||||
))
|
|
||||||
c.showDiagnostics(diags)
|
|
||||||
return 1
|
|
||||||
} else {
|
|
||||||
// Versions file already exists, so load and parse it
|
|
||||||
config, err := ioutil.ReadFile(versionsFilename)
|
|
||||||
if err != nil {
|
|
||||||
diags = diags.Append(tfdiags.Sourceless(
|
|
||||||
tfdiags.Error,
|
|
||||||
"Unable to read configuration file",
|
|
||||||
fmt.Sprintf("Error when reading configuration file %q: %s", versionsFilename, err),
|
|
||||||
))
|
|
||||||
c.showDiagnostics(diags)
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
var parseDiags hcl.Diagnostics
|
|
||||||
file, parseDiags = hclwrite.ParseConfig(config, filename, hcl.InitialPos)
|
|
||||||
diags = diags.Append(parseDiags)
|
|
||||||
}
|
|
||||||
|
|
||||||
if diags.HasErrors() {
|
if diags.HasErrors() {
|
||||||
c.showDiagnostics(diags)
|
c.showDiagnostics(diags)
|
||||||
|
@ -513,23 +446,9 @@ func (c *ZeroThirteenUpgradeCommand) Run(args []string) int {
|
||||||
tfBlock.Body().SetAttributeValue("required_version", cty.StringVal(">= 0.13"))
|
tfBlock.Body().SetAttributeValue("required_version", cty.StringVal(">= 0.13"))
|
||||||
|
|
||||||
// Write the config back to the file
|
// Write the config back to the file
|
||||||
f, err := os.OpenFile(versionsFilename, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644)
|
writeDiags := c.writeFile(file, versionsFilename)
|
||||||
if err != nil {
|
diags = diags.Append(writeDiags)
|
||||||
diags = diags.Append(tfdiags.Sourceless(
|
if diags.HasErrors() {
|
||||||
tfdiags.Error,
|
|
||||||
"Unable to open configuration file for writing",
|
|
||||||
fmt.Sprintf("Error when reading configuration file %q: %s", filename, err),
|
|
||||||
))
|
|
||||||
c.showDiagnostics(diags)
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
_, err = file.WriteTo(f)
|
|
||||||
if err != nil {
|
|
||||||
diags = diags.Append(tfdiags.Sourceless(
|
|
||||||
tfdiags.Error,
|
|
||||||
"Unable to rewrite configuration file",
|
|
||||||
fmt.Sprintf("Error when rewriting configuration file %q: %s", filename, err),
|
|
||||||
))
|
|
||||||
c.showDiagnostics(diags)
|
c.showDiagnostics(diags)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
@ -576,23 +495,9 @@ func (c *ZeroThirteenUpgradeCommand) Run(args []string) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the config back to the file
|
// Write the config back to the file
|
||||||
f, err := os.OpenFile(path, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644)
|
writeDiags := c.writeFile(file, path)
|
||||||
if err != nil {
|
diags = diags.Append(writeDiags)
|
||||||
diags = diags.Append(tfdiags.Sourceless(
|
if diags.HasErrors() {
|
||||||
tfdiags.Error,
|
|
||||||
"Unable to open configuration file for writing",
|
|
||||||
fmt.Sprintf("Error when reading configuration file %q: %s", filename, err),
|
|
||||||
))
|
|
||||||
c.showDiagnostics(diags)
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
_, err = file.WriteTo(f)
|
|
||||||
if err != nil {
|
|
||||||
diags = diags.Append(tfdiags.Sourceless(
|
|
||||||
tfdiags.Error,
|
|
||||||
"Unable to rewrite configuration file",
|
|
||||||
fmt.Sprintf("Error when rewriting configuration file %q: %s", filename, err),
|
|
||||||
))
|
|
||||||
c.showDiagnostics(diags)
|
c.showDiagnostics(diags)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
@ -655,11 +560,65 @@ func (c *ZeroThirteenUpgradeCommand) detectProviderSources(requiredProviders map
|
||||||
return diags
|
return diags
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *ZeroThirteenUpgradeCommand) openOrCreateFile(filename string) (*hclwrite.File, tfdiags.Diagnostics) {
|
||||||
|
var diags tfdiags.Diagnostics
|
||||||
|
|
||||||
|
// If the file doesn't exist, create a new empty file
|
||||||
|
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||||
|
return hclwrite.NewEmptyFile(), diags
|
||||||
|
} else if err != nil {
|
||||||
|
diags = diags.Append(tfdiags.Sourceless(
|
||||||
|
tfdiags.Error,
|
||||||
|
"Unable to read configuration file",
|
||||||
|
fmt.Sprintf("Error when reading configuration file %q: %s", filename, err),
|
||||||
|
))
|
||||||
|
return nil, diags
|
||||||
|
} else {
|
||||||
|
// File already exists, so load and parse it
|
||||||
|
config, err := ioutil.ReadFile(filename)
|
||||||
|
if err != nil {
|
||||||
|
diags = diags.Append(tfdiags.Sourceless(
|
||||||
|
tfdiags.Error,
|
||||||
|
"Unable to read configuration file",
|
||||||
|
fmt.Sprintf("Error when reading configuration file %q: %s", filename, err),
|
||||||
|
))
|
||||||
|
return nil, diags
|
||||||
|
}
|
||||||
|
file, parseDiags := hclwrite.ParseConfig(config, filename, hcl.InitialPos)
|
||||||
|
diags = diags.Append(parseDiags)
|
||||||
|
return file, diags
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *ZeroThirteenUpgradeCommand) writeFile(file *hclwrite.File, filename string) tfdiags.Diagnostics {
|
||||||
|
var diags tfdiags.Diagnostics
|
||||||
|
|
||||||
|
f, err := os.OpenFile(filename, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644)
|
||||||
|
if err != nil {
|
||||||
|
diags = diags.Append(tfdiags.Sourceless(
|
||||||
|
tfdiags.Error,
|
||||||
|
"Unable to open configuration file for writing",
|
||||||
|
fmt.Sprintf("Error when reading configuration file %q: %s", filename, err),
|
||||||
|
))
|
||||||
|
return diags
|
||||||
|
}
|
||||||
|
_, err = file.WriteTo(f)
|
||||||
|
if err != nil {
|
||||||
|
diags = diags.Append(tfdiags.Sourceless(
|
||||||
|
tfdiags.Error,
|
||||||
|
"Unable to rewrite configuration file",
|
||||||
|
fmt.Sprintf("Error when rewriting configuration file %q: %s", filename, err),
|
||||||
|
))
|
||||||
|
return diags
|
||||||
|
}
|
||||||
|
return diags
|
||||||
|
}
|
||||||
|
|
||||||
// Take a list of tokens and a separator token, and return two lists: one up to
|
// Take a list of tokens and a separator token, and return two lists: one up to
|
||||||
// and including the first instance of the separator, and the rest of the
|
// and including the first instance of the separator, and the rest of the
|
||||||
// tokens. If the separator is not present, return the entire list in the first
|
// tokens. If the separator is not present, return the entire list in the first
|
||||||
// return value.
|
// return value.
|
||||||
func partitionTokensAfter(tokens hclwrite.Tokens, separator hclsyntax.TokenType) (hclwrite.Tokens, hclwrite.Tokens) {
|
func (c *ZeroThirteenUpgradeCommand) partitionTokensAfter(tokens hclwrite.Tokens, separator hclsyntax.TokenType) (hclwrite.Tokens, hclwrite.Tokens) {
|
||||||
for i := 0; i < len(tokens); i++ {
|
for i := 0; i < len(tokens); i++ {
|
||||||
if tokens[i].Type == separator {
|
if tokens[i].Type == separator {
|
||||||
return tokens[0 : i+1], tokens[i+1:]
|
return tokens[0 : i+1], tokens[i+1:]
|
||||||
|
|
Loading…
Reference in New Issue