62
62
# The current algorithm is dumb (O(n**2)?) but will do the job, and
63
63
# takes less than a second on the bzr.dev branch.
65
# This currently does a kind of lazy conversion of file texts, where a
66
# new text is written in every version. That's unnecessary but for
67
# the moment saves us having to worry about when files need new
85
91
from bzrlib.xml4 import serializer_v4
86
92
from bzrlib.xml5 import serializer_v5
87
93
from bzrlib.trace import mutter, note, warning, enable_default_logging
94
from bzrlib.osutils import sha_strings
129
137
and rev_id not in self.absent_revisions):
130
138
self._load_one_rev(rev_id)
132
to_import = self._make_order()
140
to_import = self._make_order()[:100]
133
141
for i, rev_id in enumerate(to_import):
134
142
self.pb.update('converting revision', i, len(to_import))
135
self._import_one_rev(rev_id)
143
self._convert_one_rev(rev_id)
137
145
print '(not really) upgraded to weaves:'
138
146
print ' %6d revisions and inventories' % len(self.revisions)
145
153
def _write_all_weaves(self):
147
155
write_atomic_weave(self.inv_weave, 'weaves/inventory.weave')
148
return #######################
149
write_atomic_weave(self.anc_weave, 'weaves/ancestry.weave')
150
for file_id, file_weave in text_weaves.items():
151
self.pb.update('writing weave', i, len(text_weaves))
152
write_atomic_weave(file_weave, 'weaves/%s.weave' % file_id)
157
for file_id, file_weave in self.text_weaves.items():
158
self.pb.update('writing weave', i, len(self.text_weaves))
159
write_atomic_weave(file_weave, 'weaves/%s.weave' % file_id)
163
## write_atomic_weave(self.anc_weave, 'weaves/ancestry.weave')
158
166
def _load_one_rev(self, rev_id):
176
184
self.total_revs += 1
177
185
self.to_read.append(parent_id)
178
186
self.revisions[rev_id] = rev
181
def _import_one_rev(self, rev_id):
182
"""Convert rev_id and all referenced file texts to new format."""
183
old_inv_xml = self.branch.inventory_store[rev_id].read()
184
inv = serializer_v4.read_inventory_from_string(old_inv_xml)
187
old_inv_xml = self.branch.inventory_store[rev_id].read()
188
inv = serializer_v4.read_inventory_from_string(old_inv_xml)
189
self.inventories[rev_id] = inv
192
def _convert_one_rev(self, rev_id):
193
"""Convert revision and all referenced objects to new format."""
194
rev = self.revisions[rev_id]
195
inv = self.inventories[rev_id]
185
196
new_inv_xml = serializer_v5.write_inventory_to_string(inv)
186
197
inv_parents = [x for x in self.revisions[rev_id].parent_ids
187
198
if x not in self.absent_revisions]
188
199
self.inv_weave.add(rev_id, inv_parents,
189
200
new_inv_xml.splitlines(True))
201
# TODO: Upgrade revision XML and write that out
202
self._convert_revision_contents(rev, inv)
203
self.converted_revs.add(rev_id)
206
def _convert_revision_contents(self, rev, inv):
207
"""Convert all the files within a revision.
209
Also upgrade the inventory to refer to the text revision ids."""
210
rev_id = rev.revision_id
211
for path, ie in inv.iter_entries():
213
if ie.kind != 'file':
215
w = self.text_weaves.get(file_id)
218
self.text_weaves[file_id] = w
219
file_lines = self.branch.text_store[ie.text_id].readlines()
220
assert sha_strings(file_lines) == ie.text_sha1
221
assert sum(map(len, file_lines)) == ie.text_size
223
for parent_id in rev.parent_ids:
224
assert parent_id in self.converted_revs
225
if self.inventories[parent_id].has_id(file_id):
226
file_parents.append(parent_id)
227
w.add(rev_id, file_parents, file_lines)
228
ie.text_version = rev_id
229
ie.name_version = rev_id
230
mutter('import text {%s}\n from {%s}\n in revision {%s}',
231
ie.text_id, file_id, rev_id)
192
236
def _make_order(self):