[skcq] Detect and post a better comment when merge conflicts occur

Before: https://screenshot.googleplex.com/5xoSVhpot6prPLz
After: https://screenshot.googleplex.com/4z4godsh4WVyZSV

Bug: skia:12279
Change-Id: I7c1cda4475a59f00ad7147e578b75d1e929ac00b
Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/433376
Reviewed-by: Eric Boren <borenet@google.com>
Commit-Queue: Ravi Mistry <rmistry@google.com>
diff --git a/autoroll/go/codereview/roll.go b/autoroll/go/codereview/roll.go
index 7919460..bd386bd 100644
--- a/autoroll/go/codereview/roll.go
+++ b/autoroll/go/codereview/roll.go
@@ -26,10 +26,6 @@
 	// GitHubPRDurationForChecks is the duration after a PR is created that
 	// checks should be looked at.
 	GitHubPRDurationForChecks = time.Minute * 15
-
-	// ErrMergeConflict as a substring of an error message indicates that a
-	// merge conflict occurred.
-	ErrMergeConflict = "conflict during merge"
 )
 
 // RollImpl describes the behavior of an autoroll CL.
@@ -255,7 +251,7 @@
 	} else if rollCommit.Parents[0].Commit != head.Hash {
 		sklog.Infof("HEAD is %s and CL is based on %s; attempting rebase.", head.Hash, rollCommit.Parents[0].Commit)
 		if err := r.g.Rebase(ctx, r.ci, "", false); err != nil {
-			if strings.Contains(err.Error(), ErrMergeConflict) {
+			if strings.Contains(err.Error(), gerrit.ErrMergeConflict) {
 				if err2 := r.g.Abandon(ctx, r.ci, "Failed to rebase due to merge conflict; closing CL."); err2 != nil {
 					return skerr.Wrapf(err, "failed to rebase due to merge conflict and failed to abandon CL with: %s", err2)
 				}
diff --git a/go/gerrit/gerrit.go b/go/gerrit/gerrit.go
index e589b20..361d004 100644
--- a/go/gerrit/gerrit.go
+++ b/go/gerrit/gerrit.go
@@ -166,6 +166,10 @@
 	//                |
 	//                +-> Last two digits of Issue ID.
 	ChangeRefPrefix = "refs/changes/"
+
+	// ErrMergeConflict as a substring of an error message indicates that a
+	// merge conflict occurred.
+	ErrMergeConflict = "conflict during merge"
 )
 
 var (
diff --git a/skcq/go/poller/poller.go b/skcq/go/poller/poller.go
index ecea5b0..cfd90f9 100644
--- a/skcq/go/poller/poller.go
+++ b/skcq/go/poller/poller.go
@@ -241,8 +241,13 @@
 			cr.RemoveFromCQ(ctx, ci, removeFromCQMsg)
 		} else {
 			if err := cr.Submit(ctx, ci); err != nil {
-				sklog.Errorf("[%d] Error when submitting: %s", ci.Issue, err)
-				cr.RemoveFromCQ(ctx, ci, "Error when submitting. Removing from SkCQ. Please ask Infra Gardener to investigate.")
+				if strings.Contains(err.Error(), gerrit.ErrMergeConflict) {
+					sklog.Infof("[%d] Gerrit rejected submission due to merge conflict: %s", ci.Issue, err.Error())
+					cr.RemoveFromCQ(ctx, ci, fmt.Sprintf("Gerrit rejected submission due to merge conflict.\n\nHint: Rebasing CL in Gerrit UI and re-submitting through SkCQ usually works."))
+				} else {
+					sklog.Errorf("[%d] Error when submitting: %s", ci.Issue, err)
+					cr.RemoveFromCQ(ctx, ci, "Error when submitting. Removing from SkCQ. Please ask Infra Gardener to investigate.")
+				}
 			} else {
 				cqSubmittedTime = time.Now().Unix()
 				tm.UpdateThrottler(repoBranch, time.Now(), skCQCfg.ThrottlerCfg)