422 if rev > 1: |
422 if rev > 1: |
423 fixuprev = rev + 1 |
423 fixuprev = rev + 1 |
424 newfixups.append((fixuprev, a1, a2, b1, b2)) |
424 newfixups.append((fixuprev, a1, a2, b1, b2)) |
425 elif a2 - a1 == b2 - b1 or b1 == b2: |
425 elif a2 - a1 == b2 - b1 or b1 == b2: |
426 # 1:1 line mapping, or chunk was deleted |
426 # 1:1 line mapping, or chunk was deleted |
427 for i in pycompat.xrange(a1, a2): |
427 for i in range(a1, a2): |
428 rev, linenum = annotated[i] |
428 rev, linenum = annotated[i] |
429 if rev > 1: |
429 if rev > 1: |
430 if b1 == b2: # deletion, simply remove that single line |
430 if b1 == b2: # deletion, simply remove that single line |
431 nb1 = nb2 = 0 |
431 nb1 = nb2 = 0 |
432 else: # 1:1 line mapping, change the corresponding rev |
432 else: # 1:1 line mapping, change the corresponding rev |
449 """calculate the initial linelog based on self.content{,line}s. |
449 """calculate the initial linelog based on self.content{,line}s. |
450 this is similar to running a partial "annotate". |
450 this is similar to running a partial "annotate". |
451 """ |
451 """ |
452 llog = linelog.linelog() |
452 llog = linelog.linelog() |
453 a, alines = b'', [] |
453 a, alines = b'', [] |
454 for i in pycompat.xrange(len(self.contents)): |
454 for i in range(len(self.contents)): |
455 b, blines = self.contents[i], self.contentlines[i] |
455 b, blines = self.contents[i], self.contentlines[i] |
456 llrev = i * 2 + 1 |
456 llrev = i * 2 + 1 |
457 chunks = self._alldiffchunks(a, b, alines, blines) |
457 chunks = self._alldiffchunks(a, b, alines, blines) |
458 for a1, a2, b1, b2 in reversed(list(chunks)): |
458 for a1, a2, b1, b2 in reversed(list(chunks)): |
459 llog.replacelines(llrev, a1, a2, b1, b2) |
459 llog.replacelines(llrev, a1, a2, b1, b2) |
461 return llog |
461 return llog |
462 |
462 |
463 def _checkoutlinelog(self): |
463 def _checkoutlinelog(self): |
464 """() -> [str]. check out file contents from linelog""" |
464 """() -> [str]. check out file contents from linelog""" |
465 contents = [] |
465 contents = [] |
466 for i in pycompat.xrange(len(self.contents)): |
466 for i in range(len(self.contents)): |
467 rev = (i + 1) * 2 |
467 rev = (i + 1) * 2 |
468 self.linelog.annotate(rev) |
468 self.linelog.annotate(rev) |
469 content = b''.join(map(self._getline, self.linelog.annotateresult)) |
469 content = b''.join(map(self._getline, self.linelog.annotateresult)) |
470 contents.append(content) |
470 contents.append(content) |
471 return contents |
471 return contents |
603 # this is not optimized for perf but _showchanges only gets executed |
603 # this is not optimized for perf but _showchanges only gets executed |
604 # with an extra command-line flag. |
604 # with an extra command-line flag. |
605 a1, a2, b1, b2 = chunk |
605 a1, a2, b1, b2 = chunk |
606 aidxs, bidxs = [0] * (a2 - a1), [0] * (b2 - b1) |
606 aidxs, bidxs = [0] * (a2 - a1), [0] * (b2 - b1) |
607 for idx, fa1, fa2, fb1, fb2 in fixups: |
607 for idx, fa1, fa2, fb1, fb2 in fixups: |
608 for i in pycompat.xrange(fa1, fa2): |
608 for i in range(fa1, fa2): |
609 aidxs[i - a1] = (max(idx, 1) - 1) // 2 |
609 aidxs[i - a1] = (max(idx, 1) - 1) // 2 |
610 for i in pycompat.xrange(fb1, fb2): |
610 for i in range(fb1, fb2): |
611 bidxs[i - b1] = (max(idx, 1) - 1) // 2 |
611 bidxs[i - b1] = (max(idx, 1) - 1) // 2 |
612 |
612 |
613 fm.startitem() |
613 fm.startitem() |
614 fm.write( |
614 fm.write( |
615 b'hunk', |
615 b'hunk', |