13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
from bzrlib.lazy_import import lazy_import
18
18
lazy_import(globals(), """
19
19
from bzrlib import (
22
from bzrlib.store import revision
23
from bzrlib.store.revision.knit import KnitRevisionStore
26
revision as _mod_revision,
38
38
from bzrlib.decorators import needs_read_lock, needs_write_lock
39
from bzrlib.knit import KnitVersionedFiles, _KndxIndex, _KnitKeyAccess
39
40
from bzrlib.repository import (
43
43
MetaDirRepositoryFormat,
47
import bzrlib.revision as _mod_revision
48
from bzrlib.store.versioned import VersionedFileStore
49
from bzrlib.trace import mutter, mutter_callsite
50
from bzrlib.util import bencode
51
from bzrlib.versionedfile import ConstantMapper, HashEscapedPrefixMapper
49
54
class _KnitParentsProvider(object):
228
230
reconciler = KnitReconciler(self, thorough=thorough)
229
231
reconciler.reconcile()
230
232
return reconciler
232
234
def _make_parents_provider(self):
233
235
return _KnitsParentsProvider(self.revisions)
235
def _find_inconsistent_revision_parents(self, revisions_iterator=None):
237
def _find_inconsistent_revision_parents(self):
236
238
"""Find revisions with different parent lists in the revision object
237
239
and in the index graph.
239
:param revisions_iterator: None, or an iterator of (revid,
240
Revision-or-None). This iterator controls the revisions checked.
241
241
:returns: an iterator yielding tuples of (revison-id, parents-in-index,
242
242
parents-in-revision).
244
244
if not self.is_locked():
245
245
raise AssertionError()
246
246
vf = self.revisions
247
if revisions_iterator is None:
248
revisions_iterator = self._iter_revisions(None)
249
for revid, revision in revisions_iterator:
252
parent_map = vf.get_parent_map([(revid,)])
247
for index_version in vf.keys():
248
parent_map = vf.get_parent_map([index_version])
253
249
parents_according_to_index = tuple(parent[-1] for parent in
254
parent_map[(revid,)])
250
parent_map[index_version])
251
revision = self.get_revision(index_version[-1])
255
252
parents_according_to_revision = tuple(revision.parent_ids)
256
253
if parents_according_to_index != parents_according_to_revision:
257
yield (revid, parents_according_to_index,
254
yield (index_version[-1], parents_according_to_index,
258
255
parents_according_to_revision)
260
257
def _check_for_inconsistent_revision_parents(self):
292
289
_commit_builder_class = None
293
290
# Set this attribute in derived clases to control the _serializer that the
294
291
# repository objects will have passed to their constructor.
296
def _serializer(self):
297
return xml5.serializer_v5
292
_serializer = xml5.serializer_v5
298
293
# Knit based repositories handle ghosts reasonably well.
299
294
supports_ghosts = True
300
295
# External lookups are not supported in this format.
301
296
supports_external_lookups = False
303
supports_chks = False
304
_fetch_order = 'topological'
305
_fetch_uses_deltas = True
308
298
def _get_inventories(self, repo_transport, repo, name='inventory'):
309
mapper = versionedfile.ConstantMapper(name)
310
index = _mod_knit._KndxIndex(repo_transport, mapper,
311
repo.get_transaction, repo.is_write_locked, repo.is_locked)
312
access = _mod_knit._KnitKeyAccess(repo_transport, mapper)
313
return _mod_knit.KnitVersionedFiles(index, access, annotated=False)
299
mapper = ConstantMapper(name)
300
index = _KndxIndex(repo_transport, mapper, repo.get_transaction,
301
repo.is_write_locked, repo.is_locked)
302
access = _KnitKeyAccess(repo_transport, mapper)
303
return KnitVersionedFiles(index, access, annotated=False)
315
305
def _get_revisions(self, repo_transport, repo):
316
mapper = versionedfile.ConstantMapper('revisions')
317
index = _mod_knit._KndxIndex(repo_transport, mapper,
318
repo.get_transaction, repo.is_write_locked, repo.is_locked)
319
access = _mod_knit._KnitKeyAccess(repo_transport, mapper)
320
return _mod_knit.KnitVersionedFiles(index, access, max_delta_chain=0,
306
mapper = ConstantMapper('revisions')
307
index = _KndxIndex(repo_transport, mapper, repo.get_transaction,
308
repo.is_write_locked, repo.is_locked)
309
access = _KnitKeyAccess(repo_transport, mapper)
310
return KnitVersionedFiles(index, access, max_delta_chain=0,
323
313
def _get_signatures(self, repo_transport, repo):
324
mapper = versionedfile.ConstantMapper('signatures')
325
index = _mod_knit._KndxIndex(repo_transport, mapper,
326
repo.get_transaction, repo.is_write_locked, repo.is_locked)
327
access = _mod_knit._KnitKeyAccess(repo_transport, mapper)
328
return _mod_knit.KnitVersionedFiles(index, access, max_delta_chain=0,
314
mapper = ConstantMapper('signatures')
315
index = _KndxIndex(repo_transport, mapper, repo.get_transaction,
316
repo.is_write_locked, repo.is_locked)
317
access = _KnitKeyAccess(repo_transport, mapper)
318
return KnitVersionedFiles(index, access, max_delta_chain=0,
331
321
def _get_texts(self, repo_transport, repo):
332
mapper = versionedfile.HashEscapedPrefixMapper()
322
mapper = HashEscapedPrefixMapper()
333
323
base_transport = repo_transport.clone('knits')
334
index = _mod_knit._KndxIndex(base_transport, mapper,
335
repo.get_transaction, repo.is_write_locked, repo.is_locked)
336
access = _mod_knit._KnitKeyAccess(base_transport, mapper)
337
return _mod_knit.KnitVersionedFiles(index, access, max_delta_chain=200,
324
index = _KndxIndex(base_transport, mapper, repo.get_transaction,
325
repo.is_write_locked, repo.is_locked)
326
access = _KnitKeyAccess(base_transport, mapper)
327
return KnitVersionedFiles(index, access, max_delta_chain=200,
340
330
def initialize(self, a_bzrdir, shared=False):