bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 
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  |