From c0b332a8cbd4bcae97e41e1dc166cd52975827f4 Mon Sep 17 00:00:00 2001 From: "bradnelson@google.com" Date: Thu, 26 Aug 2010 00:30:37 +0000 Subject: [PATCH] Adding json based tree open check. BUG=None TEST=None Review URL: http://codereview.chromium.org/3107038 git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@57438 0039d316-1c4b-4281-b951-d872f2087c98 --- presubmit_canned_checks.py | 42 ++++++++++++++++++++++------- tests/presubmit_unittest.py | 54 ++++++++++++++++++++++++++++++------- 2 files changed, 77 insertions(+), 19 deletions(-) diff --git a/presubmit_canned_checks.py b/presubmit_canned_checks.py index 9588fb0eb..e6ae9d69e 100644 --- a/presubmit_canned_checks.py +++ b/presubmit_canned_checks.py @@ -349,19 +349,41 @@ def CheckDoNotSubmit(input_api, output_api): ) -def CheckTreeIsOpen(input_api, output_api, url, closed): - """Checks that an url's content doesn't match a regexp that would mean that - the tree is closed.""" +def CheckTreeIsOpen(input_api, output_api, + url=None, closed=None, json_url=None): + """Check whether to allow commit without prompt. + + Supports two styles: + 1. Checks that an url's content doesn't match a regexp that would mean that + the tree is closed. (old) + 2. Check the json_url to decide whether to allow commit without prompt. + Args: + input_api: input related apis. + output_api: output related apis. + url: url to use for regex based tree status. + closed: regex to match for closed status. + json_url: url to download json style status. + """ if not input_api.is_committing: return [] try: - connection = input_api.urllib2.urlopen(url) - status = connection.read() - connection.close() - if input_api.re.match(closed, status, input_api.re.IGNORECASE): - long_text = status + '\n' + url - return [output_api.PresubmitError('The tree is closed dude!', - long_text=long_text)] + if json_url: + connection = input_api.urllib2.urlopen(json_url) + status = input_api.json.loads(connection.read()) + connection.close() + if not status['can_commit_freely']: + short_text = 'Tree state is: ' + status['general_state'] + long_text = status['message'] + '\n' + json_url + return [output_api.PresubmitError(short_text, long_text=long_text)] + else: + # TODO(bradnelson): drop this once all users are gone. + connection = input_api.urllib2.urlopen(url) + status = connection.read() + connection.close() + if input_api.re.match(closed, status): + long_text = status + '\n' + url + return [output_api.PresubmitError('The tree is closed.', + long_text=long_text)] except IOError: pass return [] diff --git a/tests/presubmit_unittest.py b/tests/presubmit_unittest.py index 7928a2480..eddae18e2 100755 --- a/tests/presubmit_unittest.py +++ b/tests/presubmit_unittest.py @@ -71,8 +71,8 @@ class PresubmitUnittest(PresubmitTestsBase): 'SvnAffectedFile', 'SvnChange', 'cPickle', 'cStringIO', 'exceptions', 'fnmatch', 'gcl', 'gclient_utils', 'glob', 'json', 'logging', 'marshal', 'normpath', 'optparse', 'os', 'pickle', - 'presubmit_canned_checks', 'random', 're', 'scm', 'subprocess', 'sys', - 'tempfile', 'time', 'traceback', 'types', 'unittest', 'urllib2', + 'presubmit_canned_checks', 'random', 're', 'scm', 'subprocess', + 'sys', 'tempfile', 'time', 'traceback', 'types', 'unittest', 'urllib2', 'warnings', ] # If this test fails, you should add the relevant test. @@ -616,9 +616,8 @@ class InputApiUnittest(PresubmitTestsBase): 'PresubmitLocalPath', 'ReadFile', 'RightHandSideLines', 'ServerPaths', 'basename', 'cPickle', 'cStringIO', 'canned_checks', 'change', 'environ', 'is_committing', 'json', 'marshal', 'os_path', 'pickle', 'platform', - 'python_executable', - 're', 'subprocess', 'tempfile', 'traceback', 'unittest', 'urllib2', - 'version', + 'python_executable', 're', 'subprocess', 'tempfile', 'traceback', + 'unittest', 'urllib2', 'version', ] # If this test fails, you should add the relevant test. self.compareMembers(presubmit.InputApi(None, './.', False), members) @@ -1507,22 +1506,59 @@ class CannedChecksUnittest(PresubmitTestsBase): input_api = self.MockInputApi(None, True) connection = self.mox.CreateMockAnything() input_api.urllib2.urlopen('url_to_open').AndReturn(connection) - connection.read().AndReturn('1') + connection.read().AndReturn('The tree is open') connection.close() self.mox.ReplayAll() results = presubmit_canned_checks.CheckTreeIsOpen( - input_api, presubmit.OutputApi, url='url_to_open', closed='0') + input_api, presubmit.OutputApi, url='url_to_open', closed='.*closed.*') self.assertEquals(results, []) def testCannedCheckTreeIsOpenClosed(self): input_api = self.MockInputApi(None, True) connection = self.mox.CreateMockAnything() input_api.urllib2.urlopen('url_to_closed').AndReturn(connection) - connection.read().AndReturn('0') + connection.read().AndReturn('Tree is closed for maintenance') connection.close() self.mox.ReplayAll() results = presubmit_canned_checks.CheckTreeIsOpen( - input_api, presubmit.OutputApi, url='url_to_closed', closed='0') + input_api, presubmit.OutputApi, + url='url_to_closed', closed='.*closed.*') + self.assertEquals(len(results), 1) + self.assertEquals(results[0].__class__, + presubmit.OutputApi.PresubmitError) + + def testCannedCheckJsonTreeIsOpenOpen(self): + input_api = self.MockInputApi(None, True) + input_api.json = presubmit.json + connection = self.mox.CreateMockAnything() + input_api.urllib2.urlopen('url_to_open').AndReturn(connection) + status = { + 'can_commit_freely': True, + 'general_state': 'open', + 'message': 'The tree is open' + } + connection.read().AndReturn(input_api.json.dumps(status)) + connection.close() + self.mox.ReplayAll() + results = presubmit_canned_checks.CheckTreeIsOpen( + input_api, presubmit.OutputApi, json_url='url_to_open') + self.assertEquals(results, []) + + def testCannedCheckJsonTreeIsOpenClosed(self): + input_api = self.MockInputApi(None, True) + input_api.json = presubmit.json + connection = self.mox.CreateMockAnything() + input_api.urllib2.urlopen('url_to_closed').AndReturn(connection) + status = { + 'can_commit_freely': False, + 'general_state': 'closed', + 'message': 'The tree is close', + } + connection.read().AndReturn(input_api.json.dumps(status)) + connection.close() + self.mox.ReplayAll() + results = presubmit_canned_checks.CheckTreeIsOpen( + input_api, presubmit.OutputApi, json_url='url_to_closed') self.assertEquals(len(results), 1) self.assertEquals(results[0].__class__, presubmit.OutputApi.PresubmitError)