~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/bundle/bundle_data.py

(gz) Fix test failure on alpha by correcting format string for
 gc_chk_sha1_record (Martin [gz])

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
288
286
            warning('Inventory sha hash mismatch for revision %s. %s'
289
287
                    ' != %s' % (revision_id, sha1, rev.inventory_sha1))
290
288
 
291
 
    def _validate_revision(self, tree, revision_id):
 
289
    def _validate_revision(self, inventory, revision_id):
292
290
        """Make sure all revision entries match their checksum."""
293
291
 
294
292
        # This is a mapping from each revision id to its sha hash
300
298
            raise AssertionError()
301
299
        if not (rev.revision_id == revision_id):
302
300
            raise AssertionError()
303
 
        sha1 = self._testament_sha1(rev, tree)
 
301
        sha1 = self._testament_sha1(rev, inventory)
304
302
        if sha1 != rev_info.sha1:
305
303
            raise TestamentMismatch(rev.revision_id, rev_info.sha1, sha1)
306
304
        if rev.revision_id in rev_to_sha1:
464
462
 
465
463
 
466
464
class BundleTree(Tree):
467
 
 
468
465
    def __init__(self, base_tree, revision_id):
469
466
        self.base_tree = base_tree
470
467
        self._renamed = {} # Mapping from old_path => new_path
641
638
                'Malformed patch for %s, %r' % (file_id, file_patch))
642
639
        return patched_file(file_patch, patch_original)
643
640
 
644
 
    def get_symlink_target(self, file_id, path=None):
645
 
        if path is None:
646
 
            path = self.id2path(file_id)
 
641
    def get_symlink_target(self, file_id):
 
642
        new_path = self.id2path(file_id)
647
643
        try:
648
 
            return self._targets[path]
 
644
            return self._targets[new_path]
649
645
        except KeyError:
650
646
            return self.base_tree.get_symlink_target(file_id)
651
647
 
665
661
        path = self.id2path(file_id)
666
662
        if path in self._last_changed:
667
663
            return self._last_changed[path]
668
 
        return self.base_tree.get_file_revision(file_id)
 
664
        return self.base_tree.inventory[file_id].revision
669
665
 
670
666
    def get_size_and_sha1(self, file_id):
671
667
        """Return the size and sha1 hash of the given file id.
716
712
                ie.executable = self.is_executable(file_id)
717
713
            elif kind == 'symlink':
718
714
                ie = InventoryLink(file_id, name, parent_id)
719
 
                ie.symlink_target = self.get_symlink_target(file_id, path)
 
715
                ie.symlink_target = self.get_symlink_target(file_id)
720
716
            ie.revision = revision_id
721
717
 
722
718
            if kind == 'file':
743
739
        for path, entry in self.inventory.iter_entries():
744
740
            yield entry.file_id
745
741
 
746
 
    def list_files(self, include_root=False, from_dir=None, recursive=True):
747
 
        # The only files returned by this are those from the version
748
 
        inv = self.inventory
749
 
        if from_dir is None:
750
 
            from_dir_id = None
751
 
        else:
752
 
            from_dir_id = inv.path2id(from_dir)
753
 
            if from_dir_id is None:
754
 
                # Directory not versioned
755
 
                return
756
 
        entries = inv.iter_entries(from_dir=from_dir_id, recursive=recursive)
757
 
        if inv.root is not None and not include_root and from_dir is None:
758
 
            # skip the root for compatability with the current apis.
759
 
            entries.next()
760
 
        for path, entry in entries:
761
 
            yield path, 'V', entry.kind, entry.file_id, entry
762
 
 
763
742
    def sorted_path_id(self):
764
743
        paths = []
765
744
        for result in self._new_id.iteritems():
766
745
            paths.append(result)
767
 
        for id in self.base_tree.all_file_ids():
 
746
        for id in self.base_tree:
768
747
            path = self.id2path(id)
769
748
            if path is None:
770
749
                continue