/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5752.3.8 by John Arbash Meinel
Merge bzr.dev 5764 to resolve release-notes (aka NEWS) conflicts
1
# Copyright (C) 2006, 2007, 2009, 2010, 2011 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1185.78.6 by John Arbash Meinel
Adding sign-my-commits as a builtin, along with some simple tests.
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
#
1185.78.6 by John Arbash Meinel
Adding sign-my-commits as a builtin, along with some simple tests.
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
#
1185.78.6 by John Arbash Meinel
Adding sign-my-commits as a builtin, along with some simple tests.
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
1732.2.3 by Martin Pool
sign-my-commits just signs revisions in the branch's ancestry.
16
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
17
"""Command that signs unsigned commits by the current user. """
1185.78.6 by John Arbash Meinel
Adding sign-my-commits as a builtin, along with some simple tests.
18
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
19
from . import (
6207.3.3 by jelmer at samba
Fix tests and the like.
20
    controldir,
5972.3.23 by Jelmer Vernooij
Fix handling of ghosts in sign_my_commits.
21
    errors,
1996.3.14 by John Arbash Meinel
lazy_import osutils and sign_my_commits
22
    gpg,
7143.21.1 by Jelmer Vernooij
Add WriteGroup contextmanager.
23
    repository as _mod_repository,
5972.3.2 by Jelmer Vernooij
Use iter_ancestry rather than get_ancestry.
24
    revision as _mod_revision,
1996.3.14 by John Arbash Meinel
lazy_import osutils and sign_my_commits
25
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
26
from .commands import Command
27
from .option import Option
28
from .i18n import gettext, ngettext
1185.78.6 by John Arbash Meinel
Adding sign-my-commits as a builtin, along with some simple tests.
29
6491.1.2 by Jelmer Vernooij
Translate another string.
30
1185.78.6 by John Arbash Meinel
Adding sign-my-commits as a builtin, along with some simple tests.
31
class cmd_sign_my_commits(Command):
5131.2.1 by Martin
Permit bzrlib to run under python -OO by explictly assigning to __doc__ for user-visible docstrings
32
    __doc__ = """Sign all commits by a given committer.
1185.78.6 by John Arbash Meinel
Adding sign-my-commits as a builtin, along with some simple tests.
33
34
    If location is not specified the local tree is used.
35
    If committer is not specified the default committer is used.
36
37
    This does not sign commits that already have signatures.
38
    """
1732.2.3 by Martin Pool
sign-my-commits just signs revisions in the branch's ancestry.
39
    # Note that this signs everything on the branch's ancestry
40
    # (both mainline and merged), but not other revisions that may be in the
41
    # repository
1185.78.6 by John Arbash Meinel
Adding sign-my-commits as a builtin, along with some simple tests.
42
2598.1.2 by Martin Pool
Also check that option help ends in a period, and fix those that don't
43
    takes_options = [
7143.15.2 by Jelmer Vernooij
Run autopep8.
44
        Option('dry-run',
45
               help='Don\'t actually sign anything, just print'
46
               ' the revisions that would be signed.'),
47
        ]
1185.78.6 by John Arbash Meinel
Adding sign-my-commits as a builtin, along with some simple tests.
48
    takes_args = ['location?', 'committer?']
49
50
    def run(self, location=None, committer=None, dry_run=False):
51
        if location is None:
6207.3.3 by jelmer at samba
Fix tests and the like.
52
            bzrdir = controldir.ControlDir.open_containing('.')[0]
1185.78.6 by John Arbash Meinel
Adding sign-my-commits as a builtin, along with some simple tests.
53
        else:
54
            # Passed in locations should be exact
6207.3.3 by jelmer at samba
Fix tests and the like.
55
            bzrdir = controldir.ControlDir.open(location)
1732.2.3 by Martin Pool
sign-my-commits just signs revisions in the branch's ancestry.
56
        branch = bzrdir.open_branch()
57
        repo = branch.repository
6449.6.4 by Jelmer Vernooij
Use config stack.
58
        branch_config = branch.get_config_stack()
1185.78.6 by John Arbash Meinel
Adding sign-my-commits as a builtin, along with some simple tests.
59
60
        if committer is None:
6449.6.4 by Jelmer Vernooij
Use config stack.
61
            committer = branch_config.get('email')
62
        gpg_strategy = gpg.GPGStrategy(branch_config)
1185.78.6 by John Arbash Meinel
Adding sign-my-commits as a builtin, along with some simple tests.
63
64
        count = 0
6969.3.3 by Jelmer Vernooij
Use context managers in a few more places.
65
        with repo.lock_write():
5972.3.2 by Jelmer Vernooij
Use iter_ancestry rather than get_ancestry.
66
            graph = repo.get_graph()
7143.21.1 by Jelmer Vernooij
Add WriteGroup contextmanager.
67
            with _mod_repository.WriteGroup(repo):
5972.3.2 by Jelmer Vernooij
Use iter_ancestry rather than get_ancestry.
68
                for rev_id, parents in graph.iter_ancestry(
69
                        [branch.last_revision()]):
70
                    if _mod_revision.is_null(rev_id):
71
                        continue
5972.3.24 by Jelmer Vernooij
Simplify ghost check.
72
                    if parents is None:
73
                        # Ignore ghosts
74
                        continue
75
                    if repo.has_signature_for_revision_id(rev_id):
3010.1.15 by Robert Collins
Manage write groups in sign_my_commits, for efficiency.
76
                        continue
77
                    rev = repo.get_revision(rev_id)
78
                    if rev.committer != committer:
79
                        continue
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
80
                    # We have a revision without a signature who has a
3010.1.15 by Robert Collins
Manage write groups in sign_my_commits, for efficiency.
81
                    # matching committer, start signing
6491.1.2 by Jelmer Vernooij
Translate another string.
82
                    self.outf.write("%s\n" % rev_id)
3010.1.15 by Robert Collins
Manage write groups in sign_my_commits, for efficiency.
83
                    count += 1
84
                    if not dry_run:
85
                        repo.sign_revision(rev_id, gpg_strategy)
6491.1.2 by Jelmer Vernooij
Translate another string.
86
        self.outf.write(
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
87
            ngettext('Signed %d revision.\n', 'Signed %d revisions.\n',
88
                     count) % count)
1185.78.6 by John Arbash Meinel
Adding sign-my-commits as a builtin, along with some simple tests.
89
90
5971.1.52 by Jonathan Riddell
change command name to verify-signatures
91
class cmd_verify_signatures(Command):
5971.1.3 by Jonathan Riddell
tidying up
92
    __doc__ = """Verify all commit signatures.
93
94
    Verifies that all commits in the branch are signed by known GnuPG keys.
5971.1.1 by Jonathan Riddell
add a verify command
95
    """
5971.1.3 by Jonathan Riddell
tidying up
96
5971.1.12 by Jonathan Riddell
add acceptable-keys option
97
    takes_options = [
7143.15.2 by Jelmer Vernooij
Run autopep8.
98
        Option('acceptable-keys',
99
               help='Comma separated list of GPG key patterns which are'
100
               ' acceptable for verification.',
101
               short_name='k',
7479.2.1 by Jelmer Vernooij
Drop python2 support.
102
               type=str,),
7143.15.2 by Jelmer Vernooij
Run autopep8.
103
        'revision',
104
        'verbose',
105
        ]
5971.1.76 by Jonathan Riddell
change directory option to location argument
106
    takes_args = ['location?']
5971.1.12 by Jonathan Riddell
add acceptable-keys option
107
5971.1.53 by Jonathan Riddell
add directory option
108
    def run(self, acceptable_keys=None, revision=None, verbose=None,
7143.15.2 by Jelmer Vernooij
Run autopep8.
109
            location=u'.'):
6207.3.3 by jelmer at samba
Fix tests and the like.
110
        bzrdir = controldir.ControlDir.open_containing(location)[0]
5971.1.1 by Jonathan Riddell
add a verify command
111
        branch = bzrdir.open_branch()
112
        repo = branch.repository
6351.3.2 by Jelmer Vernooij
Convert some gpg options to config stacks.
113
        branch_config = branch.get_config_stack()
5971.1.1 by Jonathan Riddell
add a verify command
114
        gpg_strategy = gpg.GPGStrategy(branch_config)
5971.1.56 by Jonathan Riddell
add an option for acceptable_keys in config, also make config docs match reality for signature options
115
5971.1.69 by Jonathan Riddell
move some code from cmd_verify to gpg.set_acceptable_keys
116
        gpg_strategy.set_acceptable_keys(acceptable_keys)
5971.1.70 by Jonathan Riddell
move code which does verifications of revisions from cmd_verify_signatures to gpg.do_verifications
117
5971.1.74 by Jonathan Riddell
formatting changes necessary for qbzr
118
        def write(string):
119
            self.outf.write(string + "\n")
7143.15.2 by Jelmer Vernooij
Run autopep8.
120
5971.1.74 by Jonathan Riddell
formatting changes necessary for qbzr
121
        def write_verbose(string):
122
            self.outf.write("  " + string + "\n")
123
6491.1.3 by Jelmer Vernooij
Make 'bzr verify-signatures' show a progress bar.
124
        self.add_cleanup(repo.lock_read().unlock)
7143.15.2 by Jelmer Vernooij
Run autopep8.
125
        # get our list of revisions
5971.1.15 by Jonathan Riddell
add a revision argument to bzr verify
126
        revisions = []
127
        if revision is not None:
128
            if len(revision) == 1:
129
                revno, rev_id = revision[0].in_history(branch)
130
                revisions.append(rev_id)
131
            elif len(revision) == 2:
132
                from_revno, from_revid = revision[0].in_history(branch)
133
                to_revno, to_revid = revision[1].in_history(branch)
134
                if to_revid is None:
135
                    to_revno = branch.revno()
136
                if from_revno is None or to_revno is None:
7490.61.1 by Jelmer Vernooij
Rename BzrCommandError to CommandError.
137
                    raise errors.CommandError(
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
138
                        gettext('Cannot verify a range of non-revision-history'
139
                                ' revisions'))
5971.1.15 by Jonathan Riddell
add a revision argument to bzr verify
140
                for revno in range(from_revno, to_revno + 1):
141
                    revisions.append(branch.get_rev_id(revno))
142
        else:
7143.15.2 by Jelmer Vernooij
Run autopep8.
143
            # all revisions by default including merges
5971.1.50 by Jonathan Riddell
merge in trunk
144
            graph = repo.get_graph()
145
            revisions = []
146
            for rev_id, parents in graph.iter_ancestry(
147
                    [branch.last_revision()]):
148
                if _mod_revision.is_null(rev_id):
149
                    continue
150
                if parents is None:
151
                    # Ignore ghosts
152
                    continue
153
                revisions.append(rev_id)
6589.3.1 by Vincent Ladeuil
Fix command line override handling for acceptable_keys
154
        count, result, all_verifiable = gpg.bulk_verify_signatures(
155
            repo, revisions, gpg_strategy)
5971.1.70 by Jonathan Riddell
move code which does verifications of revisions from cmd_verify_signatures to gpg.do_verifications
156
        if all_verifiable:
7143.15.2 by Jelmer Vernooij
Run autopep8.
157
            write(gettext("All commits signed with verifiable keys"))
158
            if verbose:
159
                for message in gpg.verbose_valid_message(result):
160
                    write_verbose(message)
161
            return 0
5971.1.2 by Jonathan Riddell
give result to user
162
        else:
6491.1.5 by Jelmer Vernooij
Add Repository.verify_revision_signatures.
163
            write(gpg.valid_commits_message(count))
164
            if verbose:
7143.15.2 by Jelmer Vernooij
Run autopep8.
165
                for message in gpg.verbose_valid_message(result):
166
                    write_verbose(message)
6491.1.5 by Jelmer Vernooij
Add Repository.verify_revision_signatures.
167
            write(gpg.expired_commit_message(count))
168
            if verbose:
7143.15.2 by Jelmer Vernooij
Run autopep8.
169
                for message in gpg.verbose_expired_key_message(result, repo):
170
                    write_verbose(message)
6491.1.5 by Jelmer Vernooij
Add Repository.verify_revision_signatures.
171
            write(gpg.unknown_key_message(count))
172
            if verbose:
173
                for message in gpg.verbose_missing_key_message(result):
5971.1.75 by Jonathan Riddell
fix verbose messages, now return a list
174
                    write_verbose(message)
6491.1.5 by Jelmer Vernooij
Add Repository.verify_revision_signatures.
175
            write(gpg.commit_not_valid_message(count))
5971.1.74 by Jonathan Riddell
formatting changes necessary for qbzr
176
            if verbose:
6491.1.5 by Jelmer Vernooij
Add Repository.verify_revision_signatures.
177
                for message in gpg.verbose_not_valid_message(result, repo):
7143.15.2 by Jelmer Vernooij
Run autopep8.
178
                    write_verbose(message)
6491.1.5 by Jelmer Vernooij
Add Repository.verify_revision_signatures.
179
            write(gpg.commit_not_signed_message(count))
5971.1.74 by Jonathan Riddell
formatting changes necessary for qbzr
180
            if verbose:
6491.1.5 by Jelmer Vernooij
Add Repository.verify_revision_signatures.
181
                for message in gpg.verbose_not_signed_message(result, repo):
5971.1.75 by Jonathan Riddell
fix verbose messages, now return a list
182
                    write_verbose(message)
5971.1.2 by Jonathan Riddell
give result to user
183
            return 1