14
18
print '* file does not exist: %r' % filename
17
def uncommit(branch, dry_run=False, verbose=False, revno=None, tree=None):
21
def uncommit(branch, remove_files=False,
22
dry_run=False, verbose=False):
18
23
"""Remove the last revision from the supplied branch.
20
:param dry_run: Don't actually change anything
21
:param verbose: Print each step as you do it
22
:param revno: Remove back to this revision
25
:param remove_files: If True, remove files from the stores
24
28
from bzrlib.atomicfile import AtomicFile
29
unlockable.append(tree)
32
unlockable.append(branch)
34
master = branch.get_master_branch()
35
if master is not None:
37
unlockable.append(master)
38
rh = branch.revision_history()
39
if master is not None and rh[-1] != master.last_revision():
40
raise BoundBranchOutOfDate(branch, master)
29
rh = branch.revision_history()
31
rev = branch.get_revision(rev_id)
32
inv = branch.get_inventory(rev.inventory_id)
35
inv_prev.append(branch.get_revision_inventory(p.revision_id))
37
new_rev_history = AtomicFile(branch.controlfilename('revision-history'))
38
new_rev_history.write('\n'.join(rh))
39
# Committing now, because even if we fail to remove all files
40
# once we have removed at least one, all the rest are invalid.
42
new_rev_history.commit()
44
new_rev_history.abort()
47
# Figure out what text-store entries are new
44
48
files_to_remove = []
45
for r in range(revno-1, len(rh)):
48
print 'Removing revno %d: %s' % (len(rh)+1, rev_id)
51
# Committing before we start removing files, because
52
# once we have removed at least one, all the rest are invalid.
51
if not hasattr(ie, 'text_id'):
53
for other_inv in inv_prev:
54
if file_id in other_inv:
55
other_ie = other_inv[file_id]
56
if other_ie.text_id == ie.text_id:
59
# None of the previous ancestors used
61
files_to_remove.append(branch.controlfilename(['text-store',
63
rev_file = branch.controlfilename(['revision-store',
65
files_to_remove.append(rev_file)
66
inv_file = branch.controlfilename(['inventory-store',
67
rev.inventory_id + '.gz'])
68
files_to_remove.append(inv_file)
71
print 'Removing files:'
72
for f in files_to_remove:
73
print '\t%s' % branch.relpath(f)
54
if master is not None:
55
master.set_revision_history(rh)
56
branch.set_revision_history(rh)
58
tree.set_last_revision(branch.last_revision())
60
for item in reversed(unlockable):
76
# Actually start removing files
77
for f in files_to_remove: