22
from bzrlib.plugin import load_plugins
23
from bzrlib.transport import get_transport
22
from optparse import OptionParser
25
24
from paste import httpserver
26
from paste.httpexceptions import HTTPExceptionHandler, HTTPInternalServerError
25
from paste.httpexceptions import HTTPExceptionHandler
27
26
from paste.translogger import TransLogger
29
28
from loggerhead import __version__
30
from loggerhead.apps.transport import (
31
BranchesFromTransportRoot, UserBranchesFromTransportRoot)
32
from loggerhead.config import LoggerheadConfig
33
from loggerhead.util import Reloader
34
from loggerhead.apps.error import ErrorHandlerApp
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")
38
config = LoggerheadConfig()
40
if config.get_option('show_version'):
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:
41
56
print "loggerhead %s" % __version__
44
if config.arg_count > 1:
47
elif config.arg_count == 1:
48
path = config.get_arg(0)
54
transport = get_transport(path)
56
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:
57
72
print "--trunk-dir is only valid with --user-dirs"
60
if config.get_option('reload'):
61
if Reloader.is_installed():
64
return Reloader.restart_with_reloader()
66
if config.get_option('user_dirs'):
67
if not config.get_option('trunk_dir'):
76
if not options.trunk_dir:
68
77
print "You didn't specify a directory for the trunk directories."
70
app = UserBranchesFromTransportRoot(transport, config)
72
app = BranchesFromTransportRoot(transport, config)
76
logging.getLogger('').setLevel(logging.DEBUG)
77
logger = getattr(app, 'log', logging.getLogger('loggerhead'))
78
if config.get_option('log_folder'):
79
logfile_path = os.path.join(
80
config.get_option('log_folder'), 'serve-branches.log')
82
logfile_path = 'serve-branches.log'
83
logfile = logging.FileHandler(logfile_path, 'a')
84
formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(name)s:'
86
logfile.setFormatter(formatter)
87
logfile.setLevel(logging.DEBUG)
88
logger.addHandler(logfile)
90
# setup_logging() #end
92
app = TransLogger(app, logger=logger)
93
if config.get_option('profile'):
94
from loggerhead.middleware.profile import LSProfMiddleware
95
app = LSProfMiddleware(app)
96
if config.get_option('memory_profile'):
97
from dozer import Dozer
100
if not config.get_option('user_prefix'):
103
prefix = config.get_option('user_prefix')
104
if not prefix.startswith('/'):
105
prefix = '/' + prefix
79
app = UserBranchesFromFileSystemRoot(path, options.trunk_dir)
81
app = BranchesFromFileSystemRoot(path)
82
app = HTTPExceptionHandler(app)
83
app = TransLogger(app)
108
86
from paste.deploy.config import PrefixMiddleware
109
87
except ImportError:
110
cant_proxy_correctly_message = (
111
'Unsupported configuration: PasteDeploy not available, but '
112
'loggerhead appears to be behind a proxy.')
113
def check_not_proxied(app):
114
def wrapped(environ, start_response):
115
if 'HTTP_X_FORWARDED_SERVER' in environ:
116
exc = HTTPInternalServerError()
117
exc.explanation = cant_proxy_correctly_message
119
return app(environ, start_response)
121
app = check_not_proxied(app)
123
app = PrefixMiddleware(app, prefix=prefix)
125
app = HTTPExceptionHandler(app)
126
app = ErrorHandlerApp(app)
128
if not config.get_option('user_port'):
131
port = config.get_option('user_port')
133
if not config.get_option('user_host'):
136
host = config.get_option('user_host')
138
httpserver.serve(app, host=host, port=port)
90
app = PrefixMiddleware(app)
92
httpserver.serve(app, host='0.0.0.0', port='8080')
141
95
if __name__ == "__main__":