aboutsummaryrefslogtreecommitdiffstats
path: root/libbe/storage/vcs/bzr.py
diff options
context:
space:
mode:
authorW. Trevor King <wking@drexel.edu>2010-12-06 10:12:57 -0500
committerW. Trevor King <wking@drexel.edu>2010-12-06 10:13:01 -0500
commitef0a5537747a2e5a0b2248018e981f80ae0b0f9f (patch)
tree832ccf487812e8ccf03ab8fe47c0950a0db3ee8b /libbe/storage/vcs/bzr.py
parent22dd202ff4c0a1893f6e9f4d2b6aa1d4da3bf728 (diff)
downloadbugseverywhere-ef0a5537747a2e5a0b2248018e981f80ae0b0f9f.tar.gz
Run cmd.cleanup_now() after executing bzr commands.
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.
Diffstat (limited to 'libbe/storage/vcs/bzr.py')
-rw-r--r--libbe/storage/vcs/bzr.py10
1 files changed, 10 insertions, 0 deletions
diff --git a/libbe/storage/vcs/bzr.py b/libbe/storage/vcs/bzr.py
index 616a486..583a8f6 100644
--- a/libbe/storage/vcs/bzr.py
+++ b/libbe/storage/vcs/bzr.py
@@ -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()