~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/reconcile.py

  • Committer: Robert Collins
  • Date: 2007-11-16 01:28:59 UTC
  • mto: This revision was merged to the branch mainline in revision 3015.
  • Revision ID: robertc@robertcollins.net-20071116012859-909bq5as99bj7hx2
Change check and reconcile to use the new _generate_text_key_index rather
than a _RevisionTextVersionCache in calculating the correct per-file
parent information. This exposed some test errors which got changed, and
reporting some aspects of inventory-text mismatches become harder to
report (but easier to calculate for when we do start correcting it).

Show diffs side-by-side

added added

removed removed

Lines of Context:
376
376
        parent lists, and replaces the versionedfile with a corrected version.
377
377
        """
378
378
        transaction = self.repo.get_transaction()
379
 
        revision_versions = repository._RevisionTextVersionCache(self.repo)
380
379
        versions = self.revisions.versions()
381
380
        mutter('Prepopulating revision text cache with %d revisions',
382
381
                len(versions))
383
 
        revision_versions.prepopulate_revs(versions)
384
 
        used_file_versions = revision_versions.used_file_versions()
385
382
        vf_checker = self.repo.get_versioned_file_checker()
386
 
        for num, file_id in enumerate(self.repo.weave_store):
 
383
        # List all weaves before altering, to avoid race conditions when we
 
384
        # delete unused weaves.
 
385
        weaves = list(enumerate(self.repo.weave_store))
 
386
        for num, file_id in weaves:
387
387
            self.pb.update('Fixing text parents', num,
388
388
                           len(self.repo.weave_store))
389
389
            vf = self.repo.weave_store.get_weave(file_id, transaction)
390
 
            versions_with_bad_parents, dangling_file_versions = \
 
390
            versions_with_bad_parents, unused_versions = \
391
391
                vf_checker.check_file_version_parents(vf, file_id,
392
 
                vf.versions(), revision_versions)
 
392
                vf.versions())
393
393
            if (len(versions_with_bad_parents) == 0 and
394
 
                len(dangling_file_versions) == 0):
 
394
                len(unused_versions) == 0):
395
395
                continue
396
396
            full_text_versions = set()
397
 
            unused_versions = set()
398
 
            for dangling_version in dangling_file_versions:
399
 
                version = dangling_version[1]
400
 
                if dangling_version in used_file_versions:
401
 
                    # This version *is* used by some revision, even though it
402
 
                    # isn't used by its own revision!  We make sure any
403
 
                    # revision referencing it is stored as a fulltext
404
 
                    # This avoids bug 155730: it means that clients looking at
405
 
                    # inventories to determine the versions to fetch will not
406
 
                    # miss a required version.  (So clients can assume that if
407
 
                    # they have a complete revision graph, and fetch all file
408
 
                    # versions named by those revisions inventories, then they
409
 
                    # will not have any missing parents for 'delta' knit
410
 
                    # records.)
411
 
                    # XXX: A better, but more difficult and slower fix would be
412
 
                    # to rewrite the inventories referencing this version.
413
 
                    full_text_versions.add(version)
414
 
                else:
415
 
                    # This version is totally unreferenced.  It should be
416
 
                    # removed.
417
 
                    unused_versions.add(version)
418
397
            self._fix_text_parent(file_id, vf, versions_with_bad_parents,
419
398
                full_text_versions, unused_versions)
420
399
 
429
408
            self.transaction)
430
409
        new_parents = {}
431
410
        for version in vf.versions():
432
 
            if version in versions_with_bad_parents:
 
411
            if version in unused_versions:
 
412
                continue
 
413
            elif version in versions_with_bad_parents:
433
414
                parents = versions_with_bad_parents[version][1]
434
415
            else:
435
416
                parents = vf.get_parents(version)
436
417
            new_parents[version] = parents
 
418
        if not len(new_parents):
 
419
            # No used versions, remove the VF.
 
420
            self.repo.weave_store.delete(file_id, self.transaction)
 
421
            return
437
422
        for version in TopoSorter(new_parents.items()).iter_topo_order():
438
 
            if version in unused_versions:
439
 
                continue
440
423
            lines = vf.get_lines(version)
441
424
            parents = new_parents[version]
442
425
            if parents and (parents[0] in full_text_versions):