~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/reconcile.py

  • Committer: Aaron Bentley
  • Date: 2009-11-03 15:45:56 UTC
  • mto: (4634.97.2 2.0)
  • mto: This revision was merged to the branch mainline in revision 4798.
  • Revision ID: aaron@aaronbentley.com-20091103154556-e953dmegqbinyokq
Improve patch binary section handling.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2005, 2006 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
27
27
 
28
28
 
29
29
from bzrlib import (
30
 
    cleanup,
31
30
    errors,
32
31
    ui,
33
32
    repository,
 
33
    repofmt,
34
34
    )
35
 
from bzrlib.trace import mutter
 
35
from bzrlib.trace import mutter, note
36
36
from bzrlib.tsort import topo_sort
37
37
from bzrlib.versionedfile import AdapterFactory, FulltextContentFactory
38
38
 
90
90
            # Nothing to check here
91
91
            self.fixed_branch_history = None
92
92
            return
93
 
        ui.ui_factory.note('Reconciling branch %s' % self.branch.base)
 
93
        self.pb.note('Reconciling branch %s',
 
94
                     self.branch.base)
94
95
        branch_reconciler = self.branch.reconcile(thorough=True)
95
96
        self.fixed_branch_history = branch_reconciler.fixed_history
96
97
 
97
98
    def _reconcile_repository(self):
98
99
        self.repo = self.bzrdir.find_repository()
99
 
        ui.ui_factory.note('Reconciling repository %s' %
100
 
            self.repo.bzrdir.root_transport.base)
 
100
        self.pb.note('Reconciling repository %s',
 
101
                     self.repo.bzrdir.root_transport.base)
101
102
        self.pb.update("Reconciling repository", 0, 1)
102
103
        repo_reconciler = self.repo.reconcile(thorough=True)
103
104
        self.inconsistent_parents = repo_reconciler.inconsistent_parents
104
105
        self.garbage_inventories = repo_reconciler.garbage_inventories
105
106
        if repo_reconciler.aborted:
106
 
            ui.ui_factory.note(
 
107
            self.pb.note(
107
108
                'Reconcile aborted: revision index has inconsistent parents.')
108
 
            ui.ui_factory.note(
 
109
            self.pb.note(
109
110
                'Run "bzr check" for more details.')
110
111
        else:
111
 
            ui.ui_factory.note('Reconciliation complete.')
 
112
            self.pb.note('Reconciliation complete.')
112
113
 
113
114
 
114
115
class BranchReconciler(object):
120
121
        self.branch = a_branch
121
122
 
122
123
    def reconcile(self):
123
 
        operation = cleanup.OperationWithCleanups(self._reconcile)
124
 
        self.add_cleanup = operation.add_cleanup
125
 
        operation.run_simple()
126
 
 
127
 
    def _reconcile(self):
128
124
        self.branch.lock_write()
129
 
        self.add_cleanup(self.branch.unlock)
130
 
        self.pb = ui.ui_factory.nested_progress_bar()
131
 
        self.add_cleanup(self.pb.finished)
132
 
        self._reconcile_steps()
 
125
        try:
 
126
            self.pb = ui.ui_factory.nested_progress_bar()
 
127
            try:
 
128
                self._reconcile_steps()
 
129
            finally:
 
130
                self.pb.finished()
 
131
        finally:
 
132
            self.branch.unlock()
133
133
 
134
134
    def _reconcile_steps(self):
135
135
        self._reconcile_revision_history()
151
151
            # set_revision_history, as this will regenerate it again.
152
152
            # Not really worth a whole BranchReconciler class just for this,
153
153
            # though.
154
 
            ui.ui_factory.note('Fixing last revision info %s => %s' % (
155
 
                 last_revno, len(real_history)))
 
154
            self.pb.note('Fixing last revision info %s => %s',
 
155
                         last_revno, len(real_history))
156
156
            self.branch.set_last_revision_info(len(real_history),
157
157
                                               last_revision_id)
158
158
        else:
159
159
            self.fixed_history = False
160
 
            ui.ui_factory.note('revision_history ok.')
 
160
            self.pb.note('revision_history ok.')
161
161
 
162
162
 
163
163
class RepoReconciler(object):
193
193
        garbage_inventories: The number of inventory objects without revisions
194
194
                             that were garbage collected.
195
195
        """
196
 
        operation = cleanup.OperationWithCleanups(self._reconcile)
197
 
        self.add_cleanup = operation.add_cleanup
198
 
        operation.run_simple()
199
 
 
200
 
    def _reconcile(self):
201
196
        self.repo.lock_write()
202
 
        self.add_cleanup(self.repo.unlock)
203
 
        self.pb = ui.ui_factory.nested_progress_bar()
204
 
        self.add_cleanup(self.pb.finished)
205
 
        self._reconcile_steps()
 
197
        try:
 
198
            self.pb = ui.ui_factory.nested_progress_bar()
 
199
            try:
 
200
                self._reconcile_steps()
 
201
            finally:
 
202
                self.pb.finished()
 
203
        finally:
 
204
            self.repo.unlock()
206
205
 
207
206
    def _reconcile_steps(self):
208
207
        """Perform the steps to reconcile this repository."""
239
238
        # (no garbage inventories or we are not doing a thorough check)
240
239
        if (not self.inconsistent_parents and
241
240
            (not self.garbage_inventories or not self.thorough)):
242
 
            ui.ui_factory.note('Inventory ok.')
 
241
            self.pb.note('Inventory ok.')
243
242
            return
244
243
        self.pb.update('Backing up inventory', 0, 0)
245
244
        self.repo._backup_inventory()
246
 
        ui.ui_factory.note('Backup inventory created.')
 
245
        self.pb.note('Backup inventory created.')
247
246
        new_inventories = self.repo._temp_inventories()
248
247
 
249
248
        # we have topological order of revisions and non ghost parents ready.
262
261
        self.pb.update('Writing weave')
263
262
        self.repo._activate_new_inventory()
264
263
        self.inventory = None
265
 
        ui.ui_factory.note('Inventory regenerated.')
 
264
        self.pb.note('Inventory regenerated.')
266
265
 
267
266
    def _new_inv_parents(self, revision_key):
268
267
        """Lookup ghost-filtered parents for revision_key."""
369
368
        self._check_garbage_inventories()
370
369
        self.pb.update('Checking unused inventories', 1, 3)
371
370
        if not self.garbage_inventories:
372
 
            ui.ui_factory.note('Inventory ok.')
 
371
            self.pb.note('Inventory ok.')
373
372
            return
374
373
        self.pb.update('Backing up inventory', 0, 0)
375
374
        self.repo._backup_inventory()
376
 
        ui.ui_factory.note('Backup Inventory created')
 
375
        self.pb.note('Backup Inventory created')
377
376
        # asking for '' should never return a non-empty weave
378
377
        new_inventories = self.repo._temp_inventories()
379
378
        # we have topological order of revisions and non ghost parents ready.
393
392
        self.pb.update('Writing weave')
394
393
        self.repo._activate_new_inventory()
395
394
        self.inventory = None
396
 
        ui.ui_factory.note('Inventory regenerated.')
 
395
        self.pb.note('Inventory regenerated.')
397
396
 
398
397
    def _fix_text_parents(self):
399
398
        """Fix bad versionedfile parent entries.
504
503
        collection = self.repo._pack_collection
505
504
        collection.ensure_loaded()
506
505
        collection.lock_names()
507
 
        self.add_cleanup(collection._unlock_names)
508
 
        packs = collection.all_packs()
509
 
        all_revisions = self.repo.all_revision_ids()
510
 
        total_inventories = len(list(
511
 
            collection.inventory_index.combined_index.iter_all_entries()))
512
 
        if len(all_revisions):
513
 
            new_pack =  self.repo._reconcile_pack(collection, packs,
514
 
                ".reconcile", all_revisions, self.pb)
515
 
            if new_pack is not None:
 
506
        try:
 
507
            packs = collection.all_packs()
 
508
            all_revisions = self.repo.all_revision_ids()
 
509
            total_inventories = len(list(
 
510
                collection.inventory_index.combined_index.iter_all_entries()))
 
511
            if len(all_revisions):
 
512
                new_pack =  self.repo._reconcile_pack(collection, packs,
 
513
                    ".reconcile", all_revisions, self.pb)
 
514
                if new_pack is not None:
 
515
                    self._discard_and_save(packs)
 
516
            else:
 
517
                # only make a new pack when there is data to copy.
516
518
                self._discard_and_save(packs)
517
 
        else:
518
 
            # only make a new pack when there is data to copy.
519
 
            self._discard_and_save(packs)
520
 
        self.garbage_inventories = total_inventories - len(list(
521
 
            collection.inventory_index.combined_index.iter_all_entries()))
 
519
            self.garbage_inventories = total_inventories - len(list(
 
520
                collection.inventory_index.combined_index.iter_all_entries()))
 
521
        finally:
 
522
            collection._unlock_names()
522
523
 
523
524
    def _discard_and_save(self, packs):
524
525
        """Discard some packs from the repository.