~loggerhead-team/loggerhead/trunk-rich

167 by Michael Hudson
make serve-branches.py executable
1
#!/usr/bin/env python
183.2.1 by John Arbash Meinel
Add Copyright information to most files.
2
# This program is free software; you can redistribute it and/or modify
3
# it under the terms of the GNU General Public License as published by
4
# the Free Software Foundation; either version 2 of the License, or
5
# (at your option) any later version.
6
#
7
# This program is distributed in the hope that it will be useful,
8
# but WITHOUT ANY WARRANTY; without even the implied warranty of
9
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
# GNU General Public License for more details.
11
#
12
# You should have received a copy of the GNU General Public License
13
# along with this program; if not, write to the Free Software
14
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15
16
"""Search for branches underneath a directory and serve them all."""
17
174 by Michael Hudson
misc logging improvements:
18
import logging
189.1.2 by Tim Penhey
Extend serve-branches to serve user dirs.
19
import os
165.1.4 by Michael Hudson
change serve-branches.py to be easier to document :)
20
import sys
21
189.1.2 by Tim Penhey
Extend serve-branches to serve user dirs.
22
from optparse import OptionParser
23
270.1.1 by Michael Hudson
defer loading of plugins until after we've set up the logging
24
from bzrlib.plugin import load_plugins
25
165.1.4 by Michael Hudson
change serve-branches.py to be easier to document :)
26
from paste import httpserver
264 by Michael Hudson
error if you run serve-branches behind proxy when paste.deploy is not available
27
from paste.httpexceptions import HTTPExceptionHandler, HTTPInternalServerError
165.1.4 by Michael Hudson
change serve-branches.py to be easier to document :)
28
from paste.translogger import TransLogger
29
189.1.2 by Tim Penhey
Extend serve-branches to serve user dirs.
30
from loggerhead import __version__
31
from loggerhead.apps.filesystem import (
32
    BranchesFromFileSystemRoot, UserBranchesFromFileSystemRoot)
219.1.2 by Guillermo Gonzalez
* update NEWS and serve-branches man page
33
from loggerhead.util import Reloader
217.1.4 by Guillermo Gonzalez
* new apps module: "error" and ErrorHandlerApp middleware
34
from loggerhead.apps.error import ErrorHandlerApp
189.1.2 by Tim Penhey
Extend serve-branches to serve user dirs.
35
36
37
def command_line_parser():
38
    parser = OptionParser("%prog [options] <path>")
39
    parser.set_defaults(
40
        user_dirs=False,
41
        show_version=False,
217.1.4 by Guillermo Gonzalez
* new apps module: "error" and ErrorHandlerApp middleware
42
        log_folder=None,
189.1.2 by Tim Penhey
Extend serve-branches to serve user dirs.
43
        )
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.")
215.1.1 by Martin Albisetti
* Allow specifying a custom port
48
    parser.add_option("--port", dest="user_port",
230.1.1 by Steve 'Ashcrow' Milner
Updated to follow pep8.
49
                      help=("Port Loggerhead should listen on "
50
                            "(defaults to 8080)."))
215.1.1 by Martin Albisetti
* Allow specifying a custom port
51
    parser.add_option("--host", dest="user_host",
52
                      help="Host Loggerhead should listen on.")
215.1.2 by Martin Albisetti
Add --prefix option for hosts
53
    parser.add_option("--prefix", dest="user_prefix",
54
                      help="Specify host prefix.")
232.1.1 by Paul Hummer
Added profile flag for profiling loggerhead
55
    parser.add_option("--profile", action="store_true", dest="profile",
232.1.7 by Robert Collins
Allow lsprofile data on requests to be gathered.
56
                      help="Generate callgrind profile data to "
57
                        "%d-stats.callgrind on each request.")
219.1.1 by Guillermo Gonzalez
* added --reload option
58
    parser.add_option("--reload", action="store_true", dest="reload",
219.1.2 by Guillermo Gonzalez
* update NEWS and serve-branches man page
59
                      help="Restarts the application when changing python"
60
                           " files. Only used for development purposes.")
217.2.1 by Michael Hudson
whitespace, style, typos
61
    parser.add_option('--log-folder', dest="log_folder",
62
                      type=str, help="The directory to place log files in.")
189.1.2 by Tim Penhey
Extend serve-branches to serve user dirs.
63
    parser.add_option("--version", action="store_true", dest="show_version",
64
                      help="Print the software version and exit")
65
    return parser
66
67
68
def main(args):
69
    parser = command_line_parser()
70
    (options, args) = parser.parse_args(sys.argv[1:])
71
72
    if options.show_version:
73
        print "loggerhead %s" % __version__
74
        sys.exit(0)
75
76
    if len(args) > 1:
77
        parser.print_help()
78
        sys.exit(1)
79
    elif len(args) == 1:
80
        [path] = args
81
    else:
82
        path = '.'
83
84
    if not os.path.isdir(path):
85
        print "%s is not a directory" % path
86
        sys.exit(1)
87
88
    if options.trunk_dir and not options.user_dirs:
89
        print "--trunk-dir is only valid with --user-dirs"
90
        sys.exit(1)
217.2.1 by Michael Hudson
whitespace, style, typos
91
219.1.1 by Guillermo Gonzalez
* added --reload option
92
    if options.reload:
219.1.2 by Guillermo Gonzalez
* update NEWS and serve-branches man page
93
        if Reloader.is_installed():
94
            Reloader.install()
219.1.1 by Guillermo Gonzalez
* added --reload option
95
        else:
219.1.2 by Guillermo Gonzalez
* update NEWS and serve-branches man page
96
            return Reloader.restart_with_reloader()
189.1.2 by Tim Penhey
Extend serve-branches to serve user dirs.
97
98
    if options.user_dirs:
99
        if not options.trunk_dir:
100
            print "You didn't specify a directory for the trunk directories."
101
            sys.exit(1)
102
        app = UserBranchesFromFileSystemRoot(path, options.trunk_dir)
103
    else:
104
        app = BranchesFromFileSystemRoot(path)
217.2.1 by Michael Hudson
whitespace, style, typos
105
217.1.4 by Guillermo Gonzalez
* new apps module: "error" and ErrorHandlerApp middleware
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)
232.1.1 by Paul Hummer
Added profile flag for profiling loggerhead
122
    if options.profile:
232.1.7 by Robert Collins
Allow lsprofile data on requests to be gathered.
123
        from loggerhead.middleware.profile import LSProfMiddleware
124
        app = LSProfMiddleware(app)
217.1.4 by Guillermo Gonzalez
* new apps module: "error" and ErrorHandlerApp middleware
125
215.1.2 by Martin Albisetti
Add --prefix option for hosts
126
    if not options.user_prefix:
127
        prefix = '/'
128
    else:
129
        prefix = options.user_prefix
130
189.1.2 by Tim Penhey
Extend serve-branches to serve user dirs.
131
    try:
132
        from paste.deploy.config import PrefixMiddleware
133
    except ImportError:
264 by Michael Hudson
error if you run serve-branches behind proxy when paste.deploy is not available
134
        cant_proxy_correctly_message = (
135
            'Unsupported configuration: PasteDeploy not available, but '
136
            'loggerhead appears to be behind a proxy.')
137
        def check_not_proxied(app):
138
            def wrapped(environ, start_response):
139
                if 'HTTP_X_FORWARDED_SERVER' in environ:
140
                    exc = HTTPInternalServerError()
141
                    exc.explanation = cant_proxy_correctly_message
142
                    raise exc
143
                return app(environ, start_response)
144
            return wrapped
145
        app = check_not_proxied(app)
189.1.2 by Tim Penhey
Extend serve-branches to serve user dirs.
146
    else:
215.1.2 by Martin Albisetti
Add --prefix option for hosts
147
        app = PrefixMiddleware(app, prefix=prefix)
217.2.1 by Michael Hudson
whitespace, style, typos
148
266.2.13 by Michael Hudson
raise a 404 when passed an invalid revid
149
    app = HTTPExceptionHandler(app)
264 by Michael Hudson
error if you run serve-branches behind proxy when paste.deploy is not available
150
    app = ErrorHandlerApp(app)
151
215.1.1 by Martin Albisetti
* Allow specifying a custom port
152
    if not options.user_port:
153
        port = '8080'
154
    else:
155
        port = options.user_port
156
157
    if not options.user_host:
158
        host = '0.0.0.0'
159
    else:
160
        host = options.user_host
161
270.1.1 by Michael Hudson
defer loading of plugins until after we've set up the logging
162
    load_plugins()
163
215.1.1 by Martin Albisetti
* Allow specifying a custom port
164
    httpserver.serve(app, host=host, port=port)
189.1.2 by Tim Penhey
Extend serve-branches to serve user dirs.
165
166
167
if __name__ == "__main__":
168
    main(sys.argv)