~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

  • Committer: Martin Pool
  • Date: 2005-07-07 02:07:03 UTC
  • Revision ID: mbp@sourcefrog.net-20050707020702-0e24e478b738d4db
- Put files inside an exported tarball into a top-level directory rather than 
  dumping them into the current directory.  

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
"""
19
19
 
20
20
from osutils import pumpfile, appendpath, fingerprint_file
 
21
import os
21
22
 
22
23
from bzrlib.trace import mutter, note
23
24
from bzrlib.errors import BzrError
93
94
        pumpfile(self.get_file(fileid), sys.stdout)
94
95
        
95
96
        
96
 
    def export(self, dest, format='dir'):
 
97
    def export(self, dest, format='dir', root=None):
97
98
        """Export this tree."""
98
99
        try:
99
100
            exporter = exporters[format]
100
101
        except KeyError:
 
102
            from bzrlib.errors import BzrCommandError
101
103
            raise BzrCommandError("export format %r not supported" % format)
102
 
        exporter(self, dest)
 
104
        exporter(self, dest, root)
103
105
 
104
106
 
105
107
 
223
225
######################################################################
224
226
# export
225
227
 
226
 
def dir_exporter(tree, dest):
 
228
def dir_exporter(tree, dest, root):
227
229
    """Export this tree to a new directory.
228
230
 
229
231
    `dest` should not exist, and will be created holding the
256
258
except ImportError:
257
259
    pass
258
260
else:
259
 
    def tar_exporter(tree, dest, compression=None):
 
261
    def get_root_name(dest):
 
262
        """Get just the root name for a tarball.
 
263
 
 
264
        >>> get_root_name('mytar.tar')
 
265
        'mytar'
 
266
        >>> get_root_name('mytar.tar.bz2')
 
267
        'mytar'
 
268
        >>> get_root_name('tar.tar.tar.tgz')
 
269
        'tar.tar.tar'
 
270
        >>> get_root_name('bzr-0.0.5.tar.gz')
 
271
        'bzr-0.0.5'
 
272
        >>> get_root_name('a/long/path/mytar.tgz')
 
273
        'mytar'
 
274
        >>> get_root_name('../parent/../dir/other.tbz2')
 
275
        'other'
 
276
        """
 
277
        endings = ['.tar', '.tar.gz', '.tgz', '.tar.bz2', '.tbz2']
 
278
        dest = os.path.basename(dest)
 
279
        for end in endings:
 
280
            if dest.endswith(end):
 
281
                return dest[:-len(end)]
 
282
 
 
283
    def tar_exporter(tree, dest, root, compression=None):
260
284
        """Export this tree to a new tar file.
261
285
 
262
286
        `dest` will be created holding the contents of this tree; if it
265
289
        from time import time
266
290
        now = time()
267
291
        compression = str(compression or '')
 
292
        if root is None:
 
293
            root = get_root_name(dest)
268
294
        try:
269
295
            ball = tarfile.open(dest, 'w:' + compression)
270
296
        except tarfile.CompressionError, e:
273
299
        inv = tree.inventory
274
300
        for dp, ie in inv.iter_entries():
275
301
            mutter("  export {%s} kind %s to %s" % (ie.file_id, ie.kind, dest))
276
 
            item = tarfile.TarInfo(dp)
 
302
            item = tarfile.TarInfo(os.path.join(root, dp))
277
303
            # TODO: would be cool to actually set it to the timestamp of the
278
304
            # revision it was last changed
279
305
            item.mtime = now
296
322
        ball.close()
297
323
    exporters['tar'] = tar_exporter
298
324
 
299
 
    def tgz_exporter(tree, dest):
300
 
        tar_exporter(tree, dest, compression='gz')
 
325
    def tgz_exporter(tree, dest, root):
 
326
        tar_exporter(tree, dest, root, compression='gz')
301
327
    exporters['tgz'] = tgz_exporter
302
328
 
303
 
    def tbz_exporter(tree, dest):
304
 
        tar_exporter(tree, dest, compression='bz2')
 
329
    def tbz_exporter(tree, dest, root):
 
330
        tar_exporter(tree, dest, root, compression='bz2')
305
331
    exporters['tbz2'] = tbz_exporter
306
332
 
307
333