~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to serve-branches

  • Committer: Michael Hudson
  • Date: 2009-04-01 14:40:05 UTC
  • Revision ID: michael.hudson@canonical.com-20090401144005-trxdnfy5hd5wrd39
a quick dose of IE compatibility:
* ''.splice behaves differently
* io-queue doesn't seem to work, but isn't useful for me anyway...

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
import os
20
20
import sys
21
21
 
22
 
from optparse import OptionParser
 
22
from bzrlib.plugin import load_plugins
23
23
 
24
24
from paste import httpserver
25
 
from paste.httpexceptions import HTTPExceptionHandler
 
25
from paste.httpexceptions import HTTPExceptionHandler, HTTPInternalServerError
26
26
from paste.translogger import TransLogger
27
27
 
28
28
from loggerhead import __version__
29
29
from loggerhead.apps.filesystem import (
30
30
    BranchesFromFileSystemRoot, UserBranchesFromFileSystemRoot)
 
31
from loggerhead.config import LoggerheadConfig
31
32
from loggerhead.util import Reloader
32
33
from loggerhead.apps.error import ErrorHandlerApp
33
34
 
34
35
 
35
 
def command_line_parser():
36
 
    parser = OptionParser("%prog [options] <path>")
37
 
    parser.set_defaults(
38
 
        user_dirs=False,
39
 
        show_version=False,
40
 
        log_folder=None,
41
 
        )
42
 
    parser.add_option("--user-dirs", action="store_true", dest="user_dirs",
43
 
                      help="Serve user directories as ~user.")
44
 
    parser.add_option("--trunk-dir", metavar="DIR",
45
 
                      help="The directory that contains the trunk branches.")
46
 
    parser.add_option("--port", dest="user_port",
47
 
                      help=("Port Loggerhead should listen on "
48
 
                            "(defaults to 8080)."))
49
 
    parser.add_option("--host", dest="user_host",
50
 
                      help="Host Loggerhead should listen on.")
51
 
    parser.add_option("--prefix", dest="user_prefix",
52
 
                      help="Specify host prefix.")
53
 
    parser.add_option("--profile", action="store_true", dest="profile",
54
 
                      help="Generate callgrind profile data to "
55
 
                        "%d-stats.callgrind on each request.")
56
 
    parser.add_option("--reload", action="store_true", dest="reload",
57
 
                      help="Restarts the application when changing python"
58
 
                           " files. Only used for development purposes.")
59
 
    parser.add_option('--log-folder', dest="log_folder",
60
 
                      type=str, help="The directory to place log files in.")
61
 
    parser.add_option("--version", action="store_true", dest="show_version",
62
 
                      help="Print the software version and exit")
63
 
    return parser
64
 
 
65
 
 
66
36
def main(args):
67
 
    parser = command_line_parser()
68
 
    (options, args) = parser.parse_args(sys.argv[1:])
 
37
    config = LoggerheadConfig()
69
38
 
70
 
    if options.show_version:
 
39
    if config.get_option('show_version'):
71
40
        print "loggerhead %s" % __version__
72
41
        sys.exit(0)
73
42
 
74
 
    if len(args) > 1:
75
 
        parser.print_help()
 
43
    if config.arg_count > 1:
 
44
        config.print_help()
76
45
        sys.exit(1)
77
 
    elif len(args) == 1:
 
46
    elif config.arg_count == 1:
78
47
        [path] = args
79
48
    else:
80
49
        path = '.'
83
52
        print "%s is not a directory" % path
84
53
        sys.exit(1)
85
54
 
86
 
    if options.trunk_dir and not options.user_dirs:
 
55
    if config.get_option('trunk_dir') and not config.get_option('user_dirs'):
87
56
        print "--trunk-dir is only valid with --user-dirs"
88
57
        sys.exit(1)
89
58
 
90
 
    if options.reload:
 
59
    if config.get_option('reload'):
91
60
        if Reloader.is_installed():
92
61
            Reloader.install()
93
62
        else:
94
63
            return Reloader.restart_with_reloader()
95
64
 
96
 
    if options.user_dirs:
97
 
        if not options.trunk_dir:
 
65
    if config.get_option('user_dirs'):
 
66
        if not config.get_option['trunk_dir']:
98
67
            print "You didn't specify a directory for the trunk directories."
99
68
            sys.exit(1)
100
 
        app = UserBranchesFromFileSystemRoot(path, options.trunk_dir)
 
69
        app = UserBranchesFromFileSystemRoot(
 
70
            path, config.get_option('trunk_dir'))
101
71
    else:
102
72
        app = BranchesFromFileSystemRoot(path)
103
73
 
105
75
    logging.basicConfig()
106
76
    logging.getLogger('').setLevel(logging.DEBUG)
107
77
    logger = getattr(app, 'log', logging.getLogger('loggerhead'))
108
 
    if options.log_folder:
109
 
        logfile_path = os.path.join(options.log_folder, 'serve-branches.log')
 
78
    if config.get_option('log_folder'):
 
79
        logfile_path = os.path.join(
 
80
            config.get_option['log_folder'], 'serve-branches.log')
110
81
    else:
111
82
        logfile_path = 'serve-branches.log'
112
83
    logfile = logging.FileHandler(logfile_path, 'a')
115
86
    logfile.setFormatter(formatter)
116
87
    logfile.setLevel(logging.DEBUG)
117
88
    logger.addHandler(logfile)
 
89
 
 
90
    if config.get_option('memory_profile'):
 
91
        memprofile = logging.getLogger('loggerhead-memprofile')
 
92
        memprofile.setLevel(logging.DEBUG)
 
93
        memprofile.addHandler(logging.FileHandler('loggerhead-memprofile'))
 
94
 
118
95
    # setup_logging() #end
119
 
    app = ErrorHandlerApp(app)
120
 
    app = HTTPExceptionHandler(app)
 
96
 
121
97
    app = TransLogger(app, logger=logger)
122
 
    if options.profile:
 
98
    if config.get_option('profile'):
123
99
        from loggerhead.middleware.profile import LSProfMiddleware
124
100
        app = LSProfMiddleware(app)
 
101
    if config.get_option('memory_profile'):
 
102
        from loggerhead.middleware.profile import MemoryProfileMiddleware
 
103
        app = MemoryProfileMiddleware(app)
125
104
 
126
 
    if not options.user_prefix:
 
105
    if not config.get_option('user_prefix'):
127
106
        prefix = '/'
128
107
    else:
129
 
        prefix = options.user_prefix
 
108
        prefix = config.get_option('user_prefix')
 
109
        if not prefix.startswith('/'):
 
110
            prefix = '/' + prefix
130
111
 
131
112
    try:
132
113
        from paste.deploy.config import PrefixMiddleware
133
114
    except ImportError:
134
 
        pass
 
115
        cant_proxy_correctly_message = (
 
116
            'Unsupported configuration: PasteDeploy not available, but '
 
117
            'loggerhead appears to be behind a proxy.')
 
118
        def check_not_proxied(app):
 
119
            def wrapped(environ, start_response):
 
120
                if 'HTTP_X_FORWARDED_SERVER' in environ:
 
121
                    exc = HTTPInternalServerError()
 
122
                    exc.explanation = cant_proxy_correctly_message
 
123
                    raise exc
 
124
                return app(environ, start_response)
 
125
            return wrapped
 
126
        app = check_not_proxied(app)
135
127
    else:
136
128
        app = PrefixMiddleware(app, prefix=prefix)
137
129
 
138
 
    if not options.user_port:
 
130
    app = HTTPExceptionHandler(app)
 
131
    app = ErrorHandlerApp(app)
 
132
 
 
133
    if not config.get_option('user_port'):
139
134
        port = '8080'
140
135
    else:
141
 
        port = options.user_port
 
136
        port = config.get_option('user_port')
142
137
 
143
 
    if not options.user_host:
 
138
    if not config.get_option('user_host'):
144
139
        host = '0.0.0.0'
145
140
    else:
146
 
        host = options.user_host
 
141
        host = config.get_option('user_host')
 
142
 
 
143
    load_plugins()
147
144
 
148
145
    httpserver.serve(app, host=host, port=port)
149
146