// InitConfig initialises a .plzconfig template in the given directory. func InitConfig(dir string, bazelCompatibility bool) { if dir == "." { core.FindRepoRoot(false) if core.RepoRoot != "" { config := path.Join(core.RepoRoot, core.ConfigFileName) if !prompter.YN(fmt.Sprintf("You already seem to be in a plz repo (found %s). Continue?", config), false) { os.Exit(1) } } } dir, err := filepath.Abs(dir) if err != nil { log.Warning("Can't determine absolute directory: %s", err) } config := path.Join(dir, core.ConfigFileName) contents := fmt.Sprintf(configTemplate, core.PleaseVersion) if bazelCompatibility { contents += bazelCompatibilityConfig } if err := ioutil.WriteFile(config, []byte(contents), 0644); err != nil { log.Fatalf("Failed to write file: %s", err) } fmt.Printf("Wrote config template to %s, you're now ready to go!\n", config) // Now write the wrapper script data := MustAsset(wrapperScriptName) if err := ioutil.WriteFile(wrapperScriptName, data, 0755); err != nil { log.Fatalf("Failed to write file: %s", err) } fmt.Printf("\nAlso wrote wrapper script to %s; users can invoke that directly to run Please, even without it installed.\n", wrapperScriptName) }
func main() { parser, extraArgs, flagsErr := cli.ParseFlags("Please", &opts, os.Args) // Note that we must leave flagsErr for later, because it may be affected by aliases. if opts.OutputFlags.Version { fmt.Printf("Please version %s\n", core.PleaseVersion) os.Exit(0) // Ignore other errors if --version was passed. } if opts.OutputFlags.Colour { output.SetColouredOutput(true) } else if opts.OutputFlags.NoColour { output.SetColouredOutput(false) } if opts.OutputFlags.ShowAllOutput { opts.OutputFlags.PlainOutput = true } // Init logging, but don't do file output until we've chdir'd. cli.InitLogging(opts.OutputFlags.Verbosity) command := activeCommand(parser) if command == "init" { if flagsErr != nil { // This error otherwise doesn't get checked until later. cli.ParseFlagsFromArgsOrDie("Please", core.PleaseVersion.String(), &opts, os.Args) } // If we're running plz init then we obviously don't expect to read a config file. utils.InitConfig(opts.Init.Dir, opts.Init.BazelCompatibility) os.Exit(0) } if opts.BuildFlags.RepoRoot == "" { core.FindRepoRoot(true) log.Debug("Found repo root at %s", core.RepoRoot) } else { core.RepoRoot = opts.BuildFlags.RepoRoot } // Please always runs from the repo root, so move there now. if err := os.Chdir(core.RepoRoot); err != nil { log.Fatalf("%s", err) } // Reset this now we're at the repo root. if opts.OutputFlags.LogFile != "" { cli.InitFileLogging(path.Join(core.RepoRoot, opts.OutputFlags.LogFile), opts.OutputFlags.LogFileLevel) } config = readConfig(command == "update") // Set this in case anything wants to use it soon core.NewBuildState(config.Please.NumThreads, nil, opts.OutputFlags.Verbosity, config) // Now we've read the config file, we may need to re-run the parser; the aliases in the config // can affect how we parse otherwise illegal flag combinations. if flagsErr != nil || len(extraArgs) > 0 { argv := strings.Join(os.Args, " ") for k, v := range config.Aliases { argv = strings.Replace(argv, k, v, 1) } parser = cli.ParseFlagsFromArgsOrDie("Please", core.PleaseVersion.String(), &opts, strings.Fields(argv)) command = activeCommand(parser) } if !buildFunctions[command]() { os.Exit(7) // Something distinctive, is sometimes useful to identify this externally. } }