##// END OF EJS Templates
merged found bugs and fixed for stable release:...
marcink -
r921:136af52f default
parent child Browse files
Show More
@@ -46,6 +46,7 b' lang=en'
46 cache_dir = %(here)s/data
46 cache_dir = %(here)s/data
47 index_dir = %(here)s/data/index
47 index_dir = %(here)s/data/index
48 cut_off_limit = 256000
48 cut_off_limit = 256000
49 force_https = false
49
50
50 ####################################
51 ####################################
51 ### CELERY CONFIG ####
52 ### CELERY CONFIG ####
@@ -3,6 +3,25 b''
3 Changelog
3 Changelog
4 =========
4 =========
5
5
6 1.1.1 (**2011-01-06**)
7 ----------------------
8
9 news
10 ++++
11
12 - added force https option into ini files for easier https usage (no need to
13 set server headers with this options)
14 - small css updates
15
16 fixes
17 ++++
18
19 - fixed #96 redirect loop on files view on repositories without changesets
20 - fixed #97 unicode string passed into server header in special cases (mod_wsgi)
21 and server crashed with errors
22 - fixed large tooltips problems on main page
23 - fixed #92 whoosh indexer is more error proof
24
6 1.1.0 (**2010-12-18**)
25 1.1.0 (**2010-12-18**)
7 ----------------------
26 ----------------------
8
27
@@ -157,6 +157,16 b' In order to make start using celery run:'
157 paster celeryd <configfile.ini>
157 paster celeryd <configfile.ini>
158
158
159
159
160 HTTPS support
161 -------------
162
163 There are two ways to enable https, first is to set HTTP_X_URL_SCHEME in
164 Your http server headers, than rhodecode will recognise this headers and make
165 proper https redirections, another way is to set `force_https = true`
166 in the ini cofiguration to force using https, no headers are needed than to
167 enable https
168
169
160 Nginx virtual host example
170 Nginx virtual host example
161 --------------------------
171 --------------------------
162
172
@@ -210,9 +220,36 b' in production.ini file::'
210
220
211 To not have the statics served by the application. And improve speed.
221 To not have the statics served by the application. And improve speed.
212
222
213 Apache reverse proxy
223
214 --------------------
224 Apache virtual host example
215 Tutorial can be found here
225 ---------------------------
226
227 Sample config for apache using proxy::
228
229 <VirtualHost *:80>
230 ServerName hg.myserver.com
231 ServerAlias hg.myserver.com
232
233 <Proxy *>
234 Order allow,deny
235 Allow from all
236 </Proxy>
237
238 #important !
239 #Directive to properly generate url (clone url) for pylons
240 ProxyPreserveHost On
241
242 #rhodecode instance
243 ProxyPass / http://127.0.0.1:5000/
244 ProxyPassReverse / http://127.0.0.1:5000/
245
246 #to enable https use line below
247 #SetEnvIf X-Url-Scheme https HTTPS=1
248
249 </VirtualHost>
250
251
252 Additional tutorial
216 http://wiki.pylonshq.com/display/pylonscookbook/Apache+as+a+reverse+proxy+for+Pylons
253 http://wiki.pylonshq.com/display/pylonscookbook/Apache+as+a+reverse+proxy+for+Pylons
217
254
218
255
@@ -46,6 +46,7 b' lang=en'
46 cache_dir = %(here)s/data
46 cache_dir = %(here)s/data
47 index_dir = %(here)s/data/index
47 index_dir = %(here)s/data/index
48 cut_off_limit = 256000
48 cut_off_limit = 256000
49 force_https = false
49
50
50 ####################################
51 ####################################
51 ### CELERY CONFIG ####
52 ### CELERY CONFIG ####
@@ -47,6 +47,7 b' cache_dir = %(here)s/data'
47 index_dir = %(here)s/data/index
47 index_dir = %(here)s/data/index
48 app_instance_uuid = ${app_instance_uuid}
48 app_instance_uuid = ${app_instance_uuid}
49 cut_off_limit = 256000
49 cut_off_limit = 256000
50 force_https = false
50
51
51 ####################################
52 ####################################
52 ### CELERY CONFIG ####
53 ### CELERY CONFIG ####
@@ -39,7 +39,8 b' from rhodecode.lib.base import BaseContr'
39 from rhodecode.lib.utils import EmptyChangeset
39 from rhodecode.lib.utils import EmptyChangeset
40 from rhodecode.model.scm import ScmModel
40 from rhodecode.model.scm import ScmModel
41
41
42 from vcs.exceptions import RepositoryError, ChangesetError
42 from vcs.exceptions import RepositoryError, ChangesetError, \
43 ChangesetDoesNotExistError, EmptyRepositoryError
43 from vcs.nodes import FileNode
44 from vcs.nodes import FileNode
44 from vcs.utils import diffs as differ
45 from vcs.utils import diffs as differ
45
46
@@ -91,6 +92,10 b' class FilesController(BaseController):'
91 h.flash(str(e), category='warning')
92 h.flash(str(e), category='warning')
92 redirect(h.url('files_home', repo_name=repo_name, revision=revision))
93 redirect(h.url('files_home', repo_name=repo_name, revision=revision))
93
94
95 except EmptyRepositoryError, e:
96 h.flash(_('There are no files yet'), category='warning')
97 redirect(h.url('summary_home', repo_name=repo_name))
98
94 except RepositoryError, e:
99 except RepositoryError, e:
95 h.flash(str(e), category='warning')
100 h.flash(str(e), category='warning')
96 redirect(h.url('files_home', repo_name=repo_name, revision='tip'))
101 redirect(h.url('files_home', repo_name=repo_name, revision='tip'))
@@ -116,10 +116,17 b' class WhooshIndexingDaemon(object):'
116 the instance of vcs backend"""
116 the instance of vcs backend"""
117 node = self.get_node(repo, path)
117 node = self.get_node(repo, path)
118
118
119 #we just index the content of chosen files
119 #we just index the content of chosen files, and skip binary files
120 if node.extension in INDEX_EXTENSIONS:
120 if node.extension in INDEX_EXTENSIONS and not node.is_binary:
121
122 u_content = node.content
123 if not isinstance(u_content, unicode):
124 log.warning(' >> %s Could not get this content as unicode '
125 'replacing with empty content', path)
126 u_content = u''
127 else:
121 log.debug(' >> %s [WITH CONTENT]' % path)
128 log.debug(' >> %s [WITH CONTENT]' % path)
122 u_content = node.content
129
123 else:
130 else:
124 log.debug(' >> %s' % path)
131 log.debug(' >> %s' % path)
125 #just index file name without it's content
132 #just index file name without it's content
@@ -1,8 +1,15 b''
1 #!/usr/bin/env python
1 # -*- coding: utf-8 -*-
2 # encoding: utf-8
2 """
3 # middleware to handle https correctly
3 rhodecode.lib.middleware.https_fixup
4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 middleware to handle https correctly
7
8 :created_on: May 23, 2010
9 :author: marcink
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
12 """
6 # This program is free software; you can redistribute it and/or
13 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License
14 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; version 2
15 # as published by the Free Software Foundation; version 2
@@ -18,15 +25,12 b''
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
25 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 # MA 02110-1301, USA.
26 # MA 02110-1301, USA.
20
27
21 """
28 from rhodecode.lib import str2bool
22 Created on May 23, 2010
23
24 @author: marcink
25 """
26
29
27 class HttpsFixup(object):
30 class HttpsFixup(object):
28 def __init__(self, app):
31 def __init__(self, app, config):
29 self.application = app
32 self.application = app
33 self.config = config
30
34
31 def __call__(self, environ, start_response):
35 def __call__(self, environ, start_response):
32 self.__fixup(environ)
36 self.__fixup(environ)
@@ -40,6 +44,9 b' class HttpsFixup(object):'
40 """
44 """
41 proto = environ.get('HTTP_X_URL_SCHEME')
45 proto = environ.get('HTTP_X_URL_SCHEME')
42
46
47 if str2bool(self.config.get('force_https')):
48 proto = 'https'
49
43 if proto == 'https':
50 if proto == 'https':
44 environ['wsgi.url_scheme'] = proto
51 environ['wsgi.url_scheme'] = proto
45 else:
52 else:
@@ -69,6 +69,8 b' class SimpleHg(object):'
69 proxy_key = 'HTTP_X_REAL_IP'
69 proxy_key = 'HTTP_X_REAL_IP'
70 def_key = 'REMOTE_ADDR'
70 def_key = 'REMOTE_ADDR'
71 self.ipaddr = environ.get(proxy_key, environ.get(def_key, '0.0.0.0'))
71 self.ipaddr = environ.get(proxy_key, environ.get(def_key, '0.0.0.0'))
72 # skip passing error to error controller
73 environ['pylons.status_code_redirect'] = True
72
74
73 #===================================================================
75 #===================================================================
74 # AUTHENTICATE THIS MERCURIAL REQUEST
76 # AUTHENTICATE THIS MERCURIAL REQUEST
@@ -76,7 +78,7 b' class SimpleHg(object):'
76 username = REMOTE_USER(environ)
78 username = REMOTE_USER(environ)
77
79
78 if not username:
80 if not username:
79 self.authenticate.realm = self.config['rhodecode_realm']
81 self.authenticate.realm = str(self.config['rhodecode_realm'])
80 result = self.authenticate(environ)
82 result = self.authenticate(environ)
81 if isinstance(result, str):
83 if isinstance(result, str):
82 AUTH_TYPE.update(environ, 'basic')
84 AUTH_TYPE.update(environ, 'basic')
@@ -905,20 +905,6 b' margin:0;'
905 padding:4px 8px;
905 padding:4px 8px;
906 }
906 }
907
907
908 #content div.box div.form div.fields div.field div.input a.ui-input-file {
909 width:28px;
910 height:28px;
911 display:inline;
912 position:absolute;
913 overflow:hidden;
914 cursor:pointer;
915 background:#e5e3e3 url("../images/button_browse.png") no-repeat;
916 border:none;
917 text-decoration:none;
918 margin:0 0 0 6px;
919 padding:0;
920 }
921
922 #content div.box div.form div.fields div.field div.textarea {
908 #content div.box div.form div.fields div.field div.textarea {
923 border-top:1px solid #b3b3b3;
909 border-top:1px solid #b3b3b3;
924 border-left:1px solid #b3b3b3;
910 border-left:1px solid #b3b3b3;
@@ -978,15 +964,6 b' font-size:11px;'
978 padding:5px 5px 5px 0;
964 padding:5px 5px 5px 0;
979 }
965 }
980
966
981 #content div.box div.form div.fields div.field div.textarea table td table td a.mceButtonActive {
982 background:#b1b1b1;
983 }
984
985 #content div.box div.form div.fields div.field div.select a.ui-selectmenu {
986 color:#565656;
987 text-decoration:none;
988 }
989
990 #content div.box div.form div.fields div.field input[type=text]:focus,#content div.box div.form div.fields div.field input[type=password]:focus,#content div.box div.form div.fields div.field input[type=file]:focus,#content div.box div.form div.fields div.field textarea:focus,#content div.box div.form div.fields div.field select:focus {
967 #content div.box div.form div.fields div.field input[type=text]:focus,#content div.box div.form div.fields div.field input[type=password]:focus,#content div.box div.form div.fields div.field input[type=file]:focus,#content div.box div.form div.fields div.field textarea:focus,#content div.box div.form div.fields div.field select:focus {
991 background:#f6f6f6;
968 background:#f6f6f6;
992 border-color:#666;
969 border-color:#666;
@@ -997,7 +974,7 b' margin:0;'
997 padding:0 0 0 8px;
974 padding:0 0 0 8px;
998 }
975 }
999
976
1000 div.form div.fields div.field div.highlight .ui-state-default {
977 div.form div.fields div.field div.highlight .ui-button {
1001 background:#4e85bb url("../images/button_highlight.png") repeat-x;
978 background:#4e85bb url("../images/button_highlight.png") repeat-x;
1002 border-top:1px solid #5c91a4;
979 border-top:1px solid #5c91a4;
1003 border-left:1px solid #2a6f89;
980 border-left:1px solid #2a6f89;
@@ -1019,7 +996,7 b' margin:0;'
1019 padding:6px 12px;
996 padding:6px 12px;
1020 }
997 }
1021
998
1022 #content div.box div.form div.fields div.buttons div.highlight input.ui-state-default {
999 #content div.box div.form div.fields div.buttons div.highlight input.ui-button {
1023 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
1000 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
1024 border-top:1px solid #5c91a4;
1001 border-top:1px solid #5c91a4;
1025 border-left:1px solid #2a6f89;
1002 border-left:1px solid #2a6f89;
@@ -1408,7 +1385,7 b' margin:0;'
1408 padding:10px 0 0 150px;
1385 padding:10px 0 0 150px;
1409 }
1386 }
1410
1387
1411 #register div.form div.fields div.buttons div.highlight input.ui-state-default {
1388 #register div.form div.fields div.buttons div.highlight input.ui-button {
1412 background:url("../images/button_highlight.png") repeat-x scroll 0 0 #4E85BB;
1389 background:url("../images/button_highlight.png") repeat-x scroll 0 0 #4E85BB;
1413 color:#FFF;
1390 color:#FFF;
1414 border-color:#5C91A4 #2B7089 #1A6480 #2A6F89;
1391 border-color:#5C91A4 #2B7089 #1A6480 #2A6F89;
@@ -1614,10 +1591,18 b' padding:0;'
1614 }
1591 }
1615
1592
1616 div.browserblock .browser-header {
1593 div.browserblock .browser-header {
1617 border-bottom:1px solid #CCC;
1618 background:#FFF;
1594 background:#FFF;
1619 color:blue;
1620 padding:10px 0;
1595 padding:10px 0;
1596 float:left;
1597 }
1598
1599 div.browserblock .browser-branch {
1600 background:#FFF;
1601 padding:20px 0 0 0;
1602 float:left;
1603 }
1604 div.browserblock .browser-branch label {
1605 color:#4A4A4A;
1621 }
1606 }
1622
1607
1623 div.browserblock .browser-header span {
1608 div.browserblock .browser-header span {
@@ -1627,6 +1612,7 b' font-weight:700;'
1627
1612
1628 div.browserblock .browser-body {
1613 div.browserblock .browser-body {
1629 background:#EEE;
1614 background:#EEE;
1615 border-top:1px solid #CCC;
1630 }
1616 }
1631
1617
1632 table.code-browser {
1618 table.code-browser {
@@ -1754,6 +1740,10 b' width:auto;'
1754 opacity:1px;
1740 opacity:1px;
1755 padding:8px;
1741 padding:8px;
1756 white-space: pre;
1742 white-space: pre;
1743 -webkit-border-radius: 8px 8px 8px 8px;
1744 -khtml-border-radius: 8px 8px 8px 8px;
1745 -moz-border-radius: 8px 8px 8px 8px;
1746 border-radius: 8px 8px 8px 8px;
1757 }
1747 }
1758
1748
1759 .ac {
1749 .ac {
@@ -2052,7 +2042,7 b' border-left:1px solid #316293;'
2052 border:1px solid #316293;
2042 border:1px solid #316293;
2053 }
2043 }
2054
2044
2055 #content div.box div.title div.search div.button input.ui-state-default {
2045 #content div.box div.title div.search div.button input.ui-button {
2056 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
2046 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
2057 border:1px solid #316293;
2047 border:1px solid #316293;
2058 border-left:none;
2048 border-left:none;
@@ -2066,7 +2056,7 b' border-left:none;'
2066 color:#FFF;
2056 color:#FFF;
2067 }
2057 }
2068
2058
2069 #content div.box div.form div.fields div.field div.highlight .ui-state-default {
2059 #content div.box div.form div.fields div.field div.highlight .ui-button {
2070 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
2060 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
2071 border-top:1px solid #5c91a4;
2061 border-top:1px solid #5c91a4;
2072 border-left:1px solid #2a6f89;
2062 border-left:1px solid #2a6f89;
@@ -2211,7 +2201,7 b' font-weight:700;'
2211 margin:0;
2201 margin:0;
2212 }
2202 }
2213
2203
2214 div.form div.fields div.field div.button .ui-state-default,#content div.box div.form div.fields div.buttons input.ui-state-default {
2204 div.form div.fields div.field div.button .ui-button,#content div.box div.form div.fields div.buttons input.ui-button {
2215 background:#e5e3e3 url("../images/button.png") repeat-x;
2205 background:#e5e3e3 url("../images/button.png") repeat-x;
2216 border-top:1px solid #DDD;
2206 border-top:1px solid #DDD;
2217 border-left:1px solid #c6c6c6;
2207 border-left:1px solid #c6c6c6;
@@ -2259,7 +2249,7 b' margin:6px 0 0;'
2259 padding:0;
2249 padding:0;
2260 }
2250 }
2261
2251
2262 #content div.box div.action div.button input.ui-state-default,#login div.form div.fields div.buttons input.ui-state-default,#register div.form div.fields div.buttons input.ui-state-default {
2252 #content div.box div.action div.button input.ui-button,#login div.form div.fields div.buttons input.ui-button,#register div.form div.fields div.buttons input.ui-button {
2263 background:#e5e3e3 url("../images/button.png") repeat-x;
2253 background:#e5e3e3 url("../images/button.png") repeat-x;
2264 border-top:1px solid #DDD;
2254 border-top:1px solid #DDD;
2265 border-left:1px solid #c6c6c6;
2255 border-left:1px solid #c6c6c6;
@@ -87,7 +87,7 b''
87 </div>
87 </div>
88 </td>
88 </td>
89 ##DESCRIPTION
89 ##DESCRIPTION
90 <td><span class="tooltip" tooltip_title="${repo['description']}">
90 <td><span class="tooltip" tooltip_title="${h.tooltip(repo['description'])}">
91 ${h.truncate(repo['description'],60)}</span>
91 ${h.truncate(repo['description'],60)}</span>
92 </td>
92 </td>
93 ##LAST CHANGE
93 ##LAST CHANGE
@@ -45,6 +45,7 b' lang=en'
45 cache_dir = %(here)s/data
45 cache_dir = %(here)s/data
46 index_dir = /tmp/index
46 index_dir = /tmp/index
47 cut_off_limit = 256000
47 cut_off_limit = 256000
48 force_https = false
48
49
49 ####################################
50 ####################################
50 ### CELERY CONFIG ####
51 ### CELERY CONFIG ####
General Comments 0
You need to be logged in to leave comments. Login now