~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
277 by Michael Hudson
* make example Apache stanza more correct with how PasteDeploy works
130
        if not prefix.startswith('/'):
131
            prefix = '/' + prefix
215.1.2 by Martin Albisetti
Add --prefix option for hosts
132
189.1.2 by Tim Penhey
Extend serve-branches to serve user dirs.
133
    try:
134
        from paste.deploy.config import PrefixMiddleware
135
    except ImportError:
264 by Michael Hudson
error if you run serve-branches behind proxy when paste.deploy is not available
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)
189.1.2 by Tim Penhey
Extend serve-branches to serve user dirs.
148
    else:
215.1.2 by Martin Albisetti
Add --prefix option for hosts
149
        app = PrefixMiddleware(app, prefix=prefix)
217.2.1 by Michael Hudson
whitespace, style, typos
150
266.2.13 by Michael Hudson
raise a 404 when passed an invalid revid
151
    app = HTTPExceptionHandler(app)
264 by Michael Hudson
error if you run serve-branches behind proxy when paste.deploy is not available
152
    app = ErrorHandlerApp(app)
153
215.1.1 by Martin Albisetti
* Allow specifying a custom port
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
270.1.1 by Michael Hudson
defer loading of plugins until after we've set up the logging
164
    load_plugins()
165
215.1.1 by Martin Albisetti
* Allow specifying a custom port
166
    httpserver.serve(app, host=host, port=port)
189.1.2 by Tim Penhey
Extend serve-branches to serve user dirs.
167
168
169
if __name__ == "__main__":
170
    main(sys.argv)