[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc
dbates at webkit.org
dbates at webkit.org
Wed Dec 22 13:50:58 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit 77ddff2909292ff2f1048ca74052851c8c8712d4
Author: dbates at webkit.org <dbates at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Tue Sep 28 06:39:16 2010 +0000
2010-09-27 Daniel Bates <dbates at rim.com>
Reviewed by Adam Barth.
sheriffbot can't roll out security patches
https://bugs.webkit.org/show_bug.cgi?id=39136
Make SheriffBot determine if it's authorized to view a bug
whose change it wants to rollout before it tries to rollout
the change.
Moreover, make both webkit-patch and Sheriffbot provide human-
readable error messages when they are not authorized to view
a bug and when a bug number is invalid.
Currently, Sheriffbot does not parse Bugzilla bugs for
<bug error="...">, which indicates an error when retrieving
a bug. In particular, error="NotPermitted" if a person (or bot)
is not authorized to view a bug. For such error="NotPermitted" bugs,
Sheriffbot raises an exception when parsing the bug report and
this exception does not explicitly indicate Sheriffbot's lack
of authorization. Instead, Sheriffbot should explicitly check
for the presence <bug error="..."> before operating on a bug
and error with a human-readable message if it's not permitted
to view it.
* Scripts/webkitpy/common/net/bugzilla.py: Added BugzillaError class.
* Scripts/webkitpy/common/net/bugzilla_unittest.py:
- Added unit test test_bug_parsing_for_bugzilla_not_permitted_error().
- Added unit test test_bug_parsing_for_bugzilla_not_found_error().
- Added unit test test_bug_parsing_for_bugzilla_invalid_bug_id_error().
* Scripts/webkitpy/tool/bot/sheriff.py: Modified to catch BugzillaError.
* Scripts/webkitpy/tool/commands/download.py: Ditto.
* Scripts/webkitpy/tool/commands/queues.py: Ditto.
* Scripts/webkitpy/tool/commands/upload.py: Ditto.
* Scripts/webkitpy/tool/steps/closebug.py: Ditto.
* Scripts/webkitpy/tool/steps/obsoletepatches.py: Ditto.
* Scripts/webkitpy/tool/steps/preparechangelog.py: Ditto.
* Scripts/webkitpy/tool/steps/updatechangelogswithreviewer.py: Ditto.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@68493 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebKitTools/ChangeLog b/WebKitTools/ChangeLog
index a832a73..fadef64 100644
--- a/WebKitTools/ChangeLog
+++ b/WebKitTools/ChangeLog
@@ -1,3 +1,43 @@
+2010-09-27 Daniel Bates <dbates at rim.com>
+
+ Reviewed by Adam Barth.
+
+ sheriffbot can't roll out security patches
+ https://bugs.webkit.org/show_bug.cgi?id=39136
+
+ Make SheriffBot determine if it's authorized to view a bug
+ whose change it wants to rollout before it tries to rollout
+ the change.
+
+ Moreover, make both webkit-patch and Sheriffbot provide human-
+ readable error messages when they are not authorized to view
+ a bug and when a bug number is invalid.
+
+ Currently, Sheriffbot does not parse Bugzilla bugs for
+ <bug error="...">, which indicates an error when retrieving
+ a bug. In particular, error="NotPermitted" if a person (or bot)
+ is not authorized to view a bug. For such error="NotPermitted" bugs,
+ Sheriffbot raises an exception when parsing the bug report and
+ this exception does not explicitly indicate Sheriffbot's lack
+ of authorization. Instead, Sheriffbot should explicitly check
+ for the presence <bug error="..."> before operating on a bug
+ and error with a human-readable message if it's not permitted
+ to view it.
+
+ * Scripts/webkitpy/common/net/bugzilla.py: Added BugzillaError class.
+ * Scripts/webkitpy/common/net/bugzilla_unittest.py:
+ - Added unit test test_bug_parsing_for_bugzilla_not_permitted_error().
+ - Added unit test test_bug_parsing_for_bugzilla_not_found_error().
+ - Added unit test test_bug_parsing_for_bugzilla_invalid_bug_id_error().
+ * Scripts/webkitpy/tool/bot/sheriff.py: Modified to catch BugzillaError.
+ * Scripts/webkitpy/tool/commands/download.py: Ditto.
+ * Scripts/webkitpy/tool/commands/queues.py: Ditto.
+ * Scripts/webkitpy/tool/commands/upload.py: Ditto.
+ * Scripts/webkitpy/tool/steps/closebug.py: Ditto.
+ * Scripts/webkitpy/tool/steps/obsoletepatches.py: Ditto.
+ * Scripts/webkitpy/tool/steps/preparechangelog.py: Ditto.
+ * Scripts/webkitpy/tool/steps/updatechangelogswithreviewer.py: Ditto.
+
2010-09-27 Adam Barth <abarth at webkit.org>
Reviewed by Eric Seidel.
diff --git a/WebKitTools/Scripts/webkitpy/common/net/bugzilla.py b/WebKitTools/Scripts/webkitpy/common/net/bugzilla.py
index cc64fac..f149e2f 100644
--- a/WebKitTools/Scripts/webkitpy/common/net/bugzilla.py
+++ b/WebKitTools/Scripts/webkitpy/common/net/bugzilla.py
@@ -45,6 +45,39 @@ from webkitpy.thirdparty.autoinstalled.mechanize import Browser
from webkitpy.thirdparty.BeautifulSoup import BeautifulSoup, SoupStrainer
+class BugzillaError(Exception):
+
+ def __init__(self, bug_id, error_message=None):
+ Exception.__init__(self, error_message)
+ self.bug_id = bug_id
+ self.error_message = error_message
+
+ def bug_id(self):
+ return self.bug_id
+
+ def error_message(self):
+ return self.error_message
+
+ # The following error messages were extracted from <https://bugs.webkit.org/bugzilla.dtd> as of 09/12/2010.
+
+ def is_invalid_bug_id(self):
+ return self.error_message == "InvalidBugId"
+
+ def is_not_found(self):
+ return self.error_message == "NotFound"
+
+ def is_not_permitted_to_view_bug(self):
+ return self.error_message == "NotPermitted"
+
+ def __str__(self):
+ if self.is_invalid_bug_id():
+ return "Bug %s is invalid" % self.bug_id
+ if self.is_not_found():
+ return "Bug %s does not exist" % self.bug_id
+ if self.is_not_permitted_to_view_bug():
+ return "Not permitted to view bug %s" % self.bug_id
+ return "Bugzilla encountered an error when processing bug %s: '%s'" % (self.bug_id, self.error_message)
+
def parse_bug_id(message):
if not message:
return None
@@ -510,8 +543,12 @@ class Bugzilla(object):
def _parse_bug_page(self, page):
soup = BeautifulSoup(page)
+ bug_element = soup.find("bug")
+ bug_id = soup.find("bug_id").string
+ if bug_element.has_key("error"):
+ raise BugzillaError(bug_id, bug_element["error"])
bug = {}
- bug["id"] = int(soup.find("bug_id").string)
+ bug["id"] = int(bug_id)
bug["title"] = self._string_contents(soup.find("short_desc"))
bug["bug_status"] = self._string_contents(soup.find("bug_status"))
bug["reporter_email"] = self._string_contents(soup.find("reporter"))
diff --git a/WebKitTools/Scripts/webkitpy/common/net/bugzilla_unittest.py b/WebKitTools/Scripts/webkitpy/common/net/bugzilla_unittest.py
index 32f23cd..7e355f2 100644
--- a/WebKitTools/Scripts/webkitpy/common/net/bugzilla_unittest.py
+++ b/WebKitTools/Scripts/webkitpy/common/net/bugzilla_unittest.py
@@ -31,7 +31,7 @@ import unittest
import datetime
from webkitpy.common.config.committers import CommitterList, Reviewer, Committer
-from webkitpy.common.net.bugzilla import Bugzilla, BugzillaQueries, parse_bug_id, CommitterValidator, Bug
+from webkitpy.common.net.bugzilla import Bugzilla, BugzillaError, BugzillaQueries, parse_bug_id, CommitterValidator, Bug
from webkitpy.common.system.outputcapture import OutputCapture
from webkitpy.thirdparty.mock import Mock
from webkitpy.thirdparty.BeautifulSoup import BeautifulSoup
@@ -72,6 +72,14 @@ class CommitterValidatorTest(unittest.TestCase):
self.assertEqual(validator._flag_permission_rejection_message("foo at foo.com", "review"), expected_messsage)
+class BugzillaErrorTest(unittest.TestCase):
+ def test_str(self):
+ self.assertEqual(BugzillaError(bug_id=12345, error_message="InvalidBugId").__str__(), "Bug 12345 is invalid")
+ self.assertEqual(BugzillaError(bug_id=12345, error_message="NotFound").__str__(), "Bug 12345 does not exist")
+ self.assertEqual(BugzillaError(bug_id=12345, error_message="NotPermitted").__str__(), "Not permitted to view bug 12345")
+ self.assertEqual(BugzillaError(bug_id=12345, error_message="Thingamajig broke").__str__(), "Bugzilla encountered an error when processing bug 12345: 'Thingamajig broke'")
+
+
class BugzillaTest(unittest.TestCase):
_example_attachment = '''
<attachment
@@ -141,6 +149,57 @@ class BugzillaTest(unittest.TestCase):
self.assertEquals(None, parse_bug_id("http://www.webkit.org/b/12345"))
self.assertEquals(None, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?ctype=xml&id=12345"))
+ _example_unauthorized_bug = """
+ <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+ <!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/bugzilla.dtd">
+
+ <bugzilla version="3.2.3"
+ urlbase="https://bugs.webkit.org/"
+ maintainer="admin at webkit.org"
+ exporter="unauthorized_person at example.com"
+ >
+
+ <bug error="NotPermitted">
+ <bug_id>12345</bug_id>
+ </bug>
+
+ </bugzilla>
+ """
+
+ _example_not_found_bug = """
+ <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+ <!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/bugzilla.dtd">
+
+ <bugzilla version="3.2.3"
+ urlbase="https://bugs.webkit.org/"
+ maintainer="admin at webkit.org"
+ exporter="unauthorized_person at example.com"
+ >
+
+ <bug error="NotFound">
+ <bug_id>12345</bug_id>
+ </bug>
+
+ </bugzilla>
+ """
+
+ _example_invalid_bug_id_bug = """
+ <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+ <!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/bugzilla.dtd">
+
+ <bugzilla version="3.2.3"
+ urlbase="https://bugs.webkit.org/"
+ maintainer="admin at webkit.org"
+ exporter="unauthorized_person at example.com"
+ >
+
+ <bug error="InvalidBugId">
+ <bug_id>A</bug_id>
+ </bug>
+
+ </bugzilla>
+ """
+
_example_bug = """
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/bugzilla.dtd">
@@ -228,6 +287,33 @@ ZEZpbmlzaExvYWRXaXRoUmVhc29uOnJlYXNvbl07Cit9CisKIEBlbmQKIAogI2VuZGlmCg==
}],
}
+ def test_bug_parsing_for_bugzilla_not_permitted_error(self):
+ didPassTest = False
+ try:
+ Bugzilla()._parse_bug_page(self._example_unauthorized_bug)
+ except BugzillaError, e:
+ self.assertTrue(e.is_not_permitted_to_view_bug())
+ didPassTest = True
+ self.assertTrue(didPassTest, "Failed to raise exception.")
+
+ def test_bug_parsing_for_bugzilla_not_found_error(self):
+ didPassTest = False
+ try:
+ Bugzilla()._parse_bug_page(self._example_not_found_bug)
+ except BugzillaError, e:
+ self.assertTrue(e.is_not_found())
+ didPassTest = True
+ self.assertTrue(didPassTest, "Failed to raise exception.")
+
+ def test_bug_parsing_for_bugzilla_invalid_bug_id_error(self):
+ didPassTest = False
+ try:
+ Bugzilla()._parse_bug_page(self._example_invalid_bug_id_bug)
+ except BugzillaError, e:
+ self.assertTrue(e.is_invalid_bug_id())
+ didPassTest = True
+ self.assertTrue(didPassTest, "Failed to raise exception.")
+
# FIXME: This should move to a central location and be shared by more unit tests.
def _assert_dictionaries_equal(self, actual, expected):
# Make sure we aren't parsing more or less than we expect
diff --git a/WebKitTools/Scripts/webkitpy/tool/bot/sheriff.py b/WebKitTools/Scripts/webkitpy/tool/bot/sheriff.py
index a38c3cf..34190f4 100644
--- a/WebKitTools/Scripts/webkitpy/tool/bot/sheriff.py
+++ b/WebKitTools/Scripts/webkitpy/tool/bot/sheriff.py
@@ -27,7 +27,7 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from webkitpy.common.checkout.changelog import view_source_url
-from webkitpy.common.net.bugzilla import parse_bug_id
+from webkitpy.common.net.bugzilla import Bugzilla, BugzillaError, parse_bug_id
from webkitpy.common.system.deprecated_logging import log
from webkitpy.common.system.executive import ScriptError
from webkitpy.tool.grammar import join_with_separators
@@ -64,6 +64,13 @@ class Sheriff(object):
raise ScriptError(message="The rollout reason may not begin "
"with - (\"%s\")." % rollout_reason)
+ try:
+ self._tool.bugs.fetch_bug(self._tool.checkout().commit_info_for_revision(svn_revision))
+ except BugzillaError, e:
+ if (e.is_not_permitted_to_view_bug()):
+ raise ScriptError(message="SheriffBot is not authorized to view %s." % self._tool.bugs.bug_url_for_bug_id(e.bug_id()))
+ raise ScriptError(message="Could not determine the corresponding bug for r%s." % svn_revision)
+
output = self._sheriffbot.run_webkit_patch([
"create-rollout",
"--force-clean",
diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/download.py b/WebKitTools/Scripts/webkitpy/tool/commands/download.py
index 9916523..5c16ac6 100644
--- a/WebKitTools/Scripts/webkitpy/tool/commands/download.py
+++ b/WebKitTools/Scripts/webkitpy/tool/commands/download.py
@@ -34,6 +34,7 @@ from optparse import make_option
import webkitpy.tool.steps as steps
from webkitpy.common.checkout.changelog import ChangeLog, view_source_url
+from webkitpy.common.net.bugzilla import BugzillaError
from webkitpy.common.system.executive import ScriptError
from webkitpy.tool.commands.abstractsequencedcommand import AbstractSequencedCommand
from webkitpy.tool.commands.stepsequence import StepSequence
@@ -157,16 +158,31 @@ class AbstractPatchSequencingCommand(AbstractPatchProcessingCommand):
class ProcessAttachmentsMixin(object):
def _fetch_list_of_patches_to_process(self, options, args, tool):
- return map(lambda patch_id: tool.bugs.fetch_attachment(patch_id), args)
+ all_patches = []
+ for patch_id in args:
+ try:
+ all_patches.append(tool.bugs.fetch_attachment(patch_id))
+ except BugzillaError, e:
+ if options.non_interactive:
+ raise
+ log("Failed to fetch attachment %s: '%s'; ignoring." % (patch_id, e))
+ continue
+ return all_patches
class ProcessBugsMixin(object):
def _fetch_list_of_patches_to_process(self, options, args, tool):
all_patches = []
for bug_id in args:
- patches = tool.bugs.fetch_bug(bug_id).reviewed_patches()
- log("%s found on bug %s." % (pluralize("reviewed patch", len(patches)), bug_id))
- all_patches += patches
+ try:
+ patches = tool.bugs.fetch_bug(bug_id).reviewed_patches()
+ log("%s found on bug %s." % (pluralize("reviewed patch", len(patches)), bug_id))
+ all_patches += patches
+ except BugzillaError, e:
+ if options.non_interactive:
+ raise
+ log("'%s'; ignoring." % e)
+ continue
return all_patches
diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/queues.py b/WebKitTools/Scripts/webkitpy/tool/commands/queues.py
index 80fd2ea..a87ebe3 100644
--- a/WebKitTools/Scripts/webkitpy/tool/commands/queues.py
+++ b/WebKitTools/Scripts/webkitpy/tool/commands/queues.py
@@ -35,7 +35,7 @@ from datetime import datetime
from optparse import make_option
from StringIO import StringIO
-from webkitpy.common.net.bugzilla import CommitterValidator
+from webkitpy.common.net.bugzilla import BugzillaError, CommitterValidator
from webkitpy.common.net.statusserver import StatusServer
from webkitpy.common.system.executive import ScriptError
from webkitpy.common.system.deprecated_logging import error, log
@@ -353,7 +353,14 @@ class AbstractReviewQueue(AbstractPatchQueue, PersistentPatchCollectionDelegate,
def next_work_item(self):
patch_id = self._patches.next()
if patch_id:
- return self._tool.bugs.fetch_attachment(patch_id)
+ try:
+ return self._tool.bugs.fetch_attachment(patch_id)
+ except BugzillaError, e:
+ # This may occur if the bug with attachment ID patch_id becomes a security
+ # bug between the time we fetched all attachment IDs from the review queue
+ # and now. So, we ignore this attachment.
+ log("'%s'; ignoring." % e)
+ pass
def should_proceed_with_work_item(self, patch):
raise NotImplementedError, "subclasses must implement"
diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/upload.py b/WebKitTools/Scripts/webkitpy/tool/commands/upload.py
index 107d8db..e444efd 100644
--- a/WebKitTools/Scripts/webkitpy/tool/commands/upload.py
+++ b/WebKitTools/Scripts/webkitpy/tool/commands/upload.py
@@ -37,7 +37,7 @@ from optparse import make_option
import webkitpy.tool.steps as steps
from webkitpy.common.config.committers import CommitterList
-from webkitpy.common.net.bugzilla import parse_bug_id
+from webkitpy.common.net.bugzilla import BugzillaError, parse_bug_id
from webkitpy.common.system.user import User
from webkitpy.thirdparty.mock import Mock
from webkitpy.tool.commands.abstractsequencedcommand import AbstractSequencedCommand
@@ -82,7 +82,14 @@ class CleanPendingCommit(AbstractDeclarativeCommand):
def execute(self, options, args, tool):
committers = CommitterList()
for bug_id in tool.bugs.queries.fetch_bug_ids_from_pending_commit_list():
- bug = self._tool.bugs.fetch_bug(bug_id)
+ try:
+ bug = self._tool.bugs.fetch_bug(bug_id)
+ except BugzillaError, e:
+ # This may occur if the bug becomes a security bug between the time
+ # we fetched its ID from the pending commit list and now. We ignore
+ # this bug.
+ log(e)
+ continue
patches = bug.patches(include_obsolete=True)
for patch in patches:
flags_to_clear = self._flags_to_clear_on_patch(patch)
@@ -104,7 +111,11 @@ class AssignToCommitter(AbstractDeclarativeCommand):
def _assign_bug_to_last_patch_attacher(self, bug_id):
committers = CommitterList()
- bug = self._tool.bugs.fetch_bug(bug_id)
+ try:
+ bug = self._tool.bugs.fetch_bug(bug_id)
+ except BugzillaError, e:
+ log(e)
+ return
if not bug.is_unassigned():
assigned_to_email = bug.assigned_to_email()
log("Bug %s is already assigned to %s (%s)." % (bug_id, assigned_to_email, committers.committer_by_email(assigned_to_email)))
diff --git a/WebKitTools/Scripts/webkitpy/tool/steps/closebug.py b/WebKitTools/Scripts/webkitpy/tool/steps/closebug.py
index e77bc24..153b470 100644
--- a/WebKitTools/Scripts/webkitpy/tool/steps/closebug.py
+++ b/WebKitTools/Scripts/webkitpy/tool/steps/closebug.py
@@ -28,6 +28,7 @@
from webkitpy.tool.steps.abstractstep import AbstractStep
from webkitpy.tool.steps.options import Options
+from webkitpy.common.net.bugzilla import BugzillaError
from webkitpy.common.system.deprecated_logging import log
@@ -43,7 +44,11 @@ class CloseBug(AbstractStep):
return
# Check to make sure there are no r? or r+ patches on the bug before closing.
# Assume that r- patches are just previous patches someone forgot to obsolete.
- patches = self._tool.bugs.fetch_bug(state["patch"].bug_id()).patches()
+ try:
+ patches = self._tool.bugs.fetch_bug(state["patch"].bug_id()).patches()
+ except BugzillaError, e:
+ log(e)
+ return
for patch in patches:
if patch.review() == "?" or patch.review() == "+":
log("Not closing bug %s as attachment %s has review=%s. Assuming there are more patches to land from this bug." % (patch.bug_id(), patch.id(), patch.review()))
diff --git a/WebKitTools/Scripts/webkitpy/tool/steps/obsoletepatches.py b/WebKitTools/Scripts/webkitpy/tool/steps/obsoletepatches.py
index de508c6..4f52249 100644
--- a/WebKitTools/Scripts/webkitpy/tool/steps/obsoletepatches.py
+++ b/WebKitTools/Scripts/webkitpy/tool/steps/obsoletepatches.py
@@ -29,6 +29,7 @@
from webkitpy.tool.grammar import pluralize
from webkitpy.tool.steps.abstractstep import AbstractStep
from webkitpy.tool.steps.options import Options
+from webkitpy.common.net.bugzilla import BugzillaError
from webkitpy.common.system.deprecated_logging import log
@@ -43,7 +44,11 @@ class ObsoletePatches(AbstractStep):
if not self._options.obsolete_patches:
return
bug_id = state["bug_id"]
- patches = self._tool.bugs.fetch_bug(bug_id).patches()
+ try:
+ patches = self._tool.bugs.fetch_bug(bug_id).patches()
+ except BugzillaError, e:
+ log(e)
+ return
if not patches:
return
log("Obsoleting %s on bug %s" % (pluralize("old patch", len(patches)), bug_id))
diff --git a/WebKitTools/Scripts/webkitpy/tool/steps/preparechangelog.py b/WebKitTools/Scripts/webkitpy/tool/steps/preparechangelog.py
index ce04024..2bd5f20 100644
--- a/WebKitTools/Scripts/webkitpy/tool/steps/preparechangelog.py
+++ b/WebKitTools/Scripts/webkitpy/tool/steps/preparechangelog.py
@@ -29,6 +29,7 @@
import os
from webkitpy.common.checkout.changelog import ChangeLog
+from webkitpy.common.net.bugzilla import BugzillaError
from webkitpy.common.system.executive import ScriptError
from webkitpy.tool.steps.abstractstep import AbstractStep
from webkitpy.tool.steps.options import Options
@@ -54,7 +55,7 @@ class PrepareChangeLog(AbstractStep):
changelog = ChangeLog(changelog_path)
if not changelog.latest_entry().bug_id():
changelog.set_short_description_and_bug_url(
- self.cached_lookup(state, "bug_title"),
+ self.cached_lookup(state, "bug_title"), # Will raise an exception if not authorized to retrieve the bug title.
self._tool.bugs.bug_url_for_bug_id(bug_id))
def run(self, state):
diff --git a/WebKitTools/Scripts/webkitpy/tool/steps/updatechangelogswithreviewer.py b/WebKitTools/Scripts/webkitpy/tool/steps/updatechangelogswithreviewer.py
index e46b790..b0286a0 100644
--- a/WebKitTools/Scripts/webkitpy/tool/steps/updatechangelogswithreviewer.py
+++ b/WebKitTools/Scripts/webkitpy/tool/steps/updatechangelogswithreviewer.py
@@ -32,6 +32,7 @@ from webkitpy.common.checkout.changelog import ChangeLog
from webkitpy.tool.grammar import pluralize
from webkitpy.tool.steps.abstractstep import AbstractStep
from webkitpy.tool.steps.options import Options
+from webkitpy.common.net.bugzilla import BugzillaError
from webkitpy.common.system.deprecated_logging import log, error
class UpdateChangeLogsWithReviewer(AbstractStep):
@@ -43,7 +44,11 @@ class UpdateChangeLogsWithReviewer(AbstractStep):
]
def _guess_reviewer_from_bug(self, bug_id):
- patches = self._tool.bugs.fetch_bug(bug_id).reviewed_patches()
+ try:
+ patches = self._tool.bugs.fetch_bug(bug_id).reviewed_patches()
+ except BugzillaError, e:
+ log(e)
+ return None
if len(patches) != 1:
log("%s on bug %s, cannot infer reviewer." % (pluralize("reviewed patch", len(patches)), bug_id))
return None
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list