Mercurial > public > mercurial-scm > hg
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 |