Mercurial > wikked
changeset 164:a4a64d6b66cb
Fixed various bugs:
- Encode in UTF-8 before doing URL-quoting.
- Don't depend on the Celery app if using synchronous updates.
- The config for synchronous updates is now in the `wikirc`.
- Ability to define ignored directories/files in the `wikirc`.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 12 Jan 2014 00:24:24 -0800 |
parents | cba3a31595c7 |
children | 3b23fe46b1a1 |
files | backend.py wikked/fs.py wikked/resolver.py wikked/resources/defaults.cfg wikked/scm/mercurial.py wikked/tasks.py wikked/utils.py wikked/views/__init__.py wikked/views/edit.py wikked/views/read.py wikked/wiki.py |
diffstat | 11 files changed, 49 insertions(+), 35 deletions(-) [+] |
line wrap: on
line diff
--- a/backend.py Sun Jan 12 00:22:59 2014 -0800 +++ b/backend.py Sun Jan 12 00:24:24 2014 -0800 @@ -1,15 +1,4 @@ -import logging -from celery import Celery - - -logging.basicConfig(level=logging.DEBUG) - - -app = Celery( - 'wikked', - broker='amqp://', - backend='amqp://', - include=['wikked.tasks']) +from wikked.tasks import app if __name__ == '__main__': app.start()
--- a/wikked/fs.py Sun Jan 12 00:22:59 2014 -0800 +++ b/wikked/fs.py Sun Jan 12 00:24:24 2014 -0800 @@ -37,7 +37,7 @@ def __init__(self, root): self.root = unicode(root) - self.excluded = [] + self.excluded = None self.page_extensions = None self.default_extension = '.txt' @@ -45,8 +45,10 @@ self.page_extensions = list(set( itertools.chain(*wiki.formatters.itervalues()))) - self.excluded += wiki.getSpecialFilenames() - self.excluded += wiki.scm.getSpecialFilenames() + excluded = [] + excluded += wiki.getSpecialFilenames() + excluded += wiki.scm.getSpecialFilenames() + self.excluded = [os.path.join(self.root, e) for e in excluded] self.default_extension = wiki.config.get('wiki', 'default_extension') @@ -56,7 +58,15 @@ basepath = self.getPhysicalNamespacePath(subdir) for dirpath, dirnames, filenames in os.walk(basepath): - dirnames[:] = [d for d in dirnames if os.path.join(dirpath, d) not in self.excluded] + incl_dirnames = [] + for d in dirnames: + full_d = os.path.join(dirpath, d) + for e in self.excluded: + if fnmatch.fnmatch(full_d, e): + break + else: + incl_dirnames.append(d) + dirnames[:] = incl_dirnames for filename in filenames: path = os.path.join(dirpath, filename) page_info = self.getPageInfo(path)
--- a/wikked/resolver.py Sun Jan 12 00:22:59 2014 -0800 +++ b/wikked/resolver.py Sun Jan 12 00:24:24 2014 -0800 @@ -196,7 +196,7 @@ raw_url = unicode(m.group('url')) url = self.ctx.getAbsoluteUrl(raw_url) self.output.out_links.append(url) - quoted_url = urllib.quote(url) + quoted_url = urllib.quote(url.encode('utf-8')) if self.wiki.pageExists(url): return '<a class="wiki-link" data-wiki-url="%s">' % quoted_url return '<a class="wiki-link missing" data-wiki-url="%s">' % quoted_url
--- a/wikked/resources/defaults.cfg Sun Jan 12 00:22:59 2014 -0800 +++ b/wikked/resources/defaults.cfg Sun Jan 12 00:24:24 2014 -0800 @@ -7,4 +7,5 @@ indexer=whoosh database=sql database_url=sqlite:///%(root)s/.wiki/wiki.db +async_updates=False
--- a/wikked/scm/mercurial.py Sun Jan 12 00:22:59 2014 -0800 +++ b/wikked/scm/mercurial.py Sun Jan 12 00:24:24 2014 -0800 @@ -41,8 +41,7 @@ self.commit([ignore_path], "Created `.hgignore`.") def getSpecialFilenames(self): - specials = ['.hg', '.hgignore', '.hgtags'] - return [os.path.join(self.root, d) for d in specials] + return ['.hg*'] class MercurialSourceControl(MercurialBaseSourceControl): @@ -217,7 +216,7 @@ if status[0] == 'M': return STATE_MODIFIED raise Exception("Unsupported status: %s" % status) - + def getRevision(self, path, rev): return self.client.cat([path], rev=rev)
--- a/wikked/tasks.py Sun Jan 12 00:22:59 2014 -0800 +++ b/wikked/tasks.py Sun Jan 12 00:24:24 2014 -0800 @@ -1,11 +1,19 @@ import logging -from backend import app +from celery import Celery from wiki import Wiki, WikiParameters logger = logging.getLogger(__name__) +#TODO: Make those settings configurable! +app = Celery( + 'wikked', + broker='amqp://', + backend='amqp://', + include=['wikked.tasks']) + + class wiki_session(object): def __init__(self, wiki_root): self.wiki_root = wiki_root
--- a/wikked/utils.py Sun Jan 12 00:22:59 2014 -0800 +++ b/wikked/utils.py Sun Jan 12 00:24:24 2014 -0800 @@ -62,7 +62,7 @@ raw_abs_url = os.path.join(urldir, url) abs_url = os.path.normpath(raw_abs_url).replace('\\', '/') if quote: - abs_url = urllib.quote(abs_url) + abs_url = urllib.quote(abs_url.encode('utf-8')) return abs_url
--- a/wikked/views/__init__.py Sun Jan 12 00:22:59 2014 -0800 +++ b/wikked/views/__init__.py Sun Jan 12 00:24:24 2014 -0800 @@ -71,7 +71,7 @@ else: meta = dict(page.meta) meta['title'] = page.title - meta['url'] = urllib.quote(page.url) + meta['url'] = urllib.quote(page.url.encode('utf-8')) for name in COERCE_META: if name in meta: meta[name] = COERCE_META[name](meta[name]) @@ -82,7 +82,7 @@ result = [] for item in category: result.append({ - 'url': urllib.quote(item), + 'url': urllib.quote(item.encode('utf-8')), 'name': item }) return result
--- a/wikked/views/edit.py Sun Jan 12 00:22:59 2014 -0800 +++ b/wikked/views/edit.py Sun Jan 12 00:24:24 2014 -0800 @@ -3,7 +3,6 @@ from flask.ext.login import current_user from wikked.page import Page, PageData from wikked.formatter import PageFormatter, FormattingContext -from wikked.tasks import update_wiki from wikked.views import (make_page_title, make_auth_response, get_page_or_none, is_page_writable, get_page_meta, url_from_viewarg, split_url_from_viewarg) @@ -41,7 +40,7 @@ if page is None: result = { 'meta': { - 'url': urllib.quote(url), + 'url': urllib.quote(url.encode('utf-8')), 'title': default_title or make_page_title(url) }, 'text': '' @@ -83,10 +82,7 @@ 'author': author, 'message': message } - do_sync_update = app.config['SYNCHRONOUS_UPDATE'] - g.wiki.setPage(url, page_fields, do_update=do_sync_update) - if not do_sync_update: - update_wiki.delay(g.wiki.root) + g.wiki.setPage(url, page_fields) result = {'saved': 1} return make_auth_response(result)
--- a/wikked/views/read.py Sun Jan 12 00:22:59 2014 -0800 +++ b/wikked/views/read.py Sun Jan 12 00:24:24 2014 -0800 @@ -80,7 +80,7 @@ tpl_data = { 'name': endpoint, 'value': value, - 'safe_value': urllib.quote(value), + 'safe_value': urllib.quote(value.encode('utf-8')), 'pages': [get_page_meta(p) for p in pages] # TODO: skip pages that are forbidden for the current user } @@ -95,7 +95,7 @@ 'meta_value': value, 'query': query, 'meta': { - 'url': urllib.quote(meta_page_url), + 'url': urllib.quote(meta_page_url.encode('utf-8')), 'title': value }, 'text': text
--- a/wikked/wiki.py Sun Jan 12 00:22:59 2014 -0800 +++ b/wikked/wiki.py Sun Jan 12 00:24:24 2014 -0800 @@ -119,6 +119,14 @@ self.auth = UserManager(self.config) + if self.config.getboolean('wiki', 'async_updates'): + logger.debug("Setting up asynchronous updater.") + from tasks import update_wiki + self._updateSetPage = lambda url: update_wiki.delay(self.root) + else: + logger.debug("Setting up simple updater.") + self._updateSetPage = lambda url: self.update(url, cache_ext_data=False) + @property def root(self): return self.fs.root @@ -210,7 +218,7 @@ # Update the DB and index with the new/modified page. if do_update: - self.update(url, cache_ext_data=False) + self._updateSetPage(url) def revertPage(self, url, page_fields): """ Reverts the page with the given URL to an older revision. @@ -254,8 +262,11 @@ return self.scm.getHistory(limit=limit) def getSpecialFilenames(self): - yield os.path.join(self.root, '.wikirc') - yield os.path.join(self.root, '.wiki') + yield '.wikirc' + yield '.wiki' + if self.config.has_section('ignore'): + for name, val in self.config.items('ignore'): + yield val def _cachePages(self, only_urls=None): logger.debug("Caching extended page data...")