[gerrit] Add more gerrit API wrappers

Add helpers to gerrit_util for:

  * Setting the commit message on a ChangeEdit,
  * Creating a cherry-pick,
  * Getting the contents of a file in a change.

Bug: v8:12849
Change-Id: I1a5de3054a366d480def32942fd42be179ffb749
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/3683383
Auto-Submit: Leszek Swirski <leszeks@chromium.org>
Reviewed-by: Aravind Vasudevan <aravindvasudev@google.com>
Commit-Queue: Aravind Vasudevan <aravindvasudev@google.com>
diff --git a/gerrit_util.py b/gerrit_util.py
index d4ce895..fea3862 100644
--- a/gerrit_util.py
+++ b/gerrit_util.py
@@ -782,6 +782,14 @@
   return ReadHttpJsonResponse(conn, accept_statuses=(204, 409))
 
 
+def SetChangeEditMessage(host, change, message):
+  """Sets the commit message of a change edit."""
+  path = 'changes/%s/edit:message' % change
+  body = {'message': message}
+  conn = CreateHttpConn(host, path, reqtype='PUT', body=body)
+  return ReadHttpJsonResponse(conn, accept_statuses=(204, 409))
+
+
 def HasPendingChangeEdit(host, change):
   conn = CreateHttpConn(host, 'changes/%s/edit' % change)
   try:
@@ -801,6 +809,28 @@
   ReadHttpResponse(conn, accept_statuses=[204, 404])
 
 
+def CherryPick(host, change, destination, revision='current'):
+  """Create a cherry-pick commit from the given change, onto the given
+  destination.
+  """
+  path = 'changes/%s/revisions/%s/cherrypick' % (change, revision)
+  body = {'destination': destination}
+  conn = CreateHttpConn(host, path, reqtype='POST', body=body)
+  return ReadHttpJsonResponse(conn)
+
+
+def GetFileContents(host, change, path):
+  """Get the contents of a file with the given path in the given revision.
+
+  Returns:
+    A bytes object with the file's contents.
+  """
+  path = 'changes/%s/revisions/current/files/%s/content' % (
+      change, urllib.parse.quote(path, ''))
+  conn = CreateHttpConn(host, path, reqtype='GET')
+  return base64.b64decode(ReadHttpResponse(conn).read())
+
+
 def SetCommitMessage(host, change, description, notify='ALL'):
   """Updates a commit message."""
   assert notify in ('ALL', 'NONE')