16b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# Copyright (c) 2009 Google Inc. All rights reserved. 26b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# Copyright (c) 2009 Apple Inc. All rights reserved. 36b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# Copyright (c) 2010 Research In Motion Limited. All rights reserved. 46b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# 56b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# Redistribution and use in source and binary forms, with or without 66b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# modification, are permitted provided that the following conditions are 76b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# met: 86b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# 96b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# * Redistributions of source code must retain the above copyright 106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# notice, this list of conditions and the following disclaimer. 116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# * Redistributions in binary form must reproduce the above 126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# copyright notice, this list of conditions and the following disclaimer 136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# in the documentation and/or other materials provided with the 146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# distribution. 156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# * Neither the name of Google Inc. nor the names of its 166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# contributors may be used to endorse or promote products derived from 176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# this software without specific prior written permission. 186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# 196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerfrom webkitpy.common.system.deprecated_logging import log 326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerclass Attachment(object): 356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner rollout_preamble = "ROLLOUT of r" 376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def __init__(self, attachment_dictionary, bug): 396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner self._attachment_dictionary = attachment_dictionary 406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner self._bug = bug 416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner self._reviewer = None 426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner self._committer = None 436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def _bugzilla(self): 456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return self._bug._bugzilla 466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def id(self): 486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return int(self._attachment_dictionary.get("id")) 496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def attacher_is_committer(self): 516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return self._bugzilla.committers.committer_by_email( 526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner patch.attacher_email()) 536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def attacher_email(self): 556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return self._attachment_dictionary.get("attacher_email") 566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def bug(self): 586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return self._bug 596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def bug_id(self): 616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return int(self._attachment_dictionary.get("bug_id")) 626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def is_patch(self): 646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return not not self._attachment_dictionary.get("is_patch") 656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def is_obsolete(self): 676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return not not self._attachment_dictionary.get("is_obsolete") 686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def is_rollout(self): 706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return self.name().startswith(self.rollout_preamble) 716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def name(self): 736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return self._attachment_dictionary.get("name") 746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def attach_date(self): 766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return self._attachment_dictionary.get("attach_date") 776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def review(self): 796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return self._attachment_dictionary.get("review") 806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def commit_queue(self): 826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return self._attachment_dictionary.get("commit-queue") 836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def url(self): 856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner # FIXME: This should just return 866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner # self._bugzilla().attachment_url_for_id(self.id()). scm_unittest.py 876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner # depends on the current behavior. 886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return self._attachment_dictionary.get("url") 896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def contents(self): 916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner # FIXME: We shouldn't be grabbing at _bugzilla. 926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return self._bug._bugzilla.fetch_attachment_contents(self.id()) 936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def _validate_flag_value(self, flag): 956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner email = self._attachment_dictionary.get("%s_email" % flag) 966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if not email: 976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return None 986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner committer = getattr(self._bugzilla().committers, 996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner "%s_by_email" % flag)(email) 1006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if committer: 1016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return committer 1026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner log("Warning, attachment %s on bug %s has invalid %s (%s)" % ( 1036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner self._attachment_dictionary['id'], 1046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner self._attachment_dictionary['bug_id'], flag, email)) 1056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def reviewer(self): 1076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if not self._reviewer: 1086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner self._reviewer = self._validate_flag_value("reviewer") 1096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return self._reviewer 1106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner def committer(self): 1126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if not self._committer: 1136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner self._committer = self._validate_flag_value("committer") 1146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return self._committer 115