mercurial/localrepo.py
changeset 50069 81870c92c293
parent 50059 3236643066c4
child 50070 c8f32aa80dca
equal deleted inserted replaced
50068:b35fb0e5b8d6 50069:81870c92c293
  2707             release(dsguard, lock, wlock)
  2707             release(dsguard, lock, wlock)
  2708 
  2708 
  2709     @unfilteredmethod  # Until we get smarter cache management
  2709     @unfilteredmethod  # Until we get smarter cache management
  2710     def _rollback(self, dryrun, force, dsguard):
  2710     def _rollback(self, dryrun, force, dsguard):
  2711         ui = self.ui
  2711         ui = self.ui
       
  2712 
       
  2713         parents = self.dirstate.parents()
  2712         try:
  2714         try:
  2713             args = self.vfs.read(b'undo.desc').splitlines()
  2715             args = self.vfs.read(b'undo.desc').splitlines()
  2714             (oldlen, desc, detail) = (int(args[0]), args[1], None)
  2716             (oldlen, desc, detail) = (int(args[0]), args[1], None)
  2715             if len(args) >= 3:
  2717             if len(args) >= 3:
  2716                 detail = args[2]
  2718                 detail = args[2]
  2723                 ) % (oldtip, desc, detail)
  2725                 ) % (oldtip, desc, detail)
  2724             else:
  2726             else:
  2725                 msg = _(
  2727                 msg = _(
  2726                     b'repository tip rolled back to revision %d (undo %s)\n'
  2728                     b'repository tip rolled back to revision %d (undo %s)\n'
  2727                 ) % (oldtip, desc)
  2729                 ) % (oldtip, desc)
       
  2730             parentgone = any(self[p].rev() > oldtip for p in parents)
  2728         except IOError:
  2731         except IOError:
  2729             msg = _(b'rolling back unknown transaction\n')
  2732             msg = _(b'rolling back unknown transaction\n')
  2730             desc = None
  2733             desc = None
       
  2734             parentgone = True
  2731 
  2735 
  2732         if not force and self[b'.'] != self[b'tip'] and desc == b'commit':
  2736         if not force and self[b'.'] != self[b'tip'] and desc == b'commit':
  2733             raise error.Abort(
  2737             raise error.Abort(
  2734                 _(
  2738                 _(
  2735                     b'rollback of last commit while not checked out '
  2739                     b'rollback of last commit while not checked out '
  2740 
  2744 
  2741         ui.status(msg)
  2745         ui.status(msg)
  2742         if dryrun:
  2746         if dryrun:
  2743             return 0
  2747             return 0
  2744 
  2748 
  2745         parents = self.dirstate.parents()
       
  2746         self.destroying()
  2749         self.destroying()
  2747         vfsmap = {b'plain': self.vfs, b'': self.svfs}
  2750         vfsmap = {b'plain': self.vfs, b'': self.svfs}
  2748         transaction.rollback(
  2751         transaction.rollback(
  2749             self.svfs, vfsmap, b'undo', ui.warn, checkambigfiles=_cachedfiles
  2752             self.svfs, vfsmap, b'undo', ui.warn, checkambigfiles=_cachedfiles
  2750         )
  2753         )
  2755             )
  2758             )
  2756         if self.svfs.exists(b'undo.phaseroots'):
  2759         if self.svfs.exists(b'undo.phaseroots'):
  2757             self.svfs.rename(b'undo.phaseroots', b'phaseroots', checkambig=True)
  2760             self.svfs.rename(b'undo.phaseroots', b'phaseroots', checkambig=True)
  2758         self.invalidate()
  2761         self.invalidate()
  2759 
  2762 
  2760         has_node = self.changelog.index.has_node
       
  2761         parentgone = any(not has_node(p) for p in parents)
       
  2762         if parentgone:
  2763         if parentgone:
  2763             # prevent dirstateguard from overwriting already restored one
  2764             # prevent dirstateguard from overwriting already restored one
  2764             dsguard.close()
  2765             dsguard.close()
  2765 
  2766 
  2766             narrowspec.restorebackup(self, b'undo.narrowspec')
  2767             narrowspec.restorebackup(self, b'undo.narrowspec')