72
73
source.add_lines('ancestorright', ['base'], [])
73
74
source.add_lines('namedleft', ['ancestorleft'], [])
74
75
source.add_lines('namedright', ['ancestorright'], [])
75
target.join(source, version_ids=['namedleft', 'namedright'])
76
self.applyDeprecated(one_five, target.join, source,
77
version_ids=['namedleft', 'namedright'])
76
78
self.assertFalse(target.has_version('sibling'))
77
79
self.assertTrue(target.has_version('ancestorleft'))
78
80
self.assertTrue(target.has_version('ancestorright'))
116
117
"""Reweave adding empty weave"""
117
118
wb = self.get_target()
118
119
w1 = self.build_weave1()
120
self.applyDeprecated(one_five, w1.join, wb)
120
121
self.verify_weave1(w1)
122
123
def verify_weave1(self, w1):
123
124
self.assertEqual(sorted(w1.versions()), ['v1', 'v2', 'v3'])
124
125
self.assertEqual(w1.get_lines('v1'), ['hello\n'])
125
self.assertEqual([], w1.get_parents('v1'))
126
self.assertEqual({'v1':()}, w1.get_parent_map(['v1']))
126
127
self.assertEqual(w1.get_lines('v2'), ['hello\n', 'world\n'])
127
self.assertEqual(['v1'], w1.get_parents('v2'))
128
self.assertEqual({'v2':('v1',)}, w1.get_parent_map(['v2']))
128
129
self.assertEqual(w1.get_lines('v3'), ['hello\n', 'cruel\n', 'world\n'])
129
self.assertEqual(['v2'], w1.get_parents('v3'))
130
self.assertEqual({'v3':('v2',)}, w1.get_parent_map(['v3']))
131
132
def test_join_source_has_less_parents_preserves_parents(self):
132
133
# when the target has a text with more parent info, join
137
138
t = self.get_target()
138
139
t.add_lines('base', [], [])
139
140
t.add_lines('text', ['base'], [])
141
self.assertEqual(['base'], t.get_parents('text'))
141
self.applyDeprecated(one_five, t.join, s)
142
self.assertEqual({'text':('base',)}, t.get_parent_map(['text']))
143
144
def test_join_with_ghosts(self):
144
145
"""Join that inserts parents of an existing revision.
160
161
wb.add_lines('v1', [], ['hello\n'])
161
162
wb.add_lines('v2', ['v1', 'x1'], ['hello\n', 'world\n'])
164
self.applyDeprecated(one_five, w1.join, wb)
164
165
except errors.WeaveParentMismatch:
165
166
# Acceptable behaviour:
167
168
self.assertEqual(['v1', 'v2', 'v3', 'x1',], sorted(w1.versions()))
168
169
self.assertEqual('line from x1\n', w1.get_text('x1'))
169
170
self.assertEqual(['hello\n', 'world\n'], w1.get_lines('v2'))
170
self.assertEqual(['v1'], w1.get_parents('v2'))
171
self.assertEqual({'v2':('v1',)}, w1.get_parent_map(['v2']))
172
173
def test_join_with_ignore_missing_versions(self):
173
174
# test that ignore_missing=True makes a listed but absent version id
177
178
wb.add_lines('x1', [], ['line from x1\n'])
178
179
wb.add_lines('v1', [], ['hello\n'])
179
180
wb.add_lines('v2', ['v1', 'x1'], ['hello\n', 'world\n'])
180
w1.join(wb, version_ids=['x1', 'z1'], ignore_missing=True)
181
self.applyDeprecated(one_five, w1.join, wb, version_ids=['x1', 'z1'],
181
183
eq = self.assertEquals
182
184
eq(sorted(w1.versions()), ['v1', 'v2', 'v3', 'x1'])
183
185
eq(w1.get_text('x1'), 'line from x1\n')
184
186
eq(w1.get_lines('v2'), ['hello\n', 'world\n'])
185
eq(w1.get_parents('v2'), ['v1'])
187
self.assertEqual({'v2':('v1',)}, w1.get_parent_map(['v2']))
187
189
def build_source_weave(self, name, *pattern):
188
190
w = self.get_source(name)
206
208
# does not must discard it, and when filling a ghost for a listed
207
209
# ghost must reconcile it
208
210
source = self.get_source()
210
source.has_ghost('a')
212
except NotImplementedError:
213
source_ghosts = False
214
211
target = self.get_target()
216
target.has_ghost('a')
218
except NotImplementedError:
219
target_ghosts = False
221
if not source_ghosts and not target_ghosts:
224
if source_ghosts and not target_ghosts:
225
# switch source and target so source is ghostless
229
source_ghosts = False
231
# now target always supports ghosts.
233
212
# try filling target with ghosts and filling in reverse -
234
target.add_lines_with_ghosts('notbase', ['base'], [])
214
target.add_lines_with_ghosts('notbase', ['base'], [])
215
except NotImplementedError:
216
# The target does not support ghosts; the test is irrelevant.
219
self.applyDeprecated(one_five, source.join, target)
220
except errors.RevisionNotPresent:
236
222
# legacy apis should behave
237
223
self.assertEqual(['notbase'], source.get_ancestry(['notbase']))
238
self.assertEqual([], source.get_parents('notbase'))
239
self.assertEqual({'notbase':()}, source.get_graph())
240
224
self.assertFalse(source.has_version('base'))
242
# ghost data should have been preserved
243
self.assertEqual(['base', 'notbase'], source.get_ancestry_with_ghosts(['notbase']))
244
self.assertEqual(['base'], source.get_parents_with_ghosts('notbase'))
245
self.assertEqual({'notbase':['base']}, source.get_graph_with_ghosts())
246
self.assertTrue(source.has_ghost('base'))
225
# ghost data should have been preserved
226
self.assertEqual(['base', 'notbase'], source.get_ancestry_with_ghosts(['notbase']))
227
self.assertEqual(['base'], source.get_parents_with_ghosts('notbase'))
228
self.assertEqual({'notbase':('base',)},
229
source.get_parent_map(source.versions()))
248
231
# if we add something that is fills out what is a ghost, then
249
232
# when joining into a ghost aware join it should flesh out the ghosts.
250
233
source.add_lines('base', [], [])
251
target.join(source, version_ids=['base'])
234
self.applyDeprecated(one_five, target.join, source, version_ids=['base'])
252
235
self.assertEqual(['base', 'notbase'], target.get_ancestry(['notbase']))
253
self.assertEqual(['base'], target.get_parents('notbase'))
254
236
self.assertEqual({'base':(),
255
237
'notbase':('base', ),
239
target.get_parent_map(target.versions()))
258
240
self.assertTrue(target.has_version('base'))
259
241
# we have _with_ghost apis to give us ghost information.
260
242
self.assertEqual(['base', 'notbase'], target.get_ancestry_with_ghosts(['notbase']))
261
243
self.assertEqual(['base'], target.get_parents_with_ghosts('notbase'))
262
self.assertEqual({'base':[],
244
self.assertEqual({'base':(),
265
target.get_graph_with_ghosts())
266
self.assertFalse(target.has_ghost('base'))
247
source.get_parent_map(source.versions()))
268
249
def test_restricted_join_into_empty(self):
269
250
# joining into an empty versioned file with a version_ids list
273
254
source.add_lines('inherit_me', [], ['b\n'])
274
255
source.add_lines('select_me', ['inherit_me'], ['b\n'])
275
256
target = self.get_target()
276
target.join(source, version_ids=['select_me'])
257
self.applyDeprecated(one_five, target.join, source, version_ids=['select_me'])
277
258
self.assertEqual(['inherit_me', 'select_me'], target.versions())
279
260
def test_join_odd_records(self):
289
270
source.add_lines('4', ['2'], ['1st\n'])
290
271
source.add_lines('5', ['3'], ['1st\n', '2nd\n', '3rd\n'])
291
272
target = self.get_target()
292
target.join(source, version_ids=['1', '3', '5'])
273
self.applyDeprecated(one_five, target.join, source, version_ids=['1', '3', '5'])
293
274
target = self.get_target(create=False)
294
275
self.assertEqual(set(['1', '3', '5']), set(target.versions()))
295
276
self.assertEqual(3, len(target.versions()))