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 | ||
| 17 | """Remove the last revision from the history of the current branch.
 | |
| 0.3.1
by John Arbash Meinel Creating a plugin for uncommitting the last revision. | 18 | """
 | 
| 19 | ||
| 20 | import os | |
| 1558.9.1
by Aaron Bentley Fix uncommit to handle bound branches, and to do locking | 21 | from bzrlib.errors import BoundBranchOutOfDate | 
| 0.3.1
by John Arbash Meinel Creating a plugin for uncommitting the last revision. | 22 | |
| 23 | def test_remove(filename): | |
| 24 | if os.path.exists(filename): | |
| 25 | os.remove(filename) | |
| 26 | else: | |
| 27 | print '* file does not exist: %r' % filename | |
| 28 | ||
| 29 | ||
| 1558.1.12
by Aaron Bentley Got uncommit working properly with checkouts | 30 | 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. | 31 | """Remove the last revision from the supplied branch. | 
| 32 | ||
| 1185.62.10
by John Arbash Meinel Removed --all from bzr uncommit, it was broken anyway. | 33 |     :param dry_run: Don't actually change anything
 | 
| 34 |     :param verbose: Print each step as you do it
 | |
| 35 |     :param revno: Remove back to this revision
 | |
| 0.3.1
by John Arbash Meinel Creating a plugin for uncommitting the last revision. | 36 |     """
 | 
| 1558.9.1
by Aaron Bentley Fix uncommit to handle bound branches, and to do locking | 37 | unlockable = [] | 
| 38 | try: | |
| 1558.1.12
by Aaron Bentley Got uncommit working properly with checkouts | 39 | if tree is not None: | 
| 1558.9.1
by Aaron Bentley Fix uncommit to handle bound branches, and to do locking | 40 | tree.lock_write() | 
| 41 | unlockable.append(tree) | |
| 42 | ||
| 43 | branch.lock_write() | |
| 44 | unlockable.append(branch) | |
| 45 | ||
| 1850.3.5
by John Arbash Meinel Fix bug 31426, have uncommit keep track of pending merges. | 46 | pending_merges = [] | 
| 47 | ||
| 1558.9.1
by Aaron Bentley Fix uncommit to handle bound branches, and to do locking | 48 | master = branch.get_master_branch() | 
| 49 | if master is not None: | |
| 50 | master.lock_write() | |
| 51 | unlockable.append(master) | |
| 52 | rh = branch.revision_history() | |
| 53 | if master is not None and rh[-1] != master.last_revision(): | |
| 54 | raise BoundBranchOutOfDate(branch, master) | |
| 55 | if revno is None: | |
| 56 | revno = len(rh) | |
| 57 | ||
| 58 | files_to_remove = [] | |
| 59 | for r in range(revno-1, len(rh)): | |
| 60 | rev_id = rh.pop() | |
| 1850.3.5
by John Arbash Meinel Fix bug 31426, have uncommit keep track of pending merges. | 61 | rev = branch.repository.get_revision(rev_id) | 
| 62 |             # When we finish popping off the pending merges, we want
 | |
| 63 |             # them to stay in the order that they used to be.
 | |
| 64 |             # but we pop from the end, so reverse the order, and
 | |
| 65 |             # then get the order right at the end
 | |
| 66 | pending_merges.extend(reversed(rev.parent_ids[1:])) | |
| 1558.9.1
by Aaron Bentley Fix uncommit to handle bound branches, and to do locking | 67 | if verbose: | 
| 68 | print 'Removing revno %d: %s' % (len(rh)+1, rev_id) | |
| 69 | ||
| 70 | ||
| 71 |         # Committing before we start removing files, because
 | |
| 72 |         # once we have removed at least one, all the rest are invalid.
 | |
| 73 | if not dry_run: | |
| 74 | if master is not None: | |
| 75 | master.set_revision_history(rh) | |
| 76 | branch.set_revision_history(rh) | |
| 77 | if tree is not None: | |
| 78 | tree.set_last_revision(branch.last_revision()) | |
| 1850.3.5
by John Arbash Meinel Fix bug 31426, have uncommit keep track of pending merges. | 79 | pending_merges.reverse() | 
| 80 | tree.set_pending_merges(pending_merges) | |
| 1558.9.1
by Aaron Bentley Fix uncommit to handle bound branches, and to do locking | 81 | finally: | 
| 82 | for item in reversed(unlockable): | |
| 83 | item.unlock() |