Skip to content

Commit

Permalink
feat: preserve original formatting, maintaining things like comments …
Browse files Browse the repository at this point in the history
…in the generated dockerfile (#9)
  • Loading branch information
BradLewis authored May 13, 2024
1 parent 4e65b90 commit 050e475
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 17 deletions.
18 changes: 15 additions & 3 deletions cmd/anchor/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,20 +89,32 @@ var rootCmd = &cobra.Command{
}
appendArch := len(options.Architectures) > 1

content, err := os.Open(options.InputFile)
if err != nil {
return err
}
defer content.Close()
lines := []string{}
scanner := bufio.NewScanner(content)
for scanner.Scan() {
lines = append(lines, scanner.Text())
}

if err := scanner.Err(); err != nil {
return err
}
for _, architecture := range options.Architectures {
content, err := os.Open(options.InputFile)
if err != nil {
return err
}

defer content.Close()
result, err := parser.Parse(content)
if err != nil {
return err
}

node := result.AST
anchor.PrintNode(node)

color.Cyan("Anchoring to architecture: %s\n", architecture)
image := ""
Expand All @@ -112,7 +124,7 @@ var rootCmd = &cobra.Command{
}

var builder strings.Builder
anchor.WriteDockerfile(&builder, node, true)
anchor.WriteDockerfile(&builder, node, true, 0, lines)
outputName := options.OutputFile
if appendArch {
outputName = fmt.Sprintf("%s.%s", outputName, architecture)
Expand Down
31 changes: 17 additions & 14 deletions docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,19 @@ func attachDockerSha(node *parser.Node) (string, error) {
return node.Value, nil
}

func WriteDockerfile(builder *strings.Builder, node *parser.Node, useOriginal bool) {
func WriteDockerfile(builder *strings.Builder, node *parser.Node, useOriginal bool, currentLine int, lines []string) int {
// this allows us to maintain things like comments and newlines in the original Dockerfile
if currentLine != 0 && node.StartLine != 0 && currentLine < node.StartLine {
for i := currentLine + 1; i < node.StartLine; i++ {
builder.WriteString(lines[i-1])
builder.WriteString("\n")
}
}
if currentLine == 0 {
currentLine = 1
} else if node.EndLine != 0 {
currentLine = node.EndLine
}
if node.Value == "FROM" || node.Value == "RUN" {
useOriginal = false
}
Expand All @@ -47,24 +59,15 @@ func WriteDockerfile(builder *strings.Builder, node *parser.Node, useOriginal bo
builder.WriteString(s)
}
for _, child := range node.Children {
WriteDockerfile(builder, child, useOriginal)
builder.WriteString("\n\n")
currentLine = WriteDockerfile(builder, child, useOriginal, currentLine, lines)
builder.WriteString("\n")
}

if node.Next != nil {
builder.WriteString(" ")
WriteDockerfile(builder, node.Next, useOriginal)
}
}

func PrintNode(node *parser.Node) {
for _, child := range node.Children {
PrintNode(child)
}

if node.Next != nil {
PrintNode(node.Next)
currentLine = WriteDockerfile(builder, node.Next, useOriginal, currentLine, lines)
}
return currentLine
}

func ParseNode(ctx context.Context, node *parser.Node, architecture string, image *string) error {
Expand Down

0 comments on commit 050e475

Please sign in to comment.