##// END OF EJS Templates
Fixes for release 1.1.4...
marcink -
r1071:bdc438fb default
parent child Browse files
Show More
@@ -4,12 +4,14 b' Welcome to RhodeCode (RhodiumCode) docum'
4 =================================================
4 =================================================
5
5
6 ``RhodeCode`` (formerly hg-app) is Pylons framework based Mercurial repository
6 ``RhodeCode`` (formerly hg-app) is Pylons framework based Mercurial repository
7 browser/management with build in push/pull server and full text search.
7 browser/management tool with build in push/pull server and full text search.
8 It works on http/https, has build in permission/authentication(+ldap) features
8 It works on http/https, has build in permission/authentication system with
9 It's similar to github or bitbucket, but it's suppose to run as standalone
9 ability to auth via LDAP. It's similar in some parts to github or bitbucket,
10 hosted application, it's open source and focuses more on restricted access to
10 but it's suppose to run as standalone hosted application, it's open source
11 repositories. It's powered by vcs_ library that me and Lukasz Balcerzak created
11 and donation ware and focuses more on providing customized, self administered
12 to handle many various version control systems.
12 interface for Mercurial(and soon GIT) repositories. It's powered by vcs_
13 library that me and Lukasz Balcerzak created to handle many various version
14 control systems.
13
15
14 RhodeCode uses `Semantic Versioning <http://semver.org/>`_
16 RhodeCode uses `Semantic Versioning <http://semver.org/>`_
15
17
@@ -45,7 +47,7 b' Features'
45 - Has it's own middleware to handle mercurial_ protocol request.
47 - Has it's own middleware to handle mercurial_ protocol request.
46 Each request can be logged and authenticated. Runs on threads unlikely to
48 Each request can be logged and authenticated. Runs on threads unlikely to
47 hgweb. You can make multiple pulls/pushes simultaneous. Supports http/https
49 hgweb. You can make multiple pulls/pushes simultaneous. Supports http/https
48 and ldap
50 and LDAP
49 - Full permissions (private/read/write/admin) and authentication per project.
51 - Full permissions (private/read/write/admin) and authentication per project.
50 One account for web interface and mercurial_ push/pull/clone operations.
52 One account for web interface and mercurial_ push/pull/clone operations.
51 - Mako templates let's you customize look and feel of application.
53 - Mako templates let's you customize look and feel of application.
@@ -60,7 +62,7 b' Features'
60 (no external search servers required all in one application)
62 (no external search servers required all in one application)
61 - Setup project descriptions and info inside built in db for easy, non
63 - Setup project descriptions and info inside built in db for easy, non
62 file-system operations
64 file-system operations
63 - Inteligent cache with invalidation after push or project change, provides high
65 - Intelligent cache with invalidation after push or project change, provides high
64 performance and always up to date data.
66 performance and always up to date data.
65 - Rss / atom feeds, gravatar support, download sources as zip/tar/gz
67 - Rss / atom feeds, gravatar support, download sources as zip/tar/gz
66 - Async tasks for speed and performance using celery_ (works without them too)
68 - Async tasks for speed and performance using celery_ (works without them too)
@@ -77,20 +79,20 b' Incoming / Plans'
77
79
78 - project grouping
80 - project grouping
79 - User groups/teams
81 - User groups/teams
82 - ssh based authentication with server side key management
80 - code review (probably based on hg-review)
83 - code review (probably based on hg-review)
81 - full git_ support, with push/pull server (currently in beta tests)
84 - full git_ support, with push/pull server (currently in beta tests)
82 - redmine integration
85 - redmine integration
83 - public accessible activity feeds
86 - public accessible activity feeds
84 - commit based build in wiki system
87 - commit based build in wiki system
85 - clone points and cloning from remote repositories into rhodecode
88 - clone points and cloning from remote repositories into RhodeCode
86 (git_ and mercurial_)
87 - more statistics and graph (global annotation + some more statistics)
89 - more statistics and graph (global annotation + some more statistics)
88 - other cools stuff that i can figure out (or You can help me figure out)
90 - other cools stuff that i can figure out (or You can help me figure out)
89
91
90 License
92 License
91 -------
93 -------
92
94
93 ``rhodecode`` is released under GPL_ license.
95 ``RhodeCode`` is released under GPL_ license.
94
96
95
97
96 Mailing group Q&A
98 Mailing group Q&A
@@ -112,3 +114,13 b' Online documentation'
112
114
113 make html
115 make html
114
116
117 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
118 .. _python: http://www.python.org/
119 .. _django: http://www.djangoproject.com/
120 .. _mercurial: http://mercurial.selenic.com/
121 .. _subversion: http://subversion.tigris.org/
122 .. _git: http://git-scm.com/
123 .. _celery: http://celeryproject.org/
124 .. _Sphinx: http://sphinx.pocoo.org/
125 .. _GPL: http://www.gnu.org/licenses/gpl.html
126 .. _vcs: http://pypi.python.org/pypi/vcs No newline at end of file
@@ -3,6 +3,21 b''
3 Changelog
3 Changelog
4 =========
4 =========
5
5
6 1.1.4 (**2011-02-19**)
7 ======================
8
9 news
10 ----
11
12 fixes
13 -----
14
15 - fixed formencode import problem on settings page, that caused server crash
16 when that page was accessed as first after server start
17 - journal fixes
18 - fixed option to access repository just by entering http://server/<repo_name>
19
20
6 1.1.3 (**2011-02-16**)
21 1.1.3 (**2011-02-16**)
7 ======================
22 ======================
8
23
@@ -29,7 +44,6 b' fixes'
29 - fixed #106 relation issues on databases different than sqlite
44 - fixed #106 relation issues on databases different than sqlite
30 - fixed static files paths links to use of url() method
45 - fixed static files paths links to use of url() method
31
46
32
33 1.1.2 (**2011-01-12**)
47 1.1.2 (**2011-01-12**)
34 ======================
48 ======================
35
49
@@ -6,4 +6,12 b' Contributing in RhodeCode'
6 If You would like to contribute to RhodeCode, please contact me, any help is
6 If You would like to contribute to RhodeCode, please contact me, any help is
7 greatly appreciated.
7 greatly appreciated.
8
8
9 Preferable method Would be to fork RhodeCode repository from bitbucket
10 https://bitbucket.org/marcinkuzminski/rhodecode and then open a pull request.
11 This way it's easier for me to merge.
12
13 To run RhodeCode in a development version You always need to install tip
14 version of RhodeCode and VCS library.
15
16
9 Thank You.
17 Thank You.
@@ -22,16 +22,16 b' Rhodecode requires python 2.x greater th'
22
22
23 Easiest way to install ``rhodecode`` is to run::
23 Easiest way to install ``rhodecode`` is to run::
24
24
25 easy_install rhodecode
25 easy_install rhodecode
26
26
27 Or::
27 Or::
28
28
29 pip install rhodecode
29 pip install rhodecode
30
30
31 If you prefer to install manually simply grab latest release from
31 If you prefer to install manually simply grab latest release from
32 http://pypi.python.org/pypi/RhodeCode, decompres archive and run::
32 http://pypi.python.org/pypi/rhodecode, decompress archive and run::
33
33
34 python setup.py install
34 python setup.py install
35
35
36
36
37 Step by step installation example
37 Step by step installation example
@@ -39,32 +39,45 b' Step by step installation example'
39
39
40
40
41 - Assuming You have installed virtualenv_ create one using.
41 - Assuming You have installed virtualenv_ create one using.
42 The `--no-site-packages` will make sure non of Your system libs are linked
43 with this virtualenv_
44
42
45 ::
43 ::
46
44
47 virtualenv --no-site-packages /var/www/rhodecode-venv
45 virtualenv --no-site-packages /var/www/rhodecode-venv
46
47
48 .. note:: Using ``--no-site-packages`` when generating your
49 virtualenv is *very important*. This flag provides the necessary
50 isolation for running the set of packages required by
51 RhodeCode. If you do not specify ``--no-site-packages``,
52 it's possible that RhodeCode will not install properly into
53 the virtualenv, or, even if it does, may not run properly,
54 depending on the packages you've already got installed into your
55 Python's "main" site-packages dir.
56
48
57
49 - this will install new virtualenv_ into `/var/www/rhodecode-venv`.
58 - this will install new virtualenv_ into `/var/www/rhodecode-venv`.
50 - Activate the virtualenv_ by running
59 - Activate the virtualenv_ by running
51
60
52 ::
61 ::
53
62
54 source /var/www/rhodecode-venv/bin/activate
63 source /var/www/rhodecode-venv/bin/activate
64
65 .. note:: If you're on UNIX, *do not* use ``sudo`` to run the
66 ``virtualenv`` script. It's perfectly acceptable (and desirable)
67 to create a virtualenv as a normal user.
55
68
56 - Make a folder for rhodecode somewhere on the filesystem for example
69 - Make a folder for rhodecode somewhere on the filesystem for example
57
70
58 ::
71 ::
59
72
60 mkdir /var/www/rhodecode
73 mkdir /var/www/rhodecode
61
74
62
75
63 - Run this command to install rhodecode
76 - Run this command to install rhodecode
64
77
65 ::
78 ::
66
79
67 easy_install rhodecode
80 easy_install rhodecode
68
81
69 - this will install rhodecode together with pylons
82 - this will install rhodecode together with pylons
70 and all other required python libraries
83 and all other required python libraries
@@ -7,7 +7,7 b' Setup'
7 Setting up the application
7 Setting up the application
8 --------------------------
8 --------------------------
9
9
10 First You'll ned to create RhodeCode config file. Run the following command
10 First You'll need to create RhodeCode config file. Run the following command
11 to do this
11 to do this
12
12
13 ::
13 ::
@@ -19,8 +19,10 b' to do this'
19 email settings, usage of static files, cache, celery settings and logging.
19 email settings, usage of static files, cache, celery settings and logging.
20
20
21
21
22 Next we need to create the database. I'll recommend to use sqlite (default)
23 or postgresql. Make sure You properly adjust the db url in the .ini file to use
24 other than the default sqlite database
22
25
23 Next we need to create the database.
24
26
25 ::
27 ::
26
28
@@ -35,7 +37,7 b' Next we need to create the database.'
35 interface will work even without such an access but, when trying to do a
37 interface will work even without such an access but, when trying to do a
36 push it'll eventually fail with permission denied errors.
38 push it'll eventually fail with permission denied errors.
37
39
38 You are ready to use rhodecode, to run it simply execute
40 You are ready to use RhodeCode, to run it simply execute
39
41
40 ::
42 ::
41
43
@@ -50,37 +52,64 b' You are ready to use rhodecode, to run i'
50 anonymous, permissions settings. As well as edit more advanced options on
52 anonymous, permissions settings. As well as edit more advanced options on
51 users and repositories
53 users and repositories
52
54
55 Using RhodeCode with SSH
56 ------------------------
57
58 RhodeCode repository structures are kept in directories with the same name
59 as the project, when using repository groups, each group is a a subdirectory.
60 This will allow You to use ssh for accessing repositories quite easy. There
61 are some exceptions when using ssh for accessing repositories.
62
63 You have to make sure that the webserver as well as the ssh users have unix
64 permission for directories. Secondly when using ssh rhodecode will not
65 authenticate those requests and permissions set by the web interface will not
66 work on the repositories accessed via ssh. There is a solution to this to use
67 auth hooks, that connects to rhodecode db, and runs check functions for
68 permissions.
69
70
71 if Your main directory (the same as set in RhodeCode settings) is for example
72 set for to **/home/hg** and repository You are using is `rhodecode`
73
74 The command runned should look like this::
75
76 hg clone ssh://user@server.com/home/hg/rhodecode
77
78 Using external tools such as mercurial server or using ssh key based auth is
79 fully supported.
53
80
54 Setting up Whoosh full text search
81 Setting up Whoosh full text search
55 ----------------------------------
82 ----------------------------------
56
83
57 Index for whoosh can be build starting from version 1.1 using paster command
84 Starting from version 1.1 whoosh index can be build using paster command.
58 passing repo locations to index, as well as Your config file that stores
85 You have to specify the config file that stores location of index, and
59 whoosh index files locations. There is possible to pass `-f` to the options
86 location of repositories (`--repo-location`).
87
88 There is possible also to pass `-f` to the options
60 to enable full index rebuild. Without that indexing will run always in in
89 to enable full index rebuild. Without that indexing will run always in in
61 incremental mode.
90 incremental mode.
62
91
63 ::
92 incremental mode::
64
93
65 paster make-index production.ini --repo-location=<location for repos>
94 paster make-index production.ini --repo-location=<location for repos>
95
66
96
67 for full index rebuild You can use
68
97
69 ::
98 for full index rebuild You can use::
70
99
71 paster make-index production.ini -f --repo-location=<location for repos>
100 paster make-index production.ini -f --repo-location=<location for repos>
72
101
73 - For full text search You can either put crontab entry for
102 - For full text search You can either put crontab entry for
74
103
75 This command can be run even from crontab in order to do periodical
104 In order to do periodical index builds and keep Your index always up to date.
76 index builds and keep Your index always up to date. An example entry might
105 It's recommended to do a crontab entry for incremental indexing.
77 look like this
106 An example entry might look like this
78
107
79 ::
108 ::
80
109
81 /path/to/python/bin/paster /path/to/rhodecode/production.ini --repo-location=<location for repos>
110 /path/to/python/bin/paster /path/to/rhodecode/production.ini --repo-location=<location for repos>
82
111
83 When using incremental(default) mode whoosh will check last modification date
112 When using incremental (default) mode whoosh will check last modification date
84 of each file and add it to reindex if newer file is available. Also indexing
113 of each file and add it to reindex if newer file is available. Also indexing
85 daemon checks for removed files and removes them from index.
114 daemon checks for removed files and removes them from index.
86
115
@@ -93,7 +122,7 b' Setting up LDAP support'
93 -----------------------
122 -----------------------
94
123
95 RhodeCode starting from version 1.1 supports ldap authentication. In order
124 RhodeCode starting from version 1.1 supports ldap authentication. In order
96 to use ldap, You have to install python-ldap package. This package is available
125 to use LDAP, You have to install python-ldap_ package. This package is available
97 via pypi, so You can install it by running
126 via pypi, so You can install it by running
98
127
99 ::
128 ::
@@ -157,6 +186,7 b' In order to make start using celery run:'
157
186
158 paster celeryd <configfile.ini>
187 paster celeryd <configfile.ini>
159
188
189
160 .. note::
190 .. note::
161 Make sure You run this command from same virtualenv, and with the same user
191 Make sure You run this command from same virtualenv, and with the same user
162 that rhodecode runs.
192 that rhodecode runs.
@@ -176,21 +206,21 b' Nginx virtual host example'
176
206
177 Sample config for nginx using proxy::
207 Sample config for nginx using proxy::
178
208
179 server {
209 server {
180 listen 80;
210 listen 80;
181 server_name hg.myserver.com;
211 server_name hg.myserver.com;
182 access_log /var/log/nginx/rhodecode.access.log;
212 access_log /var/log/nginx/rhodecode.access.log;
183 error_log /var/log/nginx/rhodecode.error.log;
213 error_log /var/log/nginx/rhodecode.error.log;
184 location / {
214 location / {
185 root /var/www/rhodecode/rhodecode/public/;
215 root /var/www/rhodecode/rhodecode/public/;
186 if (!-f $request_filename){
216 if (!-f $request_filename){
187 proxy_pass http://127.0.0.1:5000;
217 proxy_pass http://127.0.0.1:5000;
188 }
218 }
189 #this is important if You want to use https !!!
219 #this is important if You want to use https !!!
190 proxy_set_header X-Url-Scheme $scheme;
220 proxy_set_header X-Url-Scheme $scheme;
191 include /etc/nginx/proxy.conf;
221 include /etc/nginx/proxy.conf;
192 }
222 }
193 }
223 }
194
224
195 Here's the proxy.conf. It's tuned so it'll not timeout on long
225 Here's the proxy.conf. It's tuned so it'll not timeout on long
196 pushes and also on large pushes::
226 pushes and also on large pushes::
@@ -207,20 +237,20 b' pushes and also on large pushes::'
207 proxy_connect_timeout 3600;
237 proxy_connect_timeout 3600;
208 proxy_send_timeout 3600;
238 proxy_send_timeout 3600;
209 proxy_read_timeout 3600;
239 proxy_read_timeout 3600;
210 proxy_buffer_size 8k;
240 proxy_buffer_size 16k;
211 proxy_buffers 8 32k;
241 proxy_buffers 4 16k;
212 proxy_busy_buffers_size 64k;
242 proxy_busy_buffers_size 64k;
213 proxy_temp_file_write_size 64k;
243 proxy_temp_file_write_size 64k;
214
244
215 Also when using root path with nginx You might set the static files to false
245 Also when using root path with nginx You might set the static files to false
216 in production.ini file::
246 in production.ini file::
217
247
218 [app:main]
248 [app:main]
219 use = egg:rhodecode
249 use = egg:rhodecode
220 full_stack = true
250 full_stack = true
221 static_files = false
251 static_files = false
222 lang=en
252 lang=en
223 cache_dir = %(here)s/data
253 cache_dir = %(here)s/data
224
254
225 To not have the statics served by the application. And improve speed.
255 To not have the statics served by the application. And improve speed.
226
256
@@ -257,6 +287,29 b' Additional tutorial'
257 http://wiki.pylonshq.com/display/pylonscookbook/Apache+as+a+reverse+proxy+for+Pylons
287 http://wiki.pylonshq.com/display/pylonscookbook/Apache+as+a+reverse+proxy+for+Pylons
258
288
259
289
290 Apache as subdirectory
291 ----------------------
292
293
294 Apache subdirectory part::
295
296 <Location /rhodecode>
297 ProxyPass http://127.0.0.1:59542/rhodecode
298 ProxyPassReverse http://127.0.0.1:59542/rhodecode
299 SetEnvIf X-Url-Scheme https HTTPS=1
300 </Location>
301
302 Besides the regular apache setup You'll need to add such part to .ini file::
303
304 filter-with = proxy-prefix
305
306 Add the following at the end of the .ini file::
307
308 [filter:proxy-prefix]
309 use = egg:PasteDeploy#prefix
310 prefix = /<someprefix>
311
312
260 Apache's example FCGI config
313 Apache's example FCGI config
261 ----------------------------
314 ----------------------------
262
315
@@ -293,10 +346,13 b' Troubleshooting'
293
346
294 - make sure You set a proper max_body_size for the http server
347 - make sure You set a proper max_body_size for the http server
295
348
349 - Apache doesn't pass basicAuth on pull/push ?
296
350
351 - Make sure You added `WSGIPassAuthorization true`
297
352
298 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
353 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
299 .. _python: http://www.python.org/
354 .. _python: http://www.python.org/
300 .. _mercurial: http://mercurial.selenic.com/
355 .. _mercurial: http://mercurial.selenic.com/
301 .. _celery: http://celeryproject.org/
356 .. _celery: http://celeryproject.org/
302 .. _rabbitmq: http://www.rabbitmq.com/ No newline at end of file
357 .. _rabbitmq: http://www.rabbitmq.com/
358 .. _python-ldap: http://www.python-ldap.org/
@@ -25,6 +25,11 b' This will display any changes made from '
25 current config. And tries to do an automerge. It's always better to do a backup
25 current config. And tries to do an automerge. It's always better to do a backup
26 of config file and recheck the content after merge.
26 of config file and recheck the content after merge.
27
27
28 .. note::
29 The next steps only apply to upgrading from non bugfix releases eg. from
30 any minor or major releases. Bugfix releases (eg. 1.1.2->1.1.3) will
31 not have any database schema changes or whoosh library updates
32
28 It's also good to rebuild the whoosh index since after upgrading the whoosh
33 It's also good to rebuild the whoosh index since after upgrading the whoosh
29 version there could be introduced incompatible index changes.
34 version there could be introduced incompatible index changes.
30
35
@@ -33,7 +38,7 b' The last step is to upgrade the database'
33
38
34 ::
39 ::
35
40
36 paster upgrade-db production.ini
41 paster upgrade-db production.ini
37
42
38 This will upgrade schema, as well as update some default on the database,
43 This will upgrade schema, as well as update some default on the database,
39 always recheck the settings of the application, if there are no new options
44 always recheck the settings of the application, if there are no new options
@@ -27,7 +27,7 b''
27 # MA 02110-1301, USA.
27 # MA 02110-1301, USA.
28
28
29
29
30 VERSION = (1, 1, 3)
30 VERSION = (1, 1, 4)
31 __version__ = '.'.join((str(each) for each in VERSION[:4]))
31 __version__ = '.'.join((str(each) for each in VERSION[:4]))
32 __dbversion__ = 2 #defines current db version for migrations
32 __dbversion__ = 2 #defines current db version for migrations
33
33
@@ -164,6 +164,8 b' def make_map(config):'
164 map.connect('raw_changeset_home', '/{repo_name:.*}/raw-changeset/{revision}',
164 map.connect('raw_changeset_home', '/{repo_name:.*}/raw-changeset/{revision}',
165 controller='changeset', action='raw_changeset', revision='tip',
165 controller='changeset', action='raw_changeset', revision='tip',
166 conditions=dict(function=check_repo))
166 conditions=dict(function=check_repo))
167 map.connect('summary_home_', '/{repo_name:.*}',
168 controller='summary', conditions=dict(function=check_repo))
167 map.connect('summary_home', '/{repo_name:.*}/summary',
169 map.connect('summary_home', '/{repo_name:.*}/summary',
168 controller='summary', conditions=dict(function=check_repo))
170 controller='summary', conditions=dict(function=check_repo))
169 map.connect('shortlog_home', '/{repo_name:.*}/shortlog',
171 map.connect('shortlog_home', '/{repo_name:.*}/shortlog',
@@ -27,8 +27,9 b''
27
27
28 import logging
28 import logging
29 import traceback
29 import traceback
30 import formencode
30
31
31 import formencode
32 from formencode import htmlfill
32
33
33 from pylons import tmpl_context as c, request, url
34 from pylons import tmpl_context as c, request, url
34 from pylons.controllers.util import redirect
35 from pylons.controllers.util import redirect
@@ -70,7 +71,7 b' class SettingsController(BaseController)'
70 defaults.update({'perm_%s' % p.user.username:
71 defaults.update({'perm_%s' % p.user.username:
71 p.permission.permission_name})
72 p.permission.permission_name})
72
73
73 return formencode.htmlfill.render(
74 return htmlfill.render(
74 render('settings/repo_settings.html'),
75 render('settings/repo_settings.html'),
75 defaults=defaults,
76 defaults=defaults,
76 encoding="UTF-8",
77 encoding="UTF-8",
@@ -95,7 +96,7 b' class SettingsController(BaseController)'
95 c.repo_info = repo_model.get_by_repo_name(repo_name)
96 c.repo_info = repo_model.get_by_repo_name(repo_name)
96 c.users_array = repo_model.get_users_js()
97 c.users_array = repo_model.get_users_js()
97 errors.value.update({'user':c.repo_info.user.username})
98 errors.value.update({'user':c.repo_info.user.username})
98 return formencode.htmlfill.render(
99 return htmlfill.render(
99 render('settings/repo_settings.html'),
100 render('settings/repo_settings.html'),
100 defaults=errors.value,
101 defaults=errors.value,
101 errors=errors.error_dict or {},
102 errors=errors.error_dict or {},
@@ -180,7 +181,7 b' class SettingsController(BaseController)'
180 c.new_repo = errors.value['fork_name']
181 c.new_repo = errors.value['fork_name']
181 r = render('settings/repo_fork.html')
182 r = render('settings/repo_fork.html')
182
183
183 return formencode.htmlfill.render(
184 return htmlfill.render(
184 r,
185 r,
185 defaults=errors.value,
186 defaults=errors.value,
186 errors=errors.error_dict or {},
187 errors=errors.error_dict or {},
@@ -423,30 +423,28 b' def action_parser(user_log):'
423 action, action_params = x
423 action, action_params = x
424
424
425 def get_cs_links():
425 def get_cs_links():
426 if action == 'push':
426 revs_limit = 5
427 revs_limit = 5
427 revs = action_params.split(',')
428 revs = action_params.split(',')
428 cs_links = " " + ', '.join ([link(rev,
429 cs_links = " " + ', '.join ([link(rev,
429 url('changeset_home',
430 url('changeset_home',
430 repo_name=user_log.repository.repo_name,
431 repo_name=user_log.repository.repo_name,
431 revision=rev)) for rev in revs[:revs_limit] ])
432 revision=rev)) for rev in revs[:revs_limit] ])
432 if len(revs) > revs_limit:
433 if len(revs) > revs_limit:
433 uniq_id = revs[0]
434 uniq_id = revs[0]
434 html_tmpl = ('<span> %s '
435 html_tmpl = ('<span> %s '
435 '<a class="show_more" id="_%s" href="#">%s</a> '
436 '<a class="show_more" id="_%s" href="#">%s</a> '
436 '%s</span>')
437 '%s</span>')
437 cs_links += html_tmpl % (_('and'), uniq_id, _('%s more') \
438 cs_links += html_tmpl % (_('and'), uniq_id, _('%s more') \
438 % (len(revs) - revs_limit),
439 % (len(revs) - revs_limit),
439 _('revisions'))
440 _('revisions'))
441
440
442 html_tmpl = '<span id="%s" style="display:none"> %s </span>'
441 html_tmpl = '<span id="%s" style="display:none"> %s </span>'
443 cs_links += html_tmpl % (uniq_id, ', '.join([link(rev,
442 cs_links += html_tmpl % (uniq_id, ', '.join([link(rev,
444 url('changeset_home',
443 url('changeset_home',
445 repo_name=user_log.repository.repo_name,
444 repo_name=user_log.repository.repo_name,
446 revision=rev)) for rev in revs[revs_limit:] ]))
445 revision=rev)) for rev in revs[revs_limit:] ]))
447
446
448 return cs_links
447 return cs_links
449 return ''
450
448
451 def get_fork_name():
449 def get_fork_name():
452 repo_name = action_params
450 repo_name = action_params
@@ -455,14 +453,14 b' def action_parser(user_log):'
455
453
456 map = {'user_deleted_repo':(_('[deleted] repository'), None),
454 map = {'user_deleted_repo':(_('[deleted] repository'), None),
457 'user_created_repo':(_('[created] repository'), None),
455 'user_created_repo':(_('[created] repository'), None),
458 'user_forked_repo':(_('[forked] repository'), get_fork_name),
456 'user_forked_repo':(_('[forked] repository as'), get_fork_name),
459 'user_updated_repo':(_('[updated] repository'), None),
457 'user_updated_repo':(_('[updated] repository'), None),
460 'admin_deleted_repo':(_('[delete] repository'), None),
458 'admin_deleted_repo':(_('[delete] repository'), None),
461 'admin_created_repo':(_('[created] repository'), None),
459 'admin_created_repo':(_('[created] repository'), None),
462 'admin_forked_repo':(_('[forked] repository'), None),
460 'admin_forked_repo':(_('[forked] repository'), None),
463 'admin_updated_repo':(_('[updated] repository'), None),
461 'admin_updated_repo':(_('[updated] repository'), None),
464 'push':(_('[pushed] into'), get_cs_links),
462 'push':(_('[pushed] '), get_cs_links),
465 'pull':(_('[pulled] from'), None),
463 'pull':(_('[pulled] '), None),
466 'started_following_repo':(_('[started following] repository'), None),
464 'started_following_repo':(_('[started following] repository'), None),
467 'stopped_following_repo':(_('[stopped following] repository'), None),
465 'stopped_following_repo':(_('[stopped following] repository'), None),
468 }
466 }
General Comments 0
You need to be logged in to leave comments. Login now