From c7a9efad97c608b7604604ca0f5447dc8c049ad3 Mon Sep 17 00:00:00 2001 From: "phajdan.jr@chromium.org" Date: Fri, 20 Sep 2013 19:38:39 +0000 Subject: [PATCH] GTTF: Add ReadOnlyRietveld similar to one currently in CQ codebase. This will replace the CQ one and allow it to stay in sync with Rietveld. For now I've only covered methods that CQ seems to touch. BUG=291335 Review URL: https://chromiumcodereview.appspot.com/24095007 git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@224455 0039d316-1c4b-4281-b951-d872f2087c98 --- rietveld.py | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/rietveld.py b/rietveld.py index e412a2804..dc8404f08 100644 --- a/rietveld.py +++ b/rietveld.py @@ -445,3 +445,77 @@ class CachingRietveld(Rietveld): 'get_patchset_properties', (issue, patchset), super(CachingRietveld, self).get_patchset_properties) + + +class ReadOnlyRietveld(object): + """ + Only provides read operations, and simulates writes locally. + + Intentionally do not inherit from Rietveld to avoid any write-issuing + logic to be invoked accidentally. + """ + + # Dictionary of local changes, indexed by issue number as int. + _local_changes = {} + + def __init__(self, *args, **kwargs): + # We still need an actual Rietveld instance to issue reads, just keep + # it hidden. + self._rietveld = Rietveld(*args, **kwargs) + + @classmethod + def _get_local_changes(cls, issue): + """Returns dictionary of local changes for |issue|, if any.""" + return cls._local_changes.get(issue, {}) + + @property + def url(self): + return self._rietveld.url + + @property + def email(self): + return self._rietveld.email + + def get_pending_issues(self): + pending_issues = self._rietveld.get_pending_issues() + + # Filter out issues we've closed or unchecked the commit checkbox. + return [issue for issue in pending_issues + if not self._get_local_changes(issue).get('closed', False) and + self._get_local_changes(issue).get('commit', True)] + + def close_issue(self, issue): # pylint:disable=R0201 + logging.info('ReadOnlyRietveld: closing issue %d' % issue) + ReadOnlyRietveld._local_changes.setdefault(issue, {})['closed'] = True + + def get_issue_properties(self, issue, messages): + data = self._rietveld.get_issue_properties(issue, messages) + data.update(self._get_local_changes(issue)) + return data + + def get_patchset_properties(self, issue, patchset): + return self._rietveld.get_patchset_properties(issue, patchset) + + def get_patch(self, issue, patchset): + return self._rietveld.get_patch(issue, patchset) + + def update_description(self, issue, description): # pylint:disable=R0201 + logging.info('ReadOnlyRietveld: new description for issue %d: %s' % + (issue, description)) + + def add_comment(self, # pylint:disable=R0201 + issue, + message, + add_as_reviewer=False): + logging.info('ReadOnlyRietveld: posting comment "%s" to issue %d' % + (message, issue)) + + def set_flag(self, issue, patchset, flag, value): # pylint:disable=R0201 + logging.info('ReadOnlyRietveld: setting flag "%s" to "%s" for issue %d' % + (flag, value, issue)) + ReadOnlyRietveld._local_changes.setdefault(issue, {})[flag] = value + + def trigger_try_jobs( # pylint:disable=R0201 + self, issue, patchset, reason, clobber, revision, builders_and_tests): + logging.info('ReadOnlyRietveld: triggering try jobs %r for issue %d' % + (builders_and_tests, issue))