comparison mercurial/patch.py @ 7392:564326a6ef9c

patch: isolate patchfile filesystem calls into methods This is a first step toward an svn-like patch driver and makes patchfile monkeypatching much easier. The latter is currently required to support in-memory patching until the code is refactored.
author Patrick Mezard <pmezard@gmail.com>
date Wed, 19 Nov 2008 13:27:57 +0100
parents 27d304c8cc03
children bffdab64dfbb
comparison
equal deleted inserted replaced
7391:27d304c8cc03 7392:564326a6ef9c
235 self.lines = [] 235 self.lines = []
236 self.exists = False 236 self.exists = False
237 self.missing = missing 237 self.missing = missing
238 if not missing: 238 if not missing:
239 try: 239 try:
240 fp = self.opener(fname, 'r') 240 self.lines = self.readlines(fname)
241 self.lines = fp.readlines()
242 fp.close()
243 self.exists = True 241 self.exists = True
244 except IOError: 242 except IOError:
245 pass 243 pass
246 else: 244 else:
247 self.ui.warn(_("unable to find '%s' for patching\n") % self.fname) 245 self.ui.warn(_("unable to find '%s' for patching\n") % self.fname)
251 self.offset = 0 249 self.offset = 0
252 self.rej = [] 250 self.rej = []
253 self.fileprinted = False 251 self.fileprinted = False
254 self.printfile(False) 252 self.printfile(False)
255 self.hunks = 0 253 self.hunks = 0
254
255 def readlines(self, fname):
256 fp = self.opener(fname, 'r')
257 try:
258 return fp.readlines()
259 finally:
260 fp.close()
261
262 def writelines(self, fname, lines):
263 fp = self.opener(fname, 'w')
264 try:
265 fp.writelines(lines)
266 finally:
267 fp.close()
268
269 def unlink(self, fname):
270 os.unlink(fname)
256 271
257 def printfile(self, warn): 272 def printfile(self, warn):
258 if self.fileprinted: 273 if self.fileprinted:
259 return 274 return
260 if warn or self.ui.verbose: 275 if warn or self.ui.verbose:
302 317
303 fname = self.fname + ".rej" 318 fname = self.fname + ".rej"
304 self.ui.warn( 319 self.ui.warn(
305 _("%d out of %d hunks FAILED -- saving rejects to file %s\n") % 320 _("%d out of %d hunks FAILED -- saving rejects to file %s\n") %
306 (len(self.rej), self.hunks, fname)) 321 (len(self.rej), self.hunks, fname))
307 base = os.path.basename(self.fname) 322
308 fp = self.opener(fname, 'w') 323 def rejlines():
309 fp.write("--- %s\n+++ %s\n" % (base, base)) 324 base = os.path.basename(self.fname)
310 for x in self.rej: 325 yield "--- %s\n+++ %s\n" % (base, base)
311 for l in x.hunk: 326 for x in self.rej:
312 fp.write(l) 327 for l in x.hunk:
313 if l[-1] != '\n': 328 yield l
314 fp.write("\n\ No newline at end of file\n") 329 if l[-1] != '\n':
315 fp.close() 330 yield "\n\ No newline at end of file\n"
331
332 self.writelines(fname, rejlines())
316 333
317 def write(self, dest=None): 334 def write(self, dest=None):
318 if not self.dirty: 335 if not self.dirty:
319 return 336 return
320 if not dest: 337 if not dest:
321 dest = self.fname 338 dest = self.fname
322 fp = self.opener(dest, 'w') 339 self.writelines(dest, self.lines)
323 for l in self.lines:
324 fp.write(l)
325 fp.close()
326 340
327 def close(self): 341 def close(self):
328 self.write() 342 self.write()
329 self.write_rej() 343 self.write_rej()
330 344
347 self.rej.append(h) 361 self.rej.append(h)
348 return -1 362 return -1
349 363
350 if isinstance(h, binhunk): 364 if isinstance(h, binhunk):
351 if h.rmfile(): 365 if h.rmfile():
352 os.unlink(self.fname) 366 self.unlink(self.fname)
353 else: 367 else:
354 self.lines[:] = h.new() 368 self.lines[:] = h.new()
355 self.offset += len(h.new()) 369 self.offset += len(h.new())
356 self.dirty = 1 370 self.dirty = 1
357 return 0 371 return 0
364 else: 378 else:
365 start = h.starta + self.offset - 1 379 start = h.starta + self.offset - 1
366 orig_start = start 380 orig_start = start
367 if diffhelpers.testhunk(old, self.lines, start) == 0: 381 if diffhelpers.testhunk(old, self.lines, start) == 0:
368 if h.rmfile(): 382 if h.rmfile():
369 os.unlink(self.fname) 383 self.unlink(self.fname)
370 else: 384 else:
371 self.lines[start : start + h.lena] = h.new() 385 self.lines[start : start + h.lena] = h.new()
372 self.offset += h.lenb - h.lena 386 self.offset += h.lenb - h.lena
373 self.dirty = 1 387 self.dirty = 1
374 return 0 388 return 0