~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/bundle/bundle_data.py

  • Committer: Jelmer Vernooij
  • Date: 2010-04-30 11:03:59 UTC
  • mto: This revision was merged to the branch mainline in revision 5197.
  • Revision ID: jelmer@samba.org-20100430110359-ow3e3grh7sxy93pa
Remove more unused imports.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2006 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
25
25
    osutils,
26
26
    timestamp,
27
27
    )
 
28
import bzrlib.errors
28
29
from bzrlib.bundle import apply_bundle
29
 
from bzrlib.errors import (
30
 
    TestamentMismatch,
31
 
    BzrError,
32
 
    )
33
 
from bzrlib.inventory import (
34
 
    Inventory,
35
 
    InventoryDirectory,
36
 
    InventoryFile,
37
 
    InventoryLink,
38
 
    )
39
 
from bzrlib.osutils import sha_string, pathjoin
 
30
from bzrlib.errors import (TestamentMismatch, BzrError,
 
31
                           MalformedHeader, MalformedPatches, NotABundle)
 
32
from bzrlib.inventory import (Inventory, InventoryEntry,
 
33
                              InventoryDirectory, InventoryFile,
 
34
                              InventoryLink)
 
35
from bzrlib.osutils import sha_file, sha_string, pathjoin
40
36
from bzrlib.revision import Revision, NULL_REVISION
41
37
from bzrlib.testament import StrictTestament
42
38
from bzrlib.trace import mutter, warning
 
39
import bzrlib.transport
43
40
from bzrlib.tree import Tree
 
41
import bzrlib.urlutils
44
42
from bzrlib.xml5 import serializer_v5
45
43
 
46
44
 
208
206
 
209
207
        inv = bundle_tree.inventory
210
208
        self._validate_inventory(inv, revision_id)
211
 
        self._validate_revision(bundle_tree, revision_id)
 
209
        self._validate_revision(inv, revision_id)
212
210
 
213
211
        return bundle_tree
214
212
 
280
278
        if rev.revision_id != revision_id:
281
279
            raise AssertionError()
282
280
        if sha1 != rev.inventory_sha1:
283
 
            f = open(',,bogus-inv', 'wb')
284
 
            try:
285
 
                f.write(s)
286
 
            finally:
287
 
                f.close()
 
281
            open(',,bogus-inv', 'wb').write(s)
288
282
            warning('Inventory sha hash mismatch for revision %s. %s'
289
283
                    ' != %s' % (revision_id, sha1, rev.inventory_sha1))
290
284
 
291
 
    def _validate_revision(self, tree, revision_id):
 
285
    def _validate_revision(self, inventory, revision_id):
292
286
        """Make sure all revision entries match their checksum."""
293
287
 
294
 
        # This is a mapping from each revision id to its sha hash
 
288
        # This is a mapping from each revision id to it's sha hash
295
289
        rev_to_sha1 = {}
296
290
 
297
291
        rev = self.get_revision(revision_id)
300
294
            raise AssertionError()
301
295
        if not (rev.revision_id == revision_id):
302
296
            raise AssertionError()
303
 
        sha1 = self._testament_sha1(rev, tree)
 
297
        sha1 = self._testament_sha1(rev, inventory)
304
298
        if sha1 != rev_info.sha1:
305
299
            raise TestamentMismatch(rev.revision_id, rev_info.sha1, sha1)
306
300
        if rev.revision_id in rev_to_sha1:
333
327
                try:
334
328
                    name, value = info_item.split(':', 1)
335
329
                except ValueError:
336
 
                    raise ValueError('Value %r has no colon' % info_item)
 
330
                    raise 'Value %r has no colon' % info_item
337
331
                if name == 'last-changed':
338
332
                    last_changed = value
339
333
                elif name == 'executable':
464
458
 
465
459
 
466
460
class BundleTree(Tree):
467
 
 
468
461
    def __init__(self, base_tree, revision_id):
469
462
        self.base_tree = base_tree
470
463
        self._renamed = {} # Mapping from old_path => new_path
664
657
        path = self.id2path(file_id)
665
658
        if path in self._last_changed:
666
659
            return self._last_changed[path]
667
 
        return self.base_tree.get_file_revision(file_id)
 
660
        return self.base_tree.inventory[file_id].revision
668
661
 
669
662
    def get_size_and_sha1(self, file_id):
670
663
        """Return the size and sha1 hash of the given file id.
718
711
                ie.symlink_target = self.get_symlink_target(file_id)
719
712
            ie.revision = revision_id
720
713
 
721
 
            if kind == 'file':
 
714
            if kind in ('directory', 'symlink'):
 
715
                ie.text_size, ie.text_sha1 = None, None
 
716
            else:
722
717
                ie.text_size, ie.text_sha1 = self.get_size_and_sha1(file_id)
723
 
                if ie.text_size is None:
724
 
                    raise BzrError(
725
 
                        'Got a text_size of None for file_id %r' % file_id)
 
718
            if (ie.text_size is None) and (kind == 'file'):
 
719
                raise BzrError('Got a text_size of None for file_id %r' % file_id)
726
720
            inv.add(ie)
727
721
 
728
722
        sorted_entries = self.sorted_path_id()
742
736
        for path, entry in self.inventory.iter_entries():
743
737
            yield entry.file_id
744
738
 
745
 
    def list_files(self, include_root=False, from_dir=None, recursive=True):
746
 
        # The only files returned by this are those from the version
747
 
        inv = self.inventory
748
 
        if from_dir is None:
749
 
            from_dir_id = None
750
 
        else:
751
 
            from_dir_id = inv.path2id(from_dir)
752
 
            if from_dir_id is None:
753
 
                # Directory not versioned
754
 
                return
755
 
        entries = inv.iter_entries(from_dir=from_dir_id, recursive=recursive)
756
 
        if inv.root is not None and not include_root and from_dir is None:
757
 
            # skip the root for compatability with the current apis.
758
 
            entries.next()
759
 
        for path, entry in entries:
760
 
            yield path, 'V', entry.kind, entry.file_id, entry
761
 
 
762
739
    def sorted_path_id(self):
763
740
        paths = []
764
741
        for result in self._new_id.iteritems():