diff --git a/pylons_app/config/routing.py b/pylons_app/config/routing.py --- a/pylons_app/config/routing.py +++ b/pylons_app/config/routing.py @@ -22,8 +22,32 @@ def make_map(config): map.connect('hg_home', '/', controller='hg', action='index') - #REST controllers - map.resource('repo', 'repos', path_prefix='/_admin') + #REST routes + with map.submapper(path_prefix='/_admin', controller='repos') as m: + m.connect("repos", "/repos", + action="create", conditions=dict(method=["POST"])) + m.connect("repos", "/repos", + action="index", conditions=dict(method=["GET"])) + m.connect("formatted_repos", "/repos.{format}", + action="index", + conditions=dict(method=["GET"])) + m.connect("new_repo", "/repos/new", + action="new", conditions=dict(method=["GET"])) + m.connect("formatted_new_repo", "/repos/new.{format}", + action="new", conditions=dict(method=["GET"])) + m.connect("/repos/{id:.*}", + action="update", conditions=dict(method=["PUT"])) + m.connect("/repos/{id:.*}", + action="delete", conditions=dict(method=["DELETE"])) + m.connect("edit_repo", "/repos/{id:.*}/edit", + action="edit", conditions=dict(method=["GET"])) + m.connect("formatted_edit_repo", "/repos/{id:.*}.{format}/edit", + action="edit", conditions=dict(method=["GET"])) + m.connect("repo", "/repos/{id:.*}", + action="show", conditions=dict(method=["GET"])) + m.connect("formatted_repo", "/repos/{id:.*}.{format}", + action="show", conditions=dict(method=["GET"])) + map.resource('user', 'users', path_prefix='/_admin') map.resource('permission', 'permissions', path_prefix='/_admin') @@ -34,34 +58,34 @@ def make_map(config): action='add_repo') #FEEDS - map.connect('rss_feed_home', '/{repo_name}/feed/rss', + map.connect('rss_feed_home', '/{repo_name:.*}/feed/rss', controller='feed', action='rss') - map.connect('atom_feed_home', '/{repo_name}/feed/atom', + map.connect('atom_feed_home', '/{repo_name:.*}/feed/atom', controller='feed', action='atom') map.connect('login_home', '/login', controller='login') map.connect('logout_home', '/logout', controller='login', action='logout') - map.connect('changeset_home', '/{repo_name}/changeset/{revision}', + map.connect('changeset_home', '/{repo_name:.*}/changeset/{revision}', controller='changeset', revision='tip') - map.connect('summary_home', '/{repo_name}/summary', + map.connect('summary_home', '/{repo_name:.*}/summary', controller='summary') - map.connect('shortlog_home', '/{repo_name}/shortlog', + map.connect('shortlog_home', '/{repo_name:.*}/shortlog', controller='shortlog') - map.connect('branches_home', '/{repo_name}/branches', + map.connect('branches_home', '/{repo_name:.*}/branches', controller='branches') - map.connect('tags_home', '/{repo_name}/tags', + map.connect('tags_home', '/{repo_name:.*}/tags', controller='tags') - map.connect('changelog_home', '/{repo_name}/changelog', + map.connect('changelog_home', '/{repo_name:.*}/changelog', controller='changelog') - map.connect('files_home', '/{repo_name}/files/{revision}/{f_path:.*}', + map.connect('files_home', '/{repo_name:.*}/files/{revision}/{f_path:.*}', controller='files', revision='tip', f_path='') - map.connect('files_diff_home', '/{repo_name}/diff/{f_path:.*}', + map.connect('files_diff_home', '/{repo_name:.*}/diff/{f_path:.*}', controller='files', action='diff', revision='tip', f_path='') - map.connect('files_raw_home', '/{repo_name}/rawfile/{revision}/{f_path:.*}', + map.connect('files_raw_home', '/{repo_name:.*}/rawfile/{revision}/{f_path:.*}', controller='files', action='rawfile', revision='tip', f_path='') - map.connect('files_annotate_home', '/{repo_name}/annotate/{revision}/{f_path:.*}', + map.connect('files_annotate_home', '/{repo_name:.*}/annotate/{revision}/{f_path:.*}', controller='files', action='annotate', revision='tip', f_path='') - map.connect('files_archive_home', '/{repo_name}/archive/{revision}/{fileformat}', + map.connect('files_archive_home', '/{repo_name:.*}/archive/{revision}/{fileformat}', controller='files', action='archivefile', revision='tip') return map diff --git a/pylons_app/controllers/repos.py b/pylons_app/controllers/repos.py --- a/pylons_app/controllers/repos.py +++ b/pylons_app/controllers/repos.py @@ -2,6 +2,8 @@ from pylons import request, response, se app_globals as g from pylons.controllers.util import abort, redirect from pylons_app.lib.auth import LoginRequired +from pylons.i18n.translation import _ +from pylons_app.lib import helpers as h from pylons_app.lib.base import BaseController, render from pylons_app.lib.filters import clean_repo from pylons_app.lib.utils import check_repo, invalidate_cache @@ -39,6 +41,7 @@ class ReposController(BaseController): self._create_repo(name) #clear our cached list for refresh with new repo invalidate_cache('cached_repo_list') + h.flash(_('created repository %s') % name, category='success') except Exception as e: log.error(e) @@ -85,7 +88,7 @@ class ReposController(BaseController): #clear our cached list for refresh with new repo invalidate_cache('cached_repo_list') - + h.flash(_('deleted repository %s') % rm_path, category='success') return redirect(url('repos')) diff --git a/pylons_app/lib/middleware/simplehg.py b/pylons_app/lib/middleware/simplehg.py --- a/pylons_app/lib/middleware/simplehg.py +++ b/pylons_app/lib/middleware/simplehg.py @@ -50,8 +50,9 @@ class SimpleHg(object): return result.wsgi_application(environ, start_response) try: - repo_name = environ['PATH_INFO'].split('/')[1] - except: + repo_name = '/'.join(environ['PATH_INFO'].split('/')[1:]) + except Exception as e: + log.error(e) return HTTPNotFound()(environ, start_response) #since we wrap into hgweb, just reset the path @@ -63,6 +64,7 @@ class SimpleHg(object): try: app = wsgiapplication(self.__make_app) except Exception as e: + log.error(e) return HTTPNotFound()(environ, start_response) action = self.__get_action(environ) #invalidate cache on push diff --git a/pylons_app/lib/utils.py b/pylons_app/lib/utils.py --- a/pylons_app/lib/utils.py +++ b/pylons_app/lib/utils.py @@ -6,10 +6,7 @@ log = logging.getLogger(__name__) def get_repo_slug(request): - path_info = request.environ.get('PATH_INFO') - uri_lst = path_info.split('/') - repo_name = uri_lst[1] - return repo_name + return request.environ['pylons.routes_dict'].get('repo_name') def is_mercurial(environ): """ @@ -131,14 +128,7 @@ class EmptyChangeset(BaseChangeset): def repo2db_mapper(): """ - put ! + scann all dirs for .hgdbid + if some dir doesn't have one generate one. """ - pass - #scann all dirs for .hgdbid - #if some dir doesn't have one generate one. - # - - - - - + pass \ No newline at end of file diff --git a/pylons_app/model/hg_model.py b/pylons_app/model/hg_model.py --- a/pylons_app/model/hg_model.py +++ b/pylons_app/model/hg_model.py @@ -82,7 +82,13 @@ class HgModel(object): repos_list = {} for name, path in repos: try: - repos_list[name] = MercurialRepository(path, baseui=baseui) + #name = name.split('/')[-1] + if repos_list.has_key(name): + raise RepositoryError('Duplicate repository name %s found in' + ' %s' % (name, path)) + else: + repos_list[name] = MercurialRepository(path, baseui=baseui) + repos_list[name].name = name except OSError: continue return repos_list