16
17
from bzrlib.transform import TreeTransform, resolve_conflicts, cook_conflicts
17
18
from bzrlib.workingtree import WorkingTree
18
19
from bzrlib.plugins.bzrtools.bzrtools import open_from_url
20
from bzrlib.plugins.bzrtools import errors
20
22
class ZipFileWrapper(object):
278
280
if tree.changes_from(tree.basis_tree()).has_changed():
279
281
raise BzrCommandError("Working tree has uncommitted changes.")
281
if (source.endswith('.tar') or source.endswith('.tar.gz') or
282
source.endswith('.tar.bz2') or source.endswith('.tgz') or
283
source.endswith('.tar.lzma') or source.endswith('.tar.xz')):
285
tar_input = open_from_url(source)
286
if source.endswith('.bz2'):
288
tar_input = StringIO(bz2.decompress(tar_input.read()))
289
elif source.endswith('.xz') or source.endswith('.lzma'):
291
tar_input = StringIO(lzma.decompress(tar_input.read()))
293
if e.errno == errno.ENOENT:
294
raise NoSuchFile(source)
296
import_tar(tree, tar_input)
299
elif source.endswith('.zip'):
300
import_zip(tree, open_from_url(source))
301
elif file_kind(source) == 'directory':
284
archive, external_compressor = get_archive_type(source)
285
except errors.NotArchiveType:
286
if file_kind(source) == 'directory':
291
raise BzrCommandError('Unhandled import source')
306
raise BzrCommandError('Unhandled import source')
294
import_zip(tree, open_from_url(source))
295
elif archive == 'tar':
297
tar_input = open_from_url(source)
298
if external_compressor == 'bz2':
300
tar_input = StringIO(bz2.decompress(tar_input.read()))
301
elif external_compressor == 'lzma':
303
tar_input = StringIO(lzma.decompress(tar_input.read()))
305
if e.errno == errno.ENOENT:
306
raise NoSuchFile(source)
308
import_tar(tree, tar_input)
315
def get_archive_type(path):
316
"""Return the type of archive and compressor indicated by path name.
318
Only external compressors are returned, so zip files are only
319
('zip', None). .tgz is treated as ('tar', 'gz') and '.xz' is treated as
322
matches = re.match(r'.*\.(zip|tgz|tar(.(gz|bz2|lzma|xz))?)$', path)
324
raise errors.NotArchiveType(path)
325
external_compressor = None
326
if matches.group(3) is not None:
328
external_compressor = matches.group(3)
329
if external_compressor == 'xz':
330
external_compressor = 'lzma'
331
elif matches.group(1) == 'tgz':
334
archive = matches.group(1)
335
return archive, external_compressor