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