/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2052.3.2 by John Arbash Meinel
Change Copyright .. by Canonical to Copyright ... Canonical
1
# Copyright (C) 2005, 2006 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1 by mbp at sourcefrog
import from baz patch-364
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1 by mbp at sourcefrog
import from baz patch-364
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1 by mbp at sourcefrog
import from baz patch-364
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1 by mbp at sourcefrog
import from baz patch-364
16
1335 by Martin Pool
doc
17
# TODO: Check ancestries are correct for every revision: includes
18
# every committed so far, and in a reasonable order.
19
1347 by Martin Pool
- refactor check code into method object
20
# TODO: Also check non-mainline revisions mentioned as parents.
21
22
# TODO: Check for extra files in the control directory.
23
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
24
# TODO: Check revision, inventory and entry objects have all
1348 by Martin Pool
- more refactoring of check code
25
# required fields.
26
1185.16.101 by mbp at sourcefrog
todo
27
# TODO: Get every revision in the revision-store even if they're not
28
# referenced by history and make sure they're all valid.
1347 by Martin Pool
- refactor check code into method object
29
1616.1.5 by Martin Pool
Cleanup and document some check code
30
# TODO: Perhaps have a way to record errors other than by raising exceptions;
31
# would perhaps be enough to accumulate exception objects in a list without
32
# raising them.  If there's more than one exception it'd be good to see them
33
# all.
34
4332.3.2 by Robert Collins
Extract repository access in WorkingTree._check to be data driven, adding a new _get_check_refs method to support this.
35
"""Checking of bzr objects.
36
37
check_refs is a concept used for optimising check. Objects that depend on other
38
objects (e.g. tree on repository) can list the objects they would be requesting
39
so that when the dependent object is checked, matches can be pulled out and
40
evaluated in-line rather than re-reading the same data many times.
41
check_refs are tuples (kind, value). Currently defined kinds are:
42
* 'trees', where value is a revid.
43
"""
44
3015.3.8 by Daniel Watkins
Added _scan_for_branches.
45
from bzrlib import errors, osutils
2745.6.16 by Aaron Bentley
Update from review
46
from bzrlib import repository as _mod_repository
2745.6.47 by Andrew Bennetts
Move check_parents out of VersionedFile.
47
from bzrlib import revision
3015.3.2 by Daniel Watkins
Check.check now takes a path rather than a branch.
48
from bzrlib.branch import Branch
3015.3.40 by Daniel Watkins
Modified bzrlib.check.check_dwim to use bzrlib.bzrdir.BzrDir.open_containing_tree_branch_or_repository.
49
from bzrlib.bzrdir import BzrDir
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
50
from bzrlib.errors import BzrCheckError
3015.3.3 by Daniel Watkins
Added _check_repository.
51
from bzrlib.repository import Repository
3015.3.59 by Daniel Watkins
Further tweaks as requested on-list.
52
from bzrlib.symbol_versioning import deprecated_function, deprecated_in
3015.3.35 by Daniel Watkins
Reintroduced bzrlib.check.check() with a deprecation warning.
53
from bzrlib.trace import log_error, note
1104 by Martin Pool
- Add a simple UIFactory
54
import bzrlib.ui
3015.3.11 by Daniel Watkins
Move WT checking from builtins to check.
55
from bzrlib.workingtree import WorkingTree
1104 by Martin Pool
- Add a simple UIFactory
56
1347 by Martin Pool
- refactor check code into method object
57
class Check(object):
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
58
    """Check a repository"""
1449 by Robert Collins
teach check about ghosts
59
1616.1.5 by Martin Pool
Cleanup and document some check code
60
    # The Check object interacts with InventoryEntry.check, etc.
61
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
62
    def __init__(self, repository):
63
        self.repository = repository
1383 by Martin Pool
- untabify only
64
        self.checked_text_cnt = 0
65
        self.checked_rev_cnt = 0
1449 by Robert Collins
teach check about ghosts
66
        self.ghosts = []
1365 by Martin Pool
- try to avoid checking texts repeatedly
67
        self.repeated_text_cnt = 0
1449 by Robert Collins
teach check about ghosts
68
        self.missing_parent_links = {}
1348 by Martin Pool
- more refactoring of check code
69
        self.missing_inventory_sha_cnt = 0
70
        self.missing_revision_cnt = 0
1616.1.5 by Martin Pool
Cleanup and document some check code
71
        # maps (file-id, version) -> sha1; used by InventoryFile._check
1365 by Martin Pool
- try to avoid checking texts repeatedly
72
        self.checked_texts = {}
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
73
        self.checked_weaves = set()
2988.1.8 by Robert Collins
Change check and reconcile to use the new _generate_text_key_index rather
74
        self.unreferenced_versions = set()
2745.6.33 by Andrew Bennetts
Add VersionedFile.check_parents, and use it instead of find_bad_ancestors in reconcile.
75
        self.inconsistent_parents = []
4145.2.1 by Ian Clatworthy
faster check
76
        self.rich_roots = repository.supports_rich_root()
77
        self.text_key_references = {}
676 by Martin Pool
- lock branch while checking
78
1449 by Robert Collins
teach check about ghosts
79
    def check(self):
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
80
        self.repository.lock_read()
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
81
        self.progress = bzrlib.ui.ui_factory.nested_progress_bar()
1449 by Robert Collins
teach check about ghosts
82
        try:
2819.2.3 by Andrew Bennetts
Add test that repo.check will report on wrong parents in the revision graph.
83
            self.progress.update('retrieving inventory', 0, 2)
1510 by Robert Collins
Merge from mpool, adjusting check to retain HTTP support.
84
            # do not put in init, as it should be done with progess,
85
            # and inside the lock.
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
86
            self.inventory_weave = self.repository.inventories
2819.2.3 by Andrew Bennetts
Add test that repo.check will report on wrong parents in the revision graph.
87
            self.progress.update('checking revision graph', 1)
88
            self.check_revision_graph()
1510 by Robert Collins
Merge from mpool, adjusting check to retain HTTP support.
89
            self.plan_revisions()
90
            revno = 0
91
            while revno < len(self.planned_revisions):
92
                rev_id = self.planned_revisions[revno]
93
                self.progress.update('checking revision', revno,
1449 by Robert Collins
teach check about ghosts
94
                                     len(self.planned_revisions))
1510 by Robert Collins
Merge from mpool, adjusting check to retain HTTP support.
95
                revno += 1
1449 by Robert Collins
teach check about ghosts
96
                self.check_one_rev(rev_id)
2745.6.16 by Aaron Bentley
Update from review
97
            # check_weaves is done after the revision scan so that
2988.1.8 by Robert Collins
Change check and reconcile to use the new _generate_text_key_index rather
98
            # revision index is known to be valid.
2745.6.3 by Aaron Bentley
Implement versionedfile checking for bzr check
99
            self.check_weaves()
1185.35.34 by Aaron Bentley
Made bzr check for stored revisions missing from ancestry
100
        finally:
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
101
            self.progress.finished()
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
102
            self.repository.unlock()
1449 by Robert Collins
teach check about ghosts
103
2819.2.3 by Andrew Bennetts
Add test that repo.check will report on wrong parents in the revision graph.
104
    def check_revision_graph(self):
2819.2.4 by Andrew Bennetts
Add a 'revision_graph_can_have_wrong_parents' method to repository.
105
        if not self.repository.revision_graph_can_have_wrong_parents():
106
            # This check is not necessary.
2819.2.3 by Andrew Bennetts
Add test that repo.check will report on wrong parents in the revision graph.
107
            self.revs_with_bad_parents_in_index = None
108
            return
109
        bad_revisions = self.repository._find_inconsistent_revision_parents()
110
        self.revs_with_bad_parents_in_index = list(bad_revisions)
111
1510 by Robert Collins
Merge from mpool, adjusting check to retain HTTP support.
112
    def plan_revisions(self):
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
113
        repository = self.repository
3221.17.2 by Ian Clatworthy
back out unnecessary list() around repo.all_revision_ids in check.py
114
        self.planned_revisions = repository.all_revision_ids()
1563.2.22 by Robert Collins
Move responsibility for repository.has_revision into RevisionStore
115
        self.progress.clear()
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
116
        inventoried = set(key[-1] for key in self.inventory_weave.keys())
2745.6.3 by Aaron Bentley
Implement versionedfile checking for bzr check
117
        awol = set(self.planned_revisions) - inventoried
1510 by Robert Collins
Merge from mpool, adjusting check to retain HTTP support.
118
        if len(awol) > 0:
119
            raise BzrCheckError('Stored revisions missing from inventory'
120
                '{%s}' % ','.join([f for f in awol]))
121
1449 by Robert Collins
teach check about ghosts
122
    def report_results(self, verbose):
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
123
        note('checked repository %s format %s',
124
             self.repository.bzrdir.root_transport,
125
             self.repository._format)
1365 by Martin Pool
- try to avoid checking texts repeatedly
126
        note('%6d revisions', self.checked_rev_cnt)
2745.6.47 by Andrew Bennetts
Move check_parents out of VersionedFile.
127
        note('%6d file-ids', len(self.checked_weaves))
1365 by Martin Pool
- try to avoid checking texts repeatedly
128
        note('%6d unique file texts', self.checked_text_cnt)
129
        note('%6d repeated file texts', self.repeated_text_cnt)
2988.1.8 by Robert Collins
Change check and reconcile to use the new _generate_text_key_index rather
130
        note('%6d unreferenced text versions',
131
             len(self.unreferenced_versions))
1348 by Martin Pool
- more refactoring of check code
132
        if self.missing_inventory_sha_cnt:
1449 by Robert Collins
teach check about ghosts
133
            note('%6d revisions are missing inventory_sha1',
1383 by Martin Pool
- untabify only
134
                 self.missing_inventory_sha_cnt)
1348 by Martin Pool
- more refactoring of check code
135
        if self.missing_revision_cnt:
1449 by Robert Collins
teach check about ghosts
136
            note('%6d revisions are mentioned but not present',
1383 by Martin Pool
- untabify only
137
                 self.missing_revision_cnt)
1449 by Robert Collins
teach check about ghosts
138
        if len(self.ghosts):
139
            note('%6d ghost revisions', len(self.ghosts))
140
            if verbose:
141
                for ghost in self.ghosts:
142
                    note('      %s', ghost)
143
        if len(self.missing_parent_links):
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
144
            note('%6d revisions missing parents in ancestry',
1449 by Robert Collins
teach check about ghosts
145
                 len(self.missing_parent_links))
146
            if verbose:
147
                for link, linkers in self.missing_parent_links.items():
148
                    note('      %s should be in the ancestry for:', link)
149
                    for linker in linkers:
150
                        note('       * %s', linker)
2745.6.6 by Aaron Bentley
Add unreferenced ancestors to check output
151
            if verbose:
2988.1.8 by Robert Collins
Change check and reconcile to use the new _generate_text_key_index rather
152
                for file_id, revision_id in self.unreferenced_versions:
153
                    log_error('unreferenced version: {%s} in %s', revision_id,
2745.6.6 by Aaron Bentley
Add unreferenced ancestors to check output
154
                        file_id)
2745.6.39 by Andrew Bennetts
Use scenario in test_check too, and make check actually report inconsistent parents to the end user.
155
        if len(self.inconsistent_parents):
156
            note('%6d inconsistent parents', len(self.inconsistent_parents))
157
            if verbose:
158
                for info in self.inconsistent_parents:
159
                    revision_id, file_id, found_parents, correct_parents = info
160
                    note('      * %s version %s has parents %r '
161
                         'but should have %r'
162
                         % (file_id, revision_id, found_parents,
163
                             correct_parents))
2819.2.3 by Andrew Bennetts
Add test that repo.check will report on wrong parents in the revision graph.
164
        if self.revs_with_bad_parents_in_index:
165
            note('%6d revisions have incorrect parents in the revision index',
166
                 len(self.revs_with_bad_parents_in_index))
167
            if verbose:
168
                for item in self.revs_with_bad_parents_in_index:
169
                    revision_id, index_parents, actual_parents = item
170
                    note(
171
                        '       %s has wrong parents in index: '
172
                        '%r should be %r',
173
                        revision_id, index_parents, actual_parents)
1449 by Robert Collins
teach check about ghosts
174
175
    def check_one_rev(self, rev_id):
1383 by Martin Pool
- untabify only
176
        """Check one revision.
177
178
        rev_id - the one to check
179
        """
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
180
        rev = self.repository.get_revision(rev_id)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
181
1383 by Martin Pool
- untabify only
182
        if rev.revision_id != rev_id:
183
            raise BzrCheckError('wrong internal revision id in revision {%s}'
184
                                % rev_id)
185
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
186
        for parent in rev.parent_ids:
187
            if not parent in self.planned_revisions:
4084.4.1 by Robert Collins
Minor comments clarifying check.py.
188
                # rev has a parent we didn't know about.
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
189
                missing_links = self.missing_parent_links.get(parent, [])
190
                missing_links.append(rev_id)
191
                self.missing_parent_links[parent] = missing_links
192
                # list based so somewhat slow,
193
                # TODO have a planned_revisions list and set.
194
                if self.repository.has_revision(parent):
195
                    missing_ancestry = self.repository.get_ancestry(parent)
196
                    for missing in missing_ancestry:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
197
                        if (missing is not None
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
198
                            and missing not in self.planned_revisions):
199
                            self.planned_revisions.append(missing)
1449 by Robert Collins
teach check about ghosts
200
                else:
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
201
                    self.ghosts.append(rev_id)
1383 by Martin Pool
- untabify only
202
203
        if rev.inventory_sha1:
4084.4.1 by Robert Collins
Minor comments clarifying check.py.
204
            # Loopback - this is currently circular logic as the
205
            # knit get_inventory_sha1 call returns rev.inventory_sha1.
206
            # Repository.py's get_inventory_sha1 should instead return
207
            # inventories.get_record_stream([(revid,)]).next().sha1 or
208
            # similar.
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
209
            inv_sha1 = self.repository.get_inventory_sha1(rev_id)
1383 by Martin Pool
- untabify only
210
            if inv_sha1 != rev.inventory_sha1:
211
                raise BzrCheckError('Inventory sha1 hash doesn\'t match'
212
                    ' value in revision {%s}' % rev_id)
213
        self._check_revision_tree(rev_id)
1362 by Martin Pool
- keep track of number of checked revisions
214
        self.checked_rev_cnt += 1
1349 by Martin Pool
- more refactoring of check code
215
1185.50.28 by John Arbash Meinel
Lots of updates for 'bzr check'
216
    def check_weaves(self):
217
        """Check all the weaves we can get our hands on.
218
        """
219
        weave_ids = []
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
220
        self.progress.update('checking inventory', 0, 2)
1185.50.28 by John Arbash Meinel
Lots of updates for 'bzr check'
221
        self.inventory_weave.check(progress_bar=self.progress)
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
222
        self.progress.update('checking text storage', 1, 2)
223
        self.repository.texts.check(progress_bar=self.progress)
4145.2.1 by Ian Clatworthy
faster check
224
        weave_checker = self.repository._get_versioned_file_checker(
225
            text_key_references=self.text_key_references)
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
226
        result = weave_checker.check_file_version_parents(
227
            self.repository.texts, progress_bar=self.progress)
228
        self.checked_weaves = weave_checker.file_ids
229
        bad_parents, unused_versions = result
230
        bad_parents = bad_parents.items()
231
        for text_key, (stored_parents, correct_parents) in bad_parents:
232
            # XXX not ready for id join/split operations.
233
            weave_id = text_key[0]
234
            revision_id = text_key[-1]
235
            weave_parents = tuple([parent[-1] for parent in stored_parents])
236
            correct_parents = tuple([parent[-1] for parent in correct_parents])
237
            self.inconsistent_parents.append(
238
                (revision_id, weave_id, weave_parents, correct_parents))
239
        self.unreferenced_versions.update(unused_versions)
1185.50.28 by John Arbash Meinel
Lots of updates for 'bzr check'
240
1349 by Martin Pool
- more refactoring of check code
241
    def _check_revision_tree(self, rev_id):
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
242
        tree = self.repository.revision_tree(rev_id)
1383 by Martin Pool
- untabify only
243
        inv = tree.inventory
4145.2.1 by Ian Clatworthy
faster check
244
        seen_ids = set()
245
        seen_names = set()
246
        for path, ie in inv.iter_entries():
247
            self._add_entry_to_text_key_references(inv, ie)
248
            file_id = ie.file_id
1383 by Martin Pool
- untabify only
249
            if file_id in seen_ids:
250
                raise BzrCheckError('duplicated file_id {%s} '
251
                                    'in inventory for revision {%s}'
252
                                    % (file_id, rev_id))
4145.2.1 by Ian Clatworthy
faster check
253
            seen_ids.add(file_id)
1092.2.20 by Robert Collins
symlink and weaves, whaddya know
254
            ie.check(self, rev_id, inv, tree)
1383 by Martin Pool
- untabify only
255
            if path in seen_names:
256
                raise BzrCheckError('duplicated path %s '
257
                                    'in inventory for revision {%s}'
258
                                    % (path, rev_id))
4145.2.1 by Ian Clatworthy
faster check
259
            seen_names.add(path)
260
261
    def _add_entry_to_text_key_references(self, inv, entry):
262
        if not self.rich_roots and entry == inv.root:
263
            return
264
        key = (entry.file_id, entry.revision)
265
        self.text_key_references.setdefault(key, False)
266
        if entry.revision == inv.revision_id:
267
            self.text_key_references[key] = True
1349 by Martin Pool
- more refactoring of check code
268
1347 by Martin Pool
- refactor check code into method object
269
3015.3.59 by Daniel Watkins
Further tweaks as requested on-list.
270
@deprecated_function(deprecated_in((1,6,0)))
3015.3.35 by Daniel Watkins
Reintroduced bzrlib.check.check() with a deprecation warning.
271
def check(branch, verbose):
272
    """Run consistency checks on a branch.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
273
3015.3.35 by Daniel Watkins
Reintroduced bzrlib.check.check() with a deprecation warning.
274
    Results are reported through logging.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
275
3015.3.58 by Daniel Watkins
Various other cleanup as requested by reviews.
276
    Deprecated in 1.6.  Please use check_branch instead.
3015.3.37 by Daniel Watkins
Added deprecation comment to docstring.
277
3015.3.35 by Daniel Watkins
Reintroduced bzrlib.check.check() with a deprecation warning.
278
    :raise BzrCheckError: if there's a consistency error.
279
    """
280
    check_branch(branch, verbose)
281
282
3015.3.7 by Daniel Watkins
Fixed failing tests.
283
def check_branch(branch, verbose):
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
284
    """Run consistency checks on a branch.
3015.3.35 by Daniel Watkins
Reintroduced bzrlib.check.check() with a deprecation warning.
285
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
286
    Results are reported through logging.
3015.3.35 by Daniel Watkins
Reintroduced bzrlib.check.check() with a deprecation warning.
287
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
288
    :raise BzrCheckError: if there's a consistency error.
289
    """
290
    branch.lock_read()
291
    try:
292
        branch_result = branch.check()
293
    finally:
294
        branch.unlock()
295
    branch_result.report_results(verbose)
2745.6.47 by Andrew Bennetts
Move check_parents out of VersionedFile.
296
297
3015.4.5 by Daniel Watkins
Each option selects only the specific thing to be checked.
298
def check_dwim(path, verbose, do_branch=False, do_repo=False, do_tree=False):
3015.4.16 by Daniel Watkins
Added implementation of error reporting when objects are missing.
299
    try:
300
        tree, branch, repo, relpath = \
3015.4.11 by Daniel Watkins
Fixed long line.
301
                        BzrDir.open_containing_tree_branch_or_repository(path)
3015.4.16 by Daniel Watkins
Added implementation of error reporting when objects are missing.
302
    except errors.NotBranchError:
303
        tree = branch = repo = None
3015.3.23 by Daniel Watkins
Abstracted discovery of elements away.
304
3015.4.5 by Daniel Watkins
Each option selects only the specific thing to be checked.
305
    if do_tree:
306
        if tree is not None:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
307
            note("Checking working tree at '%s'."
3015.4.5 by Daniel Watkins
Each option selects only the specific thing to be checked.
308
                 % (tree.bzrdir.root_transport.base,))
4332.3.2 by Robert Collins
Extract repository access in WorkingTree._check to be data driven, adding a new _get_check_refs method to support this.
309
            tree.lock_read()
310
            try:
311
                needed_refs = tree._get_check_refs()
312
                refs = {}
313
                for ref in needed_refs:
314
                    kind, value = ref
315
                    if kind == 'trees':
316
                        refs[ref] = tree.branch.repository.revision_tree(value)
317
                    else:
318
                        raise AssertionError(
319
                            'unknown ref kind for ref %s' % ref)
320
                tree._check(refs)
321
            finally:
322
                tree.unlock()
3015.4.16 by Daniel Watkins
Added implementation of error reporting when objects are missing.
323
        else:
324
            log_error("No working tree found at specified location.")
3015.3.23 by Daniel Watkins
Abstracted discovery of elements away.
325
3015.4.5 by Daniel Watkins
Each option selects only the specific thing to be checked.
326
    if branch is not None:
3015.3.20 by Daniel Watkins
Made code path a little clearer.
327
        # We have a branch
3015.3.5 by Daniel Watkins
Removed needless duplication of repository checks.
328
        if repo is None:
3015.3.10 by Daniel Watkins
Reorganised comments.
329
            # The branch is in a shared repository
3015.3.5 by Daniel Watkins
Removed needless duplication of repository checks.
330
            repo = branch.repository
3015.3.18 by Daniel Watkins
Improved errors.
331
        branches = [branch]
3015.3.59 by Daniel Watkins
Further tweaks as requested on-list.
332
    elif repo is not None:
333
        branches = repo.find_branches(using=True)
3015.3.9 by Daniel Watkins
Scan for branches and check them.
334
3015.3.4 by Daniel Watkins
If not in a branch or a repo, that check is simply skipped.
335
    if repo is not None:
3015.3.21 by Daniel Watkins
Fixed misused 'repository'.
336
        repo.lock_read()
3015.3.19 by Daniel Watkins
Repositories are now held read-locked for as long as possible.
337
        try:
3015.4.3 by Daniel Watkins
Implemented CLI options.
338
            if do_repo:
339
                note("Checking repository at '%s'."
340
                     % (repo.bzrdir.root_transport.base,))
341
                result = repo.check()
342
                result.report_results(verbose)
343
            if do_branch:
3015.4.16 by Daniel Watkins
Added implementation of error reporting when objects are missing.
344
                if branches == []:
345
                    log_error("No branch found at specified location.")
346
                else:
347
                    for branch in branches:
348
                        note("Checking branch at '%s'."
349
                             % (branch.bzrdir.root_transport.base,))
350
                        check_branch(branch, verbose)
3015.3.19 by Daniel Watkins
Repositories are now held read-locked for as long as possible.
351
        finally:
3015.3.21 by Daniel Watkins
Fixed misused 'repository'.
352
            repo.unlock()
3015.4.16 by Daniel Watkins
Added implementation of error reporting when objects are missing.
353
    else:
354
        if do_branch:
355
            log_error("No branch found at specified location.")
356
        if do_repo:
357
            log_error("No repository found at specified location.")