hgext/mq.py
changeset 4418 0532491f7476
parent 4408 f700ea2b0689
child 4430 94cb7561337d
equal deleted inserted replaced
4416:bb1800a7d7e1 4418:0532491f7476
   419             return (False, files, False)
   419             return (False, files, False)
   420 
   420 
   421         return (True, files, fuzz)
   421         return (True, files, fuzz)
   422 
   422 
   423     def apply(self, repo, series, list=False, update_status=True,
   423     def apply(self, repo, series, list=False, update_status=True,
   424               strict=False, patchdir=None, merge=None, wlock=None):
   424               strict=False, patchdir=None, merge=None, wlock=None,
       
   425               all_files={}):
       
   426         tr = repo.transaction()
       
   427         try:
       
   428             ret = self._apply(tr, repo, series, list, update_status,
       
   429                               strict, patchdir, merge, wlock,
       
   430                               all_files=all_files)
       
   431             tr.close()
       
   432             self.save_dirty()
       
   433             return ret
       
   434         except:
       
   435             try:
       
   436                 tr.abort()
       
   437             finally:
       
   438                 repo.reload()
       
   439                 repo.wreload()
       
   440             raise
       
   441 
       
   442     def _apply(self, tr, repo, series, list=False, update_status=True,
       
   443                strict=False, patchdir=None, merge=None, wlock=None,
       
   444                all_files={}):
   425         # TODO unify with commands.py
   445         # TODO unify with commands.py
   426         if not patchdir:
   446         if not patchdir:
   427             patchdir = self.path
   447             patchdir = self.path
   428         err = 0
   448         err = 0
   429         if not wlock:
   449         if not wlock:
   430             wlock = repo.wlock()
   450             wlock = repo.wlock()
   431         lock = repo.lock()
   451         lock = repo.lock()
   432         tr = repo.transaction()
       
   433         n = None
   452         n = None
   434         for patchname in series:
   453         for patchname in series:
   435             pushable, reason = self.pushable(patchname)
   454             pushable, reason = self.pushable(patchname)
   436             if not pushable:
   455             if not pushable:
   437                 self.explain_pushable(patchname, all_patches=True)
   456                 self.explain_pushable(patchname, all_patches=True)
   452                 if list:
   471                 if list:
   453                     message.append("\nimported patch %s" % patchname)
   472                     message.append("\nimported patch %s" % patchname)
   454                 message = '\n'.join(message)
   473                 message = '\n'.join(message)
   455 
   474 
   456             (patcherr, files, fuzz) = self.patch(repo, pf)
   475             (patcherr, files, fuzz) = self.patch(repo, pf)
       
   476             all_files.update(files)
   457             patcherr = not patcherr
   477             patcherr = not patcherr
   458 
   478 
   459             if merge and files:
   479             if merge and files:
   460                 # Mark as removed/merged and update dirstate parent info
   480                 # Mark as removed/merged and update dirstate parent info
   461                 removed = []
   481                 removed = []
   490 
   510 
   491             if fuzz and strict:
   511             if fuzz and strict:
   492                 self.ui.warn("fuzz found when applying patch, stopping\n")
   512                 self.ui.warn("fuzz found when applying patch, stopping\n")
   493                 err = 1
   513                 err = 1
   494                 break
   514                 break
   495         tr.close()
       
   496         return (err, n)
   515         return (err, n)
   497 
   516 
   498     def delete(self, repo, patches, opts):
   517     def delete(self, repo, patches, opts):
   499         realpatches = []
   518         realpatches = []
   500         for patch in patches:
   519         for patch in patches:
   825             patch = self.series[start]
   844             patch = self.series[start]
   826             end = start + 1
   845             end = start + 1
   827         else:
   846         else:
   828             end = self.series.index(patch, start) + 1
   847             end = self.series.index(patch, start) + 1
   829         s = self.series[start:end]
   848         s = self.series[start:end]
   830         if mergeq:
   849         all_files = {}
   831             ret = self.mergepatch(repo, mergeq, s, wlock)
   850         try:
   832         else:
   851             if mergeq:
   833             ret = self.apply(repo, s, list, wlock=wlock)
   852                 ret = self.mergepatch(repo, mergeq, s, wlock)
       
   853             else:
       
   854                 ret = self.apply(repo, s, list, wlock=wlock,
       
   855                                  all_files=all_files)
       
   856         except:
       
   857             self.ui.warn(_('cleaning up working directory...'))
       
   858             node = repo.dirstate.parents()[0]
       
   859             hg.revert(repo, node, None, wlock)
       
   860             unknown = repo.status(wlock=wlock)[4]
       
   861             # only remove unknown files that we know we touched or
       
   862             # created while patching
       
   863             for f in unknown:
       
   864                 if f in all_files:
       
   865                     util.unlink(repo.wjoin(f))
       
   866             self.ui.warn(_('done\n'))
       
   867             raise
   834         top = self.applied[-1].name
   868         top = self.applied[-1].name
   835         if ret[0]:
   869         if ret[0]:
   836             self.ui.write("Errors during apply, please fix and refresh %s\n" %
   870             self.ui.write("Errors during apply, please fix and refresh %s\n" %
   837                           top)
   871                           top)
   838         else:
   872         else:
  1789             return 1
  1823             return 1
  1790         mergeq = queue(ui, repo.join(""), newpath)
  1824         mergeq = queue(ui, repo.join(""), newpath)
  1791         ui.warn("merging with queue at: %s\n" % mergeq.path)
  1825         ui.warn("merging with queue at: %s\n" % mergeq.path)
  1792     ret = q.push(repo, patch, force=opts['force'], list=opts['list'],
  1826     ret = q.push(repo, patch, force=opts['force'], list=opts['list'],
  1793                  mergeq=mergeq)
  1827                  mergeq=mergeq)
  1794     q.save_dirty()
       
  1795     return ret
  1828     return ret
  1796 
  1829 
  1797 def pop(ui, repo, patch=None, **opts):
  1830 def pop(ui, repo, patch=None, **opts):
  1798     """pop the current patch off the stack"""
  1831     """pop the current patch off the stack"""
  1799     localupdate = True
  1832     localupdate = True