~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

  • Committer: Aaron Bentley
  • Date: 2005-07-26 14:06:11 UTC
  • mto: (1092.1.41) (1185.3.4) (974.1.47)
  • mto: This revision was merged to the branch mainline in revision 982.
  • Revision ID: abentley@panoramicfeedback.com-20050726140611-403e366f3c79c1f1
Fixed python invocation

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
"""Tree classes, representing directory at point in time.
18
18
"""
19
19
 
20
 
from sets import Set
21
 
import os.path, os, fnmatch, time
22
 
 
23
 
from osutils import pumpfile, filesize, quotefn, sha_file, \
24
 
     joinpath, splitpath, appendpath, isdir, isfile, file_kind, fingerprint_file
25
 
import errno
26
 
from stat import S_ISREG, S_ISDIR, ST_MODE, ST_SIZE
27
 
 
28
 
from bzrlib.inventory import Inventory
 
20
from osutils import pumpfile, appendpath, fingerprint_file
 
21
import os
 
22
 
29
23
from bzrlib.trace import mutter, note
30
24
from bzrlib.errors import BzrError
31
 
import branch
32
25
 
33
26
import bzrlib
34
27
 
101
94
        pumpfile(self.get_file(fileid), sys.stdout)
102
95
        
103
96
        
104
 
    def export(self, dest, format='dir'):
 
97
    def export(self, dest, format='dir', root=None):
105
98
        """Export this tree."""
106
99
        try:
107
100
            exporter = exporters[format]
108
101
        except KeyError:
 
102
            from bzrlib.errors import BzrCommandError
109
103
            raise BzrCommandError("export format %r not supported" % format)
110
 
        exporter(self, dest)
 
104
        exporter(self, dest, root)
111
105
 
112
106
 
113
107
 
149
143
 
150
144
 
151
145
class EmptyTree(Tree):
152
 
    def __init__(self):
153
 
        self._inventory = Inventory()
 
146
    def __init__(self, root_id):
 
147
        from bzrlib.inventory import Inventory
 
148
        self._inventory = Inventory(root_id)
154
149
 
155
150
    def has_filename(self, filename):
156
151
        return False
230
225
######################################################################
231
226
# export
232
227
 
233
 
def dir_exporter(tree, dest):
 
228
def dir_exporter(tree, dest, root):
234
229
    """Export this tree to a new directory.
235
230
 
236
231
    `dest` should not exist, and will be created holding the
242
237
    :note: If the export fails, the destination directory will be
243
238
           left in a half-assed state.
244
239
    """
 
240
    import os
245
241
    os.mkdir(dest)
246
242
    mutter('export version %r' % tree)
247
243
    inv = tree.inventory
262
258
except ImportError:
263
259
    pass
264
260
else:
265
 
    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):
266
284
        """Export this tree to a new tar file.
267
285
 
268
286
        `dest` will be created holding the contents of this tree; if it
269
287
        already exists, it will be clobbered, like with "tar -c".
270
288
        """
271
 
        now = time.time()
 
289
        from time import time
 
290
        now = time()
272
291
        compression = str(compression or '')
 
292
        if root is None:
 
293
            root = get_root_name(dest)
273
294
        try:
274
295
            ball = tarfile.open(dest, 'w:' + compression)
275
296
        except tarfile.CompressionError, e:
278
299
        inv = tree.inventory
279
300
        for dp, ie in inv.iter_entries():
280
301
            mutter("  export {%s} kind %s to %s" % (ie.file_id, ie.kind, dest))
281
 
            item = tarfile.TarInfo(dp)
 
302
            item = tarfile.TarInfo(os.path.join(root, dp))
282
303
            # TODO: would be cool to actually set it to the timestamp of the
283
304
            # revision it was last changed
284
305
            item.mtime = now
301
322
        ball.close()
302
323
    exporters['tar'] = tar_exporter
303
324
 
304
 
    def tgz_exporter(tree, dest):
305
 
        tar_exporter(tree, dest, compression='gz')
 
325
    def tgz_exporter(tree, dest, root):
 
326
        tar_exporter(tree, dest, root, compression='gz')
306
327
    exporters['tgz'] = tgz_exporter
307
328
 
308
 
    def tbz_exporter(tree, dest):
309
 
        tar_exporter(tree, dest, compression='bz2')
 
329
    def tbz_exporter(tree, dest, root):
 
330
        tar_exporter(tree, dest, root, compression='bz2')
310
331
    exporters['tbz2'] = tbz_exporter
311
332
 
312
333