~ubuntu-branches/ubuntu/karmic/bzr/karmic-proposed

« back to all changes in this revision

Viewing changes to bzrlib/check.py

  • Committer: Bazaar Package Importer
  • Author(s): Jelmer Vernooij
  • Date: 2008-08-25 19:06:49 UTC
  • mfrom: (1.1.44 upstream)
  • Revision ID: james.westby@ubuntu.com-20080825190649-pq87jonr4uvs7s0y
Tags: 1.6-1
New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
# raising them.  If there's more than one exception it'd be good to see them
33
33
# all.
34
34
 
35
 
from bzrlib import errors
 
35
from bzrlib import errors, osutils
36
36
from bzrlib import repository as _mod_repository
37
37
from bzrlib import revision
 
38
from bzrlib.branch import Branch
 
39
from bzrlib.bzrdir import BzrDir
38
40
from bzrlib.errors import BzrCheckError
 
41
from bzrlib.repository import Repository
 
42
from bzrlib.symbol_versioning import deprecated_function, deprecated_in
 
43
from bzrlib.trace import log_error, note
39
44
import bzrlib.ui
40
 
from bzrlib.trace import log_error, note
 
45
from bzrlib.workingtree import WorkingTree
41
46
 
42
47
class Check(object):
43
48
    """Check a repository"""
55
60
        self.missing_revision_cnt = 0
56
61
        # maps (file-id, version) -> sha1; used by InventoryFile._check
57
62
        self.checked_texts = {}
58
 
        self.checked_weaves = {}
 
63
        self.checked_weaves = set()
59
64
        self.unreferenced_versions = set()
60
65
        self.inconsistent_parents = []
61
66
 
66
71
            self.progress.update('retrieving inventory', 0, 2)
67
72
            # do not put in init, as it should be done with progess,
68
73
            # and inside the lock.
69
 
            self.inventory_weave = self.repository.get_inventory_weave()
 
74
            self.inventory_weave = self.repository.inventories
70
75
            self.progress.update('checking revision graph', 1)
71
76
            self.check_revision_graph()
72
77
            self.plan_revisions()
96
101
        repository = self.repository
97
102
        self.planned_revisions = repository.all_revision_ids()
98
103
        self.progress.clear()
99
 
        inventoried = set(self.inventory_weave.versions())
 
104
        inventoried = set(key[-1] for key in self.inventory_weave.keys())
100
105
        awol = set(self.planned_revisions) - inventoried
101
106
        if len(awol) > 0:
102
107
            raise BzrCheckError('Stored revisions missing from inventory'
193
198
    def check_weaves(self):
194
199
        """Check all the weaves we can get our hands on.
195
200
        """
196
 
        n_weaves = 1
197
201
        weave_ids = []
198
 
        if self.repository.weave_store.listable():
199
 
            weave_ids = list(self.repository.weave_store)
200
 
            n_weaves = len(weave_ids) + 1
201
 
        self.progress.update('checking versionedfile', 0, n_weaves)
 
202
        self.progress.update('checking inventory', 0, 2)
202
203
        self.inventory_weave.check(progress_bar=self.progress)
203
 
        files_in_revisions = {}
204
 
        revisions_of_files = {}
 
204
        self.progress.update('checking text storage', 1, 2)
 
205
        self.repository.texts.check(progress_bar=self.progress)
205
206
        weave_checker = self.repository._get_versioned_file_checker()
206
 
        for i, weave_id in enumerate(weave_ids):
207
 
            self.progress.update('checking versionedfile', i, n_weaves)
208
 
            w = self.repository.weave_store.get_weave(weave_id,
209
 
                    self.repository.get_transaction())
210
 
            # No progress here, because it looks ugly.
211
 
            w.check()
212
 
            result = weave_checker.check_file_version_parents(w, weave_id)
213
 
            bad_parents, unused_versions = result
214
 
            bad_parents = bad_parents.items()
215
 
            for revision_id, (weave_parents, correct_parents) in bad_parents:
216
 
                self.inconsistent_parents.append(
217
 
                    (revision_id, weave_id, weave_parents, correct_parents))
218
 
            for revision_id in unused_versions:
219
 
                self.unreferenced_versions.add((weave_id, revision_id))
220
 
            self.checked_weaves[weave_id] = True
 
207
        result = weave_checker.check_file_version_parents(
 
208
            self.repository.texts, progress_bar=self.progress)
 
209
        self.checked_weaves = weave_checker.file_ids
 
210
        bad_parents, unused_versions = result
 
211
        bad_parents = bad_parents.items()
 
212
        for text_key, (stored_parents, correct_parents) in bad_parents:
 
213
            # XXX not ready for id join/split operations.
 
214
            weave_id = text_key[0]
 
215
            revision_id = text_key[-1]
 
216
            weave_parents = tuple([parent[-1] for parent in stored_parents])
 
217
            correct_parents = tuple([parent[-1] for parent in correct_parents])
 
218
            self.inconsistent_parents.append(
 
219
                (revision_id, weave_id, weave_parents, correct_parents))
 
220
        self.unreferenced_versions.update(unused_versions)
221
221
 
222
222
    def _check_revision_tree(self, rev_id):
223
223
        tree = self.repository.revision_tree(rev_id)
241
241
            seen_names[path] = True
242
242
 
243
243
 
 
244
@deprecated_function(deprecated_in((1,6,0)))
244
245
def check(branch, verbose):
245
246
    """Run consistency checks on a branch.
246
247
    
247
248
    Results are reported through logging.
248
249
    
 
250
    Deprecated in 1.6.  Please use check_branch instead.
 
251
 
 
252
    :raise BzrCheckError: if there's a consistency error.
 
253
    """
 
254
    check_branch(branch, verbose)
 
255
 
 
256
 
 
257
def check_branch(branch, verbose):
 
258
    """Run consistency checks on a branch.
 
259
 
 
260
    Results are reported through logging.
 
261
 
249
262
    :raise BzrCheckError: if there's a consistency error.
250
263
    """
251
264
    branch.lock_read()
252
265
    try:
253
266
        branch_result = branch.check()
254
 
        repo_result = branch.repository.check([branch.last_revision()])
255
267
    finally:
256
268
        branch.unlock()
257
269
    branch_result.report_results(verbose)
258
 
    repo_result.report_results(verbose)
259
 
 
260
 
 
261
 
 
 
270
 
 
271
 
 
272
def check_dwim(path, verbose, do_branch=False, do_repo=False, do_tree=False):
 
273
    try:
 
274
        tree, branch, repo, relpath = \
 
275
                        BzrDir.open_containing_tree_branch_or_repository(path)
 
276
    except errors.NotBranchError:
 
277
        tree = branch = repo = None
 
278
 
 
279
    if do_tree:
 
280
        if tree is not None:
 
281
            note("Checking working tree at '%s'." 
 
282
                 % (tree.bzrdir.root_transport.base,))
 
283
            tree._check()
 
284
        else:
 
285
            log_error("No working tree found at specified location.")
 
286
 
 
287
    if branch is not None:
 
288
        # We have a branch
 
289
        if repo is None:
 
290
            # The branch is in a shared repository
 
291
            repo = branch.repository
 
292
        branches = [branch]
 
293
    elif repo is not None:
 
294
        branches = repo.find_branches(using=True)
 
295
 
 
296
    if repo is not None:
 
297
        repo.lock_read()
 
298
        try:
 
299
            if do_repo:
 
300
                note("Checking repository at '%s'."
 
301
                     % (repo.bzrdir.root_transport.base,))
 
302
                result = repo.check()
 
303
                result.report_results(verbose)
 
304
            if do_branch:
 
305
                if branches == []:
 
306
                    log_error("No branch found at specified location.")
 
307
                else:
 
308
                    for branch in branches:
 
309
                        note("Checking branch at '%s'."
 
310
                             % (branch.bzrdir.root_transport.base,))
 
311
                        check_branch(branch, verbose)
 
312
        finally:
 
313
            repo.unlock()
 
314
    else:
 
315
        if do_branch:
 
316
            log_error("No branch found at specified location.")
 
317
        if do_repo:
 
318
            log_error("No repository found at specified location.")