Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/patch.py @ 28861:86db5cb55d46
pycompat: switch to util.stringio for py3 compat
author | timeless <timeless@mozdev.org> |
---|---|
date | Sun, 10 Apr 2016 20:55:37 +0000 |
parents | 8286f551b7ee |
children | 9d38a2061fd8 |
comparison
equal
deleted
inserted
replaced
28860:50d11dd8ac02 | 28861:86db5cb55d46 |
---|---|
6 # This software may be used and distributed according to the terms of the | 6 # This software may be used and distributed according to the terms of the |
7 # GNU General Public License version 2 or any later version. | 7 # GNU General Public License version 2 or any later version. |
8 | 8 |
9 from __future__ import absolute_import | 9 from __future__ import absolute_import |
10 | 10 |
11 import cStringIO | |
12 import collections | 11 import collections |
13 import copy | 12 import copy |
14 import email | 13 import email |
15 import errno | 14 import errno |
16 import os | 15 import os |
35 mdiff, | 34 mdiff, |
36 pathutil, | 35 pathutil, |
37 scmutil, | 36 scmutil, |
38 util, | 37 util, |
39 ) | 38 ) |
39 stringio = util.stringio | |
40 | 40 |
41 gitre = re.compile('diff --git a/(.*) b/(.*)') | 41 gitre = re.compile('diff --git a/(.*) b/(.*)') |
42 tabsplitter = re.compile(r'(\t+|[^\t]+)') | 42 tabsplitter = re.compile(r'(\t+|[^\t]+)') |
43 | 43 |
44 class PatchError(Exception): | 44 class PatchError(Exception): |
58 return False | 58 return False |
59 l = line.split(': ', 1) | 59 l = line.split(': ', 1) |
60 return len(l) == 2 and ' ' not in l[0] | 60 return len(l) == 2 and ' ' not in l[0] |
61 | 61 |
62 def chunk(lines): | 62 def chunk(lines): |
63 return cStringIO.StringIO(''.join(lines)) | 63 return stringio(''.join(lines)) |
64 | 64 |
65 def hgsplit(stream, cur): | 65 def hgsplit(stream, cur): |
66 inheader = True | 66 inheader = True |
67 | 67 |
68 for line in stream: | 68 for line in stream: |
91 for c in split(chunk(cur[1:])): | 91 for c in split(chunk(cur[1:])): |
92 yield c | 92 yield c |
93 | 93 |
94 def mimesplit(stream, cur): | 94 def mimesplit(stream, cur): |
95 def msgfp(m): | 95 def msgfp(m): |
96 fp = cStringIO.StringIO() | 96 fp = stringio() |
97 g = email.Generator.Generator(fp, mangle_from_=False) | 97 g = email.Generator.Generator(fp, mangle_from_=False) |
98 g.flatten(m) | 98 g.flatten(m) |
99 fp.seek(0) | 99 fp.seek(0) |
100 return fp | 100 return fp |
101 | 101 |
244 hgpatchheader = False | 244 hgpatchheader = False |
245 ignoretext = False | 245 ignoretext = False |
246 | 246 |
247 ui.debug('found patch at byte %d\n' % m.start(0)) | 247 ui.debug('found patch at byte %d\n' % m.start(0)) |
248 diffs_seen += 1 | 248 diffs_seen += 1 |
249 cfp = cStringIO.StringIO() | 249 cfp = stringio() |
250 for line in payload[:m.start(0)].splitlines(): | 250 for line in payload[:m.start(0)].splitlines(): |
251 if line.startswith('# HG changeset patch') and not hgpatch: | 251 if line.startswith('# HG changeset patch') and not hgpatch: |
252 ui.debug('patch generated by hg export\n') | 252 ui.debug('patch generated by hg export\n') |
253 hgpatch = True | 253 hgpatch = True |
254 hgpatchheader = True | 254 hgpatchheader = True |
1055 if ret != 0: | 1055 if ret != 0: |
1056 ui.warn(_("editor exited with exit code %d\n") % ret) | 1056 ui.warn(_("editor exited with exit code %d\n") % ret) |
1057 continue | 1057 continue |
1058 # Remove comment lines | 1058 # Remove comment lines |
1059 patchfp = open(patchfn) | 1059 patchfp = open(patchfn) |
1060 ncpatchfp = cStringIO.StringIO() | 1060 ncpatchfp = stringio() |
1061 for line in patchfp: | 1061 for line in patchfp: |
1062 if not line.startswith('#'): | 1062 if not line.startswith('#'): |
1063 ncpatchfp.write(line) | 1063 ncpatchfp.write(line) |
1064 patchfp.close() | 1064 patchfp.close() |
1065 ncpatchfp.seek(0) | 1065 ncpatchfp.seek(0) |
1438 >>> for h in hunks: | 1438 >>> for h in hunks: |
1439 ... hunkscomingfromfilterpatch.append(h) | 1439 ... hunkscomingfromfilterpatch.append(h) |
1440 ... hunkscomingfromfilterpatch.extend(h.hunks) | 1440 ... hunkscomingfromfilterpatch.extend(h.hunks) |
1441 | 1441 |
1442 >>> reversedhunks = reversehunks(hunkscomingfromfilterpatch) | 1442 >>> reversedhunks = reversehunks(hunkscomingfromfilterpatch) |
1443 >>> fp = cStringIO.StringIO() | 1443 >>> from . import util |
1444 >>> fp = util.stringio() | |
1444 >>> for c in reversedhunks: | 1445 >>> for c in reversedhunks: |
1445 ... c.write(fp) | 1446 ... c.write(fp) |
1446 >>> fp.seek(0) | 1447 >>> fp.seek(0) |
1447 >>> reversedpatch = fp.read() | 1448 >>> reversedpatch = fp.read() |
1448 >>> print reversedpatch | 1449 >>> print reversedpatch |
1551 'hunk': addhunk}, | 1552 'hunk': addhunk}, |
1552 'other': {'other': addother}, | 1553 'other': {'other': addother}, |
1553 } | 1554 } |
1554 | 1555 |
1555 p = parser() | 1556 p = parser() |
1556 fp = cStringIO.StringIO() | 1557 fp = stringio() |
1557 fp.write(''.join(originalchunks)) | 1558 fp.write(''.join(originalchunks)) |
1558 fp.seek(0) | 1559 fp.seek(0) |
1559 | 1560 |
1560 state = 'context' | 1561 state = 'context' |
1561 for newstate, data in scanpatch(fp): | 1562 for newstate, data in scanpatch(fp): |
1730 pos = 0 | 1731 pos = 0 |
1731 try: | 1732 try: |
1732 pos = lr.fp.tell() | 1733 pos = lr.fp.tell() |
1733 fp = lr.fp | 1734 fp = lr.fp |
1734 except IOError: | 1735 except IOError: |
1735 fp = cStringIO.StringIO(lr.fp.read()) | 1736 fp = stringio(lr.fp.read()) |
1736 gitlr = linereader(fp) | 1737 gitlr = linereader(fp) |
1737 gitlr.push(firstline) | 1738 gitlr.push(firstline) |
1738 gitpatches = readgitpatch(gitlr) | 1739 gitpatches = readgitpatch(gitlr) |
1739 fp.seek(pos) | 1740 fp.seek(pos) |
1740 return gitpatches | 1741 return gitpatches |