~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/smart/server.py

(jr) New hook server_exception in bzrlib.smart.server to catch any exception
 caused while running bzr serve. (Jonathan Riddell,
 #274578) (Jonathan Riddell)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
254
254
            "Called by the bzr server when it stops serving a directory. "
255
255
            "server_stopped is called with the same parameters as the "
256
256
            "server_started hook: (backing_urls, public_url).", (0, 16))
 
257
        self.add_hook('server_exception',
 
258
            "Called by the bzr server when an exception occurs. "
 
259
            "server_exception is called with the sys.exc_info() tuple "
 
260
            "return true for the hook if the exception has been handled, "
 
261
            "in which case the server will exit normally.", (2, 4))
257
262
 
258
263
SmartTCPServer.hooks = SmartServerHooks()
259
264
 
373
378
        for cleanup in reversed(self.cleanups):
374
379
            cleanup()
375
380
 
376
 
 
377
381
def serve_bzr(transport, host=None, port=None, inet=False):
378
382
    """This is the default implementation of 'bzr serve'.
379
383
    
385
389
    try:
386
390
        bzr_server.set_up(transport, host, port, inet)
387
391
        bzr_server.smart_server.serve()
 
392
    except:
 
393
        hook_caught_exception = False
 
394
        for hook in SmartTCPServer.hooks['server_exception']:
 
395
            hook_caught_exception = hook(sys.exc_info())
 
396
        if not hook_caught_exception:
 
397
            raise
388
398
    finally:
389
399
        bzr_server.tear_down()
390