398 |
398 |
399 def patch(self, repo, patchfile): |
399 def patch(self, repo, patchfile): |
400 '''Apply patchfile to the working directory. |
400 '''Apply patchfile to the working directory. |
401 patchfile: file name of patch''' |
401 patchfile: file name of patch''' |
402 try: |
402 try: |
403 pp = util.find_in_path('gpatch', os.environ.get('PATH', ''), 'patch') |
403 (files, fuzz) = patch.patch(patchfile, self.ui, strip=1, |
404 f = os.popen("%s -d %s -p1 --no-backup-if-mismatch < %s" % |
404 cwd=repo.root) |
405 (pp, util.shellquote(repo.root), util.shellquote(patchfile))) |
405 except Exception, inst: |
406 except: |
406 self.ui.note(str(inst) + '\n') |
407 self.ui.warn("patch failed, unable to continue (try -v)\n") |
407 if not self.ui.verbose: |
408 return (None, [], False) |
408 self.ui.warn("patch failed, unable to continue (try -v)\n") |
409 files = [] |
409 return (False, [], False) |
410 fuzz = False |
410 |
411 for l in f: |
411 return (True, files.keys(), fuzz) |
412 l = l.rstrip('\r\n'); |
|
413 if self.ui.verbose: |
|
414 self.ui.warn(l + "\n") |
|
415 if l[:14] == 'patching file ': |
|
416 pf = os.path.normpath(util.parse_patch_output(l)) |
|
417 if pf not in files: |
|
418 files.append(pf) |
|
419 printed_file = False |
|
420 file_str = l |
|
421 elif l.find('with fuzz') >= 0: |
|
422 if not printed_file: |
|
423 self.ui.warn(file_str + '\n') |
|
424 printed_file = True |
|
425 self.ui.warn(l + '\n') |
|
426 fuzz = True |
|
427 elif l.find('saving rejects to file') >= 0: |
|
428 self.ui.warn(l + '\n') |
|
429 elif l.find('FAILED') >= 0: |
|
430 if not printed_file: |
|
431 self.ui.warn(file_str + '\n') |
|
432 printed_file = True |
|
433 self.ui.warn(l + '\n') |
|
434 |
|
435 return (not f.close(), files, fuzz) |
|
436 |
412 |
437 def apply(self, repo, series, list=False, update_status=True, |
413 def apply(self, repo, series, list=False, update_status=True, |
438 strict=False, patchdir=None, merge=None, wlock=None): |
414 strict=False, patchdir=None, merge=None, wlock=None): |
439 # TODO unify with commands.py |
415 # TODO unify with commands.py |
440 if not patchdir: |
416 if not patchdir: |