16
16
"""Search for branches underneath a directory and serve them all."""
22
from optparse import OptionParser
24
from bzrlib.plugin import load_plugins
21
26
from paste import httpserver
22
from paste.httpexceptions import HTTPExceptionHandler
27
from paste.httpexceptions import HTTPExceptionHandler, HTTPInternalServerError
23
28
from paste.translogger import TransLogger
25
from loggerhead.apps.filesystem import BranchesFromFileSystemRoot
29
logging.getLogger().setLevel(logging.DEBUG)
36
app = BranchesFromFileSystemRoot(path)
38
app = HTTPExceptionHandler(app)
39
app = TransLogger(app)
42
from paste.deploy.config import PrefixMiddleware
46
app = PrefixMiddleware(app)
48
#from paste.evalexception import EvalException
49
#app = EvalException(app)
51
httpserver.serve(app, host='0.0.0.0', port='8080')
30
from loggerhead import __version__
31
from loggerhead.apps.filesystem import (
32
BranchesFromFileSystemRoot, UserBranchesFromFileSystemRoot)
33
from loggerhead.util import Reloader
34
from loggerhead.apps.error import ErrorHandlerApp
37
def command_line_parser():
38
parser = OptionParser("%prog [options] <path>")
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")
69
parser = command_line_parser()
70
(options, args) = parser.parse_args(sys.argv[1:])
72
if options.show_version:
73
print "loggerhead %s" % __version__
84
if not os.path.isdir(path):
85
print "%s is not a directory" % path
88
if options.trunk_dir and not options.user_dirs:
89
print "--trunk-dir is only valid with --user-dirs"
93
if Reloader.is_installed():
96
return Reloader.restart_with_reloader()
99
if not options.trunk_dir:
100
print "You didn't specify a directory for the trunk directories."
102
app = UserBranchesFromFileSystemRoot(path, options.trunk_dir)
104
app = BranchesFromFileSystemRoot(path)
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')
113
logfile_path = 'serve-branches.log'
114
logfile = logging.FileHandler(logfile_path, 'a')
115
formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(name)s:'
117
logfile.setFormatter(formatter)
118
logfile.setLevel(logging.DEBUG)
119
logger.addHandler(logfile)
120
# setup_logging() #end
121
app = TransLogger(app, logger=logger)
123
from loggerhead.middleware.profile import LSProfMiddleware
124
app = LSProfMiddleware(app)
126
if not options.user_prefix:
129
prefix = options.user_prefix
130
if not prefix.startswith('/'):
131
prefix = '/' + prefix
134
from paste.deploy.config import PrefixMiddleware
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
145
return app(environ, start_response)
147
app = check_not_proxied(app)
149
app = PrefixMiddleware(app, prefix=prefix)
151
app = HTTPExceptionHandler(app)
152
app = ErrorHandlerApp(app)
154
if not options.user_port:
157
port = options.user_port
159
if not options.user_host:
162
host = options.user_host
166
httpserver.serve(app, host=host, port=port)
169
if __name__ == "__main__":