Skip to content

Commit

Permalink
Make output modes configurable
Browse files Browse the repository at this point in the history
Added "fix" and "diff" modes
  • Loading branch information
yugui committed Aug 3, 2016
1 parent eef9965 commit e556b33
Show file tree
Hide file tree
Showing 6 changed files with 214 additions and 7 deletions.
25 changes: 21 additions & 4 deletions go/tools/gazel/gazel/BUILD
Original file line number Diff line number Diff line change
@@ -1,10 +1,27 @@
load("@io_bazel_rules_go//go:def.bzl", "go_binary")
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_binary", "go_test")

go_binary(
name = "gazel",
srcs = ["main.go"],
go_library(
name = "go_default_library",
srcs = [
"diff.go",
"fix.go",
"main.go",
"print.go",
],
deps = [
"@io_bazel_buildifier//core:go_default_library",
"@io_bazel_buildifier//differ:go_default_library",
"//go/tools/gazel/generator:go_default_library",
],
)

go_binary(
name = "gazel",
library = ":go_default_library",
)

go_test(
name = "gazel_test",
srcs = ["fix_test.go"],
library = ":go_default_library",
)
52 changes: 52 additions & 0 deletions go/tools/gazel/gazel/diff.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/* Copyright 2016 The Bazel Authors. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package main

import (
"io/ioutil"
"os"

bzl "github.com/bazelbuild/buildifier/core"
"github.com/bazelbuild/buildifier/differ"
)

func diffFile(file *bzl.File) (err error) {
f, err := ioutil.TempFile("", "BUILD")
if err != nil {
return err
}
defer func() {
merr := os.Remove(f.Name())
if err == nil {
err = merr
}
}()
defer f.Close()
if _, err = f.Write(bzl.Format(file)); err != nil {
return err
}
if err := f.Sync(); err != nil {
return err
}

diff := differ.Find()
if _, err := os.Stat(file.Path); os.IsNotExist(err) {
diff.Show(os.DevNull, f.Name())
return nil
}
diff.Show(file.Path, f.Name())
return nil
}
27 changes: 27 additions & 0 deletions go/tools/gazel/gazel/fix.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/* Copyright 2016 The Bazel Authors. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package main

import (
"io/ioutil"

bzl "github.com/bazelbuild/buildifier/core"
)

func fixFile(file *bzl.File) error {
// TODO(yugui): Respect exisiting manual configurations as well as possible
return ioutil.WriteFile(file.Path, bzl.Format(file), 0644)
}
64 changes: 64 additions & 0 deletions go/tools/gazel/gazel/fix_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/* Copyright 2016 The Bazel Authors. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package main

import (
"io/ioutil"
"os"
"path/filepath"
"testing"

bzl "github.com/bazelbuild/buildifier/core"
)

func TestFixFile(t *testing.T) {
tmpdir := os.Getenv("TEST_TMPDIR")
dir, err := ioutil.TempDir(tmpdir, "")
if err != nil {
t.Fatalf("ioutil.TempDir(%q, %q) failed with %v; want success", tmpdir, "", err)
}
defer os.RemoveAll(dir)

stubFile := &bzl.File{
Path: filepath.Join(dir, "BUILD"),
Stmt: []bzl.Expr{
&bzl.CallExpr{
X: &bzl.LiteralExpr{Token: "foo_rule"},
List: []bzl.Expr{
&bzl.BinaryExpr{
X: &bzl.LiteralExpr{Token: "name"},
Op: "=",
Y: &bzl.StringExpr{Value: "bar"},
},
},
},
},
}

if err := fixFile(stubFile); err != nil {
t.Errorf("fixFile(%#v) failed with %v; want success", stubFile, err)
return
}

buf, err := ioutil.ReadFile(stubFile.Path)
if err != nil {
t.Errorf("ioutil.ReadFile(%q) failed with %v; want success", stubFile.Path, err)
return
}
if got, want := string(buf), bzl.FormatString(stubFile); got != want {
t.Errorf("buf = %q; want %q", got, want)
}
}
26 changes: 23 additions & 3 deletions go/tools/gazel/gazel/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"fmt"
"log"
"os"
"path/filepath"

bzl "github.com/bazelbuild/buildifier/core"
"github.com/bazelbuild/rules_go/go/tools/gazel/generator"
Expand All @@ -31,9 +32,16 @@ var (
rulesGoRepo = flag.String("rules_go_repo", generator.DefaultRulesGoRepo, "repository name of rules_go")
goPrefix = flag.String("go_prefix", "", "go_prefix of the target workspace")
repoRoot = flag.String("repo_root", "", "path to a directory which corresponds to go_prefix")
mode = flag.String("mode", "print", "print, fix or diff")
)

func run(dirs []string) error {
var modeFromName = map[string]func(*bzl.File) error{
"print": printFile,
"fix": fixFile,
"diff": diffFile,
}

func run(dirs []string, emit func(*bzl.File) error) error {
g, err := generator.New(*repoRoot, *goPrefix)
if err != nil {
return err
Expand All @@ -46,7 +54,8 @@ func run(dirs []string) error {
return err
}
for _, f := range files {
if _, err := os.Stdout.Write(bzl.Format(f)); err != nil {
f.Path = filepath.Join(*repoRoot, f.Path)
if err := emit(f); err != nil {
return err
}
}
Expand All @@ -68,6 +77,11 @@ It takes a list of paths to Go package directories.
It recursively traverses its subpackages.
All the directories must be under the directory specified in -repo_root.
There are several modes of gazel.
In print mode, gazel prints reconciled BUILD files to stdout.
In fix mode, gazel creates BUILD files or updates existing ones.
In diff mode, gazel shows diff.
FLAGS:
`)
flag.PrintDefaults()
Expand All @@ -89,7 +103,13 @@ func main() {
// TODO(yugui): Guess repoRoot at the same time as goPrefix
*repoRoot = flag.Arg(0)
}
if err := run(flag.Args()); err != nil {

emit := modeFromName[*mode]
if emit == nil {
log.Fatalf("unrecognized mode %s", *mode)
}

if err := run(flag.Args(), emit); err != nil {
log.Fatal(err)
}
}
27 changes: 27 additions & 0 deletions go/tools/gazel/gazel/print.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/* Copyright 2016 The Bazel Authors. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package main

import (
"os"

bzl "github.com/bazelbuild/buildifier/core"
)

func printFile(f *bzl.File) (err error) {
_, err = os.Stdout.Write(bzl.Format(f))
return err
}

0 comments on commit e556b33

Please sign in to comment.