Run cmd.cleanup_now() after executing bzr commands.
authorW. Trevor King <wking@drexel.edu>
Mon, 6 Dec 2010 15:12:57 +0000 (10:12 -0500)
committerW. Trevor King <wking@drexel.edu>
Mon, 6 Dec 2010 15:13:01 +0000 (10:13 -0500)
Otherwise
  be remove ...

blocks if it needs to remove multiple files, since
bzrlib.builtins.cmd_remove needs write locks, and the second remove
will try to aquire the lock that the first aquire hadn't released.  If
we force the release, the lock will be available for the second (and
later) removal.

It's not a problem to call cleanup_now() too often, because calling it
clears the cleanup command stack, so I just added explicit cleanups
after every bzr .run() call.

libbe/storage/vcs/bzr.py

index 616a486e289d0994c325ae8aae2614e6f6feb856..583a8f65cee2ff6bf147af02370e5c973ae9a901 100644 (file)
@@ -136,12 +136,14 @@ class Bzr(base.VCS):
         cmd = bzrlib.builtins.cmd_root()
         cmd.outf = StringIO.StringIO()
         cmd.run(filename=path)
+        cmd.cleanup_now()
         return cmd.outf.getvalue().rstrip('\n')
 
     def _vcs_init(self, path):
         cmd = bzrlib.builtins.cmd_init()
         cmd.outf = StringIO.StringIO()
         cmd.run(location=path)
+        cmd.cleanup_now()
 
     def _vcs_destroy(self):
         vcs_dir = os.path.join(self.repo, '.bzr')
@@ -153,6 +155,7 @@ class Bzr(base.VCS):
         cmd = bzrlib.builtins.cmd_add()
         cmd.outf = StringIO.StringIO()
         cmd.run(file_list=[path], file_ids_from=self.repo)
+        cmd.cleanup_now()
 
     def _vcs_exists(self, path, revision=None):
         manifest = self._vcs_listdir(
@@ -167,6 +170,7 @@ class Bzr(base.VCS):
         cmd = bzrlib.builtins.cmd_remove()
         cmd.outf = StringIO.StringIO()
         cmd.run(file_list=[path], file_deletion_strategy='force')
+        cmd.cleanup_now()
 
     def _vcs_update(self, path):
         pass
@@ -202,6 +206,7 @@ class Bzr(base.VCS):
             if self.version_cmp(2,0,0) < 0:
                 cmd.outf = sys.stdout
                 sys.stdout = stdout
+            cmd.cleanup_now()
         return cmd.outf.getvalue()
 
     def _vcs_path(self, id, revision):
@@ -236,6 +241,8 @@ class Bzr(base.VCS):
             if 'not present in revision' in str(e):
                 raise base.InvalidPath(path, root=self.repo, revision=revision)
             raise
+        finally:
+            cmd.cleanup_now()
         children = cmd.outf.getvalue().rstrip('\n').splitlines()
         children = [self._u_rel_path(c, path) for c in children]
         if self.version_cmp(2,0,0) < 0 and recursive == False:
@@ -257,12 +264,14 @@ class Bzr(base.VCS):
             raise
         finally:
             os.chdir(cwd)
+            cmd.cleanup_now()
         return self._vcs_revision_id(-1)
 
     def _vcs_revision_id(self, index):
         cmd = bzrlib.builtins.cmd_revno()
         cmd.outf = StringIO.StringIO()
         cmd.run(location=self.repo)
+        cmd.cleanup_now()
         current_revision = int(cmd.outf.getvalue())
         if index > current_revision or index < -current_revision:
             return None
@@ -281,6 +290,7 @@ class Bzr(base.VCS):
             status = cmd.run(revision=revision, file_list=[self.repo])
         finally:
             sys.stdout = stdout
+            cmd.cleanup_now()
         assert status in [0,1], "Invalid status %d" % status
         return cmd.outf.getvalue()