~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to serve-branches

  • Committer: Matt Nordhoff
  • Date: 2009-04-30 10:39:05 UTC
  • mto: This revision was merged to the branch mainline in revision 406.
  • Revision ID: mnordhoff@mattnordhoff.com-20090430103905-10si14h2i325htrj
Strip trailing whitespace

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