equal
deleted
inserted
replaced
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') |