# HG changeset patch # User Paul Boddie # Date 1390687884 -3600 # Node ID f1f557da9d75f2fd3b6b1e4978feb04b06f8d2c2 # Parent de7df7ffc597fb41a6d406872348b0d52beca4c2 Updated the patches for Moin to support caching using request parameters, but avoiding the creation of parameter-specific cache entries where nothing will take advantage of them. diff -r de7df7ffc597 -r f1f557da9d75 patches/pageparams-caching-1.8.diff --- a/patches/pageparams-caching-1.8.diff Sat Jan 25 18:40:51 2014 +0100 +++ b/patches/pageparams-caching-1.8.diff Sat Jan 25 23:11:24 2014 +0100 @@ -116,3 +116,100 @@ if request.args: args = request.args.items() args.sort() +# HG changeset patch +# User Paul Boddie +# Date 1390675730 -3600 +# Node ID 561fe9439debfd095753a32d884383c315dde7ec +# Parent 02d1fa8951523776357a9a37235ad5c37f42fcc8 +Added tracking of reported dependencies and prevented generation of specific +cache entries for request parameter combinations when no extension requires or +supports such specific entries. + +diff -r 02d1fa895152 -r 561fe9439deb MoinMoin/Page.py +--- a/MoinMoin/Page.py Fri Jan 24 22:44:56 2014 +0100 ++++ b/MoinMoin/Page.py Sat Jan 25 19:48:50 2014 +0100 +@@ -1339,9 +1339,12 @@ + + def loadCache(self, request): + """ Return page content cache or raises 'CacheNeedsUpdate' """ +- cache = caching.CacheEntry(request, self, self.getCacheKey(request), scope='item') +- attachmentsPath = self.getPagePath('attachments', check_create=0) +- if cache.needsUpdate(self._text_filename(), attachmentsPath): ++ for with_params in (True, False): ++ cache = caching.CacheEntry(request, self, self.getCacheKey(request, with_params), scope='item') ++ attachmentsPath = self.getPagePath('attachments', check_create=0) ++ if not cache.needsUpdate(self._text_filename(), attachmentsPath): ++ break ++ else: + raise Exception('CacheNeedsUpdate') + + import marshal +@@ -1373,7 +1376,10 @@ + code = compile(src.encode(config.charset), + self.page_name.encode(config.charset), 'exec') + self.enforceCacheLimit(request) +- cache = caching.CacheEntry(request, self, self.getCacheKey(request), scope='item') ++ # Determine whether the parameters/args need to be incorporated into the ++ # cache entry key. ++ with_params = "pageparams" in formatter.getReportedDependencies() ++ cache = caching.CacheEntry(request, self, self.getCacheKey(request, with_params), scope='item') + cache.update(marshal.dumps(code)) + return code + +@@ -1392,10 +1398,10 @@ + for item_age, item in item_ages[:-cache_limit]: + item.remove() + +- def getCacheKey(self, request): ++ def getCacheKey(self, request, with_params=False): + """ Generate a cache key for a page using optional request information """ + key = self.getFormatterName(request) +- if request.args: ++ if with_params and request.args: + args = request.args.items() + args.sort() + key_args = [] +diff -r 02d1fa895152 -r 561fe9439deb MoinMoin/formatter/text_python.py +--- a/MoinMoin/formatter/text_python.py Fri Jan 24 22:44:56 2014 +0100 ++++ b/MoinMoin/formatter/text_python.py Sat Jan 25 19:48:50 2014 +0100 +@@ -10,6 +10,7 @@ + + import time + from MoinMoin import wikiutil ++from MoinMoin.support.python_compatibility import set + + + class Formatter: +@@ -40,6 +41,12 @@ + self.text_cmd_begin = '\nrequest.write(' + self.text_cmd_end = ')\n' + ++ # Record dependency requirements of certain content ++ self.__dependencies = set() ++ ++ def getReportedDependencies(self): ++ return self.__dependencies ++ + def assemble_code(self, text): + """inserts the code into the generated text + """ +@@ -186,7 +193,10 @@ + return self.formatter.div(on, **kw) + + def macro(self, macro_obj, name, args, markup=None): +- if self.__is_static(macro_obj.get_dependencies(name)): ++ Dependencies = macro_obj.get_dependencies(name) ++ self.__dependencies.update(Dependencies) ++ ++ if self.__is_static(Dependencies): + # XXX: why is this necessary?? + macro_obj.formatter = self + return macro_obj.execute(name, args) +@@ -204,6 +214,7 @@ + Dependencies = wikiutil.searchAndImportPlugin(self.request.cfg, "parser", parser_name, "Dependencies") + except (wikiutil.PluginMissingError, wikiutil.PluginAttributeError): + Dependencies = self.defaultDependencies ++ self.__dependencies.update(Dependencies) + + if self.__is_static(Dependencies): + return self.formatter.parser(parser_name, lines) diff -r de7df7ffc597 -r f1f557da9d75 patches/pageparams-caching-1.9.diff --- a/patches/pageparams-caching-1.9.diff Sat Jan 25 18:40:51 2014 +0100 +++ b/patches/pageparams-caching-1.9.diff Sat Jan 25 23:11:24 2014 +0100 @@ -116,3 +116,100 @@ if request.args: args = request.args.items() args.sort() +# HG changeset patch +# User Paul Boddie +# Date 1390675730 -3600 +# Node ID 908ceaf41dbe9f664f0c0813abc7b4c0611022fe +# Parent e3850612c891d5b6468f212acd797413c70fe18f +Added tracking of reported dependencies and prevented generation of specific +cache entries for request parameter combinations when no extension requires or +supports such specific entries. + +diff -r e3850612c891 -r 908ceaf41dbe MoinMoin/Page.py +--- a/MoinMoin/Page.py Fri Jan 24 22:44:56 2014 +0100 ++++ b/MoinMoin/Page.py Sat Jan 25 19:48:50 2014 +0100 +@@ -1354,9 +1354,12 @@ + + def loadCache(self, request): + """ Return page content cache or raises 'CacheNeedsUpdate' """ +- cache = caching.CacheEntry(request, self, self.getCacheKey(request), scope='item') +- attachmentsPath = self.getPagePath('attachments', check_create=0) +- if cache.needsUpdate(self._text_filename(), attachmentsPath): ++ for with_params in (True, False): ++ cache = caching.CacheEntry(request, self, self.getCacheKey(request, with_params), scope='item') ++ attachmentsPath = self.getPagePath('attachments', check_create=0) ++ if not cache.needsUpdate(self._text_filename(), attachmentsPath): ++ break ++ else: + raise Exception('CacheNeedsUpdate') + + import marshal +@@ -1388,7 +1391,10 @@ + code = compile(src.encode(config.charset), + self.page_name.encode(config.charset), 'exec') + self.enforceCacheLimit(request) +- cache = caching.CacheEntry(request, self, self.getCacheKey(request), scope='item') ++ # Determine whether the parameters/args need to be incorporated into the ++ # cache entry key. ++ with_params = "pageparams" in formatter.getReportedDependencies() ++ cache = caching.CacheEntry(request, self, self.getCacheKey(request, with_params), scope='item') + cache.update(marshal.dumps(code)) + return code + +@@ -1407,10 +1413,10 @@ + for item_age, item in item_ages[:-cache_limit]: + item.remove() + +- def getCacheKey(self, request): ++ def getCacheKey(self, request, with_params=False): + """ Generate a cache key for a page using optional request information """ + key = self.getFormatterName(request) +- if request.args: ++ if with_params and request.args: + args = request.args.items() + args.sort() + key_args = [] +diff -r e3850612c891 -r 908ceaf41dbe MoinMoin/formatter/text_python.py +--- a/MoinMoin/formatter/text_python.py Fri Jan 24 22:44:56 2014 +0100 ++++ b/MoinMoin/formatter/text_python.py Sat Jan 25 19:48:50 2014 +0100 +@@ -10,6 +10,7 @@ + + import time + from MoinMoin import wikiutil ++from MoinMoin.support.python_compatibility import set + + + class Formatter: +@@ -40,6 +41,12 @@ + self.text_cmd_begin = '\nrequest.write(' + self.text_cmd_end = ')\n' + ++ # Record dependency requirements of certain content ++ self.__dependencies = set() ++ ++ def getReportedDependencies(self): ++ return self.__dependencies ++ + def assemble_code(self, text): + """inserts the code into the generated text + """ +@@ -186,7 +193,10 @@ + return self.formatter.div(on, **kw) + + def macro(self, macro_obj, name, args, markup=None): +- if self.__is_static(macro_obj.get_dependencies(name)): ++ Dependencies = macro_obj.get_dependencies(name) ++ self.__dependencies.update(Dependencies) ++ ++ if self.__is_static(Dependencies): + # XXX: why is this necessary?? + macro_obj.formatter = self + return macro_obj.execute(name, args) +@@ -204,6 +214,7 @@ + Dependencies = wikiutil.searchAndImportPlugin(self.request.cfg, "parser", parser_name, "Dependencies") + except (wikiutil.PluginMissingError, wikiutil.PluginAttributeError): + Dependencies = self.defaultDependencies ++ self.__dependencies.update(Dependencies) + + if self.__is_static(Dependencies): + return self.formatter.parser(parser_name, lines)