Show More
@@ -16,87 +16,6 b' cmdtable = {}' | |||
|
16 | 16 | command = cmdutil.command(cmdtable) |
|
17 | 17 | testedwith = 'internal' |
|
18 | 18 | |
|
19 | ||
|
20 | def parsepatch(fp): | |
|
21 | """patch -> [] of headers -> [] of hunks """ | |
|
22 | class parser(object): | |
|
23 | """patch parsing state machine""" | |
|
24 | def __init__(self): | |
|
25 | self.fromline = 0 | |
|
26 | self.toline = 0 | |
|
27 | self.proc = '' | |
|
28 | self.header = None | |
|
29 | self.context = [] | |
|
30 | self.before = [] | |
|
31 | self.hunk = [] | |
|
32 | self.headers = [] | |
|
33 | ||
|
34 | def addrange(self, limits): | |
|
35 | fromstart, fromend, tostart, toend, proc = limits | |
|
36 | self.fromline = int(fromstart) | |
|
37 | self.toline = int(tostart) | |
|
38 | self.proc = proc | |
|
39 | ||
|
40 | def addcontext(self, context): | |
|
41 | if self.hunk: | |
|
42 | h = patch.recordhunk(self.header, self.fromline, self.toline, | |
|
43 | self.proc, self.before, self.hunk, context) | |
|
44 | self.header.hunks.append(h) | |
|
45 | self.fromline += len(self.before) + h.removed | |
|
46 | self.toline += len(self.before) + h.added | |
|
47 | self.before = [] | |
|
48 | self.hunk = [] | |
|
49 | self.proc = '' | |
|
50 | self.context = context | |
|
51 | ||
|
52 | def addhunk(self, hunk): | |
|
53 | if self.context: | |
|
54 | self.before = self.context | |
|
55 | self.context = [] | |
|
56 | self.hunk = hunk | |
|
57 | ||
|
58 | def newfile(self, hdr): | |
|
59 | self.addcontext([]) | |
|
60 | h = patch.header(hdr) | |
|
61 | self.headers.append(h) | |
|
62 | self.header = h | |
|
63 | ||
|
64 | def addother(self, line): | |
|
65 | pass # 'other' lines are ignored | |
|
66 | ||
|
67 | def finished(self): | |
|
68 | self.addcontext([]) | |
|
69 | return self.headers | |
|
70 | ||
|
71 | transitions = { | |
|
72 | 'file': {'context': addcontext, | |
|
73 | 'file': newfile, | |
|
74 | 'hunk': addhunk, | |
|
75 | 'range': addrange}, | |
|
76 | 'context': {'file': newfile, | |
|
77 | 'hunk': addhunk, | |
|
78 | 'range': addrange, | |
|
79 | 'other': addother}, | |
|
80 | 'hunk': {'context': addcontext, | |
|
81 | 'file': newfile, | |
|
82 | 'range': addrange}, | |
|
83 | 'range': {'context': addcontext, | |
|
84 | 'hunk': addhunk}, | |
|
85 | 'other': {'other': addother}, | |
|
86 | } | |
|
87 | ||
|
88 | p = parser() | |
|
89 | ||
|
90 | state = 'context' | |
|
91 | for newstate, data in patch.scanpatch(fp): | |
|
92 | try: | |
|
93 | p.transitions[state][newstate](p, data) | |
|
94 | except KeyError: | |
|
95 | raise patch.PatchError('unhandled transition: %s -> %s' % | |
|
96 | (state, newstate)) | |
|
97 | state = newstate | |
|
98 | return p.finished() | |
|
99 | ||
|
100 | 19 | def filterpatch(ui, headers): |
|
101 | 20 | """Interactively filter patch chunks into applied-only chunks""" |
|
102 | 21 | |
@@ -181,7 +100,7 b' the hunk is left unchanged.' | |||
|
181 | 100 | ncpatchfp.write(line) |
|
182 | 101 | patchfp.close() |
|
183 | 102 | ncpatchfp.seek(0) |
|
184 | newpatches = parsepatch(ncpatchfp) | |
|
103 | newpatches = patch.parsepatch(ncpatchfp) | |
|
185 | 104 | finally: |
|
186 | 105 | os.unlink(patchfn) |
|
187 | 106 | del ncpatchfp |
@@ -371,7 +290,7 b' def dorecord(ui, repo, commitfunc, cmdsu' | |||
|
371 | 290 | |
|
372 | 291 | # 1. filter patch, so we have intending-to apply subset of it |
|
373 | 292 | try: |
|
374 | chunks = filterpatch(ui, parsepatch(fp)) | |
|
293 | chunks = filterpatch(ui, patch.parsepatch(fp)) | |
|
375 | 294 | except patch.PatchError, err: |
|
376 | 295 | raise util.Abort(_('error parsing patch: %s') % err) |
|
377 | 296 |
@@ -1191,6 +1191,86 b' def parsefilename(str):' | |||
|
1191 | 1191 | return s |
|
1192 | 1192 | return s[:i] |
|
1193 | 1193 | |
|
1194 | def parsepatch(fp): | |
|
1195 | """patch -> [] of headers -> [] of hunks """ | |
|
1196 | class parser(object): | |
|
1197 | """patch parsing state machine""" | |
|
1198 | def __init__(self): | |
|
1199 | self.fromline = 0 | |
|
1200 | self.toline = 0 | |
|
1201 | self.proc = '' | |
|
1202 | self.header = None | |
|
1203 | self.context = [] | |
|
1204 | self.before = [] | |
|
1205 | self.hunk = [] | |
|
1206 | self.headers = [] | |
|
1207 | ||
|
1208 | def addrange(self, limits): | |
|
1209 | fromstart, fromend, tostart, toend, proc = limits | |
|
1210 | self.fromline = int(fromstart) | |
|
1211 | self.toline = int(tostart) | |
|
1212 | self.proc = proc | |
|
1213 | ||
|
1214 | def addcontext(self, context): | |
|
1215 | if self.hunk: | |
|
1216 | h = recordhunk(self.header, self.fromline, self.toline, | |
|
1217 | self.proc, self.before, self.hunk, context) | |
|
1218 | self.header.hunks.append(h) | |
|
1219 | self.fromline += len(self.before) + h.removed | |
|
1220 | self.toline += len(self.before) + h.added | |
|
1221 | self.before = [] | |
|
1222 | self.hunk = [] | |
|
1223 | self.proc = '' | |
|
1224 | self.context = context | |
|
1225 | ||
|
1226 | def addhunk(self, hunk): | |
|
1227 | if self.context: | |
|
1228 | self.before = self.context | |
|
1229 | self.context = [] | |
|
1230 | self.hunk = hunk | |
|
1231 | ||
|
1232 | def newfile(self, hdr): | |
|
1233 | self.addcontext([]) | |
|
1234 | h = header(hdr) | |
|
1235 | self.headers.append(h) | |
|
1236 | self.header = h | |
|
1237 | ||
|
1238 | def addother(self, line): | |
|
1239 | pass # 'other' lines are ignored | |
|
1240 | ||
|
1241 | def finished(self): | |
|
1242 | self.addcontext([]) | |
|
1243 | return self.headers | |
|
1244 | ||
|
1245 | transitions = { | |
|
1246 | 'file': {'context': addcontext, | |
|
1247 | 'file': newfile, | |
|
1248 | 'hunk': addhunk, | |
|
1249 | 'range': addrange}, | |
|
1250 | 'context': {'file': newfile, | |
|
1251 | 'hunk': addhunk, | |
|
1252 | 'range': addrange, | |
|
1253 | 'other': addother}, | |
|
1254 | 'hunk': {'context': addcontext, | |
|
1255 | 'file': newfile, | |
|
1256 | 'range': addrange}, | |
|
1257 | 'range': {'context': addcontext, | |
|
1258 | 'hunk': addhunk}, | |
|
1259 | 'other': {'other': addother}, | |
|
1260 | } | |
|
1261 | ||
|
1262 | p = parser() | |
|
1263 | ||
|
1264 | state = 'context' | |
|
1265 | for newstate, data in scanpatch(fp): | |
|
1266 | try: | |
|
1267 | p.transitions[state][newstate](p, data) | |
|
1268 | except KeyError: | |
|
1269 | raise PatchError('unhandled transition: %s -> %s' % | |
|
1270 | (state, newstate)) | |
|
1271 | state = newstate | |
|
1272 | return p.finished() | |
|
1273 | ||
|
1194 | 1274 | def pathtransform(path, strip, prefix): |
|
1195 | 1275 | '''turn a path from a patch into a path suitable for the repository |
|
1196 | 1276 |
General Comments 0
You need to be logged in to leave comments.
Login now