Add "gerrit deletedraft".

BUG=None
TEST=Run manually on a draft patch set

Change-Id: I2b98729bfce62798a3b45326152ee4498afe96ba
Reviewed-on: https://chromium-review.googlesource.com/189183
Reviewed-by: Jon Salz <jsalz@chromium.org>
Commit-Queue: Jon Salz <jsalz@chromium.org>
Tested-by: Jon Salz <jsalz@chromium.org>
diff --git a/lib/gerrit.py b/lib/gerrit.py
index 9704f49..ded8176 100644
--- a/lib/gerrit.py
+++ b/lib/gerrit.py
@@ -336,6 +336,14 @@
       return
     gob_util.RestoreChange(self.host, self._to_changenum(change))
 
+  def DeleteDraft(self, change, dryrun=False):
+    """Delete a draft patch set."""
+    if dryrun:
+      logging.info('Would have deleted draft patch set %s', change)
+      return
+    gob_util.DeleteDraft(self.host, self._to_changenum(change))
+
+
 
 def GetGerritPatchInfo(patches):
   """Query Gerrit server for patch information.
diff --git a/lib/gob_util.py b/lib/gob_util.py
index ee8ffc9..10b35e5 100644
--- a/lib/gob_util.py
+++ b/lib/gob_util.py
@@ -297,6 +297,22 @@
   return FetchUrlJson(host, path, reqtype='POST', body=body, ignore_404=False)
 
 
+def DeleteDraft(host, change, msg=''):
+  """Delete a gerrit draft patch set."""
+  path = 'changes/%s' % change
+  body = {'message': msg} if msg else None
+  try:
+    FetchUrl(host, path, reqtype='DELETE', body=body, ignore_404=False)
+  except GOBError as e:
+    # On success, gerrit returns status 204; anything else is an error.
+    if e.http_status != 204:
+      raise
+  else:
+    raise GOBError(
+        'Unexpectedly received a 200 http status while deleting draft %r'
+        % change)
+
+
 def SubmitChange(host, change, wait_for_merge=True):
   """Submits a gerrit change via Gerrit."""
   path = 'changes/%s/submit' % change
diff --git a/scripts/gerrit.py b/scripts/gerrit.py
index 604a53f..0c9d9e1 100644
--- a/scripts/gerrit.py
+++ b/scripts/gerrit.py
@@ -270,6 +270,11 @@
   opts.gerrit.SetReview(idx, msg=message)
 
 
+def UserActDeletedraft(opts, idx):
+  """Delete draft patch set <n>"""
+  opts.gerrit.DeleteDraft(idx)
+
+
 def main(argv):
   # Locate actions that are exposed to the user.  All functions that start
   # with "UserAct" are fair game.