96
96
                         'v-1 v-2 v-3'.split())
 
97
97
        self.assertEqualDiff(w1.get_text('v-3'),
 
99
 
        self.assertEqual(sorted(w1.get_parents('v-3')),
 
 
99
        self.assertEqual({'v-3':('v-1',)}, w1.get_parent_map(['v-3']))
 
101
100
        ann = list(w1.annotate('v-3'))
 
102
101
        self.assertEqual(len(ann), 1)
 
103
102
        self.assertEqual(ann[0][0], 'v-1')
 
 
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 
 
 
138
137
        t.add_lines('base', [], [])
 
139
138
        t.add_lines('text', ['base'], [])
 
141
 
        self.assertEqual(['base'], t.get_parents('text'))
 
 
140
        self.assertEqual({'text':('base',)}, t.get_parent_map(['text']))
 
143
142
    def test_join_with_ghosts(self):
 
144
143
        """Join that inserts parents of an existing revision.
 
 
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)
 
 
233
232
        # try filling target with ghosts and filling in reverse -  
 
234
233
        target.add_lines_with_ghosts('notbase', ['base'], [])
 
 
236
        except errors.RevisionNotPresent:
 
 
237
            # can't join a ghost containing target onto a non-ghost supporting
 
 
239
            self.assertFalse(source_ghosts)
 
 
242
            self.assertTrue(source_ghosts)
 
236
243
        # legacy apis should behave
 
237
244
        self.assertEqual(['notbase'], source.get_ancestry(['notbase']))
 
238
 
        self.assertEqual([], source.get_parents('notbase'))
 
239
245
        self.assertEqual({'notbase':()}, source.get_graph())
 
240
246
        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'))
 
 
247
        # ghost data should have been preserved
 
 
248
        self.assertEqual(['base', 'notbase'], source.get_ancestry_with_ghosts(['notbase']))
 
 
249
        self.assertEqual(['base'], source.get_parents_with_ghosts('notbase'))
 
 
250
        self.assertEqual({'notbase':('base',)}, source.get_parent_map(['notbase']))
 
 
251
        self.assertEqual({'notbase':('base',)}, source.get_graph_with_ghosts())
 
 
252
        self.assertTrue(source.has_ghost('base'))
 
248
254
        # if we add something that is fills out what is a ghost, then 
 
249
255
        # when joining into a ghost aware join it should flesh out the ghosts.
 
250
256
        source.add_lines('base', [], [])
 
251
257
        target.join(source, version_ids=['base']) 
 
252
258
        self.assertEqual(['base', 'notbase'], target.get_ancestry(['notbase']))
 
253
 
        self.assertEqual(['base'], target.get_parents('notbase'))
 
 
259
        self.assertEqual({'notbase':('base',)}, target.get_parent_map(['notbase']))
 
254
260
        self.assertEqual({'base':(),
 
255
261
                          'notbase':('base', ),
 
 
259
265
        # we have _with_ghost apis to give us ghost information.
 
260
266
        self.assertEqual(['base', 'notbase'], target.get_ancestry_with_ghosts(['notbase']))
 
261
267
        self.assertEqual(['base'], target.get_parents_with_ghosts('notbase'))
 
262
 
        self.assertEqual({'base':[],
 
 
268
        self.assertEqual({'base':(),
 
265
271
                         target.get_graph_with_ghosts())
 
266
272
        self.assertFalse(target.has_ghost('base'))