Return-Path: X-Original-To: apmail-incubator-allura-commits-archive@minotaur.apache.org Delivered-To: apmail-incubator-allura-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 7F75BF4AF for ; Tue, 7 May 2013 22:30:44 +0000 (UTC) Received: (qmail 66428 invoked by uid 500); 7 May 2013 22:30:44 -0000 Delivered-To: apmail-incubator-allura-commits-archive@incubator.apache.org Received: (qmail 66406 invoked by uid 500); 7 May 2013 22:30:44 -0000 Mailing-List: contact allura-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: allura-dev@incubator.apache.org Delivered-To: mailing list allura-commits@incubator.apache.org Received: (qmail 66341 invoked by uid 99); 7 May 2013 22:30:43 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 07 May 2013 22:30:43 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id AB955889197; Tue, 7 May 2013 22:30:43 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: tvansteenburgh@apache.org To: allura-commits@incubator.apache.org Date: Tue, 07 May 2013 22:30:47 -0000 Message-Id: In-Reply-To: <49a607bfcd414c2da545a4b0f49288bc@git.apache.org> References: <49a607bfcd414c2da545a4b0f49288bc@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [05/50] [abbrv] git commit: [#6172] Remove default TG file extension handling. [#6172] Remove default TG file extension handling. Repo names can now have dots in them, and TG was stripping the dot and everything after it from the repo name in the url. Rather than adding another hack to piece the URL back together, we're turning off this behavior. Some controllers were relying on the extension stripping to automatically forward `feed.{rss|atom}` -> `feed`. In these cases, explicit attrs for rss and atom were added to the controller. Signed-off-by: Tim Van Steenburgh Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/7244932d Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/7244932d Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/7244932d Branch: refs/heads/tv/3876 Commit: 7244932d5eee45ec5289b90b78c8b3d98df22226 Parents: 50f9a49 Author: Tim Van Steenburgh Authored: Tue Apr 30 13:45:41 2013 +0000 Committer: Dave Brondsema Committed: Tue Apr 30 19:45:59 2013 +0000 ---------------------------------------------------------------------- Allura/allura/config/app_cfg.py | 1 + Allura/allura/controllers/discuss.py | 4 ++++ Allura/allura/controllers/repository.py | 10 ++++------ Allura/allura/ext/user_profile/user_main.py | 4 ++++ Allura/allura/lib/base.py | 15 +++++++++++++++ Allura/allura/lib/patches.py | 8 ++++++-- .../allura/tests/functional/test_user_profile.py | 7 ++++--- .../forgediscussion/controllers/root.py | 4 ++++ .../forgediscussion/tests/functional/test_forum.py | 4 +++- .../forgegit/tests/functional/test_controllers.py | 3 ++- ForgeLink/forgelink/link_main.py | 5 ----- ForgeSVN/forgesvn/svn_main.py | 2 ++ .../forgesvn/tests/functional/test_controllers.py | 4 ++-- .../forgetracker/tests/functional/test_root.py | 7 +++---- ForgeTracker/forgetracker/tracker_main.py | 2 ++ ForgeWiki/forgewiki/tests/functional/test_root.py | 4 ++++ ForgeWiki/forgewiki/wiki_main.py | 5 ----- 17 files changed, 60 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/Allura/allura/config/app_cfg.py ---------------------------------------------------------------------- diff --git a/Allura/allura/config/app_cfg.py b/Allura/allura/config/app_cfg.py index c947fe1..f6b11e4 100644 --- a/Allura/allura/config/app_cfg.py +++ b/Allura/allura/config/app_cfg.py @@ -61,6 +61,7 @@ class ForgeConfig(AppConfig): self.use_transaction_manager = False # self.handle_status_codes = [ 403, 404 ] self.handle_status_codes = [ 403, 404 ] + self.disable_request_extensions = True def after_init_config(self): config['pylons.strict_c'] = True http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/Allura/allura/controllers/discuss.py ---------------------------------------------------------------------- diff --git a/Allura/allura/controllers/discuss.py b/Allura/allura/controllers/discuss.py index 218f9b4..5abb3a2 100644 --- a/Allura/allura/controllers/discuss.py +++ b/Allura/allura/controllers/discuss.py @@ -73,6 +73,8 @@ class DiscussionController(BaseController): W=WidgetConfig def __init__(self): + setattr(self, 'feed.rss', self.feed) + setattr(self, 'feed.atom', self.feed) if not hasattr(self, 'ThreadController'): self.ThreadController = ThreadController if not hasattr(self, 'PostController'): @@ -168,6 +170,8 @@ class ThreadController(BaseController): require_access(self.thread.ref.artifact, 'read') def __init__(self, discussion_controller, thread_id): + setattr(self, 'feed.rss', self.feed) + setattr(self, 'feed.atom', self.feed) self._discussion_controller = discussion_controller self.discussion = discussion_controller.discussion self.thread = self.M.Thread.query.get(_id=thread_id) http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/Allura/allura/controllers/repository.py ---------------------------------------------------------------------- diff --git a/Allura/allura/controllers/repository.py b/Allura/allura/controllers/repository.py index 319506e..5e006ba 100644 --- a/Allura/allura/controllers/repository.py +++ b/Allura/allura/controllers/repository.py @@ -65,6 +65,10 @@ class RepoRootController(BaseController): _discuss = AppDiscussionController() commit_browser_widget=SCMCommitBrowserWidget() + def __init__(self): + setattr(self, 'feed.atom', self.feed) + setattr(self, 'feed.rss', self.feed) + def _check_security(self): security.require(security.has_access(c.app, 'read')) @@ -538,12 +542,6 @@ class TreeBrowser(BaseController, DispatchIndex): @expose() def _lookup(self, next, *rest): - if not rest and request.response_ext: - # Directory name may ends with file extension (e.g. `dir.rdf`) - # dispatching system will cut extension, so we need to restore it - next = "%s%s" % (next, request.response_ext) - request.response_ext = None - request.response_type = None next = h.really_unicode(unquote(next)) if not rest: # Might be a file rather than a dir http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/Allura/allura/ext/user_profile/user_main.py ---------------------------------------------------------------------- diff --git a/Allura/allura/ext/user_profile/user_main.py b/Allura/allura/ext/user_profile/user_main.py index bc2b942..0491199 100644 --- a/Allura/allura/ext/user_profile/user_main.py +++ b/Allura/allura/ext/user_profile/user_main.py @@ -81,6 +81,10 @@ class UserProfileApp(Application): class UserProfileController(BaseController): + def __init__(self): + setattr(self, 'feed.rss', self.feed) + setattr(self, 'feed.atom', self.feed) + def _check_security(self): require_access(c.project, 'read') http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/Allura/allura/lib/base.py ---------------------------------------------------------------------- diff --git a/Allura/allura/lib/base.py b/Allura/allura/lib/base.py index 4bd5a63..409b77c 100644 --- a/Allura/allura/lib/base.py +++ b/Allura/allura/lib/base.py @@ -19,6 +19,7 @@ """The base Controller API.""" from webob import exc +import pylons from tg import TGController, config __all__ = ['WsgiDispatchController'] @@ -51,4 +52,18 @@ class WsgiDispatchController(TGController): for chunk in response: yield chunk self._cleanup_request() + def _get_dispatchable(self, url_path): + """Patch ``TGController._get_dispatchable`` by overriding. + This fixes a bug in TG 2.1.5 that causes ``request.response_type`` + to not be created if ``disable_request_extensions = True`` (see + allura/config/app_cfg.py). + + ``request.response_type`` must be set because the "trailing slash" + decorators use it (see allura/lib/patches.py). + + This entire method can be removed if/when we upgrade to TG >= 2.2.1 + + """ + pylons.request.response_type = None + return super(WsgiDispatchController, self)._get_dispatchable(url_path) http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/Allura/allura/lib/patches.py ---------------------------------------------------------------------- diff --git a/Allura/allura/lib/patches.py b/Allura/allura/lib/patches.py index adbc4bc..ef6fba5 100644 --- a/Allura/allura/lib/patches.py +++ b/Allura/allura/lib/patches.py @@ -61,7 +61,9 @@ def apply(): @decorator def without_trailing_slash(func, *args, **kwargs): '''Monkey-patched to use 301 redirects for SEO''' - if request.method == 'GET' and request.path.endswith('/') and not(request.response_type) and len(request.params)==0: + response_type = getattr(request, 'response_type', None) + if (request.method == 'GET' and request.path.endswith('/') + and not response_type and len(request.params)==0): raise webob.exc.HTTPMovedPermanently(location=request.url[:-1]) return func(*args, **kwargs) @@ -69,7 +71,9 @@ def apply(): @decorator def with_trailing_slash(func, *args, **kwargs): '''Monkey-patched to use 301 redirects for SEO''' - if request.method == 'GET' and not(request.path.endswith('/')) and not(request.response_type) and len(request.params)==0: + response_type = getattr(request, 'response_type', None) + if (request.method == 'GET' and not(request.path.endswith('/')) + and not response_type and len(request.params)==0): raise webob.exc.HTTPMovedPermanently(location=request.url+'/') return func(*args, **kwargs) http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/Allura/allura/tests/functional/test_user_profile.py ---------------------------------------------------------------------- diff --git a/Allura/allura/tests/functional/test_user_profile.py b/Allura/allura/tests/functional/test_user_profile.py index a8d724a..e5a9aef 100644 --- a/Allura/allura/tests/functional/test_user_profile.py +++ b/Allura/allura/tests/functional/test_user_profile.py @@ -53,6 +53,7 @@ class TestUserProfile(TestController): @td.with_user_project('test-admin') @td.with_wiki def test_feed(self): - response = self.app.get('/u/test-admin/profile/feed') - assert 'Recent posts by Test Admin' in response - assert 'Home modified by Test Admin' in response + for ext in ['', '.rss', '.atom']: + r = self.app.get('/u/test-admin/profile/feed%s' % ext, status=200) + assert 'Recent posts by Test Admin' in r + assert 'Home modified by Test Admin' in r http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/ForgeDiscussion/forgediscussion/controllers/root.py ---------------------------------------------------------------------- diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py index d9058fb..02c3cde 100644 --- a/ForgeDiscussion/forgediscussion/controllers/root.py +++ b/ForgeDiscussion/forgediscussion/controllers/root.py @@ -58,6 +58,10 @@ class RootController(BaseController, DispatchIndex): search_results = SearchResults() search_help = SearchHelp(comments=False, history=False) + def __init__(self): + setattr(self, 'feed.rss', self.feed) + setattr(self, 'feed.atom', self.feed) + def _check_security(self): require_access(c.app, 'read') http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/ForgeDiscussion/forgediscussion/tests/functional/test_forum.py ---------------------------------------------------------------------- diff --git a/ForgeDiscussion/forgediscussion/tests/functional/test_forum.py b/ForgeDiscussion/forgediscussion/tests/functional/test_forum.py index e408189..73b6682 100644 --- a/ForgeDiscussion/forgediscussion/tests/functional/test_forum.py +++ b/ForgeDiscussion/forgediscussion/tests/functional/test_forum.py @@ -730,4 +730,6 @@ class TestForum(TestController): assert ' Mark as Spam' not in thread_sidebarmenu def test_feed(self): - r = self.app.get('/discussion/general/feed', status=200) + for ext in ['', '.rss', '.atom']: + self.app.get('/discussion/feed%s' % ext, status=200) + self.app.get('/discussion/general/feed%s' % ext, status=200) http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/ForgeGit/forgegit/tests/functional/test_controllers.py ---------------------------------------------------------------------- diff --git a/ForgeGit/forgegit/tests/functional/test_controllers.py b/ForgeGit/forgegit/tests/functional/test_controllers.py index 78a8d7e..186b46a 100644 --- a/ForgeGit/forgegit/tests/functional/test_controllers.py +++ b/ForgeGit/forgegit/tests/functional/test_controllers.py @@ -156,7 +156,8 @@ class TestRootController(_TestCase): assert 'Rick' in resp, resp.showbrowser() def test_feed(self): - assert 'Add README' in self.app.get('/feed') + for ext in ['', '.rss', '.atom']: + assert 'Add README' in self.app.get('/feed%s' % ext) def test_tree(self): ci = self._get_ci() http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/ForgeLink/forgelink/link_main.py ---------------------------------------------------------------------- diff --git a/ForgeLink/forgelink/link_main.py b/ForgeLink/forgelink/link_main.py index 121c8cf..1f5fb2e 100644 --- a/ForgeLink/forgelink/link_main.py +++ b/ForgeLink/forgelink/link_main.py @@ -104,11 +104,6 @@ class RootController(BaseController): @expose() def _lookup(self, *remainder): path = "/".join(remainder) - # HACK: The TG request extension machinery will strip off the end of - # a dotted wiki page name if it matches a known file extension. Here, - # we reassemble the original page name. - if request.response_ext: - path += request.response_ext url = c.app.config.options.get('url') if url: permanent_redirect(url + h.really_unicode(path).encode('utf-8')) http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/ForgeSVN/forgesvn/svn_main.py ---------------------------------------------------------------------- diff --git a/ForgeSVN/forgesvn/svn_main.py b/ForgeSVN/forgesvn/svn_main.py index cca94f7..ef7d008 100644 --- a/ForgeSVN/forgesvn/svn_main.py +++ b/ForgeSVN/forgesvn/svn_main.py @@ -65,6 +65,8 @@ class ForgeSVNApp(RepositoryApp): default_root = RepoRootController() self.root.refresh = default_root.refresh self.root.feed = default_root.feed + setattr(self.root, 'feed.rss', self.root.feed) + setattr(self.root, 'feed.atom', self.root.feed) self.root.commit_browser = default_root.commit_browser self.root.commit_browser_data = default_root.commit_browser_data self.root.status = default_root.status http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/ForgeSVN/forgesvn/tests/functional/test_controllers.py ---------------------------------------------------------------------- diff --git a/ForgeSVN/forgesvn/tests/functional/test_controllers.py b/ForgeSVN/forgesvn/tests/functional/test_controllers.py index c5d340c..90af545 100644 --- a/ForgeSVN/forgesvn/tests/functional/test_controllers.py +++ b/ForgeSVN/forgesvn/tests/functional/test_controllers.py @@ -90,8 +90,8 @@ class TestRootController(SVNTestController): assert val['message'] == 'Create readme' def test_feed(self): - r = self.app.get('/src/feed.rss') - assert 'Remove hello.txt' in str(r), r + for ext in ['', '.rss', '.atom']: + assert 'Remove hello.txt' in self.app.get('/src/feed%s' % ext) def test_commit(self): resp = self.app.get('/src/3/tree/') http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/ForgeTracker/forgetracker/tests/functional/test_root.py ---------------------------------------------------------------------- diff --git a/ForgeTracker/forgetracker/tests/functional/test_root.py b/ForgeTracker/forgetracker/tests/functional/test_root.py index e193a10..dfaaba1 100644 --- a/ForgeTracker/forgetracker/tests/functional/test_root.py +++ b/ForgeTracker/forgetracker/tests/functional/test_root.py @@ -828,10 +828,9 @@ class TestFunctionalController(TrackerTestController): ThreadLocalORMSession.flush_all() M.MonQTask.run_ready() ThreadLocalORMSession.flush_all() - response = self.app.get('/p/test/bugs/search_feed?q=test') - assert 'test first ticket' in response - response = self.app.get('/p/test/bugs/search_feed.atom?q=test') - assert 'test first ticket' in response + for ext in ['', '.rss', '.atom']: + assert 'test first ticket' in \ + self.app.get('/p/test/bugs/search_feed%s?q=test' % ext) def test_search_current_user(self): self.new_ticket(summary='test first ticket') http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/ForgeTracker/forgetracker/tracker_main.py ---------------------------------------------------------------------- diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py index 8d786d9..349ef1e 100644 --- a/ForgeTracker/forgetracker/tracker_main.py +++ b/ForgeTracker/forgetracker/tracker_main.py @@ -472,6 +472,8 @@ class RootController(BaseController): def __init__(self): setattr(self, 'feed.atom', self.feed) setattr(self, 'feed.rss', self.feed) + setattr(self, 'search_feed.atom', self.search_feed) + setattr(self, 'search_feed.rss', self.search_feed) self._discuss = AppDiscussionController() def _check_security(self): http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/ForgeWiki/forgewiki/tests/functional/test_root.py ---------------------------------------------------------------------- diff --git a/ForgeWiki/forgewiki/tests/functional/test_root.py b/ForgeWiki/forgewiki/tests/functional/test_root.py index 14e70c6..d928e70 100644 --- a/ForgeWiki/forgewiki/tests/functional/test_root.py +++ b/ForgeWiki/forgewiki/tests/functional/test_root.py @@ -80,6 +80,10 @@ class TestRootController(TestController): response = self.app.get('/wiki/search?q=tést') assert 'Search wiki: tést' in response + def test_feed(self): + for ext in ['', '.rss', '.atom']: + self.app.get('/wiki/feed%s' % ext, status=200) + @patch('allura.lib.search.search') def test_search(self, search): r = self.app.get('/wiki/search?q=test') http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7244932d/ForgeWiki/forgewiki/wiki_main.py ---------------------------------------------------------------------- diff --git a/ForgeWiki/forgewiki/wiki_main.py b/ForgeWiki/forgewiki/wiki_main.py index 23ca7f2..b923350 100644 --- a/ForgeWiki/forgewiki/wiki_main.py +++ b/ForgeWiki/forgewiki/wiki_main.py @@ -296,11 +296,6 @@ class RootController(BaseController, DispatchIndex): @expose() def _lookup(self, pname, *remainder): """Instantiate a Page object, and continue dispatch there.""" - # HACK: The TG request extension machinery will strip off the end of - # a dotted wiki page name if it matches a known file extension. Here, - # we reassemble the original page name. - if request.response_ext and not remainder: - pname += request.response_ext return PageController(pname), remainder @expose()