15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
def _update_store_entry(obj, obj_id, branch, store_name, store):
21
"""This is just a meta-function, which handles both revision entries
22
and inventory entries.
24
from bzrlib.trace import mutter
25
import tempfile, os, errno
26
from osutils import rename
27
obj_tmp = tempfile.TemporaryFile()
28
obj.write_xml(obj_tmp)
31
tmpfd, tmp_path = tempfile.mkstemp(prefix=obj_id, suffix='.gz',
32
dir=branch.controlfilename(store_name))
35
orig_obj_path = branch.controlfilename([store_name, obj_id+'.gz'])
36
# Remove the old entry out of the way
37
rename(orig_obj_path, tmp_path)
39
# TODO: We may need to handle the case where the old
40
# entry was not compressed (and thus did not end with .gz)
42
store.add(obj_tmp, obj_id) # Add the new one
43
os.remove(tmp_path) # Remove the old name
44
mutter(' Updated %s entry {%s}' % (store_name, obj_id))
46
# On any exception, restore the old entry
47
rename(tmp_path, orig_obj_path)
50
if os.path.exists(tmp_path):
51
# Unfortunately, the next command might throw
52
# an exception, which will mask a previous exception.
56
def _update_revision_entry(rev, branch):
57
"""After updating the values in a revision, make sure to
58
write out the data, but try to do it in an atomic manner.
60
:param rev: The Revision object to store
61
:param branch: The Branch object where this Revision is to be stored.
63
_update_store_entry(rev, rev.revision_id, branch,
64
'revision-store', branch.revision_store)
66
def _update_inventory_entry(inv, inv_id, branch):
67
"""When an inventory has been modified (such as by adding a unique tree root)
68
this atomically re-generates the file.
70
:param inv: The Inventory
71
:param inv_id: The inventory id for this inventory
72
:param branch: The Branch where this entry will be stored.
74
_update_store_entry(inv, inv_id, branch,
75
'inventory-store', branch.inventory_store)
22
79
"""Run consistency checks on a branch.
24
TODO: Also check non-mailine revisions mentioned as parents.
81
TODO: Also check non-mainline revisions mentioned as parents.
83
TODO: Check for extra files in the control directory.
26
85
from bzrlib.trace import mutter
27
from bzrlib.errors import BzrCheckError
86
from bzrlib.errors import BzrCheckError, NoSuchRevision
28
87
from bzrlib.osutils import fingerprint_file
29
from bzrlib.progress import ProgressBar
88
from bzrlib.inventory import ROOT_ID
89
from bzrlib.branch import gen_root_id
34
pb = ProgressBar(show_spinner=True)
37
96
missing_inventory_sha_cnt = 0
38
97
missing_revision_sha_cnt = 0
98
missing_revision_cnt = 0
40
100
history = branch.revision_history()
42
102
revcount = len(history)
44
105
# for all texts checked, text_id -> sha1
45
106
checked_texts = {}
108
progress = bzrlib.ui.ui_factory.progress_bar()
47
110
for rev_id in history:
49
pb.update('checking revision', revno, revcount)
50
mutter(' revision {%s}' % rev_id)
112
progress.update('checking revision', revno, revcount)
113
# mutter(' revision {%s}' % rev_id)
51
114
rev = branch.get_revision(rev_id)
52
115
if rev.revision_id != rev_id:
53
116
raise BzrCheckError('wrong internal revision id in revision {%s}'
161
235
if missing_revision_sha_cnt:
162
236
print '%d parent links are missing revision_sha1' % missing_revision_sha_cnt
164
if (missing_inventory_sha_cnt
165
or missing_revision_sha_cnt):
166
print ' (use "bzr upgrade" to fix them)'
238
if missing_revision_cnt:
239
print '%d revisions are mentioned but not present' % missing_revision_cnt
241
# stub this out for now because the main bzr branch has references
242
# to revisions that aren't present in the store -- mbp 20050804
243
# if (missing_inventory_sha_cnt
244
# or missing_revision_sha_cnt):
245
# print ' (use "bzr upgrade" to fix them)'
248
print '%d revisions have mismatched inventory ids:' % len(mismatch_inv_id)
249
for rev_id in mismatch_inv_id: