From 4468e55d4bd2a9ac4c6aeaffeb99653b7737ebd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Araujo?= Date: Fri, 8 Jul 2011 17:22:19 +0200 Subject: [PATCH] Close file handles in a timely manner in packaging.database (#12504). This fixes a bug with the remove (uninstall) feature on Windows. Patch by Thomas Holmes. --- Lib/packaging/database.py | 12 +++++++----- Lib/packaging/tests/test_uninstall.py | 2 -- Misc/ACKS | 1 + Misc/NEWS | 3 +++ 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Lib/packaging/database.py b/Lib/packaging/database.py index 67946a249b7..c71d608491a 100644 --- a/Lib/packaging/database.py +++ b/Lib/packaging/database.py @@ -158,17 +158,18 @@ class Distribution: self.name, self.version, self.path) def _get_records(self, local=False): + results = [] with self.get_distinfo_file('RECORD') as record: record_reader = csv.reader(record, delimiter=',', lineterminator='\n') - # XXX needs an explaining comment for row in record_reader: - path, checksum, size = (row[:] + - [None for i in range(len(row), 3)]) + missing = [None for i in range(len(row), 3)] + path, checksum, size = row + missing if local: path = path.replace('/', os.sep) path = os.path.join(sys.prefix, path) - yield path, checksum, size + results.append((path, checksum, size)) + return results def get_resource_path(self, relative_path): with self.get_distinfo_file('RESOURCES') as resources_file: @@ -197,7 +198,8 @@ class Distribution: :type local: boolean :returns: iterator of (path, md5, size) """ - return self._get_records(local) + for result in self._get_records(local): + yield result def uses(self, path): """ diff --git a/Lib/packaging/tests/test_uninstall.py b/Lib/packaging/tests/test_uninstall.py index 0ef7f3be90b..c7702dedc30 100644 --- a/Lib/packaging/tests/test_uninstall.py +++ b/Lib/packaging/tests/test_uninstall.py @@ -93,7 +93,6 @@ class UninstallTestCase(support.TempdirManager, self.assertRaises(PackagingError, remove, 'Foo', paths=[self.root_dir]) - @unittest.skipIf(sys.platform == 'win32', 'deactivated for now') def test_uninstall(self): dist, install_lib = self.install_dist() self.assertIsFile(install_lib, 'foo', '__init__.py') @@ -103,7 +102,6 @@ class UninstallTestCase(support.TempdirManager, self.assertIsNotFile(install_lib, 'foo', 'sub', '__init__.py') self.assertIsNotFile(install_lib, 'Foo-0.1.dist-info', 'RECORD') - @unittest.skipIf(sys.platform == 'win32', 'deactivated for now') def test_remove_issue(self): # makes sure if there are OSErrors (like permission denied) # remove() stops and display a clean error diff --git a/Misc/ACKS b/Misc/ACKS index 0662bae2898..6879c98a193 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -419,6 +419,7 @@ Jonathan Hogg Gerrit Holl Shane Holloway Rune Holm +Thomas Holmes Philip Homburg Naofumi Honda Jeffrey Honig diff --git a/Misc/NEWS b/Misc/NEWS index c45a725aa53..cd0eab6a509 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -219,6 +219,9 @@ Core and Builtins Library ------- +- Issue #12504: Close file handles in a timely manner in packaging.database. + This fixes a bug with the remove (uninstall) feature on Windows. + - Issues #12169 and #10510: Factor out code used by various packaging commands to make HTTP POST requests, and make sure it uses CRLF.