Mercurial > public > mercurial-scm > hg-stable
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 |