[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-10851-g50815da

commit-queue at webkit.org commit-queue at webkit.org
Wed Dec 22 18:32:25 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 19dc850d97daac54f392746f2b7d69b313fa4d50
Author: commit-queue at webkit.org <commit-queue at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Dec 13 20:41:03 2010 +0000

    2010-12-13  Gabor Rapcsanyi  <rgabor at inf.u-szeged.hu>
    
            Reviewed by Eric Seidel.
    
            webkit-patch rollout should be able to do multi-revision rollouts
            https://bugs.webkit.org/show_bug.cgi?id=33336
    
            Make it possible to pass more than one revision to webkit-patch.
    
            * Scripts/webkitpy/common/checkout/api.py:
            * Scripts/webkitpy/common/checkout/changelog.py:
            * Scripts/webkitpy/common/checkout/changelog_unittest.py:
            * Scripts/webkitpy/tool/commands/abstractsequencedcommand.py:
            * Scripts/webkitpy/tool/commands/download.py:
            * Scripts/webkitpy/tool/commands/download_unittest.py:
            * Scripts/webkitpy/tool/mocktool.py:
            * Scripts/webkitpy/tool/steps/preparechangelogforrevert.py:
            * Scripts/webkitpy/tool/steps/revertrevision.py:
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@73951 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKitTools/ChangeLog b/WebKitTools/ChangeLog
index fbd9d60..2093405 100644
--- a/WebKitTools/ChangeLog
+++ b/WebKitTools/ChangeLog
@@ -1,3 +1,22 @@
+2010-12-13  Gabor Rapcsanyi  <rgabor at inf.u-szeged.hu>
+
+        Reviewed by Eric Seidel.
+
+        webkit-patch rollout should be able to do multi-revision rollouts
+        https://bugs.webkit.org/show_bug.cgi?id=33336
+
+        Make it possible to pass more than one revision to webkit-patch.
+
+        * Scripts/webkitpy/common/checkout/api.py:
+        * Scripts/webkitpy/common/checkout/changelog.py:
+        * Scripts/webkitpy/common/checkout/changelog_unittest.py:
+        * Scripts/webkitpy/tool/commands/abstractsequencedcommand.py:
+        * Scripts/webkitpy/tool/commands/download.py:
+        * Scripts/webkitpy/tool/commands/download_unittest.py:
+        * Scripts/webkitpy/tool/mocktool.py:
+        * Scripts/webkitpy/tool/steps/preparechangelogforrevert.py:
+        * Scripts/webkitpy/tool/steps/revertrevision.py:
+
 2010-12-13  Eric Seidel  <eric at webkit.org>
 
         Unreviewed.
diff --git a/WebKitTools/Scripts/webkitpy/common/checkout/api.py b/WebKitTools/Scripts/webkitpy/common/checkout/api.py
index b84cf9b..6357982 100644
--- a/WebKitTools/Scripts/webkitpy/common/checkout/api.py
+++ b/WebKitTools/Scripts/webkitpy/common/checkout/api.py
@@ -158,3 +158,7 @@ class Checkout(object):
         conflicts = self._scm.conflicted_files()
         if len(conflicts):
             raise ScriptError(message="Failed to apply reverse diff for revision %s because of the following conflicts:\n%s" % (revision, "\n".join(conflicts)))
+
+    def apply_reverse_diffs(self, revision_list):
+        for revision in sorted(revision_list, reverse=True):
+            self.apply_reverse_diff(revision)
diff --git a/WebKitTools/Scripts/webkitpy/common/checkout/changelog.py b/WebKitTools/Scripts/webkitpy/common/checkout/changelog.py
index d3f990c..07f905d 100644
--- a/WebKitTools/Scripts/webkitpy/common/checkout/changelog.py
+++ b/WebKitTools/Scripts/webkitpy/common/checkout/changelog.py
@@ -38,6 +38,7 @@ from webkitpy.common.system.deprecated_logging import log
 from webkitpy.common.config.committers import CommitterList
 from webkitpy.common.config import urls
 from webkitpy.common.net.bugzilla import parse_bug_id
+from webkitpy.tool.grammar import join_with_separators
 
 
 class ChangeLogEntry(object):
@@ -145,9 +146,10 @@ class ChangeLog(object):
         return "\n".join(lines)
 
     # This probably does not belong in changelogs.py
-    def _message_for_revert(self, revision, reason, bug_url):
-        message = "Unreviewed, rolling out r%s.\n" % revision
-        message += "%s\n" % urls.view_revision_url(revision)
+    def _message_for_revert(self, revision_list, reason, bug_url):
+        message = "Unreviewed, rolling out %s.\n" % join_with_separators(['r' + str(revision) for revision in revision_list])
+        for revision in revision_list:
+            message += "%s\n" % urls.view_revision_url(revision)
         if bug_url:
             message += "%s\n" % bug_url
         # Add an extra new line after the rollout links, before any reason.
@@ -156,14 +158,14 @@ class ChangeLog(object):
             message += "%s\n\n" % reason
         return self._wrap_lines(message)
 
-    def update_for_revert(self, revision, reason, bug_url=None):
+    def update_for_revert(self, revision_list, reason, bug_url=None):
         reviewed_by_regexp = re.compile(
                 "%sReviewed by NOBODY \(OOPS!\)\." % self._changelog_indent)
         removing_boilerplate = False
         # inplace=1 creates a backup file and re-directs stdout to the file
         for line in fileinput.FileInput(self.path, inplace=1):
             if reviewed_by_regexp.search(line):
-                message_lines = self._message_for_revert(revision,
+                message_lines = self._message_for_revert(revision_list,
                                                          reason,
                                                          bug_url)
                 print reviewed_by_regexp.sub(message_lines, line),
diff --git a/WebKitTools/Scripts/webkitpy/common/checkout/changelog_unittest.py b/WebKitTools/Scripts/webkitpy/common/checkout/changelog_unittest.py
index 6aeb1f8..20c6cfa 100644
--- a/WebKitTools/Scripts/webkitpy/common/checkout/changelog_unittest.py
+++ b/WebKitTools/Scripts/webkitpy/common/checkout/changelog_unittest.py
@@ -157,7 +157,7 @@ class ChangeLogTest(unittest.TestCase):
     def test_message_for_revert(self):
         changelog = ChangeLog("/fake/path")
         long_reason = "This is a very long reason which should be long enough so that _message_for_revert will need to wrap it.  We'll also include a https://veryveryveryveryverylongbugurl.com/reallylongbugthingy.cgi?bug_id=12354 link so that we can make sure we wrap that right too."
-        message = changelog._message_for_revert(12345, long_reason, "http://example.com/123")
+        message = changelog._message_for_revert([12345], long_reason, "http://example.com/123")
         self.assertEquals(message, self._revert_message)
 
     _revert_entry_with_bug_url = '''2009-08-19  Eric Seidel  <eric at webkit.org>
@@ -181,6 +181,31 @@ class ChangeLogTest(unittest.TestCase):
         * Scripts/bugzilla-tool:
 '''
 
+    _multiple_revert_entry_with_bug_url = '''2009-08-19  Eric Seidel  <eric at webkit.org>
+
+        Unreviewed, rolling out r12345, r12346, and r12347.
+        http://trac.webkit.org/changeset/12345
+        http://trac.webkit.org/changeset/12346
+        http://trac.webkit.org/changeset/12347
+        http://example.com/123
+
+        Reason
+
+        * Scripts/bugzilla-tool:
+'''
+
+    _multiple_revert_entry_without_bug_url = '''2009-08-19  Eric Seidel  <eric at webkit.org>
+
+        Unreviewed, rolling out r12345, r12346, and r12347.
+        http://trac.webkit.org/changeset/12345
+        http://trac.webkit.org/changeset/12346
+        http://trac.webkit.org/changeset/12347
+
+        Reason
+
+        * Scripts/bugzilla-tool:
+'''
+
     def _assert_update_for_revert_output(self, args, expected_entry):
         changelog_contents = u"%s\n%s" % (self._new_entry_boilerplate, self._example_changelog)
         changelog_path = self._write_tmp_file_with_contents(changelog_contents.encode("utf-8"))
@@ -195,8 +220,10 @@ class ChangeLogTest(unittest.TestCase):
         self.assertEquals(actual_entry.author_email(), "eric at webkit.org")
 
     def test_update_for_revert(self):
-        self._assert_update_for_revert_output([12345, "Reason"], self._revert_entry_without_bug_url)
-        self._assert_update_for_revert_output([12345, "Reason", "http://example.com/123"], self._revert_entry_with_bug_url)
+        self._assert_update_for_revert_output([[12345], "Reason"], self._revert_entry_without_bug_url)
+        self._assert_update_for_revert_output([[12345], "Reason", "http://example.com/123"], self._revert_entry_with_bug_url)
+        self._assert_update_for_revert_output([[12345, 12346, 12347], "Reason"], self._multiple_revert_entry_without_bug_url)
+        self._assert_update_for_revert_output([[12345, 12346, 12347], "Reason", "http://example.com/123"], self._multiple_revert_entry_with_bug_url)
 
 
 if __name__ == '__main__':
diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/abstractsequencedcommand.py b/WebKitTools/Scripts/webkitpy/tool/commands/abstractsequencedcommand.py
index fc5a794..fd10890 100644
--- a/WebKitTools/Scripts/webkitpy/tool/commands/abstractsequencedcommand.py
+++ b/WebKitTools/Scripts/webkitpy/tool/commands/abstractsequencedcommand.py
@@ -26,6 +26,8 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+from webkitpy.common.system.executive import ScriptError
+from webkitpy.common.system.deprecated_logging import log
 from webkitpy.tool.commands.stepsequence import StepSequence
 from webkitpy.tool.multicommandtool import AbstractDeclarativeCommand
 
@@ -40,4 +42,10 @@ class AbstractSequencedCommand(AbstractDeclarativeCommand):
         return None
 
     def execute(self, options, args, tool):
-        self._sequence.run_and_handle_errors(tool, options, self._prepare_state(options, args, tool))
+        try:
+            state = self._prepare_state(options, args, tool)
+        except ScriptError, e:
+            log(e.message_with_output())
+            exit(e.exit_code or 2)
+
+        self._sequence.run_and_handle_errors(tool, options, state)
diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/download.py b/WebKitTools/Scripts/webkitpy/tool/commands/download.py
index 8abd28f..020f339 100644
--- a/WebKitTools/Scripts/webkitpy/tool/commands/download.py
+++ b/WebKitTools/Scripts/webkitpy/tool/commands/download.py
@@ -289,7 +289,7 @@ class LandFromBug(AbstractPatchLandingCommand, ProcessBugsMixin):
 
 
 class AbstractRolloutPrepCommand(AbstractSequencedCommand):
-    argument_names = "REVISION REASON"
+    argument_names = "REVISION [REVISIONS] REASON"
 
     def _commit_info(self, revision):
         commit_info = self._tool.checkout().commit_info_for_revision(revision)
@@ -304,13 +304,23 @@ class AbstractRolloutPrepCommand(AbstractSequencedCommand):
         return commit_info
 
     def _prepare_state(self, options, args, tool):
-        revision = args[0]
-        commit_info = self._commit_info(revision)
+        revision_list = []
+        for revision in str(args[0]).split():
+            if revision.isdigit():
+                revision_list.append(int(revision))
+            else:
+                raise ScriptError(message="Invalid svn revision number: " + revision)
+        revision_list.sort()
+
+        # We use the earliest revision for the bug info
+        earliest_revision = revision_list[0]
+        commit_info = self._commit_info(earliest_revision)
         cc_list = sorted([party.bugzilla_email()
                           for party in commit_info.responsible_parties()
                           if party.bugzilla_email()])
         return {
-            "revision": revision,
+            "revision": earliest_revision,
+            "revision_list": revision_list,
             "bug_id": commit_info.bug_id(),
             # FIXME: We should used the list as the canonical representation.
             "bug_cc": ",".join(cc_list),
@@ -320,9 +330,9 @@ class AbstractRolloutPrepCommand(AbstractSequencedCommand):
 
 class PrepareRollout(AbstractRolloutPrepCommand):
     name = "prepare-rollout"
-    help_text = "Revert the given revision in the working copy and prepare ChangeLogs with revert reason"
+    help_text = "Revert the given revision(s) in the working copy and prepare ChangeLogs with revert reason"
     long_help = """Updates the working copy.
-Applies the inverse diff for the provided revision.
+Applies the inverse diff for the provided revision(s).
 Creates an appropriate rollout ChangeLog, including a trac link and bug link.
 """
     steps = [
@@ -335,7 +345,7 @@ Creates an appropriate rollout ChangeLog, including a trac link and bug link.
 
 class CreateRollout(AbstractRolloutPrepCommand):
     name = "create-rollout"
-    help_text = "Creates a bug to track a broken SVN revision and uploads a rollout patch."
+    help_text = "Creates a bug to track the broken SVN revision(s) and uploads a rollout patch."
     steps = [
         steps.CleanWorkingDirectory,
         steps.Update,
@@ -375,7 +385,7 @@ so that we can track how often these flaky tests case pain.
 class Rollout(AbstractRolloutPrepCommand):
     name = "rollout"
     show_in_main_help = True
-    help_text = "Revert the given revision in the working copy and optionally commit the revert and re-open the original bug"
+    help_text = "Revert the given revision(s) in the working copy and optionally commit the revert and re-open the original bug"
     long_help = """Updates the working copy.
 Applies the inverse diff for the provided revision.
 Creates an appropriate rollout ChangeLog, including a trac link and bug link.
diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/download_unittest.py b/WebKitTools/Scripts/webkitpy/tool/commands/download_unittest.py
index a931134..0a8f022 100644
--- a/WebKitTools/Scripts/webkitpy/tool/commands/download_unittest.py
+++ b/WebKitTools/Scripts/webkitpy/tool/commands/download_unittest.py
@@ -32,7 +32,7 @@ from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.thirdparty.mock import Mock
 from webkitpy.tool.commands.commandtest import CommandsTest
 from webkitpy.tool.commands.download import *
-from webkitpy.tool.mocktool import MockOptions, MockTool
+from webkitpy.tool.mocktool import MockCheckout, MockOptions, MockTool
 
 
 class AbstractRolloutPrepCommandTest(unittest.TestCase):
@@ -53,6 +53,18 @@ class AbstractRolloutPrepCommandTest(unittest.TestCase):
         commit_info = output.assert_outputs(self, command._commit_info, [1234], expected_stderr=expected_stderr)
         self.assertEqual(commit_info, mock_commit_info)
 
+    def test_prepare_state(self):
+        command = AbstractRolloutPrepCommand()
+        mock_commit_info = MockCheckout().commit_info_for_revision(123)
+        command._commit_info = lambda revision: mock_commit_info
+
+        state = command._prepare_state(None, ["124 123 125", "Reason"], None)
+        self.assertEqual(123, state["revision"])
+        self.assertEqual([123, 124, 125], state["revision_list"])
+
+        self.assertRaises(ScriptError, command._prepare_state, options=None, args=["125 r122  123", "Reason"], tool=None)
+        self.assertRaises(ScriptError, command._prepare_state, options=None, args=["125 foo 123", "Reason"], tool=None)
+
 
 class DownloadCommandsTest(CommandsTest):
     def _default_options(self):
@@ -185,6 +197,7 @@ where ATTACHMENT_ID is the ID of this attachment.
 -- End comment --
 """
         self.assert_execute_outputs(CreateRollout(), [852, "Reason"], options=self._default_options(), expected_stderr=expected_stderr)
+        self.assert_execute_outputs(CreateRollout(), ["855 852 854", "Reason"], options=self._default_options(), expected_stderr=expected_stderr)
 
     def test_rollout(self):
         expected_stderr = "Preparing rollout for bug 42.\nUpdating working directory\nRunning prepare-ChangeLog\nMOCK: user.open_url: file://...\nBuilding WebKit\nCommitted r49824: <http://trac.webkit.org/changeset/49824>\n"
diff --git a/WebKitTools/Scripts/webkitpy/tool/mocktool.py b/WebKitTools/Scripts/webkitpy/tool/mocktool.py
index b398dd5..f02d35b 100644
--- a/WebKitTools/Scripts/webkitpy/tool/mocktool.py
+++ b/WebKitTools/Scripts/webkitpy/tool/mocktool.py
@@ -508,7 +508,7 @@ class MockCheckout(object):
     def apply_patch(self, patch, force=False):
         pass
 
-    def apply_reverse_diff(self, revision):
+    def apply_reverse_diffs(self, revision):
         pass
 
     def suggested_reviewers(self, git_commit, changed_files=None):
diff --git a/WebKitTools/Scripts/webkitpy/tool/steps/preparechangelogforrevert.py b/WebKitTools/Scripts/webkitpy/tool/steps/preparechangelogforrevert.py
index 0e78bc2..1e47a6a 100644
--- a/WebKitTools/Scripts/webkitpy/tool/steps/preparechangelogforrevert.py
+++ b/WebKitTools/Scripts/webkitpy/tool/steps/preparechangelogforrevert.py
@@ -41,4 +41,4 @@ class PrepareChangeLogForRevert(AbstractStep):
         for changelog_path in changelog_paths:
             # FIXME: Seems we should prepare the message outside of changelogs.py and then just pass in
             # text that we want to use to replace the reviewed by line.
-            ChangeLog(changelog_path).update_for_revert(state["revision"], state["reason"], bug_url)
+            ChangeLog(changelog_path).update_for_revert(state["revision_list"], state["reason"], bug_url)
diff --git a/WebKitTools/Scripts/webkitpy/tool/steps/revertrevision.py b/WebKitTools/Scripts/webkitpy/tool/steps/revertrevision.py
index bbb794c..8016be5 100644
--- a/WebKitTools/Scripts/webkitpy/tool/steps/revertrevision.py
+++ b/WebKitTools/Scripts/webkitpy/tool/steps/revertrevision.py
@@ -31,5 +31,5 @@ from webkitpy.tool.steps.abstractstep import AbstractStep
 
 class RevertRevision(AbstractStep):
     def run(self, state):
-        self._tool.checkout().apply_reverse_diff(state["revision"])
+        self._tool.checkout().apply_reverse_diffs(state["revision_list"])
         self.did_modify_checkout(state)

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list