~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/bundle/bundle_data.py

  • Committer: Jelmer Vernooij
  • Date: 2009-04-17 00:10:45 UTC
  • mto: This revision was merged to the branch mainline in revision 4299.
  • Revision ID: jelmer@samba.org-20090417001045-8elg0p1apb0w8bnm
Don't retrieve the tree if log is called on the root.

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
641
634
                'Malformed patch for %s, %r' % (file_id, file_patch))
642
635
        return patched_file(file_patch, patch_original)
643
636
 
644
 
    def get_symlink_target(self, file_id, path=None):
645
 
        if path is None:
646
 
            path = self.id2path(file_id)
 
637
    def get_symlink_target(self, file_id):
 
638
        new_path = self.id2path(file_id)
647
639
        try:
648
 
            return self._targets[path]
 
640
            return self._targets[new_path]
649
641
        except KeyError:
650
642
            return self.base_tree.get_symlink_target(file_id)
651
643
 
665
657
        path = self.id2path(file_id)
666
658
        if path in self._last_changed:
667
659
            return self._last_changed[path]
668
 
        return self.base_tree.get_file_revision(file_id)
 
660
        return self.base_tree.inventory[file_id].revision
669
661
 
670
662
    def get_size_and_sha1(self, file_id):
671
663
        """Return the size and sha1 hash of the given file id.
716
708
                ie.executable = self.is_executable(file_id)
717
709
            elif kind == 'symlink':
718
710
                ie = InventoryLink(file_id, name, parent_id)
719
 
                ie.symlink_target = self.get_symlink_target(file_id, path)
 
711
                ie.symlink_target = self.get_symlink_target(file_id)
720
712
            ie.revision = revision_id
721
713
 
722
 
            if kind == 'file':
 
714
            if kind in ('directory', 'symlink'):
 
715
                ie.text_size, ie.text_sha1 = None, None
 
716
            else:
723
717
                ie.text_size, ie.text_sha1 = self.get_size_and_sha1(file_id)
724
 
                if ie.text_size is None:
725
 
                    raise BzrError(
726
 
                        '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)
727
720
            inv.add(ie)
728
721
 
729
722
        sorted_entries = self.sorted_path_id()
743
736
        for path, entry in self.inventory.iter_entries():
744
737
            yield entry.file_id
745
738
 
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
739
    def sorted_path_id(self):
764
740
        paths = []
765
741
        for result in self._new_id.iteritems():
766
742
            paths.append(result)
767
 
        for id in self.base_tree.all_file_ids():
 
743
        for id in self.base_tree:
768
744
            path = self.id2path(id)
769
745
            if path is None:
770
746
                continue