372
365
except NotImplementedError:
373
366
raise errors.IncompatibleRepositories(source, self)
375
def create_bundle(self, target, base, fileobj, format=None):
376
return serializer.write_bundle(self, target, base, fileobj, format)
378
368
def get_commit_builder(self, branch, parents, config, timestamp=None,
379
369
timezone=None, committer=None, revprops=None,
380
370
revision_id=None):
841
828
This is topologically sorted.
843
if _mod_revision.is_null(revision_id):
830
if revision_id is None:
845
832
revision_id = osutils.safe_revision_id(revision_id)
846
833
if not self.has_revision(revision_id):
847
834
raise errors.NoSuchRevision(self, revision_id)
848
835
w = self.get_inventory_weave()
849
candidates = w.get_ancestry(revision_id, topo_sorted)
836
candidates = w.get_ancestry(revision_id)
850
837
return [None] + candidates # self._eliminate_revisions_not_present(candidates)
853
"""Compress the data within the repository.
855
This operation only makes sense for some repository types. For other
856
types it should be a no-op that just returns.
858
This stub method does not require a lock, but subclasses should use
859
@needs_write_lock as this is a long running call its reasonable to
860
implicitly lock for the user.
864
840
def print_file(self, file, revision_id):
865
841
"""Print `file` to stdout.
886
862
revision_id = osutils.safe_revision_id(revision_id)
887
863
return self.get_inventory_weave().parent_names(revision_id)
889
def get_parents(self, revision_ids):
890
"""See StackedParentsProvider.get_parents"""
892
for revision_id in revision_ids:
893
if revision_id == _mod_revision.NULL_REVISION:
897
parents = self.get_revision(revision_id).parent_ids
898
except errors.NoSuchRevision:
901
if len(parents) == 0:
902
parents = [_mod_revision.NULL_REVISION]
903
parents_list.append(parents)
906
def _make_parents_provider(self):
909
def get_graph(self, other_repository=None):
910
"""Return the graph walker for this repository format"""
911
parents_provider = self._make_parents_provider()
912
if (other_repository is not None and
913
other_repository.bzrdir.transport.base !=
914
self.bzrdir.transport.base):
915
parents_provider = graph._StackedParentsProvider(
916
[parents_provider, other_repository._make_parents_provider()])
917
return graph.Graph(parents_provider)
919
865
@needs_write_lock
920
866
def set_make_working_trees(self, new_value):
921
867
"""Set the policy flag for making working trees when creating branches.
1810
1756
InterRepository.register_optimiser(InterRemoteRepository)
1759
class RepositoryTestProviderAdapter(object):
1760
"""A tool to generate a suite testing multiple repository formats at once.
1762
This is done by copying the test once for each transport and injecting
1763
the transport_server, transport_readonly_server, and bzrdir_format and
1764
repository_format classes into each copy. Each copy is also given a new id()
1765
to make it easy to identify.
1768
def __init__(self, transport_server, transport_readonly_server, formats,
1769
vfs_transport_factory=None):
1770
self._transport_server = transport_server
1771
self._transport_readonly_server = transport_readonly_server
1772
self._vfs_transport_factory = vfs_transport_factory
1773
self._formats = formats
1775
def adapt(self, test):
1776
result = unittest.TestSuite()
1777
for repository_format, bzrdir_format in self._formats:
1778
from copy import deepcopy
1779
new_test = deepcopy(test)
1780
new_test.transport_server = self._transport_server
1781
new_test.transport_readonly_server = self._transport_readonly_server
1782
# Only override the test's vfs_transport_factory if one was
1783
# specified, otherwise just leave the default in place.
1784
if self._vfs_transport_factory:
1785
new_test.vfs_transport_factory = self._vfs_transport_factory
1786
new_test.bzrdir_format = bzrdir_format
1787
new_test.repository_format = repository_format
1788
def make_new_test_id():
1789
new_id = "%s(%s)" % (new_test.id(), repository_format.__class__.__name__)
1790
return lambda: new_id
1791
new_test.id = make_new_test_id()
1792
result.addTest(new_test)
1796
class InterRepositoryTestProviderAdapter(object):
1797
"""A tool to generate a suite testing multiple inter repository formats.
1799
This is done by copying the test once for each interrepo provider and injecting
1800
the transport_server, transport_readonly_server, repository_format and
1801
repository_to_format classes into each copy.
1802
Each copy is also given a new id() to make it easy to identify.
1805
def __init__(self, transport_server, transport_readonly_server, formats):
1806
self._transport_server = transport_server
1807
self._transport_readonly_server = transport_readonly_server
1808
self._formats = formats
1810
def adapt(self, test):
1811
result = unittest.TestSuite()
1812
for interrepo_class, repository_format, repository_format_to in self._formats:
1813
from copy import deepcopy
1814
new_test = deepcopy(test)
1815
new_test.transport_server = self._transport_server
1816
new_test.transport_readonly_server = self._transport_readonly_server
1817
new_test.interrepo_class = interrepo_class
1818
new_test.repository_format = repository_format
1819
new_test.repository_format_to = repository_format_to
1820
def make_new_test_id():
1821
new_id = "%s(%s)" % (new_test.id(), interrepo_class.__name__)
1822
return lambda: new_id
1823
new_test.id = make_new_test_id()
1824
result.addTest(new_test)
1828
def default_test_list():
1829
"""Generate the default list of interrepo permutations to test."""
1830
from bzrlib.repofmt import knitrepo, weaverepo
1832
# test the default InterRepository between format 6 and the current
1834
# XXX: robertc 20060220 reinstate this when there are two supported
1835
# formats which do not have an optimal code path between them.
1836
#result.append((InterRepository,
1837
# RepositoryFormat6(),
1838
# RepositoryFormatKnit1()))
1839
for optimiser_class in InterRepository._optimisers:
1840
format_to_test = optimiser_class._get_repo_format_to_test()
1841
if format_to_test is not None:
1842
result.append((optimiser_class,
1843
format_to_test, format_to_test))
1844
# if there are specific combinations we want to use, we can add them
1846
result.append((InterModel1and2,
1847
weaverepo.RepositoryFormat5(),
1848
knitrepo.RepositoryFormatKnit3()))
1849
result.append((InterKnit1and2,
1850
knitrepo.RepositoryFormatKnit1(),
1851
knitrepo.RepositoryFormatKnit3()))
1813
1855
class CopyConverter(object):
1814
1856
"""A repository conversion tool which just performs a copy of the content.