~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/upgrade.py

  • Committer: Robert Collins
  • Date: 2005-10-05 05:29:27 UTC
  • mfrom: (1393.1.51)
  • Revision ID: robertc@robertcollins.net-20051005052926-03d3a49e1dbcb670
mergeĀ fromĀ martin

Show diffs side-by-side

added added

removed removed

Lines of Context:
68
68
# versions.
69
69
 
70
70
 
 
71
# TODO: Don't create a progress bar here, have it passed by the caller.  
 
72
# At least do it from the UI factory.
 
73
 
71
74
if False:
72
75
    try:
73
76
        import psyco
86
89
from bzrlib.revfile import Revfile
87
90
from bzrlib.weave import Weave
88
91
from bzrlib.weavefile import read_weave, write_weave
89
 
from bzrlib.progress import ProgressBar
 
92
from bzrlib.ui import ui_factory
90
93
from bzrlib.atomicfile import AtomicFile
91
94
from bzrlib.xml4 import serializer_v4
92
95
from bzrlib.xml5 import serializer_v5
112
115
        self._backup_control_dir()
113
116
        note('starting upgrade')
114
117
        note('note: upgrade may be faster if all store files are ungzipped first')
115
 
        self.pb = ProgressBar()
 
118
        self.pb = ui_factory.progress_bar()
116
119
        if not os.path.isdir(self.base + '/.bzr/weaves'):
117
120
            os.mkdir(self.base + '/.bzr/weaves')
118
121
        self.inv_weave = Weave('inventory')
140
143
        self.pb.clear()
141
144
        note('upgraded to weaves:')
142
145
        note('  %6d revisions and inventories' % len(self.revisions))
143
 
        note('  %6d absent revisions removed' % len(self.absent_revisions))
 
146
        note('  %6d revisions not present' % len(self.absent_revisions))
144
147
        note('  %6d texts' % self.text_count)
145
148
        self._write_all_weaves()
146
149
        self._write_all_revs()
232
235
        if rev_id not in self.branch.revision_store:
233
236
            self.pb.clear()
234
237
            note('revision {%s} not present in branch; '
235
 
                 'will not be converted',
 
238
                 'will be converted as a ghost',
236
239
                 rev_id)
237
240
            self.absent_revisions.add(rev_id)
238
241
        else:
266
269
        """Convert revision and all referenced objects to new format."""
267
270
        rev = self.revisions[rev_id]
268
271
        inv = self._load_old_inventory(rev_id)
269
 
        for parent_id in rev.parent_ids[:]:
270
 
            if parent_id in self.absent_revisions:
271
 
                rev.parent_ids.remove(parent_id)
272
 
                self.pb.clear()
273
 
                note('remove {%s} as parent of {%s}', parent_id, rev_id)
274
 
        self._convert_revision_contents(rev, inv)
275
 
        self._store_new_weave(rev, inv)
276
 
        self._make_rev_ancestry(rev)
 
272
        present_parents = [p for p in rev.parent_ids
 
273
                           if p not in self.absent_revisions]
 
274
        self._convert_revision_contents(rev, inv, present_parents)
 
275
        self._store_new_weave(rev, inv, present_parents)
 
276
        self._make_rev_ancestry(rev, present_parents)
277
277
        self.converted_revs.add(rev_id)
278
278
 
279
279
 
280
 
    def _store_new_weave(self, rev, inv):
 
280
    def _store_new_weave(self, rev, inv, present_parents):
281
281
        # the XML is now updated with text versions
282
282
        if __debug__:
283
283
            for file_id in inv:
287
287
                assert hasattr(ie, 'revision'), \
288
288
                    'no revision on {%s} in {%s}' % \
289
289
                    (file_id, rev.revision_id)
290
 
 
291
290
        new_inv_xml = serializer_v5.write_inventory_to_string(inv)
292
291
        new_inv_sha1 = sha_string(new_inv_xml)
293
 
        self.inv_weave.add(rev.revision_id, rev.parent_ids,
 
292
        self.inv_weave.add(rev.revision_id, 
 
293
                           present_parents,
294
294
                           new_inv_xml.splitlines(True),
295
295
                           new_inv_sha1)
296
296
        rev.inventory_sha1 = new_inv_sha1
297
297
 
298
298
 
299
 
    def _make_rev_ancestry(self, rev):
 
299
    def _make_rev_ancestry(self, rev, present_parents):
300
300
        rev_id = rev.revision_id
301
 
        for parent_id in rev.parent_ids:
 
301
        for parent_id in present_parents:
302
302
            assert parent_id in self.converted_revs
303
 
        if rev.parent_ids:
304
 
            lines = list(self.anc_weave.mash_iter(rev.parent_ids))
 
303
        if present_parents:
 
304
            lines = list(self.anc_weave.mash_iter(present_parents))
305
305
        else:
306
306
            lines = []
307
307
        lines.append(rev_id + '\n')
308
308
        if __debug__:
309
 
            parent_ancestries = [self.ancestries[p] for p in rev.parent_ids]
 
309
            parent_ancestries = [self.ancestries[p] for p in present_parents]
310
310
            new_lines = merge_ancestry_lines(rev_id, parent_ancestries)
311
311
            assert set(lines) == set(new_lines)
312
312
            self.ancestries[rev_id] = new_lines
313
 
        self.anc_weave.add(rev_id, rev.parent_ids, lines)
314
 
 
315
 
 
316
 
    def _convert_revision_contents(self, rev, inv):
 
313
        self.anc_weave.add(rev_id, present_parents, lines)
 
314
 
 
315
 
 
316
    def _convert_revision_contents(self, rev, inv, present_parents):
317
317
        """Convert all the files within a revision.
318
318
 
319
319
        Also upgrade the inventory to refer to the text revision ids."""
320
320
        rev_id = rev.revision_id
321
321
        mutter('converting texts of revision {%s}',
322
322
               rev_id)
323
 
        parent_invs = map(self._load_updated_inventory, rev.parent_ids)
 
323
        parent_invs = map(self._load_updated_inventory, present_parents)
324
324
        for file_id in inv:
325
325
            ie = inv[file_id]
326
326
            self._set_revision(rev, ie, parent_invs)