From e9373d6e92957c70d9ccc5595c5dc0855fbb6a18 Mon Sep 17 00:00:00 2001 From: Aaron Gable Date: Tue, 13 Dec 2016 12:28:45 -0800 Subject: [PATCH] Clean up after failed gerrit cl description edits If either the edit creation or edit publishing fail, we're left with an unpublished edit hanging around. This can result in a follow-up invocation of 'git cl desc' (e.g. if the user changes their mind, or retries) will also fail. So, clean up after ourselves. BUG=671091 Change-Id: Icfe53996acf2555b82be0695a3c86ebb8c50b936 Reviewed-on: https://chromium-review.googlesource.com/418449 Reviewed-by: Andrii Shyshkalov Commit-Queue: Aaron Gable --- gerrit_util.py | 65 +++++++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/gerrit_util.py b/gerrit_util.py index cd2102ccb..07218f011 100755 --- a/gerrit_util.py +++ b/gerrit_util.py @@ -602,35 +602,46 @@ def DeletePendingChangeEdit(host, change): def SetCommitMessage(host, change, description, notify='ALL'): """Updates a commit message.""" - 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, ignore_404=False) - except GerritError as e: - # On success, gerrit returns status 204; anything else is an error. - if e.http_status != 204: - raise - else: - raise GerritError( - 'Unexpectedly received a 200 http status while editing message in ' - 'change %s' % change) + 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, ignore_404=False) + except GerritError as e: + # On success, gerrit returns status 204; anything else is an error. + if e.http_status != 204: + raise + else: + raise GerritError( + 'Unexpectedly received a 200 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, ignore_404=False) - except GerritError as e: - # On success, gerrit returns status 204; anything else is an error. - if e.http_status != 204: - raise - else: - raise GerritError( - 'Unexpectedly received a 200 http status while publishing message ' - 'change in %s' % change) + # And then publish it. + path = 'changes/%s/edit:publish' % change + conn = CreateHttpConn(host, path, reqtype='POST', body={'notify': notify}) + try: + ReadHttpResponse(conn, ignore_404=False) + except GerritError as e: + # On success, gerrit returns status 204; anything else is an error. + if e.http_status != 204: + raise + else: + raise GerritError( + 'Unexpectedly received a 200 http status while publishing message ' + 'change in %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 def GetReviewers(host, change):