/* 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. */ // Command gazelle is a BUILD file generator for Go projects. // See "gazelle --help" for more details. package main import ( "flag" "fmt" "log" "os" "github.com/bazelbuild/bazel-gazelle/config" "github.com/bazelbuild/bazel-gazelle/language" ) type command int const ( updateCmd command = iota fixCmd updateReposCmd helpCmd ) var commandFromName = map[string]command{ "fix": fixCmd, "help": helpCmd, "update": updateCmd, "update-repos": updateReposCmd, } var nameFromCommand = []string{ // keep in sync with definition above "update", "fix", "update-repos", "help", } func (cmd command) String() string { return nameFromCommand[cmd] } func main() { log.SetPrefix("gazelle: ") log.SetFlags(0) // don't print timestamps var wd string if wsDir := os.Getenv("BUILD_WORKSPACE_DIRECTORY"); wsDir != "" { wd = wsDir } else { var err error if wd, err = os.Getwd(); err != nil { log.Fatal(err) } } if err := run(wd, os.Args[1:]); err != nil && err != flag.ErrHelp { if err == errExit { os.Exit(1) } else { log.Fatal(err) } } } func run(wd string, args []string) error { cmd := updateCmd if len(args) == 1 && (args[0] == "-h" || args[0] == "-help" || args[0] == "--help") { cmd = helpCmd } else if len(args) > 0 { c, ok := commandFromName[args[0]] if ok { cmd = c args = args[1:] } } switch cmd { case fixCmd, updateCmd: return runFixUpdate(wd, cmd, args) case helpCmd: return help() case updateReposCmd: return updateRepos(wd, args) default: log.Panicf("unknown command: %v", cmd) } return nil } func help() error { fmt.Fprint(os.Stderr, `usage: gazelle [args...] Gazelle is a BUILD file generator for Go projects. It can create new BUILD files for a project that follows "go build" conventions, and it can update BUILD files if they already exist. It can be invoked directly in a project workspace, or it can be run on an external dependency during the build as part of the go_repository rule. Gazelle may be run with one of the commands below. If no command is given, Gazelle defaults to "update". update - Gazelle will create new BUILD files or update existing BUILD files if needed. fix - in addition to the changes made in update, Gazelle will make potentially breaking changes. For example, it may delete obsolete rules or rename existing rules. update-repos - updates repository rules in the WORKSPACE file. Run with -h for details. help - show this message. For usage information for a specific command, run the command with the -h flag. For example: gazelle update -h Gazelle is under active development, and its interface may change without notice. `) return flag.ErrHelp } // filterLanguages returns the subset of input languages that pass the config's // filter, if any. Gazelle should not generate rules for languages not returned. func filterLanguages(c *config.Config, langs []language.Language) []language.Language { if len(c.Langs) == 0 { return langs } var result []language.Language for _, inputLang := range langs { if containsLang(c.Langs, inputLang) { result = append(result, inputLang) } } return result } func containsLang(langNames []string, lang language.Language) bool { for _, langName := range langNames { if langName == lang.Name() { return true } } return false }