/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/reconcile.py

Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.

This is used to replace various ad hoc implementations of the same logic,
notably the version used in registry's _LazyObjectGetter which had a bug when
getting a module without also getting a member.  And of course, this new
function has unit tests, unlike the replaced code.

This also adds a KnownHooksRegistry subclass to provide a more natural home for
some other logic.

I'm not thrilled about the name of the new module or the new functions, but it's
hard to think of good names for such generic functionality.

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
from bzrlib.versionedfile import AdapterFactory, FulltextContentFactory
37
37
 
38
38
 
39
 
def reconcile(dir, other=None):
 
39
def reconcile(dir, canonicalize_chks=False):
40
40
    """Reconcile the data in dir.
41
41
 
42
42
    Currently this is limited to a inventory 'reweave'.
46
46
    Directly using Reconciler is recommended for library users that
47
47
    desire fine grained control or analysis of the found issues.
48
48
 
49
 
    :param other: another bzrdir to reconcile against.
 
49
    :param canonicalize_chks: Make sure CHKs are in canonical form.
50
50
    """
51
 
    reconciler = Reconciler(dir, other=other)
 
51
    reconciler = Reconciler(dir, canonicalize_chks=canonicalize_chks)
52
52
    reconciler.reconcile()
53
53
 
54
54
 
55
55
class Reconciler(object):
56
56
    """Reconcilers are used to reconcile existing data."""
57
57
 
58
 
    def __init__(self, dir, other=None):
 
58
    def __init__(self, dir, other=None, canonicalize_chks=False):
59
59
        """Create a Reconciler."""
60
60
        self.bzrdir = dir
 
61
        self.canonicalize_chks = canonicalize_chks
61
62
 
62
63
    def reconcile(self):
63
64
        """Perform reconciliation.
98
99
        ui.ui_factory.note('Reconciling repository %s' %
99
100
            self.repo.user_url)
100
101
        self.pb.update("Reconciling repository", 0, 1)
101
 
        repo_reconciler = self.repo.reconcile(thorough=True)
 
102
        if self.canonicalize_chks:
 
103
            try:
 
104
                self.repo.reconcile_canonicalize_chks
 
105
            except AttributeError:
 
106
                raise errors.BzrError(
 
107
                    "%s cannot canonicalize CHKs." % (self.repo,))
 
108
            repo_reconciler = self.repo.reconcile_canonicalize_chks()
 
109
        else:
 
110
            repo_reconciler = self.repo.reconcile(thorough=True)
102
111
        self.inconsistent_parents = repo_reconciler.inconsistent_parents
103
112
        self.garbage_inventories = repo_reconciler.garbage_inventories
104
113
        if repo_reconciler.aborted:
494
503
    #  - lock the names list
495
504
    #  - perform a customised pack() that regenerates data as needed
496
505
    #  - unlock the names list
497
 
    # https://bugs.edge.launchpad.net/bzr/+bug/154173
 
506
    # https://bugs.launchpad.net/bzr/+bug/154173
 
507
 
 
508
    def __init__(self, repo, other=None, thorough=False,
 
509
            canonicalize_chks=False):
 
510
        super(PackReconciler, self).__init__(repo, other=other,
 
511
            thorough=thorough)
 
512
        self.canonicalize_chks = canonicalize_chks
498
513
 
499
514
    def _reconcile_steps(self):
500
515
        """Perform the steps to reconcile this repository."""
509
524
        total_inventories = len(list(
510
525
            collection.inventory_index.combined_index.iter_all_entries()))
511
526
        if len(all_revisions):
512
 
            new_pack =  self.repo._reconcile_pack(collection, packs,
513
 
                ".reconcile", all_revisions, self.pb)
 
527
            if self.canonicalize_chks:
 
528
                reconcile_meth = self.repo._canonicalize_chks_pack
 
529
            else:
 
530
                reconcile_meth = self.repo._reconcile_pack
 
531
            new_pack = reconcile_meth(collection, packs, ".reconcile",
 
532
                all_revisions, self.pb)
514
533
            if new_pack is not None:
515
534
                self._discard_and_save(packs)
516
535
        else: