diff options
author | W. Trevor King <wking@drexel.edu> | 2010-12-06 10:12:57 -0500 |
---|---|---|
committer | W. Trevor King <wking@drexel.edu> | 2010-12-06 10:13:01 -0500 |
commit | ef0a5537747a2e5a0b2248018e981f80ae0b0f9f (patch) | |
tree | 832ccf487812e8ccf03ab8fe47c0950a0db3ee8b | |
parent | 22dd202ff4c0a1893f6e9f4d2b6aa1d4da3bf728 (diff) | |
download | bugseverywhere-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.
-rw-r--r-- | libbe/storage/vcs/bzr.py | 10 |
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() |