~loggerhead-team/loggerhead/trunk-rich

262.2.1 by Martin Pool
Stub code to allow loggerhead to load as a plugin
1
# Copyright 2009 Canonical Ltd
262.2.4 by Martin Pool
Act as a plugin only when loaded by bzr; update docs
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
262.2.1 by Martin Pool
Stub code to allow loggerhead to load as a plugin
17
18
# This file allows loggerhead to be treated as a plugin for bzr.
19
#
262.2.4 by Martin Pool
Act as a plugin only when loaded by bzr; update docs
20
# XXX: Because loggerhead already contains a loggerhead directory, much of the
21
# code is going to appear loaded at bzrlib.plugins.loggerhead.loggerhead.
22
# This seems like the easiest thing, because bzrlib wants the top-level plugin
23
# directory to be the module, but when it's used as a library people expect
24
# the source directory to contain a directory called loggerhead.  -- mbp
25
# 20090123
26
27
"""Loggerhead web viewer for Bazaar branches.
28
29
This provides a new option "--http" to the "bzr serve" command, that 
30
starts a web server to browse the contents of a branch.
31
"""
262.2.1 by Martin Pool
Stub code to allow loggerhead to load as a plugin
32
384 by Martin Albisetti
Release 1.17
33
version_info = (1, 17, 0)
262.2.2 by Martin Pool
Merge in 'serve --http' based on code from mwh
34
262.2.4 by Martin Pool
Act as a plugin only when loaded by bzr; update docs
35
if __name__ == 'bzrlib.plugins.loggerhead':
36
    import bzrlib
262.2.5 by Martin Pool
This loggerhead will work with bzr 1.13
37
    from bzrlib.api import require_any_api
262.2.4 by Martin Pool
Act as a plugin only when loaded by bzr; update docs
38
386 by Matt Nordhoff
Mark Loggerhead plugin as compatible with up to bzr 2.1.0.
39
    require_any_api(bzrlib, [
40
        (1, 13, 0), (1, 15, 0), (1, 16, 0), (1, 17, 0), (1, 18, 0),
41
        (2, 0, 0), (2, 1, 0)])
262.2.4 by Martin Pool
Act as a plugin only when loaded by bzr; update docs
42
43
    # NB: Normally plugins should lazily load almost everything, but this
44
    # seems reasonable to have in-line here: bzrlib.commands and options are
45
    # normally loaded, and the rest of loggerhead won't be loaded until serve
46
    # --http is run.
360 by Martin Albisetti
Avoid diluting sys.path if loggerhead is installed systemwide, install loggerhead as a plugin (Jelmer Vernooij)
47
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
48
    # transport_server_registry was added in bzr 1.16. When we drop support for
49
    # older releases, we can remove the code to override cmd_serve.
50
51
    try:
52
        from bzrlib.transport import transport_server_registry
53
    except ImportError:
54
        transport_server_registry = None
55
56
    DEFAULT_HOST = '0.0.0.0'
262.2.4 by Martin Pool
Act as a plugin only when loaded by bzr; update docs
57
    DEFAULT_PORT = 8080
360 by Martin Albisetti
Avoid diluting sys.path if loggerhead is installed systemwide, install loggerhead as a plugin (Jelmer Vernooij)
58
    HELP = ('Loggerhead, a web-based code viewer and server. (default port: %d)' %
352.4.3 by Matt Nordhoff
Better line-wrapping
59
            (DEFAULT_PORT,))
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
60
61
    def serve_http(transport, host=None, port=None, inet=None):
62
        # loggerhead internal code will try to 'import loggerhead', so
359.1.2 by Jelmer Vernooij
Avoid diluting sys.path if loggerhead is installed systemwide.
63
        # let's put it on the path if we can't find it in the existing path
64
        try:
65
            import loggerhead
66
        except ImportError:
67
            import os.path, sys
68
            sys.path.append(os.path.dirname(__file__))
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
69
70
        from loggerhead.apps.transport import BranchesFromTransportRoot
71
        from loggerhead.config import LoggerheadConfig
72
        from paste.httpexceptions import HTTPExceptionHandler
73
        from paste.httpserver import serve
74
        if host is None:
75
            host = DEFAULT_HOST
76
        if port is None:
77
            port = DEFAULT_PORT
359.2.2 by Matt Nordhoff
Fix a stupid mistake constructing argv
78
        argv = ['--host', host, '--port', str(port), '--', transport.base]
79
        if not transport.is_readonly():
80
            argv.insert(0, '--allow-writes')
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
81
        config = LoggerheadConfig(argv)
388 by Matt Nordhoff
serve_http was passing a transport to BranchesFromTransportRoot, not an URL.
82
        app = BranchesFromTransportRoot(transport.base, config)
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
83
        app = HTTPExceptionHandler(app)
84
        serve(app, host=host, port=port)
85
86
    if transport_server_registry is not None:
87
        transport_server_registry.register('http', serve_http, help=HELP)
88
    else:
89
        import bzrlib.builtins
90
        from bzrlib.commands import get_cmd_object, register_command
91
        from bzrlib.option import Option
92
93
        _original_command = get_cmd_object('serve')
94
95
        class cmd_serve(bzrlib.builtins.cmd_serve):
96
            __doc__ = _original_command.__doc__
97
98
            takes_options = _original_command.takes_options + [
99
                Option('http', help=HELP)]
100
101
            def run(self, *args, **kw):
102
                if 'http' in kw:
103
                    from bzrlib.transport import get_transport
359.2.1 by Matt Nordhoff
Add an --allow-writes option to serve-branches and "bzr serve"
104
                    allow_writes = kw.get('allow_writes', False)
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
105
                    path = kw.get('directory', '.')
106
                    port = kw.get('port', DEFAULT_PORT)
107
                    # port might be an int already...
108
                    if isinstance(port, basestring) and ':' in port:
109
                        host, port = port.split(':')
110
                    else:
111
                        host = DEFAULT_HOST
359.2.1 by Matt Nordhoff
Add an --allow-writes option to serve-branches and "bzr serve"
112
                    if allow_writes:
113
                        transport = get_transport(path)
114
                    else:
115
                        transport = get_transport('readonly+' + path)
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
116
                    serve_http(transport, host, port)
262.2.4 by Martin Pool
Act as a plugin only when loaded by bzr; update docs
117
                else:
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
118
                    super(cmd_serve, self).run(*args, **kw)
262.2.2 by Martin Pool
Merge in 'serve --http' based on code from mwh
119
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
120
        register_command(cmd_serve)