39
39
so that when the dependent object is checked, matches can be pulled out and
40
40
evaluated in-line rather than re-reading the same data many times.
41
41
check_refs are tuples (kind, value). Currently defined kinds are:
43
42
* 'trees', where value is a revid and the looked up objects are revision trees.
44
43
* 'lefthand-distance', where value is a revid and the looked up objects are the
45
44
distance along the lefthand path to NULL for that revid.
47
46
indicating that the revision was found/not found.
49
from bzrlib import errors, osutils
50
from bzrlib import repository as _mod_repository
51
from bzrlib import revision
54
52
from bzrlib.branch import Branch
55
53
from bzrlib.bzrdir import BzrDir
54
from bzrlib.errors import BzrCheckError
55
from bzrlib.repository import Repository
56
56
from bzrlib.revision import NULL_REVISION
57
from bzrlib.symbol_versioning import deprecated_function, deprecated_in
57
58
from bzrlib.trace import note
58
60
from bzrlib.workingtree import WorkingTree
61
62
class Check(object):
62
63
"""Check a repository"""
64
def __init__(self, repository, check_repo=True):
65
self.repository = repository
67
def report_results(self, verbose):
68
raise NotImplementedError(self.report_results)
71
class VersionedFileCheck(Check):
72
"""Check a versioned file repository"""
74
65
# The Check object interacts with InventoryEntry.check, etc.
76
67
def __init__(self, repository, check_repo=True):
101
92
if callback_refs is None:
102
93
callback_refs = {}
103
94
self.repository.lock_read()
104
self.progress = ui.ui_factory.nested_progress_bar()
95
self.progress = bzrlib.ui.ui_factory.nested_progress_bar()
106
97
self.progress.update('check', 0, 4)
107
98
if self.check_repo:
183
174
# - we can fill out existence flags at this point
184
175
# - we can read the revision inventory sha at this point
185
176
# - we can check properties and serialisers etc.
186
if not self.repository._format.revision_graph_can_have_wrong_parents:
177
if not self.repository.revision_graph_can_have_wrong_parents():
187
178
# The check against the index isn't needed.
188
179
self.revs_with_bad_parents_in_index = None
189
180
for thing in revision_iterator:
202
193
def _report_repo_results(self, verbose):
203
194
note('checked repository %s format %s',
204
self.repository.user_url,
205
self.repository._format)
195
self.repository.bzrdir.root_transport,
196
self.repository._format)
206
197
note('%6d revisions', self.checked_rev_cnt)
207
198
note('%6d file-ids', len(self.checked_weaves))
341
332
self.text_key_references[key] = True
335
@deprecated_function(deprecated_in((1,6,0)))
336
def check(branch, verbose):
337
"""Run consistency checks on a branch.
339
Results are reported through logging.
341
Deprecated in 1.6. Please use check_dwim instead.
343
:raise BzrCheckError: if there's a consistency error.
345
check_branch(branch, verbose)
348
@deprecated_function(deprecated_in((1,16,0)))
349
def check_branch(branch, verbose):
350
"""Run consistency checks on a branch.
352
Results are reported through logging.
354
:raise BzrCheckError: if there's a consistency error.
359
for ref in branch._get_check_refs():
360
needed_refs.setdefault(ref, []).append(branch)
361
result = branch.repository.check([branch.last_revision()], needed_refs)
362
branch_result = result.other_results[0]
365
branch_result.report_results(verbose)
344
368
def scan_branch(branch, needed_refs, to_unlock):
345
369
"""Scan a branch for refs.
427
451
if do_repo or do_branch or do_tree:
429
453
note("Checking repository at '%s'."
454
% (repo.bzrdir.root_transport.base,))
431
455
result = repo.check(None, callback_refs=needed_refs,
432
456
check_repo=do_repo)
433
457
result.report_results(verbose)