[merge] change branchbuilder example to a doctest

Martin Pool mbp at canonical.com
Tue Nov 11 02:34:00 GMT 2008


Branchbuilder's docstring contains an example of how to use it, but
it's not actually correct.  This changes it to a docstring so it can
be tested, changes branchbuilder not to emit messages to the user when
it commits, and fixes the docstring to actually work. ;-)

doctests are not great for general testing but it is nice to make sure
api examples work...

-- 
Martin <http://launchpad.net/~mbp/>



# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: mbp at sourcefrog.net-20081111023157-ylori8pmnbsef6hm
# target_branch: http://sourcefrog.net/bzr/trunk
# testament_sha1: c6213e12badb73d0a63c9f3a14116151815b8da3
# timestamp: 2008-11-11 12:32:14 +1000
# source_branch: http://sourcefrog.net/bzr/branchbuilder
# base_revision_id: pqm at pqm.ubuntu.com-20081107225426-gezbao014attrca8
#
# Begin patch
=== modified file 'NEWS'
--- NEWS	2008-11-07 18:10:32 +0000
+++ NEWS	2008-11-11 01:19:28 +0000
@@ -27,11 +27,15 @@
   DOCUMENTATION:

   API CHANGES:
+
     * Transport implementations must provide copy_tree_to_transport.  A default
       implementation is provided for Transport subclasses.

   TESTING:

+    * ``bzr selftest`` now fails if no doctests are found in a module
+      that's expected to have them.  (Martin Pool)
+
   INTERNALS:



=== modified file 'bzrlib/branchbuilder.py'
--- bzrlib/branchbuilder.py	2008-07-29 16:34:09 +0000
+++ bzrlib/branchbuilder.py	2008-11-11 02:31:57 +0000
@@ -16,11 +16,16 @@

 """Utility for create branches with particular contents."""

-from bzrlib import bzrdir, errors, memorytree
+from bzrlib import (
+    bzrdir,
+    commit,
+    errors,
+    memorytree,
+    )


 class BranchBuilder(object):
-    """A BranchBuilder aids creating Branches with particular shapes.
+    r"""A BranchBuilder aids creating Branches with particular shapes.

     The expected way to use BranchBuilder is to construct a
     BranchBuilder on the transport you want your branch on, and then call
@@ -30,14 +35,19 @@
     real data.

     For instance:
-      builder = BranchBuilder(self.get_transport().clone('relpath'))
-      builder.start_series()
-      builder.build_snapshot('rev-id', [],
-        [('add', ('filename', 'f-id', 'file', 'content\n'))])
-      builder.build_snapshot('rev2-id', ['rev-id'],
-        [('modify', ('f-id', 'new-content\n'))])
-      builder.finish_series()
-      branch = builder.get_branch()
+
+    >>> from bzrlib.transport.memory import MemoryTransport
+    >>> builder = BranchBuilder(MemoryTransport("memory:///"))
+    >>> builder.start_series()
+    >>> builder.build_snapshot('rev-id', None, [
+    ...     ('add', ('', 'root-id', 'directory', '')),
+    ...     ('add', ('filename', 'f-id', 'file', 'content\n'))])
+    'rev-id'
+    >>> builder.build_snapshot('rev2-id', ['rev-id'],
+    ...     [('modify', ('f-id', 'new-content\n'))])
+    'rev2-id'
+    >>> builder.finish_series()
+    >>> branch = builder.get_branch()

     :ivar _tree: This is a private member which is not meant to be modified by
         users of this class. While a 'series' is in progress, it should hold a
@@ -71,10 +81,18 @@
         tree.lock_write()
         try:
             tree.add('')
-            return tree.commit('commit %d' % (self._branch.revno() + 1))
+            return self._do_commit(tree)
         finally:
             tree.unlock()

+    def _do_commit(self, tree, message=None, **kwargs):
+        reporter = commit.NullCommitReporter()
+        if message is None:
+            message = u'commit %d' % (self._branch.revno() + 1,)
+        return tree.commit(message,
+            reporter=reporter,
+            **kwargs)
+
     def _move_branch_pointer(self, new_revision_id):
         """Point self._branch to a different revision id."""
         self._branch.lock_write()
@@ -192,10 +210,7 @@
             tree.add(to_add_files, to_add_file_ids, to_add_kinds)
             for file_id, content in new_contents.iteritems():
                 tree.put_file_bytes_non_atomic(file_id, content)
-
-            if message is None:
-                message = u'commit %d' % (self._branch.revno() + 1,)
-            return tree.commit(message, rev_id=revision_id)
+            return self._do_commit(tree, message=message, rev_id=revision_id)
         finally:
             tree.unlock()


=== modified file 'bzrlib/tests/__init__.py'
--- bzrlib/tests/__init__.py	2008-11-03 19:01:14 +0000
+++ bzrlib/tests/__init__.py	2008-11-11 02:31:57 +0000
@@ -2953,14 +2953,13 @@

     modules_to_doctest = [
         'bzrlib',
-        'bzrlib.errors',
+        'bzrlib.branchbuilder',
         'bzrlib.export',
         'bzrlib.inventory',
         'bzrlib.iterablefile',
         'bzrlib.lockdir',
         'bzrlib.merge3',
         'bzrlib.option',
-        'bzrlib.store',
         'bzrlib.symbol_versioning',
         'bzrlib.tests',
         'bzrlib.timestamp',
@@ -2976,6 +2975,8 @@
         except ValueError, e:
             print '**failed to get doctest for: %s\n%s' % (mod, e)
             raise
+        if len(doc_suite._tests) == 0:
+            raise errors.BzrError("no doctests found in %s" % (mod,))
         suite.addTest(doc_suite)

     default_encoding = sys.getdefaultencoding()

# Begin bundle
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



More information about the bazaar mailing list