Files
@ 17556a81ec6f
Branch filter:
Location: kallithea/rhodecode/lib/profiler.py - annotation
17556a81ec6f
1.6 KiB
text/x-python
Make detecting bare Git repositories more robust
Git remote repositories may end on '.git', e.g. myrepo.git. Just checking
for a repository path to end on '.git' causes 'Repository not found' errors
in such a case. To distinguish between bare and normal Git repositories,
check if there is a '/.git' part at the end of the repository path
(i.e. if GIT_DIR is pointing to '.' (bare) or '.git').
Git remote repositories may end on '.git', e.g. myrepo.git. Just checking
for a repository path to end on '.git' causes 'Repository not found' errors
in such a case. To distinguish between bare and normal Git repositories,
check if there is a '/.git' part at the end of the repository path
(i.e. if GIT_DIR is pointing to '.' (bare) or '.git').
1e757ac98988 1e757ac98988 2c2bdaeca912 2c2bdaeca912 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 c1516b35f91d 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 6832ef664673 1e757ac98988 1e757ac98988 1e757ac98988 c1516b35f91d 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 2c2bdaeca912 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 c1516b35f91d c1516b35f91d 1e757ac98988 6832ef664673 2c2bdaeca912 2c2bdaeca912 2c2bdaeca912 2c2bdaeca912 2c2bdaeca912 1e757ac98988 1e757ac98988 6832ef664673 1e757ac98988 1e757ac98988 6832ef664673 1e757ac98988 | from __future__ import with_statement
import gc
import objgraph
import cProfile
import pstats
import cgi
import pprint
import threading
from StringIO import StringIO
class ProfilingMiddleware(object):
def __init__(self, app):
self.lock = threading.Lock()
self.app = app
def __call__(self, environ, start_response):
with self.lock:
profiler = cProfile.Profile()
def run_app(*a, **kw):
self.response = self.app(environ, start_response)
profiler.runcall(run_app, environ, start_response)
profiler.snapshot_stats()
stats = pstats.Stats(profiler)
stats.sort_stats('calls') #cummulative
# Redirect output
out = StringIO()
stats.stream = out
stats.print_stats()
resp = ''.join(self.response)
# Lets at least only put this on html-like responses.
if resp.strip().startswith('<'):
## The profiling info is just appended to the response.
## Browsers don't mind this.
resp += ('<pre style="text-align:left; '
'border-top: 4px dashed red; padding: 1em;">')
resp += cgi.escape(out.getvalue(), True)
ct = objgraph.show_most_common_types()
print ct
resp += ct if ct else '---'
output = StringIO()
pprint.pprint(environ, output, depth=3)
resp += cgi.escape(output.getvalue(), True)
resp += '</pre>'
return resp
|