188 return (dopatch, gitpatches) |
188 return (dopatch, gitpatches) |
189 |
189 |
190 def dogitpatch(patchname, gitpatches, cwd=None): |
190 def dogitpatch(patchname, gitpatches, cwd=None): |
191 """Preprocess git patch so that vanilla patch can handle it""" |
191 """Preprocess git patch so that vanilla patch can handle it""" |
192 def extractbin(fp): |
192 def extractbin(fp): |
193 line = fp.readline().rstrip() |
193 i = [0] # yuck |
|
194 def readline(): |
|
195 i[0] += 1 |
|
196 return fp.readline().rstrip() |
|
197 line = readline() |
194 while line and not line.startswith('literal '): |
198 while line and not line.startswith('literal '): |
195 line = fp.readline().rstrip() |
199 line = readline() |
196 if not line: |
200 if not line: |
197 return |
201 return None, i[0] |
198 size = int(line[8:]) |
202 size = int(line[8:]) |
199 dec = [] |
203 dec = [] |
200 line = fp.readline().rstrip() |
204 line = readline() |
201 while line: |
205 while line: |
202 l = line[0] |
206 l = line[0] |
203 if l <= 'Z' and l >= 'A': |
207 if l <= 'Z' and l >= 'A': |
204 l = ord(l) - ord('A') + 1 |
208 l = ord(l) - ord('A') + 1 |
205 else: |
209 else: |
206 l = ord(l) - ord('a') + 27 |
210 l = ord(l) - ord('a') + 27 |
207 dec.append(base85.b85decode(line[1:])[:l]) |
211 dec.append(base85.b85decode(line[1:])[:l]) |
208 line = fp.readline().rstrip() |
212 line = readline() |
209 text = zlib.decompress(''.join(dec)) |
213 text = zlib.decompress(''.join(dec)) |
210 if len(text) != size: |
214 if len(text) != size: |
211 raise util.Abort(_('binary patch is %d bytes, not %d') % |
215 raise util.Abort(_('binary patch is %d bytes, not %d') % |
212 (len(text), size)) |
216 (len(text), size)) |
213 return text |
217 return text, i[0] |
214 |
218 |
215 pf = file(patchname) |
219 pf = file(patchname) |
216 pfline = 1 |
220 pfline = 1 |
217 |
221 |
218 fd, patchname = tempfile.mkstemp(prefix='hg-patch-') |
222 fd, patchname = tempfile.mkstemp(prefix='hg-patch-') |
228 while pfline < p.lineno: |
232 while pfline < p.lineno: |
229 tmpfp.write(pf.readline()) |
233 tmpfp.write(pf.readline()) |
230 pfline += 1 |
234 pfline += 1 |
231 |
235 |
232 if p.binary: |
236 if p.binary: |
233 text = extractbin(pf) |
237 text, delta = extractbin(pf) |
234 if not text: |
238 if not text: |
235 raise util.Abort(_('binary patch extraction failed')) |
239 raise util.Abort(_('binary patch extraction failed')) |
|
240 pfline += delta |
236 if not cwd: |
241 if not cwd: |
237 cwd = os.getcwd() |
242 cwd = os.getcwd() |
238 absdst = os.path.join(cwd, p.path) |
243 absdst = os.path.join(cwd, p.path) |
239 basedir = os.path.dirname(absdst) |
244 basedir = os.path.dirname(absdst) |
240 if not os.path.isdir(basedir): |
245 if not os.path.isdir(basedir): |