mercurial/patch.py
changeset 25424 69609f43c752
parent 25359 724421cb4745
child 25483 fb04372d7b38
equal deleted inserted replaced
25423:525fbf24b51b 25424:69609f43c752
  1382     if i < 0:
  1382     if i < 0:
  1383         i = s.find(' ')
  1383         i = s.find(' ')
  1384         if i < 0:
  1384         if i < 0:
  1385             return s
  1385             return s
  1386     return s[:i]
  1386     return s[:i]
       
  1387 
       
  1388 def reversehunks(hunks):
       
  1389     '''reverse the signs in the hunks given as argument
       
  1390 
       
  1391     This function operates on hunks coming out of patch.filterpatch, that is
       
  1392     a list of the form: [header1, hunk1, hunk2, header2...]. Example usage:
       
  1393 
       
  1394     >>> rawpatch = """diff --git a/folder1/g b/folder1/g
       
  1395     ... --- a/folder1/g
       
  1396     ... +++ b/folder1/g
       
  1397     ... @@ -1,7 +1,7 @@
       
  1398     ... +firstline
       
  1399     ...  c
       
  1400     ...  1
       
  1401     ...  2
       
  1402     ... + 3
       
  1403     ... -4
       
  1404     ...  5
       
  1405     ...  d
       
  1406     ... +lastline"""
       
  1407     >>> hunks = parsepatch(rawpatch)
       
  1408     >>> hunkscomingfromfilterpatch = []
       
  1409     >>> for h in hunks:
       
  1410     ...     hunkscomingfromfilterpatch.append(h)
       
  1411     ...     hunkscomingfromfilterpatch.extend(h.hunks)
       
  1412 
       
  1413     >>> reversedhunks = reversehunks(hunkscomingfromfilterpatch)
       
  1414     >>> fp = cStringIO.StringIO()
       
  1415     >>> for c in reversedhunks:
       
  1416     ...      c.write(fp)
       
  1417     >>> fp.seek(0)
       
  1418     >>> reversedpatch = fp.read()
       
  1419     >>> print reversedpatch
       
  1420     diff --git a/folder1/g b/folder1/g
       
  1421     --- a/folder1/g
       
  1422     +++ b/folder1/g
       
  1423     @@ -1,4 +1,3 @@
       
  1424     -firstline
       
  1425      c
       
  1426      1
       
  1427      2
       
  1428     @@ -1,6 +2,6 @@
       
  1429      c
       
  1430      1
       
  1431      2
       
  1432     - 3
       
  1433     +4
       
  1434      5
       
  1435      d
       
  1436     @@ -5,3 +6,2 @@
       
  1437      5
       
  1438      d
       
  1439     -lastline
       
  1440 
       
  1441     '''
       
  1442 
       
  1443     import crecord as crecordmod
       
  1444     newhunks = []
       
  1445     for c in hunks:
       
  1446         if isinstance(c, crecordmod.uihunk):
       
  1447             # curses hunks encapsulate the record hunk in _hunk
       
  1448             c = c._hunk
       
  1449         if isinstance(c, recordhunk):
       
  1450             for j, line in enumerate(c.hunk):
       
  1451                 if line.startswith("-"):
       
  1452                     c.hunk[j] = "+" + c.hunk[j][1:]
       
  1453                 elif line.startswith("+"):
       
  1454                     c.hunk[j] = "-" + c.hunk[j][1:]
       
  1455             c.added, c.removed = c.removed, c.added
       
  1456         newhunks.append(c)
       
  1457     return newhunks
  1387 
  1458 
  1388 def parsepatch(originalchunks):
  1459 def parsepatch(originalchunks):
  1389     """patch -> [] of headers -> [] of hunks """
  1460     """patch -> [] of headers -> [] of hunks """
  1390     class parser(object):
  1461     class parser(object):
  1391         """patch parsing state machine"""
  1462         """patch parsing state machine"""