comparison mercurial/simplemerge.py @ 22023:f18830651811

simplemerge: burn "minimal" feature to the ground Matt Mackall said: The goal of simplemerge should have always been to be a drop-in replacement for RCS merge. Please nuke this minimization thing entirely. This whole things is now dead.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Tue, 05 Aug 2014 14:56:25 -0700
parents 4aeb7a6029ba
children 372ae2745acf
comparison
equal deleted inserted replaced
22022:2ea6d906cf9b 22023:f18830651811
80 name_b=None, 80 name_b=None,
81 name_base=None, 81 name_base=None,
82 start_marker='<<<<<<<', 82 start_marker='<<<<<<<',
83 mid_marker='=======', 83 mid_marker='=======',
84 end_marker='>>>>>>>', 84 end_marker='>>>>>>>',
85 base_marker=None, 85 base_marker=None):
86 reprocess=False):
87 """Return merge in cvs-like form. 86 """Return merge in cvs-like form.
88 """ 87 """
89 self.conflicts = False 88 self.conflicts = False
90 newline = '\n' 89 newline = '\n'
91 if len(self.a) > 0: 90 if len(self.a) > 0:
92 if self.a[0].endswith('\r\n'): 91 if self.a[0].endswith('\r\n'):
93 newline = '\r\n' 92 newline = '\r\n'
94 elif self.a[0].endswith('\r'): 93 elif self.a[0].endswith('\r'):
95 newline = '\r' 94 newline = '\r'
96 if base_marker and reprocess:
97 raise CantReprocessAndShowBase
98 if name_a: 95 if name_a:
99 start_marker = start_marker + ' ' + name_a 96 start_marker = start_marker + ' ' + name_a
100 if name_b: 97 if name_b:
101 end_marker = end_marker + ' ' + name_b 98 end_marker = end_marker + ' ' + name_b
102 if name_base and base_marker: 99 if name_base and base_marker:
103 base_marker = base_marker + ' ' + name_base 100 base_marker = base_marker + ' ' + name_base
104 merge_regions = self.merge_regions() 101 merge_regions = self.merge_regions()
105 if reprocess is True:
106 merge_regions = self.reprocess_merge_regions(merge_regions)
107 for t in merge_regions: 102 for t in merge_regions:
108 what = t[0] 103 what = t[0]
109 if what == 'unchanged': 104 if what == 'unchanged':
110 for i in range(t[1], t[2]): 105 for i in range(t[1], t[2]):
111 yield self.base[i] 106 yield self.base[i]
276 yield 'unchanged', zmatch, zend 271 yield 'unchanged', zmatch, zend
277 iz = zend 272 iz = zend
278 ia = aend 273 ia = aend
279 ib = bend 274 ib = bend
280 275
281 def reprocess_merge_regions(self, merge_regions):
282 """Where there are conflict regions, remove the agreed lines.
283
284 Lines where both A and B have made the same changes are
285 eliminated.
286 """
287 for region in merge_regions:
288 if region[0] != "conflict":
289 yield region
290 continue
291 type, iz, zmatch, ia, amatch, ib, bmatch = region
292 a_region = self.a[ia:amatch]
293 b_region = self.b[ib:bmatch]
294 matches = mdiff.get_matching_blocks(''.join(a_region),
295 ''.join(b_region))
296 next_a = ia
297 next_b = ib
298 for region_ia, region_ib, region_len in matches[:-1]:
299 region_ia += ia
300 region_ib += ib
301 reg = self.mismatch_region(next_a, region_ia, next_b,
302 region_ib)
303 if reg is not None:
304 yield reg
305 yield 'same', region_ia, region_len + region_ia
306 next_a = region_ia + region_len
307 next_b = region_ib + region_len
308 reg = self.mismatch_region(next_a, amatch, next_b, bmatch)
309 if reg is not None:
310 yield reg
311
312 def mismatch_region(next_a, region_ia, next_b, region_ib): 276 def mismatch_region(next_a, region_ia, next_b, region_ib):
313 if next_a < region_ia or next_b < region_ib: 277 if next_a < region_ia or next_b < region_ib:
314 return 'conflict', None, None, next_a, region_ia, next_b, region_ib 278 return 'conflict', None, None, next_a, region_ia, next_b, region_ib
315 mismatch_region = staticmethod(mismatch_region) 279 mismatch_region = staticmethod(mismatch_region)
316 280
435 opener = scmutil.opener(os.path.dirname(local)) 399 opener = scmutil.opener(os.path.dirname(local))
436 out = opener(os.path.basename(local), "w", atomictemp=True) 400 out = opener(os.path.basename(local), "w", atomictemp=True)
437 else: 401 else:
438 out = sys.stdout 402 out = sys.stdout
439 403
440 reprocess = not opts.get('no_minimal')
441
442 m3 = Merge3Text(basetext, localtext, othertext) 404 m3 = Merge3Text(basetext, localtext, othertext)
443 for line in m3.merge_lines(name_a=name_a, name_b=name_b, 405 for line in m3.merge_lines(name_a=name_a, name_b=name_b):
444 reprocess=reprocess):
445 out.write(line) 406 out.write(line)
446 407
447 if not opts.get('print'): 408 if not opts.get('print'):
448 out.close() 409 out.close()
449 410