scripts/x

branch
trunk
changeset 2
1570351bf863
parent 1
a86a0cb0dd57
child 5
36f352abd093
equal deleted inserted replaced
1:a86a0cb0dd57 2:1570351bf863
114 def check_contents(self): 114 def check_contents(self):
115 self.archive.seek(0, 0) 115 self.archive.seek(0, 0)
116 filenames = self.get_filenames() 116 filenames = self.get_filenames()
117 try: 117 try:
118 first_part = filenames.next().split('/', 1)[0] + '/' 118 first_part = filenames.next().split('/', 1)[0] + '/'
119 except IndexError: 119 except StopIteration:
120 filenames.stop() 120 filenames.stop()
121 return EMPTY 121 return EMPTY
122 for filename in filenames: 122 for filename in filenames:
123 if not filename.startswith(first_part): 123 if not filename.startswith(first_part):
124 filenames.stop() 124 filenames.stop()
128 return MATCHING_DIRECTORY 128 return MATCHING_DIRECTORY
129 return ONE_DIRECTORY 129 return ONE_DIRECTORY
130 130
131 def basename(self): 131 def basename(self):
132 pieces = self.filename.split('.') 132 pieces = self.filename.split('.')
133 if mimetypes.encodings_map.has_key('.' + pieces.pop()): 133 extension = '.' + pieces[-1]
134 if mimetypes.encodings_map.has_key(extension):
135 pieces.pop()
136 extension = '.' + pieces[-1]
137 if (mimetypes.types_map.has_key(extension) or
138 mimetypes.common_types.has_key(extension) or
139 mimetypes.suffix_map.has_key(extension)):
134 pieces.pop() 140 pieces.pop()
135 return '.'.join(pieces) 141 return '.'.join(pieces)
136 142
137 def extract(self, path): 143 def extract(self, path):
138 self.archive.seek(0, 0) 144 self.archive.seek(0, 0)
175 class RPMExtractor(CpioExtractor): 181 class RPMExtractor(CpioExtractor):
176 def prepare(self): 182 def prepare(self):
177 self.pipe(['rpm2cpio', '-'], "rpm2cpio") 183 self.pipe(['rpm2cpio', '-'], "rpm2cpio")
178 184
179 def basename(self): 185 def basename(self):
180 return self.filename.rsplit('.', 2)[0] 186 pieces = self.filename.rsplit('.', 2)
187 if len(pieces) == 1:
188 return pieces[0]
189 elif pieces[-1] != 'rpm':
190 return BaseExtractor.basename(self)
191 pieces.pop()
192 if len(pieces) == 1:
193 return pieces[0]
194 elif len(pieces[-1]) < 6:
195 pieces.pop()
196 return '.'.join(pieces)
181 197
182 def check_contents(self): 198 def check_contents(self):
183 return BOMB 199 return BOMB
184 200
185 201
189 "data.tar.gz extraction") 205 "data.tar.gz extraction")
190 self.archive.seek(0, 0) 206 self.archive.seek(0, 0)
191 self.pipe(['zcat'], "data.tar.gz decompression") 207 self.pipe(['zcat'], "data.tar.gz decompression")
192 208
193 def basename(self): 209 def basename(self):
194 return self.filename.rsplit('_', 1)[0] 210 pieces = self.filename.rsplit('_', 1)
211 if len(pieces) == 1:
212 return pieces[0]
213 elif (len(pieces[-1]) > 10) or (not pieces[-1].endswith('.deb')):
214 return BaseExtractor.basename(self)
215 return pieces[0]
195 216
196 def check_contents(self): 217 def check_contents(self):
197 return BOMB 218 return BOMB
198 219
199 220
200 extractor_map = {'application/x-tar': TarExtractor, 221 extractor_map = {'application/x-tar': TarExtractor,
201 'application/zip': ZipExtractor, 222 'application/zip': ZipExtractor,
223 'application/x-msdos-program': ZipExtractor,
202 'application/x-debian-package': DebExtractor, 224 'application/x-debian-package': DebExtractor,
203 'application/x-redhat-package-manager': RPMExtractor, 225 'application/x-redhat-package-manager': RPMExtractor,
204 'application/x-shar': None, 226 'application/x-shar': None,
205 'application/x-cpio': CpioExtractor} 227 'application/x-cpio': CpioExtractor}
206 228

mercurial