Rev 4389: (Jelmer) Add bzr send format registry. in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Thu May 28 19:06:47 BST 2009


At file:///home/pqm/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 4389
revision-id: pqm at pqm.ubuntu.com-20090528180643-13zpler3llbz9c47
parent: pqm at pqm.ubuntu.com-20090528171438-4bnwgf4n2gcdf9jt
parent: jelmer at samba.org-20090528162538-0j8dynysuqmwofcy
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Thu 2009-05-28 19:06:43 +0100
message:
  (Jelmer) Add bzr send format registry.
added:
  bzrlib/send.py                 send.py-20090521192735-j7cdb33ykmtmzx4w-1
modified:
  bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
    ------------------------------------------------------------
    revno: 4367.1.6
    revision-id: jelmer at samba.org-20090528162538-0j8dynysuqmwofcy
    parent: jelmer at samba.org-20090528161416-k7x0l8hwuk2kyvsf
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: send-format-registry
    timestamp: Thu 2009-05-28 18:25:38 +0200
    message:
      Fix bundle revisions.
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
    ------------------------------------------------------------
    revno: 4367.1.5
    revision-id: jelmer at samba.org-20090528161416-k7x0l8hwuk2kyvsf
    parent: jelmer at samba.org-20090528143208-hu7uwbmcwhvz7htb
    parent: pqm at pqm.ubuntu.com-20090528153456-c5piafs9t37b0nz4
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: send-format-registry
    timestamp: Thu 2009-05-28 18:14:16 +0200
    message:
      merge bzr.dev.
    added:
      bzrlib/_rio_py.py              _rio_py.py-20090514104624-ied3d39oju8anmfz-1
      bzrlib/_rio_pyx.pyx            _rio_pyx.pyx-20090514104636-8203jcqvfny56yrd-1
      bzrlib/tests/test__rio.py      test__rio.py-20090514191748-cy74k8yj46gzoeq6-1
    renamed:
      bzrlib/tests/workingtree_implementations/test_get_file_with_stat.py => bzrlib/tests/tree_implementations/test_get_file_with_stat.py test_get_file_with_s-20080922035909-lhdovrr36jpxmu0v-1
    modified:
      .bzrignore                     bzrignore-20050311232317-81f7b71efa2db11a
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzr                            bzr.py-20050313053754-5485f144c7006fa6
      bzrlib/__init__.py             __init__.py-20050309040759-33e65acf91bbcd5d
      bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/foreign.py              foreign.py-20081112170002-olsxmandkk8qyfuq-1
      bzrlib/groupcompress.py        groupcompress.py-20080705181503-ccbxd6xuy1bdnrpu-8
      bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
      bzrlib/mutabletree.py          mutabletree.py-20060906023413-4wlkalbdpsxi2r4y-2
      bzrlib/osutils.py              osutils.py-20050309040759-eeaff12fbf77ac86
      bzrlib/repofmt/groupcompress_repo.py repofmt.py-20080715094215-wp1qfvoo7093c8qr-1
      bzrlib/revisiontree.py         revisiontree.py-20060724012533-bg8xyryhxd0o0i0h-1
      bzrlib/rio.py                  rio.py-20051128032247-770b120b34dfff60
      bzrlib/send.py                 send.py-20090521192735-j7cdb33ykmtmzx4w-1
      bzrlib/smart/server.py         server.py-20061110062051-chzu10y32vx8gvur-1
      bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
      bzrlib/tests/blackbox/test_dpush.py test_dpush.py-20090108125928-st1td6le59g0vyv2-1
      bzrlib/tests/blackbox/test_log.py test_log.py-20060112090212-78f6ea560c868e24
      bzrlib/tests/blackbox/test_send.py test_bundle.py-20060616222707-c21c8b7ea5ef57b1
      bzrlib/tests/blackbox/test_serve.py test_serve.py-20060913064329-8t2pvmsikl4s3xhl-1
      bzrlib/tests/branch_implementations/test_branch.py testbranch.py-20050711070244-121d632bc37d7253
      bzrlib/tests/branch_implementations/test_push.py test_push.py-20070130153159-fhfap8uoifevg30j-1
      bzrlib/tests/test_foreign.py   test_foreign.py-20081125004048-ywb901edgp9lluxo-1
      bzrlib/tests/test_http.py      testhttp.py-20051018020158-b2eef6e867c514d9
      bzrlib/tests/test_osutils.py   test_osutils.py-20051201224856-e48ee24c12182989
      bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
      bzrlib/tests/tree_implementations/__init__.py __init__.py-20060717075546-420s7b0bj9hzeowi-2
      bzrlib/tests/workingtree_implementations/__init__.py __init__.py-20060203003124-b2aa5aca21a8bfad
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
      bzrlib/transport/__init__.py   transport.py-20050711165921-4978aa7ce1285ad5
      bzrlib/tree.py                 tree.py-20050309040759-9d5f2496be663e77
      bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
      bzrlib/workingtree_4.py        workingtree_4.py-20070208044105-5fgpc5j3ljlh5q6c-1
      doc/en/user-guide/svn_plugin.txt svn_plugin.txt-20080509065016-cjc90f46407vi9a0-2
      setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
      bzrlib/tests/tree_implementations/test_get_file_with_stat.py test_get_file_with_s-20080922035909-lhdovrr36jpxmu0v-1
    ------------------------------------------------------------
    revno: 4367.1.4
    revision-id: jelmer at samba.org-20090528143208-hu7uwbmcwhvz7htb
    parent: jelmer at samba.org-20090526141018-5y160uts6358b29e
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: send-format-registry
    timestamp: Thu 2009-05-28 16:32:08 +0200
    message:
      Remove unused imports.
    modified:
      bzrlib/send.py                 send.py-20090521192735-j7cdb33ykmtmzx4w-1
    ------------------------------------------------------------
    revno: 4367.1.3
    revision-id: jelmer at samba.org-20090526141018-5y160uts6358b29e
    parent: jelmer at samba.org-20090521193300-t9lh68tu76djhb9h
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: send-format-registry
    timestamp: Tue 2009-05-26 16:10:18 +0200
    message:
      Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. 
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/send.py                 send.py-20090521192735-j7cdb33ykmtmzx4w-1
    ------------------------------------------------------------
    revno: 4367.1.2
    revision-id: jelmer at samba.org-20090521193300-t9lh68tu76djhb9h
    parent: jelmer at samba.org-20090516124005-65vemd1on2x2vaiz
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: send-format-registry
    timestamp: Thu 2009-05-21 21:33:00 +0200
    message:
      Move send command to a separate file, move send format registry out of cmd_send.
    added:
      bzrlib/send.py                 send.py-20090521192735-j7cdb33ykmtmzx4w-1
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
    ------------------------------------------------------------
    revno: 4367.1.1
    revision-id: jelmer at samba.org-20090516124005-65vemd1on2x2vaiz
    parent: pqm at pqm.ubuntu.com-20090514222335-85rfl946254b3vk2
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: send-format
    timestamp: Sat 2009-05-16 14:40:05 +0200
    message:
      Add format registry for send formats.
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py	2009-05-28 17:14:38 +0000
+++ b/bzrlib/builtins.py	2009-05-28 18:06:43 +0000
@@ -4844,137 +4844,22 @@
         'revision',
         'message',
         Option('body', help='Body for the email.', type=unicode),
-        RegistryOption.from_kwargs('format',
-        'Use the specified output format.',
-        **{'4': 'Bundle format 4, Merge Directive 2 (default)',
-           '0.9': 'Bundle format 0.9, Merge Directive 1',})
+        RegistryOption('format',
+                       help='Use the specified output format.', 
+                       lazy_registry=('bzrlib.send', 'format_registry'))
         ]
 
     def run(self, submit_branch=None, public_branch=None, no_bundle=False,
             no_patch=False, revision=None, remember=False, output=None,
             format=None, mail_to=None, message=None, body=None, **kwargs):
-        return self._run(submit_branch, revision, public_branch, remember,
+        from bzrlib.send import send
+        return send(submit_branch, revision, public_branch, remember,
                          format, no_bundle, no_patch, output,
-                         kwargs.get('from', '.'), mail_to, message, body)
-
-    def _run(self, submit_branch, revision, public_branch, remember, format,
-             no_bundle, no_patch, output, from_, mail_to, message, body):
-        from bzrlib.revision import NULL_REVISION
-        tree, branch = bzrdir.BzrDir.open_containing_tree_or_branch(from_)[:2]
-        # we may need to write data into branch's repository to calculate
-        # the data to send.
-        branch.lock_write()
-        try:
-            if output is None:
-                config = branch.get_config()
-                if mail_to is None:
-                    mail_to = config.get_user_option('submit_to')
-                mail_client = config.get_mail_client()
-                if (not getattr(mail_client, 'supports_body', False)
-                    and body is not None):
-                    raise errors.BzrCommandError(
-                        'Mail client "%s" does not support specifying body' %
-                        mail_client.__class__.__name__)
-            if remember and submit_branch is None:
-                raise errors.BzrCommandError(
-                    '--remember requires a branch to be specified.')
-            stored_submit_branch = branch.get_submit_branch()
-            remembered_submit_branch = None
-            if submit_branch is None:
-                submit_branch = stored_submit_branch
-                remembered_submit_branch = "submit"
-            else:
-                if stored_submit_branch is None or remember:
-                    branch.set_submit_branch(submit_branch)
-            if submit_branch is None:
-                submit_branch = branch.get_parent()
-                remembered_submit_branch = "parent"
-            if submit_branch is None:
-                raise errors.BzrCommandError('No submit branch known or'
-                                             ' specified')
-            if remembered_submit_branch is not None:
-                note('Using saved %s location "%s" to determine what '
-                        'changes to submit.', remembered_submit_branch,
-                        submit_branch)
-
-            if mail_to is None or format is None:
-                submit_br = Branch.open(submit_branch)
-                submit_config = submit_br.get_config()
-                if mail_to is None:
-                    mail_to = submit_config.get_user_option("child_submit_to")
-                if format is None:
-                    format = submit_br.get_child_submit_format()
-
-            stored_public_branch = branch.get_public_branch()
-            if public_branch is None:
-                public_branch = stored_public_branch
-            elif stored_public_branch is None or remember:
-                branch.set_public_branch(public_branch)
-            if no_bundle and public_branch is None:
-                raise errors.BzrCommandError('No public branch specified or'
-                                             ' known')
-            base_revision_id = None
-            revision_id = None
-            if revision is not None:
-                if len(revision) > 2:
-                    raise errors.BzrCommandError('bzr send takes '
-                        'at most two one revision identifiers')
-                revision_id = revision[-1].as_revision_id(branch)
-                if len(revision) == 2:
-                    base_revision_id = revision[0].as_revision_id(branch)
-            if revision_id is None:
-                revision_id = branch.last_revision()
-            if revision_id == NULL_REVISION:
-                raise errors.BzrCommandError('No revisions to submit.')
-            if format is None:
-                format = '4'
-            if format == '4':
-                directive = merge_directive.MergeDirective2.from_objects(
-                    branch.repository, revision_id, time.time(),
-                    osutils.local_time_offset(), submit_branch,
-                    public_branch=public_branch, include_patch=not no_patch,
-                    include_bundle=not no_bundle, message=message,
-                    base_revision_id=base_revision_id)
-            elif format == '0.9':
-                if not no_bundle:
-                    if not no_patch:
-                        patch_type = 'bundle'
-                    else:
-                        raise errors.BzrCommandError('Format 0.9 does not'
-                            ' permit bundle with no patch')
-                else:
-                    if not no_patch:
-                        patch_type = 'diff'
-                    else:
-                        patch_type = None
-                directive = merge_directive.MergeDirective.from_objects(
-                    branch.repository, revision_id, time.time(),
-                    osutils.local_time_offset(), submit_branch,
-                    public_branch=public_branch, patch_type=patch_type,
-                    message=message)
-            else:
-                raise errors.BzrCommandError("No such send format '%s'." % 
-                                             format)
-
-            if output is None:
-                directive.compose_merge_request(mail_client, mail_to, body,
-                                                branch, tree)
-            else:
-                if output == '-':
-                    outfile = self.outf
-                else:
-                    outfile = open(output, 'wb')
-                try:
-                    outfile.writelines(directive.to_lines())
-                finally:
-                    if outfile is not self.outf:
-                        outfile.close()
-        finally:
-            branch.unlock()
+                         kwargs.get('from', '.'), mail_to, message, body,
+                         self.outf)
 
 
 class cmd_bundle_revisions(cmd_send):
-
     """Create a merge-directive for submitting changes.
 
     A merge directive provides many things needed for requesting merges:
@@ -5022,10 +4907,9 @@
         Option('output', short_name='o', help='Write directive to this file.',
                type=unicode),
         'revision',
-        RegistryOption.from_kwargs('format',
-        'Use the specified output format.',
-        **{'4': 'Bundle format 4, Merge Directive 2 (default)',
-           '0.9': 'Bundle format 0.9, Merge Directive 1',})
+        RegistryOption('format',
+                       help='Use the specified output format.',
+                       lazy_registry=('bzrlib.send', 'format_registry')),
         ]
     aliases = ['bundle']
 
@@ -5038,9 +4922,11 @@
             format=None, **kwargs):
         if output is None:
             output = '-'
-        return self._run(submit_branch, revision, public_branch, remember,
+        from bzrlib.send import send
+        return send(submit_branch, revision, public_branch, remember,
                          format, no_bundle, no_patch, output,
-                         kwargs.get('from', '.'), None, None, None)
+                         kwargs.get('from', '.'), None, None, None,
+                         self.outf)
 
 
 class cmd_tag(Command):

=== added file 'bzrlib/send.py'
--- a/bzrlib/send.py	1970-01-01 00:00:00 +0000
+++ b/bzrlib/send.py	2009-05-28 16:14:16 +0000
@@ -0,0 +1,169 @@
+# Copyright (C) 2009 Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+import time
+
+from bzrlib import (
+    bzrdir,
+    errors,
+    merge_directive,
+    osutils,
+    registry,
+    trace,
+    )
+from bzrlib.branch import (
+    Branch,
+    )
+from bzrlib.revision import (
+    NULL_REVISION,
+    )
+
+
+format_registry = registry.Registry()
+
+
+def send(submit_branch, revision, public_branch, remember, format,
+         no_bundle, no_patch, output, from_, mail_to, message, body, 
+         to_file):
+    tree, branch = bzrdir.BzrDir.open_containing_tree_or_branch(from_)[:2]
+    # we may need to write data into branch's repository to calculate
+    # the data to send.
+    branch.lock_write()
+    try:
+        if output is None:
+            config = branch.get_config()
+            if mail_to is None:
+                mail_to = config.get_user_option('submit_to')
+            mail_client = config.get_mail_client()
+            if (not getattr(mail_client, 'supports_body', False)
+                and body is not None):
+                raise errors.BzrCommandError(
+                    'Mail client "%s" does not support specifying body' %
+                    mail_client.__class__.__name__)
+        if remember and submit_branch is None:
+            raise errors.BzrCommandError(
+                '--remember requires a branch to be specified.')
+        stored_submit_branch = branch.get_submit_branch()
+        remembered_submit_branch = None
+        if submit_branch is None:
+            submit_branch = stored_submit_branch
+            remembered_submit_branch = "submit"
+        else:
+            if stored_submit_branch is None or remember:
+                branch.set_submit_branch(submit_branch)
+        if submit_branch is None:
+            submit_branch = branch.get_parent()
+            remembered_submit_branch = "parent"
+        if submit_branch is None:
+            raise errors.BzrCommandError('No submit branch known or'
+                                         ' specified')
+        if remembered_submit_branch is not None:
+            trace.note('Using saved %s location "%s" to determine what '
+                       'changes to submit.', remembered_submit_branch,
+                       submit_branch)
+
+        if mail_to is None or format is None:
+            submit_br = Branch.open(submit_branch)
+            submit_config = submit_br.get_config()
+            if mail_to is None:
+                mail_to = submit_config.get_user_option("child_submit_to")
+            if format is None:
+                formatname = submit_br.get_child_submit_format()
+                try:
+                    format = format_registry.get(formatname)
+                except KeyError:
+                    raise errors.BzrCommandError("No such send format '%s'." % 
+                                                 formatname)
+
+        stored_public_branch = branch.get_public_branch()
+        if public_branch is None:
+            public_branch = stored_public_branch
+        elif stored_public_branch is None or remember:
+            branch.set_public_branch(public_branch)
+        if no_bundle and public_branch is None:
+            raise errors.BzrCommandError('No public branch specified or'
+                                         ' known')
+        base_revision_id = None
+        revision_id = None
+        if revision is not None:
+            if len(revision) > 2:
+                raise errors.BzrCommandError('bzr send takes '
+                    'at most two one revision identifiers')
+            revision_id = revision[-1].as_revision_id(branch)
+            if len(revision) == 2:
+                base_revision_id = revision[0].as_revision_id(branch)
+        if revision_id is None:
+            revision_id = branch.last_revision()
+        if revision_id == NULL_REVISION:
+            raise errors.BzrCommandError('No revisions to submit.')
+        if format is None:
+            # TODO: Query submit branch for its preferred format
+            format = format_registry.get()
+        directive = format(branch, revision_id, submit_branch, 
+            public_branch, no_patch, no_bundle, message, base_revision_id)
+        if output is None:
+            directive.compose_merge_request(mail_client, mail_to, body,
+                                            branch, tree)
+        else:
+            if output == '-':
+                outfile = to_file
+            else:
+                outfile = open(output, 'wb')
+            try:
+                outfile.writelines(directive.to_lines())
+            finally:
+                if outfile is not to_file:
+                    outfile.close()
+    finally:
+        branch.unlock()
+
+
+def _send_4(branch, revision_id, submit_branch, public_branch,
+            no_patch, no_bundle, message, base_revision_id):
+    return merge_directive.MergeDirective2.from_objects(
+        branch.repository, revision_id, time.time(),
+        osutils.local_time_offset(), submit_branch,
+        public_branch=public_branch, include_patch=not no_patch,
+        include_bundle=not no_bundle, message=message,
+        base_revision_id=base_revision_id)
+
+
+def _send_0_9(branch, revision_id, submit_branch, public_branch,
+              no_patch, no_bundle, message, base_revision_id):
+    if not no_bundle:
+        if not no_patch:
+            patch_type = 'bundle'
+        else:
+            raise errors.BzrCommandError('Format 0.9 does not'
+                ' permit bundle with no patch')
+    else:
+        if not no_patch:
+            patch_type = 'diff'
+        else:
+            patch_type = None
+    return merge_directive.MergeDirective.from_objects(
+        branch.repository, revision_id, time.time(),
+        osutils.local_time_offset(), submit_branch,
+        public_branch=public_branch, patch_type=patch_type,
+        message=message)
+
+
+format_registry.register('4', 
+    _send_4, 'Bundle format 4, Merge Directive 2 (default)')
+format_registry.register('0.9',
+    _send_0_9, 'Bundle format 0.9, Merge Directive 1')
+format_registry.default_key = '4'




More information about the bazaar-commits mailing list