56
updated_revisions = []
58
# Set to True in the case that the previous revision entry
59
# was updated, since this will affect future revision entries
60
updated_previous_revision = False
44
for rev_id in history:
64
46
pb.update('checking revision', revno, revcount)
65
mutter(' revision {%s}' % rid)
66
rev = branch.get_revision(rid)
67
if rev.revision_id != rid:
68
raise BzrCheckError('wrong internal revision id in revision {%s}' % rid)
47
mutter(' revision {%s}' % rev_id)
48
rev = branch.get_revision(rev_id)
49
if rev.revision_id != rev_id:
50
raise BzrCheckError('wrong internal revision id in revision {%s}' % rev_id)
69
51
if rev.precursor != last_ptr:
70
raise BzrCheckError('mismatched precursor in revision {%s}' % rid)
72
if rid in checked_revs:
73
raise BzrCheckError('repeated revision {%s}' % rid)
74
checked_revs[rid] = True
52
raise BzrCheckError('mismatched precursor in revision {%s}' % rev_id)
54
if rev_id in checked_revs:
55
raise BzrCheckError('repeated revision {%s}' % rev_id)
56
checked_revs[rev_id] = True
76
58
## TODO: Check all the required fields are present on the revision.
79
60
if rev.inventory_sha1:
80
#mutter(' checking inventory hash {%s}' % rev.inventory_sha1)
81
61
inv_sha1 = branch.get_inventory_sha1(rev.inventory_id)
82
62
if inv_sha1 != rev.inventory_sha1:
83
63
raise BzrCheckError('Inventory sha1 hash doesn\'t match'
84
' value in revision {%s}' % rid)
86
inv_sha1 = branch.get_inventory_sha1(rev.inventory_id)
87
rev.inventory_sha1 = inv_sha1
64
' value in revision {%s}' % rev_id)
90
66
missing_inventory_sha_cnt += 1
91
mutter("no inventory_sha1 on revision {%s}" % rid)
67
mutter("no inventory_sha1 on revision {%s}" % rev_id)
94
70
if rev.precursor_sha1:
95
71
precursor_sha1 = branch.get_revision_sha1(rev.precursor)
96
if updated_previous_revision:
97
# we don't expect the hashes to match, because
98
# we had to modify the previous revision_history entry.
99
rev.precursor_sha1 = precursor_sha1
102
#mutter(' checking precursor hash {%s}' % rev.precursor_sha1)
103
if rev.precursor_sha1 != precursor_sha1:
104
raise BzrCheckError('Precursor sha1 hash doesn\'t match'
105
' value in revision {%s}' % rid)
107
precursor_sha1 = branch.get_revision_sha1(rev.precursor)
108
rev.precursor_sha1 = precursor_sha1
112
updated_previous_revision = True
113
# We had to update this revision entries hashes
114
# Now we need to write out a new value
115
# This is a little bit invasive, since we are *rewriting* a
116
# revision entry. I'm not supremely happy about it, but
117
# there should be *some* way of making old entries have
118
# the full meta information.
119
import tempfile, os, errno
120
rev_tmp = tempfile.TemporaryFile()
121
rev.write_xml(rev_tmp)
124
tmpfd, tmp_path = tempfile.mkstemp(prefix=rid, suffix='.gz',
125
dir=branch.controlfilename('revision-store'))
127
def special_rename(p1, p2):
128
if sys.platform == 'win32':
132
if e.errno != e.ENOENT:
137
# TODO: We may need to handle the case where the old revision
138
# entry was not compressed (and thus did not end with .gz)
140
# Remove the old revision entry out of the way
141
rev_path = branch.controlfilename(['revision-store', rid+'.gz'])
142
special_rename(rev_path, tmp_path)
143
branch.revision_store.add(rev_tmp, rid) # Add the new one
144
os.remove(tmp_path) # Remove the old name
145
mutter(' Updated revision entry {%s}' % rid)
147
# On any exception, restore the old entry
148
special_rename(tmp_path, rev_path)
151
updated_revisions.append(rid)
153
updated_previous_revision = False
72
#mutter(' checking precursor hash {%s}' % rev.precursor_sha1)
73
if rev.precursor_sha1 != precursor_sha1:
74
raise BzrCheckError('Precursor sha1 hash doesn\'t match'
75
' value in revision {%s}' % rev_id)
155
77
inv = branch.get_inventory(rev.inventory_id)