0.3.1
by John Arbash Meinel
Creating a plugin for uncommitting the last revision. |
1 |
#!/usr/bin/env python
|
2 |
"""\
|
|
3 |
Remove the last revision from the history of the current branch.
|
|
4 |
"""
|
|
5 |
||
6 |
import os |
|
7 |
import bzrlib |
|
8 |
||
9 |
def test_remove(filename): |
|
10 |
if os.path.exists(filename): |
|
11 |
os.remove(filename) |
|
12 |
else: |
|
13 |
print '* file does not exist: %r' % filename |
|
14 |
||
15 |
||
16 |
def uncommit(branch, remove_files=False, |
|
0.3.6
by John Arbash Meinel
Adding ability to revert back to earlier revisions. |
17 |
dry_run=False, verbose=False, revno=None): |
0.3.1
by John Arbash Meinel
Creating a plugin for uncommitting the last revision. |
18 |
"""Remove the last revision from the supplied branch.
|
19 |
||
20 |
:param remove_files: If True, remove files from the stores
|
|
21 |
as well.
|
|
0.3.11
by John Arbash Meinel
Updated to latest bzr.dev code, and added tests. |
22 |
:param force: Don't ask any questions
|
0.3.1
by John Arbash Meinel
Creating a plugin for uncommitting the last revision. |
23 |
"""
|
24 |
from bzrlib.atomicfile import AtomicFile |
|
25 |
rh = branch.revision_history() |
|
0.3.6
by John Arbash Meinel
Adding ability to revert back to earlier revisions. |
26 |
if revno is None: |
27 |
revno = len(rh) |
|
0.3.1
by John Arbash Meinel
Creating a plugin for uncommitting the last revision. |
28 |
|
0.3.6
by John Arbash Meinel
Adding ability to revert back to earlier revisions. |
29 |
files_to_remove = [] |
0.3.1
by John Arbash Meinel
Creating a plugin for uncommitting the last revision. |
30 |
new_rev_history = AtomicFile(branch.controlfilename('revision-history')) |
0.3.6
by John Arbash Meinel
Adding ability to revert back to earlier revisions. |
31 |
for r in range(revno-1, len(rh)): |
32 |
rev_id = rh.pop() |
|
33 |
if verbose: |
|
34 |
print 'Removing revno %d: %s' % (len(rh)+1, rev_id) |
|
35 |
rev = branch.get_revision(rev_id) |
|
0.3.9
by John Arbash Meinel
Upgrading plugin for v5 |
36 |
inv = branch.get_revision_inventory(rev_id) |
0.3.6
by John Arbash Meinel
Adding ability to revert back to earlier revisions. |
37 |
inv_prev = [] |
0.3.9
by John Arbash Meinel
Upgrading plugin for v5 |
38 |
for p in rev.parent_ids: |
39 |
inv_prev.append(branch.get_revision_inventory(p)) |
|
0.3.6
by John Arbash Meinel
Adding ability to revert back to earlier revisions. |
40 |
|
41 |
if remove_files: |
|
42 |
# Figure out what text-store entries are new
|
|
43 |
||
44 |
# In the future, when we have text_version instead of
|
|
45 |
# text_id, we can just check to see if the text_version
|
|
46 |
# equals the current revision id.
|
|
47 |
for file_id in inv: |
|
48 |
ie = inv[file_id] |
|
49 |
if not hasattr(ie, 'text_id'): |
|
50 |
continue
|
|
51 |
for other_inv in inv_prev: |
|
52 |
if file_id in other_inv: |
|
53 |
other_ie = other_inv[file_id] |
|
54 |
if other_ie.text_id == ie.text_id: |
|
55 |
break
|
|
56 |
else: |
|
57 |
# None of the previous ancestors used
|
|
58 |
# the same inventory
|
|
59 |
files_to_remove.append(branch.controlfilename(['text-store', |
|
60 |
ie.text_id + '.gz'])) |
|
61 |
rev_file = branch.controlfilename(['revision-store', |
|
62 |
rev_id + '.gz']) |
|
63 |
files_to_remove.append(rev_file) |
|
64 |
inv_file = branch.controlfilename(['inventory-store', |
|
65 |
rev.inventory_id + '.gz']) |
|
66 |
files_to_remove.append(inv_file) |
|
67 |
||
0.3.7
by John Arbash Meinel
Made --dry-run print a better warning, so we don't scare people. |
68 |
if verbose and files_to_remove: |
0.3.6
by John Arbash Meinel
Adding ability to revert back to earlier revisions. |
69 |
print 'Removing files:' |
70 |
for f in files_to_remove: |
|
71 |
print '\t%s' % branch.relpath(f) |
|
72 |
||
0.3.1
by John Arbash Meinel
Creating a plugin for uncommitting the last revision. |
73 |
new_rev_history.write('\n'.join(rh)) |
0.3.6
by John Arbash Meinel
Adding ability to revert back to earlier revisions. |
74 |
|
75 |
# Committing before we start removing files, because
|
|
0.3.1
by John Arbash Meinel
Creating a plugin for uncommitting the last revision. |
76 |
# once we have removed at least one, all the rest are invalid.
|
77 |
if not dry_run: |
|
78 |
new_rev_history.commit() |
|
0.3.6
by John Arbash Meinel
Adding ability to revert back to earlier revisions. |
79 |
if remove_files: |
0.3.1
by John Arbash Meinel
Creating a plugin for uncommitting the last revision. |
80 |
# Actually start removing files
|
81 |
for f in files_to_remove: |
|
82 |
test_remove(f) |
|
83 |
||
0.3.6
by John Arbash Meinel
Adding ability to revert back to earlier revisions. |
84 |
else: |
85 |
new_rev_history.abort() |
|
86 |
||
87 |