~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to serve-branches

  • Committer: Michael Hudson
  • Date: 2009-02-26 21:01:19 UTC
  • Revision ID: michael.hudson@canonical.com-20090226210119-d990d10iuv0jhfzh
Bug #297930: replace the user-confusing "next" and "previous" links with
"older" and "newer" respectively.

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
 
22
22
from optparse import OptionParser
23
23
 
 
24
from bzrlib.plugin import load_plugins
 
25
 
24
26
from paste import httpserver
25
 
from paste.httpexceptions import HTTPExceptionHandler
 
27
from paste.httpexceptions import HTTPExceptionHandler, HTTPInternalServerError
26
28
from paste.translogger import TransLogger
27
29
 
28
30
from loggerhead import __version__
29
31
from loggerhead.apps.filesystem import (
30
32
    BranchesFromFileSystemRoot, UserBranchesFromFileSystemRoot)
 
33
from loggerhead.util import Reloader
 
34
from loggerhead.apps.error import ErrorHandlerApp
31
35
 
32
36
 
33
37
def command_line_parser():
35
39
    parser.set_defaults(
36
40
        user_dirs=False,
37
41
        show_version=False,
 
42
        log_folder=None,
38
43
        )
39
44
    parser.add_option("--user-dirs", action="store_true", dest="user_dirs",
40
45
                      help="Serve user directories as ~user.")
41
46
    parser.add_option("--trunk-dir", metavar="DIR",
42
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.")
43
63
    parser.add_option("--version", action="store_true", dest="show_version",
44
64
                      help="Print the software version and exit")
45
65
    return parser
46
66
 
47
67
 
48
68
def main(args):
49
 
    logging.basicConfig()
50
 
    logging.getLogger().setLevel(logging.DEBUG)
51
 
 
52
69
    parser = command_line_parser()
53
70
    (options, args) = parser.parse_args(sys.argv[1:])
54
71
 
72
89
        print "--trunk-dir is only valid with --user-dirs"
73
90
        sys.exit(1)
74
91
 
 
92
    if options.reload:
 
93
        if Reloader.is_installed():
 
94
            Reloader.install()
 
95
        else:
 
96
            return Reloader.restart_with_reloader()
 
97
 
75
98
    if options.user_dirs:
76
99
        if not options.trunk_dir:
77
100
            print "You didn't specify a directory for the trunk directories."
79
102
        app = UserBranchesFromFileSystemRoot(path, options.trunk_dir)
80
103
    else:
81
104
        app = BranchesFromFileSystemRoot(path)
82
 
    app = HTTPExceptionHandler(app)
83
 
    app = TransLogger(app)
 
105
 
 
106
    # setup_logging()
 
107
    logging.basicConfig()
 
108
    logging.getLogger('').setLevel(logging.DEBUG)
 
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')
 
112
    else:
 
113
        logfile_path = 'serve-branches.log'
 
114
    logfile = logging.FileHandler(logfile_path, 'a')
 
115
    formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(name)s:'
 
116
                                  ' %(message)s')
 
117
    logfile.setFormatter(formatter)
 
118
    logfile.setLevel(logging.DEBUG)
 
119
    logger.addHandler(logfile)
 
120
    # setup_logging() #end
 
121
    app = TransLogger(app, logger=logger)
 
122
    if options.profile:
 
123
        from loggerhead.middleware.profile import LSProfMiddleware
 
124
        app = LSProfMiddleware(app)
 
125
 
 
126
    if not options.user_prefix:
 
127
        prefix = '/'
 
128
    else:
 
129
        prefix = options.user_prefix
 
130
        if not prefix.startswith('/'):
 
131
            prefix = '/' + prefix
84
132
 
85
133
    try:
86
134
        from paste.deploy.config import PrefixMiddleware
87
135
    except ImportError:
88
 
        pass
89
 
    else:
90
 
        app = PrefixMiddleware(app)
91
 
 
92
 
    httpserver.serve(app, host='0.0.0.0', port='8080')
 
136
        cant_proxy_correctly_message = (
 
137
            'Unsupported configuration: PasteDeploy not available, but '
 
138
            'loggerhead appears to be behind a proxy.')
 
139
        def check_not_proxied(app):
 
140
            def wrapped(environ, start_response):
 
141
                if 'HTTP_X_FORWARDED_SERVER' in environ:
 
142
                    exc = HTTPInternalServerError()
 
143
                    exc.explanation = cant_proxy_correctly_message
 
144
                    raise exc
 
145
                return app(environ, start_response)
 
146
            return wrapped
 
147
        app = check_not_proxied(app)
 
148
    else:
 
149
        app = PrefixMiddleware(app, prefix=prefix)
 
150
 
 
151
    app = HTTPExceptionHandler(app)
 
152
    app = ErrorHandlerApp(app)
 
153
 
 
154
    if not options.user_port:
 
155
        port = '8080'
 
156
    else:
 
157
        port = options.user_port
 
158
 
 
159
    if not options.user_host:
 
160
        host = '0.0.0.0'
 
161
    else:
 
162
        host = options.user_host
 
163
 
 
164
    load_plugins()
 
165
 
 
166
    httpserver.serve(app, host=host, port=port)
93
167
 
94
168
 
95
169
if __name__ == "__main__":