/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
1616.1.5 by Martin Pool
Cleanup and document some check code
17
# TODO: Perhaps have a way to record errors other than by raising exceptions;
18
# would perhaps be enough to accumulate exception objects in a list without
19
# raising them.  If there's more than one exception it'd be good to see them
20
# all.
21
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.
22
"""Checking of bzr objects.
23
24
check_refs is a concept used for optimising check. Objects that depend on other
25
objects (e.g. tree on repository) can list the objects they would be requesting
26
so that when the dependent object is checked, matches can be pulled out and
27
evaluated in-line rather than re-reading the same data many times.
28
check_refs are tuples (kind, value). Currently defined kinds are:
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
29
4332.3.5 by Robert Collins
Add Branch._get_check_refs.
30
* 'trees', where value is a revid and the looked up objects are revision trees.
31
* 'lefthand-distance', where value is a revid and the looked up objects are the
32
  distance along the lefthand path to NULL for that revid.
33
* 'revision-existence', where value is a revid, and the result is True or False
34
  indicating that the revision was found/not found.
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
"""
36
6379.6.7 by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear.
37
from __future__ import absolute_import
38
7479.2.1 by Jelmer Vernooij
Drop python2 support.
39
import contextlib
40
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
41
from . import (
5582.10.8 by Jelmer Vernooij
More fixes.
42
    errors,
43
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
44
from .controldir import ControlDir
45
from .trace import note
46
from .i18n import gettext
5850.1.3 by Jelmer Vernooij
Add VersionedFileCheck.
47
7143.15.2 by Jelmer Vernooij
Run autopep8.
48
1347 by Martin Pool
- refactor check code into method object
49
class Check(object):
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
50
    """Check a repository"""
1449 by Robert Collins
teach check about ghosts
51
5850.1.3 by Jelmer Vernooij
Add VersionedFileCheck.
52
    def __init__(self, repository, check_repo=True):
53
        self.repository = repository
54
55
    def report_results(self, verbose):
56
        raise NotImplementedError(self.report_results)
57
58
7356.1.4 by Jelmer Vernooij
use ExitStack in check.
59
def scan_branch(branch, needed_refs, exit_stack):
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
60
    """Scan a branch for refs.
61
62
    :param branch:  The branch to schedule for checking.
63
    :param needed_refs: Refs we are accumulating.
7356.1.4 by Jelmer Vernooij
use ExitStack in check.
64
    :param exit_stack: The exit stack accumulating.
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
65
    """
6138.3.1 by Jonathan Riddell
use gettext() in more files
66
    note(gettext("Checking branch at '%s'.") % (branch.base,))
7356.1.4 by Jelmer Vernooij
use ExitStack in check.
67
    exit_stack.enter_context(branch.lock_read())
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
68
    branch_refs = branch._get_check_refs()
69
    for ref in branch_refs:
70
        reflist = needed_refs.setdefault(ref, [])
71
        reflist.append(branch)
72
73
7356.1.4 by Jelmer Vernooij
use ExitStack in check.
74
def scan_tree(base_tree, tree, needed_refs, exit_stack):
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
75
    """Scan a tree for refs.
76
77
    :param base_tree: The original tree check opened, used to detect duplicate
78
        tree checks.
79
    :param tree:  The tree to schedule for checking.
80
    :param needed_refs: Refs we are accumulating.
7356.1.4 by Jelmer Vernooij
use ExitStack in check.
81
    :param exit_stack: The exit stack accumulating.
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
82
    """
83
    if base_tree is not None and tree.basedir == base_tree.basedir:
84
        return
6138.3.1 by Jonathan Riddell
use gettext() in more files
85
    note(gettext("Checking working tree at '%s'.") % (tree.basedir,))
7356.1.4 by Jelmer Vernooij
use ExitStack in check.
86
    exit_stack.enter_context(tree.lock_read())
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
87
    tree_refs = tree._get_check_refs()
88
    for ref in tree_refs:
89
        reflist = needed_refs.setdefault(ref, [])
90
        reflist.append(tree)
91
92
3015.4.5 by Daniel Watkins
Each option selects only the specific thing to be checked.
93
def check_dwim(path, verbose, do_branch=False, do_repo=False, do_tree=False):
4332.3.35 by Robert Collins
Fix failing tests.
94
    """Check multiple objects.
95
96
    If errors occur they are accumulated and reported as far as possible, and
97
    an exception raised at the end of the process.
98
    """
3015.4.16 by Daniel Watkins
Added implementation of error reporting when objects are missing.
99
    try:
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
100
        base_tree, branch, repo, relpath = \
7143.15.2 by Jelmer Vernooij
Run autopep8.
101
            ControlDir.open_containing_tree_branch_or_repository(path)
3015.4.16 by Daniel Watkins
Added implementation of error reporting when objects are missing.
102
    except errors.NotBranchError:
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
103
        base_tree = branch = repo = None
3015.3.23 by Daniel Watkins
Abstracted discovery of elements away.
104
7479.2.1 by Jelmer Vernooij
Drop python2 support.
105
    with contextlib.ExitStack() as exit_stack:
7356.1.4 by Jelmer Vernooij
use ExitStack in check.
106
        needed_refs = {}
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
107
        if base_tree is not None:
108
            # If the tree is a lightweight checkout we won't see it in
109
            # repo.find_branches - add now.
110
            if do_tree:
7356.1.4 by Jelmer Vernooij
use ExitStack in check.
111
                scan_tree(None, base_tree, needed_refs, exit_stack)
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
112
            branch = base_tree.branch
4332.3.9 by Robert Collins
Less lock thrashing in check.py.
113
        if branch is not None:
114
            # We have a branch
115
            if repo is None:
116
                # The branch is in a shared repository
117
                repo = branch.repository
118
        if repo is not None:
7356.1.4 by Jelmer Vernooij
use ExitStack in check.
119
            exit_stack.enter_context(repo.lock_read())
7358.5.3 by Jelmer Vernooij
Fix tests.
120
            branches = list(repo.find_branches(using=True))
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
121
            saw_tree = False
122
            if do_branch or do_tree:
123
                for branch in branches:
124
                    if do_tree:
125
                        try:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
126
                            tree = branch.controldir.open_workingtree()
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
127
                            saw_tree = True
128
                        except (errors.NotLocalUrl, errors.NoWorkingTree):
129
                            pass
130
                        else:
7356.1.4 by Jelmer Vernooij
use ExitStack in check.
131
                            scan_tree(base_tree, tree, needed_refs, exit_stack)
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
132
                    if do_branch:
7356.1.4 by Jelmer Vernooij
use ExitStack in check.
133
                        scan_branch(branch, needed_refs, exit_stack)
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
134
            if do_branch and not branches:
6138.3.1 by Jonathan Riddell
use gettext() in more files
135
                note(gettext("No branch found at specified location."))
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
136
            if do_tree and base_tree is None and not saw_tree:
6138.3.1 by Jonathan Riddell
use gettext() in more files
137
                note(gettext("No working tree found at specified location."))
4332.3.11 by Robert Collins
Move tree and back callbacks into the repository check core.
138
            if do_repo or do_branch or do_tree:
139
                if do_repo:
6138.3.1 by Jonathan Riddell
use gettext() in more files
140
                    note(gettext("Checking repository at '%s'.")
5158.6.9 by Martin Pool
Simplify various code to use user_url
141
                         % (repo.user_url,))
4332.3.11 by Robert Collins
Move tree and back callbacks into the repository check core.
142
                result = repo.check(None, callback_refs=needed_refs,
7143.15.2 by Jelmer Vernooij
Run autopep8.
143
                                    check_repo=do_repo)
3015.4.3 by Daniel Watkins
Implemented CLI options.
144
                result.report_results(verbose)
4332.3.9 by Robert Collins
Less lock thrashing in check.py.
145
        else:
4332.3.10 by Robert Collins
Invert control of check so that trees and branches are checked by calling back into them.
146
            if do_tree:
6138.3.1 by Jonathan Riddell
use gettext() in more files
147
                note(gettext("No working tree found at specified location."))
4332.3.9 by Robert Collins
Less lock thrashing in check.py.
148
            if do_branch:
6138.3.1 by Jonathan Riddell
use gettext() in more files
149
                note(gettext("No branch found at specified location."))
4332.3.9 by Robert Collins
Less lock thrashing in check.py.
150
            if do_repo:
6138.3.1 by Jonathan Riddell
use gettext() in more files
151
                note(gettext("No repository found at specified location."))