From 851770f01f04a0a480149de08a871c0378bc3fed Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 7 Jun 2017 22:15:38 +0000 Subject: [PATCH] cmd/go-contrib-init: add start of new tool to help new Go contributors Updates golang/go#17802 Change-Id: Ieb4be41039d414a3ba6766d98ed95a6154f964f4 Reviewed-on: https://go-review.googlesource.com/45078 Reviewed-by: Steve Francia --- cmd/go-contrib-init/contrib.go | 83 ++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 cmd/go-contrib-init/contrib.go diff --git a/cmd/go-contrib-init/contrib.go b/cmd/go-contrib-init/contrib.go new file mode 100644 index 00000000..6f304ad9 --- /dev/null +++ b/cmd/go-contrib-init/contrib.go @@ -0,0 +1,83 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// The go-contrib-init command helps new Go contributors get their development +// environment set up for the Go contribution process. +// +// It aims to be a complement or alternative to https://golang.org/doc/contribute.html. +package main + +import ( + "bytes" + "flag" + "io/ioutil" + "log" + "os" + "path/filepath" + "runtime" + "strings" +) + +var repo = flag.String("repo", "go", "Which go repo you want to contribute to. Use \"go\" for the core, or e.g. \"net\" for golang.org/x/net/*") + +func main() { + log.SetFlags(0) + flag.Parse() + + checkCLA() + checkGoroot() + checkWorkingDir() +} + +func checkCLA() { + slurp, err := ioutil.ReadFile(cookiesFile()) + if err != nil && !os.IsNotExist(err) { + log.Fatal(err) + } + if bytes.Contains(slurp, []byte("go.googlesource.com")) && + bytes.Contains(slurp, []byte("go-review.googlesource.com")) { + // Probably good. + return + } + log.Fatal("Your .gitcookies file isn't configured.\n" + + "Next steps:\n" + + " * Submit a CLA (https://golang.org/doc/contribute.html#cla) if not done\n" + + " * Go to https://go.googlesource.com/ and click \"Generate Password\" at the top,\n" + + " then follow instructions.\n" + + " * Run go-contrib-init again.\n") +} + +func cookiesFile() string { + if runtime.GOOS == "windows" { + return filepath.Join(os.Getenv("USERPROFILE"), ".gitcookies") + } + return filepath.Join(os.Getenv("HOME"), ".gitcookies") +} + +func checkGoroot() { + v := os.Getenv("GOROOT") + if v == "" { + return + } + if *repo == "go" { + if strings.HasPrefix(v, "/usr/") { + log.Fatalf("Your GOROOT environment variable is set to %q\n"+ + "This is almost certainly not what you want. Either unset\n"+ + "your GOROOT or set it to the path of your development version\n"+ + "of Go.", v) + } + slurp, err := ioutil.ReadFile(filepath.Join(v, "VERSION")) + if err == nil { + slurp = bytes.TrimSpace(slurp) + log.Fatalf("Your GOROOT environment variable is set to %q\n"+ + "But that path is to a binary release of Go, with VERSION file %q.\n"+ + "You should hack on Go in a fresh checkout of Go. Fix or unset your GOROOT.\n", + v, slurp) + } + } +} + +func checkWorkingDir() { + // TODO +}