Show More
@@ -8,6 +8,7 b' from pylons.middleware import ErrorHandl' | |||||
8 | from pylons.wsgiapp import PylonsApp |
|
8 | from pylons.wsgiapp import PylonsApp | |
9 | from routes.middleware import RoutesMiddleware |
|
9 | from routes.middleware import RoutesMiddleware | |
10 | from rhodecode.lib.middleware.simplehg import SimpleHg |
|
10 | from rhodecode.lib.middleware.simplehg import SimpleHg | |
|
11 | from rhodecode.lib.middleware.simplegit import SimpleGit | |||
11 | from rhodecode.lib.middleware.https_fixup import HttpsFixup |
|
12 | from rhodecode.lib.middleware.https_fixup import HttpsFixup | |
12 | from rhodecode.config.environment import load_environment |
|
13 | from rhodecode.config.environment import load_environment | |
13 |
|
14 | |||
@@ -35,15 +36,16 b' def make_app(global_conf, full_stack=Tru' | |||||
35 |
|
36 | |||
36 | # The Pylons WSGI app |
|
37 | # The Pylons WSGI app | |
37 | app = PylonsApp(config=config) |
|
38 | app = PylonsApp(config=config) | |
38 |
|
39 | |||
39 | # Routing/Session/Cache Middleware |
|
40 | # Routing/Session/Cache Middleware | |
40 | app = RoutesMiddleware(app, config['routes.map']) |
|
41 | app = RoutesMiddleware(app, config['routes.map']) | |
41 | app = SessionMiddleware(app, config) |
|
42 | app = SessionMiddleware(app, config) | |
42 |
|
43 | |||
43 | # CUSTOM MIDDLEWARE HERE (filtered by error handling middlewares) |
|
44 | # CUSTOM MIDDLEWARE HERE (filtered by error handling middlewares) | |
44 |
|
45 | |||
45 | app = SimpleHg(app, config) |
|
46 | app = SimpleHg(app, config) | |
46 |
|
47 | app = SimpleGit(app, config) | ||
|
48 | ||||
47 | if asbool(full_stack): |
|
49 | if asbool(full_stack): | |
48 | # Handle Python exceptions |
|
50 | # Handle Python exceptions | |
49 | app = ErrorHandler(app, global_conf, **config['pylons.errorware']) |
|
51 | app = ErrorHandler(app, global_conf, **config['pylons.errorware']) | |
@@ -54,10 +56,10 b' def make_app(global_conf, full_stack=Tru' | |||||
54 | app = StatusCodeRedirect(app) |
|
56 | app = StatusCodeRedirect(app) | |
55 | else: |
|
57 | else: | |
56 | app = StatusCodeRedirect(app, [400, 401, 403, 404, 500]) |
|
58 | app = StatusCodeRedirect(app, [400, 401, 403, 404, 500]) | |
57 |
|
59 | |||
58 | #enable https redirets based on HTTP_X_URL_SCHEME set by proxy |
|
60 | #enable https redirets based on HTTP_X_URL_SCHEME set by proxy | |
59 | app = HttpsFixup(app) |
|
61 | app = HttpsFixup(app) | |
60 |
|
62 | |||
61 | # Establish the Registry for this application |
|
63 | # Establish the Registry for this application | |
62 | app = RegistryManager(app) |
|
64 | app = RegistryManager(app) | |
63 |
|
65 | |||
@@ -65,7 +67,7 b' def make_app(global_conf, full_stack=Tru' | |||||
65 | # Serve static files |
|
67 | # Serve static files | |
66 | static_app = StaticURLParser(config['pylons.paths']['static_files']) |
|
68 | static_app = StaticURLParser(config['pylons.paths']['static_files']) | |
67 | app = Cascade([static_app, app]) |
|
69 | app = Cascade([static_app, app]) | |
68 |
|
70 | |||
69 | app.config = config |
|
71 | app.config = config | |
70 |
|
72 | |||
71 | return app |
|
73 | return app |
@@ -101,7 +101,7 b' def get_commits_stats(repo_name, ts_min_' | |||||
101 | commits_by_day_aggregate = {} |
|
101 | commits_by_day_aggregate = {} | |
102 | repos_path = get_hg_ui_settings()['paths_root_path'] |
|
102 | repos_path = get_hg_ui_settings()['paths_root_path'] | |
103 | p = os.path.join(repos_path, repo_name) |
|
103 | p = os.path.join(repos_path, repo_name) | |
104 |
repo = get_repo( |
|
104 | repo = get_repo(p) | |
105 |
|
105 | |||
106 | skip_date_limit = True |
|
106 | skip_date_limit = True | |
107 | parse_limit = 250 #limit for single task changeset parsing optimal for |
|
107 | parse_limit = 250 #limit for single task changeset parsing optimal for | |
@@ -312,10 +312,8 b' def __get_codes_stats(repo_name):' | |||||
312 |
|
312 | |||
313 | repos_path = get_hg_ui_settings()['paths_root_path'] |
|
313 | repos_path = get_hg_ui_settings()['paths_root_path'] | |
314 | p = os.path.join(repos_path, repo_name) |
|
314 | p = os.path.join(repos_path, repo_name) | |
315 |
repo = get_repo( |
|
315 | repo = get_repo(p) | |
316 |
|
||||
317 | tip = repo.get_changeset() |
|
316 | tip = repo.get_changeset() | |
318 |
|
||||
319 | code_stats = {} |
|
317 | code_stats = {} | |
320 |
|
318 | |||
321 | def aggregate(cs): |
|
319 | def aggregate(cs): |
@@ -23,6 +23,7 b' from webhelpers.pylonslib.secure_form im' | |||||
23 | from webhelpers.text import chop_at, collapse, convert_accented_entities, \ |
|
23 | from webhelpers.text import chop_at, collapse, convert_accented_entities, \ | |
24 | convert_misc_entities, lchop, plural, rchop, remove_formatting, \ |
|
24 | convert_misc_entities, lchop, plural, rchop, remove_formatting, \ | |
25 | replace_whitespace, urlify, truncate, wrap_paragraphs |
|
25 | replace_whitespace, urlify, truncate, wrap_paragraphs | |
|
26 | from webhelpers.date import time_ago_in_words | |||
26 |
|
27 | |||
27 | #Custom helpers here :) |
|
28 | #Custom helpers here :) | |
28 | class _Link(object): |
|
29 | class _Link(object): | |
@@ -317,37 +318,50 b' def get_changeset_safe(repo, rev):' | |||||
317 | flash = _Flash() |
|
318 | flash = _Flash() | |
318 |
|
319 | |||
319 |
|
320 | |||
320 |
#============================================================================== |
|
321 | #============================================================================== | |
321 | # MERCURIAL FILTERS available via h. |
|
322 | # MERCURIAL FILTERS available via h. | |
322 |
#============================================================================== |
|
323 | #============================================================================== | |
323 | from mercurial import util |
|
324 | from mercurial import util | |
324 |
from mercurial.templatefilters import |
|
325 | from mercurial.templatefilters import person as _person | |
|
326 | ||||
|
327 | ||||
|
328 | ||||
|
329 | def _age(curdate): | |||
|
330 | """turns a datetime into an age string.""" | |||
325 |
|
331 | |||
326 | age = lambda x:x |
|
332 | from datetime import timedelta, datetime | |
|
333 | agescales = [("year", 3600 * 24 * 365), | |||
|
334 | ("month", 3600 * 24 * 30), | |||
|
335 | #("week", 3600 * 24 * 7), | |||
|
336 | ("day", 3600 * 24), | |||
|
337 | ("hour", 3600), | |||
|
338 | ("minute", 60), | |||
|
339 | ("second", 1)] | |||
|
340 | ||||
|
341 | age = datetime.now() - curdate | |||
|
342 | age_seconds = (age.days * agescales[2][1]) + age.seconds | |||
|
343 | ||||
|
344 | pos = 1 | |||
|
345 | for scale in agescales: | |||
|
346 | if scale[1] <= age_seconds: | |||
|
347 | return time_ago_in_words(curdate, agescales[pos][0]) | |||
|
348 | pos += 1 | |||
|
349 | ||||
|
350 | age = lambda x:_age(x) | |||
327 | capitalize = lambda x: x.capitalize() |
|
351 | capitalize = lambda x: x.capitalize() | |
328 | date = lambda x: util.datestr(x) |
|
|||
329 | email = util.email |
|
352 | email = util.email | |
330 | email_or_none = lambda x: util.email(x) if util.email(x) != x else None |
|
353 | email_or_none = lambda x: util.email(x) if util.email(x) != x else None | |
331 | person = lambda x: _person(x) |
|
354 | person = lambda x: _person(x) | |
332 | hgdate = lambda x: "%d %d" % x |
|
|||
333 | isodate = lambda x: util.datestr(x, '%Y-%m-%d %H:%M %1%2') |
|
|||
334 | isodatesec = lambda x: util.datestr(x, '%Y-%m-%d %H:%M:%S %1%2') |
|
|||
335 | localdate = lambda x: (x[0], util.makedate()[1]) |
|
|||
336 | rfc822date = lambda x: x#util.datestr(x, "%a, %d %b %Y %H:%M:%S %1%2") |
|
|||
337 | rfc822date_notz = lambda x: x#util.datestr(x, "%a, %d %b %Y %H:%M:%S") |
|
|||
338 | rfc3339date = lambda x: util.datestr(x, "%Y-%m-%dT%H:%M:%S%1:%2") |
|
|||
339 | time_ago = lambda x: util.datestr(_age(x), "%a, %d %b %Y %H:%M:%S %1%2") |
|
|||
340 |
|
355 | |||
341 |
|
356 | #============================================================================== | ||
342 | #=============================================================================== |
|
|||
343 | # PERMS |
|
357 | # PERMS | |
344 |
#============================================================================== |
|
358 | #============================================================================== | |
345 | from rhodecode.lib.auth import HasPermissionAny, HasPermissionAll, \ |
|
359 | from rhodecode.lib.auth import HasPermissionAny, HasPermissionAll, \ | |
346 | HasRepoPermissionAny, HasRepoPermissionAll |
|
360 | HasRepoPermissionAny, HasRepoPermissionAll | |
347 |
|
361 | |||
348 |
#============================================================================== |
|
362 | #============================================================================== | |
349 | # GRAVATAR URL |
|
363 | # GRAVATAR URL | |
350 |
#============================================================================== |
|
364 | #============================================================================== | |
351 | import hashlib |
|
365 | import hashlib | |
352 | import urllib |
|
366 | import urllib | |
353 | from pylons import request |
|
367 | from pylons import request |
@@ -17,6 +17,14 b'' | |||||
17 | # along with this program; if not, write to the Free Software |
|
17 | # along with this program; if not, write to the Free Software | |
18 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, |
|
18 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | |
19 | # MA 02110-1301, USA. |
|
19 | # MA 02110-1301, USA. | |
|
20 | """ | |||
|
21 | Created on 2010-04-28 | |||
|
22 | ||||
|
23 | @author: marcink | |||
|
24 | SimpleGit middleware for handling git protocol request (push/clone etc.) | |||
|
25 | It's implemented with basic auth function | |||
|
26 | """ | |||
|
27 | ||||
20 | from dulwich import server as dulserver |
|
28 | from dulwich import server as dulserver | |
21 |
|
29 | |||
22 | class SimpleGitUploadPackHandler(dulserver.UploadPackHandler): |
|
30 | class SimpleGitUploadPackHandler(dulserver.UploadPackHandler): | |
@@ -54,22 +62,14 b' from dulwich.repo import Repo' | |||||
54 | from dulwich.web import HTTPGitApplication |
|
62 | from dulwich.web import HTTPGitApplication | |
55 | from paste.auth.basic import AuthBasicAuthenticator |
|
63 | from paste.auth.basic import AuthBasicAuthenticator | |
56 | from paste.httpheaders import REMOTE_USER, AUTH_TYPE |
|
64 | from paste.httpheaders import REMOTE_USER, AUTH_TYPE | |
57 |
from rhodecode.lib.auth import authfunc, HasPermissionAnyMiddleware |
|
65 | from rhodecode.lib.auth import authfunc, HasPermissionAnyMiddleware | |
58 | get_user_cached |
|
|||
59 | from rhodecode.lib.utils import action_logger, is_git, invalidate_cache, \ |
|
66 | from rhodecode.lib.utils import action_logger, is_git, invalidate_cache, \ | |
60 | check_repo_fast |
|
67 | check_repo_fast | |
|
68 | from rhodecode.model.user import UserModel | |||
61 | from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError |
|
69 | from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError | |
62 | import logging |
|
70 | import logging | |
63 | import os |
|
71 | import os | |
64 | import traceback |
|
72 | import traceback | |
65 | """ |
|
|||
66 | Created on 2010-04-28 |
|
|||
67 |
|
||||
68 | @author: marcink |
|
|||
69 | SimpleGit middleware for handling git protocol request (push/clone etc.) |
|
|||
70 | It's implemented with basic auth function |
|
|||
71 | """ |
|
|||
72 |
|
||||
73 |
|
73 | |||
74 |
|
74 | |||
75 | log = logging.getLogger(__name__) |
|
75 | log = logging.getLogger(__name__) | |
@@ -175,7 +175,7 b' class SimpleGit(object):' | |||||
175 | return environ.get('REMOTE_USER') |
|
175 | return environ.get('REMOTE_USER') | |
176 |
|
176 | |||
177 | def __get_user(self, username): |
|
177 | def __get_user(self, username): | |
178 |
return |
|
178 | return UserModel().get_by_username(username, cache=True) | |
179 |
|
179 | |||
180 | def __get_action(self, environ): |
|
180 | def __get_action(self, environ): | |
181 | """ |
|
181 | """ |
@@ -1010,7 +1010,7 b' padding:0;' | |||||
1010 | #content div.box table th { |
|
1010 | #content div.box table th { | |
1011 | background:#eee; |
|
1011 | background:#eee; | |
1012 | border-bottom:1px solid #ddd; |
|
1012 | border-bottom:1px solid #ddd; | |
1013 |
padding: |
|
1013 | padding:5px 0px 5px 5px; | |
1014 | } |
|
1014 | } | |
1015 |
|
1015 | |||
1016 | #content div.box table th.left { |
|
1016 | #content div.box table th.left { |
1 | NO CONTENT: modified file, binary diff hidden |
|
NO CONTENT: modified file, binary diff hidden |
@@ -55,6 +55,14 b'' | |||||
55 | %if h.HasRepoPermissionAny('repository.write','repository.read','repository.admin')(repo['name'],'main page check'): |
|
55 | %if h.HasRepoPermissionAny('repository.write','repository.read','repository.admin')(repo['name'],'main page check'): | |
56 | <tr class="parity${cnt%2}"> |
|
56 | <tr class="parity${cnt%2}"> | |
57 | <td> |
|
57 | <td> | |
|
58 | %if repo['repo'].dbrepo.repo_type =='hg': | |||
|
59 | <img class="icon" alt="${_('Mercurial repository')}" src="/images/icons/hgicon.png"/> | |||
|
60 | %elif repo['repo'].dbrepo.repo_type =='git': | |||
|
61 | <img class="icon" alt="${_('Git repository')}" src="/images/icons/giticon.png"/> | |||
|
62 | %else: | |||
|
63 | ||||
|
64 | %endif | |||
|
65 | ||||
58 | %if repo['repo'].dbrepo.private: |
|
66 | %if repo['repo'].dbrepo.private: | |
59 | <img class="icon" alt="${_('private')}" src="/images/icons/lock.png"/> |
|
67 | <img class="icon" alt="${_('private')}" src="/images/icons/lock.png"/> | |
60 | %else: |
|
68 | %else: | |
@@ -70,7 +78,8 b'' | |||||
70 | %endif |
|
78 | %endif | |
71 | </td> |
|
79 | </td> | |
72 | <td title="${repo['description']}">${h.truncate(repo['description'],60)}</td> |
|
80 | <td title="${repo['description']}">${h.truncate(repo['description'],60)}</td> | |
73 |
<td> |
|
81 | <td><span class="tooltip" tooltip_title="${repo['last_change']}"> | |
|
82 | ${h.age(repo['last_change'])} </span></td> | |||
74 | <td> |
|
83 | <td> | |
75 | %if repo['rev']>=0: |
|
84 | %if repo['rev']>=0: | |
76 | ${h.link_to('r%s:%s' % (repo['rev'],repo['tip']), |
|
85 | ${h.link_to('r%s:%s' % (repo['rev'],repo['tip']), |
@@ -13,7 +13,7 b'' | |||||
13 | </tr> |
|
13 | </tr> | |
14 | %for cnt,cs in enumerate(c.repo_changesets): |
|
14 | %for cnt,cs in enumerate(c.repo_changesets): | |
15 | <tr class="parity${cnt%2}"> |
|
15 | <tr class="parity${cnt%2}"> | |
16 |
<td>${h.age(cs.date)} - ${ |
|
16 | <td>${h.age(cs.date)} - ${cs.date} </td> | |
17 | <td title="${cs.author}">${h.person(cs.author)}</td> |
|
17 | <td title="${cs.author}">${h.person(cs.author)}</td> | |
18 | <td>r${cs.revision}:${cs.short_id}</td> |
|
18 | <td>r${cs.revision}:${cs.short_id}</td> | |
19 | <td> |
|
19 | <td> |
@@ -92,7 +92,7 b' E.onDOMReady(function(e){' | |||||
92 | <label>${_('Last change')}:</label> |
|
92 | <label>${_('Last change')}:</label> | |
93 | </div> |
|
93 | </div> | |
94 | <div class="input-short"> |
|
94 | <div class="input-short"> | |
95 |
${h.age(c.repo_info.last_change)} - ${ |
|
95 | ${h.age(c.repo_info.last_change)} - ${c.repo_info.last_change} | |
96 | ${_('by')} ${h.get_changeset_safe(c.repo_info,'tip').author} |
|
96 | ${_('by')} ${h.get_changeset_safe(c.repo_info,'tip').author} | |
97 |
|
97 | |||
98 | </div> |
|
98 | </div> |
@@ -4,13 +4,13 b' py_version = sys.version_info' | |||||
4 |
|
4 | |||
5 | requirements = [ |
|
5 | requirements = [ | |
6 | "Pylons>=1.0.0", |
|
6 | "Pylons>=1.0.0", | |
7 | "SQLAlchemy>=0.6", |
|
7 | "SQLAlchemy>=0.6.4", | |
8 |
"Mako>=0.3. |
|
8 | "Mako>=0.3.5", | |
9 |
"vcs==0.1. |
|
9 | "vcs==0.1.10", | |
10 | "pygments>=1.3.0", |
|
10 | "pygments>=1.3.0", | |
11 |
"mercurial |
|
11 | "mercurial==1.6.4", | |
12 |
"whoosh==1. |
|
12 | "whoosh==1.1.0", | |
13 |
"celery |
|
13 | "celery==2.1.1", | |
14 | "py-bcrypt", |
|
14 | "py-bcrypt", | |
15 | "babel", |
|
15 | "babel", | |
16 | ] |
|
16 | ] |
General Comments 0
You need to be logged in to leave comments.
Login now