Show More
@@ -0,0 +1,35 b'' | |||||
|
1 | import logging | |||
|
2 | ||||
|
3 | from pylons import tmpl_context as c, app_globals as g, session, request, config, url | |||
|
4 | from pylons.controllers.util import abort, redirect | |||
|
5 | ||||
|
6 | from pylons_app.lib.base import BaseController, render | |||
|
7 | from pylons_app.lib.utils import get_repo_slug | |||
|
8 | from pylons_app.model.hg_model import HgModel | |||
|
9 | from webhelpers.paginate import Page | |||
|
10 | log = logging.getLogger(__name__) | |||
|
11 | ||||
|
12 | class ShortlogController(BaseController): | |||
|
13 | def __before__(self): | |||
|
14 | c.repos_prefix = config['repos_name'] | |||
|
15 | c.staticurl = g.statics | |||
|
16 | c.repo_name = get_repo_slug(request) | |||
|
17 | ||||
|
18 | ||||
|
19 | def index(self): | |||
|
20 | hg_model = HgModel() | |||
|
21 | lim = 20 | |||
|
22 | p = int(request.params.get('page', 1)) | |||
|
23 | repo = hg_model.get_repo(c.repo_name) | |||
|
24 | cnt = repo.revisions[-1] | |||
|
25 | gen = repo.get_changesets(None) | |||
|
26 | repo_changesets = list(gen) | |||
|
27 | repo_changesets2 = list(gen) | |||
|
28 | repo_changesets3 = list(gen) | |||
|
29 | repo_changesets4 = list(gen) | |||
|
30 | ||||
|
31 | c.repo_changesets = Page(repo_changesets, page=p, item_count=cnt, items_per_page=lim) | |||
|
32 | c.shortlog_data = render('shortlog_data.html') | |||
|
33 | if request.params.get('partial'): | |||
|
34 | return c.shortlog_data | |||
|
35 | return render('/shortlog.html') |
@@ -0,0 +1,38 b'' | |||||
|
1 | <%inherit file="base/base.html"/> | |||
|
2 | ||||
|
3 | <%def name="title()"> | |||
|
4 | ${_('Repository managment')} | |||
|
5 | </%def> | |||
|
6 | <%def name="breadcrumbs()"> | |||
|
7 | ${h.link_to(u'Home',h.url('/'))} | |||
|
8 | / | |||
|
9 | ${h.link_to(c.repo_name,h.url('shortlog_home',repo_name=c.repo_name))} | |||
|
10 | / | |||
|
11 | ${_('shortlog')} | |||
|
12 | </%def> | |||
|
13 | <%def name="page_nav()"> | |||
|
14 | <form action="log"> | |||
|
15 | <dl class="search"> | |||
|
16 | <dt><label>Search: </label></dt> | |||
|
17 | <dd><input type="text" name="rev" /></dd> | |||
|
18 | </dl> | |||
|
19 | </form> | |||
|
20 | ||||
|
21 | <ul class="page-nav"> | |||
|
22 | <li>${h.link(_('summary'),h.url('summary_home',repo_name=c.repo_name))}</li> | |||
|
23 | <li class="current">${_('shortlog')}</li> | |||
|
24 | <li><a href="log">changelog</a></li> | |||
|
25 | <li><a href="graph/{node|short}">graph</a></li> | |||
|
26 | <li><a href="tags">tags</a></li> | |||
|
27 | <li><a href="branches">branches</a></li> | |||
|
28 | <li><a href="file/{node|short}">files</a></li> | |||
|
29 | </ul> | |||
|
30 | </%def> | |||
|
31 | <%def name="main()"> | |||
|
32 | ||||
|
33 | <h2 class="no-link no-border">${_('Shortlog')}</h2> | |||
|
34 | ||||
|
35 | <div id="shortlog_data"> | |||
|
36 | ${c.shortlog_data} | |||
|
37 | </div> | |||
|
38 | </%def> No newline at end of file |
@@ -0,0 +1,32 b'' | |||||
|
1 | ## -*- coding: utf-8 -*- | |||
|
2 | <%! | |||
|
3 | from pylons_app.lib import filters | |||
|
4 | %> | |||
|
5 | <table> | |||
|
6 | %for cnt,cs in enumerate(c.repo_changesets): | |||
|
7 | <tr class="parity${cnt%2}"> | |||
|
8 | <td>${cs._ctx.date()|n,filters.age}</td> | |||
|
9 | <td title="${cs.author}">${cs.author|n,filters.person}</td> | |||
|
10 | <td>${h.link_to(cs.message,h.url('rev/'+str(cs._ctx)))}</td> | |||
|
11 | <td class="nowrap"> | |||
|
12 | ${h.link_to(_('changeset'),h.url('file/'+str(cs._ctx)))} | |||
|
13 | | | |||
|
14 | ${h.link_to(_('files'),h.url('file/'+str(cs._ctx)))} | |||
|
15 | </td> | |||
|
16 | </tr> | |||
|
17 | %endfor | |||
|
18 | <tr> | |||
|
19 | <script type="text/javascript"> | |||
|
20 | var data_div = 'shortlog_data'; | |||
|
21 | YAHOO.util.Event.onDOMReady(function(){ | |||
|
22 | YAHOO.util.Event.addListener(YAHOO.util.Dom.getElementsByClassName('pager_link'),"click",function(){ | |||
|
23 | YAHOO.util.Dom.setStyle('shortlog_data','opacity','0.3');});}); | |||
|
24 | </script> | |||
|
25 | <td>${c.repo_changesets.pager('$link_previous ~2~ $link_next', | |||
|
26 | onclick="""YAHOO.util.Connect.asyncRequest('GET','$partial_url',{ | |||
|
27 | success:function(o){YAHOO.util.Dom.get(data_div).innerHTML=o.responseText; | |||
|
28 | YAHOO.util.Event.addListener(YAHOO.util.Dom.getElementsByClassName('pager_link'),"click",function(){ | |||
|
29 | YAHOO.util.Dom.setStyle(data_div,'opacity','0.3');}); | |||
|
30 | YAHOO.util.Dom.setStyle(data_div,'opacity','1');}},null); return false;""")}</td> | |||
|
31 | </tr> | |||
|
32 | </table> No newline at end of file |
@@ -0,0 +1,7 b'' | |||||
|
1 | from pylons_app.tests import * | |||
|
2 | ||||
|
3 | class TestShortlogController(TestController): | |||
|
4 | ||||
|
5 | def test_index(self): | |||
|
6 | response = self.app.get(url(controller='shortlog', action='index')) | |||
|
7 | # Test response... |
@@ -1,118 +1,119 b'' | |||||
1 | ################################################################################ |
|
1 | ################################################################################ | |
2 | ################################################################################ |
|
2 | ################################################################################ | |
3 | # pylons_app - Pylons environment configuration # |
|
3 | # pylons_app - Pylons environment configuration # | |
4 | # # |
|
4 | # # | |
5 | # The %(here)s variable will be replaced with the parent directory of this file# |
|
5 | # The %(here)s variable will be replaced with the parent directory of this file# | |
6 | ################################################################################ |
|
6 | ################################################################################ | |
7 |
|
7 | |||
8 | [DEFAULT] |
|
8 | [DEFAULT] | |
9 | debug = true |
|
9 | debug = true | |
10 | ############################################ |
|
10 | ############################################ | |
11 | ## Uncomment and replace with the address ## |
|
11 | ## Uncomment and replace with the address ## | |
12 | ## which should receive any error reports ## |
|
12 | ## which should receive any error reports ## | |
13 | ############################################ |
|
13 | ############################################ | |
14 | #email_to = marcin.kuzminski@etelko.pl |
|
14 | #email_to = marcin.kuzminski@etelko.pl | |
15 | #smtp_server = mail.etelko.pl |
|
15 | #smtp_server = mail.etelko.pl | |
16 | #error_email_from = paste_error@localhost |
|
16 | #error_email_from = paste_error@localhost | |
17 | #smtp_username = |
|
17 | #smtp_username = | |
18 | #smtp_password = |
|
18 | #smtp_password = | |
19 | #error_message = 'mercurial crash !' |
|
19 | #error_message = 'mercurial crash !' | |
20 |
|
20 | |||
21 | [server:main] |
|
21 | [server:main] | |
|
22 | threadpool_workers = 5 | |||
22 | use = egg:Paste#http |
|
23 | use = egg:Paste#http | |
23 | host = 127.0.0.1 |
|
24 | host = 127.0.0.1 | |
24 | port = 5000 |
|
25 | port = 5000 | |
25 |
|
26 | |||
26 | [app:main] |
|
27 | [app:main] | |
27 | use = egg:pylons_app |
|
28 | use = egg:pylons_app | |
28 | full_stack = true |
|
29 | full_stack = true | |
29 | static_files = true |
|
30 | static_files = true | |
30 | lang=en |
|
31 | lang=en | |
31 | cache_dir = %(here)s/data |
|
32 | cache_dir = %(here)s/data | |
32 | repos_name = Python-works |
|
33 | repos_name = Python-works | |
33 |
|
34 | |||
34 | #################################### |
|
35 | #################################### | |
35 | ### BEAKER CACHE #### |
|
36 | ### BEAKER CACHE #### | |
36 | #################################### |
|
37 | #################################### | |
37 | beaker.cache.data_dir=/tmp/cache/data |
|
38 | beaker.cache.data_dir=/tmp/cache/data | |
38 | beaker.cache.lock_dir=/tmp/cache/lock |
|
39 | beaker.cache.lock_dir=/tmp/cache/lock | |
39 | beaker.cache.regions=short_term |
|
40 | beaker.cache.regions=short_term | |
40 | beaker.cache.short_term.type=memory |
|
41 | beaker.cache.short_term.type=memory | |
41 | beaker.cache.short_term.expire=3600 |
|
42 | beaker.cache.short_term.expire=3600 | |
42 |
|
43 | |||
43 | ################################################################################ |
|
44 | ################################################################################ | |
44 | ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* ## |
|
45 | ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* ## | |
45 | ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ## |
|
46 | ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ## | |
46 | ## execute malicious code after an exception is raised. ## |
|
47 | ## execute malicious code after an exception is raised. ## | |
47 | ################################################################################ |
|
48 | ################################################################################ | |
48 | #set debug = false |
|
49 | #set debug = false | |
49 |
|
50 | |||
50 | ################################## |
|
51 | ################################## | |
51 | ### LOGVIEW CONFIG ### |
|
52 | ### LOGVIEW CONFIG ### | |
52 | ################################## |
|
53 | ################################## | |
53 | logview.sqlalchemy = #faa |
|
54 | logview.sqlalchemy = #faa | |
54 | logview.pylons.templating = #bfb |
|
55 | logview.pylons.templating = #bfb | |
55 | logview.pylons.util = #eee |
|
56 | logview.pylons.util = #eee | |
56 |
|
57 | |||
57 | ######################################################### |
|
58 | ######################################################### | |
58 | ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ### |
|
59 | ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ### | |
59 | ######################################################### |
|
60 | ######################################################### | |
60 | sqlalchemy.db1.url = sqlite:///%(here)s/hg_app.db |
|
61 | sqlalchemy.db1.url = sqlite:///%(here)s/hg_app.db | |
61 | #sqlalchemy.db1.echo = True |
|
62 | #sqlalchemy.db1.echo = True | |
62 | #sqlalchemy.db1.pool_recycle = 3600 |
|
63 | #sqlalchemy.db1.pool_recycle = 3600 | |
63 | sqlalchemy.convert_unicode = true |
|
64 | sqlalchemy.convert_unicode = true | |
64 |
|
65 | |||
65 | ################################ |
|
66 | ################################ | |
66 | ### LOGGING CONFIGURATION #### |
|
67 | ### LOGGING CONFIGURATION #### | |
67 | ################################ |
|
68 | ################################ | |
68 | [loggers] |
|
69 | [loggers] | |
69 | keys = root, routes, pylons_app, sqlalchemy |
|
70 | keys = root, routes, pylons_app, sqlalchemy | |
70 |
|
71 | |||
71 | [handlers] |
|
72 | [handlers] | |
72 | keys = console |
|
73 | keys = console | |
73 |
|
74 | |||
74 | [formatters] |
|
75 | [formatters] | |
75 | keys = generic |
|
76 | keys = generic | |
76 |
|
77 | |||
77 | ############# |
|
78 | ############# | |
78 | ## LOGGERS ## |
|
79 | ## LOGGERS ## | |
79 | ############# |
|
80 | ############# | |
80 | [logger_root] |
|
81 | [logger_root] | |
81 | level = NOTSET |
|
82 | level = NOTSET | |
82 | handlers = console |
|
83 | handlers = console | |
83 |
|
84 | |||
84 | [logger_routes] |
|
85 | [logger_routes] | |
85 | level = DEBUG |
|
86 | level = DEBUG | |
86 | handlers = console |
|
87 | handlers = console | |
87 | qualname = routes.middleware |
|
88 | qualname = routes.middleware | |
88 | # "level = DEBUG" logs the route matched and routing variables. |
|
89 | # "level = DEBUG" logs the route matched and routing variables. | |
89 |
|
90 | |||
90 | [logger_pylons_app] |
|
91 | [logger_pylons_app] | |
91 | level = DEBUG |
|
92 | level = DEBUG | |
92 | handlers = console |
|
93 | handlers = console | |
93 | qualname = pylons_app |
|
94 | qualname = pylons_app | |
94 |
|
95 | |||
95 |
|
96 | |||
96 | [logger_sqlalchemy] |
|
97 | [logger_sqlalchemy] | |
97 | level = DEBUG |
|
98 | level = DEBUG | |
98 | handlers = console |
|
99 | handlers = console | |
99 | qualname = sqlalchemy.engine |
|
100 | qualname = sqlalchemy.engine | |
100 |
|
101 | |||
101 | ############## |
|
102 | ############## | |
102 | ## HANDLERS ## |
|
103 | ## HANDLERS ## | |
103 | ############## |
|
104 | ############## | |
104 |
|
105 | |||
105 | [handler_console] |
|
106 | [handler_console] | |
106 | class = StreamHandler |
|
107 | class = StreamHandler | |
107 | args = (sys.stderr,) |
|
108 | args = (sys.stderr,) | |
108 | level = NOTSET |
|
109 | level = NOTSET | |
109 | formatter = generic |
|
110 | formatter = generic | |
110 |
|
111 | |||
111 | ################ |
|
112 | ################ | |
112 | ## FORMATTERS ## |
|
113 | ## FORMATTERS ## | |
113 | ################ |
|
114 | ################ | |
114 |
|
115 | |||
115 | [formatter_generic] |
|
116 | [formatter_generic] | |
116 | format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s |
|
117 | format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s | |
117 | datefmt = %Y-%m-%d %H:%M:%S |
|
118 | datefmt = %Y-%m-%d %H:%M:%S | |
118 |
|
119 |
@@ -1,118 +1,119 b'' | |||||
1 | ################################################################################ |
|
1 | ################################################################################ | |
2 | ################################################################################ |
|
2 | ################################################################################ | |
3 | # pylons_app - Pylons environment configuration # |
|
3 | # pylons_app - Pylons environment configuration # | |
4 | # # |
|
4 | # # | |
5 | # The %(here)s variable will be replaced with the parent directory of this file# |
|
5 | # The %(here)s variable will be replaced with the parent directory of this file# | |
6 | ################################################################################ |
|
6 | ################################################################################ | |
7 |
|
7 | |||
8 | [DEFAULT] |
|
8 | [DEFAULT] | |
9 | debug = true |
|
9 | debug = true | |
10 | ############################################ |
|
10 | ############################################ | |
11 | ## Uncomment and replace with the address ## |
|
11 | ## Uncomment and replace with the address ## | |
12 | ## which should receive any error reports ## |
|
12 | ## which should receive any error reports ## | |
13 | ############################################ |
|
13 | ############################################ | |
14 | #email_to = marcin.kuzminski@etelko.pl |
|
14 | #email_to = marcin.kuzminski@etelko.pl | |
15 | #smtp_server = mail.etelko.pl |
|
15 | #smtp_server = mail.etelko.pl | |
16 | #error_email_from = paste_error@localhost |
|
16 | #error_email_from = paste_error@localhost | |
17 | #smtp_username = |
|
17 | #smtp_username = | |
18 | #smtp_password = |
|
18 | #smtp_password = | |
19 | #error_message = 'mercurial crash !' |
|
19 | #error_message = 'mercurial crash !' | |
20 |
|
20 | |||
21 | [server:main] |
|
21 | [server:main] | |
|
22 | threadpool_workers = 10 | |||
22 | use = egg:Paste#http |
|
23 | use = egg:Paste#http | |
23 | host = 127.0.0.1 |
|
24 | host = 127.0.0.1 | |
24 | port = 8001 |
|
25 | port = 8001 | |
25 |
|
26 | |||
26 | [app:main] |
|
27 | [app:main] | |
27 | use = egg:pylons_app |
|
28 | use = egg:pylons_app | |
28 | full_stack = true |
|
29 | full_stack = true | |
29 | static_files = true |
|
30 | static_files = true | |
30 | lang=en |
|
31 | lang=en | |
31 | cache_dir = %(here)s/data |
|
32 | cache_dir = %(here)s/data | |
32 | repos_name = Python-works |
|
33 | repos_name = Python-works | |
33 |
|
34 | |||
34 | #################################### |
|
35 | #################################### | |
35 | ### BEAKER CACHE #### |
|
36 | ### BEAKER CACHE #### | |
36 | #################################### |
|
37 | #################################### | |
37 | beaker.cache.data_dir=/tmp/cache/data |
|
38 | beaker.cache.data_dir=/tmp/cache/data | |
38 | beaker.cache.lock_dir=/tmp/cache/lock |
|
39 | beaker.cache.lock_dir=/tmp/cache/lock | |
39 | beaker.cache.regions=short_term |
|
40 | beaker.cache.regions=short_term | |
40 | beaker.cache.short_term.type=memory |
|
41 | beaker.cache.short_term.type=memory | |
41 | beaker.cache.short_term.expire=3600 |
|
42 | beaker.cache.short_term.expire=3600 | |
42 |
|
43 | |||
43 | ################################################################################ |
|
44 | ################################################################################ | |
44 | ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* ## |
|
45 | ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* ## | |
45 | ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ## |
|
46 | ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ## | |
46 | ## execute malicious code after an exception is raised. ## |
|
47 | ## execute malicious code after an exception is raised. ## | |
47 | ################################################################################ |
|
48 | ################################################################################ | |
48 | #set debug = false |
|
49 | #set debug = false | |
49 |
|
50 | |||
50 | ################################## |
|
51 | ################################## | |
51 | ### LOGVIEW CONFIG ### |
|
52 | ### LOGVIEW CONFIG ### | |
52 | ################################## |
|
53 | ################################## | |
53 | logview.sqlalchemy = #faa |
|
54 | logview.sqlalchemy = #faa | |
54 | logview.pylons.templating = #bfb |
|
55 | logview.pylons.templating = #bfb | |
55 | logview.pylons.util = #eee |
|
56 | logview.pylons.util = #eee | |
56 |
|
57 | |||
57 | ######################################################### |
|
58 | ######################################################### | |
58 | ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ### |
|
59 | ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ### | |
59 | ######################################################### |
|
60 | ######################################################### | |
60 | sqlalchemy.db1.url = sqlite:///%(here)s/hg_app.db |
|
61 | sqlalchemy.db1.url = sqlite:///%(here)s/hg_app.db | |
61 | #sqlalchemy.db1.echo = True |
|
62 | #sqlalchemy.db1.echo = True | |
62 | #sqlalchemy.db1.pool_recycle = 3600 |
|
63 | #sqlalchemy.db1.pool_recycle = 3600 | |
63 | sqlalchemy.convert_unicode = true |
|
64 | sqlalchemy.convert_unicode = true | |
64 |
|
65 | |||
65 | ################################ |
|
66 | ################################ | |
66 | ### LOGGING CONFIGURATION #### |
|
67 | ### LOGGING CONFIGURATION #### | |
67 | ################################ |
|
68 | ################################ | |
68 | [loggers] |
|
69 | [loggers] | |
69 | keys = root, routes, pylons_app, sqlalchemy |
|
70 | keys = root, routes, pylons_app, sqlalchemy | |
70 |
|
71 | |||
71 | [handlers] |
|
72 | [handlers] | |
72 | keys = console |
|
73 | keys = console | |
73 |
|
74 | |||
74 | [formatters] |
|
75 | [formatters] | |
75 | keys = generic |
|
76 | keys = generic | |
76 |
|
77 | |||
77 | ############# |
|
78 | ############# | |
78 | ## LOGGERS ## |
|
79 | ## LOGGERS ## | |
79 | ############# |
|
80 | ############# | |
80 | [logger_root] |
|
81 | [logger_root] | |
81 | level = INFO |
|
82 | level = INFO | |
82 | handlers = console |
|
83 | handlers = console | |
83 |
|
84 | |||
84 | [logger_routes] |
|
85 | [logger_routes] | |
85 | level = INFO |
|
86 | level = INFO | |
86 | handlers = console |
|
87 | handlers = console | |
87 | qualname = routes.middleware |
|
88 | qualname = routes.middleware | |
88 | # "level = DEBUG" logs the route matched and routing variables. |
|
89 | # "level = DEBUG" logs the route matched and routing variables. | |
89 |
|
90 | |||
90 | [logger_pylons_app] |
|
91 | [logger_pylons_app] | |
91 | level = DEBUG |
|
92 | level = DEBUG | |
92 | handlers = console |
|
93 | handlers = console | |
93 | qualname = pylons_app |
|
94 | qualname = pylons_app | |
94 |
|
95 | |||
95 |
|
96 | |||
96 | [logger_sqlalchemy] |
|
97 | [logger_sqlalchemy] | |
97 | level = DEBUG |
|
98 | level = DEBUG | |
98 | handlers = console |
|
99 | handlers = console | |
99 | qualname = sqlalchemy.engine |
|
100 | qualname = sqlalchemy.engine | |
100 |
|
101 | |||
101 | ############## |
|
102 | ############## | |
102 | ## HANDLERS ## |
|
103 | ## HANDLERS ## | |
103 | ############## |
|
104 | ############## | |
104 |
|
105 | |||
105 | [handler_console] |
|
106 | [handler_console] | |
106 | class = StreamHandler |
|
107 | class = StreamHandler | |
107 | args = (sys.stderr,) |
|
108 | args = (sys.stderr,) | |
108 | level = NOTSET |
|
109 | level = NOTSET | |
109 | formatter = generic |
|
110 | formatter = generic | |
110 |
|
111 | |||
111 | ################ |
|
112 | ################ | |
112 | ## FORMATTERS ## |
|
113 | ## FORMATTERS ## | |
113 | ################ |
|
114 | ################ | |
114 |
|
115 | |||
115 | [formatter_generic] |
|
116 | [formatter_generic] | |
116 | format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s |
|
117 | format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s | |
117 | datefmt = %Y-%m-%d %H:%M:%S |
|
118 | datefmt = %Y-%m-%d %H:%M:%S | |
118 |
|
119 |
@@ -1,38 +1,39 b'' | |||||
1 | """Routes configuration |
|
1 | """Routes configuration | |
2 |
|
2 | |||
3 | The more specific and detailed routes should be defined first so they |
|
3 | The more specific and detailed routes should be defined first so they | |
4 | may take precedent over the more generic routes. For more information |
|
4 | may take precedent over the more generic routes. For more information | |
5 | refer to the routes manual at http://routes.groovie.org/docs/ |
|
5 | refer to the routes manual at http://routes.groovie.org/docs/ | |
6 | """ |
|
6 | """ | |
7 | from routes import Mapper |
|
7 | from routes import Mapper | |
8 |
|
8 | |||
9 | def make_map(config): |
|
9 | def make_map(config): | |
10 | """Create, configure and return the routes Mapper""" |
|
10 | """Create, configure and return the routes Mapper""" | |
11 | map = Mapper(directory=config['pylons.paths']['controllers'], |
|
11 | map = Mapper(directory=config['pylons.paths']['controllers'], | |
12 | always_scan=config['debug']) |
|
12 | always_scan=config['debug']) | |
13 | map.minimization = False |
|
13 | map.minimization = False | |
14 | map.explicit = False |
|
14 | map.explicit = False | |
15 |
|
15 | |||
16 | # The ErrorController route (handles 404/500 error pages); it should |
|
16 | # The ErrorController route (handles 404/500 error pages); it should | |
17 | # likely stay at the top, ensuring it can always be resolved |
|
17 | # likely stay at the top, ensuring it can always be resolved | |
18 | map.connect('/error/{action}', controller='error') |
|
18 | map.connect('/error/{action}', controller='error') | |
19 | map.connect('/error/{action}/{id}', controller='error') |
|
19 | map.connect('/error/{action}/{id}', controller='error') | |
20 |
|
20 | |||
21 | # CUSTOM ROUTES HERE |
|
21 | # CUSTOM ROUTES HERE | |
22 | map.connect('hg_home', '/', controller='hg', action='index') |
|
22 | map.connect('hg_home', '/', controller='hg', action='index') | |
23 |
|
23 | |||
24 | map.resource('repo', 'repos', path_prefix='/_admin') |
|
24 | map.resource('repo', 'repos', path_prefix='/_admin') | |
25 | map.resource('user', 'users', path_prefix='/_admin') |
|
25 | map.resource('user', 'users', path_prefix='/_admin') | |
26 |
|
26 | |||
27 |
|
27 | |||
28 | with map.submapper(path_prefix='/_admin', controller='admin') as m: |
|
28 | with map.submapper(path_prefix='/_admin', controller='admin') as m: | |
29 | m.connect('admin_home', '/', action='index')#main page |
|
29 | m.connect('admin_home', '/', action='index')#main page | |
30 | m.connect('admin_add_repo', '/add_repo/{new_repo:[a-z0-9\. _-]*}', action='add_repo') |
|
30 | m.connect('admin_add_repo', '/add_repo/{new_repo:[a-z0-9\. _-]*}', action='add_repo') | |
31 |
|
31 | |||
32 |
|
32 | |||
33 | map.connect('summary_home', '/{repo_name}/_summary', controller='summary') |
|
33 | map.connect('summary_home', '/{repo_name}/_summary', controller='summary') | |
|
34 | map.connect('shortlog_home', '/{repo_name}/_shortlog', controller='shortlog') | |||
34 |
|
35 | |||
35 | map.connect('hg', '/{path_info:.*}', controller='hg', |
|
36 | map.connect('hg', '/{path_info:.*}', controller='hg', | |
36 | action="view", path_info='/') |
|
37 | action="view", path_info='/') | |
37 |
|
38 | |||
38 | return map |
|
39 | return map |
@@ -1,14 +1,15 b'' | |||||
1 | from mercurial import util |
|
1 | from mercurial import util | |
2 | from mercurial.templatefilters import age as _age |
|
2 | from mercurial.templatefilters import age as _age, person as _person | |
3 |
|
3 | |||
4 |
age = lambda |
|
4 | age = lambda x:_age(x) | |
5 | capitalize = lambda x: x.capitalize() |
|
5 | capitalize = lambda x: x.capitalize() | |
6 | date = lambda x: util.datestr(x) |
|
6 | date = lambda x: util.datestr(x) | |
7 | email = util.email |
|
7 | email = util.email | |
8 | hgdate = lambda context, x: "%d %d" % x |
|
8 | person = lambda x: _person(x) | |
9 | isodate = lambda context, x: util.datestr(x, '%Y-%m-%d %H:%M %1%2') |
|
9 | hgdate = lambda x: "%d %d" % x | |
10 |
isodate |
|
10 | isodate = lambda x: util.datestr(x, '%Y-%m-%d %H:%M %1%2') | |
11 | localdate = lambda context, x: (x[0], util.makedate()[1]) |
|
11 | isodatesec = lambda x: util.datestr(x, '%Y-%m-%d %H:%M:%S %1%2') | |
12 | rfc822date = lambda context, x: util.datestr(x, "%a, %d %b %Y %H:%M:%S %1%2") |
|
12 | localdate = lambda x: (x[0], util.makedate()[1]) | |
13 |
rfc |
|
13 | rfc822date = lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S %1%2") | |
14 |
t |
|
14 | rfc3339date = lambda x: util.datestr(x, "%Y-%m-%dT%H:%M:%S%1:%2") | |
|
15 | time_ago = lambda x: util.datestr(_age(x), "%a, %d %b %Y %H:%M:%S %1%2") |
@@ -1,29 +1,38 b'' | |||||
|
1 | ## -*- coding: utf-8 -*- | |||
1 | %if c.users_log: |
|
2 | %if c.users_log: | |
2 | <table> |
|
3 | <table> | |
3 | <tr> |
|
4 | <tr> | |
4 | <td>${_('Username')}</td> |
|
5 | <td>${_('Username')}</td> | |
5 | <td>${_('Repository')}</td> |
|
6 | <td>${_('Repository')}</td> | |
6 | <td>${_('Action')}</td> |
|
7 | <td>${_('Action')}</td> | |
7 | <td>${_('Date')}</td> |
|
8 | <td>${_('Date')}</td> | |
8 | </tr> |
|
9 | </tr> | |
9 |
|
10 | |||
10 | %for cnt,l in enumerate(c.users_log): |
|
11 | %for cnt,l in enumerate(c.users_log): | |
11 | <tr class="parity${cnt%2}"> |
|
12 | <tr class="parity${cnt%2}"> | |
12 | <td>${l.user.username}</td> |
|
13 | <td>${l.user.username}</td> | |
13 | <td>${l.repository}</td> |
|
14 | <td>${l.repository}</td> | |
14 | <td>${l.action}</td> |
|
15 | <td>${l.action}</td> | |
15 | <td>${l.action_date}</td> |
|
16 | <td>${l.action_date}</td> | |
16 | </tr> |
|
17 | </tr> | |
17 | %endfor |
|
18 | %endfor | |
18 |
|
19 | |||
19 | <tr> |
|
20 | <tr> | |
|
21 | <script type="text/javascript"> | |||
|
22 | var data_div = 'user_log'; | |||
|
23 | YAHOO.util.Event.onDOMReady(function(){ | |||
|
24 | YAHOO.util.Event.addListener(YAHOO.util.Dom.getElementsByClassName('pager_link'),"click",function(){ | |||
|
25 | YAHOO.util.Dom.setStyle('shortlog_data','opacity','0.3');});}); | |||
|
26 | </script> | |||
20 | <td>${c.users_log.pager('$link_previous ~2~ $link_next', |
|
27 | <td>${c.users_log.pager('$link_previous ~2~ $link_next', | |
21 | onclick="""YAHOO.util.Connect.asyncRequest('GET','$partial_url',{ |
|
28 | onclick="""YAHOO.util.Connect.asyncRequest('GET','$partial_url',{ | |
22 |
success:function(o){YAHOO.util.Dom.get( |
|
29 | success:function(o){YAHOO.util.Dom.get(data_div).innerHTML=o.responseText; | |
23 | },null); return false;""")}</td> |
|
30 | YAHOO.util.Event.addListener(YAHOO.util.Dom.getElementsByClassName('pager_link'),"click",function(){ | |
|
31 | YAHOO.util.Dom.setStyle(data_div,'opacity','0.3');}); | |||
|
32 | YAHOO.util.Dom.setStyle(data_div,'opacity','1');}},null); return false;""")}</td> | |||
24 | </tr> |
|
33 | </tr> | |
25 | </table> |
|
34 | </table> | |
26 |
|
35 | |||
27 | %else: |
|
36 | %else: | |
28 | ${_('No actions yet')} |
|
37 | ${_('No actions yet')} | |
29 | %endif |
|
38 | %endif |
@@ -1,49 +1,46 b'' | |||||
1 | ## -*- coding: utf-8 -*- |
|
1 | ## -*- coding: utf-8 -*- | |
2 | ##filters definition |
|
|||
3 | <%namespace name="f" module="pylons_app.lib.filters" inheritable="True"/> |
|
|||
4 |
|
||||
5 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
|
2 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |
6 | <html xmlns="http://www.w3.org/1999/xhtml"> |
|
3 | <html xmlns="http://www.w3.org/1999/xhtml"> | |
7 | <head> |
|
4 | <head> | |
8 | <link rel="icon" href="${c.staticurl}hgicon.png" type="image/png" /> |
|
5 | <link rel="icon" href="${c.staticurl}hgicon.png" type="image/png" /> | |
9 | <meta name="robots" content="index, nofollow"/> |
|
6 | <meta name="robots" content="index, nofollow"/> | |
10 | <link rel="stylesheet" href="${c.staticurl}style-monoblue.css" type="text/css" /> |
|
7 | <link rel="stylesheet" href="${c.staticurl}style-monoblue.css" type="text/css" /> | |
11 | <title>${next.title()}</title> |
|
8 | <title>${next.title()}</title> | |
12 | ${self.js()} |
|
9 | ${self.js()} | |
13 | </head> |
|
10 | </head> | |
14 |
|
11 | |||
15 | <body> |
|
12 | <body> | |
16 | <div id="container"> |
|
13 | <div id="container"> | |
17 | <div class="page-header"> |
|
14 | <div class="page-header"> | |
18 | <h1> |
|
15 | <h1> | |
19 | ${next.breadcrumbs()} |
|
16 | ${next.breadcrumbs()} | |
20 | </h1> |
|
17 | </h1> | |
21 | <ul class="page-nav"> |
|
18 | <ul class="page-nav"> | |
22 | ${next.page_nav()} |
|
19 | ${next.page_nav()} | |
23 | </ul> |
|
20 | </ul> | |
24 | </div> |
|
21 | </div> | |
25 | ${next.main()} |
|
22 | ${next.main()} | |
26 | <div class="page-footer"> |
|
23 | <div class="page-footer"> | |
27 | Mercurial App © 2010 |
|
24 | Mercurial App © 2010 | |
28 | </div> |
|
25 | </div> | |
29 |
|
26 | |||
30 | <div id="powered-by"> |
|
27 | <div id="powered-by"> | |
31 | <p> |
|
28 | <p> | |
32 | <a href="http://mercurial.selenic.com/" title="Mercurial"> |
|
29 | <a href="http://mercurial.selenic.com/" title="Mercurial"> | |
33 | <img src="${c.staticurl}hglogo.png" width="75" height="90" alt="mercurial"/></a> |
|
30 | <img src="${c.staticurl}hglogo.png" width="75" height="90" alt="mercurial"/></a> | |
34 | </p> |
|
31 | </p> | |
35 | </div> |
|
32 | </div> | |
36 |
|
33 | |||
37 | <div id="corner-top-left"></div> |
|
34 | <div id="corner-top-left"></div> | |
38 | <div id="corner-top-right"></div> |
|
35 | <div id="corner-top-right"></div> | |
39 | <div id="corner-bottom-left"></div> |
|
36 | <div id="corner-bottom-left"></div> | |
40 | <div id="corner-bottom-right"></div> |
|
37 | <div id="corner-bottom-right"></div> | |
41 |
|
38 | |||
42 | </div> |
|
39 | </div> | |
43 | </body> |
|
40 | </body> | |
44 | </html> |
|
41 | </html> | |
45 |
|
42 | |||
46 |
|
43 | |||
47 | <%def name="js()"> |
|
44 | <%def name="js()"> | |
48 | <script type="text/javascript" src="/js/yui/utilities/utilities.js"></script> |
|
45 | <script type="text/javascript" src="/js/yui/utilities/utilities.js"></script> | |
49 | </%def> No newline at end of file |
|
46 | </%def> |
@@ -1,58 +1,60 b'' | |||||
1 | ## -*- coding: utf-8 -*- |
|
1 | ## -*- coding: utf-8 -*- | |
2 |
|
2 | <%! | ||
|
3 | from pylons_app.lib import filters | |||
|
4 | %> | |||
3 | <%inherit file="base/base.html"/> |
|
5 | <%inherit file="base/base.html"/> | |
4 | <%def name="title()"> |
|
6 | <%def name="title()"> | |
5 | ${c.repos_prefix} Mercurial Repositories |
|
7 | ${c.repos_prefix} Mercurial Repositories | |
6 | </%def> |
|
8 | </%def> | |
7 | <%def name="breadcrumbs()"> |
|
9 | <%def name="breadcrumbs()"> | |
8 | ${c.repos_prefix} Mercurial Repositories |
|
10 | ${c.repos_prefix} Mercurial Repositories | |
9 | </%def> |
|
11 | </%def> | |
10 | <%def name="page_nav()"> |
|
12 | <%def name="page_nav()"> | |
11 | <li class="current">${_('Home')}</li> |
|
13 | <li class="current">${_('Home')}</li> | |
12 | <li>${h.link_to(u'Admin',h.url('admin_home'))}</li> |
|
14 | <li>${h.link_to(u'Admin',h.url('admin_home'))}</li> | |
13 | </%def> |
|
15 | </%def> | |
14 | <%def name="main()"> |
|
16 | <%def name="main()"> | |
15 | <%def name="get_sort(name)"> |
|
17 | <%def name="get_sort(name)"> | |
16 | <%name_slug = name.lower().replace(' ','_') %> |
|
18 | <%name_slug = name.lower().replace(' ','_') %> | |
17 | %if name_slug == c.cs_slug: |
|
19 | %if name_slug == c.cs_slug: | |
18 | <span style="font-weight: bold;color:#006699">${name}</span> |
|
20 | <span style="font-weight: bold;color:#006699">${name}</span> | |
19 | %else: |
|
21 | %else: | |
20 | <span style="font-weight: bold">${name}</span> |
|
22 | <span style="font-weight: bold">${name}</span> | |
21 | %endif |
|
23 | %endif | |
22 |
|
24 | |||
23 | <a href="?sort=${name_slug}">↓</a> |
|
25 | <a href="?sort=${name_slug}">↓</a> | |
24 | <a href="?sort=-${name_slug}">↑</a> |
|
26 | <a href="?sort=-${name_slug}">↑</a> | |
25 |
|
27 | |||
26 | </%def> |
|
28 | </%def> | |
27 | <table> |
|
29 | <table> | |
28 | <tr> |
|
30 | <tr> | |
29 | <td>${get_sort(_('Name'))}</td> |
|
31 | <td>${get_sort(_('Name'))}</td> | |
30 | <td>${get_sort(_('Description'))}</td> |
|
32 | <td>${get_sort(_('Description'))}</td> | |
31 | <td>${get_sort(_('Last change'))}</td> |
|
33 | <td>${get_sort(_('Last change'))}</td> | |
32 | <td>${get_sort(_('Tip'))}</td> |
|
34 | <td>${get_sort(_('Tip'))}</td> | |
33 | <td>${get_sort(_('Contact'))}</td> |
|
35 | <td>${get_sort(_('Contact'))}</td> | |
34 | <td></td> |
|
36 | <td></td> | |
35 | <td></td> |
|
37 | <td></td> | |
36 | </tr> |
|
38 | </tr> | |
37 | %for cnt,repo in enumerate(c.repos_list): |
|
39 | %for cnt,repo in enumerate(c.repos_list): | |
38 | <tr class="parity${cnt%2}"> |
|
40 | <tr class="parity${cnt%2}"> | |
39 | <td>${h.link(repo['name'],h.url('summary_home',repo_name=repo['name']))}</td> |
|
41 | <td>${h.link(repo['name'],h.url('summary_home',repo_name=repo['name']))}</td> | |
40 | <td>${repo['description']}</td> |
|
42 | <td>${repo['description']}</td> | |
41 |
<td>${repo['last_change']|n,s |
|
43 | <td>${repo['last_change']|n,filters.age}</td> | |
42 | <td>r${repo['rev']}:<a href="/${repo['name']}/rev/${repo['tip']}/">${repo['tip']}</a></td> |
|
44 | <td>r${repo['rev']}:<a href="/${repo['name']}/rev/${repo['tip']}/">${repo['tip']}</a></td> | |
43 | <td>${repo['contact']}</td> |
|
45 | <td>${repo['contact']}</td> | |
44 | <td class="indexlinks"> |
|
46 | <td class="indexlinks"> | |
45 | %for archive in repo['repo_archives']: |
|
47 | %for archive in repo['repo_archives']: | |
46 | <a href="/${repo['name']}/archive/${archive['node']}${archive['extension']}">${archive['type']}</a> |
|
48 | <a href="/${repo['name']}/archive/${archive['node']}${archive['extension']}">${archive['type']}</a> | |
47 | %endfor |
|
49 | %endfor | |
48 | </td> |
|
50 | </td> | |
49 | <td> |
|
51 | <td> | |
50 | <div class="rss_logo"> |
|
52 | <div class="rss_logo"> | |
51 | <a href="/${repo['name']}/rss-log">RSS</a> |
|
53 | <a href="/${repo['name']}/rss-log">RSS</a> | |
52 | <a href="/${repo['name']}/atom-log">Atom</a> |
|
54 | <a href="/${repo['name']}/atom-log">Atom</a> | |
53 | </div> |
|
55 | </div> | |
54 | </td> |
|
56 | </td> | |
55 | </tr> |
|
57 | </tr> | |
56 | %endfor |
|
58 | %endfor | |
57 | </table> |
|
59 | </table> | |
58 | </%def> |
|
60 | </%def> |
@@ -1,95 +1,97 b'' | |||||
1 | <%inherit file="base/base.html"/> |
|
1 | <%inherit file="base/base.html"/> | |
2 |
|
2 | <%! | ||
|
3 | from pylons_app.lib import filters | |||
|
4 | %> | |||
3 | <%def name="title()"> |
|
5 | <%def name="title()"> | |
4 | ${_('Repository managment')} |
|
6 | ${_('Repository managment')} | |
5 | </%def> |
|
7 | </%def> | |
6 | <%def name="breadcrumbs()"> |
|
8 | <%def name="breadcrumbs()"> | |
7 | ${h.link_to(u'Home',h.url('/'))} |
|
9 | ${h.link_to(u'Home',h.url('/'))} | |
8 | / |
|
10 | / | |
9 | ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))} |
|
11 | ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))} | |
10 | / |
|
12 | / | |
11 | ${_('summary')} |
|
13 | ${_('summary')} | |
12 | </%def> |
|
14 | </%def> | |
13 | <%def name="page_nav()"> |
|
15 | <%def name="page_nav()"> | |
14 | <form action="log"> |
|
16 | <form action="log"> | |
15 | <dl class="search"> |
|
17 | <dl class="search"> | |
16 | <dt><label>Search: </label></dt> |
|
18 | <dt><label>Search: </label></dt> | |
17 | <dd><input type="text" name="rev" /></dd> |
|
19 | <dd><input type="text" name="rev" /></dd> | |
18 | </dl> |
|
20 | </dl> | |
19 | </form> |
|
21 | </form> | |
20 |
|
22 | |||
21 | <ul class="page-nav"> |
|
23 | <ul class="page-nav"> | |
22 | <li class="current">summary</li> |
|
24 | <li class="current">${_('summary')}</li> | |
23 | <li><a href="shortlog">shortlog</a></li> |
|
25 | <li>${h.link(_('shortlog'),h.url('shortlog_home',repo_name=c.repo_name))}</li> | |
24 | <li><a href="log">changelog</a></li> |
|
26 | <li><a href="log">changelog</a></li> | |
25 | <li><a href="graph/{node|short}">graph</a></li> |
|
27 | <li><a href="graph/{node|short}">graph</a></li> | |
26 | <li><a href="tags">tags</a></li> |
|
28 | <li><a href="tags">tags</a></li> | |
27 | <li><a href="branches">branches</a></li> |
|
29 | <li><a href="branches">branches</a></li> | |
28 | <li><a href="file/{node|short}">files</a></li> |
|
30 | <li><a href="file/{node|short}">files</a></li> | |
29 | </ul> |
|
31 | </ul> | |
30 | </%def> |
|
32 | </%def> | |
31 | <%def name="main()"> |
|
33 | <%def name="main()"> | |
32 |
|
34 | |||
33 | <h2 class="no-link no-border">${_('Mercurial Repository Overview')}</h2> |
|
35 | <h2 class="no-link no-border">${_('Mercurial Repository Overview')}</h2> | |
34 | <dl class="overview"> |
|
36 | <dl class="overview"> | |
35 | <dt>${_('name')}</dt> |
|
37 | <dt>${_('name')}</dt> | |
36 | <dd>${c.repo_info.name}</dd> |
|
38 | <dd>${c.repo_info.name}</dd> | |
37 | <dt>${_('description')}</dt> |
|
39 | <dt>${_('description')}</dt> | |
38 | <dd>${c.repo_info.description}</dd> |
|
40 | <dd>${c.repo_info.description}</dd> | |
39 | <dt>${_('contact')}</dt> |
|
41 | <dt>${_('contact')}</dt> | |
40 | <dd>${c.repo_info.contact}</dd> |
|
42 | <dd>${c.repo_info.contact}</dd> | |
41 | <dt>${_('last change')}</dt> |
|
43 | <dt>${_('last change')}</dt> | |
42 |
<dd>${c.repo_info.last_change|n,s |
|
44 | <dd>${c.repo_info.last_change|n,filters.rfc822date} - ${c.repo_info.last_change|n,filters.age}</dd> | |
43 | <dt>${_('url')}</dt> |
|
45 | <dt>${_('url')}</dt> | |
44 | <dd><pre>$ hg clone <a href="${c.clone_repo_url}">${c.clone_repo_url}</a></pre></dd> |
|
46 | <dd><pre>$ hg clone <a href="${c.clone_repo_url}">${c.clone_repo_url}</a></pre></dd> | |
45 | <dt>${_('Download')}</dt> |
|
47 | <dt>${_('Download')}</dt> | |
46 | <dd> |
|
48 | <dd> | |
47 | %for archive in c.repo_info._get_archives(): |
|
49 | %for archive in c.repo_info._get_archives(): | |
48 | | <a href="/${c.repo_info.name}/archive/${archive['node']}${archive['extension']}"> |
|
50 | | <a href="/${c.repo_info.name}/archive/${archive['node']}${archive['extension']}"> | |
49 | ${c.repo_info.name}.${archive['type']} |
|
51 | ${c.repo_info.name}.${archive['type']} | |
50 | </a> |
|
52 | </a> | |
51 | %endfor |
|
53 | %endfor | |
52 | | |
|
54 | | | |
53 | </dd> |
|
55 | </dd> | |
54 | </dl> |
|
56 | </dl> | |
55 |
|
57 | |||
56 | <h2><a href="{url}shortlog">Changes</a></h2> |
|
58 | <h2><a href="{url}shortlog">Changes</a></h2> | |
57 | <table> |
|
59 | <table> | |
58 | %for cnt,cs in enumerate(c.repo_changesets): |
|
60 | %for cnt,cs in enumerate(c.repo_changesets): | |
59 | <tr class="parity${cnt%2}"> |
|
61 | <tr class="parity${cnt%2}"> | |
60 |
<td>${cs._ctx.date()|n,s |
|
62 | <td>${cs._ctx.date()|n,filters.age}</td> | |
61 | <td>${cs.author}</td> |
|
63 | <td>${cs.author}</td> | |
62 | <td>${h.link_to(cs.message,h.url('rev/'+str(cs._ctx)))}</td> |
|
64 | <td>${h.link_to(cs.message,h.url('rev/'+str(cs._ctx)))}</td> | |
63 | <td class="nowrap"> |
|
65 | <td class="nowrap"> | |
64 | ${h.link_to(_('changeset'),h.url('file/'+str(cs._ctx)))} |
|
66 | ${h.link_to(_('changeset'),h.url('file/'+str(cs._ctx)))} | |
65 | | |
|
67 | | | |
66 | ${h.link_to(_('files'),h.url('file/'+str(cs._ctx)))} |
|
68 | ${h.link_to(_('files'),h.url('file/'+str(cs._ctx)))} | |
67 | </td> |
|
69 | </td> | |
68 | </tr> |
|
70 | </tr> | |
69 | %endfor |
|
71 | %endfor | |
70 | <tr class="light"> |
|
72 | <tr class="light"> | |
71 | <td colspan="4"><a class="list" href="shortlog">...</a></td> |
|
73 | <td colspan="4"><a class="list" href="shortlog">...</a></td> | |
72 | </tr> |
|
74 | </tr> | |
73 | </table> |
|
75 | </table> | |
74 |
|
76 | |||
75 | <h2><a href="{url}tags">${_('Tags')}</a></h2> |
|
77 | <h2><a href="{url}tags">${_('Tags')}</a></h2> | |
76 | <table> |
|
78 | <table> | |
77 | %for tag in c.repo_tags: |
|
79 | %for tag in c.repo_tags: | |
78 | ${tag} |
|
80 | ${tag} | |
79 | %endfor |
|
81 | %endfor | |
80 | <tr class="light"> |
|
82 | <tr class="light"> | |
81 | <td colspan="3"><a class="list" href="tags">...</a></td> |
|
83 | <td colspan="3"><a class="list" href="tags">...</a></td> | |
82 | </tr> |
|
84 | </tr> | |
83 | </table> |
|
85 | </table> | |
84 |
|
86 | |||
85 | <h2 class="no-link">Branches</h2> |
|
87 | <h2 class="no-link">Branches</h2> | |
86 | <table> |
|
88 | <table> | |
87 | %for branch in c.repo_branches: |
|
89 | %for branch in c.repo_branches: | |
88 | ${branch} |
|
90 | ${branch} | |
89 | %endfor |
|
91 | %endfor | |
90 | <tr class="light"> |
|
92 | <tr class="light"> | |
91 | <td colspan="4"><a class="list" href="branches">...</a></td> |
|
93 | <td colspan="4"><a class="list" href="branches">...</a></td> | |
92 | </tr> |
|
94 | </tr> | |
93 | </table> |
|
95 | </table> | |
94 |
|
96 | |||
95 | </%def> No newline at end of file |
|
97 | </%def> |
General Comments 0
You need to be logged in to leave comments.
Login now