~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to __init__.py

  • Committer: Robey Pointer
  • Date: 2007-09-03 07:32:18 UTC
  • mto: (140.2.1 merge-robey)
  • mto: This revision was merged to the branch mainline in revision 142.
  • Revision ID: robey@lag.net-20070903073218-q18oindx5n8d02fh
unfiled bug that i just noticed today:
the 'changes' cache was storing revnos for changes' parents.  as with all
the previous places we removed revno from the cache, it's no good here,
because the cache may be shared among multiple branches in a single
repository, each with different ideas of what revno a particular revision
is.  so stop caching the revnos and generate them at runtime.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright 2009, 2010, 2011 Canonical Ltd
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
 
 
17
 
 
18
 
# This file allows loggerhead to be treated as a plugin for bzr.
19
 
#
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
 
"""
32
 
 
33
 
from info import (
34
 
    bzr_plugin_version as version_info,
35
 
    bzr_compatible_versions,
36
 
    )
37
 
 
38
 
if __name__ == 'bzrlib.plugins.loggerhead':
39
 
    import bzrlib
40
 
    from bzrlib.api import require_any_api
41
 
    from bzrlib import commands
42
 
 
43
 
    require_any_api(bzrlib, bzr_compatible_versions)
44
 
 
45
 
    # NB: Normally plugins should lazily load almost everything, but this
46
 
    # seems reasonable to have in-line here: bzrlib.commands and options are
47
 
    # normally loaded, and the rest of loggerhead won't be loaded until serve
48
 
    # --http is run.
49
 
 
50
 
    # transport_server_registry was added in bzr 1.16. When we drop support for
51
 
    # older releases, we can remove the code to override cmd_serve.
52
 
 
53
 
    try:
54
 
        from bzrlib.transport import transport_server_registry
55
 
    except ImportError:
56
 
        transport_server_registry = None
57
 
 
58
 
    DEFAULT_HOST = '0.0.0.0'
59
 
    DEFAULT_PORT = 8080
60
 
    HELP = ('Loggerhead, a web-based code viewer and server. (default port: %d)' %
61
 
            (DEFAULT_PORT,))
62
 
 
63
 
    def setup_logging(config):
64
 
        import logging
65
 
        import sys
66
 
 
67
 
        logger = logging.getLogger('loggerhead')
68
 
        handler = logging.StreamHandler(sys.stderr)
69
 
        handler.setLevel(logging.DEBUG)
70
 
        logger.addHandler(handler)
71
 
        logging.getLogger('simpleTAL').addHandler(handler)
72
 
        logging.getLogger('simpleTALES').addHandler(handler)
73
 
 
74
 
 
75
 
    def _ensure_loggerhead_path():
76
 
        """Ensure that you can 'import loggerhead' and get the root."""
77
 
        # loggerhead internal code will try to 'import loggerhead', so
78
 
        # let's put it on the path if we can't find it in the existing path
79
 
        try:
80
 
            import loggerhead.apps.transport
81
 
        except ImportError:
82
 
            import os.path, sys
83
 
            sys.path.append(os.path.dirname(__file__))
84
 
 
85
 
    def serve_http(transport, host=None, port=None, inet=None):
86
 
        from paste.httpexceptions import HTTPExceptionHandler
87
 
        from paste.httpserver import serve
88
 
 
89
 
        _ensure_loggerhead_path()
90
 
 
91
 
        from loggerhead.apps.transport import BranchesFromTransportRoot
92
 
        from loggerhead.config import LoggerheadConfig
93
 
 
94
 
        if host is None:
95
 
            host = DEFAULT_HOST
96
 
        if port is None:
97
 
            port = DEFAULT_PORT
98
 
        argv = ['--host', host, '--port', str(port), '--', transport.base]
99
 
        if not transport.is_readonly():
100
 
            argv.insert(0, '--allow-writes')
101
 
        config = LoggerheadConfig(argv)
102
 
        setup_logging(config)
103
 
        app = BranchesFromTransportRoot(transport.base, config)
104
 
        app = HTTPExceptionHandler(app)
105
 
        serve(app, host=host, port=port)
106
 
 
107
 
    if transport_server_registry is not None:
108
 
        transport_server_registry.register('http', serve_http, help=HELP)
109
 
    else:
110
 
        import bzrlib.builtins
111
 
        from bzrlib.option import Option
112
 
 
113
 
        _original_command = commands.get_cmd_object('serve')
114
 
 
115
 
        class cmd_serve(bzrlib.builtins.cmd_serve):
116
 
            __doc__ = _original_command.__doc__
117
 
 
118
 
            takes_options = _original_command.takes_options + [
119
 
                Option('http', help=HELP)]
120
 
 
121
 
            def run(self, *args, **kw):
122
 
                if 'http' in kw:
123
 
                    from bzrlib.transport import get_transport
124
 
                    allow_writes = kw.get('allow_writes', False)
125
 
                    path = kw.get('directory', '.')
126
 
                    port = kw.get('port', DEFAULT_PORT)
127
 
                    # port might be an int already...
128
 
                    if isinstance(port, basestring) and ':' in port:
129
 
                        host, port = port.split(':')
130
 
                    else:
131
 
                        host = DEFAULT_HOST
132
 
                    if allow_writes:
133
 
                        transport = get_transport(path)
134
 
                    else:
135
 
                        transport = get_transport('readonly+' + path)
136
 
                    serve_http(transport, host, port)
137
 
                else:
138
 
                    super(cmd_serve, self).run(*args, **kw)
139
 
 
140
 
        commands.register_command(cmd_serve)
141
 
 
142
 
    class cmd_load_test_loggerhead(commands.Command):
143
 
        """Run a load test against a live loggerhead instance.
144
 
        """
145
 
 
146
 
        def run(self):
147
 
            from bzrlib.plugins.loggerhead.loggerhead import load_test
148
 
            load_test.run()
149
 
 
150
 
    def load_tests(standard_tests, module, loader):
151
 
        _ensure_loggerhead_path()
152
 
        standard_tests.addTests(loader.loadTestsFromModuleNames(
153
 
            ['bzrlib.plugins.loggerhead.loggerhead.tests']))
154
 
        return standard_tests