24
from bzrlib.plugin import load_plugins
25
from bzrlib.transport import get_transport
22
from optparse import OptionParser
27
24
from paste import httpserver
28
from paste.httpexceptions import HTTPExceptionHandler, HTTPInternalServerError
25
from paste.httpexceptions import HTTPExceptionHandler
29
26
from paste.translogger import TransLogger
31
28
from loggerhead import __version__
32
from loggerhead.apps.transport import (
33
BranchesFromTransportRoot, UserBranchesFromTransportRoot)
34
from loggerhead.config import LoggerheadConfig
35
from loggerhead.util import Reloader
36
from loggerhead.apps.error import ErrorHandlerApp
39
def get_config_and_path(args):
40
config = LoggerheadConfig()
42
if config.get_option('show_version'):
29
from loggerhead.apps.filesystem import (
30
BranchesFromFileSystemRoot, UserBranchesFromFileSystemRoot)
33
def command_line_parser():
34
parser = OptionParser("%prog [options] <path>")
39
parser.add_option("--user-dirs", action="store_true", dest="user_dirs",
40
help="Serve user directories as ~user.")
41
parser.add_option("--trunk-dir", metavar="DIR",
42
help="The directory that contains the trunk branches.")
43
parser.add_option("--version", action="store_true", dest="show_version",
44
help="Print the software version and exit")
50
logging.getLogger().setLevel(logging.DEBUG)
52
parser = command_line_parser()
53
(options, args) = parser.parse_args(sys.argv[1:])
55
if options.show_version:
43
56
print "loggerhead %s" % __version__
46
if config.arg_count > 1:
49
elif config.arg_count == 1:
50
base = config.get_arg(0)
54
if not config.get_option('allow_writes'):
55
base = 'readonly+' + base
60
def setup_logging(config):
62
logging.getLogger('').setLevel(logging.DEBUG)
63
logger = logging.getLogger('loggerhead')
64
if config.get_option('log_folder'):
65
logfile_path = os.path.join(
66
config.get_option('log_folder'), 'serve-branches.log')
68
logfile_path = 'serve-branches.log'
69
logfile = logging.FileHandler(logfile_path, 'a')
70
formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(name)s:'
72
logfile.setFormatter(formatter)
73
logfile.setLevel(logging.DEBUG)
74
logger.addHandler(logfile)
78
def make_app_for_config_and_path(config, base):
79
if config.get_option('trunk_dir') and not config.get_option('user_dirs'):
67
if not os.path.isdir(path):
68
print "%s is not a directory" % path
71
if options.trunk_dir and not options.user_dirs:
80
72
print "--trunk-dir is only valid with --user-dirs"
83
if config.get_option('reload'):
84
if Reloader.is_installed():
87
return Reloader.restart_with_reloader()
89
if config.get_option('user_dirs'):
90
if not config.get_option('trunk_dir'):
76
if not options.trunk_dir:
91
77
print "You didn't specify a directory for the trunk directories."
93
app = UserBranchesFromTransportRoot(base, config)
95
app = BranchesFromTransportRoot(base, config)
99
if config.get_option('profile'):
100
from loggerhead.middleware.profile import LSProfMiddleware
101
app = LSProfMiddleware(app)
102
if config.get_option('memory_profile'):
103
from dozer import Dozer
106
if not config.get_option('user_prefix'):
109
prefix = config.get_option('user_prefix')
110
if not prefix.startswith('/'):
111
prefix = '/' + prefix
79
app = UserBranchesFromFileSystemRoot(path, options.trunk_dir)
81
app = BranchesFromFileSystemRoot(path)
82
app = HTTPExceptionHandler(app)
83
app = TransLogger(app)
114
86
from paste.deploy.config import PrefixMiddleware
115
87
except ImportError:
116
cant_proxy_correctly_message = (
117
'Unsupported configuration: PasteDeploy not available, but '
118
'loggerhead appears to be behind a proxy.')
119
def check_not_proxied(app):
120
def wrapped(environ, start_response):
121
if 'HTTP_X_FORWARDED_SERVER' in environ:
122
exc = HTTPInternalServerError()
123
exc.explanation = cant_proxy_correctly_message
125
return app(environ, start_response)
127
app = check_not_proxied(app)
129
app = PrefixMiddleware(app, prefix=prefix)
131
app = HTTPExceptionHandler(app)
132
app = ErrorHandlerApp(app)
133
app = TransLogger(app, logger=logging.getLogger('loggerhead'))
141
config, path = get_config_and_path(args)
143
app = make_app_for_config_and_path(config, path)
145
if not config.get_option('user_port'):
148
port = config.get_option('user_port')
150
if not config.get_option('user_host'):
153
host = config.get_option('user_host')
155
httpserver.serve(app, host=host, port=port)
90
app = PrefixMiddleware(app)
92
httpserver.serve(app, host='0.0.0.0', port='8080')
95
if __name__ == "__main__":