mercurial/patch.py
changeset 24341 616c01b69898
parent 24306 6ddc86eedc3b
child 24346 31edcea517c1
equal deleted inserted replaced
24340:567ae5365754 24341:616c01b69898
    13 import email.Generator
    13 import email.Generator
    14 import email.Parser
    14 import email.Parser
    15 
    15 
    16 from i18n import _
    16 from i18n import _
    17 from node import hex, short
    17 from node import hex, short
       
    18 import cStringIO
    18 import base85, mdiff, scmutil, util, diffhelpers, copies, encoding, error
    19 import base85, mdiff, scmutil, util, diffhelpers, copies, encoding, error
    19 
    20 
    20 gitre = re.compile('diff --git a/(.*) b/(.*)')
    21 gitre = re.compile('diff --git a/(.*) b/(.*)')
    21 tabsplitter = re.compile(r'(\t+|[^\t]+)')
    22 tabsplitter = re.compile(r'(\t+|[^\t]+)')
    22 
    23 
  1350         i = s.find(' ')
  1351         i = s.find(' ')
  1351         if i < 0:
  1352         if i < 0:
  1352             return s
  1353             return s
  1353     return s[:i]
  1354     return s[:i]
  1354 
  1355 
  1355 def parsepatch(fp):
  1356 def parsepatch(originalchunks):
  1356     """patch -> [] of headers -> [] of hunks """
  1357     """patch -> [] of headers -> [] of hunks """
  1357     class parser(object):
  1358     class parser(object):
  1358         """patch parsing state machine"""
  1359         """patch parsing state machine"""
  1359         def __init__(self):
  1360         def __init__(self):
  1360             self.fromline = 0
  1361             self.fromline = 0
  1419                       'hunk': addhunk},
  1420                       'hunk': addhunk},
  1420             'other': {'other': addother},
  1421             'other': {'other': addother},
  1421             }
  1422             }
  1422 
  1423 
  1423     p = parser()
  1424     p = parser()
       
  1425     fp = cStringIO.StringIO()
       
  1426     fp.write(''.join(originalchunks))
       
  1427     fp.seek(0)
  1424 
  1428 
  1425     state = 'context'
  1429     state = 'context'
  1426     for newstate, data in scanpatch(fp):
  1430     for newstate, data in scanpatch(fp):
  1427         try:
  1431         try:
  1428             p.transitions[state][newstate](p, data)
  1432             p.transitions[state][newstate](p, data)
  1429         except KeyError:
  1433         except KeyError:
  1430             raise PatchError('unhandled transition: %s -> %s' %
  1434             raise PatchError('unhandled transition: %s -> %s' %
  1431                                    (state, newstate))
  1435                                    (state, newstate))
  1432         state = newstate
  1436         state = newstate
       
  1437     del fp
  1433     return p.finished()
  1438     return p.finished()
  1434 
  1439 
  1435 def pathtransform(path, strip, prefix):
  1440 def pathtransform(path, strip, prefix):
  1436     '''turn a path from a patch into a path suitable for the repository
  1441     '''turn a path from a patch into a path suitable for the repository
  1437 
  1442