comparison hgext/mq.py @ 2920:ef8ee4477019

merge with mpm.
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Wed, 16 Aug 2006 10:46:24 -0700
parents b70740aefa4d 3848488244fc
children 773c5b82d052
comparison
equal deleted inserted replaced
2907:b70740aefa4d 2920:ef8ee4477019
75 lines = self.opener(self.status_path).read().splitlines() 75 lines = self.opener(self.status_path).read().splitlines()
76 self.applied = [statusentry(l) for l in lines] 76 self.applied = [statusentry(l) for l in lines]
77 77
78 def diffopts(self): 78 def diffopts(self):
79 if self._diffopts is None: 79 if self._diffopts is None:
80 self._diffopts = self.ui.diffopts() 80 self._diffopts = patch.diffopts(self.ui)
81 return self._diffopts 81 return self._diffopts
82 82
83 def join(self, *p): 83 def join(self, *p):
84 return os.path.join(self.path, *p) 84 return os.path.join(self.path, *p)
85 85
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 (files, fuzz) = patch.patch(patchfile, self.ui, strip=1, 403 pp = util.find_in_path('gpatch', os.environ.get('PATH', ''), 'patch')
404 cwd=repo.root) 404 f = os.popen("%s -d %s -p1 --no-backup-if-mismatch < %s" %
405 except Exception, inst: 405 (pp, util.shellquote(repo.root), util.shellquote(patchfile)))
406 self.ui.note(str(inst) + '\n') 406 except:
407 if not self.ui.verbose: 407 self.ui.warn("patch failed, unable to continue (try -v)\n")
408 self.ui.warn("patch failed, unable to continue (try -v)\n") 408 return (None, [], False)
409 return (False, [], False) 409 files = []
410 410 fuzz = False
411 return (True, files.keys(), fuzz) 411 for l in f:
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)
412 436
413 def apply(self, repo, series, list=False, update_status=True, 437 def apply(self, repo, series, list=False, update_status=True,
414 strict=False, patchdir=None, merge=None, wlock=None): 438 strict=False, patchdir=None, merge=None, wlock=None):
415 # TODO unify with commands.py 439 # TODO unify with commands.py
416 if not patchdir: 440 if not patchdir:
480 err = 1 504 err = 1
481 break 505 break
482 tr.close() 506 tr.close()
483 return (err, n) 507 return (err, n)
484 508
485 def delete(self, repo, patches, keep=False): 509 def delete(self, repo, patch, force=False):
486 realpatches = [] 510 patch = self.lookup(patch, strict=True)
487 for patch in patches: 511 info = self.isapplied(patch)
488 patch = self.lookup(patch, strict=True) 512 if info:
489 info = self.isapplied(patch) 513 raise util.Abort(_("cannot delete applied patch %s") % patch)
490 if info: 514 if patch not in self.series:
491 raise util.Abort(_("cannot delete applied patch %s") % patch) 515 raise util.Abort(_("patch %s not in series file") % patch)
492 if patch not in self.series: 516 if force:
493 raise util.Abort(_("patch %s not in series file") % patch)
494 realpatches.append(patch)
495
496 if not keep:
497 r = self.qrepo() 517 r = self.qrepo()
498 if r: 518 if r:
499 r.remove(realpatches, True) 519 r.remove([patch], True)
500 else: 520 else:
501 os.unlink(self.join(patch)) 521 os.unlink(self.join(patch))
502 522 i = self.find_series(patch)
503 indices = [self.find_series(p) for p in realpatches] 523 del self.full_series[i]
504 indices.sort()
505 for i in indices[-1::-1]:
506 del self.full_series[i]
507 self.parse_series() 524 self.parse_series()
508 self.series_dirty = 1 525 self.series_dirty = 1
509 526
510 def check_toppatch(self, repo): 527 def check_toppatch(self, repo):
511 if len(self.applied) > 0: 528 if len(self.applied) > 0:
1281 self.series_dirty = 1 1298 self.series_dirty = 1
1282 qrepo = self.qrepo() 1299 qrepo = self.qrepo()
1283 if qrepo: 1300 if qrepo:
1284 qrepo.add(added) 1301 qrepo.add(added)
1285 1302
1286 def delete(ui, repo, patch, *patches, **opts): 1303 def delete(ui, repo, patch, **opts):
1287 """remove patches from queue 1304 """remove a patch from the series file
1288 1305
1289 The patches must not be applied. 1306 The patch must not be applied.
1290 With -k, the patch files are preserved in the patch directory.""" 1307 With -f, deletes the patch file as well as the series entry."""
1291 q = repo.mq 1308 q = repo.mq
1292 q.delete(repo, (patch,) + patches, keep=opts.get('keep')) 1309 q.delete(repo, patch, force=opts.get('force'))
1293 q.save_dirty() 1310 q.save_dirty()
1294 return 0 1311 return 0
1295 1312
1296 def applied(ui, repo, patch=None, **opts): 1313 def applied(ui, repo, patch=None, **opts):
1297 """print the patches already applied""" 1314 """print the patches already applied"""
1445 1462
1446 Patches must not yet be applied. Each patch will be successively 1463 Patches must not yet be applied. Each patch will be successively
1447 applied to the current patch in the order given. If all the 1464 applied to the current patch in the order given. If all the
1448 patches apply successfully, the current patch will be refreshed 1465 patches apply successfully, the current patch will be refreshed
1449 with the new cumulative patch, and the folded patches will 1466 with the new cumulative patch, and the folded patches will
1450 be deleted. With -k/--keep, the folded patch files will not 1467 be deleted. With -f/--force, the folded patch files will
1451 be removed afterwards. 1468 be removed afterwards.
1452 1469
1453 The header for each folded patch will be concatenated with 1470 The header for each folded patch will be concatenated with
1454 the current patch header, separated by a line of '* * *'.""" 1471 the current patch header, separated by a line of '* * *'."""
1455 1472
1495 message = ui.edit(message, user or ui.username()) 1512 message = ui.edit(message, user or ui.username())
1496 1513
1497 q.refresh(repo, msg=message) 1514 q.refresh(repo, msg=message)
1498 1515
1499 for patch in patches: 1516 for patch in patches:
1500 q.delete(repo, patch, keep=opts['keep']) 1517 q.delete(repo, patch, force=opts['force'])
1501 1518
1502 q.save_dirty() 1519 q.save_dirty()
1503 1520
1504 def guard(ui, repo, *args, **opts): 1521 def guard(ui, repo, *args, **opts):
1505 '''set or print guards for a patch 1522 '''set or print guards for a patch
1884 "qcommit|qci": 1901 "qcommit|qci":
1885 (commit, 1902 (commit,
1886 commands.table["^commit|ci"][1], 1903 commands.table["^commit|ci"][1],
1887 'hg qcommit [OPTION]... [FILE]...'), 1904 'hg qcommit [OPTION]... [FILE]...'),
1888 "^qdiff": (diff, [], 'hg qdiff [FILE]...'), 1905 "^qdiff": (diff, [], 'hg qdiff [FILE]...'),
1889 "qdelete|qremove|qrm": 1906 "qdelete":
1890 (delete, 1907 (delete,
1891 [('k', 'keep', None, _('keep patch file'))], 1908 [('f', 'force', None, _('delete patch file'))],
1892 'hg qdelete [-k] PATCH'), 1909 'hg qdelete [-f] PATCH'),
1893 'qfold': 1910 'qfold':
1894 (fold, 1911 (fold,
1895 [('e', 'edit', None, _('edit patch header')), 1912 [('e', 'edit', None, _('edit patch header')),
1896 ('k', 'keep', None, _('keep folded patch files')), 1913 ('f', 'force', None, _('delete folded patch files')),
1897 ('m', 'message', '', _('set patch header to <text>')), 1914 ('m', 'message', '', _('set patch header to <text>')),
1898 ('l', 'logfile', '', _('set patch header to contents of <file>'))], 1915 ('l', 'logfile', '', _('set patch header to contents of <file>'))],
1899 'hg qfold [-e] [-m <text>] [-l <file] PATCH...'), 1916 'hg qfold [-e] [-m <text>] [-l <file] PATCH...'),
1900 'qguard': (guard, [('l', 'list', None, _('list all patches and guards')), 1917 'qguard': (guard, [('l', 'list', None, _('list all patches and guards')),
1901 ('n', 'none', None, _('drop all guards'))], 1918 ('n', 'none', None, _('drop all guards'))],