73
74
repo_b = self.make_to_repository('b')
74
75
check_push_rev1(repo_b)
77
def test_fetch_inconsistent_last_changed_entries(self):
78
"""If an inventory has odd data we should still get what it references.
80
This test tests that we do fetch a file text created in a revision not
81
being fetched, but referenced from the revision we are fetching when the
82
adjacent revisions to the one being fetched do not reference that text.
84
tree = self.make_branch_and_tree('source')
85
revid = tree.commit('old')
86
to_repo = self.make_to_repository('to_repo')
87
to_repo.fetch(tree.branch.repository, revid)
88
# Make a broken revision and fetch it.
89
source = tree.branch.repository
91
self.addCleanup(source.unlock)
92
source.start_write_group()
94
# We need two revisions: OLD and NEW. NEW will claim to need a file
95
# 'FOO' changed in 'OLD'. OLD will not have that file at all.
96
source.texts.insert_record_stream([
97
versionedfile.FulltextContentFactory(('foo', revid), (), None,
99
basis = source.revision_tree(revid)
100
parent_id = basis.path2id('')
101
entry = inventory.make_entry('file', 'foo-path', parent_id, 'foo')
102
entry.revision = revid
103
entry.text_size = len('contents')
104
entry.text_sha1 = osutils.sha_string('contents')
105
inv_sha1, _ = source.add_inventory_by_delta(revid, [
106
(None, 'foo-path', 'foo', entry)], 'new', [revid])
107
rev = Revision(timestamp=0,
109
committer="Foo Bar <foo@example.com>",
111
inventory_sha1=inv_sha1,
114
source.add_revision(rev.revision_id, rev)
116
source.abort_write_group()
119
source.commit_write_group()
120
to_repo.fetch(source, 'new')
122
self.addCleanup(to_repo.unlock)
123
self.assertEqual('contents',
124
to_repo.texts.get_record_stream([('foo', revid)],
125
'unordered', True).next().get_bytes_as('fulltext'))
127
def test_fetch_parent_inventories_at_stacking_boundary(self):
128
"""Fetch to a stacked branch copies inventories for parents of
129
revisions at the stacking boundary.
131
This is necessary so that the server is able to determine the file-ids
132
altered by all revisions it contains, which means that it needs both
133
the inventory for any revision it has, and the inventories of all that
136
to_repo = self.make_to_repository('to')
137
if not to_repo._format.supports_external_lookups:
138
raise TestNotApplicable("Need stacking support in the target.")
139
builder = self.make_branch_builder('branch')
140
builder.start_series()
141
builder.build_snapshot('base', None, [
142
('add', ('', 'root-id', 'directory', ''))])
143
builder.build_snapshot('left', ['base'], [])
144
builder.build_snapshot('right', ['base'], [])
145
builder.build_snapshot('merge', ['left', 'right'], [])
146
builder.finish_series()
147
branch = builder.get_branch()
148
repo = self.make_to_repository('trunk')
149
trunk = repo.bzrdir.create_branch()
150
trunk.repository.fetch(branch.repository, 'left')
151
trunk.repository.fetch(branch.repository, 'right')
152
repo = self.make_to_repository('stacked')
153
stacked_branch = repo.bzrdir.create_branch()
154
stacked_branch.set_stacked_on_url(trunk.base)
155
stacked_branch.repository.fetch(branch.repository, 'merge')
156
unstacked_repo = stacked_branch.bzrdir.open_repository()
157
unstacked_repo.lock_read()
158
self.addCleanup(unstacked_repo.unlock)
159
self.assertFalse(unstacked_repo.has_revision('left'))
160
self.assertFalse(unstacked_repo.has_revision('right'))
162
set([('left',), ('right',), ('merge',)]),
163
unstacked_repo.inventories.keys())
76
165
def test_fetch_missing_basis_text(self):
77
166
"""If fetching a delta, we should die if a basis is not present."""
78
167
tree = self.make_branch_and_tree('tree')