122
121
def verify_weave1(self, w1):
123
122
self.assertEqual(sorted(w1.versions()), ['v1', 'v2', 'v3'])
124
123
self.assertEqual(w1.get_lines('v1'), ['hello\n'])
125
self.assertEqual([], w1.get_parents('v1'))
124
self.assertEqual({'v1':()}, w1.get_parent_map(['v1']))
126
125
self.assertEqual(w1.get_lines('v2'), ['hello\n', 'world\n'])
127
self.assertEqual(['v1'], w1.get_parents('v2'))
126
self.assertEqual({'v2':('v1',)}, w1.get_parent_map(['v2']))
128
127
self.assertEqual(w1.get_lines('v3'), ['hello\n', 'cruel\n', 'world\n'])
129
self.assertEqual(['v2'], w1.get_parents('v3'))
128
self.assertEqual({'v3':('v2',)}, w1.get_parent_map(['v3']))
131
130
def test_join_source_has_less_parents_preserves_parents(self):
132
131
# when the target has a text with more parent info, join
167
166
self.assertEqual(['v1', 'v2', 'v3', 'x1',], sorted(w1.versions()))
168
167
self.assertEqual('line from x1\n', w1.get_text('x1'))
169
168
self.assertEqual(['hello\n', 'world\n'], w1.get_lines('v2'))
170
self.assertEqual(['v1'], w1.get_parents('v2'))
169
self.assertEqual({'v2':('v1',)}, w1.get_parent_map(['v2']))
172
171
def test_join_with_ignore_missing_versions(self):
173
172
# test that ignore_missing=True makes a listed but absent version id
182
181
eq(sorted(w1.versions()), ['v1', 'v2', 'v3', 'x1'])
183
182
eq(w1.get_text('x1'), 'line from x1\n')
184
183
eq(w1.get_lines('v2'), ['hello\n', 'world\n'])
185
eq(w1.get_parents('v2'), ['v1'])
184
self.assertEqual({'v2':('v1',)}, w1.get_parent_map(['v2']))
187
186
def build_source_weave(self, name, *pattern):
188
187
w = self.get_source(name)
206
205
# does not must discard it, and when filling a ghost for a listed
207
206
# ghost must reconcile it
208
207
source = self.get_source()
210
source.has_ghost('a')
212
except NotImplementedError:
213
source_ghosts = False
214
208
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
209
# try filling target with ghosts and filling in reverse -
234
target.add_lines_with_ghosts('notbase', ['base'], [])
211
target.add_lines_with_ghosts('notbase', ['base'], [])
212
except NotImplementedError:
213
# The target does not support ghosts; the test is irrelevant.
217
except errors.RevisionNotPresent:
236
219
# legacy apis should behave
237
220
self.assertEqual(['notbase'], source.get_ancestry(['notbase']))
238
self.assertEqual([], source.get_parents('notbase'))
239
self.assertEqual({'notbase':()}, source.get_graph())
240
221
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'))
222
# ghost data should have been preserved
223
self.assertEqual(['base', 'notbase'], source.get_ancestry_with_ghosts(['notbase']))
224
self.assertEqual(['base'], source.get_parents_with_ghosts('notbase'))
225
self.assertEqual({'notbase':('base',)},
226
source.get_parent_map(source.versions()))
248
228
# if we add something that is fills out what is a ghost, then
249
229
# when joining into a ghost aware join it should flesh out the ghosts.
250
230
source.add_lines('base', [], [])
251
target.join(source, version_ids=['base'])
231
target.join(source, version_ids=['base'])
252
232
self.assertEqual(['base', 'notbase'], target.get_ancestry(['notbase']))
253
self.assertEqual(['base'], target.get_parents('notbase'))
254
233
self.assertEqual({'base':(),
255
234
'notbase':('base', ),
236
target.get_parent_map(target.versions()))
258
237
self.assertTrue(target.has_version('base'))
259
238
# we have _with_ghost apis to give us ghost information.
260
239
self.assertEqual(['base', 'notbase'], target.get_ancestry_with_ghosts(['notbase']))
261
240
self.assertEqual(['base'], target.get_parents_with_ghosts('notbase'))
262
self.assertEqual({'base':[],
241
self.assertEqual({'base':(),
265
target.get_graph_with_ghosts())
266
self.assertFalse(target.has_ghost('base'))
244
source.get_parent_map(source.versions()))
268
246
def test_restricted_join_into_empty(self):
269
247
# joining into an empty versioned file with a version_ids list