/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
3251.4.2 by Aaron Bentley
Clean up Launchpad directory service code
1
# Copyright (C) 2006 - 2008 Canonical Ltd
0.4.1 by Martin Pool
Start lp-register command
2
#
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.
7
#
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.
12
#
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
0.4.1 by Martin Pool
Start lp-register command
16
2898.3.8 by James Henstridge
Get rid of relative imports in Launchpad plugin.
17
"""Launchpad.net integration plugin for Bazaar."""
0.4.1 by Martin Pool
Start lp-register command
18
0.4.17 by Martin Pool
Allow xmlrpc service url to be overridden by $BZR_LP_XMLRPC_URL
19
# The XMLRPC server address can be overridden by setting the environment
20
# variable $BZR_LP_XMLRPL_URL
21
0.4.9 by Martin Pool
Don't transmit non-standard xmlrpc <nil> value.
22
# see http://bazaar-vcs.org/Specs/BranchRegistrationTool
23
4283.3.1 by Vincent Ladeuil
Make built-in plugins display the same version than bzrlib.
24
# Since we are a built-in plugin we share the bzrlib version
25
from bzrlib import version_info
26
4031.2.11 by John Arbash Meinel
Turn a bunch of imports into lazy imports.
27
from bzrlib.lazy_import import lazy_import
28
lazy_import(globals(), """
4031.2.7 by Jonathan Lange
Move the imports to the top of the module.
29
import webbrowser
30
4031.2.11 by John Arbash Meinel
Turn a bunch of imports into lazy imports.
31
from bzrlib import (
32
    branch as _mod_branch,
33
    trace,
34
    )
35
""")
36
0.4.1 by Martin Pool
Start lp-register command
37
from bzrlib.commands import Command, Option, register_command
3251.4.1 by Aaron Bentley
Convert LP transport into directory service
38
from bzrlib.directory_service import directories
4031.2.5 by Jonathan Lange
Refactor the code so we don't do too many remote requests.
39
from bzrlib.errors import (
40
    BzrCommandError,
41
    InvalidURL,
42
    NoPublicBranch,
43
    NotBranchError,
44
    )
2245.8.6 by Martin Pool
Documentation under 'help launchpad'
45
from bzrlib.help_topics import topic_registry
4031.2.7 by Jonathan Lange
Move the imports to the top of the module.
46
from bzrlib.plugins.launchpad.lp_registration import (
47
    LaunchpadService,
48
    NotLaunchpadBranch,
49
    )
0.4.4 by Martin Pool
Start forming xmlrpc requests
50
51
0.4.2 by Martin Pool
Rename command to 'register-branch'
52
class cmd_register_branch(Command):
53
    """Register a branch with launchpad.net.
0.4.1 by Martin Pool
Start lp-register command
54
55
    This command lists a bzr branch in the directory of branches on
2400.2.4 by Robert Collins
(robertc) Typo in the help for ``register-branch`` fixed. (Robert Collins, #96770)
56
    launchpad.net.  Registration allows the branch to be associated with
0.4.1 by Martin Pool
Start lp-register command
57
    bugs or specifications.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
58
0.4.15 by Martin Pool
(register-branch) Add command-line options
59
    Before using this command you must register the product to which the
0.4.1 by Martin Pool
Start lp-register command
60
    branch belongs, and create an account for yourself on launchpad.net.
0.4.3 by Martin Pool
More command line processing
61
62
    arguments:
3200.2.3 by Robert Collins
Tweak wording.
63
        public_url: The publicly visible url for the branch to register.
3200.2.1 by Robert Collins
* The ``register-branch`` command will now use the public url of the branch
64
                    This must be an http or https url (which Launchpad can read
65
                    from to access the branch). Local file urls, SFTP urls, and
66
                    bzr+ssh urls will not work.
67
                    If no public_url is provided, bzr will use the configured
3200.2.3 by Robert Collins
Tweak wording.
68
                    public_url if there is one for the current branch, and
69
                    otherwise error.
0.4.3 by Martin Pool
More command line processing
70
71
    example:
0.4.15 by Martin Pool
(register-branch) Add command-line options
72
        bzr register-branch http://foo.com/bzr/fooproduct.mine \\
73
                --product fooproduct
0.4.1 by Martin Pool
Start lp-register command
74
    """
3200.2.1 by Robert Collins
* The ``register-branch`` command will now use the public url of the branch
75
    takes_args = ['public_url?']
2598.1.1 by Martin Pool
Add test for and documentation of option style, fix up existing options to comply
76
    takes_options = [
77
         Option('product',
78
                'Launchpad product short name to associate with the branch.',
0.4.15 by Martin Pool
(register-branch) Add command-line options
79
                unicode),
80
         Option('branch-name',
2598.1.1 by Martin Pool
Add test for and documentation of option style, fix up existing options to comply
81
                'Short name for the branch; '
82
                'by default taken from the last component of the url.',
0.4.15 by Martin Pool
(register-branch) Add command-line options
83
                unicode),
84
         Option('branch-title',
2598.1.1 by Martin Pool
Add test for and documentation of option style, fix up existing options to comply
85
                'One-sentence description of the branch.',
0.4.15 by Martin Pool
(register-branch) Add command-line options
86
                unicode),
87
         Option('branch-description',
2598.1.5 by Martin Pool
Fix one more option message.
88
                'Longer description of the purpose or contents of the branch.',
0.4.15 by Martin Pool
(register-branch) Add command-line options
89
                unicode),
2598.1.1 by Martin Pool
Add test for and documentation of option style, fix up existing options to comply
90
         Option('author',
91
                "Branch author's email address, if not yourself.",
0.4.16 by Martin Pool
(register-branch) Add --author option and respect --dry-run
92
                unicode),
0.4.19 by test at canonical
add possibility to link to a bug when registering a branch. factor out some common functionality from BranchRegistrationRequest.
93
         Option('link-bug',
2598.1.1 by Martin Pool
Add test for and documentation of option style, fix up existing options to comply
94
                'The bug this branch fixes.',
0.4.19 by test at canonical
add possibility to link to a bug when registering a branch. factor out some common functionality from BranchRegistrationRequest.
95
                int),
0.4.15 by Martin Pool
(register-branch) Add command-line options
96
         Option('dry-run',
2598.1.1 by Martin Pool
Add test for and documentation of option style, fix up existing options to comply
97
                'Prepare the request but don\'t actually send it.')
0.4.15 by Martin Pool
(register-branch) Add command-line options
98
        ]
99
100
3200.2.1 by Robert Collins
* The ``register-branch`` command will now use the public url of the branch
101
    def run(self,
102
            public_url=None,
1668.1.12 by Martin Pool
(launchpad plugin) Improved --dry-run that uses a dummy xmlrpc service.
103
            product='',
0.4.15 by Martin Pool
(register-branch) Add command-line options
104
            branch_name='',
105
            branch_title='',
106
            branch_description='',
0.4.16 by Martin Pool
(register-branch) Add --author option and respect --dry-run
107
            author='',
0.4.19 by test at canonical
add possibility to link to a bug when registering a branch. factor out some common functionality from BranchRegistrationRequest.
108
            link_bug=None,
0.4.15 by Martin Pool
(register-branch) Add command-line options
109
            dry_run=False):
2898.3.8 by James Henstridge
Get rid of relative imports in Launchpad plugin.
110
        from bzrlib.plugins.launchpad.lp_registration import (
1668.1.12 by Martin Pool
(launchpad plugin) Improved --dry-run that uses a dummy xmlrpc service.
111
            LaunchpadService, BranchRegistrationRequest, BranchBugLinkRequest,
112
            DryRunLaunchpadService)
3200.2.1 by Robert Collins
* The ``register-branch`` command will now use the public url of the branch
113
        if public_url is None:
114
            try:
4031.2.11 by John Arbash Meinel
Turn a bunch of imports into lazy imports.
115
                b = _mod_branch.Branch.open_containing('.')[0]
3200.2.1 by Robert Collins
* The ``register-branch`` command will now use the public url of the branch
116
            except NotBranchError:
117
                raise BzrCommandError('register-branch requires a public '
118
                    'branch url - see bzr help register-branch.')
119
            public_url = b.get_public_branch()
120
            if public_url is None:
121
                raise NoPublicBranch(b)
122
123
        rego = BranchRegistrationRequest(branch_url=public_url,
0.4.15 by Martin Pool
(register-branch) Add command-line options
124
                                         branch_name=branch_name,
125
                                         branch_title=branch_title,
126
                                         branch_description=branch_description,
127
                                         product_name=product,
0.4.16 by Martin Pool
(register-branch) Add --author option and respect --dry-run
128
                                         author_email=author,
0.4.15 by Martin Pool
(register-branch) Add command-line options
129
                                         )
3200.2.1 by Robert Collins
* The ``register-branch`` command will now use the public url of the branch
130
        linko = BranchBugLinkRequest(branch_url=public_url,
0.4.19 by test at canonical
add possibility to link to a bug when registering a branch. factor out some common functionality from BranchRegistrationRequest.
131
                                     bug_id=link_bug)
1668.1.12 by Martin Pool
(launchpad plugin) Improved --dry-run that uses a dummy xmlrpc service.
132
        if not dry_run:
133
            service = LaunchpadService()
134
            # This gives back the xmlrpc url that can be used for future
135
            # operations on the branch.  It's not so useful to print to the
136
            # user since they can't do anything with it from a web browser; it
137
            # might be nice for the server to tell us about an html url as
138
            # well.
139
        else:
140
            # Run on service entirely in memory
141
            service = DryRunLaunchpadService()
0.4.19 by test at canonical
add possibility to link to a bug when registering a branch. factor out some common functionality from BranchRegistrationRequest.
142
        service.gather_user_credentials()
1668.1.12 by Martin Pool
(launchpad plugin) Improved --dry-run that uses a dummy xmlrpc service.
143
        branch_object_url = rego.submit(service)
144
        if link_bug:
145
            link_bug_url = linko.submit(service)
146
        print 'Branch registered.'
0.4.1 by Martin Pool
Start lp-register command
147
0.4.2 by Martin Pool
Rename command to 'register-branch'
148
register_command(cmd_register_branch)
2245.8.4 by Martin Pool
lp:/// indirection works
149
2898.3.3 by James Henstridge
Add launchpad-login command.
150
3955.3.5 by Jonathan Lange
Add an untested plugin, make the error handling a little nicer.
151
class cmd_launchpad_open(Command):
152
    """Open a Launchpad branch page in your web browser."""
153
154
    aliases = ['lp-open']
3955.3.7 by Jonathan Lange
Test the launchpad-open command. Fix up some minor bugs.
155
    takes_options = [
156
        Option('dry-run',
157
               'Do not actually open the browser. Just say the URL we would '
158
               'use.'),
159
        ]
3955.3.5 by Jonathan Lange
Add an untested plugin, make the error handling a little nicer.
160
    takes_args = ['location?']
161
4031.2.5 by Jonathan Lange
Refactor the code so we don't do too many remote requests.
162
    def _possible_locations(self, location):
163
        """Yield possible external locations for the branch at 'location'."""
164
        yield location
165
        try:
4031.2.11 by John Arbash Meinel
Turn a bunch of imports into lazy imports.
166
            branch = _mod_branch.Branch.open(location)
4031.2.5 by Jonathan Lange
Refactor the code so we don't do too many remote requests.
167
        except NotBranchError:
168
            return
169
        branch_url = branch.get_public_branch()
170
        if branch_url is not None:
171
            yield branch_url
172
        branch_url = branch.get_push_location()
173
        if branch_url is not None:
174
            yield branch_url
175
176
    def _get_web_url(self, service, location):
177
        for branch_url in self._possible_locations(location):
178
            try:
179
                return service.get_web_url_from_branch_url(branch_url)
180
            except (NotLaunchpadBranch, InvalidURL):
181
                pass
182
        raise NotLaunchpadBranch(branch_url)
183
3955.3.7 by Jonathan Lange
Test the launchpad-open command. Fix up some minor bugs.
184
    def run(self, location=None, dry_run=False):
3955.3.5 by Jonathan Lange
Add an untested plugin, make the error handling a little nicer.
185
        if location is None:
186
            location = u'.'
4031.2.5 by Jonathan Lange
Refactor the code so we don't do too many remote requests.
187
        web_url = self._get_web_url(LaunchpadService(), location)
4031.2.11 by John Arbash Meinel
Turn a bunch of imports into lazy imports.
188
        trace.note('Opening %s in web browser' % web_url)
3955.3.7 by Jonathan Lange
Test the launchpad-open command. Fix up some minor bugs.
189
        if not dry_run:
190
            webbrowser.open(web_url)
3955.3.5 by Jonathan Lange
Add an untested plugin, make the error handling a little nicer.
191
192
register_command(cmd_launchpad_open)
193
194
2898.3.3 by James Henstridge
Add launchpad-login command.
195
class cmd_launchpad_login(Command):
2934.1.1 by Ian Clatworthy
(James Henstridge) add a command for managing the Launchpad user ID
196
    """Show or set the Launchpad user ID.
2898.3.3 by James Henstridge
Add launchpad-login command.
197
198
    When communicating with Launchpad, some commands need to know your
199
    Launchpad user ID.  This command can be used to set or show the
200
    user ID that Bazaar will use for such communication.
201
202
    :Examples:
203
      Show the Launchpad ID of the current user::
204
205
          bzr launchpad-login
206
2898.3.9 by James Henstridge
* Add a simple NEWS item for the command.
207
      Set the Launchpad ID of the current user to 'bob'::
2898.3.3 by James Henstridge
Add launchpad-login command.
208
2898.3.9 by James Henstridge
* Add a simple NEWS item for the command.
209
          bzr launchpad-login bob
2898.3.3 by James Henstridge
Add launchpad-login command.
210
    """
211
    aliases = ['lp-login']
212
    takes_args = ['name?']
213
    takes_options = [
2898.3.4 by James Henstridge
Cleanups from mini-review by Tim.
214
        Option('no-check',
215
               "Don't check that the user name is valid."),
2898.3.3 by James Henstridge
Add launchpad-login command.
216
        ]
217
2898.3.7 by James Henstridge
* Add tests for account.py exception messages.
218
    def run(self, name=None, no_check=False):
2898.3.8 by James Henstridge
Get rid of relative imports in Launchpad plugin.
219
        from bzrlib.plugins.launchpad import account
2898.3.3 by James Henstridge
Add launchpad-login command.
220
        check_account = not no_check
221
222
        if name is None:
223
            username = account.get_lp_login()
224
            if username:
2898.3.4 by James Henstridge
Cleanups from mini-review by Tim.
225
                if check_account:
226
                    account.check_lp_login(username)
2898.3.3 by James Henstridge
Add launchpad-login command.
227
                self.outf.write(username + '\n')
228
            else:
229
                self.outf.write('No Launchpad user ID configured.\n')
2898.3.9 by James Henstridge
* Add a simple NEWS item for the command.
230
                return 1
2898.3.3 by James Henstridge
Add launchpad-login command.
231
        else:
4216.2.1 by Michael Hudson
well this is it
232
            name = name.lower()
2898.3.3 by James Henstridge
Add launchpad-login command.
233
            if check_account:
234
                account.check_lp_login(name)
235
            account.set_lp_login(name)
236
237
register_command(cmd_launchpad_login)
238
239
3251.4.2 by Aaron Bentley
Clean up Launchpad directory service code
240
def _register_directory():
3251.4.3 by Aaron Bentley
More renames and cleanups
241
    directories.register_lazy('lp:', 'bzrlib.plugins.launchpad.lp_directory',
3251.4.2 by Aaron Bentley
Clean up Launchpad directory service code
242
                              'LaunchpadDirectory',
243
                              'Launchpad-based directory service',)
244
_register_directory()
2245.8.5 by Martin Pool
Add short-form lp:PRODUCT url form
245
0.4.1 by Martin Pool
Start lp-register command
246
247
def test_suite():
248
    """Called by bzrlib to fetch tests for this plugin"""
249
    from unittest import TestSuite, TestLoader
2898.3.8 by James Henstridge
Get rid of relative imports in Launchpad plugin.
250
    from bzrlib.plugins.launchpad import (
3955.3.7 by Jonathan Lange
Test the launchpad-open command. Fix up some minor bugs.
251
        test_account,
252
        test_lp_directory,
253
        test_lp_open,
254
        test_lp_service,
255
        test_register,
256
        )
2245.8.1 by Martin Pool
Start adding tests for launchpad indirection
257
258
    loader = TestLoader()
259
    suite = TestSuite()
3221.4.2 by Martin Pool
Add in thumpers tests for selection of the right Launchpad instance
260
    for module in [
3221.4.5 by Martin Pool
Tweak indents
261
        test_account,
262
        test_register,
3251.4.3 by Aaron Bentley
More renames and cleanups
263
        test_lp_directory,
3955.3.7 by Jonathan Lange
Test the launchpad-open command. Fix up some minor bugs.
264
        test_lp_open,
3221.4.5 by Martin Pool
Tweak indents
265
        test_lp_service,
3193.5.3 by Tim Penhey
Tweaks following review.
266
        ]:
3221.4.2 by Martin Pool
Add in thumpers tests for selection of the right Launchpad instance
267
        suite.addTests(loader.loadTestsFromModule(module))
2245.8.1 by Martin Pool
Start adding tests for launchpad indirection
268
    return suite
2245.8.6 by Martin Pool
Documentation under 'help launchpad'
269
270
_launchpad_help = """Integration with Launchpad.net
271
272
Launchpad.net provides free Bazaar branch hosting with integrated bug and
273
specification tracking.
274
3031.1.1 by jml at canonical
Expand the documentation on lp:// URLs and mention the launchpad-login command.
275
The bzr client (through the plugin called 'launchpad') has special
2245.8.6 by Martin Pool
Documentation under 'help launchpad'
276
features to communicate with Launchpad:
277
3031.1.1 by jml at canonical
Expand the documentation on lp:// URLs and mention the launchpad-login command.
278
    * The launchpad-login command tells Bazaar your Launchpad user name. This
279
      is then used by the 'lp:' transport to download your branches using
280
      bzr+ssh://.
281
4258.1.1 by James Westby
Add "--fixes lp:" to the launchpad plugin documentation.
282
    * The 'lp:' transport uses Launchpad as a directory service: for example
283
      'lp:bzr' and 'lp:python' refer to the main branches of the relevant
284
      projects and may be branched, logged, etc. You can also use the 'lp:'
285
      transport to refer to specific branches, e.g. lp:~bzr/bzr/trunk.
286
287
    * The 'lp:' bug tracker alias can expand launchpad bug numbers to their
288
      URLs for use with 'bzr commit --fixes', e.g. 'bzr commit --fixes lp:12345'
289
      will record a revision property that marks that revision as fixing
4258.1.2 by Matt Nordhoff
Fix a typo in the launchpad plugin's help
290
      Launchpad bug 12345. When you push that branch to Launchpad it will
291
      automatically be linked to the bug report.
4258.1.1 by James Westby
Add "--fixes lp:" to the launchpad plugin documentation.
292
3031.1.1 by jml at canonical
Expand the documentation on lp:// URLs and mention the launchpad-login command.
293
    * The register-branch command tells Launchpad about the url of a
2245.8.6 by Martin Pool
Documentation under 'help launchpad'
294
      public branch.  Launchpad will then mirror the branch, display
3031.1.1 by jml at canonical
Expand the documentation on lp:// URLs and mention the launchpad-login command.
295
      its contents and allow it to be attached to bugs and other
2245.8.6 by Martin Pool
Documentation under 'help launchpad'
296
      objects.
297
298
For more information see http://help.launchpad.net/
299
"""
300
topic_registry.register('launchpad',
301
    _launchpad_help,
302
    'Using Bazaar with Launchpad.net')