[autoroll] Refactor commit message

Change-Id: I1ad9af90e840ed3b6e547a31d769a052b39876c1
Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/285220
Commit-Queue: Eric Boren <borenet@google.com>
Reviewed-by: Ravi Mistry <rmistry@google.com>
diff --git a/autoroll/config/afdo-chromium.json b/autoroll/config/afdo-chromium.json
index 1199451..c0b76d0 100644
--- a/autoroll/config/afdo-chromium.json
+++ b/autoroll/config/afdo-chromium.json
@@ -1,7 +1,21 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "AFDO",
+  "childDisplayName": "AFDO",
+  "commitMsg": {
+    "template": "{{- define \"boilerplate\" -}}\n\
+This CL may cause a small binary size increase, roughly proportional\n\
+to how long it's been since our last AFDO profile roll. For larger\n\
+increases (around or exceeding 100KB), please file a bug against\n\
+gbiv@chromium.org. Additional context: https://crbug.com/805539\n\
+\n\
+Please note that, despite rolling to chrome/android, this profile is\n\
+used for both Linux and Android.\n\
+\n\
+{{ template \"defaultBoilerplate\" . }}\n\
+{{- end -}}",
+    "includeTbrLine": true
+  },
   "contacts": [
     "gbiv@chromium.org"
   ],
@@ -13,7 +27,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "afdo-chromium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.google.com.iam.gserviceaccount.com",
@@ -23,31 +37,6 @@
   "semVerGCSRepoManager": {
     "childBranch": "master",
     "childPath": "chrome/android/profiles/newest.txt",
-    "commitMsgTmpl": "Roll AFDO from {{.RollingFrom.String}} to {{.RollingTo.String}}\n\
-\n\
-This CL may cause a small binary size increase, roughly proportional\n\
-to how long it's been since our last AFDO profile roll. For larger\n\
-increases (around or exceeding 100KB), please file a bug against\n\
-gbiv@chromium.org. Additional context: https://crbug.com/805539\n\
-\n\
-Please note that, despite rolling to chrome/android, this profile is\n\
-used for both Linux and Android.\n\
-\n\
-If this roll has caused a breakage, revert this CL and stop the roller\n\
-using the controls here:\n\
-{{.ServerURL}}\n\
-Please CC {{stringsJoin .Reviewers \",\"}} on the revert to ensure that a human\n\
-is aware of the problem.\n\
-\n\
-To report a problem with the AutoRoller itself, please file a bug:\n\
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug\n\
-\n\
-Documentation for the AutoRoller is here:\n\
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md\n\
-\n\
-{{if .CqExtraTrybots}}Cq-Include-Trybots: {{.CqExtraTrybots}}\n\
-{{end}}Tbr: {{stringsJoin .Reviewers \",\"}}\n\
-",
     "gcsBucket": "chromeos-prebuilt",
     "gcsPath": "afdo-job/llvm",
     "parentBranch": "master",
diff --git a/autoroll/config/angle-chromium.json b/autoroll/config/angle-chromium.json
index ebd4e49..6946230 100644
--- a/autoroll/config/angle-chromium.json
+++ b/autoroll/config/angle-chromium.json
@@ -1,7 +1,24 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "ANGLE",
+  "childDisplayName": "ANGLE",
+  "commitMsg": {
+    "bugProject": "chromium",
+    "childLogURLTmpl": "https://chromium.googlesource.com/angle/angle.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chromium.try:android_optional_gpu_tests_rel",
+      "luci.chromium.try:linux_optional_gpu_tests_rel",
+      "luci.chromium.try:mac_optional_gpu_tests_rel",
+      "luci.chromium.try:win-asan",
+      "luci.chromium.try:win_optional_gpu_tests_rel",
+      "luci.chromium.try:linux-swangle-try-x64",
+      "luci.chromium.try:win-swangle-try-x86",
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "jmadill@google.com"
   ],
@@ -13,7 +30,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "angle-chromium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -28,21 +45,9 @@
     "childPath": "src/third_party/angle",
     "childRepo": "https://chromium.googlesource.com/angle/angle.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/angle/angle.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chromium.try:android_optional_gpu_tests_rel",
-    "luci.chromium.try:linux_optional_gpu_tests_rel",
-    "luci.chromium.try:mac_optional_gpu_tests_rel",
-    "luci.chromium.try:win-asan",
-    "luci.chromium.try:win_optional_gpu_tests_rel",
-    "luci.chromium.try:linux-swangle-try-x64",
-    "luci.chromium.try:win-swangle-try-x86",
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/angle-skia.json b/autoroll/config/angle-skia.json
index 9b3f494..9e92878 100644
--- a/autoroll/config/angle-skia.json
+++ b/autoroll/config/angle-skia.json
@@ -1,7 +1,24 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "ANGLE",
+  "childDisplayName": "ANGLE",
+  "commitMsg": {
+    "bugProject": "chromium",
+    "childLogURLTmpl": "https://chromium.googlesource.com/angle/angle.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "skia/skia.primary:Build-Debian10-Clang-x86_64-Release-ANGLE",
+      "skia/skia.primary:Test-Win10-Clang-AlphaR2-GPU-RadeonR9M470X-x86_64-Debug-All-ANGLE",
+      "skia/skia.primary:Test-Win10-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-ANGLE",
+      "skia/skia.primary:Test-Win10-Clang-NUC5i7RYH-GPU-IntelIris6100-x86_64-Debug-All-ANGLE",
+      "skia/skia.primary:Test-Win10-Clang-NUC6i5SYK-GPU-IntelIris540-x86_64-Debug-All-ANGLE",
+      "skia/skia.primary:Test-Win10-Clang-NUC8i5BEK-GPU-IntelIris655-x86_64-Debug-All-ANGLE",
+      "skia/skia.primary:Test-Win10-Clang-NUCD34010WYKH-GPU-IntelHD4400-x86_64-Debug-All-ANGLE"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "jmadill@google.com"
   ],
@@ -13,7 +30,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Skia",
+  "parentDisplayName": "Skia",
   "parentWaterfall": "https://status.skia.org",
   "rollerName": "angle-skia-autoroll",
   "serviceAccount": "skia-autoroll@skia-public.iam.gserviceaccount.com",
@@ -26,20 +43,9 @@
     "childPath": "third_party/externals/angle2",
     "childRepo": "https://chromium.googlesource.com/angle/angle.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/angle/angle.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://skia.googlesource.com/skia.git"
   },
-  "cqExtraTrybots": [
-    "skia/skia.primary:Build-Debian10-Clang-x86_64-Release-ANGLE",
-    "skia/skia.primary:Test-Win10-Clang-AlphaR2-GPU-RadeonR9M470X-x86_64-Debug-All-ANGLE",
-    "skia/skia.primary:Test-Win10-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-ANGLE",
-    "skia/skia.primary:Test-Win10-Clang-NUC5i7RYH-GPU-IntelIris6100-x86_64-Debug-All-ANGLE",
-    "skia/skia.primary:Test-Win10-Clang-NUC6i5SYK-GPU-IntelIris540-x86_64-Debug-All-ANGLE",
-    "skia/skia.primary:Test-Win10-Clang-NUC8i5BEK-GPU-IntelIris655-x86_64-Debug-All-ANGLE",
-    "skia/skia.primary:Test-Win10-Clang-NUCD34010WYKH-GPU-IntelHD4400-x86_64-Debug-All-ANGLE"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/binaryen-emscripten-releases.json b/autoroll/config/binaryen-emscripten-releases.json
index 3cbda90..0451ef5 100644
--- a/autoroll/config/binaryen-emscripten-releases.json
+++ b/autoroll/config/binaryen-emscripten-releases.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "binaryen",
+  "childDisplayName": "binaryen",
+  "commitMsg": {
+    "bugProject": "",
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/WebAssembly/binaryen.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "dschuff@google.com"
   ],
@@ -13,7 +21,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "emscripten-releases",
+  "parentDisplayName": "emscripten-releases",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "binaryen-emscripten-releases",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,8 +33,6 @@
     "childPath": "emscripten-releases/binaryen",
     "childRepo": "https://chromium.googlesource.com/external/github.com/WebAssembly/binaryen.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/WebAssembly/binaryen.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/emscripten-releases.git"
   },
diff --git a/autoroll/config/catapult-chromium.json b/autoroll/config/catapult-chromium.json
index 79c6631..e73376c 100644
--- a/autoroll/config/catapult-chromium.json
+++ b/autoroll/config/catapult-chromium.json
@@ -1,7 +1,22 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Catapult",
+  "childDisplayName": "Catapult",
+  "commitMsg": {
+    "bugProject": "chromium",
+    "childLogURLTmpl": "https://chromium.googlesource.com/catapult.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chromium.try:android_optional_gpu_tests_rel",
+      "luci.chromium.try:chromeos-kevin-rel",
+      "luci.chromium.try:linux_optional_gpu_tests_rel",
+      "luci.chromium.try:mac_optional_gpu_tests_rel",
+      "luci.chromium.try:win_optional_gpu_tests_rel"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "chrome-speed-operations@google.com",
     "johnchen@chromium.org",
@@ -18,7 +33,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "catapult-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -33,19 +48,9 @@
     "childPath": "src/third_party/catapult",
     "childRepo": "https://chromium.googlesource.com/catapult.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/catapult.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chromium.try:android_optional_gpu_tests_rel",
-    "luci.chromium.try:chromeos-kevin-rel",
-    "luci.chromium.try:linux_optional_gpu_tests_rel",
-    "luci.chromium.try:mac_optional_gpu_tests_rel",
-    "luci.chromium.try:win_optional_gpu_tests_rel"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/chromite-chromium.json b/autoroll/config/chromite-chromium.json
index 7f59c0a..7b1d268 100644
--- a/autoroll/config/chromite-chromium.json
+++ b/autoroll/config/chromite-chromium.json
@@ -1,7 +1,18 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Chromite",
+  "childDisplayName": "Chromite",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/chromiumos/chromite.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chrome.try:chromeos-betty-pi-arc-chrome",
+      "luci.chromium.try:chromeos-kevin-rel"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "bpastene@google.com"
   ],
@@ -13,7 +24,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "chromite-chromium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -26,15 +37,9 @@
     "childPath": "src/third_party/chromite",
     "childRepo": "https://chromium.googlesource.com/chromiumos/chromite.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/chromiumos/chromite.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chrome.try:chromeos-betty-pi-arc-chrome",
-    "luci.chromium.try:chromeos-kevin-rel"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/chromium-skia.json b/autoroll/config/chromium-skia.json
index c31e7ef..6d8020e 100644
--- a/autoroll/config/chromium-skia.json
+++ b/autoroll/config/chromium-skia.json
@@ -1,7 +1,18 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Chromium",
+  "childDisplayName": "Chromium",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/chromium/src.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "skia/skia.primary:Perf-Mac10.13-Clang-MacBookPro11.5-GPU-RadeonHD8870M-x86_64-Release-All-CommandBuffer",
+      "skia/skia.primary:Test-Mac10.13-Clang-MacBookPro11.5-GPU-RadeonHD8870M-x86_64-Debug-All-CommandBuffer"
+    ],
+    "includeLog": false,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "borenet@google.com"
   ],
@@ -13,7 +24,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Skia",
+  "parentDisplayName": "Skia",
   "parentWaterfall": "https://status.skia.org",
   "rollerName": "chromium-skia-autoroll",
   "serviceAccount": "skia-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,15 +36,9 @@
     "childPath": "../src",
     "childRepo": "https://chromium.googlesource.com/chromium/src.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/chromium/src.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": false,
     "parentBranch": "master",
     "parentRepo": "https://skia.googlesource.com/skia.git"
   },
-  "cqExtraTrybots": [
-    "skia/skia.primary:Perf-Mac10.13-Clang-MacBookPro11.5-GPU-RadeonHD8870M-x86_64-Release-All-CommandBuffer",
-    "skia/skia.primary:Test-Mac10.13-Clang-MacBookPro11.5-GPU-RadeonHD8870M-x86_64-Debug-All-CommandBuffer"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/chromiumos-config-infra.json b/autoroll/config/chromiumos-config-infra.json
index ec9a70e..d723772 100644
--- a/autoroll/config/chromiumos-config-infra.json
+++ b/autoroll/config/chromiumos-config-infra.json
@@ -1,7 +1,14 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "chromiumos/config",
+  "childDisplayName": "chromiumos/config",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/chromiumos/config.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "chromeos-infra-discuss@google.com",
     "pprabhu@google.com",
@@ -15,7 +22,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "infra",
+  "parentDisplayName": "infra",
   "parentWaterfall": "https://ci.chromium.org/p/infra/g/infra/console",
   "rollerName": "chromiumos-config-infra-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -28,9 +35,6 @@
     "childPath": "infra/go/src/go.chromium.org/chromiumos/config",
     "childRepo": "https://chromium.googlesource.com/chromiumos/config.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/chromiumos/config.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/infra/infra.git"
   },
diff --git a/autoroll/config/cros-afdo-airmont-chromium-beta.json b/autoroll/config/cros-afdo-airmont-chromium-beta.json
index 021c444..e1d099b 100644
--- a/autoroll/config/cros-afdo-airmont-chromium-beta.json
+++ b/autoroll/config/cros-afdo-airmont-chromium-beta.json
@@ -1,7 +1,13 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "ChromeOS Airmont AFDO profile",
+  "childDisplayName": "ChromeOS Airmont AFDO profile",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "gbiv@google.com",
     "tcwang@google.com"
@@ -14,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium Beta Branch",
+  "parentDisplayName": "Chromium Beta Branch",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "cros-afdo-airmont-chromium-beta",
   "serviceAccount": "chromium-release-autoroll@skia-public.google.com.iam.gserviceaccount.com",
@@ -24,23 +30,6 @@
   "semVerGCSRepoManager": {
     "childBranch": "master",
     "childPath": "chromeos/profiles/airmont.afdo.newest.txt",
-    "commitMsgTmpl": "Roll airmont AFDO profile from {{.RollingFrom.String}} to {{.RollingTo.String}}\n\
-\n\
-If this roll has caused a breakage, revert this CL and stop the roller\n\
-using the controls here:\n\
-{{.ServerURL}}\n\
-Please CC {{stringsJoin .Reviewers \",\"}} on the revert to ensure that a human\n\
-is aware of the problem.\n\
-\n\
-To report a problem with the AutoRoller itself, please file a bug:\n\
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug\n\
-\n\
-Documentation for the AutoRoller is here:\n\
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md\n\
-\n\
-{{if .CqExtraTrybots}}Cq-Include-Trybots: {{.CqExtraTrybots}}\n\
-{{end}}Tbr: {{stringsJoin .Reviewers \",\"}}\n\
-",
     "gcsBucket": "chromeos-prebuilt",
     "gcsPath": "afdo-job/vetted/release",
     "parentBranch": "refs/branch-heads/4103", // m83
diff --git a/autoroll/config/cros-afdo-airmont-chromium-stable.json b/autoroll/config/cros-afdo-airmont-chromium-stable.json
index f7bbd66..95feec8 100644
--- a/autoroll/config/cros-afdo-airmont-chromium-stable.json
+++ b/autoroll/config/cros-afdo-airmont-chromium-stable.json
@@ -1,7 +1,13 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "ChromeOS Airmont AFDO profile",
+  "childDisplayName": "ChromeOS Airmont AFDO profile",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "gbiv@google.com",
     "tcwang@google.com"
@@ -14,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium Stable Branch",
+  "parentDisplayName": "Chromium Stable Branch",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "cros-afdo-airmont-chromium-stable",
   "serviceAccount": "chromium-release-autoroll@skia-public.google.com.iam.gserviceaccount.com",
@@ -24,23 +30,6 @@
   "semVerGCSRepoManager": {
     "childBranch": "master",
     "childPath": "chromeos/profiles/airmont.afdo.newest.txt",
-    "commitMsgTmpl": "Roll airmont AFDO profile from {{.RollingFrom.String}} to {{.RollingTo.String}}\n\
-\n\
-If this roll has caused a breakage, revert this CL and stop the roller\n\
-using the controls here:\n\
-{{.ServerURL}}\n\
-Please CC {{stringsJoin .Reviewers \",\"}} on the revert to ensure that a human\n\
-is aware of the problem.\n\
-\n\
-To report a problem with the AutoRoller itself, please file a bug:\n\
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug\n\
-\n\
-Documentation for the AutoRoller is here:\n\
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md\n\
-\n\
-{{if .CqExtraTrybots}}Cq-Include-Trybots: {{.CqExtraTrybots}}\n\
-{{end}}Tbr: {{stringsJoin .Reviewers \",\"}}\n\
-",
     "gcsBucket": "chromeos-prebuilt",
     "gcsPath": "afdo-job/vetted/release",
     "parentBranch": "refs/branch-heads/4044", // m81
diff --git a/autoroll/config/cros-afdo-airmont-chromium.json b/autoroll/config/cros-afdo-airmont-chromium.json
index 38a2301..8a5269a 100644
--- a/autoroll/config/cros-afdo-airmont-chromium.json
+++ b/autoroll/config/cros-afdo-airmont-chromium.json
@@ -1,7 +1,13 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "ChromeOS Airmont AFDO profile",
+  "childDisplayName": "ChromeOS Airmont AFDO profile",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "tcwang@google.com"
   ],
@@ -13,7 +19,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "cros-afdo-airmont-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.google.com.iam.gserviceaccount.com",
@@ -23,23 +29,6 @@
   "semVerGCSRepoManager": {
     "childBranch": "master",
     "childPath": "chromeos/profiles/airmont.afdo.newest.txt",
-    "commitMsgTmpl": "Roll airmont AFDO profile from {{.RollingFrom.String}} to {{.RollingTo.String}}\n\
-\n\
-If this roll has caused a breakage, revert this CL and stop the roller\n\
-using the controls here:\n\
-{{.ServerURL}}\n\
-Please CC {{stringsJoin .Reviewers \",\"}} on the revert to ensure that a human\n\
-is aware of the problem.\n\
-\n\
-To report a problem with the AutoRoller itself, please file a bug:\n\
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug\n\
-\n\
-Documentation for the AutoRoller is here:\n\
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md\n\
-\n\
-{{if .CqExtraTrybots}}Cq-Include-Trybots: {{.CqExtraTrybots}}\n\
-{{end}}Tbr: {{stringsJoin .Reviewers \",\"}}\n\
-",
     "gcsBucket": "chromeos-prebuilt",
     "gcsPath": "afdo-job/vetted/release",
     "parentBranch": "master",
diff --git a/autoroll/config/cros-afdo-broadwell-chromium-beta.json b/autoroll/config/cros-afdo-broadwell-chromium-beta.json
index 6c68153..55d7142 100644
--- a/autoroll/config/cros-afdo-broadwell-chromium-beta.json
+++ b/autoroll/config/cros-afdo-broadwell-chromium-beta.json
@@ -1,7 +1,13 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "ChromeOS Broadwell AFDO profile",
+  "childDisplayName": "ChromeOS Broadwell AFDO profile",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "gbiv@google.com",
     "tcwang@google.com"
@@ -14,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium Beta Branch",
+  "parentDisplayName": "Chromium Beta Branch",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "cros-afdo-broadwell-chromium-beta",
   "serviceAccount": "chromium-release-autoroll@skia-public.google.com.iam.gserviceaccount.com",
@@ -24,23 +30,6 @@
   "semVerGCSRepoManager": {
     "childBranch": "master",
     "childPath": "chromeos/profiles/broadwell.afdo.newest.txt",
-    "commitMsgTmpl": "Roll broadwell AFDO profile from {{.RollingFrom.String}} to {{.RollingTo.String}}\n\
-\n\
-If this roll has caused a breakage, revert this CL and stop the roller\n\
-using the controls here:\n\
-{{.ServerURL}}\n\
-Please CC {{stringsJoin .Reviewers \",\"}} on the revert to ensure that a human\n\
-is aware of the problem.\n\
-\n\
-To report a problem with the AutoRoller itself, please file a bug:\n\
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug\n\
-\n\
-Documentation for the AutoRoller is here:\n\
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md\n\
-\n\
-{{if .CqExtraTrybots}}Cq-Include-Trybots: {{.CqExtraTrybots}}\n\
-{{end}}Tbr: {{stringsJoin .Reviewers \",\"}}\n\
-",
     "gcsBucket": "chromeos-prebuilt",
     "gcsPath": "afdo-job/vetted/release",
     "parentBranch": "refs/branch-heads/4103", // m83
diff --git a/autoroll/config/cros-afdo-broadwell-chromium-stable.json b/autoroll/config/cros-afdo-broadwell-chromium-stable.json
index d3a9210..3649779 100644
--- a/autoroll/config/cros-afdo-broadwell-chromium-stable.json
+++ b/autoroll/config/cros-afdo-broadwell-chromium-stable.json
@@ -1,7 +1,13 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "ChromeOS Broadwell AFDO profile",
+  "childDisplayName": "ChromeOS Broadwell AFDO profile",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "gbiv@google.com",
     "tcwang@google.com"
@@ -14,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium Stable Branch",
+  "parentDisplayName": "Chromium Stable Branch",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "cros-afdo-broadwell-chromium-stable",
   "serviceAccount": "chromium-release-autoroll@skia-public.google.com.iam.gserviceaccount.com",
@@ -24,23 +30,6 @@
   "semVerGCSRepoManager": {
     "childBranch": "master",
     "childPath": "chromeos/profiles/broadwell.afdo.newest.txt",
-    "commitMsgTmpl": "Roll broadwell AFDO profile from {{.RollingFrom.String}} to {{.RollingTo.String}}\n\
-\n\
-If this roll has caused a breakage, revert this CL and stop the roller\n\
-using the controls here:\n\
-{{.ServerURL}}\n\
-Please CC {{stringsJoin .Reviewers \",\"}} on the revert to ensure that a human\n\
-is aware of the problem.\n\
-\n\
-To report a problem with the AutoRoller itself, please file a bug:\n\
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug\n\
-\n\
-Documentation for the AutoRoller is here:\n\
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md\n\
-\n\
-{{if .CqExtraTrybots}}Cq-Include-Trybots: {{.CqExtraTrybots}}\n\
-{{end}}Tbr: {{stringsJoin .Reviewers \",\"}}\n\
-",
     "gcsBucket": "chromeos-prebuilt",
     "gcsPath": "afdo-job/vetted/release",
     "parentBranch": "{{.Branches.Chromium.Stable.Ref}}",
diff --git a/autoroll/config/cros-afdo-broadwell-chromium.json b/autoroll/config/cros-afdo-broadwell-chromium.json
index 878ec5f..974ea80 100644
--- a/autoroll/config/cros-afdo-broadwell-chromium.json
+++ b/autoroll/config/cros-afdo-broadwell-chromium.json
@@ -1,7 +1,13 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "ChromeOS Broadwell AFDO profile",
+  "childDisplayName": "ChromeOS Broadwell AFDO profile",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "tcwang@google.com"
   ],
@@ -13,7 +19,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "cros-afdo-broadwell-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.google.com.iam.gserviceaccount.com",
@@ -23,23 +29,6 @@
   "semVerGCSRepoManager": {
     "childBranch": "master",
     "childPath": "chromeos/profiles/broadwell.afdo.newest.txt",
-    "commitMsgTmpl": "Roll broadwell AFDO profile from {{.RollingFrom.String}} to {{.RollingTo.String}}\n\
-\n\
-If this roll has caused a breakage, revert this CL and stop the roller\n\
-using the controls here:\n\
-{{.ServerURL}}\n\
-Please CC {{stringsJoin .Reviewers \",\"}} on the revert to ensure that a human\n\
-is aware of the problem.\n\
-\n\
-To report a problem with the AutoRoller itself, please file a bug:\n\
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug\n\
-\n\
-Documentation for the AutoRoller is here:\n\
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md\n\
-\n\
-{{if .CqExtraTrybots}}Cq-Include-Trybots: {{.CqExtraTrybots}}\n\
-{{end}}Tbr: {{stringsJoin .Reviewers \",\"}}\n\
-",
     "gcsBucket": "chromeos-prebuilt",
     "gcsPath": "afdo-job/vetted/release",
     "parentBranch": "master",
diff --git a/autoroll/config/cros-afdo-silvermont-chromium-beta.json b/autoroll/config/cros-afdo-silvermont-chromium-beta.json
index a96a96d..303bbbe 100644
--- a/autoroll/config/cros-afdo-silvermont-chromium-beta.json
+++ b/autoroll/config/cros-afdo-silvermont-chromium-beta.json
@@ -1,7 +1,13 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "ChromeOS Silvermont AFDO profile",
+  "childDisplayName": "ChromeOS Silvermont AFDO profile",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "gbiv@google.com",
     "tcwang@google.com"
@@ -14,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium Beta Branch",
+  "parentDisplayName": "Chromium Beta Branch",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "cros-afdo-silvermont-chromium-beta",
   "serviceAccount": "chromium-release-autoroll@skia-public.google.com.iam.gserviceaccount.com",
@@ -24,23 +30,6 @@
   "semVerGCSRepoManager": {
     "childBranch": "master",
     "childPath": "chromeos/profiles/silvermont.afdo.newest.txt",
-    "commitMsgTmpl": "Roll silvermont AFDO profile from {{.RollingFrom.String}} to {{.RollingTo.String}}\n\
-\n\
-If this roll has caused a breakage, revert this CL and stop the roller\n\
-using the controls here:\n\
-{{.ServerURL}}\n\
-Please CC {{stringsJoin .Reviewers \",\"}} on the revert to ensure that a human\n\
-is aware of the problem.\n\
-\n\
-To report a problem with the AutoRoller itself, please file a bug:\n\
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug\n\
-\n\
-Documentation for the AutoRoller is here:\n\
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md\n\
-\n\
-{{if .CqExtraTrybots}}Cq-Include-Trybots: {{.CqExtraTrybots}}\n\
-{{end}}Tbr: {{stringsJoin .Reviewers \",\"}}\n\
-",
     "gcsBucket": "chromeos-prebuilt",
     "gcsPath": "afdo-job/vetted/release",
     "parentBranch": "refs/branch-heads/4103", // m83
diff --git a/autoroll/config/cros-afdo-silvermont-chromium-stable.json b/autoroll/config/cros-afdo-silvermont-chromium-stable.json
index eaf6afb..b29d0af 100644
--- a/autoroll/config/cros-afdo-silvermont-chromium-stable.json
+++ b/autoroll/config/cros-afdo-silvermont-chromium-stable.json
@@ -1,7 +1,13 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "ChromeOS Silvermont AFDO profile",
+  "childDisplayName": "ChromeOS Silvermont AFDO profile",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "gbiv@google.com",
     "tcwang@google.com"
@@ -14,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium Stable Branch",
+  "parentDisplayName": "Chromium Stable Branch",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "cros-afdo-silvermont-chromium-stable",
   "serviceAccount": "chromium-release-autoroll@skia-public.google.com.iam.gserviceaccount.com",
@@ -24,23 +30,6 @@
   "semVerGCSRepoManager": {
     "childBranch": "master",
     "childPath": "chromeos/profiles/silvermont.afdo.newest.txt",
-    "commitMsgTmpl": "Roll silvermont AFDO profile from {{.RollingFrom.String}} to {{.RollingTo.String}}\n\
-\n\
-If this roll has caused a breakage, revert this CL and stop the roller\n\
-using the controls here:\n\
-{{.ServerURL}}\n\
-Please CC {{stringsJoin .Reviewers \",\"}} on the revert to ensure that a human\n\
-is aware of the problem.\n\
-\n\
-To report a problem with the AutoRoller itself, please file a bug:\n\
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug\n\
-\n\
-Documentation for the AutoRoller is here:\n\
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md\n\
-\n\
-{{if .CqExtraTrybots}}Cq-Include-Trybots: {{.CqExtraTrybots}}\n\
-{{end}}Tbr: {{stringsJoin .Reviewers \",\"}}\n\
-",
     "gcsBucket": "chromeos-prebuilt",
     "gcsPath": "afdo-job/vetted/release",
     "parentBranch": "refs/branch-heads/4044", // m81
diff --git a/autoroll/config/cros-afdo-silvermont-chromium.json b/autoroll/config/cros-afdo-silvermont-chromium.json
index 6340f5d..2994340 100644
--- a/autoroll/config/cros-afdo-silvermont-chromium.json
+++ b/autoroll/config/cros-afdo-silvermont-chromium.json
@@ -1,7 +1,13 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "ChromeOS Silvermont AFDO profile",
+  "childDisplayName": "ChromeOS Silvermont AFDO profile",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "tcwang@google.com"
   ],
@@ -13,7 +19,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "cros-afdo-silvermont-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.google.com.iam.gserviceaccount.com",
@@ -23,23 +29,6 @@
   "semVerGCSRepoManager": {
     "childBranch": "master",
     "childPath": "chromeos/profiles/silvermont.afdo.newest.txt",
-    "commitMsgTmpl": "Roll silvermont AFDO profile from {{.RollingFrom.String}} to {{.RollingTo.String}}\n\
-\n\
-If this roll has caused a breakage, revert this CL and stop the roller\n\
-using the controls here:\n\
-{{.ServerURL}}\n\
-Please CC {{stringsJoin .Reviewers \",\"}} on the revert to ensure that a human\n\
-is aware of the problem.\n\
-\n\
-To report a problem with the AutoRoller itself, please file a bug:\n\
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug\n\
-\n\
-Documentation for the AutoRoller is here:\n\
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md\n\
-\n\
-{{if .CqExtraTrybots}}Cq-Include-Trybots: {{.CqExtraTrybots}}\n\
-{{end}}Tbr: {{stringsJoin .Reviewers \",\"}}\n\
-",
     "gcsBucket": "chromeos-prebuilt",
     "gcsPath": "afdo-job/vetted/release",
     "parentBranch": "master",
diff --git a/autoroll/config/cros-orderfile-chromium-beta.json b/autoroll/config/cros-orderfile-chromium-beta.json
index 9ab1da8..62f83c8 100644
--- a/autoroll/config/cros-orderfile-chromium-beta.json
+++ b/autoroll/config/cros-orderfile-chromium-beta.json
@@ -1,7 +1,13 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "ChromeOS Orderfiles",
+  "childDisplayName": "ChromeOS Orderfiles",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "tcwang@google.com"
   ],
@@ -13,7 +19,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium Beta Branch",
+  "parentDisplayName": "Chromium Beta Branch",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "cros-orderfile-chromium-beta",
   "serviceAccount": "chromium-release-autoroll@skia-public.google.com.iam.gserviceaccount.com",
@@ -23,23 +29,6 @@
   "semVerGCSRepoManager": {
     "childBranch": "master",
     "childPath": "chromeos/profiles/orderfile.newest.txt",
-    "commitMsgTmpl": "Roll ChromeOS orderfile from {{.RollingFrom.String}} to {{.RollingTo.String}}\n\
-\n\
-If this roll has caused a breakage, revert this CL and stop the roller\n\
-using the controls here:\n\
-{{.ServerURL}}\n\
-Please CC {{stringsJoin .Reviewers \",\"}} on the revert to ensure that a human\n\
-is aware of the problem.\n\
-\n\
-To report a problem with the AutoRoller itself, please file a bug:\n\
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug\n\
-\n\
-Documentation for the AutoRoller is here:\n\
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md\n\
-\n\
-CQ_EXTRA_TRYBOTS={{.CqExtraTrybots}}\n\
-TBR={{stringsJoin .Reviewers \",\"}}\n\
-",
     "gcsBucket": "chromeos-prebuilt",
     "gcsPath": "afdo-job/orderfiles/vetted",
     "parentBranch": "refs/branch-heads/4103", // m83
diff --git a/autoroll/config/cros-orderfile-chromium-stable.json b/autoroll/config/cros-orderfile-chromium-stable.json
index 9832eab..afbbfed 100644
--- a/autoroll/config/cros-orderfile-chromium-stable.json
+++ b/autoroll/config/cros-orderfile-chromium-stable.json
@@ -1,7 +1,13 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "ChromeOS Orderfiles",
+  "childDisplayName": "ChromeOS Orderfiles",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "tcwang@google.com"
   ],
@@ -13,7 +19,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium Stable Branch",
+  "parentDisplayName": "Chromium Stable Branch",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "cros-orderfile-chromium-stable",
   "serviceAccount": "chromium-release-autoroll@skia-public.google.com.iam.gserviceaccount.com",
@@ -23,23 +29,6 @@
   "semVerGCSRepoManager": {
     "childBranch": "master",
     "childPath": "chromeos/profiles/orderfile.newest.txt",
-    "commitMsgTmpl": "Roll ChromeOS orderfile from {{.RollingFrom.String}} to {{.RollingTo.String}}\n\
-\n\
-If this roll has caused a breakage, revert this CL and stop the roller\n\
-using the controls here:\n\
-{{.ServerURL}}\n\
-Please CC {{stringsJoin .Reviewers \",\"}} on the revert to ensure that a human\n\
-is aware of the problem.\n\
-\n\
-To report a problem with the AutoRoller itself, please file a bug:\n\
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug\n\
-\n\
-Documentation for the AutoRoller is here:\n\
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md\n\
-\n\
-CQ_EXTRA_TRYBOTS={{.CqExtraTrybots}}\n\
-TBR={{stringsJoin .Reviewers \",\"}}\n\
-",
     "gcsBucket": "chromeos-prebuilt",
     "gcsPath": "afdo-job/orderfiles/vetted",
     "parentBranch": "refs/branch-heads/4044", // m81
diff --git a/autoroll/config/cros-orderfile-chromium.json b/autoroll/config/cros-orderfile-chromium.json
index c6c0c86..8a9ddd9 100644
--- a/autoroll/config/cros-orderfile-chromium.json
+++ b/autoroll/config/cros-orderfile-chromium.json
@@ -1,7 +1,13 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "ChromeOS Orderfiles",
+  "childDisplayName": "ChromeOS Orderfiles",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "tcwang@google.com"
   ],
@@ -13,7 +19,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "cros-orderfile-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.google.com.iam.gserviceaccount.com",
@@ -23,23 +29,6 @@
   "semVerGCSRepoManager": {
     "childBranch": "master",
     "childPath": "chromeos/profiles/orderfile.newest.txt",
-    "commitMsgTmpl": "Roll ChromeOS orderfile from {{.RollingFrom.String}} to {{.RollingTo.String}}\n\
-\n\
-If this roll has caused a breakage, revert this CL and stop the roller\n\
-using the controls here:\n\
-{{.ServerURL}}\n\
-Please CC {{stringsJoin .Reviewers \",\"}} on the revert to ensure that a human\n\
-is aware of the problem.\n\
-\n\
-To report a problem with the AutoRoller itself, please file a bug:\n\
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug\n\
-\n\
-Documentation for the AutoRoller is here:\n\
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md\n\
-\n\
-{{if .CqExtraTrybots}}Cq-Include-Trybots: {{.CqExtraTrybots}}\n\
-{{end}}Tbr: {{stringsJoin .Reviewers \",\"}}\n\
-",
     "gcsBucket": "chromeos-prebuilt",
     "gcsPath": "afdo-job/orderfiles/vetted",
     "parentBranch": "master",
diff --git a/autoroll/config/cros-proto-infra.json b/autoroll/config/cros-proto-infra.json
index bd6ec51..97e223f 100644
--- a/autoroll/config/cros-proto-infra.json
+++ b/autoroll/config/cros-proto-infra.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "chromiumos/infra/proto",
+  "childDisplayName": "chromiumos/infra/proto",
+  "commitMsg": {
+    "bugProject": "chromium",
+    "childLogURLTmpl": "https://chromium.googlesource.com/chromiumos/infra/proto.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "seanabraham@google.com"
   ],
@@ -13,7 +21,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "infra",
+  "parentDisplayName": "infra",
   "parentWaterfall": "https://ci.chromium.org/p/infra/g/infra/console",
   "rollerName": "cros-proto-infra-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,9 +33,6 @@
     "childPath": "infra/go/src/go.chromium.org/chromiumos/infra/proto",
     "childRepo": "https://chromium.googlesource.com/chromiumos/infra/proto.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/chromiumos/infra/proto.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/infra/infra.git"
   },
diff --git a/autoroll/config/dart-sdk-flutter-engine.json b/autoroll/config/dart-sdk-flutter-engine.json
index 2e00297..2b7b31c 100644
--- a/autoroll/config/dart-sdk-flutter-engine.json
+++ b/autoroll/config/dart-sdk-flutter-engine.json
@@ -1,12 +1,19 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#13
 // for documentation of the autoroller config.
 {
-  "childName": "Dart SDK",
+  "childDisplayName": "Dart SDK",
+  "commitMsg": {
+    "childLogURLTmpl": "https://dart.googlesource.com/sdk.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": false,
+    "includeTests": false
+  },
   "contacts": ["rmistry@google.com", "aam@google.com"],
   "isInternal": false,
   "ownerPrimary": "rmistry",
   "ownerSecondary": "borenet",
-  "parentName": "Flutter Engine",
+  "parentDisplayName": "Flutter Engine",
   "parentWaterfall": "https://ci.chromium.org/p/flutter/g/engine/console",
   "rollerName": "dart-sdk-flutter-engine",
   "serviceAccount": "flutter-engine-autoroll@skia-public.iam.gserviceaccount.com",
@@ -23,7 +30,6 @@
     "childRepo": "https://dart.googlesource.com/sdk.git",
     "childRevLinkTmpl": "https://dart.googlesource.com/sdk.git/+show/%s",
     "forkRepoURL": "git@github.com:skia-flutter-autoroll/engine.git",
-    "includeLog": true,
     "gclientSpec": "solutions=[{\"name\":\"src/flutter\",\"url\":\"git@github.com:flutter/engine.git\",\"deps_file\":\"DEPS\",\"managed\":False,\"custom_deps\":{},\"safesync_url\":\"\"}]",
     "githubParentPath": "src/flutter",
     "parentBranch": "master",
diff --git a/autoroll/config/dawn-chromium.json b/autoroll/config/dawn-chromium.json
index 63afeeb..44f8848 100644
--- a/autoroll/config/dawn-chromium.json
+++ b/autoroll/config/dawn-chromium.json
@@ -1,7 +1,21 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Dawn",
+  "childDisplayName": "Dawn",
+  "commitMsg": {
+    "bugProject": "chromium",
+    "childLogURLTmpl": "https://dawn.googlesource.com/dawn.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chromium.try:dawn-linux-x64-deps-rel",
+      "luci.chromium.try:dawn-mac-x64-deps-rel",
+      "luci.chromium.try:dawn-win10-x64-deps-rel",
+      "luci.chromium.try:dawn-win10-x86-deps-rel"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "cwallez@google.com"
   ],
@@ -13,7 +27,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "dawn-chromium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -28,18 +42,9 @@
     "childPath": "src/third_party/dawn",
     "childRepo": "https://dawn.googlesource.com/dawn.git",
     "childRevLinkTmpl": "https://dawn.googlesource.com/dawn.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chromium.try:dawn-linux-x64-deps-rel",
-    "luci.chromium.try:dawn-mac-x64-deps-rel",
-    "luci.chromium.try:dawn-win10-x64-deps-rel",
-    "luci.chromium.try:dawn-win10-x86-deps-rel"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/dawn-skia.json b/autoroll/config/dawn-skia.json
index c025677..4c7c79c 100644
--- a/autoroll/config/dawn-skia.json
+++ b/autoroll/config/dawn-skia.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "dawn",
+  "childDisplayName": "dawn",
+  "commitMsg": {
+    "bugProject": "skia",
+    "childLogURLTmpl": "https://dawn.googlesource.com/dawn.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "cwallez@google.com"
   ],
@@ -13,7 +21,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Skia",
+  "parentDisplayName": "Skia",
   "parentWaterfall": "https://status.skia.org",
   "rollerName": "dawn-skia-autoroll",
   "serviceAccount": "skia-autoroll@skia-public.iam.gserviceaccount.com",
@@ -26,55 +34,9 @@
     "childPath": "third_party/externals/dawn",
     "childRepo": "https://dawn.googlesource.com/dawn.git",
     "childRevLinkTmpl": "https://dawn.googlesource.com/dawn.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "skia",
     "parentBranch": "master",
-    "parentRepo": "https://skia.googlesource.com/skia.git",
-    "transitiveDeps": [
-      {
-        "child": {
-          "id": "https://chromium.googlesource.com/chromium/src/third_party/jinja2",
-          "path": "DEPS"
-        },
-        "parent": {
-          "id": "https://chromium.googlesource.com/chromium/src/third_party/jinja2",
-          "path": "DEPS"
-        }
-      },
-      {
-        "child": {
-          "id": "https://chromium.googlesource.com/chromium/src/third_party/markupsafe",
-          "path": "DEPS"
-        },
-        "parent": {
-          "id": "https://chromium.googlesource.com/chromium/src/third_party/markupsafe",
-          "path": "DEPS"
-        }
-      },
-      {
-        "child": {
-          "id": "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang",
-          "path": "DEPS"
-        },
-        "parent": {
-          "id": "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang",
-          "path": "DEPS"
-        }
-      },
-      {
-        "child": {
-          "id": "https://chromium.googlesource.com/external/github.com/google/shaderc",
-          "path": "DEPS"
-        },
-        "parent": {
-          "id": "https://chromium.googlesource.com/external/github.com/google/shaderc",
-          "path": "DEPS"
-        }
-      }
-    ]
+    "parentRepo": "https://skia.googlesource.com/skia.git"
   },
-  "cqExtraTrybots": [],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
@@ -83,5 +45,47 @@
     "readinessFailureThreshold": "10"
   },
   "maxRollFrequency": "6h",
-  "timeWindow": "M-F 04:00-08:00"
+  "timeWindow": "M-F 04:00-08:00",
+  "transitiveDeps": [
+    {
+      "child": {
+        "id": "https://chromium.googlesource.com/chromium/src/third_party/jinja2",
+        "path": "DEPS"
+      },
+      "parent": {
+        "id": "https://chromium.googlesource.com/chromium/src/third_party/jinja2",
+        "path": "DEPS"
+      }
+    },
+    {
+      "child": {
+        "id": "https://chromium.googlesource.com/chromium/src/third_party/markupsafe",
+        "path": "DEPS"
+      },
+      "parent": {
+        "id": "https://chromium.googlesource.com/chromium/src/third_party/markupsafe",
+        "path": "DEPS"
+      }
+    },
+    {
+      "child": {
+        "id": "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang",
+        "path": "DEPS"
+      },
+      "parent": {
+        "id": "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang",
+        "path": "DEPS"
+      }
+    },
+    {
+      "child": {
+        "id": "https://chromium.googlesource.com/external/github.com/google/shaderc",
+        "path": "DEPS"
+      },
+      "parent": {
+        "id": "https://chromium.googlesource.com/external/github.com/google/shaderc",
+        "path": "DEPS"
+      }
+    }
+  ]
 }
diff --git a/autoroll/config/depot-tools-chromium.json b/autoroll/config/depot-tools-chromium.json
index d60962a..4691dc1 100644
--- a/autoroll/config/depot-tools-chromium.json
+++ b/autoroll/config/depot-tools-chromium.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Depot Tools",
+  "childDisplayName": "Depot Tools",
+  "commitMsg": {
+    "bugProject": "chromium",
+    "childLogURLTmpl": "https://chromium.googlesource.com/chromium/tools/depot_tools.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "agable@google.com"
   ],
@@ -13,7 +21,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "depot-tools-chromium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,9 +33,6 @@
     "childPath": "src/third_party/depot_tools",
     "childRepo": "https://chromium.googlesource.com/chromium/tools/depot_tools.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/chromium/tools/depot_tools.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
diff --git a/autoroll/config/devtools-frontend-chromium.json b/autoroll/config/devtools-frontend-chromium.json
index c059a5e..69e54af 100644
--- a/autoroll/config/devtools-frontend-chromium.json
+++ b/autoroll/config/devtools-frontend-chromium.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "DevTools Frontend",
+  "childDisplayName": "DevTools Frontend",
+  "commitMsg": {
+    "bugProject": "chromium",
+    "childLogURLTmpl": "https://chromium.googlesource.com/devtools/devtools-frontend.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "v8-infra@google.com"
   ],
@@ -13,7 +21,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "devtools-frontend-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,9 +33,6 @@
     "childPath": "src/third_party/devtools-frontend/src",
     "childRepo": "https://chromium.googlesource.com/devtools/devtools-frontend.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/devtools/devtools-frontend.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
diff --git a/autoroll/config/emscripten-emscripten-releases.json b/autoroll/config/emscripten-emscripten-releases.json
index 087bab2..c5cd849 100644
--- a/autoroll/config/emscripten-emscripten-releases.json
+++ b/autoroll/config/emscripten-emscripten-releases.json
@@ -1,7 +1,14 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "emscripten",
+  "childDisplayName": "emscripten",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/emscripten-core/emscripten.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "dschuff@google.com"
   ],
@@ -13,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "emscripten-releases",
+  "parentDisplayName": "emscripten-releases",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "emscripten-emscripten-releases",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,8 +32,6 @@
     "childPath": "emscripten-releases/emscripten",
     "childRepo": "https://chromium.googlesource.com/external/github.com/emscripten-core/emscripten.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/emscripten-core/emscripten.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/emscripten-releases.git"
   },
diff --git a/autoroll/config/flutter-engine-flutter.json b/autoroll/config/flutter-engine-flutter.json
index 5e79e8f..3ec8fc9 100644
--- a/autoroll/config/flutter-engine-flutter.json
+++ b/autoroll/config/flutter-engine-flutter.json
@@ -1,12 +1,19 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Engine",
+  "childDisplayName": "Engine",
+  "commitMsg": {
+    "childLogURLTmpl": "https://github.com/flutter/engine/compare/{{.RollingFrom}}...{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": false,
+    "includeTests": false
+  },
   "contacts": ["liyuqian@google.com", "rmistry@google.com"],
   "isInternal": false,
   "ownerPrimary": "rmistry",
   "ownerSecondary": "borenet",
-  "parentName": "Flutter",
+  "parentDisplayName": "Flutter",
   "parentWaterfall": "https://flutter-dashboard.appspot.com/#/build",
   "rollerName": "flutter-engine-flutter-autoroll",
   "serviceAccount": "flutter-autoroll@skia-public.iam.gserviceaccount.com",
@@ -28,33 +35,10 @@
     "childRepoURL": "git@github.com:flutter/engine",
     "childRevLinkTmpl": "https://github.com/flutter/engine/commit/%s",
     "childUserName": "flutter",
-    "forkRepoURL": "git@github.com:engine-flutter-autoroll/flutter",
-    "includeLog": true,
+    "forkRepoURL": "git@github.com:engine-flutter-autoroll/flutter.git",
     "parentBranch": "master",
-    "parentRepo": "git@github.com:flutter/flutter",
-    "revisionFile": "bin/internal/engine.version",
-    "transitiveDeps": [
-      {
-        "child": {
-          "id": "fuchsia/sdk/core/linux-amd64",
-          "path": "DEPS"
-        },
-        "parent": {
-          "id": "fuchsia/sdk/core/linux-amd64",
-          "path": "bin/internal/fuchsia-linux.version"
-        }
-      },
-      {
-        "child": {
-          "id": "fuchsia/sdk/core/mac-amd64",
-          "path": "DEPS"
-        },
-        "parent": {
-          "id": "fuchsia/sdk/core/mac-amd64",
-          "path": "bin/internal/fuchsia-mac.version"
-        }
-      }
-    ]
+    "parentRepo": "git@github.com:flutter/flutter.git",
+    "revisionFile": "bin/internal/engine.version"
   },
   "kubernetes": {
     "cpu": "1",
@@ -82,5 +66,27 @@
         "emails": ["$SHERIFF"]
       }
     }
+  ],
+  "transitiveDeps": [
+    {
+      "child": {
+        "id": "fuchsia/sdk/core/linux-amd64",
+        "path": "DEPS"
+      },
+      "parent": {
+        "id": "fuchsia/sdk/core/linux-amd64",
+        "path": "bin/internal/fuchsia-linux.version"
+      }
+    },
+    {
+      "child": {
+        "id": "fuchsia/sdk/core/mac-amd64",
+        "path": "DEPS"
+      },
+      "parent": {
+        "id": "fuchsia/sdk/core/mac-amd64",
+        "path": "bin/internal/fuchsia-mac.version"
+      }
+    }
   ]
 }
diff --git a/autoroll/config/freetype-chromium.json b/autoroll/config/freetype-chromium.json
index 0ee9bfc..603835f 100644
--- a/autoroll/config/freetype-chromium.json
+++ b/autoroll/config/freetype-chromium.json
@@ -1,7 +1,22 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "FreeType",
+  "childDisplayName": "FreeType",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/chromium/src/third_party/freetype2.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chromium.try:linux_chromium_msan_rel_ng",
+      "luci.chromium.try:linux-blink-rel",
+      "luci.chromium.try:mac10.12-blink-rel",
+      "luci.chromium.try:mac10.13_retina-blink-rel",
+      "luci.chromium.try:win10-blink-rel",
+      "luci.chromium.try:win7-blink-rel"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "bungeman@google.com",
     "drott@google.com"
@@ -14,7 +29,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "freetype-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -29,19 +44,9 @@
     "childPath": "src/third_party/freetype/src",
     "childRepo": "https://chromium.googlesource.com/chromium/src/third_party/freetype2.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/chromium/src/third_party/freetype2.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chromium.try:linux_chromium_msan_rel_ng",
-    "luci.chromium.try:linux-blink-rel",
-    "luci.chromium.try:mac10.12-blink-rel",
-    "luci.chromium.try:mac10.13_retina-blink-rel",
-    "luci.chromium.try:win10-blink-rel",
-    "luci.chromium.try:win7-blink-rel"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/fuchsia-aemu-chromium.json b/autoroll/config/fuchsia-aemu-chromium.json
index 0c1f944..6617e26 100644
--- a/autoroll/config/fuchsia-aemu-chromium.json
+++ b/autoroll/config/fuchsia-aemu-chromium.json
@@ -1,7 +1,13 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Fuchsia AEMU",
+  "childDisplayName": "Fuchsia AEMU",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "chonggu@google.com"
   ],
@@ -13,7 +19,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "fuchsia-aemu-chromium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
diff --git a/autoroll/config/fuchsia-linux-sdk-flutter-engine.json b/autoroll/config/fuchsia-linux-sdk-flutter-engine.json
index 5780f03..894d937 100644
--- a/autoroll/config/fuchsia-linux-sdk-flutter-engine.json
+++ b/autoroll/config/fuchsia-linux-sdk-flutter-engine.json
@@ -1,12 +1,18 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Fuchsia Linux SDK",
+  "childDisplayName": "Fuchsia Linux SDK",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": false,
+    "includeTests": false
+  },
   "contacts": ["liyuqian@google.com", "rmistry@google.com"],
   "isInternal": false,
   "ownerPrimary": "rmistry",
   "ownerSecondary": "borenet",
-  "parentName": "Flutter",
+  "parentDisplayName": "Flutter",
   "parentWaterfall": "https://ci.chromium.org/p/flutter/g/engine/console",
   "rollerName": "fuchsia-linux-sdk-flutter-engine",
   "serviceAccount": "flutter-engine-autoroll@skia-public.iam.gserviceaccount.com",
diff --git a/autoroll/config/fuchsia-linux-toolchain-flutter-engine.json b/autoroll/config/fuchsia-linux-toolchain-flutter-engine.json
index c48da74..1a3b096 100644
--- a/autoroll/config/fuchsia-linux-toolchain-flutter-engine.json
+++ b/autoroll/config/fuchsia-linux-toolchain-flutter-engine.json
@@ -1,12 +1,18 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Fuchsia Linux Toolchain",
+  "childDisplayName": "Fuchsia Linux Toolchain",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": false,
+    "includeTests": false
+  },
   "contacts": ["liyuqian@google.com", "rmistry@google.com"],
   "isInternal": false,
   "ownerPrimary": "rmistry",
   "ownerSecondary": "borenet",
-  "parentName": "Flutter",
+  "parentDisplayName": "Flutter",
   "parentWaterfall": "https://ci.chromium.org/p/flutter/g/engine/console",
   "rollerName": "fuchsia-linux-toolchain-flutter-engine",
   "serviceAccount": "flutter-engine-autoroll@skia-public.iam.gserviceaccount.com",
diff --git a/autoroll/config/fuchsia-mac-sdk-flutter-engine.json b/autoroll/config/fuchsia-mac-sdk-flutter-engine.json
index 73ec6f7..bee0a9f 100644
--- a/autoroll/config/fuchsia-mac-sdk-flutter-engine.json
+++ b/autoroll/config/fuchsia-mac-sdk-flutter-engine.json
@@ -1,12 +1,18 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Fuchsia Mac SDK",
+  "childDisplayName": "Fuchsia Mac SDK",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": false,
+    "includeTests": false
+  },
   "contacts": ["liyuqian@google.com", "rmistry@google.com"],
   "isInternal": false,
   "ownerPrimary": "rmistry",
   "ownerSecondary": "borenet",
-  "parentName": "Flutter",
+  "parentDisplayName": "Flutter",
   "parentWaterfall": "https://ci.chromium.org/p/flutter/g/engine/console",
   "rollerName": "fuchsia-mac-sdk-flutter-engine",
   "serviceAccount": "flutter-engine-autoroll@skia-public.iam.gserviceaccount.com",
diff --git a/autoroll/config/fuchsia-mac-toolchain-flutter-engine.json b/autoroll/config/fuchsia-mac-toolchain-flutter-engine.json
index 0474b45..9b0b6a6 100644
--- a/autoroll/config/fuchsia-mac-toolchain-flutter-engine.json
+++ b/autoroll/config/fuchsia-mac-toolchain-flutter-engine.json
@@ -1,12 +1,18 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Fuchsia Mac Toolchain",
+  "childDisplayName": "Fuchsia Mac Toolchain",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": false,
+    "includeTests": false
+  },
   "contacts": ["liyuqian@google.com", "rmistry@google.com"],
   "isInternal": false,
   "ownerPrimary": "rmistry",
   "ownerSecondary": "borenet",
-  "parentName": "Flutter",
+  "parentDisplayName": "Flutter",
   "parentWaterfall": "https://ci.chromium.org/p/flutter/g/engine/console",
   "rollerName": "fuchsia-mac-toolchain-flutter-engine",
   "serviceAccount": "flutter-engine-autoroll@skia-public.iam.gserviceaccount.com",
diff --git a/autoroll/config/fuchsia-sdk-chromium.json b/autoroll/config/fuchsia-sdk-chromium.json
index e456378..2155453 100644
--- a/autoroll/config/fuchsia-sdk-chromium.json
+++ b/autoroll/config/fuchsia-sdk-chromium.json
@@ -1,7 +1,13 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Fuchsia SDK",
+  "childDisplayName": "Fuchsia SDK",
+  "commitMsg": {
+    "includeLog": false,
+    "includeRevisionCount": false,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "jbudorick@chromium.org",
     "cr-fuchsia+bot@chromium.org"
@@ -14,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "fuchsia-sdk-chromium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.google.com.iam.gserviceaccount.com",
diff --git a/autoroll/config/glslang-angle.json b/autoroll/config/glslang-angle.json
index 94975f1..0aabee0 100644
--- a/autoroll/config/glslang-angle.json
+++ b/autoroll/config/glslang-angle.json
@@ -1,7 +1,14 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "glslang",
+  "childDisplayName": "glslang",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": false,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "geofflang@chromium.org",
     "jmadill@chromium.org",
@@ -16,7 +23,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "ANGLE",
+  "parentDisplayName": "ANGLE",
   "parentWaterfall": "https://ci.chromium.org/p/angle/g/ci/console",
   "rollerName": "glslang-angle-autoroll",
   "serviceAccount": "angle-autoroll@skia-public.iam.gserviceaccount.com",
@@ -31,8 +38,6 @@
     "childPath": "third_party/glslang/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang/+show/%s",
-    "includeBugs": false,
-    "includeLog": false,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/angle/angle.git"
   },
diff --git a/autoroll/config/glslang-chromium.json b/autoroll/config/glslang-chromium.json
index bb6959c..54817a5 100644
--- a/autoroll/config/glslang-chromium.json
+++ b/autoroll/config/glslang-chromium.json
@@ -1,7 +1,26 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "glslang",
+  "childDisplayName": "glslang",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chromium.try:android_angle_vk32_deqp_rel_ng",
+      "luci.chromium.try:android_angle_vk32_rel_ng",
+      "luci.chromium.try:android_angle_vk64_deqp_rel_ng",
+      "luci.chromium.try:android_angle_vk64_rel_ng",
+      "luci.chromium.try:linux_angle_deqp_rel_ng",
+      "luci.chromium.try:linux-angle-rel",
+      "luci.chromium.try:win-angle-rel-32",
+      "luci.chromium.try:win-angle-rel-64",
+      "luci.chromium.try:win-angle-deqp-rel-32",
+      "luci.chromium.try:win-angle-deqp-rel-64"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "dsinclair@chromium.org",
     "geofflang@chromium.org",
@@ -17,7 +36,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "glslang-chromium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -30,23 +49,9 @@
     "childPath": "src/third_party/glslang/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chromium.try:android_angle_vk32_deqp_rel_ng",
-    "luci.chromium.try:android_angle_vk32_rel_ng",
-    "luci.chromium.try:android_angle_vk64_deqp_rel_ng",
-    "luci.chromium.try:android_angle_vk64_rel_ng",
-    "luci.chromium.try:linux_angle_deqp_rel_ng",
-    "luci.chromium.try:linux-angle-rel",
-    "luci.chromium.try:win-angle-rel-32",
-    "luci.chromium.try:win-angle-rel-64",
-    "luci.chromium.try:win-angle-deqp-rel-32",
-    "luci.chromium.try:win-angle-deqp-rel-64"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/googletest-chromium.json b/autoroll/config/googletest-chromium.json
index 8cc63c4..9a1e408 100644
--- a/autoroll/config/googletest-chromium.json
+++ b/autoroll/config/googletest-chromium.json
@@ -1,7 +1,20 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "GoogleTest",
+  "childDisplayName": "GoogleTest",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/google/googletest.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chromium.try:android_optional_gpu_tests_rel",
+      "luci.chromium.try:mac_optional_gpu_tests_rel",
+      "luci.chromium.try:linux_chromium_cfi_rel_ng",
+      "luci.chrome.try:win-chrome"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "isamsonov@google.com",
     "pwnall@chromium.org"
@@ -14,7 +27,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "googletest-chromium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -27,17 +40,9 @@
     "childPath": "src/third_party/googletest/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/google/googletest.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/google/googletest.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chromium.try:android_optional_gpu_tests_rel",
-    "luci.chromium.try:mac_optional_gpu_tests_rel",
-    "luci.chromium.try:linux_chromium_cfi_rel_ng",
-    "luci.chrome.try:win-chrome"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/llvm-project-emscripten-releases.json b/autoroll/config/llvm-project-emscripten-releases.json
index 68cef52..f6d2a03 100644
--- a/autoroll/config/llvm-project-emscripten-releases.json
+++ b/autoroll/config/llvm-project-emscripten-releases.json
@@ -1,7 +1,14 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "llvm-project",
+  "childDisplayName": "llvm-project",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/llvm/llvm-project.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "dschuff@google.com"
   ],
@@ -13,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "emscripten-releases",
+  "parentDisplayName": "emscripten-releases",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "llvm-project-emscripten-releases",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,8 +32,6 @@
     "childPath": "emscripten-releases/llvm-project",
     "childRepo": "https://chromium.googlesource.com/external/github.com/llvm/llvm-project.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/llvm/llvm-project.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/emscripten-releases.git"
   },
diff --git a/autoroll/config/lottie-android-lottie-ci.json b/autoroll/config/lottie-android-lottie-ci.json
index fc6b4c8..3413671 100644
--- a/autoroll/config/lottie-android-lottie-ci.json
+++ b/autoroll/config/lottie-android-lottie-ci.json
@@ -1,7 +1,14 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Lottie Android",
+  "childDisplayName": "Lottie Android",
+  "commitMsg": {
+    "childLogURLTmpl": "https://skia.googlesource.com/external/github.com/airbnb/lottie-android.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "borenet@google.com"
   ],
@@ -13,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "rmistry",
   "ownerSecondary": "borenet",
-  "parentName": "Lottie CI",
+  "parentDisplayName": "Lottie CI",
   "parentWaterfall": "https://status.skia.org/repo/lottie-ci",
   "rollerName": "lottie-android-lottie-ci-autoroll",
   "serviceAccount": "skia-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,8 +32,6 @@
     "childPath": "lottie-android",
     "childRepo": "https://skia.googlesource.com/external/github.com/airbnb/lottie-android.git",
     "childRevLinkTmpl": "https://skia.googlesource.com/external/github.com/airbnb/lottie-android.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://skia.googlesource.com/lottie-ci.git"
   },
diff --git a/autoroll/config/lottie-web-lottie-ci.json b/autoroll/config/lottie-web-lottie-ci.json
index 6c42a58..1df0b94 100644
--- a/autoroll/config/lottie-web-lottie-ci.json
+++ b/autoroll/config/lottie-web-lottie-ci.json
@@ -1,7 +1,14 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Lottie Web",
+  "childDisplayName": "Lottie Web",
+  "commitMsg": {
+    "childLogURLTmpl": "https://skia.googlesource.com/external/github.com/airbnb/lottie-web.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "borenet@google.com"
   ],
@@ -13,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Lottie CI",
+  "parentDisplayName": "Lottie CI",
   "parentWaterfall": "https://status.skia.org/repo/lottie-ci",
   "rollerName": "lottie-web-lottie-ci-autoroll",
   "serviceAccount": "skia-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,8 +32,6 @@
     "childPath": "lottie",
     "childRepo": "https://skia.googlesource.com/external/github.com/airbnb/lottie-web.git",
     "childRevLinkTmpl": "https://skia.googlesource.com/external/github.com/airbnb/lottie-web.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://skia.googlesource.com/lottie-ci.git"
   },
diff --git a/autoroll/config/luci-go-infra.json b/autoroll/config/luci-go-infra.json
index 79ca849..dbdf375 100644
--- a/autoroll/config/luci-go-infra.json
+++ b/autoroll/config/luci-go-infra.json
@@ -1,7 +1,14 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "luci-go",
+  "childDisplayName": "luci-go",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/infra/luci/luci-go.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "tandrii@chromium.org"
   ],
@@ -13,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "infra",
+  "parentDisplayName": "infra",
   "parentWaterfall": "https://ci.chromium.org/p/infra/g/infra/console",
   "rollerName": "luci-go-infra-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,9 +32,6 @@
     "childPath": "infra/go/src/go.chromium.org/luci",
     "childRepo": "https://chromium.googlesource.com/infra/luci/luci-go.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/infra/luci/luci-go.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/infra/infra.git"
   },
diff --git a/autoroll/config/luci-py-infra.json b/autoroll/config/luci-py-infra.json
index 446e528..f9d813e 100644
--- a/autoroll/config/luci-py-infra.json
+++ b/autoroll/config/luci-py-infra.json
@@ -1,7 +1,14 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "luci-py",
+  "childDisplayName": "luci-py",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/infra/luci/luci-py.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "tikuta@chromium.org"
   ],
@@ -13,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "infra",
+  "parentDisplayName": "infra",
   "parentWaterfall": "https://ci.chromium.org/p/infra/g/infra/console",
   "rollerName": "luci-py-infra-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,9 +32,6 @@
     "childPath": "infra/luci",
     "childRepo": "https://chromium.googlesource.com/infra/luci/luci-py.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/infra/luci/luci-py.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/infra/infra.git"
   },
diff --git a/autoroll/config/material-font-disk-loader-ios-chromium.json b/autoroll/config/material-font-disk-loader-ios-chromium.json
index c9f0f9f..1aa2f49 100644
--- a/autoroll/config/material-font-disk-loader-ios-chromium.json
+++ b/autoroll/config/material-font-disk-loader-ios-chromium.json
@@ -1,7 +1,17 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "material-font-disk-loader-ios",
+  "childDisplayName": "material-font-disk-loader-ios",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/material-foundation/material-font-disk-loader-ios/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chrome.try:ios-internal-mdc"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "jbudorick@chromium.org"
   ],
@@ -13,7 +23,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "material-font-disk-loader-ios-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,14 +35,9 @@
     "childPath": "src/ios/third_party/material_font_disk_loader_ios/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/material-foundation/material-font-disk-loader-ios",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/material-foundation/material-font-disk-loader-ios/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chrome.try:ios-internal-mdc"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/material-internationalization-ios-chromium.json b/autoroll/config/material-internationalization-ios-chromium.json
index 328d4ac..5a85030 100644
--- a/autoroll/config/material-internationalization-ios-chromium.json
+++ b/autoroll/config/material-internationalization-ios-chromium.json
@@ -1,7 +1,17 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "material-internationalization-ios",
+  "childDisplayName": "material-internationalization-ios",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/material-foundation/material-internationalization-ios/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chrome.try:ios-internal-mdc"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "jbudorick@chromium.org"
   ],
@@ -13,7 +23,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "material-i18n-ios-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,14 +35,9 @@
     "childPath": "src/ios/third_party/material_internationalization_ios/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/material-foundation/material-internationalization-ios",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/material-foundation/material-internationalization-ios/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chrome.try:ios-internal-mdc"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/material-roboto-font-loader-ios-chromium.json b/autoroll/config/material-roboto-font-loader-ios-chromium.json
index 8aad7d4..07b5cc3 100644
--- a/autoroll/config/material-roboto-font-loader-ios-chromium.json
+++ b/autoroll/config/material-roboto-font-loader-ios-chromium.json
@@ -1,7 +1,17 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "material-roboto-font-loader-ios",
+  "childDisplayName": "material-roboto-font-loader-ios",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/material-foundation/material-roboto-font-loader-ios/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chrome.try:ios-internal-mdc"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "jbudorick@chromium.org"
   ],
@@ -13,7 +23,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "material-roboto-font-loader-ios-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,14 +35,9 @@
     "childPath": "src/ios/third_party/material_roboto_font_loader_ios/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/material-foundation/material-roboto-font-loader-ios",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/material-foundation/material-roboto-font-loader-ios/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chrome.try:ios-internal-mdc"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/material-sprited-animation-view-ios-chromium.json b/autoroll/config/material-sprited-animation-view-ios-chromium.json
index e260ee2..fa17372 100644
--- a/autoroll/config/material-sprited-animation-view-ios-chromium.json
+++ b/autoroll/config/material-sprited-animation-view-ios-chromium.json
@@ -1,7 +1,17 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "material-sprited-animation-view-ios",
+  "childDisplayName": "material-sprited-animation-view-ios",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/material-foundation/material-sprited-animation-view-ios/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chrome.try:ios-internal-mdc"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "jbudorick@chromium.org"
   ],
@@ -13,7 +23,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "material-sprited-ani-view-ios-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,14 +35,9 @@
     "childPath": "src/ios/third_party/material_sprited_animation_view_ios/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/material-foundation/material-sprited-animation-view-ios",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/material-foundation/material-sprited-animation-view-ios/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chrome.try:ios-internal-mdc"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/material-text-accessibility-ios-chromium.json b/autoroll/config/material-text-accessibility-ios-chromium.json
index 01cbea7..3e4dd14 100644
--- a/autoroll/config/material-text-accessibility-ios-chromium.json
+++ b/autoroll/config/material-text-accessibility-ios-chromium.json
@@ -1,7 +1,17 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "material-text-accessibility-ios",
+  "childDisplayName": "material-text-accessibility-ios",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/material-foundation/material-text-accessibility-ios/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chrome.try:ios-internal-mdc"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "jbudorick@chromium.org"
   ],
@@ -13,7 +23,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "material-text-accessibility-ios-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,14 +35,9 @@
     "childPath": "src/ios/third_party/material_text_accessibility_ios/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/material-foundation/material-text-accessibility-ios",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/material-foundation/material-text-accessibility-ios/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chrome.try:ios-internal-mdc"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/motion-animator-objc-chromium.json b/autoroll/config/motion-animator-objc-chromium.json
index 8647924..79a53e8 100644
--- a/autoroll/config/motion-animator-objc-chromium.json
+++ b/autoroll/config/motion-animator-objc-chromium.json
@@ -1,7 +1,17 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "motion-animator-objc",
+  "childDisplayName": "motion-animator-objc",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/material-motion/motion-animator-objc/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chrome.try:ios-internal-mdc"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "jbudorick@chromium.org"
   ],
@@ -13,7 +23,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "motion-animator-objc-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,14 +35,9 @@
     "childPath": "src/ios/third_party/motion_animator_objc/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/material-motion/motion-animator-objc",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/material-motion/motion-animator-objc/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chrome.try:ios-internal-mdc"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/motion-interchange-objc-chromium.json b/autoroll/config/motion-interchange-objc-chromium.json
index c9cd8c3..818d4bf 100644
--- a/autoroll/config/motion-interchange-objc-chromium.json
+++ b/autoroll/config/motion-interchange-objc-chromium.json
@@ -1,7 +1,17 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "motion-interchange-objc",
+  "childDisplayName": "motion-interchange-objc",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/material-motion/motion-interchange-objc/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chrome.try:ios-internal-mdc"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "jbudorick@chromium.org"
   ],
@@ -13,7 +23,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "motion-interchange-objc-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,14 +35,9 @@
     "childPath": "src/ios/third_party/motion_interchange_objc/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/material-motion/motion-interchange-objc",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/material-motion/motion-interchange-objc/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chrome.try:ios-internal-mdc"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/motion-transitioning-objc-chromium.json b/autoroll/config/motion-transitioning-objc-chromium.json
index 5f12054..e1c5b35 100644
--- a/autoroll/config/motion-transitioning-objc-chromium.json
+++ b/autoroll/config/motion-transitioning-objc-chromium.json
@@ -1,7 +1,17 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "motion-transitioning-objc",
+  "childDisplayName": "motion-transitioning-objc",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/material-motion/motion-transitioning-objc/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chrome.try:ios-internal-mdc"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "jbudorick@chromium.org"
   ],
@@ -13,7 +23,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "motion-transitioning-objc-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,14 +35,9 @@
     "childPath": "src/ios/third_party/motion_transitioning_objc/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/material-motion/motion-transitioning-objc",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/material-motion/motion-transitioning-objc/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chrome.try:ios-internal-mdc"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/nacl-chromium.json b/autoroll/config/nacl-chromium.json
index bbca0a6..6e75f41 100644
--- a/autoroll/config/nacl-chromium.json
+++ b/autoroll/config/nacl-chromium.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "NaCl",
+  "childDisplayName": "NaCl",
+  "commitMsg": {
+    "bugProject": "chromium",
+    "childLogURLTmpl": "https://chromium.googlesource.com/native_client/src/native_client.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "mseaborn@google.com"
   ],
@@ -13,7 +21,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "nacl-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,9 +33,6 @@
     "childPath": "src/native_client",
     "childRepo": "https://chromium.googlesource.com/native_client/src/native_client.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/native_client/src/native_client.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
diff --git a/autoroll/config/openscreen-chromium.json b/autoroll/config/openscreen-chromium.json
index e7303a4..09bbee2 100644
--- a/autoroll/config/openscreen-chromium.json
+++ b/autoroll/config/openscreen-chromium.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Open Screen",
+  "childDisplayName": "Open Screen",
+  "commitMsg": {
+    "bugProject": "chromium",
+    "childLogURLTmpl": "https://chromium.googlesource.com/openscreen.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "jophba@chromium.org"
   ],
@@ -13,7 +21,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "openscreen-chromium",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,13 +33,9 @@
     "childPath": "src/third_party/openscreen/src",
     "childRepo": "https://chromium.googlesource.com/openscreen.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/openscreen.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/pdfium-chromium.json b/autoroll/config/pdfium-chromium.json
index 36c6b40..b03a22e 100644
--- a/autoroll/config/pdfium-chromium.json
+++ b/autoroll/config/pdfium-chromium.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "PDFium",
+  "childDisplayName": "PDFium",
+  "commitMsg": {
+    "bugProject": "chromium",
+    "childLogURLTmpl": "https://pdfium.googlesource.com/pdfium.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "thestig@chromium.org"
   ],
@@ -13,7 +21,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "pdfium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,9 +33,6 @@
     "childPath": "src/third_party/pdfium",
     "childRepo": "https://pdfium.googlesource.com/pdfium.git",
     "childRevLinkTmpl": "https://pdfium.googlesource.com/pdfium.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
diff --git a/autoroll/config/perfetto-chromium.json b/autoroll/config/perfetto-chromium.json
index 01c0aa8..702eb8b 100644
--- a/autoroll/config/perfetto-chromium.json
+++ b/autoroll/config/perfetto-chromium.json
@@ -1,7 +1,18 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Perfetto",
+  "childDisplayName": "Perfetto",
+  "commitMsg": {
+    "bugProject": "chromium",
+    "childLogURLTmpl": "https://android.googlesource.com/platform/external/perfetto.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chromium.try:linux-perfetto-rel"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "primiano@chromium.org"
   ],
@@ -13,7 +24,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "perfetto-chromium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,15 +36,9 @@
     "childPath": "src/third_party/perfetto",
     "childRepo": "https://android.googlesource.com/platform/external/perfetto.git",
     "childRevLinkTmpl": "https://android.googlesource.com/platform/external/perfetto.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chromium.try:linux-perfetto-rel"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/shaderc-chromium.json b/autoroll/config/shaderc-chromium.json
index cb83226..45f7526 100644
--- a/autoroll/config/shaderc-chromium.json
+++ b/autoroll/config/shaderc-chromium.json
@@ -1,7 +1,14 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "shaderc",
+  "childDisplayName": "shaderc",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/google/shaderc/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "dsinclair@chromium.org",
     "rharrison@chromium.org",
@@ -15,7 +22,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "shaderc-chromium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -27,8 +34,6 @@
     "childPath": "src/third_party/shaderc/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/google/shaderc",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/google/shaderc/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
diff --git a/autoroll/config/skcms-skia.json b/autoroll/config/skcms-skia.json
index 7102b33..4628ab2 100644
--- a/autoroll/config/skcms-skia.json
+++ b/autoroll/config/skcms-skia.json
@@ -1,7 +1,14 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "skcms",
+  "childDisplayName": "skcms",
+  "commitMsg": {
+    "childLogURLTmpl": "https://skia.googlesource.com/skcms.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "brianosman@google.com",
     "mtklein@google.com"
@@ -14,7 +21,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Skia",
+  "parentDisplayName": "Skia",
   "parentWaterfall": "https://status.skia.org",
   "rollerName": "skcms-skia-autoroll",
   "serviceAccount": "skia-autoroll@skia-public.iam.gserviceaccount.com",
@@ -26,7 +33,6 @@
   "copyRepoManager": {
     "childBranch": "master",
     "childPath": "skia/third_party/skcms",
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://skia.googlesource.com/skia.git",
     "childRepo": "https://skia.googlesource.com/skcms.git",
diff --git a/autoroll/config/skia-chromium.json b/autoroll/config/skia-chromium.json
index 233240c..2b5a759 100644
--- a/autoroll/config/skia-chromium.json
+++ b/autoroll/config/skia-chromium.json
@@ -1,7 +1,23 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Skia",
+  "childDisplayName": "Skia",
+  "commitMsg": {
+    "bugProject": "chromium",
+    "childLogURLTmpl": "https://skia.googlesource.com/skia.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chromium.try:android_optional_gpu_tests_rel",
+      "luci.chromium.try:linux-blink-rel",
+      "luci.chromium.try:linux-chromeos-compile-dbg",
+      "luci.chromium.try:linux_optional_gpu_tests_rel",
+      "luci.chromium.try:mac_optional_gpu_tests_rel",
+      "luci.chromium.try:win_optional_gpu_tests_rel"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "borenet@google.com"
   ],
@@ -13,7 +29,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "skia-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -26,20 +42,9 @@
     "childPath": "src/third_party/skia",
     "childRepo": "https://skia.googlesource.com/skia.git",
     "childRevLinkTmpl": "https://skia.googlesource.com/skia.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chromium.try:android_optional_gpu_tests_rel",
-    "luci.chromium.try:linux-blink-rel",
-    "luci.chromium.try:linux-chromeos-compile-dbg",
-    "luci.chromium.try:linux_optional_gpu_tests_rel",
-    "luci.chromium.try:mac_optional_gpu_tests_rel",
-    "luci.chromium.try:win_optional_gpu_tests_rel"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/skia-flutter.json b/autoroll/config/skia-flutter.json
index 50b216a..0be42b8 100644
--- a/autoroll/config/skia-flutter.json
+++ b/autoroll/config/skia-flutter.json
@@ -1,12 +1,19 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#13
 // for documentation of the autoroller config.
 {
-  "childName": "Skia",
+  "childDisplayName": "Skia",
+  "commitMsg": {
+    "childLogURLTmpl": "https://skia.googlesource.com/skia.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": false,
+    "includeTests": false
+  },
   "contacts": ["brianosman@google.com", "rmistry@google.com"],
   "isInternal": false,
   "ownerPrimary": "rmistry",
   "ownerSecondary": "borenet",
-  "parentName": "Flutter",
+  "parentDisplayName": "Flutter",
   "parentWaterfall": "https://ci.chromium.org/p/flutter/g/engine/console",
   "rollerName": "skia-flutter-autoroll",
   "serviceAccount": "flutter-engine-autoroll@skia-public.iam.gserviceaccount.com",
@@ -24,7 +31,6 @@
     "forkRepoURL": "git@github.com:skia-flutter-autoroll/engine.git",
     "gclientSpec": "solutions=[{\"name\":\"src/flutter\",\"url\":\"git@github.com:flutter/engine.git\",\"deps_file\":\"DEPS\",\"managed\":False,\"custom_deps\":{},\"safesync_url\":\"\"}]",
     "githubParentPath": "src/flutter",
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "git@github.com:flutter/engine.git",
     "preUploadSteps": ["FlutterLicenseScripts"],
diff --git a/autoroll/config/skia-lottie-ci.json b/autoroll/config/skia-lottie-ci.json
index 41a5764..ec2bb64 100644
--- a/autoroll/config/skia-lottie-ci.json
+++ b/autoroll/config/skia-lottie-ci.json
@@ -1,7 +1,17 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Skia",
+  "childDisplayName": "Skia",
+  "commitMsg": {
+    "childLogURLTmpl": "https://skia.googlesource.com/skia.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "skia/skia.primary:Housekeeper-PerCommit-InfraTests"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "borenet@google.com"
   ],
@@ -13,7 +23,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Lottie CI",
+  "parentDisplayName": "Lottie CI",
   "parentWaterfall": "https://status.skia.org/repo/lottie-ci",
   "rollerName": "skia-lottie-ci-autoroll",
   "serviceAccount": "skia-autoroll@skia-public.iam.gserviceaccount.com",
@@ -31,12 +41,7 @@
       "TrainInfra"
     ],
     "parentRepo": "https://skia.googlesource.com/lottie-ci.git",
-    "includeBugs": false,
-    "includeLog": true
   },
-  "cqExtraTrybots": [
-    "skia/skia.primary:Housekeeper-PerCommit-InfraTests"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "8Gi",
diff --git a/autoroll/config/skia-skiabot-test.json b/autoroll/config/skia-skiabot-test.json
index 0cff96f..f83dd05 100644
--- a/autoroll/config/skia-skiabot-test.json
+++ b/autoroll/config/skia-skiabot-test.json
@@ -1,7 +1,14 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Skia",
+  "childDisplayName": "Skia",
+  "commitMsg": {
+    "childLogURLTmpl": "https://skia.googlesource.com/skia.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": true
+  },
   "contacts": [
     "borenet@google.com"
   ],
@@ -13,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Skiabot Test",
+  "parentDisplayName": "Skiabot Test",
   "parentWaterfall": "https://status-staging.skia.org/repo/skiabot-test",
   "rollerName": "skia-skiabot-test-autoroll",
   "serviceAccount": "skia-autoroll@skia-public.iam.gserviceaccount.com",
@@ -26,8 +33,6 @@
     "childPath": "skia",
     "childRepo": "https://skia.googlesource.com/skia.git",
     "childRevLinkTmpl": "https://skia.googlesource.com/skia.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://skia.googlesource.com/skiabot-test.git"
   },
diff --git a/autoroll/config/spirv-tools-angle.json b/autoroll/config/spirv-tools-angle.json
index 01ed6d2..0159a8e 100644
--- a/autoroll/config/spirv-tools-angle.json
+++ b/autoroll/config/spirv-tools-angle.json
@@ -1,7 +1,14 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "SPIRV-Tools",
+  "childDisplayName": "SPIRV-Tools",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": false,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "geofflang@chromium.org",
     "jmadill@chromium.org",
@@ -16,7 +23,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "ANGLE",
+  "parentDisplayName": "ANGLE",
   "parentWaterfall": "https://ci.chromium.org/p/angle/g/ci/console",
   "rollerName": "spirv-tools-angle-autoroll",
   "serviceAccount": "angle-autoroll@skia-public.iam.gserviceaccount.com",
@@ -32,22 +39,8 @@
     "childPath": "third_party/spirv-tools/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": false,
     "parentBranch": "master",
-    "parentRepo": "https://chromium.googlesource.com/angle/angle.git",
-    "transitiveDeps": [
-      {
-        "child": {
-          "id": "https://github.com/KhronosGroup/SPIRV-Headers",
-          "path": "DEPS"
-        },
-        "parent": {
-          "id": "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers",
-          "path": "DEPS"
-        }
-      }
-    ]
+    "parentRepo": "https://chromium.googlesource.com/angle/angle.git"
   },
   "kubernetes": {
     "cpu": "1",
@@ -57,5 +50,17 @@
     "readinessFailureThreshold": "10"
   },
   "maxRollFrequency": "6h",
-  "timeWindow": "M-F 07:00-10:00"
+  "timeWindow": "M-F 07:00-10:00",
+  "transitiveDeps": [
+    {
+      "child": {
+        "id": "https://github.com/KhronosGroup/SPIRV-Headers",
+        "path": "DEPS"
+      },
+      "parent": {
+        "id": "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers",
+        "path": "DEPS"
+      }
+    }
+  ]
 }
diff --git a/autoroll/config/spirv-tools-chromium.json b/autoroll/config/spirv-tools-chromium.json
index 65cffac..30302ff 100644
--- a/autoroll/config/spirv-tools-chromium.json
+++ b/autoroll/config/spirv-tools-chromium.json
@@ -1,7 +1,26 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "SPIRV-Tools",
+  "childDisplayName": "SPIRV-Tools",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chromium.try:android_angle_vk32_deqp_rel_ng",
+      "luci.chromium.try:android_angle_vk32_rel_ng",
+      "luci.chromium.try:android_angle_vk64_deqp_rel_ng",
+      "luci.chromium.try:android_angle_vk64_rel_ng",
+      "luci.chromium.try:linux_angle_deqp_rel_ng",
+      "luci.chromium.try:linux-angle-rel",
+      "luci.chromium.try:win-angle-rel-32",
+      "luci.chromium.try:win-angle-rel-64",
+      "luci.chromium.try:win-angle-deqp-rel-32",
+      "luci.chromium.try:win-angle-deqp-rel-64"
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "dsinclair@chromium.org",
     "geofflang@chromium.org",
@@ -17,7 +36,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "spirv-tools-chromium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -31,35 +50,9 @@
     "childPath": "src/third_party/SPIRV-Tools/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
-    "parentRepo": "https://chromium.googlesource.com/chromium/src.git",
-    "transitiveDeps": [
-      {
-        "child": {
-          "id": "https://github.com/KhronosGroup/SPIRV-Headers",
-          "path": "DEPS"
-        },
-        "parent": {
-          "id": "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers",
-          "path": "DEPS"
-        }
-      }
-    ]
+    "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chromium.try:android_angle_vk32_deqp_rel_ng",
-    "luci.chromium.try:android_angle_vk32_rel_ng",
-    "luci.chromium.try:android_angle_vk64_deqp_rel_ng",
-    "luci.chromium.try:android_angle_vk64_rel_ng",
-    "luci.chromium.try:linux_angle_deqp_rel_ng",
-    "luci.chromium.try:linux-angle-rel",
-    "luci.chromium.try:win-angle-rel-32",
-    "luci.chromium.try:win-angle-rel-64",
-    "luci.chromium.try:win-angle-deqp-rel-32",
-    "luci.chromium.try:win-angle-deqp-rel-64"
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
@@ -68,5 +61,17 @@
     "readinessFailureThreshold": "10"
   },
   "maxRollFrequency": "6h",
-  "timeWindow": "M-F 08:00-09:00"
+  "timeWindow": "M-F 08:00-09:00",
+  "transitiveDeps": [
+    {
+      "child": {
+        "id": "https://github.com/KhronosGroup/SPIRV-Headers",
+        "path": "DEPS"
+      },
+      "parent": {
+        "id": "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers",
+        "path": "DEPS"
+      }
+    }
+  ]
 }
diff --git a/autoroll/config/swiftshader-angle.json b/autoroll/config/swiftshader-angle.json
index 93a089c..33cb8d4 100644
--- a/autoroll/config/swiftshader-angle.json
+++ b/autoroll/config/swiftshader-angle.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "SwiftShader",
+  "childDisplayName": "SwiftShader",
+  "commitMsg": {
+    "bugProject": "angleproject",
+    "childLogURLTmpl": "https://swiftshader.googlesource.com/SwiftShader.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "geofflang@chromium.org",
     "jmadill@chromium.org",
@@ -16,7 +24,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "ANGLE",
+  "parentDisplayName": "ANGLE",
   "parentWaterfall": "https://ci.chromium.org/p/angle/g/ci/console",
   "rollerName": "swiftshader-angle-autoroll",
   "serviceAccount": "angle-autoroll@skia-public.iam.gserviceaccount.com",
@@ -32,9 +40,6 @@
     "childPath": "third_party/SwiftShader",
     "childRepo": "https://swiftshader.googlesource.com/SwiftShader.git",
     "childRevLinkTmpl": "https://swiftshader.googlesource.com/SwiftShader.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "angleproject",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/angle/angle.git"
   },
diff --git a/autoroll/config/swiftshader-chromium.json b/autoroll/config/swiftshader-chromium.json
index 4fb6ef1..96fee3b 100644
--- a/autoroll/config/swiftshader-chromium.json
+++ b/autoroll/config/swiftshader-chromium.json
@@ -1,7 +1,24 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "SwiftShader",
+  "childDisplayName": "SwiftShader",
+  "commitMsg": {
+    "bugProject": "chromium",
+    "childLogURLTmpl": "https://swiftshader.googlesource.com/SwiftShader.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "cqExtraTrybots": [
+      "luci.chromium.try:android_optional_gpu_tests_rel",
+      "luci.chromium.try:linux_chromium_msan_rel_ng",
+      "luci.chromium.try:linux_optional_gpu_tests_rel",
+      "luci.chromium.try:mac_optional_gpu_tests_rel",
+      "luci.chromium.try:win_optional_gpu_tests_rel",
+      "luci.chromium.try:linux-swangle-try-x64",
+      "luci.chromium.try:win-swangle-try-x86",
+    ],
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "capn@chromium.org"
   ],
@@ -13,7 +30,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "swiftshader-chromium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -26,21 +43,9 @@
     "childPath": "src/third_party/swiftshader",
     "childRepo": "https://swiftshader.googlesource.com/SwiftShader.git",
     "childRevLinkTmpl": "https://swiftshader.googlesource.com/SwiftShader.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
-  "cqExtraTrybots": [
-    "luci.chromium.try:android_optional_gpu_tests_rel",
-    "luci.chromium.try:linux_chromium_msan_rel_ng",
-    "luci.chromium.try:linux_optional_gpu_tests_rel",
-    "luci.chromium.try:mac_optional_gpu_tests_rel",
-    "luci.chromium.try:win_optional_gpu_tests_rel",
-    "luci.chromium.try:linux-swangle-try-x64",
-    "luci.chromium.try:win-swangle-try-x86",
-  ],
   "kubernetes": {
     "cpu": "1",
     "memory": "2Gi",
diff --git a/autoroll/config/swiftshader-skia.json b/autoroll/config/swiftshader-skia.json
index cf290bb..cd39156 100644
--- a/autoroll/config/swiftshader-skia.json
+++ b/autoroll/config/swiftshader-skia.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "SwiftShader",
+  "childDisplayName": "SwiftShader",
+  "commitMsg": {
+    "bugProject": "skia",
+    "childLogURLTmpl": "https://swiftshader.googlesource.com/SwiftShader.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "bsalomon@google.com"
   ],
@@ -13,7 +21,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Skia",
+  "parentDisplayName": "Skia",
   "parentWaterfall": "https://status.skia.org",
   "rollerName": "swiftshader-skia-autoroll",
   "serviceAccount": "skia-autoroll@skia-public.iam.gserviceaccount.com",
@@ -26,9 +34,6 @@
     "childPath": "third_party/externals/swiftshader",
     "childRepo": "https://swiftshader.googlesource.com/SwiftShader.git",
     "childRevLinkTmpl": "https://swiftshader.googlesource.com/SwiftShader.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "skia",
     "parentBranch": "master",
     "parentRepo": "https://skia.googlesource.com/skia.git"
   },
diff --git a/autoroll/config/vulkan-headers-angle.json b/autoroll/config/vulkan-headers-angle.json
index 9acf393..2a34f6d 100644
--- a/autoroll/config/vulkan-headers-angle.json
+++ b/autoroll/config/vulkan-headers-angle.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Vulkan-Headers",
+  "childDisplayName": "Vulkan-Headers",
+  "commitMsg": {
+    "bugProject": "angleproject",
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "angle-team@google.com",
     "jmadill@chromium.org"
@@ -14,7 +22,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "ANGLE",
+  "parentDisplayName": "ANGLE",
   "parentWaterfall": "https://ci.chromium.org/p/angle/g/ci/console",
   "rollerName": "vulkan-headers-angle-autoroll",
   "serviceAccount": "angle-autoroll@skia-public.iam.gserviceaccount.com",
@@ -31,9 +39,6 @@
     "childRepo": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers.git/+show/%s",
     "childSubdir": "angle",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "angleproject",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/angle/angle.git",
     "preUploadSteps": [
diff --git a/autoroll/config/vulkan-loader-angle.json b/autoroll/config/vulkan-loader-angle.json
index c9f319d..177fc58 100644
--- a/autoroll/config/vulkan-loader-angle.json
+++ b/autoroll/config/vulkan-loader-angle.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Vulkan-Loader",
+  "childDisplayName": "Vulkan-Loader",
+  "commitMsg": {
+    "bugProject": "angleproject",
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Loader.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "angle-team@google.com",
     "jmadill@chromium.org"
@@ -14,7 +22,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "ANGLE",
+  "parentDisplayName": "ANGLE",
   "parentWaterfall": "https://ci.chromium.org/p/angle/g/ci/console",
   "rollerName": "vulkan-loader-angle-autoroll",
   "serviceAccount": "angle-autoroll@skia-public.iam.gserviceaccount.com",
@@ -30,9 +38,6 @@
     "childPath": "third_party/vulkan-loader/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Loader.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Loader.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "angleproject",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/angle/angle.git"
   },
diff --git a/autoroll/config/vulkan-tools-angle.json b/autoroll/config/vulkan-tools-angle.json
index bed3dc2..afd5b2a 100644
--- a/autoroll/config/vulkan-tools-angle.json
+++ b/autoroll/config/vulkan-tools-angle.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Vulkan-Tools",
+  "childDisplayName": "Vulkan-Tools",
+  "commitMsg": {
+    "bugProject": "angleproject",
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "angle-team@google.com",
     "jmadill@chromium.org"
@@ -14,7 +22,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "ANGLE",
+  "parentDisplayName": "ANGLE",
   "parentWaterfall": "https://ci.chromium.org/p/angle/g/ci/console",
   "rollerName": "vulkan-tools-angle-autoroll",
   "serviceAccount": "angle-autoroll@skia-public.iam.gserviceaccount.com",
@@ -30,9 +38,6 @@
     "childPath": "third_party/vulkan-tools/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "angleproject",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/angle/angle.git"
   },
diff --git a/autoroll/config/vulkan-validation-layers-angle.json b/autoroll/config/vulkan-validation-layers-angle.json
index 57c3143..5c51f8d 100644
--- a/autoroll/config/vulkan-validation-layers-angle.json
+++ b/autoroll/config/vulkan-validation-layers-angle.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "Vulkan-ValidationLayers",
+  "childDisplayName": "Vulkan-ValidationLayers",
+  "commitMsg": {
+    "bugProject": "angleproject",
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-ValidationLayers.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "angle-team@google.com",
     "jmadill@chromium.org"
@@ -14,7 +22,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "ANGLE",
+  "parentDisplayName": "ANGLE",
   "parentWaterfall": "https://ci.chromium.org/p/angle/g/ci/console",
   "rollerName": "vulkan-validation-layers-angle-autoroll",
   "serviceAccount": "angle-autoroll@skia-public.iam.gserviceaccount.com",
@@ -30,9 +38,6 @@
     "childPath": "third_party/vulkan-validation-layers/src",
     "childRepo": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-ValidationLayers.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-ValidationLayers.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "angleproject",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/angle/angle.git"
   },
diff --git a/autoroll/config/waterfall-emscripten-releases.json b/autoroll/config/waterfall-emscripten-releases.json
index 0a81f6c..bd3f58c 100644
--- a/autoroll/config/waterfall-emscripten-releases.json
+++ b/autoroll/config/waterfall-emscripten-releases.json
@@ -1,7 +1,14 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "waterfall",
+  "childDisplayName": "waterfall",
+  "commitMsg": {
+    "childLogURLTmpl": "https://chromium.googlesource.com/external/github.com/WebAssembly/waterfall.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "dschuff@google.com"
   ],
@@ -13,7 +20,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "emscripten-releases",
+  "parentDisplayName": "emscripten-releases",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "waterfall-emscripten-releases",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,8 +32,6 @@
     "childPath": "emscripten-releases/waterfall",
     "childRepo": "https://chromium.googlesource.com/external/github.com/WebAssembly/waterfall.git",
     "childRevLinkTmpl": "https://chromium.googlesource.com/external/github.com/WebAssembly/waterfall.git/+show/%s",
-    "includeBugs": false,
-    "includeLog": true,
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/emscripten-releases.git"
   },
diff --git a/autoroll/config/webrtc-chromium.json b/autoroll/config/webrtc-chromium.json
index e09b1d5..d57e932 100644
--- a/autoroll/config/webrtc-chromium.json
+++ b/autoroll/config/webrtc-chromium.json
@@ -1,7 +1,15 @@
 // See https://skia.googlesource.com/buildbot.git/+show/master/autoroll/go/roller/config.go#130
 // for documentation of the autoroller config.
 {
-  "childName": "WebRTC",
+  "childDisplayName": "WebRTC",
+  "commitMsg": {
+    "bugProject": "chromium",
+    "childLogURLTmpl": "https://webrtc.googlesource.com/src.git/+log/{{.RollingFrom}}..{{.RollingTo}}",
+    "includeLog": true,
+    "includeRevisionCount": true,
+    "includeTbrLine": true,
+    "includeTests": false
+  },
   "contacts": [
     "comms-engprod-sto@google.com"
   ],
@@ -13,7 +21,7 @@
   "isInternal": false,
   "ownerPrimary": "borenet",
   "ownerSecondary": "rmistry",
-  "parentName": "Chromium",
+  "parentDisplayName": "Chromium",
   "parentWaterfall": "https://build.chromium.org",
   "rollerName": "webrtc-chromium-autoroll",
   "serviceAccount": "chromium-autoroll@skia-public.iam.gserviceaccount.com",
@@ -25,9 +33,6 @@
     "childPath": "src/third_party/webrtc",
     "childRepo": "https://webrtc.googlesource.com/src.git",
     "childRevLinkTmpl": "https://webrtc.googlesource.com/src.git/+show/%s",
-    "includeBugs": true,
-    "includeLog": true,
-    "bugProject": "chromium",
     "parentBranch": "master",
     "parentRepo": "https://chromium.googlesource.com/chromium/src.git"
   },
diff --git a/autoroll/go/autoroll-be/main.go b/autoroll/go/autoroll-be/main.go
index a812603..b1f6346 100644
--- a/autoroll/go/autoroll-be/main.go
+++ b/autoroll/go/autoroll-be/main.go
@@ -10,7 +10,6 @@
 	"io/ioutil"
 	"os"
 	"os/user"
-	"path"
 	"path/filepath"
 	"strings"
 	"time"
@@ -127,7 +126,7 @@
 		sklog.Fatal(err)
 	}
 
-	chatbot.Init(fmt.Sprintf("%s -> %s AutoRoller", cfg.ChildName, cfg.ParentName))
+	chatbot.Init(fmt.Sprintf("%s -> %s AutoRoller", cfg.ChildDisplayName, cfg.ParentDisplayName))
 
 	user, err := user.Current()
 	if err != nil {
@@ -156,15 +155,15 @@
 		gcsClient = gcsclient.New(s, GS_BUCKET_AUTOROLLERS)
 
 		// Emailing init.
-		emailClientId, err := ioutil.ReadFile(path.Join(*emailCreds, metadata.GMAIL_CLIENT_ID))
+		emailClientId, err := ioutil.ReadFile(filepath.Join(*emailCreds, metadata.GMAIL_CLIENT_ID))
 		if err != nil {
 			sklog.Fatal(err)
 		}
-		emailClientSecret, err := ioutil.ReadFile(path.Join(*emailCreds, metadata.GMAIL_CLIENT_SECRET))
+		emailClientSecret, err := ioutil.ReadFile(filepath.Join(*emailCreds, metadata.GMAIL_CLIENT_SECRET))
 		if err != nil {
 			sklog.Fatal(err)
 		}
-		cachedGMailToken, err := ioutil.ReadFile(path.Join(*emailCreds, metadata.GMAIL_CACHED_TOKEN_AUTOROLL))
+		cachedGMailToken, err := ioutil.ReadFile(filepath.Join(*emailCreds, metadata.GMAIL_CACHED_TOKEN_AUTOROLL))
 		if err != nil {
 			sklog.Fatal(err)
 		}
@@ -219,9 +218,9 @@
 			sklog.Fatalf("Failed to create Gerrit client: %s", err)
 		}
 	} else if cfg.Github != nil {
-		pathToGithubToken := path.Join(user.HomeDir, github.GITHUB_TOKEN_FILENAME)
+		pathToGithubToken := filepath.Join(user.HomeDir, github.GITHUB_TOKEN_FILENAME)
 		if !*local {
-			pathToGithubToken = path.Join(github.GITHUB_TOKEN_SERVER_PATH, github.GITHUB_TOKEN_FILENAME)
+			pathToGithubToken = filepath.Join(github.GITHUB_TOKEN_SERVER_PATH, github.GITHUB_TOKEN_FILENAME)
 			// Setup the required SSH key from secrets if we are not running
 			// locally and if the file does not already exist.
 			sshKeySrc := filepath.Join(github.SSH_KEY_SERVER_PATH, github.SSH_KEY_FILENAME)
diff --git a/autoroll/go/autoroll-fe/main.go b/autoroll/go/autoroll-fe/main.go
index bbbcc21..109a93d 100644
--- a/autoroll/go/autoroll-fe/main.go
+++ b/autoroll/go/autoroll-fe/main.go
@@ -282,8 +282,8 @@
 		ChildName  string
 		ParentName string
 	}{
-		ChildName:  roller.Cfg.ChildName,
-		ParentName: roller.Cfg.ParentName,
+		ChildName:  roller.Cfg.ChildDisplayName,
+		ParentName: roller.Cfg.ParentDisplayName,
 	}
 	if err := rollerTemplate.Execute(w, page); err != nil {
 		httputils.ReportError(w, err, "Failed to expand template.", http.StatusInternalServerError)
@@ -302,9 +302,9 @@
 		}
 		statuses[name] = &autoRollMiniStatus{
 			AutoRollMiniStatus: status,
-			ChildName:          roller.Cfg.ChildName,
+			ChildName:          roller.Cfg.ChildDisplayName,
 			Mode:               modeStr,
-			ParentName:         roller.Cfg.ParentName,
+			ParentName:         roller.Cfg.ParentDisplayName,
 		}
 	}
 	if err := json.NewEncoder(w).Encode(statuses); err != nil {
diff --git a/autoroll/go/autoroll-google3/google3.go b/autoroll/go/autoroll-google3/google3.go
index 5f8b450..ec66e52 100644
--- a/autoroll/go/autoroll-google3/google3.go
+++ b/autoroll/go/autoroll-google3/google3.go
@@ -151,13 +151,13 @@
 			NumFailedRolls:      numFailures,
 			NumNotRolledCommits: commitsNotRolled,
 		},
-		ChildName:       a.cfg.ChildName,
+		ChildName:       a.cfg.ChildDisplayName,
 		CurrentRoll:     a.recent.CurrentRoll(),
 		Error:           errorMsg,
 		FullHistoryUrl:  "https://goto.google.com/skia-autoroll-history",
 		IssueUrlBase:    ISSUE_URL_BASE,
 		LastRoll:        lastRoll,
-		ParentName:      a.cfg.ParentName,
+		ParentName:      a.cfg.ParentDisplayName,
 		Recent:          recent,
 		Status:          state_machine.S_NORMAL_ACTIVE,
 		ValidModes:      []string{modes.MODE_RUNNING},
diff --git a/autoroll/go/autoroll-google3/google3_test.go b/autoroll/go/autoroll-google3/google3_test.go
index 44e40ec..9e0e84e 100644
--- a/autoroll/go/autoroll-google3/google3_test.go
+++ b/autoroll/go/autoroll-google3/google3_test.go
@@ -30,13 +30,13 @@
 	urlmock := mockhttpclient.NewURLMock()
 	mockChild := gitiles_testutils.NewMockRepo(t, gb.RepoUrl(), git.GitDir(gb.Dir()), urlmock)
 	a, err := NewAutoRoller(ctx, &roller.AutoRollerConfig{
-		ChildName: "test-child",
+		ChildDisplayName: "test-child",
 		Google3RepoManager: &roller.Google3FakeRepoManagerConfig{
 			ChildBranch: "master",
 			ChildRepo:   gb.RepoUrl(),
 		},
-		ParentName: "test-parent",
-		RollerName: "test-roller",
+		ParentDisplayName: "test-parent",
+		RollerName:        "test-roller",
 	}, urlmock.Client())
 	require.NoError(t, err)
 	a.Start(ctx, time.Second, time.Second)
diff --git a/autoroll/go/autoroll-pusher/main.go b/autoroll/go/autoroll-pusher/main.go
index 015a110..cedebdc 100644
--- a/autoroll/go/autoroll-pusher/main.go
+++ b/autoroll/go/autoroll-pusher/main.go
@@ -323,7 +323,7 @@
 		tmplBe := "./go/autoroll-be/autoroll-be.yaml.template"
 		for cfgFile, config := range configs {
 			// Google3 uses a different type of backend.
-			if config.ParentName == GOOGLE3_PARENT_NAME {
+			if config.ParentDisplayName == GOOGLE3_PARENT_NAME {
 				continue
 			}
 			dst := filepath.Join(clusterCfgDir, fmt.Sprintf("autoroll-be-%s.yaml", strings.Split(cfgFile, ".")[0]))
diff --git a/autoroll/go/codereview/roll_test.go b/autoroll/go/codereview/roll_test.go
index 4e92f91..5c622f4 100644
--- a/autoroll/go/codereview/roll_test.go
+++ b/autoroll/go/codereview/roll_test.go
@@ -47,7 +47,7 @@
 		ChangeId:      fmt.Sprintf("%d", issueNum),
 		Issue:         issueNum,
 		Labels:        map[string]*gerrit.LabelEntry{},
-		Owner: &gerrit.Owner{
+		Owner: &gerrit.Person{
 			Email: "fake-deps-roller@chromium.org",
 		},
 		Project: "skia",
@@ -403,7 +403,7 @@
 		ChangeId:      fmt.Sprintf("%d", a.Issue),
 		Issue:         a.Issue,
 		Labels:        map[string]*gerrit.LabelEntry{},
-		Owner: &gerrit.Owner{
+		Owner: &gerrit.Person{
 			Email: "fake@chromium.org",
 		},
 		Project: "skia",
diff --git a/autoroll/go/commit_msg/android.go b/autoroll/go/commit_msg/android.go
new file mode 100644
index 0000000..9eedbf1
--- /dev/null
+++ b/autoroll/go/commit_msg/android.go
@@ -0,0 +1,27 @@
+package commit_msg
+
+import "text/template"
+
+const (
+	// TmplNameAndroid is the name of the commit message template used by
+	// rollers which roll into Android.
+	TmplNameAndroid = "android"
+)
+
+var (
+	// TmplAndroid is the commit message template used by rollers which roll
+	// into Android. It can be referenced in config files using tmplNameAndroid.
+	tmplAndroid = template.Must(parseCommitMsgTemplate(tmplCommitMsg, TmplNameAndroid,
+		`{{- define "footer" -}}
+Test: Presubmit checks will test this change.
+Exempt-From-Owner-Approval: The autoroll bot does not require owner approval.
+{{ if .BugProject -}}
+{{ range .Bugs }}Bug: {{ . }}
+{{ end }}
+{{- end -}}
+{{- if .IncludeTests -}}
+{{ range .Tests }}Test: {{ . }}
+{{- end}}
+{{- end -}}
+{{- end -}}`))
+)
diff --git a/autoroll/go/commit_msg/android_test.go b/autoroll/go/commit_msg/android_test.go
new file mode 100644
index 0000000..242ae14
--- /dev/null
+++ b/autoroll/go/commit_msg/android_test.go
@@ -0,0 +1,151 @@
+package commit_msg
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/require"
+	"go.skia.org/infra/go/testutils/unittest"
+)
+
+func TestNamedTemplateAndroid_AllFeatures(t *testing.T) {
+	unittest.SmallTest(t)
+
+	b := fakeBuilder(t)
+	b.cfg.Template = TmplNameAndroid
+	result, err := b.Build(FakeCommitMsgInputs())
+	require.NoError(t, err)
+	require.Equal(t, `Roll fake/child/src from aaaaaaaaaaaa to cccccccccccc (2 revisions)
+
+https://fake-child-log/aaaaaaaaaaaa..cccccccccccc
+
+2020-04-17 c@google.com Commit C
+2020-04-16 b@google.com Commit B
+
+Also rolling transitive DEPS:
+  parent/dep1 from dddddddddddd to eeeeeeeeeeee
+  parent/dep3 from aaaaaaaaaaaa to cccccccccccc
+
+If this roll has caused a breakage, revert this CL and stop the roller
+using the controls here:
+https://fake.server.com/r/fake-autoroll
+Please CC reviewer@google.com on the revert to ensure that a human
+is aware of the problem.
+
+To report a problem with the AutoRoller itself, please file a bug:
+https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
+
+Documentation for the AutoRoller is here:
+https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
+
+Test: Presubmit checks will test this change.
+Exempt-From-Owner-Approval: The autoroll bot does not require owner approval.
+Bug: fakebugproject:1234
+Bug: fakebugproject:5678
+Test: some-test
+`, result)
+}
+
+func TestNamedTemplateAndroid_NoLog(t *testing.T) {
+	unittest.SmallTest(t)
+
+	b := fakeBuilder(t)
+	b.cfg.Template = TmplNameAndroid
+	b.cfg.IncludeLog = false
+	result, err := b.Build(FakeCommitMsgInputs())
+	require.NoError(t, err)
+	require.Equal(t, `Roll fake/child/src from aaaaaaaaaaaa to cccccccccccc (2 revisions)
+
+https://fake-child-log/aaaaaaaaaaaa..cccccccccccc
+
+Also rolling transitive DEPS:
+  parent/dep1 from dddddddddddd to eeeeeeeeeeee
+  parent/dep3 from aaaaaaaaaaaa to cccccccccccc
+
+If this roll has caused a breakage, revert this CL and stop the roller
+using the controls here:
+https://fake.server.com/r/fake-autoroll
+Please CC reviewer@google.com on the revert to ensure that a human
+is aware of the problem.
+
+To report a problem with the AutoRoller itself, please file a bug:
+https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
+
+Documentation for the AutoRoller is here:
+https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
+
+Test: Presubmit checks will test this change.
+Exempt-From-Owner-Approval: The autoroll bot does not require owner approval.
+Bug: fakebugproject:1234
+Bug: fakebugproject:5678
+Test: some-test
+`, result)
+}
+
+func TestNamedTemplateAndroid_NoBugs(t *testing.T) {
+	unittest.SmallTest(t)
+
+	b := fakeBuilder(t)
+	b.cfg.BugProject = ""
+	b.cfg.Template = TmplNameAndroid
+	result, err := b.Build(FakeCommitMsgInputs())
+	require.NoError(t, err)
+	require.Equal(t, `Roll fake/child/src from aaaaaaaaaaaa to cccccccccccc (2 revisions)
+
+https://fake-child-log/aaaaaaaaaaaa..cccccccccccc
+
+2020-04-17 c@google.com Commit C
+2020-04-16 b@google.com Commit B
+
+Also rolling transitive DEPS:
+  parent/dep1 from dddddddddddd to eeeeeeeeeeee
+  parent/dep3 from aaaaaaaaaaaa to cccccccccccc
+
+If this roll has caused a breakage, revert this CL and stop the roller
+using the controls here:
+https://fake.server.com/r/fake-autoroll
+Please CC reviewer@google.com on the revert to ensure that a human
+is aware of the problem.
+
+To report a problem with the AutoRoller itself, please file a bug:
+https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
+
+Documentation for the AutoRoller is here:
+https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
+
+Test: Presubmit checks will test this change.
+Exempt-From-Owner-Approval: The autoroll bot does not require owner approval.
+Test: some-test
+`, result)
+}
+
+func TestNamedTemplateAndroid_Minimal(t *testing.T) {
+	unittest.SmallTest(t)
+
+	b := fakeBuilder(t)
+	b.cfg.BugProject = ""
+	b.cfg.Template = TmplNameAndroid
+	b.cfg.ChildLogURLTmpl = ""
+	b.cfg.CqExtraTrybots = nil
+	b.cfg.IncludeLog = false
+	b.cfg.IncludeTests = false
+	b.transitiveDeps = nil
+	result, err := b.Build(FakeCommitMsgInputs())
+	require.NoError(t, err)
+	require.Equal(t, `Roll fake/child/src from aaaaaaaaaaaa to cccccccccccc (2 revisions)
+
+If this roll has caused a breakage, revert this CL and stop the roller
+using the controls here:
+https://fake.server.com/r/fake-autoroll
+Please CC reviewer@google.com on the revert to ensure that a human
+is aware of the problem.
+
+To report a problem with the AutoRoller itself, please file a bug:
+https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
+
+Documentation for the AutoRoller is here:
+https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
+
+Test: Presubmit checks will test this change.
+Exempt-From-Owner-Approval: The autoroll bot does not require owner approval.
+`, result)
+}
diff --git a/autoroll/go/commit_msg/cmd/mock-commit-msg/main.go b/autoroll/go/commit_msg/cmd/mock-commit-msg/main.go
new file mode 100644
index 0000000..4da5625
--- /dev/null
+++ b/autoroll/go/commit_msg/cmd/mock-commit-msg/main.go
@@ -0,0 +1,61 @@
+package main
+
+import (
+	"flag"
+	"fmt"
+	"io"
+	"log"
+
+	"github.com/flynn/json5"
+	"go.skia.org/infra/autoroll/go/commit_msg"
+	"go.skia.org/infra/autoroll/go/roller"
+	"go.skia.org/infra/go/common"
+	"go.skia.org/infra/go/util"
+)
+
+var (
+	configFile = flag.String("config", "", "Config file to parse. Required.")
+	serverURL  = flag.String("server_url", "", "Server URL. Optional.")
+)
+
+func main() {
+	common.Init()
+
+	// Validation.
+	if *configFile == "" {
+		log.Fatal("--config is required.")
+	}
+
+	// Read the roller config file.
+	var cfg roller.AutoRollerConfig
+	if err := util.WithReadFile(*configFile, func(r io.Reader) error {
+		return json5.NewDecoder(r).Decode(&cfg)
+	}); err != nil {
+		log.Fatalf("Failed to read %s: %s", *configFile, err)
+	}
+
+	// Fake the serverURL based on the roller name.
+	if *serverURL == "" {
+		*serverURL = fmt.Sprintf("https://autoroll.skia.org/r/%s", cfg.RollerName)
+	}
+
+	// Obtain fake data to use for the commit message.
+	from, to, revs, _ := commit_msg.FakeCommitMsgInputs()
+	reviewers, err := roller.GetSheriff(cfg.RollerName, cfg.Sheriff, cfg.SheriffBackup)
+	if err != nil {
+		log.Fatalf("Failed to retrieve sheriff: %s", err)
+	}
+
+	// Create the commit message builder.
+	b, err := commit_msg.NewBuilder(cfg.CommitMsgConfig, cfg.ChildDisplayName, *serverURL, cfg.TransitiveDeps)
+	if err != nil {
+		log.Fatalf("Failed to create commit message builder: %s", err)
+	}
+
+	// Build the commit message.
+	genCommitMsg, err := b.Build(from, to, revs, reviewers)
+	if err != nil {
+		log.Fatalf("Failed to build commit message: %s", err)
+	}
+	fmt.Println(genCommitMsg)
+}
diff --git a/autoroll/go/commit_msg/commit_msg.go b/autoroll/go/commit_msg/commit_msg.go
new file mode 100644
index 0000000..09dcd52
--- /dev/null
+++ b/autoroll/go/commit_msg/commit_msg.go
@@ -0,0 +1,378 @@
+package commit_msg
+
+import (
+	"bytes"
+	"fmt"
+	"regexp"
+	"sort"
+	"strings"
+	"text/template"
+	"time"
+
+	"go.skia.org/infra/autoroll/go/repo_manager/common/version_file_common"
+	"go.skia.org/infra/autoroll/go/revision"
+	"go.skia.org/infra/go/skerr"
+	"go.skia.org/infra/go/util"
+)
+
+var (
+	// namedCommitMsgTemplates contains pre-defined commit message templates
+	// which may be referenced by name in config files.
+	namedCommitMsgTemplates = map[string]*template.Template{
+		TmplNameAndroid: tmplAndroid,
+		TmplNameDefault: tmplCommitMsg,
+	}
+
+	limitEmptyLinesRegex = regexp.MustCompile(`\n\n\n+`)
+	newlineAtEndRegex    = regexp.MustCompile(`\n*$`)
+)
+
+// transitiveDepUpdate represents an update to one transitive dependency.
+type transitiveDepUpdate struct {
+	Dep         string
+	RollingFrom string
+	RollingTo   string
+}
+
+// CommitMsgConfig provides configuration for commit messages.
+type CommitMsgConfig struct {
+	BugProject           string   `json:"bugProject"`
+	ChildLogURLTmpl      string   `json:"childLogURLTmpl"`
+	CqExtraTrybots       []string `json:"cqExtraTrybots"`
+	IncludeLog           bool     `json:"includeLog"`
+	IncludeRevisionCount bool     `json:"includeRevisionCount"`
+	IncludeTbrLine       bool     `json:"includeTbrLine"`
+	IncludeTests         bool     `json:"includeTests"`
+	// Template is either a full commit message template string or the name of
+	// an entry in NamedCommitMsgTemplates. If not specified, the default
+	// template is used.
+	Template string `json:"template"`
+}
+
+// See documentation for util.Validator interface.
+func (c *CommitMsgConfig) Validate() error {
+	// We are not concerned with the presence or absence of any given field,
+	// since some rollers may not need all of the fields. If we are able to
+	// execute the template given a typical set of inputs, we consider the
+	// CommitMsgConfig to be valid.
+	from, to, revs, reviewers := FakeCommitMsgInputs()
+	_, err := buildCommitMsg(c, fakeChildName, fakeServerURL, fakeTransitiveDeps, from, to, revs, reviewers)
+	return skerr.Wrap(err)
+}
+
+// Builder is a helper used to build commit messages.
+type Builder struct {
+	cfg            *CommitMsgConfig
+	childName      string
+	serverURL      string
+	transitiveDeps version_file_common.TransitiveDepConfigs
+}
+
+// NewBuilder returns a Builder instance.
+func NewBuilder(c *CommitMsgConfig, childName, serverURL string, transitiveDeps version_file_common.TransitiveDepConfigs) (*Builder, error) {
+	if err := c.Validate(); err != nil {
+		return nil, skerr.Wrap(err)
+	}
+	if childName == "" {
+		return nil, skerr.Fmt("childName is required")
+	}
+	if serverURL == "" {
+		return nil, skerr.Fmt("serverURL is required")
+	}
+	if err := transitiveDeps.Validate(); err != nil {
+		return nil, skerr.Wrap(err)
+	}
+	return &Builder{
+		cfg:            c,
+		childName:      childName,
+		serverURL:      serverURL,
+		transitiveDeps: transitiveDeps,
+	}, nil
+}
+
+// Build a commit message for the given roll.
+func (b *Builder) Build(from, to *revision.Revision, rolling []*revision.Revision, reviewers []string) (string, error) {
+	return buildCommitMsg(b.cfg, b.childName, b.serverURL, b.transitiveDeps, from, to, rolling, reviewers)
+}
+
+// buildCommitMsg builds a commit message for the given roll.
+func buildCommitMsg(c *CommitMsgConfig, childName, serverURL string, transitiveDeps []*version_file_common.TransitiveDepConfig, from, to *revision.Revision, rolling []*revision.Revision, reviewers []string) (string, error) {
+	vars, err := makeVars(c, childName, serverURL, transitiveDeps, from, to, rolling, reviewers)
+	if err != nil {
+		return "", skerr.Wrap(err)
+	}
+	// Create the commit message.
+	commitMsgTmpl := tmplCommitMsg
+	if vars.Template != "" {
+		if builtin, ok := namedCommitMsgTemplates[vars.Template]; ok {
+			commitMsgTmpl = builtin
+		} else {
+			commitMsgTmpl, err = parseCommitMsgTemplate(tmplCommitMsg, "customCommitMsg", vars.Template)
+			if err != nil {
+				return "", skerr.Wrap(err)
+			}
+		}
+	}
+	var buf bytes.Buffer
+	if err := commitMsgTmpl.ExecuteTemplate(&buf, tmplNameCommitMsg, vars); err != nil {
+		return "", skerr.Wrap(err)
+	}
+
+	// Templates make whitespace tricky when they involve optional sections. To
+	// ensure that the message looks reasonable, limit to two newlines in a row
+	// (ie. at most one empty line), and ensure that the message ends in exactly
+	// one newline.
+	msg := limitEmptyLinesRegex.ReplaceAllString(buf.String(), "\n\n")
+	msg = newlineAtEndRegex.ReplaceAllString(msg, "\n")
+	return msg, nil
+}
+
+func fixupRevision(rev *revision.Revision) *revision.Revision {
+	cpy := rev.Copy()
+	cpy.Timestamp = cpy.Timestamp.UTC()
+	return cpy
+}
+
+// makeVars derives commitMsgVars from the CommitMsgConfig for the given roll.
+func makeVars(c *CommitMsgConfig, childName, serverURL string, transitiveDeps []*version_file_common.TransitiveDepConfig, from, to *revision.Revision, revisions []*revision.Revision, reviewers []string) (*commitMsgVars, error) {
+	// Create the commitMsgVars object to be used as input to the template.
+	revsCopy := make([]*revision.Revision, 0, len(revisions))
+	for _, rev := range revisions {
+		revsCopy = append(revsCopy, fixupRevision(rev))
+	}
+	vars := &commitMsgVars{
+		CommitMsgConfig: c,
+		ChildName:       childName,
+		Reviewers:       reviewers,
+		Revisions:       revsCopy,
+		RollingFrom:     fixupRevision(from),
+		RollingTo:       fixupRevision(to),
+		ServerURL:       serverURL,
+	}
+
+	// Bugs.
+	vars.Bugs = nil
+	if c.BugProject != "" {
+		// TODO(borenet): Move this to a util.MakeBugLines utility?
+		bugMap := map[string]bool{}
+		for _, rev := range revisions {
+			for _, bug := range rev.Bugs[c.BugProject] {
+				bugMap[bug] = true
+			}
+		}
+		if len(bugMap) > 0 {
+			vars.Bugs = make([]string, 0, len(bugMap))
+			for bug := range bugMap {
+				bugStr := fmt.Sprintf("%s:%s", c.BugProject, bug)
+				if c.BugProject == util.BUG_PROJECT_BUGANIZER {
+					bugStr = fmt.Sprintf("b/%s", bug)
+				}
+				vars.Bugs = append(vars.Bugs, bugStr)
+			}
+			sort.Strings(vars.Bugs)
+		}
+	}
+
+	// Log URL.
+	vars.ChildLogURL = ""
+	if c.ChildLogURLTmpl != "" {
+		childLogURLTmpl, err := parseCommitMsgTemplate(nil, "childLogURL", c.ChildLogURLTmpl)
+		if err != nil {
+			return nil, skerr.Wrap(err)
+		}
+		var buf bytes.Buffer
+		if err := childLogURLTmpl.Execute(&buf, vars); err != nil {
+			return nil, skerr.Wrap(err)
+		}
+		vars.ChildLogURL = buf.String()
+	}
+
+	// Tests.
+	if c.IncludeTests {
+		testsMap := map[string]bool{}
+		for _, rev := range revisions {
+			for _, test := range rev.Tests {
+				testsMap[test] = true
+			}
+		}
+		if len(testsMap) > 0 {
+			vars.Tests = make([]string, 0, len(testsMap))
+			for test := range testsMap {
+				vars.Tests = append(vars.Tests, test)
+			}
+			sort.Strings(vars.Tests)
+		}
+	}
+
+	// Transitive deps. Note that we can't verify that the repo manager
+	// implementation actually included these changes in the roll; we assume
+	// that it would do so if working correctly and would error out otherwise.
+	var transitiveUpdates []*transitiveDepUpdate
+	for _, td := range transitiveDeps {
+		// Find the versions of the transitive dep in the old and new revisions.
+		oldRev, ok := from.Dependencies[td.Child.ID]
+		if !ok {
+			return nil, skerr.Fmt("Transitive dependency %q is missing from revision %s", td.Child.ID, from.Id)
+		}
+		newRev, ok := to.Dependencies[td.Child.ID]
+		if !ok {
+			return nil, skerr.Fmt("Transitive dependency %q is missing from revision %s", td.Child.ID, to.Id)
+		}
+		if oldRev != newRev {
+			transitiveUpdates = append(transitiveUpdates, &transitiveDepUpdate{
+				Dep:         td.Parent.ID,
+				RollingFrom: oldRev,
+				RollingTo:   newRev,
+			})
+		}
+	}
+	vars.TransitiveDeps = transitiveUpdates
+	return vars, nil
+}
+
+// commitMsgVars contains variables used to fill in a commit message template.
+type commitMsgVars struct {
+	*CommitMsgConfig
+	Bugs           []string
+	ChildLogURL    string
+	ChildName      string
+	Reviewers      []string
+	Revisions      []*revision.Revision
+	RollingFrom    *revision.Revision
+	RollingTo      *revision.Revision
+	ServerURL      string
+	Tests          []string
+	TransitiveDeps []*transitiveDepUpdate
+}
+
+// parseCommitMsgTemplate parses the given commit message template string and
+// returns a Template instance.
+func parseCommitMsgTemplate(parent *template.Template, name, tmpl string) (*template.Template, error) {
+	var t *template.Template
+	if parent != nil {
+		clone, err := parent.Clone()
+		if err != nil {
+			return nil, skerr.Wrap(err)
+		}
+		t = clone.New(name)
+	} else {
+		t = template.New(name)
+	}
+	return t.Option("missingkey=error").Funcs(template.FuncMap{
+		"stringsJoin": strings.Join,
+		"substr": func(s string, a, b int) string {
+			if a > len(s) {
+				return ""
+			}
+			if b > len(s) {
+				b = len(s)
+			}
+			return s[a:b]
+		},
+	}).Parse(tmpl)
+}
+
+// Fake values for various configuration entries used for testing.
+const fakeBugProject = "fakebugproject"
+const fakeChildName = "fake/child/src"
+const fakeServerURL = "https://fake.server.com/r/fake-autoroll"
+const fakeChildDep1 = "child/dep1"
+const fakeChildDep2 = "child/dep2"
+const fakeChildDep3 = "child/dep3"
+
+var fakeTransitiveDeps = []*version_file_common.TransitiveDepConfig{
+	{
+		Child: &version_file_common.VersionFileConfig{
+			ID:   fakeChildDep1,
+			Path: "DEPS",
+		},
+		Parent: &version_file_common.VersionFileConfig{
+			ID:   "parent/dep1",
+			Path: "DEPS",
+		},
+	},
+	{
+		Child: &version_file_common.VersionFileConfig{
+			ID:   fakeChildDep2,
+			Path: "DEPS",
+		},
+		Parent: &version_file_common.VersionFileConfig{
+			ID:   "parent/dep2",
+			Path: "DEPS",
+		},
+	},
+	{
+		Child: &version_file_common.VersionFileConfig{
+			ID:   fakeChildDep3,
+			Path: "DEPS",
+		},
+		Parent: &version_file_common.VersionFileConfig{
+			ID:   "parent/dep3",
+			Path: "DEPS",
+		},
+	},
+}
+
+// FakeCommitMsgInputs returns Revisions which may be used to validate commit
+// message templates.
+func FakeCommitMsgInputs() (*revision.Revision, *revision.Revision, []*revision.Revision, []string) {
+	a := &revision.Revision{
+		Id:      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+		Display: "aaaaaaaaaaaa",
+		Author:  "a@google.com",
+		Dependencies: map[string]string{
+			fakeChildDep1: "dddddddddddddddddddddddddddddddddddddddd",
+			fakeChildDep2: "1111111111111111111111111111111111111111",
+			fakeChildDep3: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+		},
+		Description: "Commit A",
+		Details: `blah blah
+
+	aaaaaaa
+
+	blah`,
+		Timestamp: time.Unix(1586908800, 0),
+	}
+	b := &revision.Revision{
+		Id:      "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+		Display: "bbbbbbbbbbbb",
+		Author:  "b@google.com",
+		Bugs: map[string][]string{
+			fakeBugProject: {"1234"},
+		},
+		Dependencies: map[string]string{
+			fakeChildDep1: "dddddddddddddddddddddddddddddddddddddddd",
+			fakeChildDep2: "1111111111111111111111111111111111111111",
+			fakeChildDep3: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+		},
+		Description: "Commit B",
+		Details: `blah blah
+
+	bbbbbbb
+
+	blah`,
+		Timestamp: time.Unix(1586995200, 0),
+	}
+	c := &revision.Revision{
+		Id:      "cccccccccccccccccccccccccccccccccccccccc",
+		Display: "cccccccccccc",
+		Author:  "c@google.com",
+		Bugs: map[string][]string{
+			fakeBugProject: {"5678"},
+		},
+		Tests: []string{"some-test"},
+		Dependencies: map[string]string{
+			fakeChildDep1: "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+			fakeChildDep2: "1111111111111111111111111111111111111111",
+			fakeChildDep3: "cccccccccccccccccccccccccccccccccccccccc",
+		},
+		Description: "Commit C",
+		Details: `blah blah
+
+	ccccccc
+
+	blah`,
+		Timestamp: time.Unix(1587081600, 0),
+	}
+	return a, c, []*revision.Revision{c, b}, []string{"reviewer@google.com"}
+}
diff --git a/autoroll/go/commit_msg/commit_msg_test.go b/autoroll/go/commit_msg/commit_msg_test.go
new file mode 100644
index 0000000..da03b59
--- /dev/null
+++ b/autoroll/go/commit_msg/commit_msg_test.go
@@ -0,0 +1,130 @@
+package commit_msg
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/require"
+	"go.skia.org/infra/go/deepequal/assertdeep"
+	"go.skia.org/infra/go/testutils/unittest"
+)
+
+// fakeCommitMsgConfig returns a valid CommitMsgConfig instance.
+func fakeCommitMsgConfig(t *testing.T) *CommitMsgConfig {
+	c := &CommitMsgConfig{
+		BugProject:           fakeBugProject,
+		Template:             TmplNameDefault,
+		ChildLogURLTmpl:      "https://fake-child-log/{{.RollingFrom}}..{{.RollingTo}}",
+		CqExtraTrybots:       []string{"some-trybot"},
+		IncludeLog:           true,
+		IncludeRevisionCount: true,
+		IncludeTbrLine:       true,
+		IncludeTests:         true,
+	}
+	// Sanity check.
+	require.NoError(t, c.Validate())
+	return c
+}
+
+// fakeBuilder returns a Builder instance.
+func fakeBuilder(t *testing.T) *Builder {
+	b, err := NewBuilder(fakeCommitMsgConfig(t), fakeChildName, fakeServerURL, fakeTransitiveDeps)
+	require.NoError(t, err)
+	return b
+}
+
+func TestMakeVars(t *testing.T) {
+	unittest.SmallTest(t)
+
+	check := func(fn func(*Builder)) {
+		c := fakeCommitMsgConfig(t)
+		b, err := NewBuilder(c, fakeChildName, fakeServerURL, fakeTransitiveDeps)
+		require.NoError(t, err)
+		fn(b)
+		from, to, revs, reviewers := FakeCommitMsgInputs()
+		vars, err := makeVars(c, b.childName, b.serverURL, b.transitiveDeps, from, to, revs, reviewers)
+		require.NoError(t, err)
+
+		// Bugs.
+		var expectBugs int
+		if c.BugProject == "" {
+			expectBugs = 0
+		} else if c.BugProject != fakeBugProject {
+			expectBugs = 0
+		} else {
+			expectBugs = 2 // From fakeCommitMsgInputs.
+		}
+		require.Len(t, vars.Bugs, expectBugs)
+
+		// Log URL.
+		if c.ChildLogURLTmpl == "" {
+			require.Equal(t, vars.ChildLogURL, "")
+		} else {
+			require.Equal(t, vars.ChildLogURL, "https://fake-child-log/aaaaaaaaaaaa..cccccccccccc")
+		}
+
+		// RollingFrom and RollingTo.
+		require.Equal(t, fixupRevision(from), vars.RollingFrom)
+		require.Equal(t, fixupRevision(to), vars.RollingTo)
+
+		// Tests.
+		if c.IncludeTests {
+			require.Len(t, vars.Tests, 1)
+		} else {
+			require.Len(t, vars.Tests, 0)
+		}
+
+		// TransitiveDeps.
+		if len(b.transitiveDeps) == 0 {
+			require.Len(t, vars.TransitiveDeps, 0)
+		} else {
+			// Only two of the transitive deps differ.
+			require.Len(t, vars.TransitiveDeps, 2)
+			assertdeep.Equal(t, &transitiveDepUpdate{
+				Dep:         "parent/dep1",
+				RollingFrom: "dddddddddddddddddddddddddddddddddddddddd",
+				RollingTo:   "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+			}, vars.TransitiveDeps[0])
+			assertdeep.Equal(t, &transitiveDepUpdate{
+				Dep:         "parent/dep3",
+				RollingFrom: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+				RollingTo:   "cccccccccccccccccccccccccccccccccccccccc",
+			}, vars.TransitiveDeps[1])
+		}
+	}
+
+	// Default config includes everything.
+	check(func(b *Builder) {})
+	// No bugs.
+	check(func(b *Builder) {
+		b.cfg.BugProject = ""
+	})
+	check(func(b *Builder) {
+		b.cfg.BugProject = "bogus project; doesn't match anything"
+	})
+	// No log URL template.
+	check(func(b *Builder) {
+		b.cfg.ChildLogURLTmpl = ""
+	})
+	// No revisions.
+	check(func(b *Builder) {
+		b.cfg.IncludeLog = false
+	})
+	// No tests.
+	check(func(b *Builder) {
+		b.cfg.IncludeTests = false
+	})
+	// No transitive deps.
+	check(func(b *Builder) {
+		b.transitiveDeps = nil
+	})
+}
+
+func TestNamedTemplatesValid(t *testing.T) {
+	unittest.SmallTest(t)
+
+	cfg := fakeCommitMsgConfig(t)
+	for name := range namedCommitMsgTemplates {
+		cfg.Template = name
+		require.NoError(t, cfg.Validate())
+	}
+}
diff --git a/autoroll/go/commit_msg/default.go b/autoroll/go/commit_msg/default.go
new file mode 100644
index 0000000..01238d7
--- /dev/null
+++ b/autoroll/go/commit_msg/default.go
@@ -0,0 +1,87 @@
+package commit_msg
+
+import "text/template"
+
+const (
+	// TmplNameDefault is the name of the default commit message template which
+	// is suitable for most rollers.
+	TmplNameDefault = "default"
+)
+
+var (
+	// tmplNameCommitMsg is the name of the overall commit message template.
+	tmplNameCommitMsg = "commitMsg"
+
+	// tmplCommitMsg utilizes the skeleton with the default block definitions.
+	// It is the primary entry point which is executed for every commit message.
+	// Custom commit messages may modify it by overriding any of the blocks
+	// defined above, including the commitMsg itself for a completely custom
+	// message.
+	tmplCommitMsg = template.Must(parseCommitMsgTemplate(tmplFooterDefault, tmplNameCommitMsg, `
+{{- define "subject" }}{{ template "defaultSubject" . }}{{ end -}}
+{{- define "revisions" }}{{ template "defaultRevisions" . }}{{ end -}}
+{{- define "boilerplate" }}{{ template "defaultBoilerplate" . }}{{ end -}}
+{{- define "footer" }}{{ template "defaultFooter" . }}{{ end -}}
+{{ template "skeleton" . }}`))
+
+	tmplNameSkeleton = "skeleton"
+	// tmplSkeleton defines the basic structure for all commit messages.
+	tmplSkeleton = template.Must(parseCommitMsgTemplate(nil, tmplNameSkeleton,
+		`{{ template "subject" . }}
+
+{{ template "revisions" . }}
+
+{{ template "boilerplate" . }}
+
+{{ template "footer" . }}
+`))
+
+	tmplNameSubjectDefault = "defaultSubject"
+	tmplSubjectDefault     = template.Must(parseCommitMsgTemplate(tmplSkeleton, tmplNameSubjectDefault,
+		`Roll {{ .ChildName }} from {{ .RollingFrom }} to {{ .RollingTo }}{{ if .IncludeRevisionCount}} ({{ len .Revisions }} revision{{ if gt (len .Revisions) 1 }}s{{ end }}){{ end }}`))
+
+	tmplNameRevisionsDefault = "defaultRevisions"
+	tmplRevisionsDefault     = template.Must(parseCommitMsgTemplate(tmplSubjectDefault, tmplNameRevisionsDefault,
+		`{{ if .ChildLogURL }}{{ .ChildLogURL }}
+
+{{ end -}}
+{{- if .IncludeLog -}}
+{{ range .Revisions }}{{ .Timestamp.Format "2006-01-02" }} {{ .Author }} {{ .Description }}
+{{ end }}
+{{ end -}}
+{{ if len .TransitiveDeps -}}
+Also rolling transitive DEPS:
+{{ range .TransitiveDeps }}  {{ .Dep }} from {{ substr .RollingFrom 0 12 }} to {{ substr .RollingTo 0 12 }}
+{{ end }}
+{{- end }}`))
+
+	tmplNameBoilerplateDefault = "defaultBoilerplate"
+	tmplBoilerplateDefault     = template.Must(parseCommitMsgTemplate(tmplRevisionsDefault, tmplNameBoilerplateDefault,
+		`If this roll has caused a breakage, revert this CL and stop the roller
+using the controls here:
+{{.ServerURL}}
+Please CC {{stringsJoin .Reviewers ","}} on the revert to ensure that a human
+is aware of the problem.
+
+To report a problem with the AutoRoller itself, please file a bug:
+https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
+
+Documentation for the AutoRoller is here:
+https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md`))
+
+	tmplNameFooterDefault = "defaultFooter"
+	tmplFooterDefault     = template.Must(parseCommitMsgTemplate(tmplBoilerplateDefault, tmplNameFooterDefault,
+		`{{ if .CqExtraTrybots -}}
+Cq-Include-Trybots: {{ stringsJoin .CqExtraTrybots ";" }}
+{{ end -}}
+{{ if .BugProject -}}
+Bug: {{ if .Bugs }}{{ stringsJoin .Bugs "," }}{{ else }}None{{ end }}
+{{ end -}}
+{{ if .IncludeTbrLine -}}
+Tbr: {{ stringsJoin .Reviewers "," }}
+{{ end -}}
+{{ if .IncludeTests -}}
+{{ range .Tests }}Test: {{.}}
+{{- end -}}
+{{- end }}`))
+)
diff --git a/autoroll/go/commit_msg/default_test.go b/autoroll/go/commit_msg/default_test.go
new file mode 100644
index 0000000..7c6e1a6
--- /dev/null
+++ b/autoroll/go/commit_msg/default_test.go
@@ -0,0 +1,201 @@
+package commit_msg
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/require"
+	"go.skia.org/infra/go/testutils/unittest"
+)
+
+func TestNamedTemplateDefault_AllFeatures(t *testing.T) {
+	unittest.SmallTest(t)
+
+	b := fakeBuilder(t)
+	result, err := b.Build(FakeCommitMsgInputs())
+	require.NoError(t, err)
+	require.Equal(t, `Roll fake/child/src from aaaaaaaaaaaa to cccccccccccc (2 revisions)
+
+https://fake-child-log/aaaaaaaaaaaa..cccccccccccc
+
+2020-04-17 c@google.com Commit C
+2020-04-16 b@google.com Commit B
+
+Also rolling transitive DEPS:
+  parent/dep1 from dddddddddddd to eeeeeeeeeeee
+  parent/dep3 from aaaaaaaaaaaa to cccccccccccc
+
+If this roll has caused a breakage, revert this CL and stop the roller
+using the controls here:
+https://fake.server.com/r/fake-autoroll
+Please CC reviewer@google.com on the revert to ensure that a human
+is aware of the problem.
+
+To report a problem with the AutoRoller itself, please file a bug:
+https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
+
+Documentation for the AutoRoller is here:
+https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
+
+Cq-Include-Trybots: some-trybot
+Bug: fakebugproject:1234,fakebugproject:5678
+Tbr: reviewer@google.com
+Test: some-test
+`, result)
+}
+
+func TestNamedTemplateDefault_NoLog(t *testing.T) {
+	unittest.SmallTest(t)
+
+	b := fakeBuilder(t)
+	b.cfg.IncludeLog = false
+	result, err := b.Build(FakeCommitMsgInputs())
+	require.NoError(t, err)
+	require.Equal(t, `Roll fake/child/src from aaaaaaaaaaaa to cccccccccccc (2 revisions)
+
+https://fake-child-log/aaaaaaaaaaaa..cccccccccccc
+
+Also rolling transitive DEPS:
+  parent/dep1 from dddddddddddd to eeeeeeeeeeee
+  parent/dep3 from aaaaaaaaaaaa to cccccccccccc
+
+If this roll has caused a breakage, revert this CL and stop the roller
+using the controls here:
+https://fake.server.com/r/fake-autoroll
+Please CC reviewer@google.com on the revert to ensure that a human
+is aware of the problem.
+
+To report a problem with the AutoRoller itself, please file a bug:
+https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
+
+Documentation for the AutoRoller is here:
+https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
+
+Cq-Include-Trybots: some-trybot
+Bug: fakebugproject:1234,fakebugproject:5678
+Tbr: reviewer@google.com
+Test: some-test
+`, result)
+}
+
+func TestNamedTemplateDefault_NoBugProject(t *testing.T) {
+	unittest.SmallTest(t)
+
+	b := fakeBuilder(t)
+	b.cfg.BugProject = ""
+	result, err := b.Build(FakeCommitMsgInputs())
+	require.NoError(t, err)
+	require.Equal(t, `Roll fake/child/src from aaaaaaaaaaaa to cccccccccccc (2 revisions)
+
+https://fake-child-log/aaaaaaaaaaaa..cccccccccccc
+
+2020-04-17 c@google.com Commit C
+2020-04-16 b@google.com Commit B
+
+Also rolling transitive DEPS:
+  parent/dep1 from dddddddddddd to eeeeeeeeeeee
+  parent/dep3 from aaaaaaaaaaaa to cccccccccccc
+
+If this roll has caused a breakage, revert this CL and stop the roller
+using the controls here:
+https://fake.server.com/r/fake-autoroll
+Please CC reviewer@google.com on the revert to ensure that a human
+is aware of the problem.
+
+To report a problem with the AutoRoller itself, please file a bug:
+https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
+
+Documentation for the AutoRoller is here:
+https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
+
+Cq-Include-Trybots: some-trybot
+Tbr: reviewer@google.com
+Test: some-test
+`, result)
+}
+
+func TestNamedTemplateDefault_NoBugs(t *testing.T) {
+	unittest.SmallTest(t)
+
+	b := fakeBuilder(t)
+	from, to, revs, emails := FakeCommitMsgInputs()
+	from.Bugs = nil
+	to.Bugs = nil
+	for _, rev := range revs {
+		rev.Bugs = nil
+	}
+	result, err := b.Build(from, to, revs, emails)
+	require.NoError(t, err)
+	require.Equal(t, `Roll fake/child/src from aaaaaaaaaaaa to cccccccccccc (2 revisions)
+
+https://fake-child-log/aaaaaaaaaaaa..cccccccccccc
+
+2020-04-17 c@google.com Commit C
+2020-04-16 b@google.com Commit B
+
+Also rolling transitive DEPS:
+  parent/dep1 from dddddddddddd to eeeeeeeeeeee
+  parent/dep3 from aaaaaaaaaaaa to cccccccccccc
+
+If this roll has caused a breakage, revert this CL and stop the roller
+using the controls here:
+https://fake.server.com/r/fake-autoroll
+Please CC reviewer@google.com on the revert to ensure that a human
+is aware of the problem.
+
+To report a problem with the AutoRoller itself, please file a bug:
+https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
+
+Documentation for the AutoRoller is here:
+https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
+
+Cq-Include-Trybots: some-trybot
+Bug: None
+Tbr: reviewer@google.com
+Test: some-test
+`, result)
+}
+
+func TestNamedTemplateDefault_Minimal(t *testing.T) {
+	unittest.SmallTest(t)
+
+	b := fakeBuilder(t)
+	b.cfg.BugProject = ""
+	b.cfg.ChildLogURLTmpl = ""
+	b.cfg.CqExtraTrybots = nil
+	b.cfg.IncludeLog = false
+	b.cfg.IncludeTbrLine = false
+	b.cfg.IncludeTests = false
+	b.transitiveDeps = nil
+	result, err := b.Build(FakeCommitMsgInputs())
+	require.NoError(t, err)
+	require.Equal(t, `Roll fake/child/src from aaaaaaaaaaaa to cccccccccccc (2 revisions)
+
+If this roll has caused a breakage, revert this CL and stop the roller
+using the controls here:
+https://fake.server.com/r/fake-autoroll
+Please CC reviewer@google.com on the revert to ensure that a human
+is aware of the problem.
+
+To report a problem with the AutoRoller itself, please file a bug:
+https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
+
+Documentation for the AutoRoller is here:
+https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
+`, result)
+}
+
+func TestTotalOverride(t *testing.T) {
+	unittest.SmallTest(t)
+
+	b := fakeBuilder(t)
+	b.cfg.Template = `{{ define "commitMsg" }}Completely custom commit message.
+
+Seriously, this can be anything at all.
+{{end}}`
+	result, err := b.Build(FakeCommitMsgInputs())
+	require.NoError(t, err)
+	require.Equal(t, `Completely custom commit message.
+
+Seriously, this can be anything at all.
+`, result)
+}
diff --git a/autoroll/go/repo_manager/android_repo_manager.go b/autoroll/go/repo_manager/android_repo_manager.go
index 55ab7ad..936f44b 100644
--- a/autoroll/go/repo_manager/android_repo_manager.go
+++ b/autoroll/go/repo_manager/android_repo_manager.go
@@ -18,7 +18,6 @@
 	"go.skia.org/infra/autoroll/go/codereview"
 	"go.skia.org/infra/autoroll/go/config_vars"
 	"go.skia.org/infra/autoroll/go/repo_manager/common/gerrit_common"
-	"go.skia.org/infra/autoroll/go/repo_manager/parent"
 	"go.skia.org/infra/autoroll/go/revision"
 	"go.skia.org/infra/autoroll/go/strategy"
 	"go.skia.org/infra/go/exec"
@@ -28,35 +27,8 @@
 )
 
 const (
-	UPSTREAM_REMOTE_NAME    = "remote"
-	REPO_BRANCH_NAME        = "merge"
-	TMPL_COMMIT_MSG_ANDROID = `Roll {{.ChildPath}} {{.RollingFrom.String}}..{{.RollingTo.String}} ({{len .Revisions}} commits)
-
-{{.ChildRepo}}/+log/{{.RollingFrom.String}}..{{.RollingTo.String}}
-
-{{if .IncludeLog}}
-{{range .Revisions}}{{.Timestamp.Format "2006-01-02"}} {{.Author}} {{.Description}}
-{{end}}{{end}}
-
-If this roll has caused a breakage, revert this CL and stop the roller
-using the controls here:
-{{.ServerURL}}
-Please CC {{stringsJoin .Reviewers ","}} on the revert to ensure that a human
-is aware of the problem.
-
-To report a problem with the AutoRoller itself, please file a bug:
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
-
-Documentation for the AutoRoller is here:
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
-
-Test: Presubmit checks will test this change.
-Exempt-From-Owner-Approval: The autoroll bot does not require owner approval.
-
-{{range .Bugs}}Bug: {{.}}
-{{end}}{{range .Tests}}{{.}}
-{{end}}
-`
+	UPSTREAM_REMOTE_NAME = "remote"
+	REPO_BRANCH_NAME     = "merge"
 )
 
 var (
@@ -149,10 +121,6 @@
 	}
 
 	wd := path.Join(workdir, "android_repo")
-
-	if c.CommitMsgTmpl == "" {
-		c.CommitMsgTmpl = TMPL_COMMIT_MSG_ANDROID
-	}
 	crm, err := newCommonRepoManager(ctx, c.CommonRepoManagerConfig, reg, wd, serverURL, g, client, cr, local)
 	if err != nil {
 		return nil, err
@@ -285,7 +253,7 @@
 }
 
 // See documentation for RepoManager interface.
-func (r *androidRepoManager) CreateNewRoll(ctx context.Context, from, to *revision.Revision, rolling []*revision.Revision, emails []string, cqExtraTrybots string, dryRun bool) (int64, error) {
+func (r *androidRepoManager) CreateNewRoll(ctx context.Context, from, to *revision.Revision, rolling []*revision.Revision, emails []string, dryRun bool, commitMsg string) (int64, error) {
 	r.repoMtx.Lock()
 	defer r.repoMtx.Unlock()
 
@@ -373,23 +341,6 @@
 		sort.Strings(rollEmails)
 	}
 
-	// Create commit message.
-	commitMsg, err := r.buildCommitMsg(&parent.CommitMsgVars{
-		ChildPath:   r.childPath,
-		ChildRepo:   r.childRepoURL,
-		Reviewers:   rollEmails,
-		Revisions:   rolling,
-		RollingFrom: from,
-		RollingTo:   to,
-		ServerURL:   r.serverURL,
-	})
-	if err != nil {
-		return 0, err
-	}
-
-	// Temporary hack to substitute P4 for "Pixel4". See skbug.com/9595.
-	commitMsg = strings.Replace(commitMsg, "Pixel4", "P4", -1)
-
 	// Commit the change with the above message.
 	if _, commitErr := r.childRepo.Git(ctx, "commit", "-m", commitMsg); commitErr != nil {
 		util.LogErr(r.abandonRepoBranch(ctx))
diff --git a/autoroll/go/repo_manager/android_repo_manager_test.go b/autoroll/go/repo_manager/android_repo_manager_test.go
index 0913c91..2bc4b2e 100644
--- a/autoroll/go/repo_manager/android_repo_manager_test.go
+++ b/autoroll/go/repo_manager/android_repo_manager_test.go
@@ -156,7 +156,7 @@
 	lastRollRev, tipRev, notRolledRevs, err := rm.Update(ctx)
 	require.NoError(t, err)
 
-	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, androidEmails, "", false)
+	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, androidEmails, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.Equal(t, issueNum, issue)
 }
@@ -183,7 +183,7 @@
 	}
 
 	// Create a roll, assert that we ran the PreUploadSteps.
-	_, err = rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, androidEmails, "", false)
+	_, err = rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, androidEmails, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.True(t, ran)
 }
diff --git a/autoroll/go/repo_manager/common/version_file_common/version_file_common.go b/autoroll/go/repo_manager/common/version_file_common/version_file_common.go
index c8a4a41..fcbfc20 100644
--- a/autoroll/go/repo_manager/common/version_file_common/version_file_common.go
+++ b/autoroll/go/repo_manager/common/version_file_common/version_file_common.go
@@ -61,7 +61,7 @@
 	// Primary dependency.
 	VersionFileConfig
 	// Transitive dependencies.
-	TransitiveDeps []*TransitiveDepConfig
+	TransitiveDeps TransitiveDepConfigs
 }
 
 // See documentation for util.Validator interface.
@@ -69,19 +69,24 @@
 	if err := c.VersionFileConfig.Validate(); err != nil {
 		return skerr.Wrap(err)
 	}
-	for _, td := range c.TransitiveDeps {
-		if err := td.Validate(); err != nil {
-			return skerr.Wrap(err)
-		}
+	if err := c.TransitiveDeps.Validate(); err != nil {
+		return skerr.Wrap(err)
 	}
 	return nil
 }
 
-// TransitiveDepUpdate represents an update to one transitive dependency.
-type TransitiveDepUpdate struct {
-	Dep         string
-	RollingFrom string
-	RollingTo   string
+// TransitiveDepConfigs provide configuration for multiple transitive
+// dependencies.
+type TransitiveDepConfigs []*TransitiveDepConfig
+
+// See documentation for util.Validator interface.
+func (c TransitiveDepConfigs) Validate() error {
+	for _, elem := range c {
+		if err := elem.Validate(); err != nil {
+			return skerr.Wrap(err)
+		}
+	}
+	return nil
 }
 
 // GetPinnedRev reads the given file contents to find the pinned revision.
@@ -140,7 +145,7 @@
 
 // updateSingleDep updates the dependency in the given file, writing the new
 // contents into the changes map and returning the previous version.
-func updateSingleDep(ctx context.Context, dep VersionFileConfig, newVersion string, changes map[string]string, getFile GetFileFunc) (string, error) {
+func updateSingleDep(ctx context.Context, dep VersionFileConfig, newVersion string, changes map[string]string, getFile GetFileFunc) error {
 	// Look up the path in our changes map to prevent overwriting
 	// modifications we've already made.
 	oldContents, ok := changes[dep.Path]
@@ -148,60 +153,52 @@
 		var err error
 		oldContents, err = getFile(ctx, dep.Path)
 		if err != nil {
-			return "", skerr.Wrap(err)
+			return skerr.Wrap(err)
 		}
 	}
 
 	// Find the currently-pinned revision.
 	oldVersion, err := GetPinnedRev(dep, oldContents)
 	if err != nil {
-		return "", skerr.Wrap(err)
+		return skerr.Wrap(err)
 	}
 
 	// Create the new file content.
 	if newVersion != oldVersion {
 		newContents, err := SetPinnedRev(dep, newVersion, oldContents)
 		if err != nil {
-			return "", skerr.Wrap(err)
+			return skerr.Wrap(err)
 		}
 		changes[dep.Path] = newContents
 	}
-	return oldVersion, nil
+	return nil
 }
 
 // UpdateDep updates the given dependency to the given revision, also updating
 // any transitive dependencies to the revisions specified in the new revision of
 // the primary dependency. Returns a map whose keys are file names to update and
 // values are their updated contents.
-func UpdateDep(ctx context.Context, primaryDep DependencyConfig, rev *revision.Revision, getFile GetFileFunc) (map[string]string, []*TransitiveDepUpdate, error) {
+func UpdateDep(ctx context.Context, primaryDep DependencyConfig, rev *revision.Revision, getFile GetFileFunc) (map[string]string, error) {
 	// Update the primary dependency.
 	changes := make(map[string]string, 1+len(primaryDep.TransitiveDeps))
-	if _, err := updateSingleDep(ctx, primaryDep.VersionFileConfig, rev.Id, changes, getFile); err != nil {
-		return nil, nil, skerr.Wrap(err)
+	if err := updateSingleDep(ctx, primaryDep.VersionFileConfig, rev.Id, changes, getFile); err != nil {
+		return nil, skerr.Wrap(err)
 	}
 
 	// Handle transitive dependencies.
-	var td []*TransitiveDepUpdate
 	if len(primaryDep.TransitiveDeps) > 0 {
 		for _, dep := range primaryDep.TransitiveDeps {
 			// Find the new revision.
 			newVersion, ok := rev.Dependencies[dep.Child.ID]
 			if !ok {
-				return nil, nil, skerr.Fmt("Could not find transitive dependency %q in %#v", dep.Child.ID, rev)
+				return nil, skerr.Fmt("Could not find transitive dependency %q in %#v", dep.Child.ID, rev)
 			}
 			// Update.
-			oldVersion, err := updateSingleDep(ctx, *dep.Parent, newVersion, changes, getFile)
-			if err != nil {
-				return nil, nil, skerr.Wrap(err)
+			if err := updateSingleDep(ctx, *dep.Parent, newVersion, changes, getFile); err != nil {
+				return nil, skerr.Wrap(err)
 			}
-			// Add the transitive dep to the list.
-			td = append(td, &TransitiveDepUpdate{
-				Dep:         dep.Parent.ID,
-				RollingFrom: oldVersion,
-				RollingTo:   newVersion,
-			})
 		}
 	}
 
-	return changes, td, nil
+	return changes, nil
 }
diff --git a/autoroll/go/repo_manager/copy_repo_manager.go b/autoroll/go/repo_manager/copy_repo_manager.go
index e0d61a89..c297983 100644
--- a/autoroll/go/repo_manager/copy_repo_manager.go
+++ b/autoroll/go/repo_manager/copy_repo_manager.go
@@ -50,14 +50,6 @@
 	parentCfg := parent.CopyConfig{
 		GitCheckoutGerritConfig: parent.GitCheckoutGerritConfig{
 			GitCheckoutConfig: parent.GitCheckoutConfig{
-				BaseConfig: parent.BaseConfig{
-					ChildPath:       c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.ChildPath,
-					ChildRepo:       c.ChildRepo,
-					IncludeBugs:     c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.IncludeBugs,
-					IncludeLog:      c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.IncludeLog,
-					CommitMsgTmpl:   c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.CommitMsgTmpl,
-					MonorailProject: c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.BugProject,
-				},
 				GitCheckoutConfig: git_common.GitCheckoutConfig{
 					Branch:  c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.ParentBranch,
 					RepoURL: c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.ParentRepo,
diff --git a/autoroll/go/repo_manager/copy_repo_manager_test.go b/autoroll/go/repo_manager/copy_repo_manager_test.go
index f950319..3f4e686 100644
--- a/autoroll/go/repo_manager/copy_repo_manager_test.go
+++ b/autoroll/go/repo_manager/copy_repo_manager_test.go
@@ -176,7 +176,7 @@
 	urlMock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/123/revisions/ps1/review", mockhttpclient.MockPostDialogue("application/json", reqBody, []byte("")))
 
 	// Upload the CL.
-	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.Equal(t, int64(123), issue)
 }
diff --git a/autoroll/go/repo_manager/deps_repo_manager.go b/autoroll/go/repo_manager/deps_repo_manager.go
index 493fdef..f65eb28 100644
--- a/autoroll/go/repo_manager/deps_repo_manager.go
+++ b/autoroll/go/repo_manager/deps_repo_manager.go
@@ -49,14 +49,6 @@
 func (c DEPSRepoManagerConfig) splitParentChild() (parent.DEPSLocalConfig, child.GitCheckoutConfig, error) {
 	parentCfg := parent.DEPSLocalConfig{
 		GitCheckoutConfig: parent.GitCheckoutConfig{
-			BaseConfig: parent.BaseConfig{
-				ChildPath:       c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.ChildPath,
-				ChildRepo:       c.ChildRepo,
-				IncludeBugs:     c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.IncludeBugs,
-				IncludeLog:      c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.IncludeLog,
-				CommitMsgTmpl:   c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.CommitMsgTmpl,
-				MonorailProject: c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.BugProject,
-			},
 			GitCheckoutConfig: git_common.GitCheckoutConfig{
 				Branch:  c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.ParentBranch,
 				RepoURL: c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.ParentRepo,
@@ -108,9 +100,9 @@
 	}
 
 	// Find the path to the child repo.
-	childPath := parentCfg.ChildPath
+	childPath := c.ChildPath
 	if c.ChildSubdir != "" {
-		childPath = filepath.Join(c.ChildSubdir, parentCfg.ChildPath)
+		childPath = filepath.Join(c.ChildSubdir, c.ChildPath)
 	}
 	childFullPath := filepath.Join(workdir, childPath)
 	childCheckout := &git.Checkout{GitDir: git.GitDir(childFullPath)}
diff --git a/autoroll/go/repo_manager/deps_repo_manager_test.go b/autoroll/go/repo_manager/deps_repo_manager_test.go
index 9511033..74be892 100644
--- a/autoroll/go/repo_manager/deps_repo_manager_test.go
+++ b/autoroll/go/repo_manager/deps_repo_manager_test.go
@@ -14,13 +14,10 @@
 	"github.com/stretchr/testify/require"
 	"go.skia.org/infra/autoroll/go/codereview"
 	"go.skia.org/infra/autoroll/go/repo_manager/parent"
-	"go.skia.org/infra/autoroll/go/revision"
 	"go.skia.org/infra/go/exec"
 	"go.skia.org/infra/go/gerrit"
 	"go.skia.org/infra/go/git"
 	git_testutils "go.skia.org/infra/go/git/testutils"
-	"go.skia.org/infra/go/gitiles"
-	"go.skia.org/infra/go/issues"
 	"go.skia.org/infra/go/mockhttpclient"
 	"go.skia.org/infra/go/recipe_cfg"
 	"go.skia.org/infra/go/skerr"
@@ -36,6 +33,10 @@
 	mockServer      = "https://skia-review.googlesource.com"
 	mockUser        = "user@chromium.org"
 	numChildCommits = 10
+	fakeCommitMsg   = `Roll fake-dep oldrev..newrev
+
+blah blah blah
+`
 )
 
 var (
@@ -221,7 +222,7 @@
 	mockGerritGetAndPublishChange(t, urlmock, cfg)
 
 	// Create a roll, assert that it's at tip of tree.
-	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.Equal(t, int64(123), issue)
 }
@@ -250,40 +251,11 @@
 	mockGerritGetAndPublishChange(t, urlmock, cfg)
 
 	// Create a roll, assert that we ran the PreUploadSteps.
-	_, err = rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	_, err = rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.True(t, ran)
 }
 
-// Verify that we respect the includeLog parameter.
-func TestDEPSRepoManagerIncludeLog(t *testing.T) {
-	unittest.LargeTest(t)
-
-	test := func(includeLog bool) {
-		cfg := depsCfg(t)
-		cfg.IncludeLog = includeLog
-		ctx, rm, _, _, _, _, _, lastUpload, urlmock, cleanup := setupDEPSRepoManager(t, cfg)
-		defer cleanup()
-
-		lastRollRev, tipRev, notRolledRevs, err := rm.Update(ctx)
-		require.NoError(t, err)
-
-		// Mock the request to load the change.
-		mockGerritGetAndPublishChange(t, urlmock, cfg)
-
-		// Create a roll.
-		_, err = rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
-		require.NoError(t, err)
-
-		// Ensure that we included the log, or not, as appropriate.
-		require.NoError(t, err)
-		require.Equal(t, includeLog, strings.Contains(lastUpload.Body, "git log"))
-	}
-
-	test(true)
-	test(false)
-}
-
 // Verify that we properly utilize a gclient spec.
 func TestDEPSRepoManagerGClientSpec(t *testing.T) {
 	unittest.LargeTest(t)
@@ -318,7 +290,7 @@
 	mockGerritGetAndPublishChange(t, urlmock, cfg)
 
 	// Create a roll.
-	_, err = rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	_, err = rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.NoError(t, err)
 
 	// Ensure that we pass the spec into "gclient config".
@@ -335,77 +307,6 @@
 	require.True(t, found)
 }
 
-// Verify that we include the correct bug lings.
-func TestDEPSRepoManagerBugs(t *testing.T) {
-	unittest.LargeTest(t)
-
-	project := "skiatestproject"
-
-	test := func(bugLine, expect string) {
-		// Setup.
-		cfg := depsCfg(t)
-		cfg.IncludeBugs = true
-		cfg.BugProject = project
-		ctx, rm, _, childRepo, _, parentRepo, _, lastUpload, urlmock, cleanup := setupDEPSRepoManager(t, cfg)
-		defer cleanup()
-
-		// Initial update.
-		_, _, _, err := rm.Update(ctx)
-		require.NoError(t, err)
-
-		// Insert a fake entry into the repo mapping.
-		issues.REPO_PROJECT_MAPPING[parentRepo.RepoUrl()] = project
-
-		// Make a commit with the bug entry.
-		childRepo.AddGen(ctx, "myfile")
-		hash := childRepo.CommitMsg(ctx, fmt.Sprintf(`Some dummy commit
-
-%s
-`, bugLine))
-		details, err := git.GitDir(childRepo.Dir()).Details(ctx, hash)
-		require.NoError(t, err)
-		rev := revision.FromLongCommit(fmt.Sprintf(gitiles.CommitURL, cfg.ChildRepo, "%s"), details)
-		// Update.
-		lastRollRev, tipRev, notRolledRevs, err := rm.Update(ctx)
-		require.NoError(t, err)
-		require.Equal(t, hash, tipRev.Id)
-
-		// Mock the request to load the change.
-		mockGerritGetAndPublishChange(t, urlmock, cfg)
-
-		// Create a roll.
-		_, err = rm.CreateNewRoll(ctx, lastRollRev, rev, notRolledRevs, emails, cqExtraTrybots, false)
-		require.NoError(t, err)
-
-		// Verify that we passed the correct --bug argument to roll-dep.
-		found := false
-		for _, line := range strings.Split(lastUpload.Body, "\n") {
-			if strings.HasPrefix(line, "BUG=") {
-				found = true
-				require.Equal(t, expect, line[4:])
-			} else if strings.HasPrefix(line, "Bug: ") {
-				found = true
-				require.Equal(t, expect, line[5:])
-			}
-		}
-		if expect == "" {
-			require.False(t, found)
-		} else {
-			require.True(t, found)
-		}
-	}
-
-	// Test cases.
-	test("", "None")
-	test("BUG=skiatestproject:23", "skiatestproject:23")
-	test("BUG=skiatestproject:18,skiatestproject:58", "skiatestproject:18,skiatestproject:58")
-	// No prefix defaults to "chromium", which we don't include for rolls into "skiatestproject".
-	test("BUG=skiatestproject:18,58", "skiatestproject:18")
-	test("BUG=456", "None")
-	test("BUG=skia:123,chromium:4532,skiatestproject:21", "skiatestproject:21")
-	test("Bug: skiatestproject:33", "skiatestproject:33")
-}
-
 func TestDEPSRepoManagerConfigValidation(t *testing.T) {
 	unittest.SmallTest(t)
 
diff --git a/autoroll/go/repo_manager/freetype_repo_manager_test.go b/autoroll/go/repo_manager/freetype_repo_manager_test.go
index 8f7e692..0f02637 100644
--- a/autoroll/go/repo_manager/freetype_repo_manager_test.go
+++ b/autoroll/go/repo_manager/freetype_repo_manager_test.go
@@ -190,44 +190,7 @@
 		// actually creates a checkout and uses that.
 	}
 
-	// Mock the initial change creation.
-	logStr := ""
-	childGitRepo := git.GitDir(childRepo.Dir())
-	for _, c := range notRolledRevs {
-		details, err := childGitRepo.Details(ctx, c.Id)
-		require.NoError(t, err)
-		ts := details.Timestamp.Format("2006-01-02")
-		author := details.Author
-		authorSplit := strings.Split(details.Author, "(")
-		if len(authorSplit) > 1 {
-			author = strings.TrimRight(strings.TrimSpace(authorSplit[1]), ")")
-		}
-		logStr += fmt.Sprintf("%s %s %s\n", ts, author, details.Subject)
-	}
-	commitMsg := fmt.Sprintf(`Roll %s %s..%s (%d commits)
-
-%s/+log/%s..%s
-
-git log %s..%s --date=short --first-parent --format='%%ad %%ae %%s'
-%s
-Created with:
-  gclient setdep -r %s@%s
-
-If this roll has caused a breakage, revert this CL and stop the roller
-using the controls here:
-fake.server.com
-Please CC me@google.com on the revert to ensure that a human
-is aware of the problem.
-
-To report a problem with the AutoRoller itself, please file a bug:
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
-
-Documentation for the AutoRoller is here:
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
-
-Bug: None
-Tbr: me@google.com`, ftChildPath, lastRollRev.Id[:12], tipRev.Id[:12], len(notRolledRevs), childRepo.RepoUrl(), lastRollRev.Id[:12], tipRev.Id[:12], lastRollRev.Id[:12], tipRev.Id[:12], logStr, ftChildPath, tipRev.Id[:12])
-	subject := strings.Split(commitMsg, "\n")[0]
+	subject := strings.Split(fakeCommitMsg, "\n")[0]
 	reqBody := []byte(fmt.Sprintf(`{"project":"%s","subject":"%s","branch":"%s","topic":"","status":"NEW","base_commit":"%s"}`, "fake-gerrit-project", subject, "master", parentMaster))
 	ci := gerrit.ChangeInfo{
 		ChangeId: "123",
@@ -247,7 +210,7 @@
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/", mockhttpclient.MockPostDialogueWithResponseCode("application/json", reqBody, respBody, 201))
 
 	// Mock the edit of the change to update the commit message.
-	reqBody = []byte(fmt.Sprintf(`{"message":"%s"}`, strings.Replace(commitMsg, "\n", "\\n", -1)))
+	reqBody = []byte(fmt.Sprintf(`{"message":"%s"}`, strings.Replace(fakeCommitMsg, "\n", "\\n", -1)))
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/123/edit:message", mockhttpclient.MockPutDialogue("application/json", reqBody, []byte("")))
 
 	// Mock the request to modify the DEPS file.
@@ -285,7 +248,7 @@
 	reqBody = []byte(`{"labels":{"Code-Review":1,"Commit-Queue":2},"message":"","reviewers":[{"reviewer":"me@google.com"}]}`)
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/123/revisions/ps1/review", mockhttpclient.MockPostDialogue("application/json", reqBody, []byte("")))
 
-	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, []string{"me@google.com"}, "", false)
+	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, []string{"me@google.com"}, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.NotEqual(t, 0, issue)
 }
diff --git a/autoroll/go/repo_manager/fuchsia_sdk_android_repo_manager.go b/autoroll/go/repo_manager/fuchsia_sdk_android_repo_manager.go
index d9f52f1..828d667 100644
--- a/autoroll/go/repo_manager/fuchsia_sdk_android_repo_manager.go
+++ b/autoroll/go/repo_manager/fuchsia_sdk_android_repo_manager.go
@@ -21,9 +21,8 @@
 )
 
 const (
-	FuchsiaSDKAndroidVersionFile   = "sdk_id"
-	FuchsiaSDKAndroidGenScript     = "scripts/update_fuchsia_sdk.py"
-	TmplCommitMsgFuchsiaSDKAndroid = TmplCommitMsgFuchsiaSDK + "Exempt-From-Owner-Approval: The autoroll bot does not require owner approval."
+	FuchsiaSDKAndroidVersionFile = "sdk_id"
+	FuchsiaSDKAndroidGenScript   = "scripts/update_fuchsia_sdk.py"
 )
 
 // FuchsiaSDKAndroidRepoManagerConfig provides configuration for
@@ -72,18 +71,7 @@
 	}
 
 	// Create the parent.
-	if c.CommitMsgTmpl == "" {
-		c.CommitMsgTmpl = TmplCommitMsgFuchsiaSDKAndroid
-	}
 	parentCfg := parent.GitCheckoutConfig{
-		BaseConfig: parent.BaseConfig{
-			ChildPath:       c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.ChildPath,
-			ChildRepo:       "FuchsiaSDK",
-			IncludeBugs:     c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.IncludeBugs,
-			IncludeLog:      c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.IncludeLog,
-			CommitMsgTmpl:   c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.CommitMsgTmpl,
-			MonorailProject: c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.BugProject,
-		},
 		GitCheckoutConfig: git_common.GitCheckoutConfig{
 			Branch:  c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.ParentBranch,
 			RepoURL: c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.ParentRepo,
diff --git a/autoroll/go/repo_manager/fuchsia_sdk_android_repo_manager_test.go b/autoroll/go/repo_manager/fuchsia_sdk_android_repo_manager_test.go
index a38f61e..0b225d3 100644
--- a/autoroll/go/repo_manager/fuchsia_sdk_android_repo_manager_test.go
+++ b/autoroll/go/repo_manager/fuchsia_sdk_android_repo_manager_test.go
@@ -188,7 +188,7 @@
 	reqBody := []byte(`{"labels":{"Autosubmit":1,"Code-Review":2,"Presubmit-Ready":1},"message":"","reviewers":[{"reviewer":"reviewer@chromium.org"}]}`)
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/123/revisions/ps1/review", mockhttpclient.MockPostDialogue("application/json", reqBody, []byte("")))
 
-	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.Equal(t, ci.Issue, issue)
 }
diff --git a/autoroll/go/repo_manager/fuchsia_sdk_repo_manager.go b/autoroll/go/repo_manager/fuchsia_sdk_repo_manager.go
index 966c011..d1df847 100644
--- a/autoroll/go/repo_manager/fuchsia_sdk_repo_manager.go
+++ b/autoroll/go/repo_manager/fuchsia_sdk_repo_manager.go
@@ -19,24 +19,6 @@
 const (
 	FuchsiaSDKVersionFilePathLinux = "build/fuchsia/linux.sdk.sha1"
 	FuchsiaSDKVersionFilePathMac   = "build/fuchsia/mac.sdk.sha1"
-
-	TmplCommitMsgFuchsiaSDK = `Roll Fuchsia SDK from {{.RollingFrom.String}} to {{.RollingTo.String}}
-
-If this roll has caused a breakage, revert this CL and stop the roller
-using the controls here:
-{{.ServerURL}}
-Please CC {{stringsJoin .Reviewers ","}} on the revert to ensure that a human
-is aware of the problem.
-
-To report a problem with the AutoRoller itself, please file a bug:
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
-
-Documentation for the AutoRoller is here:
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
-
-{{if .CqExtraTrybots}}Cq-Include-Trybots: {{.CqExtraTrybots}}
-{{end}}Tbr: {{stringsJoin .Reviewers ","}}
-`
 )
 
 // FuchsiaSDKRepoManagerConfig provides configuration for the Fuchia SDK
@@ -72,19 +54,7 @@
 			},
 		}
 	}
-	commitMsgTmpl := TmplCommitMsgFuchsiaSDK
-	if c.CommitMsgTmpl != "" {
-		commitMsgTmpl = c.CommitMsgTmpl
-	}
 	parentCfg := parent.GitilesConfig{
-		BaseConfig: parent.BaseConfig{
-			ChildPath:       c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.ChildPath,
-			ChildRepo:       "FuchsiaSDK",
-			IncludeBugs:     c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.IncludeBugs,
-			IncludeLog:      c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.IncludeLog,
-			CommitMsgTmpl:   commitMsgTmpl,
-			MonorailProject: c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.BugProject,
-		},
 		DependencyConfig: version_file_common.DependencyConfig{
 			VersionFileConfig: version_file_common.VersionFileConfig{
 				ID:   "FuchsiaSDK",
diff --git a/autoroll/go/repo_manager/fuchsia_sdk_repo_manager_test.go b/autoroll/go/repo_manager/fuchsia_sdk_repo_manager_test.go
index 15c090c..c2b9d0b 100644
--- a/autoroll/go/repo_manager/fuchsia_sdk_repo_manager_test.go
+++ b/autoroll/go/repo_manager/fuchsia_sdk_repo_manager_test.go
@@ -153,25 +153,7 @@
 	mockParent.MockReadFile(ctx, FuchsiaSDKVersionFilePathMac, parentMaster)
 
 	// Mock the initial change creation.
-	from := lastRollRev
-	to := tipRev
-	commitMsg := fmt.Sprintf(`Roll Fuchsia SDK from %s to %s
-
-If this roll has caused a breakage, revert this CL and stop the roller
-using the controls here:
-fake.server.com
-Please CC reviewer@chromium.org on the revert to ensure that a human
-is aware of the problem.
-
-To report a problem with the AutoRoller itself, please file a bug:
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
-
-Documentation for the AutoRoller is here:
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
-
-Tbr: reviewer@chromium.org
-`, from, to)
-	subject := strings.Split(commitMsg, "\n")[0]
+	subject := strings.Split(fakeCommitMsg, "\n")[0]
 	reqBody := []byte(fmt.Sprintf(`{"project":"%s","subject":"%s","branch":"%s","topic":"","status":"NEW","base_commit":"%s"}`, "fake-gerrit-project", subject, "master", parentMaster))
 	ci := gerrit.ChangeInfo{
 		ChangeId: "123",
@@ -190,7 +172,7 @@
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/", mockhttpclient.MockPostDialogueWithResponseCode("application/json", reqBody, respBody, 201))
 
 	// Mock the edit of the change to update the commit message.
-	reqBody = []byte(fmt.Sprintf(`{"message":"%s"}`, strings.Replace(commitMsg, "\n", "\\n", -1)))
+	reqBody = []byte(fmt.Sprintf(`{"message":"%s"}`, strings.Replace(fakeCommitMsg, "\n", "\\n", -1)))
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/123/edit:message", mockhttpclient.MockPutDialogue("application/json", reqBody, []byte("")))
 
 	// Mock the request to modify the version files.
@@ -215,7 +197,7 @@
 	reqBody = []byte(`{"labels":{"Code-Review":1,"Commit-Queue":2},"message":"","reviewers":[{"reviewer":"reviewer@chromium.org"}]}`)
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/123/revisions/ps1/review", mockhttpclient.MockPostDialogue("application/json", reqBody, []byte("")))
 
-	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.Equal(t, ci.Issue, issue)
 }
diff --git a/autoroll/go/repo_manager/github_cipd_deps_repo_manager.go b/autoroll/go/repo_manager/github_cipd_deps_repo_manager.go
index 51e4d03..4497123 100644
--- a/autoroll/go/repo_manager/github_cipd_deps_repo_manager.go
+++ b/autoroll/go/repo_manager/github_cipd_deps_repo_manager.go
@@ -16,23 +16,6 @@
 	"go.skia.org/infra/go/skerr"
 )
 
-const (
-	TMPL_COMMIT_MSG_GITHUB_CIPD_DEPS = `Roll {{.ChildPath}} from {{.RollingFrom.String}} to {{.RollingTo.String}}
-
-If this roll has caused a breakage, revert this CL and stop the roller
-using the controls here:
-{{.ServerURL}}
-Please CC {{stringsJoin .Reviewers ","}} on the revert to ensure that a human
-is aware of the problem.
-
-To report a problem with the AutoRoller itself, please file a bug:
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
-
-Documentation for the AutoRoller is here:
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
-`
-)
-
 // GithubCipdDEPSRepoManagerConfig provides configuration for the Github RepoManager.
 type GithubCipdDEPSRepoManagerConfig struct {
 	GithubDEPSRepoManagerConfig
@@ -60,14 +43,6 @@
 func (c GithubCipdDEPSRepoManagerConfig) splitParentChild() (parent.DEPSLocalConfig, child.CIPDConfig, error) {
 	parentCfg := parent.DEPSLocalConfig{
 		GitCheckoutConfig: parent.GitCheckoutConfig{
-			BaseConfig: parent.BaseConfig{
-				ChildPath:       c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.ChildPath,
-				ChildRepo:       c.CipdAssetName,
-				IncludeBugs:     c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.IncludeBugs,
-				IncludeLog:      c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.IncludeLog,
-				CommitMsgTmpl:   c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.CommitMsgTmpl,
-				MonorailProject: c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.BugProject,
-			},
 			GitCheckoutConfig: git_common.GitCheckoutConfig{
 				Branch:  c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.ParentBranch,
 				RepoURL: c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.ParentRepo,
@@ -107,9 +82,6 @@
 	if err != nil {
 		return nil, skerr.Wrap(err)
 	}
-	if parentCfg.CommitMsgTmpl == "" {
-		parentCfg.CommitMsgTmpl = TMPL_COMMIT_MSG_GITHUB_CIPD_DEPS
-	}
 	uploadRoll := parent.GitCheckoutUploadGithubRollFunc(githubClient, cr.UserName(), rollerName)
 	parentRM, err := parent.NewDEPSLocal(ctx, parentCfg, reg, httpClient, serverURL, workdir, cr.UserName(), cr.UserEmail(), recipeCfgFile, uploadRoll)
 	if err != nil {
diff --git a/autoroll/go/repo_manager/github_cipd_deps_repo_manager_test.go b/autoroll/go/repo_manager/github_cipd_deps_repo_manager_test.go
index 9f7116b..9493a21 100644
--- a/autoroll/go/repo_manager/github_cipd_deps_repo_manager_test.go
+++ b/autoroll/go/repo_manager/github_cipd_deps_repo_manager_test.go
@@ -204,7 +204,7 @@
 
 	// Create a roll.
 	mockGithubRequests(t, urlMock)
-	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.Equal(t, issueNum, issue)
 }
@@ -230,7 +230,7 @@
 
 	// Create a roll, assert that we ran the PreUploadSteps.
 	mockGithubRequests(t, urlMock)
-	_, createErr := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	_, createErr := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.NoError(t, createErr)
 	require.True(t, ran)
 }
@@ -256,7 +256,7 @@
 
 	// Create a roll, assert that we ran the PreUploadSteps.
 	mockGithubRequests(t, urlMock)
-	_, createErr := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	_, createErr := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.Error(t, expectedErr, createErr)
 	require.True(t, ran)
 }
diff --git a/autoroll/go/repo_manager/github_deps_repo_manager.go b/autoroll/go/repo_manager/github_deps_repo_manager.go
index d3ba9fc..723a380 100644
--- a/autoroll/go/repo_manager/github_deps_repo_manager.go
+++ b/autoroll/go/repo_manager/github_deps_repo_manager.go
@@ -58,14 +58,6 @@
 	}
 	parentCfg := parent.DEPSLocalConfig{
 		GitCheckoutConfig: parent.GitCheckoutConfig{
-			BaseConfig: parent.BaseConfig{
-				ChildPath:       c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.ChildPath,
-				ChildRepo:       c.ChildRepo,
-				IncludeBugs:     c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.IncludeBugs,
-				IncludeLog:      c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.IncludeLog,
-				CommitMsgTmpl:   c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.CommitMsgTmpl,
-				MonorailProject: c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.BugProject,
-			},
 			GitCheckoutConfig: git_common.GitCheckoutConfig{
 				Branch:  c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.ParentBranch,
 				RepoURL: c.DepotToolsRepoManagerConfig.CommonRepoManagerConfig.ParentRepo,
@@ -120,7 +112,7 @@
 	}
 
 	// Find the path to the child repo.
-	childPath := filepath.Join(workdir, parentCfg.ChildPath)
+	childPath := filepath.Join(workdir, c.ChildPath)
 	childCheckout := &git.Checkout{GitDir: git.GitDir(childPath)}
 	childRM, err := child.NewGitCheckout(ctx, childCfg, reg, workdir, cr.UserName(), cr.UserEmail(), childCheckout)
 	if err != nil {
diff --git a/autoroll/go/repo_manager/github_deps_repo_manager_test.go b/autoroll/go/repo_manager/github_deps_repo_manager_test.go
index ab1e5ab..5d3b85f 100644
--- a/autoroll/go/repo_manager/github_deps_repo_manager_test.go
+++ b/autoroll/go/repo_manager/github_deps_repo_manager_test.go
@@ -209,7 +209,7 @@
 
 	// Create a roll, assert that it's at tip of tree.
 	mockGithubDEPSRequests(t, urlMock)
-	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.Equal(t, issueNum, issue)
 }
@@ -238,7 +238,7 @@
 
 	// Create a roll, assert that it's at tip of tree.
 	mockGithubDEPSRequests(t, urlMock)
-	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.Equal(t, issueNum, issue)
 }
@@ -262,7 +262,7 @@
 
 	// Create a roll, assert that we ran the PreUploadSteps.
 	mockGithubDEPSRequests(t, urlMock)
-	_, createErr := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	_, createErr := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.NoError(t, createErr)
 	require.True(t, ran)
 }
@@ -288,7 +288,7 @@
 
 	// Create a roll, assert that we ran the PreUploadSteps.
 	mockGithubDEPSRequests(t, urlMock)
-	_, createErr := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	_, createErr := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.Error(t, expectedErr, createErr)
 	require.True(t, ran)
 }
diff --git a/autoroll/go/repo_manager/github_repo_manager.go b/autoroll/go/repo_manager/github_repo_manager.go
index 6a938d7..74df322 100644
--- a/autoroll/go/repo_manager/github_repo_manager.go
+++ b/autoroll/go/repo_manager/github_repo_manager.go
@@ -57,14 +57,6 @@
 	parentCfg := parent.GitCheckoutGithubFileConfig{
 		GitCheckoutGithubConfig: parent.GitCheckoutGithubConfig{
 			GitCheckoutConfig: parent.GitCheckoutConfig{
-				BaseConfig: parent.BaseConfig{
-					ChildPath:       c.CommonRepoManagerConfig.ChildPath,
-					ChildRepo:       c.ChildRepoURL,
-					IncludeBugs:     c.CommonRepoManagerConfig.IncludeBugs,
-					IncludeLog:      c.CommonRepoManagerConfig.IncludeLog,
-					CommitMsgTmpl:   c.CommonRepoManagerConfig.CommitMsgTmpl,
-					MonorailProject: c.CommonRepoManagerConfig.BugProject,
-				},
 				GitCheckoutConfig: git_common.GitCheckoutConfig{
 					Branch:      c.ParentBranch,
 					RepoURL:     c.ParentRepo,
diff --git a/autoroll/go/repo_manager/github_repo_manager_test.go b/autoroll/go/repo_manager/github_repo_manager_test.go
index 087a71a..8a183e2 100644
--- a/autoroll/go/repo_manager/github_repo_manager_test.go
+++ b/autoroll/go/repo_manager/github_repo_manager_test.go
@@ -209,7 +209,7 @@
 
 	// Create a roll.
 	mockGithubRequests(t, urlMock)
-	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.Equal(t, issueNum, issue)
 }
@@ -234,7 +234,7 @@
 
 	// Create a roll, assert that we ran the PreUploadSteps.
 	mockGithubRequests(t, urlMock)
-	_, createErr := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	_, createErr := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.NoError(t, createErr)
 	require.True(t, ran)
 }
@@ -261,7 +261,7 @@
 
 	// Create a roll, assert that we ran the PreUploadSteps.
 	mockGithubRequests(t, urlMock)
-	_, createErr := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	_, createErr := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.Error(t, expectedErr, createErr)
 	require.True(t, ran)
 }
diff --git a/autoroll/go/repo_manager/gitiles_cipd_deps_repo_manager.go b/autoroll/go/repo_manager/gitiles_cipd_deps_repo_manager.go
index 946dabb..1887333 100644
--- a/autoroll/go/repo_manager/gitiles_cipd_deps_repo_manager.go
+++ b/autoroll/go/repo_manager/gitiles_cipd_deps_repo_manager.go
@@ -49,14 +49,6 @@
 // and child. We shouldn't need most of the New.*RepoManager functions.
 func (c GitilesCIPDDEPSRepoManagerConfig) splitParentChild() (parent.GitilesConfig, child.CIPDConfig, error) {
 	parentCfg := parent.GitilesConfig{
-		BaseConfig: parent.BaseConfig{
-			ChildPath:       c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.ChildPath,
-			ChildRepo:       c.CipdAssetName,
-			IncludeBugs:     c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.IncludeBugs,
-			IncludeLog:      c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.IncludeLog,
-			CommitMsgTmpl:   c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.CommitMsgTmpl,
-			MonorailProject: c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.BugProject,
-		},
 		DependencyConfig: version_file_common.DependencyConfig{
 			VersionFileConfig: version_file_common.VersionFileConfig{
 				ID:   c.CipdAssetName,
diff --git a/autoroll/go/repo_manager/no_checkout_deps_repo_manager.go b/autoroll/go/repo_manager/no_checkout_deps_repo_manager.go
index 9fb7e67..dd97f8b 100644
--- a/autoroll/go/repo_manager/no_checkout_deps_repo_manager.go
+++ b/autoroll/go/repo_manager/no_checkout_deps_repo_manager.go
@@ -82,14 +82,6 @@
 		}
 	}
 	parentCfg := parent.GitilesConfig{
-		BaseConfig: parent.BaseConfig{
-			ChildPath:       c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.ChildPath,
-			ChildRepo:       c.ChildRepo,
-			IncludeBugs:     c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.IncludeBugs,
-			IncludeLog:      c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.IncludeLog,
-			CommitMsgTmpl:   c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.CommitMsgTmpl,
-			MonorailProject: c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.BugProject,
-		},
 		DependencyConfig: version_file_common.DependencyConfig{
 			VersionFileConfig: version_file_common.VersionFileConfig{
 				ID:   c.ChildRepo,
diff --git a/autoroll/go/repo_manager/no_checkout_deps_repo_manager_test.go b/autoroll/go/repo_manager/no_checkout_deps_repo_manager_test.go
index 9f2834b..1a3530b 100644
--- a/autoroll/go/repo_manager/no_checkout_deps_repo_manager_test.go
+++ b/autoroll/go/repo_manager/no_checkout_deps_repo_manager_test.go
@@ -176,43 +176,7 @@
 	mockParent.MockReadFile(ctx, "DEPS", parentMaster)
 
 	// Mock the initial change creation.
-	logStr := ""
-	childGitRepo := git.GitDir(childRepo.Dir())
-	for _, c := range notRolledRevs {
-		details, err := childGitRepo.Details(ctx, c.Id)
-		require.NoError(t, err)
-		ts := details.Timestamp.Format("2006-01-02")
-		author := details.Author
-		authorSplit := strings.Split(details.Author, "(")
-		if len(authorSplit) > 1 {
-			author = strings.TrimRight(strings.TrimSpace(authorSplit[1]), ")")
-		}
-		logStr += fmt.Sprintf("%s %s %s\n", ts, author, details.Subject)
-	}
-	commitMsg := fmt.Sprintf(`Roll %s %s..%s (%d commits)
-
-%s/+log/%s..%s
-
-git log %s..%s --date=short --first-parent --format='%%ad %%ae %%s'
-%s
-Created with:
-  gclient setdep -r %s@%s
-
-If this roll has caused a breakage, revert this CL and stop the roller
-using the controls here:
-fake.server.com
-Please CC me@google.com on the revert to ensure that a human
-is aware of the problem.
-
-To report a problem with the AutoRoller itself, please file a bug:
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
-
-Documentation for the AutoRoller is here:
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
-
-Bug: None
-Tbr: me@google.com`, childPath, lastRollRev.Id[:12], tipRev.Id[:12], len(notRolledRevs), childRepo.RepoUrl(), lastRollRev.Id[:12], tipRev.Id[:12], lastRollRev.Id[:12], tipRev.Id[:12], logStr, childPath, tipRev.Id[:12])
-	subject := strings.Split(commitMsg, "\n")[0]
+	subject := strings.Split(fakeCommitMsg, "\n")[0]
 	reqBody := []byte(fmt.Sprintf(`{"project":"%s","subject":"%s","branch":"%s","topic":"","status":"NEW","base_commit":"%s"}`, "fake-gerrit-project", subject, "master", parentMaster))
 	ci := gerrit.ChangeInfo{
 		ChangeId: "123",
@@ -232,7 +196,7 @@
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/", mockhttpclient.MockPostDialogueWithResponseCode("application/json", reqBody, respBody, 201))
 
 	// Mock the edit of the change to update the commit message.
-	reqBody = []byte(fmt.Sprintf(`{"message":"%s"}`, strings.Replace(commitMsg, "\n", "\\n", -1)))
+	reqBody = []byte(fmt.Sprintf(`{"message":"%s"}`, strings.Replace(fakeCommitMsg, "\n", "\\n", -1)))
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/123/edit:message", mockhttpclient.MockPutDialogue("application/json", reqBody, []byte("")))
 
 	// Mock the request to modify the DEPS file.
@@ -269,7 +233,7 @@
 		urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/123/submit", mockhttpclient.MockPostDialogue("application/json", []byte("{}"), []byte("")))
 	}
 
-	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, []string{"me@google.com"}, "", false)
+	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, []string{"me@google.com"}, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.NotEqual(t, 0, issue)
 }
@@ -338,33 +302,7 @@
 		}
 		logStr += fmt.Sprintf("%s %s %s\n", ts, author, details.Subject)
 	}
-	commitMsg := fmt.Sprintf(`Roll %s %s..%s (%d commits)
-
-%s/+log/%s..%s
-
-git log %s..%s --date=short --first-parent --format='%%ad %%ae %%s'
-%s
-Also rolling transitive DEPS:
-  https://grandchild-in-parent abc1230000ab..def4560000de
-
-Created with:
-  gclient setdep -r %s@%s
-
-If this roll has caused a breakage, revert this CL and stop the roller
-using the controls here:
-fake.server.com
-Please CC me@google.com on the revert to ensure that a human
-is aware of the problem.
-
-To report a problem with the AutoRoller itself, please file a bug:
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
-
-Documentation for the AutoRoller is here:
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
-
-Bug: None
-Tbr: me@google.com`, childPath, lastRollRev.Id[:12], tipRev.Id[:12], len(notRolledRevs), childRepo.RepoUrl(), lastRollRev.Id[:12], tipRev.Id[:12], lastRollRev.Id[:12], tipRev.Id[:12], logStr, childPath, tipRev.Id[:12])
-	subject := strings.Split(commitMsg, "\n")[0]
+	subject := strings.Split(fakeCommitMsg, "\n")[0]
 	reqBody := []byte(fmt.Sprintf(`{"project":"%s","subject":"%s","branch":"%s","topic":"","status":"NEW","base_commit":"%s"}`, "fake-gerrit-project", subject, "master", parentMaster))
 	ci := gerrit.ChangeInfo{
 		ChangeId: "123",
@@ -384,7 +322,7 @@
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/", mockhttpclient.MockPostDialogueWithResponseCode("application/json", reqBody, respBody, 201))
 
 	// Mock the edit of the change to update the commit message.
-	reqBody = []byte(fmt.Sprintf(`{"message":"%s"}`, strings.Replace(commitMsg, "\n", "\\n", -1)))
+	reqBody = []byte(fmt.Sprintf(`{"message":"%s"}`, strings.Replace(fakeCommitMsg, "\n", "\\n", -1)))
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/123/edit:message", mockhttpclient.MockPutDialogue("application/json", reqBody, []byte("")))
 
 	// Mock the request to modify the DEPS file.
@@ -413,7 +351,7 @@
 	reqBody = []byte(`{"labels":{"Code-Review":1,"Commit-Queue":2},"message":"","reviewers":[{"reviewer":"me@google.com"}]}`)
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/123/revisions/ps1/review", mockhttpclient.MockPostDialogue("application/json", reqBody, []byte("")))
 
-	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, []string{"me@google.com"}, "", false)
+	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, []string{"me@google.com"}, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.NotEqual(t, 0, issue)
 }
diff --git a/autoroll/go/repo_manager/parent/commit_msg.go b/autoroll/go/repo_manager/parent/commit_msg.go
deleted file mode 100644
index fe8dc94..0000000
--- a/autoroll/go/repo_manager/parent/commit_msg.go
+++ /dev/null
@@ -1,124 +0,0 @@
-package parent
-
-import (
-	"bytes"
-	"strings"
-	"text/template"
-
-	"go.skia.org/infra/autoroll/go/repo_manager/common/version_file_common"
-	"go.skia.org/infra/autoroll/go/revision"
-	"go.skia.org/infra/go/skerr"
-)
-
-const (
-	TMPL_COMMIT_MSG_DEFAULT = `Roll {{.ChildPath}} {{.RollingFrom.String}}..{{.RollingTo.String}} ({{len .Revisions}} commits)
-
-{{.ChildRepo}}/+log/{{.RollingFrom.String}}..{{.RollingTo.String}}
-
-{{if .IncludeLog}}git log {{.RollingFrom}}..{{.RollingTo}} --date=short --first-parent --format='%ad %ae %s'
-{{range .Revisions}}{{.Timestamp.Format "2006-01-02"}} {{.Author}} {{.Description}}
-{{end}}{{end}}{{if len .TransitiveDeps}}
-Also rolling transitive DEPS:
-{{range .TransitiveDeps}}  {{.Dep}} {{substr .RollingFrom 0 12}}..{{substr .RollingTo 0 12}}
-{{end}}{{end}}
-Created with:
-  gclient setdep -r {{.ChildPath}}@{{.RollingTo}}
-
-If this roll has caused a breakage, revert this CL and stop the roller
-using the controls here:
-{{.ServerURL}}
-Please CC {{stringsJoin .Reviewers ","}} on the revert to ensure that a human
-is aware of the problem.
-
-To report a problem with the AutoRoller itself, please file a bug:
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
-
-Documentation for the AutoRoller is here:
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
-
-{{if .CqExtraTrybots}}Cq-Include-Trybots: {{.CqExtraTrybots}}
-{{end}}Bug: {{if .Bugs}}{{stringsJoin .Bugs ","}}{{else}}None{{end}}
-Tbr: {{stringsJoin .Reviewers ","}}`
-)
-
-// CommitMsgVars contains variables used to fill in a commit message template.
-type CommitMsgVars struct {
-	Bugs           []string
-	ChildPath      string
-	ChildRepo      string
-	CqExtraTrybots string
-	IncludeLog     bool
-	Reviewers      []string
-	Revisions      []*revision.Revision
-	RollingFrom    *revision.Revision
-	RollingTo      *revision.Revision
-	ServerURL      string
-	Tests          []string
-	TransitiveDeps []*version_file_common.TransitiveDepUpdate
-}
-
-// ParseCommitMsgTemplate parses the given commit message template string and
-// returns a Template instance.
-func ParseCommitMsgTemplate(tmpl string) (*template.Template, error) {
-	return template.New("commitMsg").Funcs(template.FuncMap{
-		"stringsJoin": strings.Join,
-		"substr": func(s string, a, b int) string {
-			if a > len(s) {
-				return ""
-			}
-			if b > len(s) {
-				b = len(s)
-			}
-			return s[a:b]
-		},
-	}).Parse(tmpl)
-}
-
-// ValidateCommitMsgTemplate returns an error if the given commit message
-// template cannot be parsed and executed with a typical set of inputs.
-func ValidateCommitMsgTemplate(tmpl string) error {
-	t, err := ParseCommitMsgTemplate(tmpl)
-	if err != nil {
-		return skerr.Wrapf(err, "Failed to parse template")
-	}
-	a := &revision.Revision{
-		Id:      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-		Display: "aaaaaaaaaaaa",
-		Author:  "a@google.com",
-	}
-	b := &revision.Revision{
-		Id:      "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
-		Display: "bbbbbbbbbbbb",
-		Author:  "b@google.com",
-	}
-	c := &revision.Revision{
-		Id:      "cccccccccccccccccccccccccccccccccccccccc",
-		Display: "cccccccccccc",
-		Author:  "c@google.com",
-	}
-	vars := &CommitMsgVars{
-		Bugs:           []string{"skia:1234"},
-		ChildPath:      "path/to/child",
-		ChildRepo:      "https://child-repo.git",
-		CqExtraTrybots: "extra-bot",
-		IncludeLog:     true,
-		Reviewers:      []string{"me@google.com"},
-		Revisions:      []*revision.Revision{b, c},
-		RollingFrom:    a,
-		RollingTo:      c,
-		ServerURL:      "https://fake.server.url",
-		Tests:          []string{"some-test"},
-		TransitiveDeps: []*version_file_common.TransitiveDepUpdate{
-			{
-				Dep:         "path/to/other",
-				RollingFrom: "dddddddddddddddddddddddddddddddddddddddd",
-				RollingTo:   "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
-			},
-		},
-	}
-	var buf bytes.Buffer
-	if err := t.Execute(&buf, vars); err != nil {
-		return err
-	}
-	return nil
-}
diff --git a/autoroll/go/repo_manager/parent/freetype.go b/autoroll/go/repo_manager/parent/freetype.go
index d921f38..a655d6e 100644
--- a/autoroll/go/repo_manager/parent/freetype.go
+++ b/autoroll/go/repo_manager/parent/freetype.go
@@ -14,7 +14,6 @@
 
 	"go.skia.org/infra/autoroll/go/config_vars"
 	"go.skia.org/infra/autoroll/go/repo_manager/common/gitiles_common"
-	"go.skia.org/infra/autoroll/go/repo_manager/common/version_file_common"
 	"go.skia.org/infra/autoroll/go/revision"
 	"go.skia.org/infra/go/git"
 	"go.skia.org/infra/go/skerr"
@@ -41,30 +40,30 @@
 )
 
 func NewFreeTypeParent(ctx context.Context, c GitilesConfig, reg *config_vars.Registry, workdir string, client *http.Client, serverURL string) (*gitilesParent, error) {
-	localChildRepo, err := git.NewRepo(ctx, c.ChildRepo, workdir)
+	localChildRepo, err := git.NewRepo(ctx, c.DependencyConfig.ID, workdir)
 	if err != nil {
 		return nil, err
 	}
 	getChangesHelper := gitilesFileGetChangesForRollFunc(c.DependencyConfig)
-	getChangesForRoll := func(ctx context.Context, parentRepo *gitiles_common.GitilesRepo, baseCommit string, from, to *revision.Revision, rolling []*revision.Revision) (map[string]string, []*version_file_common.TransitiveDepUpdate, error) {
+	getChangesForRoll := func(ctx context.Context, parentRepo *gitiles_common.GitilesRepo, baseCommit string, from, to *revision.Revision, rolling []*revision.Revision) (map[string]string, error) {
 		// Get the DEPS changes via gitilesDEPSGetChangesForRollFunc.
-		changes, transitiveDeps, err := getChangesHelper(ctx, parentRepo, baseCommit, from, to, rolling)
+		changes, err := getChangesHelper(ctx, parentRepo, baseCommit, from, to, rolling)
 		if err != nil {
-			return nil, nil, skerr.Wrap(err)
+			return nil, skerr.Wrap(err)
 		}
 
 		// Update README.chromium.
 		if err := localChildRepo.Update(ctx); err != nil {
-			return nil, nil, skerr.Wrap(err)
+			return nil, skerr.Wrap(err)
 		}
 		ftVersion, err := localChildRepo.Git(ctx, "describe", "--long", to.Id)
 		if err != nil {
-			return nil, nil, skerr.Wrap(err)
+			return nil, skerr.Wrap(err)
 		}
 		ftVersion = strings.TrimSpace(ftVersion)
 		var buf bytes.Buffer
 		if err := parentRepo.ReadFileAtRef(ctx, FtReadmePath, baseCommit, &buf); err != nil {
-			return nil, nil, skerr.Wrap(err)
+			return nil, skerr.Wrap(err)
 		}
 		oldReadmeContents := buf.String()
 		newReadmeContents := FtReadmeVersionRegex.ReplaceAllString(oldReadmeContents, fmt.Sprintf(FtReadmeVersionTmpl, "", ftVersion))
@@ -76,19 +75,19 @@
 		// Merge includes.
 		for _, include := range FtIncludesToMerge {
 			if err := mergeInclude(ctx, include, from.Id, to.Id, baseCommit, changes, parentRepo, localChildRepo); err != nil {
-				return nil, nil, skerr.Wrap(err)
+				return nil, skerr.Wrap(err)
 			}
 		}
 
 		// Check modules.cfg. Give up if it has changed.
 		diff, err := localChildRepo.Git(ctx, "diff", "--name-only", git.LogFromTo(from.Id, to.Id))
 		if err != nil {
-			return nil, nil, err
+			return nil, err
 		}
 		if strings.Contains(diff, "modules.cfg") {
-			return nil, nil, skerr.Fmt("modules.cfg has been modified; cannot roll automatically.")
+			return nil, skerr.Fmt("modules.cfg has been modified; cannot roll automatically.")
 		}
-		return changes, transitiveDeps, nil
+		return changes, nil
 	}
 	return newGitiles(ctx, c, reg, client, serverURL, getChangesForRoll)
 }
diff --git a/autoroll/go/repo_manager/parent/git_checkout.go b/autoroll/go/repo_manager/parent/git_checkout.go
index e3f7f09..bd30b8b 100644
--- a/autoroll/go/repo_manager/parent/git_checkout.go
+++ b/autoroll/go/repo_manager/parent/git_checkout.go
@@ -28,16 +28,12 @@
 // GitCheckoutConfig provides configuration for a Parent which uses a local
 // checkout to create changes.
 type GitCheckoutConfig struct {
-	BaseConfig
 	git_common.GitCheckoutConfig
 	version_file_common.DependencyConfig
 }
 
 // See documentation for util.Validator interface.
 func (c GitCheckoutConfig) Validate() error {
-	if err := c.BaseConfig.Validate(); err != nil {
-		return skerr.Wrap(err)
-	}
 	if err := c.GitCheckoutConfig.Validate(); err != nil {
 		return skerr.Wrap(err)
 	}
@@ -53,7 +49,6 @@
 // GitCheckoutParent is a base for implementations of Parent which use a local
 // Git checkout.
 type GitCheckoutParent struct {
-	*baseParent
 	*git_common.Checkout
 	childID    string
 	createRoll GitCheckoutCreateRollFunc
@@ -75,11 +70,6 @@
 	if err := c.Validate(); err != nil {
 		return nil, skerr.Wrap(err)
 	}
-	// Create a baseParent.
-	base, err := newBaseParent(ctx, c.BaseConfig, serverURL)
-	if err != nil {
-		return nil, skerr.Wrap(err)
-	}
 	// Create the local checkout.
 	deps := make([]*version_file_common.VersionFileConfig, 0, len(c.DependencyConfig.TransitiveDeps)+1)
 	deps = append(deps, &c.DependencyConfig.VersionFileConfig)
@@ -92,7 +82,6 @@
 		return nil, skerr.Wrap(err)
 	}
 	return &GitCheckoutParent{
-		baseParent: base,
 		Checkout:   checkout,
 		childID:    c.DependencyConfig.ID,
 		createRoll: createRoll,
@@ -114,7 +103,7 @@
 }
 
 // See documentation for Parent interface.
-func (p *GitCheckoutParent) CreateNewRoll(ctx context.Context, from, to *revision.Revision, rolling []*revision.Revision, emails []string, cqExtraTrybots string, dryRun bool) (int64, error) {
+func (p *GitCheckoutParent) CreateNewRoll(ctx context.Context, from, to *revision.Revision, rolling []*revision.Revision, emails []string, dryRun bool, commitMsg string) (int64, error) {
 	// Create the roll branch.
 	_, upstreamBranch, err := p.Checkout.Update(ctx)
 	if err != nil {
@@ -128,13 +117,6 @@
 		return 0, skerr.Wrap(err)
 	}
 
-	// Generate the commit message.
-	// TODO(borenet): This should probably move into parentChildRepoManager.
-	commitMsg, err := p.buildCommitMsg(from, to, rolling, emails, cqExtraTrybots, nil)
-	if err != nil {
-		return 0, skerr.Wrap(err)
-	}
-
 	// Run the provided function to create the changes for the roll.
 	hash, err := p.createRoll(ctx, p.Checkout.Checkout, from, to, rolling, commitMsg)
 	if err != nil {
@@ -174,7 +156,7 @@
 		getFile := func(ctx context.Context, path string) (string, error) {
 			return co.GetFile(ctx, path, "HEAD")
 		}
-		changes, _, err := version_file_common.UpdateDep(ctx, dep, to, getFile)
+		changes, err := version_file_common.UpdateDep(ctx, dep, to, getFile)
 		if err != nil {
 			return "", skerr.Wrap(err)
 		}
diff --git a/autoroll/go/repo_manager/parent/git_checkout_github.go b/autoroll/go/repo_manager/parent/git_checkout_github.go
index 07e42b1..9816e7c 100644
--- a/autoroll/go/repo_manager/parent/git_checkout_github.go
+++ b/autoroll/go/repo_manager/parent/git_checkout_github.go
@@ -12,31 +12,6 @@
 )
 
 const (
-	TMPL_COMMIT_MSG_GITHUB = `Roll {{.ChildPath}} {{.RollingFrom.String}}..{{.RollingTo.String}} ({{len .Revisions}} commits)
-
-{{.ChildRepo}}/compare/{{.RollingFrom.String}}...{{.RollingTo.String}}
-
-{{if .IncludeLog}}git log {{.RollingFrom}}..{{.RollingTo}} --first-parent --oneline
-{{range .Revisions}}{{.Timestamp.Format "2006-01-02"}} {{.Author}} {{.Description}}
-{{end}}{{end}}{{if len .TransitiveDeps}}
-Also rolling transitive DEPS:
-{{range .TransitiveDeps}}  {{.Dep}} {{.RollingFrom}}..{{.RollingTo}}
-{{end}}{{end}}
-
-If this roll has caused a breakage, revert this CL and stop the roller
-using the controls here:
-{{.ServerURL}}
-Please CC {{stringsJoin .Reviewers ","}} on the revert to ensure that a human
-is aware of the problem.
-
-To report a problem with the AutoRoller itself, please file a bug:
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
-
-Documentation for the AutoRoller is here:
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
-
-`
-
 	githubForkRemoteName = "fork"
 )
 
@@ -111,9 +86,6 @@
 	if err := c.Validate(); err != nil {
 		return nil, skerr.Wrap(err)
 	}
-	if c.CommitMsgTmpl == "" {
-		c.CommitMsgTmpl = TMPL_COMMIT_MSG_GITHUB
-	}
 
 	// See documentation for GitCheckoutUploadRollFunc.
 	uploadRoll := GitCheckoutUploadGithubRollFunc(githubClient, userName, c.ForkBranchName)
diff --git a/autoroll/go/repo_manager/parent/gitiles.go b/autoroll/go/repo_manager/parent/gitiles.go
index 8fb21cc..825dd48 100644
--- a/autoroll/go/repo_manager/parent/gitiles.go
+++ b/autoroll/go/repo_manager/parent/gitiles.go
@@ -22,7 +22,6 @@
 
 // GitilesConfig provides configuration for a Parent which uses Gitiles.
 type GitilesConfig struct {
-	BaseConfig
 	gitiles_common.GitilesConfig
 	version_file_common.DependencyConfig
 	// Gerrit provides configuration for the Gerrit instance used for
@@ -32,9 +31,6 @@
 
 // See documentation for util.Validator interface.
 func (c GitilesConfig) Validate() error {
-	if err := c.BaseConfig.Validate(); err != nil {
-		return skerr.Wrap(err)
-	}
 	if c.Gerrit == nil {
 		return skerr.Fmt("Gerrit is required")
 	}
@@ -57,11 +53,10 @@
 // roll. These are returned in a map[string]string whose keys are file paths
 // within the repo and values are the new whole contents of the files. Also
 // returns any dependencies which are being transitively rolled.
-type gitilesGetChangesForRollFunc func(context.Context, *gitiles_common.GitilesRepo, string, *revision.Revision, *revision.Revision, []*revision.Revision) (map[string]string, []*version_file_common.TransitiveDepUpdate, error)
+type gitilesGetChangesForRollFunc func(context.Context, *gitiles_common.GitilesRepo, string, *revision.Revision, *revision.Revision, []*revision.Revision) (map[string]string, error)
 
 // gitilesParent is a base for implementations of Parent which use Gitiles.
 type gitilesParent struct {
-	*baseParent
 	*gitiles_common.GitilesRepo
 	childID      string
 	gerrit       gerrit.GerritInterface
@@ -100,12 +95,7 @@
 	if err != nil {
 		return nil, skerr.Wrapf(err, "Failed to create Gerrit client")
 	}
-	base, err := newBaseParent(ctx, c.BaseConfig, serverURL)
-	if err != nil {
-		return nil, skerr.Wrap(err)
-	}
 	return &gitilesParent{
-		baseParent:        base,
 		childID:           c.DependencyConfig.ID,
 		GitilesRepo:       gr,
 		gerrit:            g,
@@ -134,20 +124,14 @@
 }
 
 // See documentation for Parent interface.
-func (p *gitilesParent) CreateNewRoll(ctx context.Context, from, to *revision.Revision, rolling []*revision.Revision, emails []string, cqExtraTrybots string, dryRun bool) (int64, error) {
+func (p *gitilesParent) CreateNewRoll(ctx context.Context, from, to *revision.Revision, rolling []*revision.Revision, emails []string, dryRun bool, commitMsg string) (int64, error) {
 	p.baseCommitMtx.Lock()
 	defer p.baseCommitMtx.Unlock()
 
-	nextRollChanges, transitiveDeps, err := p.getChangesForRoll(ctx, p.GitilesRepo, p.baseCommit, from, to, rolling)
+	nextRollChanges, err := p.getChangesForRoll(ctx, p.GitilesRepo, p.baseCommit, from, to, rolling)
 	if err != nil {
 		return 0, skerr.Wrapf(err, "getChangesForRoll func failed")
 	}
-
-	commitMsg, err := p.buildCommitMsg(from, to, rolling, emails, cqExtraTrybots, transitiveDeps)
-	if err != nil {
-		return 0, skerr.Wrap(err)
-	}
-
 	return CreateNewGerritRoll(ctx, p.gerrit, p.gerritConfig.Project, p.Branch(), commitMsg, p.baseCommit, nextRollChanges, emails, dryRun)
 }
 
diff --git a/autoroll/go/repo_manager/parent/gitiles_file.go b/autoroll/go/repo_manager/parent/gitiles_file.go
index d78ac63..b76e770 100644
--- a/autoroll/go/repo_manager/parent/gitiles_file.go
+++ b/autoroll/go/repo_manager/parent/gitiles_file.go
@@ -14,7 +14,7 @@
 // gitilesFileGetChangesForRollFunc returns a gitilesGetChangesForRollFunc which
 // update the given file.
 func gitilesFileGetChangesForRollFunc(dep version_file_common.DependencyConfig) gitilesGetChangesForRollFunc {
-	return func(ctx context.Context, repo *gitiles_common.GitilesRepo, baseCommit string, from, to *revision.Revision, rolling []*revision.Revision) (map[string]string, []*version_file_common.TransitiveDepUpdate, error) {
+	return func(ctx context.Context, repo *gitiles_common.GitilesRepo, baseCommit string, from, to *revision.Revision, rolling []*revision.Revision) (map[string]string, error) {
 		getFile := func(ctx context.Context, path string) (string, error) {
 			return repo.GetFile(ctx, path, baseCommit)
 		}
diff --git a/autoroll/go/repo_manager/parent/parent.go b/autoroll/go/repo_manager/parent/parent.go
index 29800c6..599c155 100644
--- a/autoroll/go/repo_manager/parent/parent.go
+++ b/autoroll/go/repo_manager/parent/parent.go
@@ -5,16 +5,9 @@
 */
 
 import (
-	"bytes"
 	"context"
-	"fmt"
-	"sort"
-	"text/template"
 
-	"go.skia.org/infra/autoroll/go/repo_manager/common/version_file_common"
 	"go.skia.org/infra/autoroll/go/revision"
-	"go.skia.org/infra/go/skerr"
-	"go.skia.org/infra/go/util"
 )
 
 // Parent represents a git repo (or other destination) which depends on a Child
@@ -27,144 +20,5 @@
 
 	// CreateNewRoll uploads a CL which updates the pinned version of the
 	// dependency to the given Revision.
-	CreateNewRoll(ctx context.Context, from, to *revision.Revision, rolling []*revision.Revision, emails []string, cqExtraTrybots string, dryRun bool) (int64, error)
-}
-
-// BaseConfig provides common configuration for all implementations of Parent.
-// It is intended to be embedded in the various Parent Config types.
-type BaseConfig struct {
-	// Required fields.
-
-	// If false, roll CLs do not link to bugs referenced by the Revisions
-	// in the roll.
-	IncludeBugs bool `json:"includeBugs"`
-	// If true, include the "git log" (or other revision details) in the
-	// commit message. This should be false for internal -> external rollers
-	// to avoid leaking internal commit messages.
-	IncludeLog bool `json:"includeLog"`
-
-	// TODO(borenet): These fields are not applicable to some rollers, but
-	// they're needed for CommitMsgVars. We should probably revisit how we
-	// build commit messages.
-	ChildPath string `json:"childPath"`
-	ChildRepo string `json:"childRepo"`
-
-	// Optional fields.
-
-	// CommitMsgTmpl is a template used to build commit messages. See the
-	// parent.CommitMsgVars type for more information.
-	CommitMsgTmpl string `json:"commitMsgTmpl"`
-
-	// Monorail project name associated with the Parent.
-	// TODO(borenet): Add a BugFramework interface to support other
-	// frameworks (eg. Buganizer, GitHub).
-	MonorailProject string `json:"monorailProject,omitempty"`
-}
-
-// See documentation for util.Validator interface.
-func (c BaseConfig) Validate() error {
-	if c.ChildPath == "" {
-		return skerr.Fmt("ChildPath is required")
-	}
-	if c.ChildRepo == "" {
-		return skerr.Fmt("ChildRepo is required")
-	}
-	// All other fields are booleans or optional.
-	return nil
-}
-
-// baseParent provides common functionality for all implementations of Parent.
-type baseParent struct {
-	childPath       string
-	childRepoUrl    string
-	commitMsgTmpl   *template.Template
-	includeBugs     bool
-	includeLog      bool
-	monorailProject string
-	serverUrl       string
-}
-
-func newBaseParent(ctx context.Context, c BaseConfig, serverUrl string) (*baseParent, error) {
-	commitMsgTmplStr := TMPL_COMMIT_MSG_DEFAULT
-	if c.CommitMsgTmpl != "" {
-		commitMsgTmplStr = c.CommitMsgTmpl
-	}
-	commitMsgTmpl, err := ParseCommitMsgTemplate(commitMsgTmplStr)
-	if err != nil {
-		return nil, err
-	}
-	return &baseParent{
-		childPath:       c.ChildPath,
-		childRepoUrl:    c.ChildRepo,
-		commitMsgTmpl:   commitMsgTmpl,
-		includeBugs:     c.IncludeBugs,
-		includeLog:      c.IncludeLog,
-		monorailProject: c.MonorailProject,
-		serverUrl:       serverUrl,
-	}, nil
-}
-
-// buildCommitMsg is a helper function used to create commit messages.
-func (p *baseParent) buildCommitMsg(from, to *revision.Revision, rolling []*revision.Revision, reviewers []string, cqExtraTrybots string, transitiveDeps []*version_file_common.TransitiveDepUpdate) (string, error) {
-	// Basic variables.
-	vars := &CommitMsgVars{
-		ChildPath:      p.childPath,
-		ChildRepo:      p.childRepoUrl,
-		CqExtraTrybots: cqExtraTrybots,
-		Reviewers:      reviewers,
-		Revisions:      rolling,
-		RollingFrom:    from,
-		RollingTo:      to,
-		ServerURL:      p.serverUrl,
-		TransitiveDeps: transitiveDeps,
-	}
-
-	// Bugs.
-	vars.Bugs = nil
-	if p.includeBugs {
-		// TODO(borenet): Move this to a util.MakeBugLines utility?
-		bugMap := map[string]bool{}
-		for _, rev := range vars.Revisions {
-			for _, bug := range rev.Bugs[p.monorailProject] {
-				bugMap[bug] = true
-			}
-		}
-		if len(bugMap) > 0 {
-			vars.Bugs = make([]string, 0, len(bugMap))
-			for bug := range bugMap {
-				bugStr := fmt.Sprintf("%s:%s", p.monorailProject, bug)
-				if p.monorailProject == util.BUG_PROJECT_BUGANIZER {
-					bugStr = fmt.Sprintf("b/%s", bug)
-				}
-				vars.Bugs = append(vars.Bugs, bugStr)
-			}
-			sort.Strings(vars.Bugs)
-		}
-	}
-
-	// IncludeLog.
-	vars.IncludeLog = p.includeLog
-
-	// Tests.
-	vars.Tests = nil
-	testsMap := map[string]bool{}
-	for _, rev := range vars.Revisions {
-		for _, test := range rev.Tests {
-			testsMap[test] = true
-		}
-	}
-	if len(testsMap) > 0 {
-		vars.Tests = make([]string, 0, len(testsMap))
-		for test := range testsMap {
-			vars.Tests = append(vars.Tests, test)
-		}
-		sort.Strings(vars.Tests)
-	}
-
-	// Create the commit message.
-	var buf bytes.Buffer
-	if err := p.commitMsgTmpl.Execute(&buf, vars); err != nil {
-		return "", err
-	}
-	return buf.String(), nil
+	CreateNewRoll(ctx context.Context, from, to *revision.Revision, rolling []*revision.Revision, emails []string, dryRun bool, commitMsg string) (int64, error)
 }
diff --git a/autoroll/go/repo_manager/repo_manager.go b/autoroll/go/repo_manager/repo_manager.go
index 96c1b94..11860be 100644
--- a/autoroll/go/repo_manager/repo_manager.go
+++ b/autoroll/go/repo_manager/repo_manager.go
@@ -1,30 +1,23 @@
 package repo_manager
 
 import (
-	"bytes"
 	"context"
 	"errors"
 	"fmt"
 	"net/http"
 	"os"
 	"path"
-	"sort"
-	"strings"
 	"sync"
-	"text/template"
 
 	"go.skia.org/infra/autoroll/go/codereview"
 	"go.skia.org/infra/autoroll/go/config_vars"
 	"go.skia.org/infra/autoroll/go/repo_manager/parent"
 	"go.skia.org/infra/autoroll/go/revision"
 	"go.skia.org/infra/autoroll/go/strategy"
-	"go.skia.org/infra/go/depot_tools"
-	"go.skia.org/infra/go/exec"
 	"go.skia.org/infra/go/gerrit"
 	"go.skia.org/infra/go/git"
 	"go.skia.org/infra/go/issues"
 	"go.skia.org/infra/go/skerr"
-	"go.skia.org/infra/go/util"
 	"go.skia.org/infra/go/vcsinfo"
 )
 
@@ -38,7 +31,7 @@
 // to manage checkouts.
 type RepoManager interface {
 	// Create a new roll attempt.
-	CreateNewRoll(context.Context, *revision.Revision, *revision.Revision, []*revision.Revision, []string, string, bool) (int64, error)
+	CreateNewRoll(ctx context.Context, rollingFrom *revision.Revision, rollingTo *revision.Revision, revisions []*revision.Revision, reviewers []string, dryRun bool, commitMsg string) (int64, error)
 
 	// Update the RepoManager's view of the world. Depending on the
 	// implementation, this may sync repos and may take some time. Returns
@@ -61,9 +54,6 @@
 	ChildBranch *config_vars.Template `json:"childBranch"`
 	// Path of the child repo within the parent repo.
 	ChildPath string `json:"childPath"`
-	// If false, roll CLs do not link to bugs from the commits in the child
-	// repo.
-	IncludeBugs bool `json:"includeBugs"`
 	// If true, include the "git log" (or other revision details) in the
 	// commit message. This should be false for internal -> external rollers
 	// to avoid leaking internal commit messages.
@@ -78,9 +68,6 @@
 	// ChildRevLinkTmpl is a template used to create links to revisions of
 	// the child repo. If not supplied, no links will be created.
 	ChildRevLinkTmpl string `json:"childRevLinkTmpl"`
-	// CommitMsgTmpl is a template used to build commit messages. See the
-	// parent.CommitMsgVars type for more information.
-	CommitMsgTmpl string `json:"commitMsgTmpl"`
 	// ChildSubdir indicates the subdirectory of the workdir in which
 	// the childPath should be rooted. In most cases, this should be empty,
 	// but if ChildPath is relative to the parent repo dir (eg. when DEPS
@@ -112,9 +99,6 @@
 	if c.ParentRepo == "" {
 		return errors.New("ParentRepo is required.")
 	}
-	if c.IncludeBugs && c.BugProject == "" {
-		return errors.New("IncludeBugs is true, but BugProject is empty.")
-	}
 	if proj := issues.REPO_PROJECT_MAPPING[c.ParentRepo]; proj != "" && c.BugProject != "" && proj != c.BugProject {
 		return errors.New("BugProject is non-empty but does not match the entry in issues.REPO_PROJECT_MAPPING.")
 	}
@@ -152,19 +136,11 @@
 	childPath        string
 	childRepo        *git.Checkout
 	childRevLinkTmpl string
-	childSubdir      string
-	codereview       codereview.CodeReview
-	commitMsgTmpl    *template.Template
 	g                gerrit.GerritInterface
 	httpClient       *http.Client
-	includeBugs      bool
-	includeLog       bool
-	local            bool
-	bugProject       string
 	parentBranch     *config_vars.Template
 	preUploadSteps   []parent.PreUploadStep
 	repoMtx          sync.RWMutex
-	serverURL        string
 	workdir          string
 }
 
@@ -191,14 +167,6 @@
 	if err != nil {
 		return nil, err
 	}
-	commitMsgTmplStr := parent.TMPL_COMMIT_MSG_DEFAULT
-	if c.CommitMsgTmpl != "" {
-		commitMsgTmplStr = c.CommitMsgTmpl
-	}
-	commitMsgTmpl, err := parent.ParseCommitMsgTemplate(commitMsgTmplStr)
-	if err != nil {
-		return nil, err
-	}
 	if err := reg.Register(c.ChildBranch); err != nil {
 		return nil, err
 	}
@@ -211,18 +179,10 @@
 		childPath:        c.ChildPath,
 		childRepo:        childRepo,
 		childRevLinkTmpl: c.ChildRevLinkTmpl,
-		childSubdir:      c.ChildSubdir,
-		codereview:       cr,
-		commitMsgTmpl:    commitMsgTmpl,
 		g:                g,
 		httpClient:       client,
-		includeBugs:      c.IncludeBugs,
-		includeLog:       c.IncludeLog,
-		local:            local,
-		bugProject:       c.BugProject,
 		parentBranch:     c.ParentBranch,
 		preUploadSteps:   preUploadSteps,
-		serverURL:        serverURL,
 		workdir:          workdir,
 	}, nil
 }
@@ -265,59 +225,6 @@
 	return revision.FromLongCommit(r.childRevLinkTmpl, details), nil
 }
 
-// buildCommitMsg executes the commit message template using the given
-// CommitMsgVars.
-func (r *commonRepoManager) buildCommitMsg(vars *parent.CommitMsgVars) (string, error) {
-	// Bugs.
-	vars.Bugs = nil
-	if r.includeBugs {
-		// TODO(borenet): Move this to a util.MakeBugLines utility?
-		bugMap := map[string]bool{}
-		for _, rev := range vars.Revisions {
-			for _, bug := range rev.Bugs[r.bugProject] {
-				bugMap[bug] = true
-			}
-		}
-		if len(bugMap) > 0 {
-			vars.Bugs = make([]string, 0, len(bugMap))
-			for bug := range bugMap {
-				bugStr := fmt.Sprintf("%s:%s", r.bugProject, bug)
-				if r.bugProject == util.BUG_PROJECT_BUGANIZER {
-					bugStr = fmt.Sprintf("b/%s", bug)
-				}
-				vars.Bugs = append(vars.Bugs, bugStr)
-			}
-			sort.Strings(vars.Bugs)
-		}
-	}
-
-	// IncludeLog.
-	vars.IncludeLog = r.includeLog
-
-	// Tests.
-	vars.Tests = nil
-	testsMap := map[string]bool{}
-	for _, rev := range vars.Revisions {
-		for _, test := range rev.Tests {
-			testsMap[test] = true
-		}
-	}
-	if len(testsMap) > 0 {
-		vars.Tests = make([]string, 0, len(testsMap))
-		for test := range testsMap {
-			vars.Tests = append(vars.Tests, test)
-		}
-		sort.Strings(vars.Tests)
-	}
-
-	// Create the commit message.
-	var buf bytes.Buffer
-	if err := r.commitMsgTmpl.Execute(&buf, vars); err != nil {
-		return "", err
-	}
-	return buf.String(), nil
-}
-
 // DepotToolsRepoManagerConfig provides configuration for depotToolsRepoManager.
 type DepotToolsRepoManagerConfig struct {
 	CommonRepoManagerConfig
@@ -344,121 +251,6 @@
 	runhooks      bool
 }
 
-// Return a depotToolsRepoManager instance.
-func newDepotToolsRepoManager(ctx context.Context, c DepotToolsRepoManagerConfig, reg *config_vars.Registry, workdir, recipeCfgFile, serverURL string, g gerrit.GerritInterface, client *http.Client, cr codereview.CodeReview, local bool) (*depotToolsRepoManager, error) {
-	if err := c.Validate(); err != nil {
-		return nil, err
-	}
-	crm, err := newCommonRepoManager(ctx, c.CommonRepoManagerConfig, reg, workdir, serverURL, g, client, cr, local)
-	if err != nil {
-		return nil, err
-	}
-	depotTools, err := depot_tools.GetDepotTools(ctx, workdir, recipeCfgFile)
-	if err != nil {
-		return nil, err
-	}
-	parentBase := strings.TrimSuffix(path.Base(c.ParentRepo), ".git")
-	parentDir := path.Join(workdir, parentBase)
-	return &depotToolsRepoManager{
-		commonRepoManager: crm,
-		depotTools:        depotTools,
-		depotToolsEnv:     append(depot_tools.Env(depotTools), "SKIP_GCE_AUTH_FOR_GIT=1"),
-		gclient:           path.Join(depotTools, parent.GClient),
-		gclientSpec:       c.GClientSpec,
-		parentDir:         parentDir,
-		parentRepo:        c.ParentRepo,
-		runhooks:          c.RunHooks,
-	}, nil
-}
-
-// cleanParent forces the parent checkout into a clean state.
-func (r *depotToolsRepoManager) cleanParent(ctx context.Context) error {
-	return r.cleanParentWithRemoteAndBranch(ctx, "origin", ROLL_BRANCH, r.parentBranch.String())
-}
-
-func (r *depotToolsRepoManager) cleanParentWithRemoteAndBranch(ctx context.Context, remote, localBranch, remoteBranch string) error {
-	if _, err := git.GitDir(r.parentDir).Git(ctx, "clean", "-d", "-f", "-f"); err != nil {
-		return err
-	}
-	_, _ = git.GitDir(r.parentDir).Git(ctx, "rebase", "--abort")
-	if _, err := git.GitDir(r.parentDir).Git(ctx, "checkout", fmt.Sprintf("%s/%s", remote, remoteBranch), "-f"); err != nil {
-		return err
-	}
-	_, _ = git.GitDir(r.parentDir).Git(ctx, "branch", "-D", localBranch)
-	if _, err := exec.RunCommand(ctx, &exec.Command{
-		Dir:  r.workdir,
-		Env:  r.depotToolsEnv,
-		Name: "python",
-		Args: []string{r.gclient, "revert", "--nohooks"},
-	}); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (r *depotToolsRepoManager) createAndSyncParent(ctx context.Context) error {
-	return r.createAndSyncParentWithRemoteAndBranch(ctx, "origin", ROLL_BRANCH, r.parentBranch.String())
-}
-
-func (r *depotToolsRepoManager) createAndSyncParentWithRemoteAndBranch(ctx context.Context, remote, localBranch, remoteBranch string) error {
-	// Create the working directory if needed.
-	if _, err := os.Stat(r.workdir); err != nil {
-		if err := os.MkdirAll(r.workdir, 0755); err != nil {
-			return err
-		}
-	}
-
-	// Run "gclient config".
-	args := []string{r.gclient, "config"}
-	if r.gclientSpec != "" {
-		args = append(args, fmt.Sprintf("--spec=%s", r.gclientSpec))
-	} else {
-		args = append(args, r.parentRepo, "--unmanaged")
-	}
-	if _, err := exec.RunCommand(ctx, &exec.Command{
-		Dir:  r.workdir,
-		Env:  r.depotToolsEnv,
-		Name: "python",
-		Args: args,
-	}); err != nil {
-		return err
-	}
-
-	// Clean/reset the parent and child checkouts.
-	if _, err := os.Stat(path.Join(r.parentDir, ".git")); err == nil {
-		if err := r.cleanParentWithRemoteAndBranch(ctx, remote, localBranch, remoteBranch); err != nil {
-			return err
-		}
-		// Update the repo.
-		if _, err := git.GitDir(r.parentDir).Git(ctx, "fetch", remote); err != nil {
-			return err
-		}
-		if _, err := git.GitDir(r.parentDir).Git(ctx, "reset", "--hard", fmt.Sprintf("%s/%s", remote, remoteBranch)); err != nil {
-			return err
-		}
-	}
-	if _, err := os.Stat(path.Join(r.childDir, ".git")); err == nil {
-		if _, err := r.childRepo.Git(ctx, "fetch"); err != nil {
-			return err
-		}
-	}
-
-	// Run "gclient sync".
-	args = []string{r.gclient, "sync"}
-	if !r.runhooks {
-		args = append(args, "--nohooks")
-	}
-	if _, err := exec.RunCommand(ctx, &exec.Command{
-		Dir:  r.workdir,
-		Env:  r.depotToolsEnv,
-		Name: "python",
-		Args: args,
-	}); err != nil {
-		return err
-	}
-	return nil
-}
-
 // NoCheckoutRepoManagerConfig provides configuration for RepoManagers which
 // don't use a local checkout.
 type NoCheckoutRepoManagerConfig struct {
diff --git a/autoroll/go/repo_manager/semver_gcs_repo_manager.go b/autoroll/go/repo_manager/semver_gcs_repo_manager.go
index 8cae925..3d113dc 100644
--- a/autoroll/go/repo_manager/semver_gcs_repo_manager.go
+++ b/autoroll/go/repo_manager/semver_gcs_repo_manager.go
@@ -63,14 +63,6 @@
 // and child. We shouldn't need most of the New.*RepoManager functions.
 func (c SemVerGCSRepoManagerConfig) splitParentChild() (parent.GitilesConfig, child.SemVerGCSConfig, error) {
 	parentCfg := parent.GitilesConfig{
-		BaseConfig: parent.BaseConfig{
-			ChildPath:       c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.ChildPath,
-			ChildRepo:       c.GCSPath, // TODO
-			IncludeBugs:     c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.IncludeBugs,
-			IncludeLog:      c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.IncludeLog,
-			CommitMsgTmpl:   c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.CommitMsgTmpl,
-			MonorailProject: c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.BugProject,
-		},
 		GitilesConfig: gitiles_common.GitilesConfig{
 			Branch:  c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.ParentBranch,
 			RepoURL: c.NoCheckoutRepoManagerConfig.CommonRepoManagerConfig.ParentRepo,
diff --git a/autoroll/go/repo_manager/semver_gcs_repo_manager_test.go b/autoroll/go/repo_manager/semver_gcs_repo_manager_test.go
index 7eaeae0..695b838 100644
--- a/autoroll/go/repo_manager/semver_gcs_repo_manager_test.go
+++ b/autoroll/go/repo_manager/semver_gcs_repo_manager_test.go
@@ -45,31 +45,6 @@
 	AFDO_SHORT_REV_REGEX = "(\\d+)\\.(\\d+)\\.(\\d+)\\.0_rc-r(\\d+)-merged"
 
 	AFDO_VERSION_FILE_PATH = "chrome/android/profiles/newest.txt"
-
-	TMPL_COMMIT_MSG_AFDO = `Roll AFDO from {{.RollingFrom.String}} to {{.RollingTo.String}}
-
-This CL may cause a small binary size increase, roughly proportional
-to how long it's been since our last AFDO profile roll. For larger
-increases (around or exceeding 100KB), please file a bug against
-gbiv@chromium.org. Additional context: https://crbug.com/805539
-
-Please note that, despite rolling to chrome/android, this profile is
-used for both Linux and Android.
-
-If this roll has caused a breakage, revert this CL and stop the roller
-using the controls here:
-{{.ServerURL}}
-Please CC {{stringsJoin .Reviewers ","}} on the revert to ensure that a human
-is aware of the problem.
-
-To report a problem with the AutoRoller itself, please file a bug:
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
-
-Documentation for the AutoRoller is here:
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
-
-Tbr: {{stringsJoin .Reviewers ","}}
-`
 )
 
 func afdoCfg(t *testing.T) *SemVerGCSRepoManagerConfig {
@@ -80,11 +55,10 @@
 	return &SemVerGCSRepoManagerConfig{
 		NoCheckoutRepoManagerConfig: NoCheckoutRepoManagerConfig{
 			CommonRepoManagerConfig: CommonRepoManagerConfig{
-				ChildBranch:   masterBranchTmpl(t),
-				ChildPath:     "unused/by/afdo/repomanager",
-				CommitMsgTmpl: TMPL_COMMIT_MSG_AFDO,
-				ParentBranch:  masterBranchTmpl(t),
-				ParentRepo:    "", // Filled in after GitInit().
+				ChildBranch:  masterBranchTmpl(t),
+				ChildPath:    "unused/by/afdo/repomanager",
+				ParentBranch: masterBranchTmpl(t),
+				ParentRepo:   "", // Filled in after GitInit().
 			},
 		},
 		Gerrit: &codereview.GerritConfig{
@@ -304,31 +278,7 @@
 	mockParent.MockReadFile(ctx, AFDO_VERSION_FILE_PATH, parentMaster)
 
 	// Mock the initial change creation.
-	commitMsg := `Roll AFDO from 66.0.3336.0_rc-r1-merged to 66.0.3337.0_rc-r1-merged
-
-This CL may cause a small binary size increase, roughly proportional
-to how long it's been since our last AFDO profile roll. For larger
-increases (around or exceeding 100KB), please file a bug against
-gbiv@chromium.org. Additional context: https://crbug.com/805539
-
-Please note that, despite rolling to chrome/android, this profile is
-used for both Linux and Android.
-
-If this roll has caused a breakage, revert this CL and stop the roller
-using the controls here:
-fake.server.com
-Please CC reviewer@chromium.org on the revert to ensure that a human
-is aware of the problem.
-
-To report a problem with the AutoRoller itself, please file a bug:
-https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
-
-Documentation for the AutoRoller is here:
-https://skia.googlesource.com/buildbot/+doc/master/autoroll/README.md
-
-Tbr: reviewer@chromium.org
-`
-	subject := strings.Split(commitMsg, "\n")[0]
+	subject := strings.Split(fakeCommitMsg, "\n")[0]
 	reqBody := []byte(fmt.Sprintf(`{"project":"%s","subject":"%s","branch":"%s","topic":"","status":"NEW","base_commit":"%s"}`, "fake-gerrit-project", subject, "master", parentMaster))
 	ci := gerrit.ChangeInfo{
 		ChangeId: "123",
@@ -347,7 +297,7 @@
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/", mockhttpclient.MockPostDialogueWithResponseCode("application/json", reqBody, respBody, 201))
 
 	// Mock the edit of the change to update the commit message.
-	reqBody = []byte(fmt.Sprintf(`{"message":"%s"}`, strings.Replace(commitMsg, "\n", "\\n", -1)))
+	reqBody = []byte(fmt.Sprintf(`{"message":"%s"}`, strings.Replace(fakeCommitMsg, "\n", "\\n", -1)))
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/123/edit:message", mockhttpclient.MockPutDialogue("application/json", reqBody, []byte("")))
 
 	// Mock the request to modify the version file.
@@ -369,7 +319,7 @@
 	reqBody = []byte(`{"labels":{"Code-Review":1,"Commit-Queue":2},"message":"","reviewers":[{"reviewer":"reviewer@chromium.org"}]}`)
 	urlmock.MockOnce("https://fake-skia-review.googlesource.com/a/changes/123/revisions/ps1/review", mockhttpclient.MockPostDialogue("application/json", reqBody, []byte("")))
 
-	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, cqExtraTrybots, false)
+	issue, err := rm.CreateNewRoll(ctx, lastRollRev, tipRev, notRolledRevs, emails, false, fakeCommitMsg)
 	require.NoError(t, err)
 	require.Equal(t, ci.Issue, issue)
 }
@@ -380,7 +330,6 @@
 	cfg := afdoCfg(t)
 	// Fill in some fields which are not supplied above.
 	cfg.ParentRepo = "dummy"
-	cfg.CommitMsgTmpl = TMPL_COMMIT_MSG_AFDO
 	cfg.GCSBucket = AFDO_GS_BUCKET
 	cfg.GCSPath = AFDO_GS_PATH
 	cfg.VersionFile = AFDO_VERSION_FILE_PATH
diff --git a/autoroll/go/roller/autoroller.go b/autoroll/go/roller/autoroller.go
index 12dd4e0..19a0d98 100644
--- a/autoroll/go/roller/autoroller.go
+++ b/autoroll/go/roller/autoroller.go
@@ -11,6 +11,7 @@
 
 	"github.com/gorilla/mux"
 	"go.skia.org/infra/autoroll/go/codereview"
+	"go.skia.org/infra/autoroll/go/commit_msg"
 	"go.skia.org/infra/autoroll/go/config_vars"
 	"go.skia.org/infra/autoroll/go/manual"
 	"go.skia.org/infra/autoroll/go/modes"
@@ -54,41 +55,39 @@
 // AutoRoller is a struct which automates the merging new revisions of one
 // project into another.
 type AutoRoller struct {
-	cfg             AutoRollerConfig
-	childName       string
-	codereview      codereview.CodeReview
-	currentRoll     codereview.RollImpl
-	emails          []string
-	emailsMtx       sync.RWMutex
-	failureThrottle *state_machine.Throttler
-	lastRollRev     *revision.Revision
-	liveness        metrics2.Liveness
-	manualRollDB    manual.DB
-	modeHistory     *modes.ModeHistory
-	nextRollRev     *revision.Revision
-	notifier        *arb_notifier.AutoRollNotifier
-	notifierConfigs []*notifier.Config
-	notRolledRevs   []*revision.Revision
-	parentName      string
-	recent          *recent_rolls.RecentRolls
-	reg             *config_vars.Registry
-	rm              repo_manager.RepoManager
-	rollIntoAndroid bool
-	roller          string
-	runningMtx      sync.Mutex
-	safetyThrottle  *state_machine.Throttler
-	serverURL       string
-	sheriff         []string
-	sheriffBackup   []string
-	sm              *state_machine.AutoRollStateMachine
-	status          *status.AutoRollStatusCache
-	statusMtx       sync.RWMutex
-	strategy        strategy.NextRollStrategy
-	strategyHistory *strategy.StrategyHistory
-	strategyMtx     sync.RWMutex // Protects strategy
-	successThrottle *state_machine.Throttler
-	timeWindow      *time_window.TimeWindow
-	tipRev          *revision.Revision
+	cfg              AutoRollerConfig
+	codereview       codereview.CodeReview
+	commitMsgBuilder *commit_msg.Builder
+	currentRoll      codereview.RollImpl
+	emails           []string
+	emailsMtx        sync.RWMutex
+	failureThrottle  *state_machine.Throttler
+	lastRollRev      *revision.Revision
+	liveness         metrics2.Liveness
+	manualRollDB     manual.DB
+	modeHistory      *modes.ModeHistory
+	nextRollRev      *revision.Revision
+	notifier         *arb_notifier.AutoRollNotifier
+	notifierConfigs  []*notifier.Config
+	notRolledRevs    []*revision.Revision
+	recent           *recent_rolls.RecentRolls
+	reg              *config_vars.Registry
+	rm               repo_manager.RepoManager
+	roller           string
+	runningMtx       sync.Mutex
+	safetyThrottle   *state_machine.Throttler
+	serverURL        string
+	sheriff          []string
+	sheriffBackup    []string
+	sm               *state_machine.AutoRollStateMachine
+	status           *status.AutoRollStatusCache
+	statusMtx        sync.RWMutex
+	strategy         strategy.NextRollStrategy
+	strategyHistory  *strategy.StrategyHistory
+	strategyMtx      sync.RWMutex // Protects strategy
+	successThrottle  *state_machine.Throttler
+	timeWindow       *time_window.TimeWindow
+	tipRev           *revision.Revision
 }
 
 // NewAutoRoller returns an AutoRoller instance.
@@ -107,36 +106,9 @@
 	}
 
 	// Create the RepoManager.
-	var rm repo_manager.RepoManager
-	if c.AndroidRepoManager != nil {
-		rm, err = repo_manager.NewAndroidRepoManager(ctx, c.AndroidRepoManager, reg, workdir, g, serverURL, c.ServiceAccount, client, cr, local)
-	} else if c.CopyRepoManager != nil {
-		rm, err = repo_manager.NewCopyRepoManager(ctx, c.CopyRepoManager, reg, workdir, g, serverURL, client, cr, local)
-	} else if c.DEPSRepoManager != nil {
-		rm, err = repo_manager.NewDEPSRepoManager(ctx, c.DEPSRepoManager, reg, workdir, g, recipesCfgFile, serverURL, client, cr, local)
-	} else if c.FuchsiaSDKAndroidRepoManager != nil {
-		rm, err = repo_manager.NewFuchsiaSDKAndroidRepoManager(ctx, c.FuchsiaSDKAndroidRepoManager, reg, workdir, g, serverURL, client, cr, local)
-	} else if c.FreeTypeRepoManager != nil {
-		rm, err = repo_manager.NewFreeTypeRepoManager(ctx, c.FreeTypeRepoManager, reg, workdir, g, recipesCfgFile, serverURL, client, cr, local)
-	} else if c.FuchsiaSDKRepoManager != nil {
-		rm, err = repo_manager.NewFuchsiaSDKRepoManager(ctx, c.FuchsiaSDKRepoManager, reg, workdir, g, serverURL, client, cr, local)
-	} else if c.GithubRepoManager != nil {
-		rm, err = repo_manager.NewGithubRepoManager(ctx, c.GithubRepoManager, reg, workdir, rollerName, githubClient, recipesCfgFile, serverURL, client, cr, local)
-	} else if c.GithubCipdDEPSRepoManager != nil {
-		rm, err = repo_manager.NewGithubCipdDEPSRepoManager(ctx, c.GithubCipdDEPSRepoManager, reg, workdir, rollerName, githubClient, recipesCfgFile, serverURL, client, cr, local)
-	} else if c.GithubDEPSRepoManager != nil {
-		rm, err = repo_manager.NewGithubDEPSRepoManager(ctx, c.GithubDEPSRepoManager, reg, workdir, rollerName, githubClient, recipesCfgFile, serverURL, client, cr, local)
-	} else if c.GitilesCIPDDEPSRepoManager != nil {
-		rm, err = repo_manager.NewGitilesCIPDDEPSRepoManager(ctx, c.GitilesCIPDDEPSRepoManager, reg, workdir, g, recipesCfgFile, serverURL, client, cr, local)
-	} else if c.NoCheckoutDEPSRepoManager != nil {
-		rm, err = repo_manager.NewNoCheckoutDEPSRepoManager(ctx, c.NoCheckoutDEPSRepoManager, reg, workdir, g, recipesCfgFile, serverURL, client, cr, local)
-	} else if c.SemVerGCSRepoManager != nil {
-		rm, err = repo_manager.NewSemVerGCSRepoManager(ctx, c.SemVerGCSRepoManager, reg, workdir, g, serverURL, client, cr, local)
-	} else {
-		return nil, skerr.Fmt("Invalid roller config; no repo manager defined!")
-	}
+	rm, err := c.CreateRepoManager(ctx, cr, reg, g, githubClient, workdir, recipesCfgFile, serverURL, rollerName, gcsClient, client, local)
 	if err != nil {
-		return nil, skerr.Wrapf(err, "Failed to initialize repo manager")
+		return nil, skerr.Wrap(err)
 	}
 
 	sklog.Info("Creating strategy history.")
@@ -213,13 +185,13 @@
 		return nil, skerr.Wrapf(err, "Failed to create success throttler")
 	}
 	sklog.Info("Getting sheriff")
-	emails, err := getSheriff(c.ParentName, c.ChildName, c.RollerName, c.Sheriff, c.SheriffBackup)
+	emails, err := GetSheriff(c.RollerName, c.Sheriff, c.SheriffBackup)
 	if err != nil {
 		return nil, skerr.Wrapf(err, "Failed to get sheriff")
 	}
 	sklog.Info("Creating notifier")
 	configCopies := replaceSheriffPlaceholder(c.Notifiers, emails)
-	n, err := arb_notifier.New(ctx, c.ChildName, c.ParentName, serverURL, client, emailer, chatBotConfigReader, configCopies)
+	n, err := arb_notifier.New(ctx, c.ChildDisplayName, c.ParentDisplayName, serverURL, client, emailer, chatBotConfigReader, configCopies)
 	if err != nil {
 		return nil, skerr.Wrapf(err, "Failed to create notifier")
 	}
@@ -236,33 +208,38 @@
 			return nil, skerr.Wrapf(err, "Failed to create TimeWindow")
 		}
 	}
+	commitMsgBuilder, err := commit_msg.NewBuilder(c.CommitMsgConfig, c.ChildDisplayName, serverURL, c.TransitiveDeps)
+	if err != nil {
+		return nil, skerr.Wrap(err)
+	}
 	arb := &AutoRoller{
-		cfg:             c,
-		codereview:      cr,
-		emails:          emails,
-		failureThrottle: failureThrottle,
-		lastRollRev:     lastRollRev,
-		liveness:        metrics2.NewLiveness("last_autoroll_landed", map[string]string{"roller": c.RollerName}),
-		manualRollDB:    manualRollDB,
-		modeHistory:     mh,
-		nextRollRev:     nextRollRev,
-		notifier:        n,
-		notifierConfigs: c.Notifiers,
-		notRolledRevs:   notRolledRevs,
-		recent:          recent,
-		reg:             reg,
-		rm:              rm,
-		roller:          rollerName,
-		safetyThrottle:  safetyThrottle,
-		serverURL:       serverURL,
-		sheriff:         c.Sheriff,
-		sheriffBackup:   c.SheriffBackup,
-		status:          statusCache,
-		strategy:        strat,
-		strategyHistory: sh,
-		successThrottle: successThrottle,
-		timeWindow:      tw,
-		tipRev:          tipRev,
+		cfg:              c,
+		codereview:       cr,
+		commitMsgBuilder: commitMsgBuilder,
+		emails:           emails,
+		failureThrottle:  failureThrottle,
+		lastRollRev:      lastRollRev,
+		liveness:         metrics2.NewLiveness("last_autoroll_landed", map[string]string{"roller": c.RollerName}),
+		manualRollDB:     manualRollDB,
+		modeHistory:      mh,
+		nextRollRev:      nextRollRev,
+		notifier:         n,
+		notifierConfigs:  c.Notifiers,
+		notRolledRevs:    notRolledRevs,
+		recent:           recent,
+		reg:              reg,
+		rm:               rm,
+		roller:           rollerName,
+		safetyThrottle:   safetyThrottle,
+		serverURL:        serverURL,
+		sheriff:          c.Sheriff,
+		sheriffBackup:    c.SheriffBackup,
+		status:           statusCache,
+		strategy:         strat,
+		strategyHistory:  sh,
+		successThrottle:  successThrottle,
+		timeWindow:       tw,
+		tipRev:           tipRev,
 	}
 	sklog.Info("Creating state machine")
 	sm, err := state_machine.New(ctx, arb, n, gcsClient, rollerName)
@@ -351,7 +328,7 @@
 
 	// Update the current sheriff in a loop.
 	cleanup.Repeat(30*time.Minute, func(ctx context.Context) {
-		emails, err := getSheriff(r.cfg.ParentName, r.cfg.ChildName, r.cfg.RollerName, r.cfg.Sheriff, r.cfg.SheriffBackup)
+		emails, err := GetSheriff(r.cfg.RollerName, r.cfg.Sheriff, r.cfg.SheriffBackup)
 		if err != nil {
 			sklog.Errorf("Failed to retrieve current sheriff: %s", err)
 		} else {
@@ -471,7 +448,11 @@
 		}
 	}
 	r.statusMtx.RUnlock()
-	issueNum, err := r.rm.CreateNewRoll(ctx, from, to, revs, emails, strings.Join(r.cfg.CqExtraTrybots, ";"), dryRun)
+	commitMsg, err := r.commitMsgBuilder.Build(from, to, revs, emails)
+	if err != nil {
+		return nil, skerr.Wrap(err)
+	}
+	issueNum, err := r.rm.CreateNewRoll(ctx, from, to, revs, emails, dryRun, commitMsg)
 	if err != nil {
 		return nil, err
 	}
@@ -683,7 +664,7 @@
 			NumFailedRolls:      numFailures,
 			NumNotRolledCommits: numNotRolled,
 		},
-		ChildName:          r.childName,
+		ChildName:          r.cfg.ChildDisplayName,
 		CurrentRoll:        r.recent.CurrentRoll(),
 		Error:              lastError,
 		FullHistoryUrl:     r.codereview.GetFullHistoryUrl(),
diff --git a/autoroll/go/roller/config.go b/autoroll/go/roller/config.go
index aeef996..ccce7c1 100644
--- a/autoroll/go/roller/config.go
+++ b/autoroll/go/roller/config.go
@@ -5,16 +5,23 @@
 	"encoding/json"
 	"errors"
 	"fmt"
+	"net/http"
 	"regexp"
 	"strings"
 	"time"
 
 	"github.com/flynn/json5"
 	"go.skia.org/infra/autoroll/go/codereview"
+	"go.skia.org/infra/autoroll/go/commit_msg"
+	"go.skia.org/infra/autoroll/go/config_vars"
 	arb_notifier "go.skia.org/infra/autoroll/go/notifier"
 	"go.skia.org/infra/autoroll/go/repo_manager"
+	"go.skia.org/infra/autoroll/go/repo_manager/common/version_file_common"
 	"go.skia.org/infra/autoroll/go/strategy"
 	"go.skia.org/infra/autoroll/go/time_window"
+	"go.skia.org/infra/go/gcs"
+	"go.skia.org/infra/go/gerrit"
+	"go.skia.org/infra/go/github"
 	"go.skia.org/infra/go/human"
 	"go.skia.org/infra/go/notifier"
 	"go.skia.org/infra/go/skerr"
@@ -143,8 +150,8 @@
 type AutoRollerConfig struct {
 	// Required Fields.
 
-	// User friendly name of the child repo.
-	ChildName string `json:"childName"`
+	// Display name of the child.
+	ChildDisplayName string `json:"childDisplayName"`
 	// List of email addresses of contacts for this roller, used for sending
 	// PSAs, asking questions, etc.
 	Contacts []string `json:"contacts"`
@@ -154,9 +161,9 @@
 	OwnerPrimary string `json:"ownerPrimary"`
 	// Secondary owner of this roller.
 	OwnerSecondary string `json:"ownerSecondary"`
-	// User friendly name of the parent repo.
-	ParentName string `json:"parentName"`
-	// URL of the waterfall/status display for the parent repo.
+	// Display name of the parent.
+	ParentDisplayName string `json:"parentDisplayName"`
+	// URL of the waterfall/status display for the parent.
 	ParentWaterfall string `json:"parentWaterfall"`
 	// Name of the roller, used for database keys.
 	RollerName string `json:"rollerName"`
@@ -170,6 +177,9 @@
 	// for Sheriff.
 	SheriffBackup []string `json:"sheriffBackup,omitempty"`
 
+	// Commit message configuration.
+	CommitMsgConfig *commit_msg.CommitMsgConfig `json:"commitMsg"`
+
 	// Code review settings.
 	Gerrit        *codereview.GerritConfig  `json:"gerrit,omitempty"`
 	Github        *codereview.GithubConfig  `json:"github,omitempty"`
@@ -195,33 +205,34 @@
 
 	// Optional Fields.
 
-	// Comma-separated list of trybots to add to roll CLs, in addition to
-	// the default set of commit queue trybots.
-	CqExtraTrybots []string `json:"cqExtraTrybots,omitempty"`
 	// Limit to one successful roll within this time period.
 	MaxRollFrequency string `json:"maxRollFrequency,omitempty"`
 	// Any extra notification systems to be used for this roller.
 	Notifiers []*notifier.Config `json:"notifiers,omitempty"`
-	// Time window in which the roller is allowed to upload roll CLs. See
-	// the go/time_window package for supported format.
-	TimeWindow string `json:"timeWindow,omitempty"`
 	// Throttling configuration to prevent uploading too many CLs within
 	// too short a time period.
 	SafetyThrottle *ThrottleConfig `json:"safetyThrottle,omitempty"`
 	// If true, this roller supports one-click "manual" rolls.
 	SupportsManualRolls bool `json:"supportsManualRolls,omitempty"`
+	// Time window in which the roller is allowed to upload roll CLs. See
+	// the go/time_window package for supported format.
+	TimeWindow string `json:"timeWindow,omitempty"`
+	// TransitiveDeps is an optional mapping of dependency ID (eg. repo URL)
+	// to the paths within the parent and child repo, respectively, where
+	// those dependencies are versioned, eg. "DEPS".
+	TransitiveDeps []*version_file_common.TransitiveDepConfig `json:"transitiveDeps"`
 }
 
 // Validate the config.
 func (c *AutoRollerConfig) Validate() error {
-	if c.ChildName == "" {
-		return errors.New("ChildName is required.")
+	if c.ChildDisplayName == "" {
+		return errors.New("ChildDisplayName is required.")
 	}
 	if len(c.Contacts) < 1 {
 		return errors.New("At least one contact is required.")
 	}
-	if c.ParentName == "" {
-		return errors.New("ParentName is required.")
+	if c.ParentDisplayName == "" {
+		return errors.New("ParentDisplayName is required.")
 	}
 	if c.ParentWaterfall == "" {
 		return errors.New("ParentWaterfall is required.")
@@ -245,6 +256,13 @@
 		return errors.New("Sheriff is required.")
 	}
 
+	if c.CommitMsgConfig == nil {
+		return skerr.Fmt("CommitMsgConfig is required")
+	}
+	if err := c.CommitMsgConfig.Validate(); err != nil {
+		return skerr.Wrap(err)
+	}
+
 	cr := []util.Validator{}
 	if c.Gerrit != nil {
 		cr = append(cr, c.Gerrit)
@@ -323,6 +341,7 @@
 	if c.FreeTypeRepoManager != nil {
 		// TODO(borenet): De-duplicate the Gerrit config.
 		c.FreeTypeRepoManager.Gerrit = c.Gerrit
+		c.FreeTypeRepoManager.TransitiveDeps = c.TransitiveDeps
 		rm = append(rm, c.FreeTypeRepoManager)
 	}
 	if c.FuchsiaSDKAndroidRepoManager != nil {
@@ -336,12 +355,14 @@
 		rm = append(rm, c.FuchsiaSDKRepoManager)
 	}
 	if c.GithubRepoManager != nil {
+		c.GithubRepoManager.TransitiveDeps = c.TransitiveDeps
 		rm = append(rm, c.GithubRepoManager)
 	}
 	if c.GithubCipdDEPSRepoManager != nil {
 		rm = append(rm, c.GithubCipdDEPSRepoManager)
 	}
 	if c.GithubDEPSRepoManager != nil {
+		c.GithubDEPSRepoManager.TransitiveDeps = c.TransitiveDeps
 		rm = append(rm, c.GithubDEPSRepoManager)
 	}
 	if c.GitilesCIPDDEPSRepoManager != nil {
@@ -355,6 +376,7 @@
 	if c.NoCheckoutDEPSRepoManager != nil {
 		// TODO(borenet): De-duplicate the Gerrit config.
 		c.NoCheckoutDEPSRepoManager.Gerrit = c.Gerrit
+		c.NoCheckoutDEPSRepoManager.TransitiveDeps = c.TransitiveDeps
 		rm = append(rm, c.NoCheckoutDEPSRepoManager)
 	}
 	if c.SemVerGCSRepoManager != nil {
@@ -399,3 +421,45 @@
 	// Return the list of valid NextRollStrategy names for this RepoManager.
 	ValidStrategies() []string
 }
+
+// CreateRepoManager creates a RepoManager instance from the config.
+// TODO(borenet): If we can't remove this after refactoring RepoManager configs,
+// this should probably move into the repo_manager package.
+func (c *AutoRollerConfig) CreateRepoManager(ctx context.Context, cr codereview.CodeReview, reg *config_vars.Registry, g *gerrit.Gerrit, githubClient *github.GitHub, workdir, recipesCfgFile, serverURL, rollerName string, gcsClient gcs.GCSClient, client *http.Client, local bool) (repo_manager.RepoManager, error) {
+	if err := c.Validate(); err != nil {
+		return nil, skerr.Wrap(err)
+	}
+	var rm repo_manager.RepoManager
+	var err error
+	if c.AndroidRepoManager != nil {
+		rm, err = repo_manager.NewAndroidRepoManager(ctx, c.AndroidRepoManager, reg, workdir, g, serverURL, c.ServiceAccount, client, cr, local)
+	} else if c.CopyRepoManager != nil {
+		rm, err = repo_manager.NewCopyRepoManager(ctx, c.CopyRepoManager, reg, workdir, g, serverURL, client, cr, local)
+	} else if c.DEPSRepoManager != nil {
+		rm, err = repo_manager.NewDEPSRepoManager(ctx, c.DEPSRepoManager, reg, workdir, g, recipesCfgFile, serverURL, client, cr, local)
+	} else if c.FuchsiaSDKAndroidRepoManager != nil {
+		rm, err = repo_manager.NewFuchsiaSDKAndroidRepoManager(ctx, c.FuchsiaSDKAndroidRepoManager, reg, workdir, g, serverURL, client, cr, local)
+	} else if c.FreeTypeRepoManager != nil {
+		rm, err = repo_manager.NewFreeTypeRepoManager(ctx, c.FreeTypeRepoManager, reg, workdir, g, recipesCfgFile, serverURL, client, cr, local)
+	} else if c.FuchsiaSDKRepoManager != nil {
+		rm, err = repo_manager.NewFuchsiaSDKRepoManager(ctx, c.FuchsiaSDKRepoManager, reg, workdir, g, serverURL, client, cr, local)
+	} else if c.GithubRepoManager != nil {
+		rm, err = repo_manager.NewGithubRepoManager(ctx, c.GithubRepoManager, reg, workdir, rollerName, githubClient, recipesCfgFile, serverURL, client, cr, local)
+	} else if c.GithubCipdDEPSRepoManager != nil {
+		rm, err = repo_manager.NewGithubCipdDEPSRepoManager(ctx, c.GithubCipdDEPSRepoManager, reg, workdir, rollerName, githubClient, recipesCfgFile, serverURL, client, cr, local)
+	} else if c.GithubDEPSRepoManager != nil {
+		rm, err = repo_manager.NewGithubDEPSRepoManager(ctx, c.GithubDEPSRepoManager, reg, workdir, rollerName, githubClient, recipesCfgFile, serverURL, client, cr, local)
+	} else if c.GitilesCIPDDEPSRepoManager != nil {
+		rm, err = repo_manager.NewGitilesCIPDDEPSRepoManager(ctx, c.GitilesCIPDDEPSRepoManager, reg, workdir, g, recipesCfgFile, serverURL, client, cr, local)
+	} else if c.NoCheckoutDEPSRepoManager != nil {
+		rm, err = repo_manager.NewNoCheckoutDEPSRepoManager(ctx, c.NoCheckoutDEPSRepoManager, reg, workdir, g, recipesCfgFile, serverURL, client, cr, local)
+	} else if c.SemVerGCSRepoManager != nil {
+		rm, err = repo_manager.NewSemVerGCSRepoManager(ctx, c.SemVerGCSRepoManager, reg, workdir, g, serverURL, client, cr, local)
+	} else {
+		return nil, skerr.Fmt("Invalid roller config; no repo manager defined!")
+	}
+	if err != nil {
+		return nil, skerr.Wrapf(err, "Failed to create RepoManager")
+	}
+	return rm, nil
+}
diff --git a/autoroll/go/roller/config_test.go b/autoroll/go/roller/config_test.go
index dfb7217..d5e7dcf 100644
--- a/autoroll/go/roller/config_test.go
+++ b/autoroll/go/roller/config_test.go
@@ -9,6 +9,7 @@
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	"go.skia.org/infra/autoroll/go/codereview"
+	"go.skia.org/infra/autoroll/go/commit_msg"
 	"go.skia.org/infra/autoroll/go/config_vars"
 	"go.skia.org/infra/autoroll/go/repo_manager"
 	"go.skia.org/infra/go/deepequal/assertdeep"
@@ -19,15 +20,18 @@
 // validBaseConfig returns a minimal valid AutoRollerConfig.
 func validBaseConfig() *AutoRollerConfig {
 	return &AutoRollerConfig{
-		ChildName:       "childName",
-		Contacts:        []string{"me@gmail.com"},
-		OwnerPrimary:    "me",
-		OwnerSecondary:  "you",
-		ParentName:      "parentName",
-		ParentWaterfall: "parentWaterfall",
-		RollerName:      "test-roller",
-		ServiceAccount:  "test-account@google.com",
-		Sheriff:         []string{"sheriff@gmail.com"},
+		ChildDisplayName: "childDisplayName",
+		CommitMsgConfig: &commit_msg.CommitMsgConfig{
+			Template: commit_msg.TmplNameDefault,
+		},
+		Contacts:          []string{"me@gmail.com"},
+		OwnerPrimary:      "me",
+		OwnerSecondary:    "you",
+		ParentDisplayName: "parentName",
+		ParentWaterfall:   "parentWaterfall",
+		RollerName:        "test-roller",
+		ServiceAccount:    "test-account@google.com",
+		Sheriff:           []string{"sheriff@gmail.com"},
 		Gerrit: &codereview.GerritConfig{
 			URL:     "https://gerrit",
 			Project: "my/project",
@@ -67,8 +71,8 @@
 	// Test cases.
 
 	testErr(func(c *AutoRollerConfig) {
-		c.ChildName = ""
-	}, "ChildName is required.")
+		c.ChildDisplayName = ""
+	}, "ChildDisplayName is required.")
 
 	testErr(func(c *AutoRollerConfig) {
 		c.Contacts = []string{}
@@ -79,8 +83,8 @@
 	}, "Exactly one of Gerrit, Github, or Google3Review is required.")
 
 	testErr(func(c *AutoRollerConfig) {
-		c.ParentName = ""
-	}, "ParentName is required.")
+		c.ParentDisplayName = ""
+	}, "ParentDisplayName is required.")
 
 	testErr(func(c *AutoRollerConfig) {
 		c.ParentWaterfall = ""
@@ -150,10 +154,6 @@
 	// Test cases.
 
 	testNoErr(func(c *AutoRollerConfig) {
-		c.CqExtraTrybots = []string{"extra-bot"}
-	})
-
-	testNoErr(func(c *AutoRollerConfig) {
 		c.MaxRollFrequency = "1h"
 	})
 
@@ -207,7 +207,6 @@
 
 	test()
 
-	a.CqExtraTrybots = []string{"extra-bot"}
 	a.MaxRollFrequency = "1h"
 	a.Notifiers = []*notifier.Config{
 		{
diff --git a/autoroll/go/roller/sheriff.go b/autoroll/go/roller/sheriff.go
index 1a9e86e..21becb7 100644
--- a/autoroll/go/roller/sheriff.go
+++ b/autoroll/go/roller/sheriff.go
@@ -11,8 +11,8 @@
 	"go.skia.org/infra/go/sklog"
 )
 
-// Update the current sheriff list.
-func getSheriff(parentName, childName, metricsName string, sheriffSources, backupSheriffs []string) ([]string, error) {
+// GetSheriff retrieves the current sheriff list.
+func GetSheriff(metricsName string, sheriffSources, backupSheriffs []string) ([]string, error) {
 	tags := map[string]string{
 		"roller": metricsName,
 	}
diff --git a/go/gerrit/gerrit.go b/go/gerrit/gerrit.go
index 0cef2d1..ebd190d 100644
--- a/go/gerrit/gerrit.go
+++ b/go/gerrit/gerrit.go
@@ -109,28 +109,32 @@
 
 // ChangeInfo contains information about a Gerrit issue.
 type ChangeInfo struct {
-	Id              string                 `json:"id"`
-	Insertions      int                    `json:"insertions"`
-	Deletions       int                    `json:"deletions"`
-	Created         time.Time              `json:"-"`
-	CreatedString   string                 `json:"created"`
-	Updated         time.Time              `json:"-"`
-	UpdatedString   string                 `json:"updated"`
-	Submitted       time.Time              `json:"-"`
-	SubmittedString string                 `json:"submitted"`
-	Project         string                 `json:"project"`
-	ChangeId        string                 `json:"change_id"`
-	Subject         string                 `json:"subject"`
-	Branch          string                 `json:"branch"`
-	Committed       bool                   `json:"committed"`
-	Revisions       map[string]*Revision   `json:"revisions"`
-	Patchsets       []*Revision            `json:"-"`
-	MoreChanges     bool                   `json:"_more_changes"`
-	Issue           int64                  `json:"_number"`
-	Labels          map[string]*LabelEntry `json:"labels"`
-	Owner           *Owner                 `json:"owner"`
-	Status          string                 `json:"status"`
-	WorkInProgress  bool                   `json:"work_in_progress"`
+	Id              string    `json:"id"`
+	Insertions      int       `json:"insertions"`
+	Deletions       int       `json:"deletions"`
+	Created         time.Time `json:"-"`
+	CreatedString   string    `json:"created"`
+	Updated         time.Time `json:"-"`
+	UpdatedString   string    `json:"updated"`
+	Submitted       time.Time `json:"-"`
+	SubmittedString string    `json:"submitted"`
+	Project         string    `json:"project"`
+	ChangeId        string    `json:"change_id"`
+	Subject         string    `json:"subject"`
+	Branch          string    `json:"branch"`
+	Committed       bool      `json:"committed"`
+	Reviewers       struct {
+		CC       []*Person `json:"CC"`
+		Reviewer []*Person `json:"REVIEWER"`
+	} `json:"reviewers"`
+	Revisions      map[string]*Revision   `json:"revisions"`
+	Patchsets      []*Revision            `json:"-"`
+	MoreChanges    bool                   `json:"_more_changes"`
+	Issue          int64                  `json:"_number"`
+	Labels         map[string]*LabelEntry `json:"labels"`
+	Owner          *Person                `json:"owner"`
+	Status         string                 `json:"status"`
+	WorkInProgress bool                   `json:"work_in_progress"`
 }
 
 // Find the set of non-trivial patchsets. Returns the Revisions in order of
@@ -185,9 +189,11 @@
 	return ci.Status == CHANGE_STATUS_MERGED
 }
 
-// Owner gathers the owner information of a ChangeInfo instance. Some fields omitted.
-type Owner struct {
-	Email string `json:"email"`
+// Person describes a person in Gerrit.
+type Person struct {
+	AccountID int    `json:"_account_id"`
+	Email     string `json:"email"`
+	Name      string `json:"name"`
 }
 
 type LabelEntry struct {
@@ -489,6 +495,8 @@
 type CommitInfo struct {
 	Commit  string        `json:"commit"`
 	Parents []*CommitInfo `json:"parents"`
+	Subject string        `json:"subject"`
+	Message string        `json:"message"`
 }
 
 // GetCommit retrieves the commit that corresponds to the patch identified by issue and revision.
diff --git a/golden/go/code_review/gerrit_crs/gerrit_crs_test.go b/golden/go/code_review/gerrit_crs/gerrit_crs_test.go
index 2de8dab..1712d4e 100644
--- a/golden/go/code_review/gerrit_crs/gerrit_crs_test.go
+++ b/golden/go/code_review/gerrit_crs/gerrit_crs_test.go
@@ -308,7 +308,7 @@
 		MoreChanges: false,
 		Issue:       235460,
 		// Labels omitted because it's complex and not needed
-		Owner: &gerrit.Owner{
+		Owner: &gerrit.Person{
 			Email: "test@example.com",
 		},
 		Status:         "NEW",
diff --git a/sk8s/go/bot_config/swarming/swarming.go b/sk8s/go/bot_config/swarming/swarming.go
index 212041a..0682a25 100644
--- a/sk8s/go/bot_config/swarming/swarming.go
+++ b/sk8s/go/bot_config/swarming/swarming.go
@@ -49,7 +49,7 @@
 	// KubernetesImageEnvVar is the environment variable that contains the
 	// daemonset image name.
 	//
-	// See https://skia.googlesource.com/k8s-config/+/refs/heads/master/skolo-rack4/rpi-swarming-daemonset.yaml
+	// See https://skia.googlesource.com/k8s-config/+show/refs/heads/master/skolo-rack4/rpi-swarming-daemonset.yaml
 	// where IMAGE_NAME is set.
 	KubernetesImageEnvVar = "IMAGE_NAME"
 )