diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -20,8 +20,8 @@ import lock as lockmod def parsealiases(cmd): return cmd.lstrip("^").split("|") -def recordfilter(ui, fp): - return patch.filterpatch(ui, patch.parsepatch(fp)) +def recordfilter(ui, originalhunks): + return patch.filterpatch(ui, originalhunks) def dorecord(ui, repo, commitfunc, cmdsuggest, backupall, filterfn, *pats, **opts): @@ -59,19 +59,15 @@ def dorecord(ui, repo, commitfunc, cmdsu diffopts = patch.difffeatureopts(ui, opts=opts, whitespace=True) diffopts.nodates = True diffopts.git = True - originalchunks = patch.diff(repo, changes=status, opts=diffopts) - fp = cStringIO.StringIO() - fp.write(''.join(originalchunks)) - fp.seek(0) + originaldiff = patch.diff(repo, changes=status, opts=diffopts) + originalchunks = patch.parsepatch(originaldiff) # 1. filter patch, so we have intending-to apply subset of it try: - chunks = filterfn(ui, fp) + chunks = filterfn(ui, originalchunks) except patch.PatchError, err: raise util.Abort(_('error parsing patch: %s') % err) - del fp - contenders = set() for h in chunks: try: diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -15,6 +15,7 @@ import email.Parser from i18n import _ from node import hex, short +import cStringIO import base85, mdiff, scmutil, util, diffhelpers, copies, encoding, error gitre = re.compile('diff --git a/(.*) b/(.*)') @@ -1352,7 +1353,7 @@ def parsefilename(str): return s return s[:i] -def parsepatch(fp): +def parsepatch(originalchunks): """patch -> [] of headers -> [] of hunks """ class parser(object): """patch parsing state machine""" @@ -1421,6 +1422,9 @@ def parsepatch(fp): } p = parser() + fp = cStringIO.StringIO() + fp.write(''.join(originalchunks)) + fp.seek(0) state = 'context' for newstate, data in scanpatch(fp): @@ -1430,6 +1434,7 @@ def parsepatch(fp): raise PatchError('unhandled transition: %s -> %s' % (state, newstate)) state = newstate + del fp return p.finished() def pathtransform(path, strip, prefix):