/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/bzrdir.py

  • Committer: Robert Collins
  • Date: 2006-02-16 09:31:35 UTC
  • mto: (1534.1.24 integration)
  • mto: This revision was merged to the branch mainline in revision 1554.
  • Revision ID: robertc@robertcollins.net-20060216093135-c9345853176d94b2
Implement upgrades to Metaformat trees.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1276
1276
                revision_store.add(rev_tmp, rev_id)
1277
1277
        finally:
1278
1278
            self.pb.clear()
1279
 
 
1280
1279
            
1281
1280
    def _load_one_rev(self, rev_id):
1282
1281
        """Load a revision object into memory.
1300
1299
                self.to_read.append(parent_id)
1301
1300
            self.revisions[rev_id] = rev
1302
1301
 
1303
 
 
1304
1302
    def _load_old_inventory(self, rev_id):
1305
1303
        assert rev_id not in self.converted_revs
1306
1304
        old_inv_xml = self.branch.repository.inventory_store.get(rev_id).read()
1310
1308
            assert rev.inventory_sha1 == sha_string(old_inv_xml), \
1311
1309
                'inventory sha mismatch for {%s}' % rev_id
1312
1310
        return inv
1313
 
        
1314
1311
 
1315
1312
    def _load_updated_inventory(self, rev_id):
1316
1313
        assert rev_id in self.converted_revs
1318
1315
        inv = serializer_v5.read_inventory_from_string(inv_xml)
1319
1316
        return inv
1320
1317
 
1321
 
 
1322
1318
    def _convert_one_rev(self, rev_id):
1323
1319
        """Convert revision and all referenced objects to new format."""
1324
1320
        rev = self.revisions[rev_id]
1329
1325
        self._store_new_weave(rev, inv, present_parents)
1330
1326
        self.converted_revs.add(rev_id)
1331
1327
 
1332
 
 
1333
1328
    def _store_new_weave(self, rev, inv, present_parents):
1334
1329
        # the XML is now updated with text versions
1335
1330
        if __debug__:
1407
1402
        else:
1408
1403
            w.add(rev_id, parent_indexes, [], None)
1409
1404
        ie.revision = rev_id
1410
 
        ##mutter('import text {%s} of {%s}',
1411
 
        ##       ie.text_id, file_id)
1412
1405
 
1413
1406
    def _make_order(self):
1414
1407
        """Return a suitable order for importing revisions.
1418
1411
        """
1419
1412
        todo = set(self.revisions.keys())
1420
1413
        done = self.absent_revisions.copy()
1421
 
        o = []
 
1414
        order = []
1422
1415
        while todo:
1423
1416
            # scan through looking for a revision whose parents
1424
1417
            # are all done
1427
1420
                parent_ids = set(rev.parent_ids)
1428
1421
                if parent_ids.issubset(done):
1429
1422
                    # can take this one now
1430
 
                    o.append(rev_id)
 
1423
                    order.append(rev_id)
1431
1424
                    todo.remove(rev_id)
1432
1425
                    done.add(rev_id)
1433
 
        return o
 
1426
        return order
1434
1427
 
1435
1428
 
1436
1429
class ConvertBzrDir5To6(Converter):
1474
1467
        """See Converter.convert()."""
1475
1468
        self.bzrdir = to_convert
1476
1469
        self.pb = pb
 
1470
        self.count = 0
 
1471
        self.total = 20 # the steps we know about
 
1472
        self.garbage_inventories = []
 
1473
 
1477
1474
        self.pb.note('starting upgrade from format 5 to 6')
 
1475
        self.bzrdir._control_files.put_utf8('branch-format', "Converting to format 6")
 
1476
        # its faster to move specific files around than to open and use the apis...
 
1477
        # first off, nuke ancestry.weave, it was never used.
 
1478
        try:
 
1479
            self.step('Removing ancestry.weave')
 
1480
            self.bzrdir.transport.delete('ancestry.weave')
 
1481
        except errors.NoSuchFile:
 
1482
            pass
 
1483
        # find out whats there
 
1484
        self.step('Finding branch files')
 
1485
        bzrcontents = self.bzrdir.transport.list_dir('.')
 
1486
        for name in bzrcontents:
 
1487
            if name.startswith('basis-inventory.'):
 
1488
                self.garbage_inventories.append(name)
 
1489
        # create new directories for repository, working tree and branch
 
1490
        dir_mode = self.bzrdir._control_files._dir_mode
 
1491
        self.file_mode = self.bzrdir._control_files._file_mode
 
1492
        repository_names = [('inventory.weave', True),
 
1493
                            ('revision-store', True),
 
1494
                            ('weaves', True)]
 
1495
        self.step('Upgrading repository  ')
 
1496
        self.bzrdir.transport.mkdir('repository', mode=dir_mode)
 
1497
        self.make_lock('repository')
 
1498
        # we hard code the formats here because we are converting into
 
1499
        # the meta format. The meta format upgrader can take this to a 
 
1500
        # future format within each component.
 
1501
        self.put_format('repository', bzrlib.repository.RepositoryFormat7())
 
1502
        for entry in repository_names:
 
1503
            self.move_entry('repository', entry)
 
1504
 
 
1505
        self.step('Upgrading branch      ')
 
1506
        self.bzrdir.transport.mkdir('branch', mode=dir_mode)
 
1507
        self.make_lock('branch')
 
1508
        self.put_format('branch', bzrlib.branch.BzrBranchFormat5())
 
1509
        branch_files = [('revision-history', True),
 
1510
                        ('branch-name', True),
 
1511
                        ('parent', False)]
 
1512
        for entry in branch_files:
 
1513
            self.move_entry('branch', entry)
 
1514
 
 
1515
        self.step('Upgrading working tree')
 
1516
        self.bzrdir.transport.mkdir('checkout', mode=dir_mode)
 
1517
        self.make_lock('checkout')
 
1518
        self.put_format('checkout', bzrlib.workingtree.WorkingTreeFormat3())
 
1519
        self.bzrdir.transport.delete_multi(self.garbage_inventories, self.pb)
 
1520
        checkout_files = [('pending-merges', True),
 
1521
                          ('inventory', True),
 
1522
                          ('stat-cache', False)]
 
1523
        for entry in checkout_files:
 
1524
            self.move_entry('checkout', entry)
 
1525
        self.bzrdir._control_files.put_utf8('branch-format', BzrDirMetaFormat1().get_format_string())
1478
1526
        return BzrDir.open(self.bzrdir.root_transport.base)
1479
1527
 
 
1528
    def make_lock(self, name):
 
1529
        """Make a lock for the new control dir name."""
 
1530
        self.step('Make %s lock' % name)
 
1531
        self.bzrdir.transport.put('%s/lock' % name, StringIO(), mode=self.file_mode)
 
1532
 
 
1533
    def move_entry(self, new_dir, entry):
 
1534
        """Move then entry name into new_dir."""
 
1535
        name = entry[0]
 
1536
        mandatory = entry[1]
 
1537
        self.step('Moving %s' % name)
 
1538
        try:
 
1539
            self.bzrdir.transport.move(name, '%s/%s' % (new_dir, name))
 
1540
        except errors.NoSuchFile:
 
1541
            if mandatory:
 
1542
                raise
 
1543
 
 
1544
    def put_format(self, dirname, format):
 
1545
        self.bzrdir._control_files.put_utf8('%s/format' % dirname, format.get_format_string())
 
1546
 
 
1547
    def step(self, message):
 
1548
        """Update the pb by a step."""
 
1549
        self.count +=1
 
1550
        self.pb.update('Upgrading repository  ', self.count, self.total)
 
1551