14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
"""Command that signs unsigned commits by the current user. """
19
from __future__ import absolute_import
17
"""Command which looks for unsigned commits by the current user, and signs them.
20
from bzrlib.lazy_import import lazy_import
21
lazy_import(globals(), """
25
repository as _mod_repository,
26
revision as _mod_revision,
28
from .commands import Command
29
from .option import Option
30
from .i18n import gettext, ngettext
31
from .sixish import text_type
26
from bzrlib.bzrdir import BzrDir
28
from bzrlib.commands import Command
29
from bzrlib.option import Option
34
32
class cmd_sign_my_commits(Command):
48
help='Don\'t actually sign anything, just print'
49
' the revisions that would be signed.'),
46
help='Don\'t actually sign anything, just print'
47
' the revisions that would be signed.'),
51
49
takes_args = ['location?', 'committer?']
53
51
def run(self, location=None, committer=None, dry_run=False):
54
52
if location is None:
55
bzrdir = controldir.ControlDir.open_containing('.')[0]
53
bzrdir = BzrDir.open_containing('.')[0]
57
55
# Passed in locations should be exact
58
bzrdir = controldir.ControlDir.open(location)
56
bzrdir = BzrDir.open(location)
59
57
branch = bzrdir.open_branch()
60
58
repo = branch.repository
61
branch_config = branch.get_config_stack()
59
branch_config = branch.get_config()
63
61
if committer is None:
64
committer = branch_config.get('email')
62
committer = branch_config.username()
65
63
gpg_strategy = gpg.GPGStrategy(branch_config)
68
with repo.lock_write():
69
graph = repo.get_graph()
70
with _mod_repository.WriteGroup(repo):
71
for rev_id, parents in graph.iter_ancestry(
72
[branch.last_revision()]):
73
if _mod_revision.is_null(rev_id):
68
repo.start_write_group()
70
for rev_id in repo.get_ancestry(branch.last_revision())[1:]:
78
71
if repo.has_signature_for_revision_id(rev_id):
80
73
rev = repo.get_revision(rev_id)
83
76
# We have a revision without a signature who has a
84
77
# matching committer, start signing
85
self.outf.write("%s\n" % rev_id)
88
81
repo.sign_revision(rev_id, gpg_strategy)
90
ngettext('Signed %d revision.\n', 'Signed %d revisions.\n',
94
class cmd_verify_signatures(Command):
95
__doc__ = """Verify all commit signatures.
97
Verifies that all commits in the branch are signed by known GnuPG keys.
101
Option('acceptable-keys',
102
help='Comma separated list of GPG key patterns which are'
103
' acceptable for verification.',
109
takes_args = ['location?']
111
def run(self, acceptable_keys=None, revision=None, verbose=None,
113
bzrdir = controldir.ControlDir.open_containing(location)[0]
114
branch = bzrdir.open_branch()
115
repo = branch.repository
116
branch_config = branch.get_config_stack()
117
gpg_strategy = gpg.GPGStrategy(branch_config)
119
gpg_strategy.set_acceptable_keys(acceptable_keys)
122
self.outf.write(string + "\n")
124
def write_verbose(string):
125
self.outf.write(" " + string + "\n")
127
self.add_cleanup(repo.lock_read().unlock)
128
# get our list of revisions
130
if revision is not None:
131
if len(revision) == 1:
132
revno, rev_id = revision[0].in_history(branch)
133
revisions.append(rev_id)
134
elif len(revision) == 2:
135
from_revno, from_revid = revision[0].in_history(branch)
136
to_revno, to_revid = revision[1].in_history(branch)
138
to_revno = branch.revno()
139
if from_revno is None or to_revno is None:
140
raise errors.BzrCommandError(
141
gettext('Cannot verify a range of non-revision-history'
143
for revno in range(from_revno, to_revno + 1):
144
revisions.append(branch.get_rev_id(revno))
146
# all revisions by default including merges
147
graph = repo.get_graph()
149
for rev_id, parents in graph.iter_ancestry(
150
[branch.last_revision()]):
151
if _mod_revision.is_null(rev_id):
156
revisions.append(rev_id)
157
count, result, all_verifiable = gpg.bulk_verify_signatures(
158
repo, revisions, gpg_strategy)
160
write(gettext("All commits signed with verifiable keys"))
162
for message in gpg.verbose_valid_message(result):
163
write_verbose(message)
166
write(gpg.valid_commits_message(count))
168
for message in gpg.verbose_valid_message(result):
169
write_verbose(message)
170
write(gpg.expired_commit_message(count))
172
for message in gpg.verbose_expired_key_message(result, repo):
173
write_verbose(message)
174
write(gpg.unknown_key_message(count))
176
for message in gpg.verbose_missing_key_message(result):
177
write_verbose(message)
178
write(gpg.commit_not_valid_message(count))
180
for message in gpg.verbose_not_valid_message(result, repo):
181
write_verbose(message)
182
write(gpg.commit_not_signed_message(count))
184
for message in gpg.verbose_not_signed_message(result, repo):
185
write_verbose(message)
83
repo.abort_write_group()
86
repo.commit_write_group()
89
print 'Signed %d revisions' % (count,)