Show More
@@ -427,6 +427,54 b' class uihunk(patchnode):' | |||
|
427 | 427 | self.pretty(x) |
|
428 | 428 | return x.getvalue() |
|
429 | 429 | |
|
430 | def reversehunk(self): | |
|
431 | """return a recordhunk which is the reverse of the hunk | |
|
432 | ||
|
433 | Assuming the displayed patch is diff(A, B) result. The returned hunk is | |
|
434 | intended to be applied to B, instead of A. | |
|
435 | ||
|
436 | For example, when A is "0\n1\n2\n6\n" and B is "0\n3\n4\n5\n6\n", and | |
|
437 | the user made the following selection: | |
|
438 | ||
|
439 | 0 | |
|
440 | [x] -1 [x]: selected | |
|
441 | [ ] -2 [ ]: not selected | |
|
442 | [x] +3 | |
|
443 | [ ] +4 | |
|
444 | [x] +5 | |
|
445 | 6 | |
|
446 | ||
|
447 | This function returns a hunk like: | |
|
448 | ||
|
449 | 0 | |
|
450 | -3 | |
|
451 | -4 | |
|
452 | -5 | |
|
453 | +1 | |
|
454 | +4 | |
|
455 | 6 | |
|
456 | ||
|
457 | Note "4" was first deleted then added. That's because "4" exists in B | |
|
458 | side and "-4" must exist between "-3" and "-5" to make the patch | |
|
459 | applicable to B. | |
|
460 | """ | |
|
461 | dels = [] | |
|
462 | adds = [] | |
|
463 | for line in self.changedlines: | |
|
464 | text = line.linetext | |
|
465 | if line.applied: | |
|
466 | if text[0] == '+': | |
|
467 | dels.append(text[1:]) | |
|
468 | elif text[0] == '-': | |
|
469 | adds.append(text[1:]) | |
|
470 | elif text[0] == '+': | |
|
471 | dels.append(text[1:]) | |
|
472 | adds.append(text[1:]) | |
|
473 | hunk = ['-%s' % l for l in dels] + ['+%s' % l for l in adds] | |
|
474 | h = self._hunk | |
|
475 | return patchmod.recordhunk(h.header, h.toline, h.fromline, h.proc, | |
|
476 | h.before, hunk, h.after) | |
|
477 | ||
|
430 | 478 | def __getattr__(self, name): |
|
431 | 479 | return getattr(self._hunk, name) |
|
432 | 480 |
@@ -959,6 +959,18 b' class recordhunk(object):' | |||
|
959 | 959 | rem = len([h for h in hunk if h[0] == '-']) |
|
960 | 960 | return add, rem |
|
961 | 961 | |
|
962 | def reversehunk(self): | |
|
963 | """return another recordhunk which is the reverse of the hunk | |
|
964 | ||
|
965 | If this hunk is diff(A, B), the returned hunk is diff(B, A). To do | |
|
966 | that, swap fromline/toline and +/- signs while keep other things | |
|
967 | unchanged. | |
|
968 | """ | |
|
969 | m = {'+': '-', '-': '+'} | |
|
970 | hunk = ['%s%s' % (m[l[0]], l[1:]) for l in self.hunk] | |
|
971 | return recordhunk(self.header, self.toline, self.fromline, self.proc, | |
|
972 | self.before, hunk, self.after) | |
|
973 | ||
|
962 | 974 | def write(self, fp): |
|
963 | 975 | delta = len(self.before) + len(self.after) |
|
964 | 976 | if self.after and self.after[-1] == '\\ No newline at end of file\n': |
@@ -1493,7 +1505,7 b' def reversehunks(hunks):' | |||
|
1493 | 1505 | c |
|
1494 | 1506 | 1 |
|
1495 | 1507 | 2 |
|
1496 |
@@ - |
|
|
1508 | @@ -2,6 +1,6 @@ | |
|
1497 | 1509 | c |
|
1498 | 1510 | 1 |
|
1499 | 1511 | 2 |
@@ -1501,26 +1513,17 b' def reversehunks(hunks):' | |||
|
1501 | 1513 | +4 |
|
1502 | 1514 | 5 |
|
1503 | 1515 | d |
|
1504 |
@@ - |
|
|
1516 | @@ -6,3 +5,2 @@ | |
|
1505 | 1517 | 5 |
|
1506 | 1518 | d |
|
1507 | 1519 | -lastline |
|
1508 | 1520 | |
|
1509 | 1521 | ''' |
|
1510 | 1522 | |
|
1511 | from . import crecord as crecordmod | |
|
1512 | 1523 | newhunks = [] |
|
1513 | 1524 | for c in hunks: |
|
1514 |
if |
|
|
1515 | # curses hunks encapsulate the record hunk in _hunk | |
|
1516 | c = c._hunk | |
|
1517 | if isinstance(c, recordhunk): | |
|
1518 | for j, line in enumerate(c.hunk): | |
|
1519 | if line.startswith("-"): | |
|
1520 | c.hunk[j] = "+" + c.hunk[j][1:] | |
|
1521 | elif line.startswith("+"): | |
|
1522 | c.hunk[j] = "-" + c.hunk[j][1:] | |
|
1523 | c.added, c.removed = c.removed, c.added | |
|
1525 | if util.safehasattr(c, 'reversehunk'): | |
|
1526 | c = c.reversehunk() | |
|
1524 | 1527 | newhunks.append(c) |
|
1525 | 1528 | return newhunks |
|
1526 | 1529 |
General Comments 0
You need to be logged in to leave comments.
Login now