2011-03-28 Andrew Foster <andrewf@chromium.org>
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 29 Mar 2011 05:56:08 +0000 (05:56 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 29 Mar 2011 05:56:08 +0000 (05:56 +0000)
        Reviewed by Ojan Vafai.

        webkit-patch should be more intelligent about whether a bug applies to a patch
        Create a new function, parse_bug_id_from_changelog() which determines
        that a bug is related to a patch by parsing the output generated from
        prepare-ChangeLog, rather than arbitrarily matching a URL to a bug in
        the description of a patch.
        https://bugs.webkit.org/show_bug.cgi?id=56989

        * Scripts/webkitpy/common/checkout/api.py:
        * Scripts/webkitpy/common/checkout/changelog.py:
        * Scripts/webkitpy/common/net/bugzilla/__init__.py:
        * Scripts/webkitpy/common/net/bugzilla/bugzilla.py:
        * Scripts/webkitpy/common/net/bugzilla/bugzilla_unittest.py:
        * Scripts/webkitpy/style/checkers/changelog.py:
        * Scripts/webkitpy/tool/commands/upload.py:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@82196 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/Scripts/webkitpy/common/checkout/api.py
Tools/Scripts/webkitpy/common/checkout/changelog.py
Tools/Scripts/webkitpy/common/net/bugzilla/__init__.py
Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla.py
Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla_unittest.py
Tools/Scripts/webkitpy/style/checkers/changelog.py
Tools/Scripts/webkitpy/tool/commands/upload.py

index 0eb8eac1fd94a222037254d74b802581eb469b11..5599d9ccff72993aa204b19d354b5cae1474585a 100644 (file)
@@ -1,3 +1,22 @@
+2011-03-28  Andrew Foster  <andrewf@chromium.org>
+
+        Reviewed by Ojan Vafai.
+
+        webkit-patch should be more intelligent about whether a bug applies to a patch
+        Create a new function, parse_bug_id_from_changelog() which determines
+        that a bug is related to a patch by parsing the output generated from
+        prepare-ChangeLog, rather than arbitrarily matching a URL to a bug in
+        the description of a patch.
+        https://bugs.webkit.org/show_bug.cgi?id=56989
+
+        * Scripts/webkitpy/common/checkout/api.py:
+        * Scripts/webkitpy/common/checkout/changelog.py:
+        * Scripts/webkitpy/common/net/bugzilla/__init__.py:
+        * Scripts/webkitpy/common/net/bugzilla/bugzilla.py:
+        * Scripts/webkitpy/common/net/bugzilla/bugzilla_unittest.py:
+        * Scripts/webkitpy/style/checkers/changelog.py:
+        * Scripts/webkitpy/tool/commands/upload.py:
+
 2011-03-28  Maciej Stachowiak  <mjs@apple.com>
 
         Revert accidentally commited change.
index 170b82256fec19a6bfbaf16dba91bba68d85df72..5c210284f12a21a187f1028c1a7aca786be1844e 100644 (file)
@@ -35,7 +35,7 @@ from webkitpy.common.checkout.commitinfo import CommitInfo
 from webkitpy.common.checkout.scm import CommitMessage
 from webkitpy.common.checkout.deps import DEPS
 from webkitpy.common.memoized import memoized
-from webkitpy.common.net.bugzilla import parse_bug_id
+from webkitpy.common.net.bugzilla import parse_bug_id_from_changelog
 from webkitpy.common.system.executive import Executive, run_command, ScriptError
 from webkitpy.common.system.deprecated_logging import log
 
@@ -85,7 +85,7 @@ class Checkout(object):
             return None
         changelog_entry = changelog_entries[0]
         changelog_data = {
-            "bug_id": parse_bug_id(changelog_entry.contents()),
+            "bug_id": parse_bug_id_from_changelog(changelog_entry.contents()),
             "author_name": changelog_entry.author_name(),
             "author_email": changelog_entry.author_email(),
             "author": changelog_entry.author(),
@@ -145,7 +145,7 @@ class Checkout(object):
 
     def bug_id_for_this_commit(self, git_commit, changed_files=None):
         try:
-            return parse_bug_id(self.commit_message_for_this_commit(git_commit, changed_files).message())
+            return parse_bug_id_from_changelog(self.commit_message_for_this_commit(git_commit, changed_files).message())
         except ScriptError, e:
             pass # We might not have ChangeLogs.
 
index ccdf9ca5411d196506b38ba348503644bfd8f9e4..a86b7a9332b956f021d0eff74557d1daf252efc1 100644 (file)
@@ -36,7 +36,7 @@ import textwrap
 
 from webkitpy.common.system.deprecated_logging import log
 from webkitpy.common.config.committers import CommitterList
-from webkitpy.common.net.bugzilla import parse_bug_id
+from webkitpy.common.net.bugzilla import parse_bug_id_from_changelog
 
 
 class ChangeLogEntry(object):
@@ -87,7 +87,7 @@ class ChangeLogEntry(object):
         return self._contents
 
     def bug_id(self):
-        return parse_bug_id(self._contents)
+        return parse_bug_id_from_changelog(self._contents)
 
 
 # FIXME: Various methods on ChangeLog should move into ChangeLogEntry instead.
index cfaf3b10624a534126ee502939ad6762fd80cc56..bde67c6d5d5627b06f3de396381e3efae6daf56d 100644 (file)
@@ -2,7 +2,7 @@
 
 # We only export public API here.
 # FIXME: parse_bug_id should not be a free function.
-from .bugzilla import Bugzilla, parse_bug_id
+from .bugzilla import Bugzilla, parse_bug_id, parse_bug_id_from_changelog
 # Unclear if Bug and Attachment need to be public classes.
 from .bug import Bug
 from .attachment import Attachment
index 17a8515d28a5fcde558847fb453a2aef63690e13..8daf92e2e808c696efef6bdce78f79244e276f65 100644 (file)
@@ -53,22 +53,34 @@ from webkitpy.thirdparty.BeautifulSoup import BeautifulSoup, SoupStrainer
 def parse_bug_id(message):
     if not message:
         return None
-    match = re.search("http\://webkit\.org/b/(?P<bug_id>\d+)", message)
+    match = re.search(Bugzilla.bug_url_short, message)
     if match:
         return int(match.group('bug_id'))
-    match = re.search(
-        Bugzilla.bug_server_regex + "show_bug\.cgi\?id=(?P<bug_id>\d+)",
-        message)
+    match = re.search(Bugzilla.bug_url_long, message)
     if match:
         return int(match.group('bug_id'))
     return None
 
 
+# FIXME: parse_bug_id_from_changelog should not be a free function.
+# Parse the bug ID out of a Changelog message based on the format that is
+# used by prepare-ChangeLog
+def parse_bug_id_from_changelog(message):
+    if not message:
+        return None
+    match = re.search("^\s*" + Bugzilla.bug_url_short + "$", message, re.MULTILINE)
+    if match:
+        return int(match.group('bug_id'))
+    match = re.search("^\s*" + Bugzilla.bug_url_long + "$", message, re.MULTILINE)
+    if match:
+        return int(match.group('bug_id'))
+    return None
+
 def timestamp():
     return datetime.now().strftime("%Y%m%d%H%M%S")
 
 
-# A container for all of the logic for making and parsing buzilla queries.
+# A container for all of the logic for making and parsing bugzilla queries.
 class BugzillaQueries(object):
 
     def __init__(self, bugzilla):
@@ -210,6 +222,8 @@ class Bugzilla(object):
     bug_server_host = "bugs.webkit.org"
     bug_server_regex = "https?://%s/" % re.sub('\.', '\\.', bug_server_host)
     bug_server_url = "https://%s/" % bug_server_host
+    bug_url_long = bug_server_regex + r"show_bug\.cgi\?id=(?P<bug_id>\d+)(&ctype=xml)?"
+    bug_url_short = r"http\://webkit\.org/b/(?P<bug_id>\d+)"
 
     def quips(self):
         # We only fetch and parse the list of quips once per instantiation
index 1d08ca549eac671f60c46f518c3e40ca079fd0e0..2e75ca9f6c8bfa21a8848a006c8d17aa9022c97c 100644 (file)
@@ -30,7 +30,7 @@ import unittest
 import datetime
 import StringIO
 
-from .bugzilla import Bugzilla, BugzillaQueries, parse_bug_id
+from .bugzilla import Bugzilla, BugzillaQueries, parse_bug_id, parse_bug_id_from_changelog
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.tool.mocktool import MockBrowser
@@ -192,6 +192,33 @@ ZEZpbmlzaExvYWRXaXRoUmVhc29uOnJlYXNvbl07Cit9CisKIEBlbmQKIAogI2VuZGlmCg==
         }],
     }
 
+    def test_parse_bug_id_from_changelog(self):
+        commit_text = '''
+2011-03-23  Ojan Vafai  <ojan@chromium.org>
+
+        Add failing result for WebKit2. All tests that require
+        focus fail on WebKit2. See https://bugs.webkit.org/show_bug.cgi?id=56988.
+
+        * platform/mac-wk2/fast/css/pseudo-any-expected.txt: Added.
+
+        '''
+
+        self.assertEquals(None, parse_bug_id_from_changelog(commit_text))
+
+        commit_text = '''
+2011-03-23  Ojan Vafai  <ojan@chromium.org>
+
+        Add failing result for WebKit2. All tests that require
+        focus fail on WebKit2. See https://bugs.webkit.org/show_bug.cgi?id=56988.
+        https://bugs.webkit.org/show_bug.cgi?id=12345
+
+        * platform/mac-wk2/fast/css/pseudo-any-expected.txt: Added.
+
+        '''
+
+        self.assertEquals(12345, parse_bug_id_from_changelog(commit_text))
+
+
     # 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
index ff4b07fe32a6b21740131dea35073bfbb6da740c..be279a7109dd3b900b4a48fd5eef8025ccbdbeff 100644 (file)
@@ -27,7 +27,7 @@
 
 import re
 from common import TabChecker
-from webkitpy.common.net.bugzilla import parse_bug_id
+from webkitpy.common.net.bugzilla import parse_bug_id_from_changelog
 
 
 class ChangeLogChecker(object):
@@ -41,7 +41,7 @@ class ChangeLogChecker(object):
 
     def check_entry(self, entry_line_number, entry_lines):
         for line in entry_lines:
-            if parse_bug_id(line):
+            if parse_bug_id_from_changelog(line):
                 break
             if re.search("Unreviewed", line, re.IGNORECASE):
                 break
index 64853170286c3946c87cbe6ad58e7f24ed3dafc7..80715a733fe42d5aa5f74532a3ae252b3ef2d2cf 100644 (file)
@@ -37,7 +37,7 @@ from optparse import make_option
 from webkitpy.tool import steps
 
 from webkitpy.common.config.committers import CommitterList
-from webkitpy.common.net.bugzilla import parse_bug_id
+from webkitpy.common.net.bugzilla import parse_bug_id_from_changelog
 from webkitpy.common.system.deprecated_logging import error, log
 from webkitpy.common.system.user import User
 from webkitpy.thirdparty.mock import Mock
@@ -326,7 +326,7 @@ class PostCommits(AbstractDeclarativeCommand):
             commit_message = tool.scm().commit_message_for_local_commit(commit_id)
 
             # Prefer --bug-id=, then a bug url in the commit message, then a bug url in the entire commit diff (i.e. ChangeLogs).
-            bug_id = options.bug_id or parse_bug_id(commit_message.message()) or parse_bug_id(tool.scm().create_patch(git_commit=commit_id))
+            bug_id = options.bug_id or parse_bug_id_from_changelog(commit_message.message()) or parse_bug_id_from_changelog(tool.scm().create_patch(git_commit=commit_id))
             if not bug_id:
                 log("Skipping %s: No bug id found in commit or specified with --bug-id." % commit_id)
                 continue
@@ -366,7 +366,7 @@ class MarkBugFixed(AbstractDeclarativeCommand):
         commit_log = self._fetch_commit_log(tool, svn_revision)
 
         if not bug_id:
-            bug_id = parse_bug_id(commit_log)
+            bug_id = parse_bug_id_from_changelog(commit_log)
 
         if not svn_revision:
             match = re.search("^r(?P<svn_revision>\d+) \|", commit_log, re.MULTILINE)