~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/sign_my_commits.py

  • Committer: John Arbash Meinel
  • Date: 2006-06-10 14:53:51 UTC
  • mto: (1711.7.2 win32)
  • mto: This revision was merged to the branch mainline in revision 1796.
  • Revision ID: john@arbash-meinel.com-20060610145351-9da0c1f8ba8a57e0
the _posix_* routines should use posixpath not os.path, so tests pass on win32

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006, 2007, 2009, 2010, 2011 Canonical Ltd
2
 
#
 
1
# Copyright (C) 2005, 2006 Canonical Ltd
 
2
 
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
7
 
#
 
7
 
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
11
# GNU General Public License for more details.
12
 
#
 
12
 
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
 
 
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
16
"""Command which looks for unsigned commits by the current user, and signs them.
18
17
"""
19
18
 
20
 
from bzrlib.lazy_import import lazy_import
21
 
lazy_import(globals(), """
22
 
from bzrlib import (
23
 
    bzrdir as _mod_bzrdir,
24
 
    errors,
25
 
    gpg,
26
 
    revision as _mod_revision,
27
 
    )
28
 
""")
29
19
from bzrlib.commands import Command
 
20
import bzrlib.config
 
21
import bzrlib.errors as errors
 
22
import bzrlib.gpg
30
23
from bzrlib.option import Option
31
 
from bzrlib.i18n import gettext, ngettext
 
24
 
32
25
 
33
26
class cmd_sign_my_commits(Command):
34
 
    __doc__ = """Sign all commits by a given committer.
 
27
    """Sign all commits by a given committer.
35
28
 
36
29
    If location is not specified the local tree is used.
37
30
    If committer is not specified the default committer is used.
38
31
 
39
32
    This does not sign commits that already have signatures.
40
33
    """
41
 
    # Note that this signs everything on the branch's ancestry
42
 
    # (both mainline and merged), but not other revisions that may be in the
43
 
    # repository
44
34
 
45
 
    takes_options = [
46
 
            Option('dry-run',
47
 
                   help='Don\'t actually sign anything, just print'
48
 
                        ' the revisions that would be signed.'),
49
 
            ]
 
35
    takes_options = [Option('dry-run'
 
36
                            , help='Don\'t actually sign anything, just print'
 
37
                                   ' the revisions that would be signed')
 
38
                    ]
50
39
    takes_args = ['location?', 'committer?']
51
40
 
52
41
    def run(self, location=None, committer=None, dry_run=False):
53
42
        if location is None:
54
 
            bzrdir = _mod_bzrdir.BzrDir.open_containing('.')[0]
 
43
            from bzrlib.workingtree import WorkingTree
 
44
            # Open the containing directory
 
45
            wt = WorkingTree.open_containing('.')[0]
 
46
            b = wt.branch
55
47
        else:
56
48
            # Passed in locations should be exact
57
 
            bzrdir = _mod_bzrdir.BzrDir.open(location)
58
 
        branch = bzrdir.open_branch()
59
 
        repo = branch.repository
60
 
        branch_config = branch.get_config()
 
49
            from bzrlib.branch import Branch
 
50
            b = Branch.open(location)
 
51
        repo = getattr(b, 'repository', b)
 
52
 
 
53
        config = bzrlib.config.BranchConfig(b)
61
54
 
62
55
        if committer is None:
63
 
            committer = branch_config.username()
64
 
        gpg_strategy = gpg.GPGStrategy(branch_config)
 
56
            committer = config.username()
 
57
 
 
58
        gpg_strategy = bzrlib.gpg.GPGStrategy(config)
65
59
 
66
60
        count = 0
67
61
        repo.lock_write()
68
62
        try:
69
 
            graph = repo.get_graph()
70
 
            repo.start_write_group()
71
 
            try:
72
 
                for rev_id, parents in graph.iter_ancestry(
73
 
                        [branch.last_revision()]):
74
 
                    if _mod_revision.is_null(rev_id):
75
 
                        continue
76
 
                    if parents is None:
77
 
                        # Ignore ghosts
78
 
                        continue
79
 
                    if repo.has_signature_for_revision_id(rev_id):
80
 
                        continue
81
 
                    rev = repo.get_revision(rev_id)
82
 
                    if rev.committer != committer:
83
 
                        continue
84
 
                    # We have a revision without a signature who has a
85
 
                    # matching committer, start signing
86
 
                    print rev_id
87
 
                    count += 1
88
 
                    if not dry_run:
89
 
                        repo.sign_revision(rev_id, gpg_strategy)
90
 
            except:
91
 
                repo.abort_write_group()
92
 
                raise
93
 
            else:
94
 
                repo.commit_write_group()
 
63
            # return in partial topological order for the sake of reproducibility
 
64
            for rev_id in repo.all_revision_ids():
 
65
                if repo.has_signature_for_revision_id(rev_id):
 
66
                    continue
 
67
                
 
68
                rev = repo.get_revision(rev_id)
 
69
                if rev.committer != committer:
 
70
                    continue
 
71
 
 
72
                # We have a revision without a signature who has a 
 
73
                # matching committer, start signing
 
74
                print rev_id
 
75
                count += 1
 
76
                if not dry_run:
 
77
                    repo.sign_revision(rev_id, gpg_strategy)
95
78
        finally:
96
79
            repo.unlock()
97
80
        print 'Signed %d revisions' % (count,)
98
81
 
99
82
 
100
 
class cmd_verify_signatures(Command):
101
 
    __doc__ = """Verify all commit signatures.
102
 
 
103
 
    Verifies that all commits in the branch are signed by known GnuPG keys.
104
 
    """
105
 
 
106
 
    takes_options = [
107
 
            Option('acceptable-keys',
108
 
                   help='Comma separated list of GPG key patterns which are'
109
 
                        ' acceptable for verification.',
110
 
                   short_name='k',
111
 
                   type=str,),
112
 
            'revision', 
113
 
            'verbose',
114
 
          ]
115
 
    takes_args = ['location?']
116
 
 
117
 
    def run(self, acceptable_keys=None, revision=None, verbose=None,
118
 
                                                            location=u'.'):
119
 
        bzrdir = _mod_bzrdir.BzrDir.open_containing(location)[0]
120
 
        branch = bzrdir.open_branch()
121
 
        repo = branch.repository
122
 
        branch_config = branch.get_config()
123
 
        gpg_strategy = gpg.GPGStrategy(branch_config)
124
 
 
125
 
        gpg_strategy.set_acceptable_keys(acceptable_keys)
126
 
 
127
 
        def write(string):
128
 
            self.outf.write(string + "\n")
129
 
        def write_verbose(string):
130
 
            self.outf.write("  " + string + "\n")
131
 
 
132
 
        #get our list of revisions
133
 
        revisions = []
134
 
        if revision is not None:
135
 
            if len(revision) == 1:
136
 
                revno, rev_id = revision[0].in_history(branch)
137
 
                revisions.append(rev_id)
138
 
            elif len(revision) == 2:
139
 
                from_revno, from_revid = revision[0].in_history(branch)
140
 
                to_revno, to_revid = revision[1].in_history(branch)
141
 
                if to_revid is None:
142
 
                    to_revno = branch.revno()
143
 
                if from_revno is None or to_revno is None:
144
 
                    raise errors.BzrCommandError(gettext(
145
 
                    'Cannot verify a range of non-revision-history revisions'))
146
 
                for revno in range(from_revno, to_revno + 1):
147
 
                    revisions.append(branch.get_rev_id(revno))
148
 
        else:
149
 
            #all revisions by default including merges
150
 
            graph = repo.get_graph()
151
 
            revisions = []
152
 
            repo.lock_read()
153
 
            for rev_id, parents in graph.iter_ancestry(
154
 
                    [branch.last_revision()]):
155
 
                if _mod_revision.is_null(rev_id):
156
 
                    continue
157
 
                if parents is None:
158
 
                    # Ignore ghosts
159
 
                    continue
160
 
                revisions.append(rev_id)
161
 
            repo.unlock()
162
 
        count, result, all_verifiable =\
163
 
                                gpg_strategy.do_verifications(revisions, repo)
164
 
        if all_verifiable:
165
 
               write(gettext(
166
 
                            "All commits signed with verifiable keys"))
167
 
               if verbose:
168
 
                   write(gpg_strategy.verbose_valid_message(result))
169
 
               return 0
170
 
        else:
171
 
            write(gpg_strategy.valid_commits_message(count))
172
 
            if verbose:
173
 
               for message in gpg_strategy.verbose_valid_message(result):
174
 
                   write_verbose(message)
175
 
            write(gpg_strategy.expired_commit_message(count))
176
 
            if verbose:
177
 
               for message in gpg_strategy.verbose_expired_key_message(result,
178
 
                                                                          repo):
179
 
                   write_verbose(message)
180
 
            write(gpg_strategy.unknown_key_message(count))
181
 
            if verbose:
182
 
                for message in gpg_strategy.verbose_missing_key_message(result):
183
 
                    write_verbose(message)
184
 
            write(gpg_strategy.commit_not_valid_message(count))
185
 
            if verbose:
186
 
                for message in gpg_strategy.verbose_not_valid_message(result,
187
 
                                                                        repo):
188
 
                   write_verbose(message)
189
 
            write(gpg_strategy.commit_not_signed_message(count))
190
 
            if verbose:
191
 
                for message in gpg_strategy.verbose_not_signed_message(result,
192
 
                                                                          repo):
193
 
                    write_verbose(message)
194
 
            return 1