bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 1704.2.25
by Martin Pool Remove obsolete shebang line; add copyright | 1 | # Copyright (C) 2006 Canonical Ltd
 | 
| 2 | #
 | |
| 3 | # This program is free software; you can redistribute it and/or modify
 | |
| 4 | # it under the terms of the GNU General Public License as published by
 | |
| 5 | # the Free Software Foundation; either version 2 of the License, or
 | |
| 6 | # (at your option) any later version.
 | |
| 7 | #
 | |
| 8 | # This program is distributed in the hope that it will be useful,
 | |
| 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| 11 | # GNU General Public License for more details.
 | |
| 12 | #
 | |
| 13 | # You should have received a copy of the GNU General Public License
 | |
| 14 | # along with this program; if not, write to the Free Software
 | |
| 15 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | |
| 16 | ||
| 2246.1.3
by Robert Collins New branch hooks: post_push, post_pull, post_commit, post_uncommit. These | 17 | """Remove the last revision from the history of the current branch."""
 | 
| 18 | ||
| 19 | # TODO: make the guts of this methods on tree, branch.
 | |
| 0.3.1
by John Arbash Meinel Creating a plugin for uncommitting the last revision. | 20 | |
| 21 | import os | |
| 1956.1.1
by John Arbash Meinel Fix bug #57660: 'bzr uncommit' should preserve pending merges | 22 | |
| 2246.1.3
by Robert Collins New branch hooks: post_push, post_pull, post_commit, post_uncommit. These | 23 | from bzrlib.branch import Branch | 
| 1558.9.1
by Aaron Bentley Fix uncommit to handle bound branches, and to do locking | 24 | from bzrlib.errors import BoundBranchOutOfDate | 
| 0.3.1
by John Arbash Meinel Creating a plugin for uncommitting the last revision. | 25 | |
| 26 | ||
| 1558.1.12
by Aaron Bentley Got uncommit working properly with checkouts | 27 | def uncommit(branch, dry_run=False, verbose=False, revno=None, tree=None): | 
| 0.3.1
by John Arbash Meinel Creating a plugin for uncommitting the last revision. | 28 | """Remove the last revision from the supplied branch. | 
| 29 | ||
| 1185.62.10
by John Arbash Meinel Removed --all from bzr uncommit, it was broken anyway. | 30 |     :param dry_run: Don't actually change anything
 | 
| 31 |     :param verbose: Print each step as you do it
 | |
| 32 |     :param revno: Remove back to this revision
 | |
| 0.3.1
by John Arbash Meinel Creating a plugin for uncommitting the last revision. | 33 |     """
 | 
| 1558.9.1
by Aaron Bentley Fix uncommit to handle bound branches, and to do locking | 34 | unlockable = [] | 
| 35 | try: | |
| 1558.1.12
by Aaron Bentley Got uncommit working properly with checkouts | 36 | if tree is not None: | 
| 1558.9.1
by Aaron Bentley Fix uncommit to handle bound branches, and to do locking | 37 | tree.lock_write() | 
| 38 | unlockable.append(tree) | |
| 39 | ||
| 40 | branch.lock_write() | |
| 41 | unlockable.append(branch) | |
| 42 | ||
| 1850.3.5
by John Arbash Meinel Fix bug 31426, have uncommit keep track of pending merges. | 43 | pending_merges = [] | 
| 1956.1.1
by John Arbash Meinel Fix bug #57660: 'bzr uncommit' should preserve pending merges | 44 | if tree is not None: | 
| 1908.7.7
by Robert Collins Deprecated WorkingTree.pending_merges. | 45 | pending_merges = tree.get_parent_ids()[1:] | 
| 1850.3.5
by John Arbash Meinel Fix bug 31426, have uncommit keep track of pending merges. | 46 | |
| 1558.9.1
by Aaron Bentley Fix uncommit to handle bound branches, and to do locking | 47 | master = branch.get_master_branch() | 
| 48 | if master is not None: | |
| 49 | master.lock_write() | |
| 50 | unlockable.append(master) | |
| 51 | rh = branch.revision_history() | |
| 52 | if master is not None and rh[-1] != master.last_revision(): | |
| 53 | raise BoundBranchOutOfDate(branch, master) | |
| 54 | if revno is None: | |
| 55 | revno = len(rh) | |
| 2246.1.3
by Robert Collins New branch hooks: post_push, post_pull, post_commit, post_uncommit. These | 56 | old_revno, old_tip = branch.last_revision_info() | 
| 57 | new_revno = revno -1 | |
| 1558.9.1
by Aaron Bentley Fix uncommit to handle bound branches, and to do locking | 58 | |
| 59 | files_to_remove = [] | |
| 60 | for r in range(revno-1, len(rh)): | |
| 61 | rev_id = rh.pop() | |
| 2246.1.3
by Robert Collins New branch hooks: post_push, post_pull, post_commit, post_uncommit. These | 62 |             # NB: performance would be better using the revision graph rather
 | 
| 63 |             # than the whole revision.
 | |
| 1850.3.5
by John Arbash Meinel Fix bug 31426, have uncommit keep track of pending merges. | 64 | rev = branch.repository.get_revision(rev_id) | 
| 65 |             # When we finish popping off the pending merges, we want
 | |
| 66 |             # them to stay in the order that they used to be.
 | |
| 67 |             # but we pop from the end, so reverse the order, and
 | |
| 68 |             # then get the order right at the end
 | |
| 69 | pending_merges.extend(reversed(rev.parent_ids[1:])) | |
| 1558.9.1
by Aaron Bentley Fix uncommit to handle bound branches, and to do locking | 70 | if verbose: | 
| 71 | print 'Removing revno %d: %s' % (len(rh)+1, rev_id) | |
| 72 | ||
| 73 |         # Committing before we start removing files, because
 | |
| 74 |         # once we have removed at least one, all the rest are invalid.
 | |
| 75 | if not dry_run: | |
| 76 | if master is not None: | |
| 77 | master.set_revision_history(rh) | |
| 78 | branch.set_revision_history(rh) | |
| 2246.1.3
by Robert Collins New branch hooks: post_push, post_pull, post_commit, post_uncommit. These | 79 | new_tip = branch.last_revision() | 
| 80 | if master is None: | |
| 81 | hook_local = None | |
| 82 | hook_master = branch | |
| 83 | else: | |
| 84 | hook_local = branch | |
| 85 | hook_master = master | |
| 86 | for hook in Branch.hooks['post_uncommit']: | |
| 87 | hook(hook_local, hook_master, old_revno, old_tip, new_revno, | |
| 88 | new_tip) | |
| 1558.9.1
by Aaron Bentley Fix uncommit to handle bound branches, and to do locking | 89 | if tree is not None: | 
| 2246.1.3
by Robert Collins New branch hooks: post_push, post_pull, post_commit, post_uncommit. These | 90 | if new_tip is not None: | 
| 91 | parents = [new_tip] | |
| 1908.6.1
by Robert Collins Change all callers of set_last_revision to use set_parent_trees. | 92 | else: | 
| 93 | parents = [] | |
| 94 | parents.extend(reversed(pending_merges)) | |
| 1908.6.3
by Robert Collins Tidy up the last_revision_id and add_pending_merge conversion to use cleaner apis. | 95 | tree.set_parent_ids(parents) | 
| 1558.9.1
by Aaron Bentley Fix uncommit to handle bound branches, and to do locking | 96 | finally: | 
| 97 | for item in reversed(unlockable): | |
| 98 | item.unlock() |