Show More
@@ -10,65 +10,12 b'' | |||||
10 | from mercurial.i18n import _ |
|
10 | from mercurial.i18n import _ | |
11 | from mercurial import cmdutil, commands, extensions, hg, patch |
|
11 | from mercurial import cmdutil, commands, extensions, hg, patch | |
12 | from mercurial import util |
|
12 | from mercurial import util | |
13 |
import copy, cStringIO, errno, os, |
|
13 | import copy, cStringIO, errno, os, shutil, tempfile | |
14 |
|
14 | |||
15 | cmdtable = {} |
|
15 | cmdtable = {} | |
16 | command = cmdutil.command(cmdtable) |
|
16 | command = cmdutil.command(cmdtable) | |
17 | testedwith = 'internal' |
|
17 | testedwith = 'internal' | |
18 |
|
18 | |||
19 | lines_re = re.compile(r'@@ -(\d+),(\d+) \+(\d+),(\d+) @@\s*(.*)') |
|
|||
20 |
|
||||
21 | def scanpatch(fp): |
|
|||
22 | """like patch.iterhunks, but yield different events |
|
|||
23 |
|
||||
24 | - ('file', [header_lines + fromfile + tofile]) |
|
|||
25 | - ('context', [context_lines]) |
|
|||
26 | - ('hunk', [hunk_lines]) |
|
|||
27 | - ('range', (-start,len, +start,len, proc)) |
|
|||
28 | """ |
|
|||
29 | lr = patch.linereader(fp) |
|
|||
30 |
|
||||
31 | def scanwhile(first, p): |
|
|||
32 | """scan lr while predicate holds""" |
|
|||
33 | lines = [first] |
|
|||
34 | while True: |
|
|||
35 | line = lr.readline() |
|
|||
36 | if not line: |
|
|||
37 | break |
|
|||
38 | if p(line): |
|
|||
39 | lines.append(line) |
|
|||
40 | else: |
|
|||
41 | lr.push(line) |
|
|||
42 | break |
|
|||
43 | return lines |
|
|||
44 |
|
||||
45 | while True: |
|
|||
46 | line = lr.readline() |
|
|||
47 | if not line: |
|
|||
48 | break |
|
|||
49 | if line.startswith('diff --git a/') or line.startswith('diff -r '): |
|
|||
50 | def notheader(line): |
|
|||
51 | s = line.split(None, 1) |
|
|||
52 | return not s or s[0] not in ('---', 'diff') |
|
|||
53 | header = scanwhile(line, notheader) |
|
|||
54 | fromfile = lr.readline() |
|
|||
55 | if fromfile.startswith('---'): |
|
|||
56 | tofile = lr.readline() |
|
|||
57 | header += [fromfile, tofile] |
|
|||
58 | else: |
|
|||
59 | lr.push(fromfile) |
|
|||
60 | yield 'file', header |
|
|||
61 | elif line[0] == ' ': |
|
|||
62 | yield 'context', scanwhile(line, lambda l: l[0] in ' \\') |
|
|||
63 | elif line[0] in '-+': |
|
|||
64 | yield 'hunk', scanwhile(line, lambda l: l[0] in '-+\\') |
|
|||
65 | else: |
|
|||
66 | m = lines_re.match(line) |
|
|||
67 | if m: |
|
|||
68 | yield 'range', m.groups() |
|
|||
69 | else: |
|
|||
70 | yield 'other', line |
|
|||
71 |
|
||||
72 |
|
19 | |||
73 | def parsepatch(fp): |
|
20 | def parsepatch(fp): | |
74 | """patch -> [] of headers -> [] of hunks """ |
|
21 | """patch -> [] of headers -> [] of hunks """ | |
@@ -93,7 +40,7 b' def parsepatch(fp):' | |||||
93 | def addcontext(self, context): |
|
40 | def addcontext(self, context): | |
94 | if self.hunk: |
|
41 | if self.hunk: | |
95 | h = patch.recordhunk(self.header, self.fromline, self.toline, |
|
42 | h = patch.recordhunk(self.header, self.fromline, self.toline, | |
96 | self.proc, self.before, self.hunk, context) |
|
43 | self.proc, self.before, self.hunk, context) | |
97 | self.header.hunks.append(h) |
|
44 | self.header.hunks.append(h) | |
98 | self.fromline += len(self.before) + h.removed |
|
45 | self.fromline += len(self.before) + h.removed | |
99 | self.toline += len(self.before) + h.added |
|
46 | self.toline += len(self.before) + h.added | |
@@ -141,7 +88,7 b' def parsepatch(fp):' | |||||
141 | p = parser() |
|
88 | p = parser() | |
142 |
|
89 | |||
143 | state = 'context' |
|
90 | state = 'context' | |
144 | for newstate, data in scanpatch(fp): |
|
91 | for newstate, data in patch.scanpatch(fp): | |
145 | try: |
|
92 | try: | |
146 | p.transitions[state][newstate](p, data) |
|
93 | p.transitions[state][newstate](p, data) | |
147 | except KeyError: |
|
94 | except KeyError: |
@@ -1276,6 +1276,58 b' def makepatchmeta(backend, afile_orig, b' | |||||
1276 | gp.op = 'DELETE' |
|
1276 | gp.op = 'DELETE' | |
1277 | return gp |
|
1277 | return gp | |
1278 |
|
1278 | |||
|
1279 | def scanpatch(fp): | |||
|
1280 | """like patch.iterhunks, but yield different events | |||
|
1281 | ||||
|
1282 | - ('file', [header_lines + fromfile + tofile]) | |||
|
1283 | - ('context', [context_lines]) | |||
|
1284 | - ('hunk', [hunk_lines]) | |||
|
1285 | - ('range', (-start,len, +start,len, proc)) | |||
|
1286 | """ | |||
|
1287 | lines_re = re.compile(r'@@ -(\d+),(\d+) \+(\d+),(\d+) @@\s*(.*)') | |||
|
1288 | lr = linereader(fp) | |||
|
1289 | ||||
|
1290 | def scanwhile(first, p): | |||
|
1291 | """scan lr while predicate holds""" | |||
|
1292 | lines = [first] | |||
|
1293 | while True: | |||
|
1294 | line = lr.readline() | |||
|
1295 | if not line: | |||
|
1296 | break | |||
|
1297 | if p(line): | |||
|
1298 | lines.append(line) | |||
|
1299 | else: | |||
|
1300 | lr.push(line) | |||
|
1301 | break | |||
|
1302 | return lines | |||
|
1303 | ||||
|
1304 | while True: | |||
|
1305 | line = lr.readline() | |||
|
1306 | if not line: | |||
|
1307 | break | |||
|
1308 | if line.startswith('diff --git a/') or line.startswith('diff -r '): | |||
|
1309 | def notheader(line): | |||
|
1310 | s = line.split(None, 1) | |||
|
1311 | return not s or s[0] not in ('---', 'diff') | |||
|
1312 | header = scanwhile(line, notheader) | |||
|
1313 | fromfile = lr.readline() | |||
|
1314 | if fromfile.startswith('---'): | |||
|
1315 | tofile = lr.readline() | |||
|
1316 | header += [fromfile, tofile] | |||
|
1317 | else: | |||
|
1318 | lr.push(fromfile) | |||
|
1319 | yield 'file', header | |||
|
1320 | elif line[0] == ' ': | |||
|
1321 | yield 'context', scanwhile(line, lambda l: l[0] in ' \\') | |||
|
1322 | elif line[0] in '-+': | |||
|
1323 | yield 'hunk', scanwhile(line, lambda l: l[0] in '-+\\') | |||
|
1324 | else: | |||
|
1325 | m = lines_re.match(line) | |||
|
1326 | if m: | |||
|
1327 | yield 'range', m.groups() | |||
|
1328 | else: | |||
|
1329 | yield 'other', line | |||
|
1330 | ||||
1279 | def scangitpatch(lr, firstline): |
|
1331 | def scangitpatch(lr, firstline): | |
1280 | """ |
|
1332 | """ | |
1281 | Git patches can emit: |
|
1333 | Git patches can emit: |
General Comments 0
You need to be logged in to leave comments.
Login now