~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/repository.py

  • Committer: John Arbash Meinel
  • Date: 2006-08-16 18:38:57 UTC
  • mfrom: (1934 +trunk)
  • mto: This revision was merged to the branch mainline in revision 1937.
  • Revision ID: john@arbash-meinel.com-20060816183857-7307edffa7098bd2
[merge] bzr.dev 1934

Show diffs side-by-side

added added

removed removed

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