~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/repository.py

  • Committer: Alexander Belchenko
  • Date: 2006-07-31 16:12:57 UTC
  • mto: (1711.2.111 jam-integration)
  • mto: This revision was merged to the branch mainline in revision 1906.
  • Revision ID: bialix@ukr.net-20060731161257-91a231523255332c
new official bzr.ico

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
from bzrlib.errors import InvalidRevisionId
27
27
from bzrlib.graph import Graph
28
28
from bzrlib.inter import InterObject
29
 
from bzrlib.inventory import Inventory, InventoryDirectory, ROOT_ID
 
29
from bzrlib.inventory import Inventory
30
30
from bzrlib.knit import KnitVersionedFile, KnitPlainFactory
31
31
from bzrlib.lockable_files import LockableFiles, TransportLock
32
32
from bzrlib.lockdir import LockDir
36
36
from bzrlib.revisiontree import RevisionTree
37
37
from bzrlib.store.versioned import VersionedFileStore, WeaveStore
38
38
from bzrlib.store.text import TextStore
39
 
from bzrlib import symbol_versioning
40
39
from bzrlib.symbol_versioning import (deprecated_method,
41
40
        zero_nine, 
42
41
        )
43
42
from bzrlib.testament import Testament
44
 
from bzrlib.trace import mutter, note, warning
 
43
from bzrlib.trace import mutter, note
45
44
from bzrlib.tsort import topo_sort
46
45
from bzrlib.weave import WeaveFile
47
46
 
48
47
 
49
 
# Old formats display a warning, but only once
50
 
_deprecation_warning_done = False
51
 
 
52
 
 
53
48
class Repository(object):
54
49
    """Repository holding history for one or more branches.
55
50
 
74
69
        assert inv.revision_id is None or inv.revision_id == revid, \
75
70
            "Mismatch between inventory revision" \
76
71
            " id and insertion revid (%r, %r)" % (inv.revision_id, revid)
77
 
        assert inv.root is not None
78
72
        inv_text = xml5.serializer_v5.write_inventory_to_string(inv)
79
73
        inv_sha1 = osutils.sha_string(inv_text)
80
74
        inv_vf = self.control_weaves.get_weave('inventory',
194
188
        self.control_weaves = control_store
195
189
        # TODO: make sure to construct the right store classes, etc, depending
196
190
        # on whether escaping is required.
197
 
        self._warn_if_deprecated()
198
191
 
199
192
    def __repr__(self):
200
193
        return '%s(%r)' % (self.__class__.__name__, 
262
255
        :param revprops: Optional dictionary of revision properties.
263
256
        :param revision_id: Optional revision id.
264
257
        """
265
 
        return _CommitBuilder(self, parents, config, timestamp, timezone,
266
 
                              committer, revprops, revision_id)
 
258
        return CommitBuilder(self, parents, config, timestamp, timezone,
 
259
                             committer, revprops, revision_id)
267
260
 
268
261
    def unlock(self):
269
262
        self.control_files.unlock()
450
443
        :param revision_id: The expected revision id of the inventory.
451
444
        :param xml: A serialised inventory.
452
445
        """
453
 
        result = xml5.serializer_v5.read_inventory_from_string(xml)
454
 
        result.root.revision = revision_id
455
 
        return result
 
446
        return xml5.serializer_v5.read_inventory_from_string(xml)
456
447
 
457
448
    @needs_read_lock
458
449
    def get_inventory_xml(self, revision_id):
689
680
        result.check()
690
681
        return result
691
682
 
692
 
    def _warn_if_deprecated(self):
693
 
        global _deprecation_warning_done
694
 
        if _deprecation_warning_done:
695
 
            return
696
 
        _deprecation_warning_done = True
697
 
        warning("Format %s for %s is deprecated - please use 'bzr upgrade' to get better performance"
698
 
                % (self._format, self.bzrdir.transport.base))
699
 
 
700
683
 
701
684
class AllInOneRepository(Repository):
702
685
    """Legacy support - the repository behaviour for all-in-one branches."""
809
792
                                                _revision_store,
810
793
                                                control_store,
811
794
                                                text_store)
 
795
 
812
796
        dir_mode = self.control_files._dir_mode
813
797
        file_mode = self.control_files._file_mode
814
798
 
843
827
class KnitRepository(MetaDirRepository):
844
828
    """Knit format repository."""
845
829
 
846
 
    def _warn_if_deprecated(self):
847
 
        # This class isn't deprecated
848
 
        pass
849
 
 
850
830
    def _inventory_add_lines(self, inv_vf, revid, parents, lines):
851
831
        inv_vf.add_lines_with_ghosts(revid, parents, lines)
852
832
 
1019
999
    _formats = {}
1020
1000
    """The known formats."""
1021
1001
 
1022
 
    def __str__(self):
1023
 
        return "<%s>" % self.__class__.__name__
1024
 
 
1025
1002
    @classmethod
1026
1003
    def find_format(klass, a_bzrdir):
1027
1004
        """Return the format for the repository object in a_bzrdir."""
1973
1950
    This allows describing a tree to be committed without needing to 
1974
1951
    know the internals of the format of the repository.
1975
1952
    """
1976
 
    
1977
 
    record_root_entry = False
1978
1953
    def __init__(self, repository, parents, config, timestamp=None, 
1979
1954
                 timezone=None, committer=None, revprops=None, 
1980
1955
                 revision_id=None):
1997
1972
            assert isinstance(committer, basestring), type(committer)
1998
1973
            self._committer = committer
1999
1974
 
2000
 
        self.new_inventory = Inventory(None)
 
1975
        self.new_inventory = Inventory()
2001
1976
        self._new_revision_id = revision_id
2002
1977
        self.parents = parents
2003
1978
        self.repository = repository
2037
2012
 
2038
2013
    def finish_inventory(self):
2039
2014
        """Tell the builder that the inventory is finished."""
2040
 
        if self.new_inventory.root is None:
2041
 
            symbol_versioning.warn('Root entry should be supplied to'
2042
 
                ' record_entry_contents, as of bzr 0.10.',
2043
 
                 DeprecationWarning, stacklevel=2)
2044
 
            self.new_inventory.add(InventoryDirectory(ROOT_ID, '', None))
2045
2015
        self.new_inventory.revision_id = self._new_revision_id
2046
2016
        self.inv_sha1 = self.repository.add_inventory(
2047
2017
            self._new_revision_id,
2071
2041
    def record_entry_contents(self, ie, parent_invs, path, tree):
2072
2042
        """Record the content of ie from tree into the commit if needed.
2073
2043
 
2074
 
        Side effect: sets ie.revision when unchanged
2075
 
 
2076
2044
        :param ie: An inventory entry present in the commit.
2077
2045
        :param parent_invs: The inventories of the parent revisions of the
2078
2046
            commit.
2080
2048
        :param tree: The tree which contains this entry and should be used to 
2081
2049
        obtain content.
2082
2050
        """
2083
 
        if self.new_inventory.root is None and ie.parent_id is not None:
2084
 
            symbol_versioning.warn('Root entry should be supplied to'
2085
 
                ' record_entry_contents, as of bzr 0.10.',
2086
 
                 DeprecationWarning, stacklevel=2)
2087
 
            self.record_entry_contents(tree.inventory.root.copy(), parent_invs,
2088
 
                                       '', tree)
2089
2051
        self.new_inventory.add(ie)
2090
2052
 
2091
2053
        # ie.revision is always None if the InventoryEntry is considered
2093
2055
        # which may be the sole parent if it is untouched.
2094
2056
        if ie.revision is not None:
2095
2057
            return
2096
 
 
2097
 
        # In this revision format, root entries have no knit or weave
2098
 
        if ie is self.new_inventory.root:
2099
 
            if len(parent_invs):
2100
 
                ie.revision = parent_invs[0].root.revision
2101
 
            else:
2102
 
                ie.revision = None
2103
 
            return
2104
2058
        previous_entries = ie.find_previous_heads(
2105
2059
            parent_invs,
2106
2060
            self.repository.weave_store,
2166
2120
        versionedfile.clear_cache()
2167
2121
 
2168
2122
 
2169
 
class _CommitBuilder(CommitBuilder):
2170
 
    """Temporary class so old CommitBuilders are detected properly
2171
 
    
2172
 
    Note: CommitBuilder works whether or not root entry is recorded.
2173
 
    """
2174
 
 
2175
 
    record_root_entry = True
2176
 
 
2177
 
 
2178
2123
_unescape_map = {
2179
2124
    'apos':"'",
2180
2125
    'quot':'"',