~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/versionedfile.py

  • Committer: Robert Collins
  • Date: 2006-03-01 02:01:47 UTC
  • mto: (1594.2.4 integration)
  • mto: This revision was merged to the branch mainline in revision 1596.
  • Revision ID: robertc@robertcollins.net-20060301020147-62bb5465f75fbf40
Start check tests for knits (pending), and remove dead code.

Show diffs side-by-side

added added

removed removed

Lines of Context:
240
240
                assert state in ('irrelevant', 'ghost-a', 'ghost-b', 'killed-base',
241
241
                                 'killed-both'), \
242
242
                       state
243
 
 
244
 
 
245
 
def plan_merge(file, version_a, version_b):
246
 
    """Return pseudo-annotation indicating how the two versions merge.
247
 
    
248
 
    This is computed between versions a and b and their common
249
 
    base.
250
 
 
251
 
    Weave lines present in none of them are skipped entirely.
252
 
    """
253
 
    inc_a = set(file.get_ancestry([version_a]))
254
 
    inc_b = set(file.get_ancestry([version_b]))
255
 
    inc_c = inc_a & inc_b
256
 
 
257
 
    for lineno, insert, deleteset, line in file.walk([version_a, version_b]):
258
 
        if deleteset & inc_c:
259
 
            # killed in parent; can't be in either a or b
260
 
            # not relevant to our work
261
 
            yield 'killed-base', line
262
 
        elif insert in inc_c:
263
 
            # was inserted in base
264
 
            killed_a = bool(deleteset & inc_a)
265
 
            killed_b = bool(deleteset & inc_b)
266
 
            if killed_a and killed_b:
267
 
                yield 'killed-both', line
268
 
            elif killed_a:
269
 
                yield 'killed-a', line
270
 
            elif killed_b:
271
 
                yield 'killed-b', line
272
 
            else:
273
 
                yield 'unchanged', line
274
 
        elif insert in inc_a:
275
 
            if deleteset & inc_a:
276
 
                yield 'ghost-a', line
277
 
            else:
278
 
                # new in A; not in B
279
 
                yield 'new-a', line
280
 
        elif insert in inc_b:
281
 
            if deleteset & inc_b:
282
 
                yield 'ghost-b', line
283
 
            else:
284
 
                yield 'new-b', line
285
 
        else:
286
 
            # not in either revision
287
 
            yield 'irrelevant', line
288
 
 
289
 
    yield 'unchanged', ''           # terminator
290
 
 
291
 
 
292
 
def weave_merge(plan):
293
 
    """Yield merged sequence of lines based on merge plan."""
294
 
 
295
 
    lines_a = []
296
 
    lines_b = []
297
 
    ch_a = ch_b = False
298
 
 
299
 
    for state, line in plan:
300
 
        if state == 'unchanged' or state == 'killed-both':
301
 
            # resync and flush queued conflicts changes if any
302
 
            if not lines_a and not lines_b:
303
 
                pass
304
 
            elif ch_a and not ch_b:
305
 
                # one-sided change:                    
306
 
                for l in lines_a: yield l
307
 
            elif ch_b and not ch_a:
308
 
                for l in lines_b: yield l
309
 
            elif lines_a == lines_b:
310
 
                for l in lines_a: yield l
311
 
            else:
312
 
                yield '<<<<<<<\n'
313
 
                for l in lines_a: yield l
314
 
                yield '=======\n'
315
 
                for l in lines_b: yield l
316
 
                yield '>>>>>>>\n'
317
 
 
318
 
            del lines_a[:]
319
 
            del lines_b[:]
320
 
            ch_a = ch_b = False
321
 
                
322
 
        if state == 'unchanged':
323
 
            if line:
324
 
                yield line
325
 
        elif state == 'killed-a':
326
 
            ch_a = True
327
 
            lines_b.append(line)
328
 
        elif state == 'killed-b':
329
 
            ch_b = True
330
 
            lines_a.append(line)
331
 
        elif state == 'new-a':
332
 
            ch_a = True
333
 
            lines_a.append(line)
334
 
        elif state == 'new-b':
335
 
            ch_b = True
336
 
            lines_b.append(line)
337
 
        else:
338
 
            assert state in ('irrelevant', 'ghost-a', 'ghost-b', 'killed-base',
339
 
                             'killed-both'), state