scripts/dtrx

branch
trunk
changeset 41
e3675644bbb6
parent 40
ee6a869f8da1
child 42
4a4cab75d5e6
--- a/scripts/dtrx	Fri Nov 23 17:55:07 2007 -0500
+++ b/scripts/dtrx	Mon Nov 26 22:31:25 2007 -0500
@@ -63,7 +63,7 @@
 
 mimetypes.encodings_map.setdefault('.bz2', 'bzip2')
 mimetypes.encodings_map.setdefault('.lzma', 'lzma')
-mimetypes.types_map.setdefault('.gem', 'x-ruby-gem')
+mimetypes.types_map.setdefault('.gem', 'application/x-ruby-gem')
 
 logger = logging.getLogger('dtrx-log')
 
@@ -88,14 +88,21 @@
     def is_free(self, filename):
         return not os.path.exists(filename)
 
+    def create(self):
+        fd, filename = tempfile.mkstemp(prefix=self.original_name + '.',
+                                        dir='.')
+        os.close(fd)
+        return filename
+
     def check(self):
+        if self.is_free(self.original_name):
+            return self.original_name
         for suffix in [''] + ['.%s' % (x,) for x in range(1, 10)]:
             filename = '%s%s' % (self.original_name, suffix)
             if self.is_free(filename):
                 return filename
-        raise ValueError("all alternatives for name %s taken" %
-                         (self.original_name,))
-        
+        return self.create()
+
 
 class DirectoryChecker(FilenameChecker):
     def is_free(self, filename):
@@ -107,6 +114,9 @@
             raise
         return True
 
+    def create(self):
+        return tempfile.mkdtemp(prefix=self.original_name + '.', dir='.')
+
 
 class ExtractorError(Exception):
     pass
@@ -141,11 +151,11 @@
         self.pipes.append((command, description))
 
     def run_pipes(self, final_stdout=None):
-        if final_stdout is None:
+        if not self.pipes:
+            return
+        elif final_stdout is None:
             # FIXME: Buffering this might be dumb.
             final_stdout = tempfile.TemporaryFile()
-        if not self.pipes:
-            return
         num_pipes = len(self.pipes)
         last_pipe = num_pipes - 1
         processes = []
@@ -447,6 +457,12 @@
             return "%s returned with exit status %s" % (command, status)
         return self.organize()
 
+    def set_target(self, target, checker):
+        self.target = checker(target).check()
+        if self.target != target:
+            logger.warning("extracting %s to %s" %
+                           (self.extractor.filename, self.target))
+
 
 # The "where to extract" table, with options and archive types.
 # This dictates the contents of each can_handle method.
@@ -513,7 +529,7 @@
             destination = self.extractor.content_name.rstrip('/')
         else:
             destination = self.extractor.basename()
-        self.target = checker(destination).check()
+        self.set_target(destination, checker)
         if os.path.isdir(self.extractor.target):
             os.rename(source, self.target)
             os.rmdir(self.extractor.target)
@@ -537,7 +553,7 @@
 
     def organize(self):
         basename = self.extractor.basename()
-        self.target = self.extractor.name_checker(basename).check()
+        self.set_target(basename, self.extractor.name_checker)
         os.rename(self.extractor.target, self.target)
 
         

mercurial