hgext/mq.py
changeset 6645 37eedb1a1848
parent 6644 8c01ce1f2530
child 6650 2c9565971abc
equal deleted inserted replaced
6644:8c01ce1f2530 6645:37eedb1a1848
   533                 self.ui.warn("fuzz found when applying patch, stopping\n")
   533                 self.ui.warn("fuzz found when applying patch, stopping\n")
   534                 err = 1
   534                 err = 1
   535                 break
   535                 break
   536         return (err, n)
   536         return (err, n)
   537 
   537 
       
   538     def _clean_series(self, patches):
       
   539         indices = [self.find_series(p) for p in patches]
       
   540         indices.sort()
       
   541         for i in indices[-1::-1]:
       
   542             del self.full_series[i]
       
   543         self.parse_series()
       
   544         self.series_dirty = 1
       
   545 
       
   546     def finish(self, repo, revs):
       
   547         revs.sort()
       
   548         firstrev = repo.changelog.rev(revlog.bin(self.applied[0].rev))
       
   549         appliedbase = 0
       
   550         patches = []
       
   551         for rev in revs:
       
   552             if rev < firstrev:
       
   553                 raise util.Abort(_('revision %d is not managed') % rev)
       
   554             base = revlog.bin(self.applied[appliedbase].rev)
       
   555             node = repo.changelog.node(rev)
       
   556             if node != base:
       
   557                 raise util.Abort(_('cannot delete revision %d above '
       
   558                                    'applied patches') % rev)
       
   559             patches.append(self.applied[appliedbase].name)
       
   560             appliedbase += 1
       
   561 
       
   562         r = self.qrepo()
       
   563         if r:
       
   564             r.remove(patches, True)
       
   565         else:
       
   566             for p in patches:
       
   567                 os.unlink(self.join(p))
       
   568 
       
   569         del self.applied[:appliedbase]
       
   570         self.applied_dirty = 1
       
   571         self._clean_series(patches)
       
   572 
   538     def delete(self, repo, patches, opts):
   573     def delete(self, repo, patches, opts):
   539         if not patches and not opts.get('rev'):
   574         if not patches and not opts.get('rev'):
   540             raise util.Abort(_('qdelete requires at least one revision or '
   575             raise util.Abort(_('qdelete requires at least one revision or '
   541                                'patch name'))
   576                                'patch name'))
   542 
   577 
   578                     os.unlink(self.join(p))
   613                     os.unlink(self.join(p))
   579 
   614 
   580         if appliedbase:
   615         if appliedbase:
   581             del self.applied[:appliedbase]
   616             del self.applied[:appliedbase]
   582             self.applied_dirty = 1
   617             self.applied_dirty = 1
   583         indices = [self.find_series(p) for p in realpatches]
   618         self._clean_series(realpatches)
   584         indices.sort()
       
   585         for i in indices[-1::-1]:
       
   586             del self.full_series[i]
       
   587         self.parse_series()
       
   588         self.series_dirty = 1
       
   589 
   619 
   590     def check_toppatch(self, repo):
   620     def check_toppatch(self, repo):
   591         if len(self.applied) > 0:
   621         if len(self.applied) > 0:
   592             top = revlog.bin(self.applied[-1].rev)
   622             top = revlog.bin(self.applied[-1].rev)
   593             pp = repo.dirstate.parents()
   623             pp = repo.dirstate.parents()
  1495 
  1525 
  1496     The patches must not be applied, unless they are arguments to
  1526     The patches must not be applied, unless they are arguments to
  1497     the --rev parameter. At least one patch or revision is required.
  1527     the --rev parameter. At least one patch or revision is required.
  1498 
  1528 
  1499     With --rev, mq will stop managing the named revisions (converting
  1529     With --rev, mq will stop managing the named revisions (converting
  1500     them to regular mercurial changesets). The patches must be applied
  1530     them to regular mercurial changesets). The qfinish command should be
  1501     and at the base of the stack. This option is useful when the patches
  1531     used as an alternative for qdel -r, as the latter option is deprecated.
  1502     have been applied upstream.
       
  1503 
  1532 
  1504     With --keep, the patch files are preserved in the patch directory."""
  1533     With --keep, the patch files are preserved in the patch directory."""
  1505     q = repo.mq
  1534     q = repo.mq
  1506     q.delete(repo, patches, opts)
  1535     q.delete(repo, patches, opts)
  1507     q.save_dirty()
  1536     q.save_dirty()
  2182             if reapply:
  2211             if reapply:
  2183                 ui.status(_('reapplying unguarded patches\n'))
  2212                 ui.status(_('reapplying unguarded patches\n'))
  2184                 q.push(repo, reapply)
  2213                 q.push(repo, reapply)
  2185         finally:
  2214         finally:
  2186             q.save_dirty()
  2215             q.save_dirty()
       
  2216 
       
  2217 def finish(ui, repo, *revrange, **opts):
       
  2218     """move applied patches into repository history
       
  2219 
       
  2220     Finishes the specified revisions (corresponding to applied patches) by
       
  2221     moving them out of mq control into regular repository history.
       
  2222 
       
  2223     Accepts a revision range or the --all option. If --all is specified, all
       
  2224     applied mq revisions are removed from mq control. Otherwise, the given
       
  2225     revisions must be at the base of the stack of applied patches.
       
  2226 
       
  2227     This can be especially useful if your changes have been applied to an
       
  2228     upstream repository, or if you are about to push your changes to upstream.
       
  2229     """
       
  2230     if not opts['applied'] and not revrange:
       
  2231         raise util.Abort(_('no revisions specified'))
       
  2232     elif opts['applied']:
       
  2233         revrange = ('qbase:qtip',) + revrange
       
  2234 
       
  2235     q = repo.mq
       
  2236     if not q.applied:
       
  2237         ui.status(_('no patches applied\n'))
       
  2238         return 0
       
  2239 
       
  2240     revs = cmdutil.revrange(repo, revrange)
       
  2241     q.finish(repo, revs)
       
  2242     q.save_dirty()
       
  2243     return 0
  2187 
  2244 
  2188 def reposetup(ui, repo):
  2245 def reposetup(ui, repo):
  2189     class mqrepo(repo.__class__):
  2246     class mqrepo(repo.__class__):
  2190         def abort_if_wdir_patched(self, errmsg, force=False):
  2247         def abort_if_wdir_patched(self, errmsg, force=False):
  2191             if self.mq.applied and not force:
  2248             if self.mq.applied and not force:
  2393           ('b', 'backup', None, _('bundle unrelated changesets')),
  2450           ('b', 'backup', None, _('bundle unrelated changesets')),
  2394           ('n', 'nobackup', None, _('no backups'))],
  2451           ('n', 'nobackup', None, _('no backups'))],
  2395          _('hg strip [-f] [-b] [-n] REV')),
  2452          _('hg strip [-f] [-b] [-n] REV')),
  2396     "qtop": (top, [] + seriesopts, _('hg qtop [-s]')),
  2453     "qtop": (top, [] + seriesopts, _('hg qtop [-s]')),
  2397     "qunapplied": (unapplied, [] + seriesopts, _('hg qunapplied [-s] [PATCH]')),
  2454     "qunapplied": (unapplied, [] + seriesopts, _('hg qunapplied [-s] [PATCH]')),
       
  2455     "qfinish":
       
  2456         (finish,
       
  2457          [('a', 'applied', None, _('finish all applied changesets'))],
       
  2458          _('hg qfinish [-a] [REV...]')),
  2398 }
  2459 }