cmd/tip: improve precondition checking, less ambiguous arguments

Check that the required repository HEAD revisions are present before
attempting to clone said repositories.

Use '--' to separate paths and make git invocations less ambiguous.

Updates golang/go#32949

Change-Id: Ie0c771c38a047d674fea5a74318ed396fd03c7ce
Reviewed-on: https://go-review.googlesource.com/c/build/+/185138
Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
diff --git a/cmd/tip/golangorg.go b/cmd/tip/golangorg.go
index f26a372..0ce4ca1 100644
--- a/cmd/tip/golangorg.go
+++ b/cmd/tip/golangorg.go
@@ -29,6 +29,12 @@
 }
 
 func (b golangorgBuilder) Init(logger *log.Logger, dir, hostport string, heads map[string]string) (*exec.Cmd, error) {
+	if _, ok := heads["go"]; !ok {
+		return nil, fmt.Errorf("missing HEAD revision for 'go' repo")
+	}
+	if _, ok := heads["website"]; !ok {
+		return nil, fmt.Errorf("missing HEAD revision for 'website' repo")
+	}
 	goDir := filepath.Join(dir, "go")
 	websiteDir := filepath.Join(dir, "website")
 	logger.Printf("checking out go repo ...")
diff --git a/cmd/tip/talks.go b/cmd/tip/talks.go
index cc1472e..f2e7cd6 100644
--- a/cmd/tip/talks.go
+++ b/cmd/tip/talks.go
@@ -24,6 +24,9 @@
 const talksToolsRev = "8cab8a1319f0be9798e7fe78b15da75e5f94b2e9"
 
 func (b talksBuilder) Init(logger *log.Logger, dir, hostport string, heads map[string]string) (*exec.Cmd, error) {
+	if _, ok := heads["talks"]; !ok {
+		return nil, fmt.Errorf("missing HEAD revision for 'talks' repo")
+	}
 	// TODO: use logger
 	toolsDir := filepath.Join(dir, "gopath/src/golang.org/x/tools")
 	if err := checkout(repoURL+"tools", talksToolsRev, toolsDir); err != nil {
diff --git a/cmd/tip/tip.go b/cmd/tip/tip.go
index 278a7da..744763b 100644
--- a/cmd/tip/tip.go
+++ b/cmd/tip/tip.go
@@ -302,7 +302,7 @@
 		if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
 			return fmt.Errorf("mkdir: %v", err)
 		}
-		if err := runErr(exec.Command("git", "clone", "--depth", "1", repo, path)); err != nil {
+		if err := runErr(exec.Command("git", "clone", "--depth", "1", "--", repo, path)); err != nil {
 			return fmt.Errorf("clone: %v", err)
 		}
 	} else if err != nil {
@@ -315,7 +315,7 @@
 	if err := runErr(cmd); err != nil {
 		return fmt.Errorf("fetch: %v", err)
 	}
-	cmd = exec.Command("git", "reset", "--hard", hash)
+	cmd = exec.Command("git", "reset", "--hard", hash, "--")
 	cmd.Dir = path
 	if err := runErr(cmd); err != nil {
 		return fmt.Errorf("reset: %v", err)
@@ -334,6 +334,8 @@
 // latest master hash.
 // The returned map is nil on any transient error.
 func gerritMetaMap() map[string]string {
+	// TODO(dmitshur): Replace with a Gerrit client implementation like in gitmirror.
+
 	res, err := timeoutClient.Get(metaURL)
 	if err != nil {
 		log.Printf("Error getting Gerrit meta map: %v", err)