From 50cabd53b1c66f4c24c4cb92d5d00d6a4dd355c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Borgstr=C3=B6m?= Date: Thu, 30 Jan 2014 22:16:21 +0100 Subject: [PATCH] Fix deadlock when extracting 0 sized files from remote repositories --- CHANGES | 3 ++- attic/remote.py | 2 ++ attic/testsuite/archiver.py | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 26b85b663..243e02989 100644 --- a/CHANGES +++ b/CHANGES @@ -6,8 +6,9 @@ Here you can see the full list of changes between each Attic release. Version 0.10 ------------ -(feature release, released on X) +(bugfix release, released on Jan 30, 2014) +- Fix deadlock when extracting 0 sized files from remote repositories - "--exclude" wildcard patterns are now properly applied to the full path not just the file name part (#5). - Make source code endianness agnostic (#1) diff --git a/attic/remote.py b/attic/remote.py index cb262155b..f818563d8 100644 --- a/attic/remote.py +++ b/attic/remote.py @@ -111,6 +111,8 @@ class RemoteRepository(object): return resp def call_many(self, cmd, calls, wait=True, is_preloaded=False): + if not calls: + return def fetch_from_cache(args): msgid = self.cache[args].pop(0) if not self.cache[args]: diff --git a/attic/testsuite/archiver.py b/attic/testsuite/archiver.py index ad7df9e25..e09747a9c 100644 --- a/attic/testsuite/archiver.py +++ b/attic/testsuite/archiver.py @@ -104,6 +104,7 @@ class ArchiverTestCase(AtticTestCase): """Create a minimal test case including all supported file types """ # File + self.create_regual_file('empty', size=0) self.create_regual_file('file1', size=1024 * 80) # Directory self.create_regual_file('dir2/file2', size=1024 * 80) @@ -134,7 +135,7 @@ class ArchiverTestCase(AtticTestCase): with changedir('output'): self.attic('extract', self.repository_location + '::test') self.assert_equal(len(self.attic('list', self.repository_location).splitlines()), 2) - self.assert_equal(len(self.attic('list', self.repository_location + '::test').splitlines()), 9) + self.assert_equal(len(self.attic('list', self.repository_location + '::test').splitlines()), 10) self.assert_dirs_equal('input', 'output/input') info_output = self.attic('info', self.repository_location + '::test') shutil.rmtree(self.cache_path)