scripts/x

branch
trunk
changeset 15
28dbd52a8bb8
parent 14
6f9e1bb59719
child 16
29794d4d41aa
--- a/scripts/x	Sun Dec 31 19:20:26 2006 -0500
+++ b/scripts/x	Sun Dec 31 19:25:16 2006 -0500
@@ -22,6 +22,7 @@
 import mimetypes
 import optparse
 import os
+import stat
 import subprocess
 import sys
 import tempfile
@@ -171,7 +172,6 @@
         pass
 
     def check_contents(self):
-        self.archive.seek(0, 0)
         archive_type = None
         filenames = self.get_filenames()
         try:
@@ -216,6 +216,7 @@
 
 class TarExtractor(BaseExtractor):
     def get_filenames(self):
+        self.archive.seek(0, 0)
         return ProcessStreamer(['tar', '-t'], self.archive)
 
     def extract_archive(self): 
@@ -231,6 +232,7 @@
         self.archive = StringIO()
 
     def get_filenames(self):
+        self.archive.seek(0, 0)
         return ProcessStreamer(['zipinfo', '-1', self.filename], None)
 
     def extract_archive(self):
@@ -239,6 +241,7 @@
 
 class CpioExtractor(BaseExtractor):
     def get_filenames(self):
+        self.archive.seek(0, 0)
         return ProcessStreamer(['cpio', '-t'], self.archive,
                                stderr=subprocess.PIPE)
 
@@ -301,11 +304,11 @@
             pieces.pop()
         return '.'.join(pieces)
 
-    def suggest_target(self):
-        return FilenameChecker().check(self.basename())
+    def get_filenames(self):
+        yield self.basename()
 
     def check_contents(self):
-        return self.basename()
+        return DECOMPRESSED
 
     def extract(self, path):
         output = open(path, 'w')
@@ -322,20 +325,37 @@
 
     def extract(self):
         checker = self.extractor.name_checker(self.extractor.basename())
-        if self.options.overwrite or checker.is_free():
+        if self.options.flat:
+            self.target = '.'
+            return self.do_extract('.')
+        elif self.options.overwrite or checker.is_free():
             self.target = self.extractor.basename()
-            self.overwrite()
+            return self.overwrite()
         else:
             self.target = checker.check()
-            self.safe_extract()
+            return self.safe_extract()
 
     def do_extract(self, directory):
         try:
             self.extractor.extract(directory)
         except ExtractorError, error:
-            return error.strerror
+            return str(error)
         
     def cleanup(self):
+        if self.options.flat:
+            self.cleanup_files()
+        else:
+            self.cleanup_directory()
+
+    def cleanup_files(self):
+        for filename in self.extractor.get_filenames():
+            stat_info = os.stat(filename)
+            perms = stat.S_IRUSR | stat.S_IWUSR
+            if stat.S_ISDIR(stat_info.st_mode):
+                perms |= stat.S_IXUSR
+            os.chmod(filename, stat_info.st_mode | perms)
+
+    def cleanup_directory(self):
         command = 'find'
         status = subprocess.call(['find', self.target, '-type', 'd',
                                   '-exec', 'chmod', 'u+rwx', '{}', ';'])
@@ -412,9 +432,9 @@
         parser.add_option('-o', '--overwrite', dest='overwrite',
                           action='store_true', default=False,
                           help='overwrite any existing target directory')
-##         parser.add_option('-f', '--flat', '--no-directory', dest='flat',
-##                           action='store_true', default=False,
-##                           help="don't put contents in their own directory")
+        parser.add_option('-f', '--flat', '--no-directory', dest='flat',
+                          action='store_true', default=False,
+                          help="don't put contents in their own directory")
 ##         parser.add_option('-n', '--noninteractive', dest='batch',
 ##                           action='store_true', default=False,
 ##                           help="don't ask how to handle special cases")

mercurial