blob: 7b015a57b488b8b8147208c844c92f070860982d [file] [log] [blame] [edit]
package edit
import (
"bytes"
"fmt"
"os"
"os/exec"
"github.com/bazelbuild/buildtools/build"
)
type defaultBuildifier struct{}
// buildify formats the build file f.
// Runs opts.Buildifier if it's non-empty, otherwise uses built-in formatter.
// opts.Buildifier is useful to force consistency with other tools that call Buildifier.
func (b *defaultBuildifier) Buildify(opts *Options, f *build.File) ([]byte, error) {
if opts.Buildifier == "" {
// Current AST may be not entirely correct, e.g. it may contain Ident which
// value is a chunk of code, like "f(x)". The AST should be printed and
// re-read to parse such expressions correctly.
contents := build.Format(f)
newF, err := build.Parse(f.Path, contents)
if err != nil {
return nil, err
}
return build.Format(newF), nil
}
cmd := exec.Command(opts.Buildifier, "--type=build")
data := build.Format(f)
cmd.Stdin = bytes.NewBuffer(data)
stdout := bytes.NewBuffer(nil)
stderr := bytes.NewBuffer(nil)
cmd.Stdout = stdout
cmd.Stderr = stderr
cmd.Env = append(
os.Environ(),
// Custom environment variables
)
err := cmd.Run()
if stderr.Len() > 0 {
return nil, fmt.Errorf("%s", stderr.Bytes())
}
if err != nil {
return nil, err
}
return stdout.Bytes(), nil
}