Improved unittest cleanup by adding BugDir.cleanup().
authorW. Trevor King <wking@drexel.edu>
Fri, 31 Jul 2009 18:59:06 +0000 (14:59 -0400)
committerW. Trevor King <wking@drexel.edu>
Fri, 31 Jul 2009 18:59:06 +0000 (14:59 -0400)
Also simple_bug_dir -> SimpleBugDir class, which allows me to add
utility.Dir cleanup to SimpleBugDir.cleanup().

Still having a bit of trouble with the becommand.new tests due to
bugdir loading though...

21 files changed:
becommands/assign.py
becommands/close.py
becommands/comment.py
becommands/commit.py
becommands/depend.py
becommands/diff.py
becommands/list.py
becommands/merge.py
becommands/new.py
becommands/open.py
becommands/remove.py
becommands/set.py
becommands/severity.py
becommands/show.py
becommands/status.py
becommands/subscribe.py
becommands/tag.py
becommands/target.py
libbe/arch.py
libbe/bugdir.py
libbe/diff.py

index 7b32bdd41b891a1e893639f26053fe043b4dc1da..794f0283a24fd8b2f447750ce1731b744911b51e 100644 (file)
@@ -23,7 +23,7 @@ __desc__ = __doc__
 def execute(args, manipulate_encodings=True):
     """
     >>> import os
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> os.chdir(bd.root)
     >>> bd.bug_from_shortname("a").assigned is None
     True
@@ -42,6 +42,7 @@ def execute(args, manipulate_encodings=True):
     >>> bd._clear_bugs()
     >>> bd.bug_from_shortname("a").assigned is None
     True
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index 12848b2ab6d91e80a6874d6e99a11fbce335dd06..0532ed2de463d89e90f90119590ff6e3e525e507 100644 (file)
@@ -24,7 +24,7 @@ def execute(args, manipulate_encodings=True):
     """
     >>> from libbe import bugdir
     >>> import os
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> os.chdir(bd.root)
     >>> print bd.bug_from_shortname("a").status
     open
@@ -32,6 +32,7 @@ def execute(args, manipulate_encodings=True):
     >>> bd._clear_bugs()
     >>> print bd.bug_from_shortname("a").status
     closed
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index 14872a3e44e390b07da366542f7ac168a1512435..69e3a416ca97239a7e66957a1708f1a8940cd6bf 100644 (file)
@@ -28,7 +28,7 @@ __desc__ = __doc__
 def execute(args, manipulate_encodings=True):
     """
     >>> import time
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> os.chdir(bd.root)
     >>> execute(["a", "This is a comment about a"], manipulate_encodings=False)
     >>> bd._clear_bugs()
@@ -60,6 +60,7 @@ def execute(args, manipulate_encodings=True):
     >>> print comment.body
     I like cheese
     <BLANKLINE>
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index 4f3bdbda07dd3c9939a1154817e05d69b4f5687a..fb8565129263a8f85cf448308647f54e2cf4d767 100644 (file)
@@ -22,13 +22,14 @@ def execute(args, manipulate_encodings=True):
     """
     >>> import os, time
     >>> from libbe import bug
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> os.chdir(bd.root)
     >>> full_path = "testfile"
     >>> test_contents = "A test file"
     >>> bd.rcs.set_file_contents(full_path, test_contents)
     >>> execute(["Added %s." % (full_path)], manipulate_encodings=False) # doctest: +ELLIPSIS
     Committed ...
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index fd38bd1be6566387ec011b7083b4575dc5aa8192..3d63e2f87b9f59fa3911787e235ef7ba770d805e 100644 (file)
@@ -21,7 +21,7 @@ __desc__ = __doc__
 def execute(args, manipulate_encodings=True):
     """
     >>> from libbe import utility
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> bd.save()
     >>> os.chdir(bd.root)
     >>> execute(["a", "b"], manipulate_encodings=False)
@@ -34,6 +34,7 @@ def execute(args, manipulate_encodings=True):
     Blocks on a:
     b closed
     >>> execute(["-r", "a", "b"], manipulate_encodings=False)
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index 1ab21357ade8c9f0adfb26865dfe0643389fba1e..034823d647d253de54a572101e0d2f8d5601ba2a 100644 (file)
@@ -23,7 +23,7 @@ __desc__ = __doc__
 def execute(args, manipulate_encodings=True):
     """
     >>> import os
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> bd.set_sync_with_disk(True)
     >>> original = bd.rcs.commit("Original status")
     >>> bug = bd.bug_from_uuid("a")
@@ -48,6 +48,7 @@ def execute(args, manipulate_encodings=True):
     ... else:
     ...     print "This directory is not revision-controlled."
     This directory is not revision-controlled.
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index 50038e61607e09b31010d605d02390cec2170123..12e1e29966199ba8372f39c0037cac8c23d956e7 100644 (file)
@@ -29,13 +29,14 @@ AVAILABLE_CMPS.remove("attr") # a cmp_* template.
 def execute(args, manipulate_encodings=True):
     """
     >>> import os
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> os.chdir(bd.root)
     >>> execute([], manipulate_encodings=False)
     a:om: Bug A
     >>> execute(["--status", "all"], manipulate_encodings=False)
     a:om: Bug A
     b:cm: Bug B
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index 665186906a4f716028cc1838d287e2f1f6677320..f212b01fab9fdb7e67973de64efe8e42f584f18d 100644 (file)
@@ -21,7 +21,7 @@ __desc__ = __doc__
 def execute(args, manipulate_encodings=True):
     """
     >>> from libbe import utility
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> bd.set_sync_with_disk(True)
     >>> a = bd.bug_from_shortname("a")
     >>> a.comment_root.time = 0
@@ -120,6 +120,7 @@ def execute(args, manipulate_encodings=True):
     Merged into bug a
     >>> print b.status
     closed
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index 2487bac99037f2a95fcd37e11f0b102deb113a1e..1900c7ae683b3c10f4d9140752de32e71be68e51 100644 (file)
@@ -23,12 +23,12 @@ def execute(args, manipulate_encodings=True):
     """
     >>> import os, time
     >>> from libbe import bug
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> os.chdir(bd.root)
     >>> bug.uuid_gen = lambda: "X"
     >>> execute (["this is a test",], manipulate_encodings=False)
     Created bug with ID X
-    >>> bd.load()
+    >>> bd.load() # breaks simple bug dir rcs for cleanup!
     >>> bug = bd.bug_from_uuid("X")
     >>> print bug.summary
     this is a test
@@ -38,6 +38,7 @@ def execute(args, manipulate_encodings=True):
     minor
     >>> bug.target == None
     True
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index bfb54ea0f4613b14e7d3e62e8793950b639f5b18..0c6bf05b52a18674ce4e5ce127c2edb171abc416 100644 (file)
@@ -23,7 +23,7 @@ __desc__ = __doc__
 def execute(args, manipulate_encodings=True):
     """
     >>> import os
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> os.chdir(bd.root)
     >>> print bd.bug_from_shortname("b").status
     closed
@@ -31,6 +31,7 @@ def execute(args, manipulate_encodings=True):
     >>> bd._clear_bugs()
     >>> print bd.bug_from_shortname("b").status
     open
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index bc7b5edc5fcd61e13afc1cdc4ec9bc365f38478a..8d850337a42323e5fe67941230565f3114c635f2 100644 (file)
@@ -21,7 +21,7 @@ def execute(args, manipulate_encodings=True):
     """
     >>> from libbe import mapfile
     >>> import os
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> os.chdir(bd.root)
     >>> print bd.bug_from_shortname("b").status
     closed
@@ -33,6 +33,7 @@ def execute(args, manipulate_encodings=True):
     ... except bugdir.NoBugMatches:
     ...     print "Bug not found"
     Bug not found
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index f7fca5435720e8523bada07e3838fa84ec9128f7..e78a1ea8a033df1d5339b532e1076f5a61b0952e 100644 (file)
@@ -35,7 +35,7 @@ def _value_string(bd, setting):
 def execute(args, manipulate_encodings=True):
     """
     >>> import os
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> os.chdir(bd.root)
     >>> execute(["target"], manipulate_encodings=False)
     None
@@ -45,6 +45,7 @@ def execute(args, manipulate_encodings=True):
     >>> execute(["target", "none"], manipulate_encodings=False)
     >>> execute(["target"], manipulate_encodings=False)
     None
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index a14a96be4984b9d95dcdc39a1f4e2b26061d8ed5..660586e1e2092a9b89e28baf77213e0e216f76d4 100644 (file)
@@ -23,7 +23,7 @@ __desc__ = __doc__
 def execute(args, manipulate_encodings=True):
     """
     >>> import os
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> os.chdir(bd.root)
     >>> execute(["a"], manipulate_encodings=False)
     minor
@@ -33,6 +33,7 @@ def execute(args, manipulate_encodings=True):
     >>> execute(["a", "none"], manipulate_encodings=False)
     Traceback (most recent call last):
     UserError: Invalid severity level: none
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index bb16fe53a1b7d835cf8968392af42757ed79aa50..50bd6eb92cbaf0428066dcc66f7e98faf3fd7304 100644 (file)
@@ -25,7 +25,7 @@ __desc__ = __doc__
 def execute(args, manipulate_encodings=True):
     """
     >>> import os
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> os.chdir(bd.root)
     >>> execute (["a",], manipulate_encodings=False) # doctest: +ELLIPSIS
               ID : a
@@ -50,6 +50,7 @@ def execute(args, manipulate_encodings=True):
       <created>...</created>
       <summary>Bug A</summary>
     </bug>
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index e4db78763e3562be668d1b5b44dd0313dbf27357..f3150031eed08e66c675e7545a565d8afa84d5b9 100644 (file)
@@ -20,7 +20,7 @@ __desc__ = __doc__
 def execute(args, manipulate_encodings=True):
     """
     >>> import os
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> os.chdir(bd.root)
     >>> execute(["a"], manipulate_encodings=False)
     open
@@ -30,6 +30,7 @@ def execute(args, manipulate_encodings=True):
     >>> execute(["a", "none"], manipulate_encodings=False)
     Traceback (most recent call last):
     UserError: Invalid status: none
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index 64a2867edad9210b60a49fefd98d5d5f2c685eb5..b7549378fb5f589f316d5356c3daf6d0138eb449 100644 (file)
@@ -57,7 +57,7 @@ class InvalidType (ValueError):
 
 def execute(args, manipulate_encodings=True):
     """
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> bd.set_sync_with_disk(True)
     >>> os.chdir(bd.root)
     >>> a = bd.bug_from_shortname("a")
@@ -96,6 +96,7 @@ def execute(args, manipulate_encodings=True):
     >>> execute(["-s","Jane Doe <J@doe.com>", "DIR"], manipulate_encodings=False) # doctest: +NORMALIZE_WHITESPACE
     Subscriptions for bug directory:
     Jane Doe <J@doe.com>    all    *
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
@@ -337,7 +338,7 @@ def get_bugdir_subscribers(bugdir, server):
     where id is either a bug.uuid (in the case of a bug subscription)
     or "DIR" (in the case of a bugdir subscription).
 
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir(sync_with_disk=False)
     >>> a = bd.bug_from_shortname("a")
     >>> bd.extra_strings = subscribe(bd.extra_strings, "John Doe <j@doe.com>", [BUGDIR_TYPE_ALL], ["a.com"], BUGDIR_TYPE_ALL)
     >>> bd.extra_strings = subscribe(bd.extra_strings, "Jane Doe <J@doe.com>", [BUGDIR_TYPE_NEW], ["*"], BUGDIR_TYPE_ALL)
@@ -351,6 +352,7 @@ def get_bugdir_subscribers(bugdir, server):
     [<SubscriptionType: all>]
     >>> get_bugdir_subscribers(bd, "b.net")
     {'Jane Doe <J@doe.com>': {'DIR': [<SubscriptionType: new>]}}
+    >>> bd.cleanup()
     """
     subscribers = {}
     for sub in get_subscribers(bugdir.extra_strings, BUGDIR_TYPE_ALL, server,
index e749a314283beacc00c03aff879ceebb27a0ce49..ecd853feb2d4c6128501084fc3f548679847d307 100644 (file)
@@ -21,7 +21,7 @@ __desc__ = __doc__
 def execute(args, manipulate_encodings=True):
     """
     >>> from libbe import utility
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> bd.set_sync_with_disk(True)
     >>> os.chdir(bd.root)
     >>> a = bd.bug_from_shortname("a")
@@ -66,6 +66,7 @@ def execute(args, manipulate_encodings=True):
     Tags for a:
     Alphabetically first
     >>> execute(["--remove", "a", "Alphabetically first"], manipulate_encodings=False)
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index 5d0453a9faad721bc3c7e0a63c8cc8ce6e0531ba..7e41451dc9c412cb528f7e70736d5fb299ea000a 100644 (file)
@@ -25,7 +25,7 @@ __desc__ = __doc__
 def execute(args, manipulate_encodings=True):
     """
     >>> import os
-    >>> bd = bugdir.simple_bug_dir()
+    >>> bd = bugdir.SimpleBugDir()
     >>> os.chdir(bd.root)
     >>> execute(["a"], manipulate_encodings=False)
     No target assigned.
@@ -37,6 +37,7 @@ def execute(args, manipulate_encodings=True):
     >>> execute(["a", "none"], manipulate_encodings=False)
     >>> execute(["a"], manipulate_encodings=False)
     No target assigned.
+    >>> bd.cleanup()
     """
     parser = get_parser()
     options, args = parser.parse_args(args)
index 1bdc8ae90cb83b851afa0b7f3da67d37062171b0..63e39e36f1f866568984827984f2d982ba54e7d6 100644 (file)
@@ -62,7 +62,11 @@ class Arch(RCS):
         self._create_project(path)
         self._add_project_code(path)
     def _create_archive(self, path):
-        # Create a new archive
+        """
+        Create a temporary Arch archive in the directory PATH.  This
+        archive will be removed by
+          __del__->cleanup->_rcs_cleanup->_remove_archive
+        """
         # http://regexps.srparish.net/tutorial-tla/new-archive.html#Creating_a_New_Archive
         assert self._archive_name == None
         id = self.get_user_id()
index 0bcf27e6594dd035d023fcff83f93974e7f89c5c..0eb4a6c8aa210f4a0ccd836f27db88f07a10015a 100644 (file)
@@ -321,6 +321,12 @@ settings easy.  Don't set this attribute.  Set .rcs instead, and
             self.rcs = rcs
             self._setup_user_id(self.user_id)
 
+    def __del__(self):
+        self.cleanup()
+
+    def cleanup(self):
+        self.rcs.cleanup()
+
     # methods for getting the BugDir situated in the filesystem
 
     def _find_root(self, path):
@@ -585,12 +591,13 @@ settings easy.  Don't set this attribute.  Set .rcs instead, and
 
     def bug_from_shortname(self, shortname):
         """
-        >>> bd = simple_bug_dir(sync_with_disk=False)
+        >>> bd = SimpleBugDir(sync_with_disk=False)
         >>> bug_a = bd.bug_from_shortname('a')
         >>> print type(bug_a)
         <class 'libbe.bug.Bug'>
         >>> print bug_a
         a:om: Bug A
+        >>> bd.cleanup()
         """
         matches = []
         self._bug_map_gen()
@@ -619,43 +626,47 @@ settings easy.  Don't set this attribute.  Set .rcs instead, and
         return True
 
 
-def simple_bug_dir(sync_with_disk=True):
+class SimpleBugDir (BugDir):
     """
     For testing.  Set sync_with_disk==False for a memory-only bugdir.
-    >>> bugdir = simple_bug_dir()
+    >>> bugdir = SimpleBugDir()
     >>> uuids = list(bugdir.list_uuids())
     >>> uuids.sort()
     >>> print uuids
     ['a', 'b']
+    >>> bugdir.cleanup()
     """
-    if sync_with_disk == True:
-        dir = utility.Dir()
-        assert os.path.exists(dir.path)
-        root = dir.path
-        assert_new_BugDir = True
-        rcs_init = True
-    else:
-        root = "/"
-        assert_new_BugDir = False
-        rcs_init = False
-    bugdir = BugDir(root, sink_to_existing_root=False,
+    def __init__(self, sync_with_disk=True):
+        if sync_with_disk == True:
+            dir = utility.Dir()
+            assert os.path.exists(dir.path)
+            root = dir.path
+            assert_new_BugDir = True
+            rcs_init = True
+        else:
+            root = "/"
+            assert_new_BugDir = False
+            rcs_init = False
+        BugDir.__init__(self, root, sink_to_existing_root=False,
                     assert_new_BugDir=assert_new_BugDir,
                     allow_rcs_init=rcs_init,
                     manipulate_encodings=False)
-    if sync_with_disk == True: # postpone cleanup since dir.__del__() removes dir.
-        bugdir._dir_ref = dir
-    bug_a = bugdir.new_bug("a", summary="Bug A")
-    bug_a.creator = "John Doe <jdoe@example.com>"
-    bug_a.time = 0
-    bug_b = bugdir.new_bug("b", summary="Bug B")
-    bug_b.creator = "Jane Doe <jdoe@example.com>"
-    bug_b.time = 0
-    bug_b.status = "closed"
-    if sync_with_disk == True:
-        bugdir.save()
-        bugdir.set_sync_with_disk(True)
-    return bugdir
-
+        if sync_with_disk == True: # postpone cleanup since dir.__del__() removes dir.
+            self._dir_ref = dir
+        bug_a = self.new_bug("a", summary="Bug A")
+        bug_a.creator = "John Doe <jdoe@example.com>"
+        bug_a.time = 0
+        bug_b = self.new_bug("b", summary="Bug B")
+        bug_b.creator = "Jane Doe <jdoe@example.com>"
+        bug_b.time = 0
+        bug_b.status = "closed"
+        if sync_with_disk == True:
+            self.save()
+            self.set_sync_with_disk(True)
+    def cleanup(self):
+        if hasattr(self, "_dir_ref"):
+            self._dir_ref.cleanup()
+        BugDir.cleanup(self)
 
 class BugDirTestCase(unittest.TestCase):
     def setUp(self):
@@ -664,7 +675,7 @@ class BugDirTestCase(unittest.TestCase):
                              allow_rcs_init=True)
         self.rcs = self.bugdir.rcs
     def tearDown(self):
-        self.rcs.cleanup()
+        self.bugdir.cleanup()
         self.dir.cleanup()
     def fullPath(self, path):
         return os.path.join(self.dir.path, path)
@@ -768,10 +779,11 @@ class SimpleBugDirTestCase (unittest.TestCase):
         self.bugdir.save()
     def tearDown(self):
         os.chdir(self.original_working_dir)
+        self.bugdir.cleanup()
         self.dir.cleanup()
     def testOnDiskCleanLoad(self):
-        """simple_bug_dir(sync_with_disk==True) should not import preexisting bugs."""
-        bugdir = simple_bug_dir(sync_with_disk=True)
+        """SimpleBugDir(sync_with_disk==True) should not import preexisting bugs."""
+        bugdir = SimpleBugDir(sync_with_disk=True)
         self.failUnless(bugdir.sync_with_disk==True, bugdir.sync_with_disk)
         uuids = sorted([bug.uuid for bug in bugdir])
         self.failUnless(uuids == ['a', 'b'], uuids)
@@ -781,9 +793,10 @@ class SimpleBugDirTestCase (unittest.TestCase):
         bugdir.load_all_bugs()
         uuids = sorted([bug.uuid for bug in bugdir])
         self.failUnless(uuids == ['a', 'b'], uuids)
+        bugdir.cleanup()
     def testInMemoryCleanLoad(self):
-        """simple_bug_dir(sync_with_disk==False) should not import preexisting bugs."""
-        bugdir = simple_bug_dir(sync_with_disk=False)
+        """SimpleBugDir(sync_with_disk==False) should not import preexisting bugs."""
+        bugdir = SimpleBugDir(sync_with_disk=False)
         self.failUnless(bugdir.sync_with_disk==False, bugdir.sync_with_disk)
         uuids = sorted([bug.uuid for bug in bugdir])
         self.failUnless(uuids == ['a', 'b'], uuids)
@@ -793,7 +806,7 @@ class SimpleBugDirTestCase (unittest.TestCase):
         bugdir._clear_bugs()
         uuids = sorted([bug.uuid for bug in bugdir])
         self.failUnless(uuids == [], uuids)
-
+        bugdir.cleanup()
 
 unitsuite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
 suite = unittest.TestSuite([unitsuite, doctest.DocTestSuite()])
index 459da4b44818aed20a3621ca8fa36a65074db69f..1b5262060b5c341f615b5633cb766269175df736 100644 (file)
@@ -136,7 +136,7 @@ class Diff (object):
     """
     Difference tree generator for BugDirs.
     >>> import copy
-    >>> bd = bugdir.simple_bug_dir(sync_with_disk=False)
+    >>> bd = bugdir.SimpleBugDir(sync_with_disk=False)
     >>> bd.user_id = "John Doe <j@doe.com>"
     >>> bd_new = copy.deepcopy(bd)
     >>> bd_new.target = "1.0"
@@ -180,6 +180,7 @@ class Diff (object):
         New comments:
           from John Doe <j@doe.com> on Thu, 01 Jan 1970 00:00:00 +0000
             I'm closing this bug...
+    >>> bd.cleanup()
     """
     def __init__(self, old_bugdir, new_bugdir):
         self.old_bugdir = old_bugdir