~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to serve-branches

  • Committer: Michael Hudson
  • Date: 2009-03-02 05:44:20 UTC
  • Revision ID: michael.hudson@canonical.com-20090302054420-rb67u40azt5b80bi
so it turns out that doing the whitespace compression when we load the template
works just as well as doing it when we generate the content, so do it then.
this makes me less worried about mangling whitespace in user content...

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#
2
 
# Copyright (C) 2008, 2009 Canonical Ltd
3
 
#
 
1
#!/usr/bin/env python
4
2
# This program is free software; you can redistribute it and/or modify
5
3
# it under the terms of the GNU General Public License as published by
6
4
# the Free Software Foundation; either version 2 of the License, or
21
19
import os
22
20
import sys
23
21
 
 
22
from optparse import OptionParser
 
23
 
24
24
from bzrlib.plugin import load_plugins
25
25
 
26
26
from paste import httpserver
28
28
from paste.translogger import TransLogger
29
29
 
30
30
from loggerhead import __version__
31
 
from loggerhead.apps.transport import (
32
 
    BranchesFromTransportRoot, UserBranchesFromTransportRoot)
33
 
from loggerhead.config import LoggerheadConfig
 
31
from loggerhead.apps.filesystem import (
 
32
    BranchesFromFileSystemRoot, UserBranchesFromFileSystemRoot)
34
33
from loggerhead.util import Reloader
35
34
from loggerhead.apps.error import ErrorHandlerApp
36
35
 
37
36
 
38
 
def get_config_and_path(args):
39
 
    config = LoggerheadConfig(args)
40
 
 
41
 
    if config.get_option('show_version'):
42
 
        print "loggerhead %s" % (__version__,)
 
37
def command_line_parser():
 
38
    parser = OptionParser("%prog [options] <path>")
 
39
    parser.set_defaults(
 
40
        user_dirs=False,
 
41
        show_version=False,
 
42
        log_folder=None,
 
43
        )
 
44
    parser.add_option("--user-dirs", action="store_true", dest="user_dirs",
 
45
                      help="Serve user directories as ~user.")
 
46
    parser.add_option("--trunk-dir", metavar="DIR",
 
47
                      help="The directory that contains the trunk branches.")
 
48
    parser.add_option("--port", dest="user_port",
 
49
                      help=("Port Loggerhead should listen on "
 
50
                            "(defaults to 8080)."))
 
51
    parser.add_option("--host", dest="user_host",
 
52
                      help="Host Loggerhead should listen on.")
 
53
    parser.add_option("--prefix", dest="user_prefix",
 
54
                      help="Specify host prefix.")
 
55
    parser.add_option("--profile", action="store_true", dest="profile",
 
56
                      help="Generate callgrind profile data to "
 
57
                        "%d-stats.callgrind on each request.")
 
58
    parser.add_option("--reload", action="store_true", dest="reload",
 
59
                      help="Restarts the application when changing python"
 
60
                           " files. Only used for development purposes.")
 
61
    parser.add_option('--log-folder', dest="log_folder",
 
62
                      type=str, help="The directory to place log files in.")
 
63
    parser.add_option("--version", action="store_true", dest="show_version",
 
64
                      help="Print the software version and exit")
 
65
    return parser
 
66
 
 
67
 
 
68
def main(args):
 
69
    parser = command_line_parser()
 
70
    (options, args) = parser.parse_args(sys.argv[1:])
 
71
 
 
72
    if options.show_version:
 
73
        print "loggerhead %s" % __version__
43
74
        sys.exit(0)
44
75
 
45
 
    if config.arg_count > 1:
46
 
        config.print_help()
47
 
        sys.exit(1)
48
 
    elif config.arg_count == 1:
49
 
        base = config.get_arg(0)
50
 
    else:
51
 
        base = '.'
52
 
 
53
 
    if not config.get_option('allow_writes'):
54
 
        base = 'readonly+' + base
55
 
 
56
 
    return config, base
57
 
 
58
 
 
59
 
def setup_logging(config):
 
76
    if len(args) > 1:
 
77
        parser.print_help()
 
78
        sys.exit(1)
 
79
    elif len(args) == 1:
 
80
        [path] = args
 
81
    else:
 
82
        path = '.'
 
83
 
 
84
    if not os.path.isdir(path):
 
85
        print "%s is not a directory" % path
 
86
        sys.exit(1)
 
87
 
 
88
    if options.trunk_dir and not options.user_dirs:
 
89
        print "--trunk-dir is only valid with --user-dirs"
 
90
        sys.exit(1)
 
91
 
 
92
    if options.reload:
 
93
        if Reloader.is_installed():
 
94
            Reloader.install()
 
95
        else:
 
96
            return Reloader.restart_with_reloader()
 
97
 
 
98
    if options.user_dirs:
 
99
        if not options.trunk_dir:
 
100
            print "You didn't specify a directory for the trunk directories."
 
101
            sys.exit(1)
 
102
        app = UserBranchesFromFileSystemRoot(path, options.trunk_dir)
 
103
    else:
 
104
        app = BranchesFromFileSystemRoot(path)
 
105
 
 
106
    # setup_logging()
60
107
    logging.basicConfig()
61
108
    logging.getLogger('').setLevel(logging.DEBUG)
62
 
    logger = logging.getLogger('loggerhead')
63
 
    if config.get_option('log_folder'):
64
 
        logfile_path = os.path.join(
65
 
            config.get_option('log_folder'), 'serve-branches.log')
 
109
    logger = getattr(app, 'log', logging.getLogger('loggerhead'))
 
110
    if options.log_folder:
 
111
        logfile_path = os.path.join(options.log_folder, 'serve-branches.log')
66
112
    else:
67
113
        logfile_path = 'serve-branches.log'
68
114
    logfile = logging.FileHandler(logfile_path, 'a')
71
117
    logfile.setFormatter(formatter)
72
118
    logfile.setLevel(logging.DEBUG)
73
119
    logger.addHandler(logfile)
74
 
    return logger
75
 
 
76
 
 
77
 
def make_app_for_config_and_path(config, base):
78
 
    if config.get_option('trunk_dir') and not config.get_option('user_dirs'):
79
 
        print "--trunk-dir is only valid with --user-dirs"
80
 
        sys.exit(1)
81
 
 
82
 
    if config.get_option('reload'):
83
 
        if Reloader.is_installed():
84
 
            Reloader.install()
85
 
        else:
86
 
            return Reloader.restart_with_reloader()
87
 
 
88
 
    if config.get_option('user_dirs'):
89
 
        if not config.get_option('trunk_dir'):
90
 
            print "You didn't specify a directory for the trunk directories."
91
 
            sys.exit(1)
92
 
        app = UserBranchesFromTransportRoot(base, config)
93
 
    else:
94
 
        app = BranchesFromTransportRoot(base, config)
95
 
 
96
 
    setup_logging(config)
97
 
 
98
 
    if config.get_option('profile'):
 
120
    # setup_logging() #end
 
121
    app = TransLogger(app, logger=logger)
 
122
    if options.profile:
99
123
        from loggerhead.middleware.profile import LSProfMiddleware
100
124
        app = LSProfMiddleware(app)
101
 
    if config.get_option('memory_profile'):
102
 
        from dozer import Dozer
103
 
        app = Dozer(app)
104
125
 
105
 
    if not config.get_option('user_prefix'):
 
126
    if not options.user_prefix:
106
127
        prefix = '/'
107
128
    else:
108
 
        prefix = config.get_option('user_prefix')
 
129
        prefix = options.user_prefix
109
130
        if not prefix.startswith('/'):
110
131
            prefix = '/' + prefix
111
132
 
129
150
 
130
151
    app = HTTPExceptionHandler(app)
131
152
    app = ErrorHandlerApp(app)
132
 
    app = TransLogger(app, logger=logging.getLogger('loggerhead'))
133
 
 
134
 
    return app
135
 
 
136
 
 
137
 
def main(args):
138
 
    load_plugins()
139
 
 
140
 
    config, path = get_config_and_path(args)
141
 
 
142
 
    app = make_app_for_config_and_path(config, path)
143
 
 
144
 
    if not config.get_option('user_port'):
 
153
 
 
154
    if not options.user_port:
145
155
        port = '8080'
146
156
    else:
147
 
        port = config.get_option('user_port')
 
157
        port = options.user_port
148
158
 
149
 
    if not config.get_option('user_host'):
 
159
    if not options.user_host:
150
160
        host = '0.0.0.0'
151
161
    else:
152
 
        host = config.get_option('user_host')
153
 
 
154
 
    if not config.get_option('protocol'):
155
 
        protocol = 'http'
156
 
    else:
157
 
        protocol = config.get_option('protocol')
158
 
 
159
 
    if protocol == 'http':
160
 
        httpserver.serve(app, host=host, port=port)
161
 
    else:
162
 
        if protocol == 'fcgi':
163
 
            from flup.server.fcgi import WSGIServer
164
 
        elif protocol == 'scgi':
165
 
            from flup.server.scgi import WSGIServer
166
 
        elif protocol == 'ajp':
167
 
            from flup.server.ajp import WSGIServer
168
 
        else:
169
 
            print 'Unknown protocol: %s.' % (protocol)
170
 
            sys.exit(1)
171
 
        WSGIServer(app, bindAddress=(host, int(port))).run()
 
162
        host = options.user_host
 
163
 
 
164
    load_plugins()
 
165
 
 
166
    httpserver.serve(app, host=host, port=port)
 
167
 
 
168
 
 
169
if __name__ == "__main__":
 
170
    main(sys.argv)