[tor-commits] [stem/master] Avoiding the 'with' keyword for tarfile

atagar at torproject.org atagar at torproject.org
Mon Jun 25 01:45:02 UTC 2012


commit e51fea598dced5e3c4a05c4cd0ad509beed530fe
Author: Damian Johnson <atagar at torproject.org>
Date:   Thu Jun 21 09:45:14 2012 -0700

    Avoiding the 'with' keyword for tarfile
    
    The tarfile's __exit__() method was added sometime after python 2.5, causing it
    to produce a stacktrace if used via the 'with' keyword. Pity, yet another hack
    to accomidate a six-year-old version of python...
---
 stem/descriptor/reader.py |   31 ++++++++++++++++++++-----------
 1 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/stem/descriptor/reader.py b/stem/descriptor/reader.py
index 7a7e565..716b58c 100644
--- a/stem/descriptor/reader.py
+++ b/stem/descriptor/reader.py
@@ -443,22 +443,31 @@ class DescriptorReader:
       self._notify_skip_listeners(target, ReadFailed(exc))
   
   def _handle_archive(self, target):
+    # TODO: This would be nicer via the 'with' keyword, but tarfile's __exit__
+    # method was added sometime after python 2.5. We should change this when
+    # we drop python 2.5 support.
+    
+    tar_file = None
+    
     try:
-      with tarfile.open(target) as tar_file:
-        for tar_entry in tar_file:
-          if tar_entry.isfile():
-            entry = tar_file.extractfile(tar_entry)
-            
-            for desc in stem.descriptor.parse_file(target, entry):
-              if self._is_stopped.isSet(): return
-              self._unreturned_descriptors.put(desc)
-              self._iter_notice.set()
-            
-            entry.close()
+      tar_file = tarfile.open(target)
+      
+      for tar_entry in tar_file:
+        if tar_entry.isfile():
+          entry = tar_file.extractfile(tar_entry)
+          
+          for desc in stem.descriptor.parse_file(target, entry):
+            if self._is_stopped.isSet(): return
+            self._unreturned_descriptors.put(desc)
+            self._iter_notice.set()
+          
+          entry.close()
     except TypeError, exc:
       self._notify_skip_listeners(target, ParsingFailure(exc))
     except IOError, exc:
       self._notify_skip_listeners(target, ReadFailed(exc))
+    finally:
+      if tar_file: tar_file.close()
   
   def _notify_skip_listeners(self, path, exception):
     for listener in self._skip_listeners:





More information about the tor-commits mailing list