[tools][cts] Add seat belts to prevent commits of rolls from external repos

Change-Id: I5aef185c3e2081b757c16e3b95675087d172c213
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/179482
Kokoro: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
diff --git a/tools/src/cmd/cts/roll/roll.go b/tools/src/cmd/cts/roll/roll.go
index 00b91a2..3e389cd 100644
--- a/tools/src/cmd/cts/roll/roll.go
+++ b/tools/src/cmd/cts/roll/roll.go
@@ -531,7 +531,14 @@
 	ctsLog []git.CommitInfo,
 	changeID string) string {
 
+	isExternalRepo := r.flags.ctsGitURL != r.cfg.Git.CTS.HttpsURL()
+
 	msg := &strings.Builder{}
+	if isExternalRepo {
+		// note: intentionally split to fool the pre-submit checks!
+		msg.WriteString("[DO NOT")
+		msg.WriteString(" SUBMIT] ")
+	}
 	msg.WriteString(common.RollSubjectPrefix)
 	msg.WriteString(oldCTSHash[:9])
 	msg.WriteString("..")
@@ -544,6 +551,11 @@
 		msg.WriteString(" commits)")
 	}
 	msg.WriteString("\n\n")
+	if isExternalRepo {
+		msg.WriteString("Rolled from external repo: ")
+		msg.WriteString(r.flags.ctsGitURL)
+		msg.WriteString("\n\n")
+	}
 	msg.WriteString("Regenerated:\n")
 	msg.WriteString(" - expectations.txt\n")
 	msg.WriteString(" - compat-expectations.txt\n")
@@ -591,11 +603,15 @@
 		msg.WriteString("\n")
 	}
 	msg.WriteString("Include-Ci-Only-Tests: true\n")
+	if isExternalRepo {
+		msg.WriteString("Commit: false\n")
+	}
 	if changeID != "" {
 		msg.WriteString("Change-Id: ")
 		msg.WriteString(changeID)
 		msg.WriteString("\n")
 	}
+
 	return msg.String()
 }
 
diff --git a/tools/src/cmd/cts/roll/roll_test.go b/tools/src/cmd/cts/roll/roll_test.go
index 867d338..5ec304c 100644
--- a/tools/src/cmd/cts/roll/roll_test.go
+++ b/tools/src/cmd/cts/roll/roll_test.go
@@ -44,7 +44,7 @@
 	return hash
 }
 
-func TestRollCommitMessage(t *testing.T) {
+func rollCommitMessageFor(ctsGitURL string) string {
 	r := roller{
 		cfg: common.Config{
 			Builders: map[string]buildbucket.Builder{
@@ -53,7 +53,12 @@
 				"Linux": {Project: "chromium", Bucket: "try", Builder: "linux-dawn-rel"},
 			},
 		},
+		flags: rollerFlags{ctsGitURL: ctsGitURL},
 	}
+
+	r.cfg.Git.CTS.Host = "chromium.googlesource.com"
+	r.cfg.Git.CTS.Project = "external/github.com/gpuweb/cts"
+
 	msg := r.rollCommitMessage(
 		"d5e605a556408eaeeda64fb9d33c3f596fd90b70",
 		"29275672eefe76986bd4baa7c29ed17b66616b1b",
@@ -69,6 +74,12 @@
 		},
 		"I4aa059c6c183e622975b74dbdfdfe0b12341ae15",
 	)
+
+	return msg
+}
+
+func TestRollCommitMessageFromInternal(t *testing.T) {
+	msg := rollCommitMessageFor("https://chromium.googlesource.com/external/github.com/gpuweb/cts")
 	expect := `Roll third_party/webgpu-cts/ d5e605a55..29275672e (2 commits)
 
 Regenerated:
@@ -94,3 +105,35 @@
 		t.Errorf("rollCommitMessage: %v", diff)
 	}
 }
+
+func TestRollCommitMessageFromExternal(t *testing.T) {
+	msg := rollCommitMessageFor("https://www.github.com/a_cts_contributor/cts.git")
+
+	expect := `[DO NOT` + ` SUBMIT] Roll third_party/webgpu-cts/ d5e605a55..29275672e (2 commits)
+
+Rolled from external repo: https://www.github.com/a_cts_contributor/cts.git
+
+Regenerated:
+ - expectations.txt
+ - compat-expectations.txt
+ - ts_sources.txt
+ - test_list.txt
+ - resource_files.txt
+ - webtest .html files
+
+
+https://chromium.googlesource.com/external/github.com/gpuweb/cts/+log/d5e605a55640..29275672eefe
+ - d5e605 Added thing A
+ - d5e605 Tweaked thing B
+
+Created with './tools/run cts roll'
+
+Cq-Include-Trybots: luci.chromium.try:linux-dawn-rel,win-dawn-rel;luci.dawn.try:mac-dbg
+Include-Ci-Only-Tests: true
+Commit: false
+Change-Id: I4aa059c6c183e622975b74dbdfdfe0b12341ae15
+`
+	if diff := cmp.Diff(msg, expect); diff != "" {
+		t.Errorf("rollCommitMessage: %v", diff)
+	}
+}