git-cl-description: use atomic edit API

https://gerrit-review.googlesource.com/c/110057/ has been deployed,
so this change can now take advantage of that new API to make
git-cl-description more reliable.

Both the API to add content to a change edit and to publish a
change edit return '204 No Content' on a successful call, but this
API returns 200. It seems likely to me that one or the other will
change, so this calling code accepts both codes for future-proofness.

Bug: gerrit:5099
Change-Id: I14d5323f92c807036f8aa11b314d10706c51dbf5
Reviewed-on: https://chromium-review.googlesource.com/544118
Commit-Queue: Aaron Gable <agable@chromium.org>
Reviewed-by: Robbie Iannucci <iannucci@chromium.org>
Reviewed-by: Andrii Shyshkalov <tandrii@chromium.org>
diff --git a/gerrit_util.py b/gerrit_util.py
index f2020be..bd3043d 100755
--- a/gerrit_util.py
+++ b/gerrit_util.py
@@ -612,41 +612,17 @@
 
 def SetCommitMessage(host, change, description, notify='ALL'):
   """Updates a commit message."""
+  assert notify in ('ALL', 'NONE')
+  path = 'changes/%s/message' % change
+  body = {'message': description}
+  conn = CreateHttpConn(host, path, reqtype='PUT', body=body)
   try:
-    assert notify in ('ALL', 'NONE')
-    # First, edit the commit message in a draft.
-    path = 'changes/%s/edit:message' % change
-    body = {'message': description}
-    conn = CreateHttpConn(host, path, reqtype='PUT', body=body)
-    try:
-      ReadHttpResponse(conn, accept_statuses=[204])
-    except GerritError as e:
-      raise GerritError(
-          e.http_status,
-          'Received unexpected http status while editing message '
-          'in change %s' % change)
-
-    # And then publish it.
-    path = 'changes/%s/edit:publish' % change
-    conn = CreateHttpConn(host, path, reqtype='POST', body={'notify': notify})
-    try:
-      ReadHttpResponse(conn, accept_statuses=[204])
-    except GerritError as e:
-      raise GerritError(
-          e.http_status,
-          'Received unexpected http status while publishing message '
-          'in change %s' % change)
-
-  except (GerritError, KeyboardInterrupt) as e:
-    # Something went wrong with one of the two calls, so we want to clean up
-    # after ourselves before returning.
-    try:
-      DeletePendingChangeEdit(host, change)
-    except GerritError:
-      LOGGER.error('Encountered error while cleaning up after failed attempt '
-                   'to set the CL description. You may have to delete the '
-                   'pending change edit yourself in the web UI.')
-    raise e
+    ReadHttpResponse(conn, accept_statuses=[200, 204])
+  except GerritError as e:
+    raise GerritError(
+        e.http_status,
+        'Received unexpected http status while editing message '
+        'in change %s' % change)
 
 
 def GetReviewers(host, change):