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,
37
38
from bzrlib.decorators import needs_read_lock, needs_write_lock
39
from bzrlib.knit import KnitVersionedFiles, _KndxIndex, _KnitKeyAccess
38
40
from bzrlib.repository import (
225
228
reconciler = KnitReconciler(self, thorough=thorough)
226
229
reconciler.reconcile()
227
230
return reconciler
229
232
def _make_parents_provider(self):
230
233
return _KnitsParentsProvider(self.revisions)
232
def _find_inconsistent_revision_parents(self, revisions_iterator=None):
235
def _find_inconsistent_revision_parents(self):
233
236
"""Find revisions with different parent lists in the revision object
234
237
and in the index graph.
236
:param revisions_iterator: None, or an iterator of (revid,
237
Revision-or-None). This iterator controls the revisions checked.
238
239
:returns: an iterator yielding tuples of (revison-id, parents-in-index,
239
240
parents-in-revision).
241
242
if not self.is_locked():
242
243
raise AssertionError()
243
244
vf = self.revisions
244
if revisions_iterator is None:
245
revisions_iterator = self._iter_revisions(None)
246
for revid, revision in revisions_iterator:
249
parent_map = vf.get_parent_map([(revid,)])
245
for index_version in vf.keys():
246
parent_map = vf.get_parent_map([index_version])
250
247
parents_according_to_index = tuple(parent[-1] for parent in
251
parent_map[(revid,)])
248
parent_map[index_version])
249
revision = self.get_revision(index_version[-1])
252
250
parents_according_to_revision = tuple(revision.parent_ids)
253
251
if parents_according_to_index != parents_according_to_revision:
254
yield (revid, parents_according_to_index,
252
yield (index_version[-1], parents_according_to_index,
255
253
parents_according_to_revision)
257
255
def _check_for_inconsistent_revision_parents(self):
289
287
_commit_builder_class = None
290
288
# Set this attribute in derived clases to control the _serializer that the
291
289
# repository objects will have passed to their constructor.
293
def _serializer(self):
294
return xml5.serializer_v5
290
_serializer = xml5.serializer_v5
295
291
# Knit based repositories handle ghosts reasonably well.
296
292
supports_ghosts = True
297
293
# External lookups are not supported in this format.
298
294
supports_external_lookups = False
300
supports_chks = False
301
_fetch_order = 'topological'
302
_fetch_uses_deltas = True
305
296
def _get_inventories(self, repo_transport, repo, name='inventory'):
306
mapper = versionedfile.ConstantMapper(name)
307
index = _mod_knit._KndxIndex(repo_transport, mapper,
308
repo.get_transaction, repo.is_write_locked, repo.is_locked)
309
access = _mod_knit._KnitKeyAccess(repo_transport, mapper)
310
return _mod_knit.KnitVersionedFiles(index, access, annotated=False)
297
mapper = ConstantMapper(name)
298
index = _KndxIndex(repo_transport, mapper, repo.get_transaction,
299
repo.is_write_locked, repo.is_locked)
300
access = _KnitKeyAccess(repo_transport, mapper)
301
return KnitVersionedFiles(index, access, annotated=False)
312
303
def _get_revisions(self, repo_transport, repo):
313
mapper = versionedfile.ConstantMapper('revisions')
314
index = _mod_knit._KndxIndex(repo_transport, mapper,
315
repo.get_transaction, repo.is_write_locked, repo.is_locked)
316
access = _mod_knit._KnitKeyAccess(repo_transport, mapper)
317
return _mod_knit.KnitVersionedFiles(index, access, max_delta_chain=0,
304
mapper = ConstantMapper('revisions')
305
index = _KndxIndex(repo_transport, mapper, repo.get_transaction,
306
repo.is_write_locked, repo.is_locked)
307
access = _KnitKeyAccess(repo_transport, mapper)
308
return KnitVersionedFiles(index, access, max_delta_chain=0,
320
311
def _get_signatures(self, repo_transport, repo):
321
mapper = versionedfile.ConstantMapper('signatures')
322
index = _mod_knit._KndxIndex(repo_transport, mapper,
323
repo.get_transaction, repo.is_write_locked, repo.is_locked)
324
access = _mod_knit._KnitKeyAccess(repo_transport, mapper)
325
return _mod_knit.KnitVersionedFiles(index, access, max_delta_chain=0,
312
mapper = ConstantMapper('signatures')
313
index = _KndxIndex(repo_transport, mapper, repo.get_transaction,
314
repo.is_write_locked, repo.is_locked)
315
access = _KnitKeyAccess(repo_transport, mapper)
316
return KnitVersionedFiles(index, access, max_delta_chain=0,
328
319
def _get_texts(self, repo_transport, repo):
329
mapper = versionedfile.HashEscapedPrefixMapper()
320
mapper = HashEscapedPrefixMapper()
330
321
base_transport = repo_transport.clone('knits')
331
index = _mod_knit._KndxIndex(base_transport, mapper,
332
repo.get_transaction, repo.is_write_locked, repo.is_locked)
333
access = _mod_knit._KnitKeyAccess(base_transport, mapper)
334
return _mod_knit.KnitVersionedFiles(index, access, max_delta_chain=200,
322
index = _KndxIndex(base_transport, mapper, repo.get_transaction,
323
repo.is_write_locked, repo.is_locked)
324
access = _KnitKeyAccess(base_transport, mapper)
325
return KnitVersionedFiles(index, access, max_delta_chain=200,
337
328
def initialize(self, a_bzrdir, shared=False):