14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
from __future__ import absolute_import
17
19
from ..lazy_import import lazy_import
18
20
lazy_import(globals(), """
21
23
from breezy import (
121
122
_serializer = None
123
124
def __init__(self, _format, a_controldir, control_files, _commit_builder_class,
125
super(KnitRepository, self).__init__(
126
_format, a_controldir, control_files)
126
super(KnitRepository, self).__init__(_format, a_controldir, control_files)
127
127
self._commit_builder_class = _commit_builder_class
128
128
self._serializer = _serializer
129
129
self._reconcile_fixes_text_parents = True
179
179
def _temp_inventories(self):
180
180
result = self._format._get_inventories(self._transport, self,
182
182
# Reconciling when the output has no revisions would result in no
183
183
# writes - but we want to ensure there is an inventory for
184
184
# compatibility with older clients that don't lazy-load.
185
result.get_parent_map([(b'A',)])
185
result.get_parent_map([('A',)])
188
188
def get_revision(self, revision_id):
189
189
"""Return the Revision object for a named revision"""
190
revision_id = osutils.safe_revision_id(revision_id)
190
191
with self.lock_read():
191
192
return self.get_revision_reconcile(revision_id)
206
207
def reconcile(self, other=None, thorough=False):
207
208
"""Reconcile this repository."""
208
from .reconcile import KnitReconciler
209
from breezy.reconcile import KnitReconciler
209
210
with self.lock_write():
210
211
reconciler = KnitReconciler(self, thorough=thorough)
211
return reconciler.reconcile()
212
reconciler.reconcile()
213
215
def _make_parents_provider(self):
214
216
return _KnitsParentsProvider(self.revisions)
258
259
def _get_inventories(self, repo_transport, repo, name='inventory'):
259
260
mapper = versionedfile.ConstantMapper(name)
260
261
index = _mod_knit._KndxIndex(repo_transport, mapper,
261
repo.get_transaction, repo.is_write_locked, repo.is_locked)
262
repo.get_transaction, repo.is_write_locked, repo.is_locked)
262
263
access = _mod_knit._KnitKeyAccess(repo_transport, mapper)
263
264
return _mod_knit.KnitVersionedFiles(index, access, annotated=False)
265
266
def _get_revisions(self, repo_transport, repo):
266
267
mapper = versionedfile.ConstantMapper('revisions')
267
268
index = _mod_knit._KndxIndex(repo_transport, mapper,
268
repo.get_transaction, repo.is_write_locked, repo.is_locked)
269
repo.get_transaction, repo.is_write_locked, repo.is_locked)
269
270
access = _mod_knit._KnitKeyAccess(repo_transport, mapper)
270
271
return _mod_knit.KnitVersionedFiles(index, access, max_delta_chain=0,
273
274
def _get_signatures(self, repo_transport, repo):
274
275
mapper = versionedfile.ConstantMapper('signatures')
275
276
index = _mod_knit._KndxIndex(repo_transport, mapper,
276
repo.get_transaction, repo.is_write_locked, repo.is_locked)
277
repo.get_transaction, repo.is_write_locked, repo.is_locked)
277
278
access = _mod_knit._KnitKeyAccess(repo_transport, mapper)
278
279
return _mod_knit.KnitVersionedFiles(index, access, max_delta_chain=0,
281
282
def _get_texts(self, repo_transport, repo):
282
283
mapper = versionedfile.HashEscapedPrefixMapper()
283
284
base_transport = repo_transport.clone('knits')
284
285
index = _mod_knit._KndxIndex(base_transport, mapper,
285
repo.get_transaction, repo.is_write_locked, repo.is_locked)
286
repo.get_transaction, repo.is_write_locked, repo.is_locked)
286
287
access = _mod_knit._KnitKeyAccess(base_transport, mapper)
287
288
return _mod_knit.KnitVersionedFiles(index, access, max_delta_chain=200,
290
291
def initialize(self, a_controldir, shared=False):
291
292
"""Create a knit format 1 repository.
301
302
utf8_files = [('format', self.get_format_string())]
303
self._upload_blank_content(
304
a_controldir, dirs, files, utf8_files, shared)
304
self._upload_blank_content(a_controldir, dirs, files, utf8_files, shared)
305
305
repo_transport = a_controldir.get_repository_transport(None)
306
306
control_files = lockable_files.LockableFiles(repo_transport,
307
'lock', lockdir.LockDir)
307
'lock', lockdir.LockDir)
308
308
transaction = transactions.WriteTransaction()
309
309
result = self.open(a_controldir=a_controldir, _found=True)
310
310
result.lock_write()
311
311
# the revision id here is irrelevant: it will not be stored, and cannot
312
312
# already exist, we do this to create files on disk for older clients.
313
result.inventories.get_parent_map([(b'A',)])
314
result.revisions.get_parent_map([(b'A',)])
315
result.signatures.get_parent_map([(b'A',)])
313
result.inventories.get_parent_map([('A',)])
314
result.revisions.get_parent_map([('A',)])
315
result.signatures.get_parent_map([('A',)])
317
317
self._run_post_repo_init_hooks(result, a_controldir, shared)
332
332
repo_transport = a_controldir.get_repository_transport(None)
333
333
control_files = lockable_files.LockableFiles(repo_transport,
334
'lock', lockdir.LockDir)
334
'lock', lockdir.LockDir)
335
335
repo = self.repository_class(_format=self,
336
a_controldir=a_controldir,
337
control_files=control_files,
338
_commit_builder_class=self._commit_builder_class,
339
_serializer=self._serializer)
336
a_controldir=a_controldir,
337
control_files=control_files,
338
_commit_builder_class=self._commit_builder_class,
339
_serializer=self._serializer)
340
340
repo.revisions = self._get_revisions(repo_transport, repo)
341
341
repo.signatures = self._get_signatures(repo_transport, repo)
342
342
repo.inventories = self._get_inventories(repo_transport, repo)
414
412
def _ignore_setting_bzrdir(self, format):
417
_matchingcontroldir = property(
418
_get_matching_bzrdir, _ignore_setting_bzrdir)
415
_matchingcontroldir = property(_get_matching_bzrdir, _ignore_setting_bzrdir)
421
418
def get_format_string(cls):
422
419
"""See RepositoryFormat.get_format_string()."""
423
return b"Bazaar Knit Repository Format 3 (bzr 0.15)\n"
420
return "Bazaar Knit Repository Format 3 (bzr 0.15)\n"
425
422
def get_format_description(self):
426
423
"""See RepositoryFormat.get_format_description()."""
458
454
def _ignore_setting_bzrdir(self, format):
461
_matchingcontroldir = property(
462
_get_matching_bzrdir, _ignore_setting_bzrdir)
457
_matchingcontroldir = property(_get_matching_bzrdir, _ignore_setting_bzrdir)
465
460
def get_format_string(cls):
466
461
"""See RepositoryFormat.get_format_string()."""
467
return b'Bazaar Knit Repository Format 4 (bzr 1.0)\n'
462
return 'Bazaar Knit Repository Format 4 (bzr 1.0)\n'
469
464
def get_format_description(self):
470
465
"""See RepositoryFormat.get_format_description()."""
490
are_knits = (isinstance(source._format, RepositoryFormatKnit)
491
and isinstance(target._format, RepositoryFormatKnit))
485
are_knits = (isinstance(source._format, RepositoryFormatKnit) and
486
isinstance(target._format, RepositoryFormatKnit))
492
487
except AttributeError:
494
489
return are_knits and InterRepository._same_model(source, target)
496
491
def search_missing_revision_ids(self,
497
find_ghosts=True, revision_ids=None, if_present_ids=None,
492
find_ghosts=True, revision_ids=None, if_present_ids=None,
499
494
"""See InterRepository.search_missing_revision_ids()."""
500
495
with self.lock_read():
501
496
source_ids_set = self._present_source_revisions_for(
505
500
# have in target, but don't try to check for existence where we know
506
501
# we do not have a revision as that would be pointless.
507
502
target_ids = set(self.target.all_revision_ids())
508
possibly_present_revisions = target_ids.intersection(
503
possibly_present_revisions = target_ids.intersection(source_ids_set)
510
504
actually_present_revisions = set(
511
505
self.target._eliminate_revisions_not_present(possibly_present_revisions))
512
required_revisions = source_ids_set.difference(
513
actually_present_revisions)
506
required_revisions = source_ids_set.difference(actually_present_revisions)
514
507
if revision_ids is not None:
515
508
# we used get_ancestry to determine source_ids then we are assured all
516
509
# revisions referenced are present as they are installed in topological order.