~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Robert Collins
  • Date: 2005-10-03 05:54:35 UTC
  • mto: (1393.1.30)
  • mto: This revision was merged to the branch mainline in revision 1400.
  • Revision ID: robertc@robertcollins.net-20051003055434-c8ebd30d1de10247
move exporting functionality into inventory.py - uncovers bug in symlink support

Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
import os.path
32
32
import re
33
33
import sys
 
34
import tarfile
34
35
import types
35
36
 
36
37
import bzrlib
37
38
from bzrlib.errors import BzrError, BzrCheckError
38
39
 
39
 
from bzrlib.osutils import quotefn, splitpath, joinpath, appendpath, sha_strings
 
40
from bzrlib.osutils import (pumpfile, quotefn, splitpath, joinpath,
 
41
                            appendpath, sha_strings)
40
42
from bzrlib.trace import mutter
41
43
from bzrlib.errors import NotVersionedError
42
44
 
184
186
                else:
185
187
                    print >>output_to, '=== target is %r' % self.symlink_target
186
188
 
 
189
    def get_tar_item(self, root, dp, now, tree):
 
190
        item = tarfile.TarInfo(os.path.join(root, dp))
 
191
        # TODO: would be cool to actually set it to the timestamp of the
 
192
        # revision it was last changed
 
193
        item.mtime = now
 
194
        if self.kind == 'directory':
 
195
            item.type = tarfile.DIRTYPE
 
196
            fileobj = None
 
197
            item.name += '/'
 
198
            item.size = 0
 
199
            item.mode = 0755
 
200
        elif self.kind == 'file':
 
201
            item.type = tarfile.REGTYPE
 
202
            fileobj = tree.get_file(self.file_id)
 
203
            item.size = self.text_size
 
204
            if tree.is_executable(self.file_id):
 
205
                item.mode = 0755
 
206
            else:
 
207
                item.mode = 0644
 
208
        else:
 
209
            raise BzrError("don't know how to export {%s} of kind %r" %
 
210
                    (self.file_id, self.kind))
 
211
        return item, fileobj
 
212
 
187
213
    def has_text(self):
188
214
        """Return true if the object this entry represents has textual data.
189
215
 
244
270
 
245
271
    known_kinds = ('file', 'directory', 'symlink', 'root_directory')
246
272
 
 
273
    def put_on_disk(self, dest, dp, tree):
 
274
        """Create a representation of self on disk in the prefix dest."""
 
275
        fullpath = appendpath(dest, dp)
 
276
        if self.kind == 'directory':
 
277
            os.mkdir(fullpath)
 
278
        elif self.kind == 'file':
 
279
            pumpfile(tree.get_file(self.file_id), file(fullpath, 'wb'))
 
280
            if tree.is_executable(self.file_id):
 
281
                os.chmod(fullpath, 0755)
 
282
        elif self.kind == 'symlink':
 
283
            try:
 
284
                os.symlink(self.symlink_target, fullpath)
 
285
            except OSError,e:
 
286
                raise BzrError("Failed to create symlink %r -> %r, error: %s" % (fullpath, self.symlink_target, e))
 
287
        else:
 
288
            raise BzrError("don't know how to export {%s} of kind %r" % (self.file_id, self.kind))
 
289
        mutter("  export {%s} kind %s to %s" % (self.file_id, self.kind, fullpath))
 
290
 
247
291
    def sorted_children(self):
248
292
        l = self.children.items()
249
293
        l.sort()