cmd/gitmirror: prevent a panic and log on bogus ref line in parseRefs

Updates golang/go#29560

Change-Id: I397b38af3dc421b5de6e6a799ad6b0e5ccab62f3
Reviewed-on: https://go-review.googlesource.com/c/156341
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
diff --git a/cmd/gitmirror/gitmirror.go b/cmd/gitmirror/gitmirror.go
index 901e60e..f9d75af 100644
--- a/cmd/gitmirror/gitmirror.go
+++ b/cmd/gitmirror/gitmirror.go
@@ -1529,8 +1529,15 @@
 	if err := cmd.Start(); err != nil {
 		return nil, err
 	}
+	var line int
 	for bs.Scan() {
+		line++
 		f := strings.Fields(bs.Text())
+		if len(f) < 2 {
+			log.Printf("WARNING: skipping bogus ref line %d, %q (report this to https://golang.org/issue/29560)", line, bs.Text())
+			log.Printf("         refHash so far: %d entries, %s\n", condTrunc(fmt.Sprintf("%q", refHash), 500))
+			continue
+		}
 		refHash[f[1]] = f[0]
 	}
 	if err := bs.Err(); err != nil {
@@ -1571,3 +1578,10 @@
 		fmt.Fprintf(w, "%s\n", kv)
 	}
 }
+
+func condTrunc(s string, n int) string {
+	if len(s) <= n {
+		return s
+	}
+	return s[:n] + "...(truncated)"
+}