##// END OF EJS Templates
transaction: issue "new obsmarkers" message at the end of the transaction...
transaction: issue "new obsmarkers" message at the end of the transaction Instead of making bundle2 code responsible for this, it seems better to have it handled and the transaction level. First, it means the message will be more consistently printed. Second it means we won't spam the message over and over if the data arrive in multiple piece. Third, we are planning to move other similar message at the same level (for the same reason) so having them all at the same location will help us to control the order they are displayed.

File last commit:

r43079:2c4f656c default
r43164:38392d5b default
Show More
wireprotosimplecache.py
195 lines | 5.8 KiB | text/x-python | PythonLexer
/ tests / wireprotosimplecache.py
Gregory Szorc
wireprotov2: support response caching...
r40057 # wireprotosimplecache.py - Extension providing in-memory wire protocol cache
#
# Copyright 2018 Gregory Szorc <gregory.szorc@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
from __future__ import absolute_import
from mercurial import (
extensions,
registrar,
util,
Gregory Szorc
wireprotov2: server support for sending content redirects...
r40061 wireprotoserver,
Gregory Szorc
wireprotov2: support response caching...
r40057 wireprototypes,
wireprotov2server,
)
Pulkit Goyal
interfaces: create a new folder for interfaces and move repository.py in it...
r43078 from mercurial.interfaces import (
repository,
Pulkit Goyal
interfaceutil: move to interfaces/...
r43079 util as interfaceutil,
Pulkit Goyal
interfaces: create a new folder for interfaces and move repository.py in it...
r43078 )
Gregory Szorc
wireprotov2: support response caching...
r40057 from mercurial.utils import (
Gregory Szorc
wireprotov2: advertise redirect targets in capabilities...
r40059 stringutil,
Gregory Szorc
wireprotov2: support response caching...
r40057 )
CACHE = None
configtable = {}
configitem = registrar.configitem(configtable)
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 configitem(b'simplecache', b'cacheapi',
Gregory Szorc
wireprotov2: server support for sending content redirects...
r40061 default=False)
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 configitem(b'simplecache', b'cacheobjects',
Gregory Szorc
wireprotov2: support response caching...
r40057 default=False)
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 configitem(b'simplecache', b'redirectsfile',
Gregory Szorc
wireprotov2: advertise redirect targets in capabilities...
r40059 default=None)
Gregory Szorc
wireprotov2: support response caching...
r40057
Gregory Szorc
wireprotov2: server support for sending content redirects...
r40061 # API handler that makes cached keys available.
def handlecacherequest(rctx, req, res, checkperm, urlparts):
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 if rctx.repo.ui.configbool(b'simplecache', b'cacheobjects'):
Gregory Szorc
wireprotov2: server support for sending content redirects...
r40061 res.status = b'500 Internal Server Error'
res.setbodybytes(b'cacheobjects not supported for api server')
return
if not urlparts:
res.status = b'200 OK'
res.headers[b'Content-Type'] = b'text/plain'
res.setbodybytes(b'simple cache server')
return
key = b'/'.join(urlparts)
if key not in CACHE:
res.status = b'404 Not Found'
res.headers[b'Content-Type'] = b'text/plain'
res.setbodybytes(b'key not found in cache')
return
res.status = b'200 OK'
res.headers[b'Content-Type'] = b'application/mercurial-cbor'
res.setbodybytes(CACHE[key])
def cachedescriptor(req, repo):
return {}
wireprotoserver.API_HANDLERS[b'simplecache'] = {
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 b'config': (b'simplecache', b'cacheapi'),
b'handler': handlecacherequest,
b'apidescriptor': cachedescriptor,
Gregory Szorc
wireprotov2: server support for sending content redirects...
r40061 }
Gregory Szorc
wireprotov2: support response caching...
r40057 @interfaceutil.implementer(repository.iwireprotocolcommandcacher)
class memorycacher(object):
Gregory Szorc
wireprotov2: server support for sending content redirects...
r40061 def __init__(self, ui, command, encodefn, redirecttargets, redirecthashes,
req):
Gregory Szorc
wireprotov2: support response caching...
r40057 self.ui = ui
self.encodefn = encodefn
Gregory Szorc
wireprotov2: server support for sending content redirects...
r40061 self.redirecttargets = redirecttargets
self.redirecthashes = redirecthashes
self.req = req
Gregory Szorc
wireprotov2: support response caching...
r40057 self.key = None
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 self.cacheobjects = ui.configbool(b'simplecache', b'cacheobjects')
self.cacheapi = ui.configbool(b'simplecache', b'cacheapi')
Gregory Szorc
wireprotov2: support response caching...
r40057 self.buffered = []
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 ui.log(b'simplecache', b'cacher constructed for %s\n', command)
Gregory Szorc
wireprotov2: support response caching...
r40057
def __enter__(self):
return self
def __exit__(self, exctype, excvalue, exctb):
if exctype:
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 self.ui.log(b'simplecache', b'cacher exiting due to error\n')
Gregory Szorc
wireprotov2: support response caching...
r40057
def adjustcachekeystate(self, state):
# Needed in order to make tests deterministic. Don't copy this
# pattern for production caches!
del state[b'repo']
def setcachekey(self, key):
self.key = key
return True
def lookup(self):
if self.key not in CACHE:
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 self.ui.log(b'simplecache', b'cache miss for %s\n', self.key)
Gregory Szorc
wireprotov2: support response caching...
r40057 return None
entry = CACHE[self.key]
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 self.ui.log(b'simplecache', b'cache hit for %s\n', self.key)
Gregory Szorc
wireprotov2: support response caching...
r40057
Gregory Szorc
wireprotov2: server support for sending content redirects...
r40061 redirectable = True
if not self.cacheapi:
redirectable = False
elif not self.redirecttargets:
redirectable = False
else:
clienttargets = set(self.redirecttargets)
ourtargets = set(t[b'name'] for t in loadredirecttargets(self.ui))
# We only ever redirect to a single target (for now). So we don't
# need to store which target matched.
if not clienttargets & ourtargets:
redirectable = False
if redirectable:
paths = self.req.dispatchparts[:-3]
paths.append(b'simplecache')
paths.append(self.key)
Gregory Szorc
tests: use baseurl instead of advertisedbaseurl...
r40206 url = b'%s/%s' % (self.req.baseurl, b'/'.join(paths))
Gregory Szorc
wireprotov2: server support for sending content redirects...
r40061
#url = b'http://example.com/%s' % self.key
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 self.ui.log(b'simplecache', b'sending content redirect for %s to '
b'%s\n', self.key, url)
Gregory Szorc
wireprotov2: server support for sending content redirects...
r40061 response = wireprototypes.alternatelocationresponse(
url=url,
mediatype=b'application/mercurial-cbor')
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 return {b'objs': [response]}
Gregory Szorc
wireprotov2: server support for sending content redirects...
r40061
Gregory Szorc
wireprotov2: support response caching...
r40057 if self.cacheobjects:
return {
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 b'objs': entry,
Gregory Szorc
wireprotov2: support response caching...
r40057 }
else:
return {
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 b'objs': [wireprototypes.encodedresponse(entry)],
Gregory Szorc
wireprotov2: support response caching...
r40057 }
def onobject(self, obj):
if self.cacheobjects:
self.buffered.append(obj)
else:
self.buffered.extend(self.encodefn(obj))
yield obj
def onfinished(self):
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 self.ui.log(b'simplecache', b'storing cache entry for %s\n', self.key)
Gregory Szorc
wireprotov2: support response caching...
r40057 if self.cacheobjects:
CACHE[self.key] = self.buffered
else:
CACHE[self.key] = b''.join(self.buffered)
return []
Gregory Szorc
wireprotov2: server support for sending content redirects...
r40061 def makeresponsecacher(orig, repo, proto, command, args, objencoderfn,
redirecttargets, redirecthashes):
return memorycacher(repo.ui, command, objencoderfn, redirecttargets,
redirecthashes, proto._req)
Gregory Szorc
wireprotov2: support response caching...
r40057
Gregory Szorc
wireprotov2: advertise redirect targets in capabilities...
r40059 def loadredirecttargets(ui):
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 path = ui.config(b'simplecache', b'redirectsfile')
Gregory Szorc
wireprotov2: advertise redirect targets in capabilities...
r40059 if not path:
return []
with open(path, 'rb') as fh:
s = fh.read()
return stringutil.evalpythonliteral(s)
def getadvertisedredirecttargets(orig, repo, proto):
return loadredirecttargets(repo.ui)
Gregory Szorc
wireprotov2: support response caching...
r40057 def extsetup(ui):
global CACHE
CACHE = util.lrucachedict(10000)
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 extensions.wrapfunction(wireprotov2server, b'makeresponsecacher',
Gregory Szorc
wireprotov2: support response caching...
r40057 makeresponsecacher)
Pulkit Goyal
py3: byteify tests/wireprotosimplecache.py...
r40254 extensions.wrapfunction(wireprotov2server, b'getadvertisedredirecttargets',
Gregory Szorc
wireprotov2: advertise redirect targets in capabilities...
r40059 getadvertisedredirecttargets)