##// END OF EJS Templates
whitespace cleanup
marcink -
r3224:8b8edfc2 beta
parent child Browse files
Show More
@@ -1,179 +1,179 b''
1 =========
1 =========
2 RhodeCode
2 RhodeCode
3 =========
3 =========
4
4
5 About
5 About
6 -----
6 -----
7
7
8 ``RhodeCode`` is a fast and powerful management tool for Mercurial_ and GIT_
8 ``RhodeCode`` is a fast and powerful management tool for Mercurial_ and GIT_
9 with a built in push/pull server and full text search and code-review.
9 with a built in push/pull server and full text search and code-review.
10 It works on http/https and has a built in permission/authentication system with
10 It works on http/https and has a built in permission/authentication system with
11 the ability to authenticate via LDAP or ActiveDirectory. RhodeCode also provides
11 the ability to authenticate via LDAP or ActiveDirectory. RhodeCode also provides
12 simple API so it's easy integrable with existing external systems.
12 simple API so it's easy integrable with existing external systems.
13
13
14 RhodeCode is similar in some respects to github_ or bitbucket_,
14 RhodeCode is similar in some respects to github_ or bitbucket_,
15 however RhodeCode can be run as standalone hosted application on your own server.
15 however RhodeCode can be run as standalone hosted application on your own server.
16 It is open source and donation ware and focuses more on providing a customized,
16 It is open source and donation ware and focuses more on providing a customized,
17 self administered interface for Mercurial_ and GIT_ repositories.
17 self administered interface for Mercurial_ and GIT_ repositories.
18 RhodeCode works on \*nix systems and Windows it is powered by a vcs_ library
18 RhodeCode works on \*nix systems and Windows it is powered by a vcs_ library
19 that Lukasz Balcerzak and Marcin Kuzminski created to handle multiple
19 that Lukasz Balcerzak and Marcin Kuzminski created to handle multiple
20 different version control systems.
20 different version control systems.
21
21
22 RhodeCode uses `PEP386 versioning <http://www.python.org/dev/peps/pep-0386/>`_
22 RhodeCode uses `PEP386 versioning <http://www.python.org/dev/peps/pep-0386/>`_
23
23
24 Installation
24 Installation
25 ------------
25 ------------
26 Stable releases of RhodeCode are best installed via::
26 Stable releases of RhodeCode are best installed via::
27
27
28 easy_install rhodecode
28 easy_install rhodecode
29
29
30 Or::
30 Or::
31
31
32 pip install rhodecode
32 pip install rhodecode
33
33
34 Detailed instructions and links may be found on the Installation page.
34 Detailed instructions and links may be found on the Installation page.
35
35
36 Please visit http://packages.python.org/RhodeCode/installation.html for
36 Please visit http://packages.python.org/RhodeCode/installation.html for
37 more details
37 more details
38
38
39 RhodeCode demo
39 RhodeCode demo
40 --------------
40 --------------
41
41
42 http://demo.rhodecode.org
42 http://demo.rhodecode.org
43
43
44 The default access is anonymous but you can login to an administrative account
44 The default access is anonymous but you can login to an administrative account
45 using the following credentials:
45 using the following credentials:
46
46
47 - username: demo
47 - username: demo
48 - password: demo12
48 - password: demo12
49
49
50 Source code
50 Source code
51 -----------
51 -----------
52
52
53 The latest sources can be obtained from official RhodeCode instance
53 The latest sources can be obtained from official RhodeCode instance
54 https://secure.rhodecode.org
54 https://secure.rhodecode.org
55
55
56
56
57 MIRRORS:
57 MIRRORS:
58
58
59 Issue tracker and sources at bitbucket_
59 Issue tracker and sources at bitbucket_
60
60
61 http://bitbucket.org/marcinkuzminski/rhodecode
61 http://bitbucket.org/marcinkuzminski/rhodecode
62
62
63 Sources at github_
63 Sources at github_
64
64
65 https://github.com/marcinkuzminski/rhodecode
65 https://github.com/marcinkuzminski/rhodecode
66
66
67
67
68 RhodeCode Features
68 RhodeCode Features
69 ------------------
69 ------------------
70
70
71 - Has its own middleware to handle mercurial_ and git_ protocol requests.
71 - Has its own middleware to handle mercurial_ and git_ protocol requests.
72 Each request is authenticated and logged together with IP address.
72 Each request is authenticated and logged together with IP address.
73 - Build for speed and performance. You can make multiple pulls/pushes simultaneous.
73 - Build for speed and performance. You can make multiple pulls/pushes simultaneous.
74 Proven to work with 1000s of repositories and users
74 Proven to work with 1000s of repositories and users
75 - Supports http/https, LDAP, AD, proxy-pass authentication.
75 - Supports http/https, LDAP, AD, proxy-pass authentication.
76 - Full permissions (private/read/write/admin) together with IP restrictions for each repository,
76 - Full permissions (private/read/write/admin) together with IP restrictions for each repository,
77 additional explicit forking and repository creation permissions.
77 additional explicit forking and repository creation permissions.
78 - Users groups for easier permission management
78 - Users groups for easier permission management
79 - Repository groups let you group repos and manage them easier.
79 - Repository groups let you group repos and manage them easier.
80 - Users can fork other users repos, and compare them at any time.
80 - Users can fork other users repos, and compare them at any time.
81 - Integrates easily with other systems, with custom created mappers you can connect it to almost
81 - Integrates easily with other systems, with custom created mappers you can connect it to almost
82 any issue tracker, and with an JSON-RPC API you can make much more
82 any issue tracker, and with an JSON-RPC API you can make much more
83 - Build in commit-api let's you add, edit and commit files right from RhodeCode
83 - Build in commit-api let's you add, edit and commit files right from RhodeCode
84 web interface using simple editor or upload binary files using simple form.
84 web interface using simple editor or upload binary files using simple form.
85 - Powerfull pull-request driven review system with inline commenting,
85 - Powerfull pull-request driven review system with inline commenting,
86 changeset statuses, and notification system.
86 changeset statuses, and notification system.
87 - Importing and syncing repositories from remote locations for GIT_, Mercurial_ and SVN.
87 - Importing and syncing repositories from remote locations for GIT_, Mercurial_ and SVN.
88 - Mako templates let's you customize the look and feel of the application.
88 - Mako templates let's you customize the look and feel of the application.
89 - Beautiful diffs, annotations and source code browsing all colored by pygments.
89 - Beautiful diffs, annotations and source code browsing all colored by pygments.
90 Raw diffs are made in git-diff format for both VCS systems, including GIT_ binary-patches
90 Raw diffs are made in git-diff format for both VCS systems, including GIT_ binary-patches
91 - Mercurial_ and Git_ DAG graphs and yui-flot powered graphs with zooming and statistics
91 - Mercurial_ and Git_ DAG graphs and yui-flot powered graphs with zooming and statistics
92 to track activity for repositories
92 to track activity for repositories
93 - Admin interface with user/permission management. Admin activity journal, logs
93 - Admin interface with user/permission management. Admin activity journal, logs
94 pulls, pushes, forks, registrations and other actions made by all users.
94 pulls, pushes, forks, registrations and other actions made by all users.
95 - Server side forks. It is possible to fork a project and modify it freely
95 - Server side forks. It is possible to fork a project and modify it freely
96 without breaking the main repository.
96 without breaking the main repository.
97 - rst and markdown README support for repositories.
97 - rst and markdown README support for repositories.
98 - Full text search powered by Whoosh on the source files, commit messages, and file names.
98 - Full text search powered by Whoosh on the source files, commit messages, and file names.
99 Build in indexing daemons, with optional incremental index build
99 Build in indexing daemons, with optional incremental index build
100 (no external search servers required all in one application)
100 (no external search servers required all in one application)
101 - Setup project descriptions/tags and info inside built in db for easy, non
101 - Setup project descriptions/tags and info inside built in db for easy, non
102 file-system operations.
102 file-system operations.
103 - Intelligent cache with invalidation after push or project change, provides
103 - Intelligent cache with invalidation after push or project change, provides
104 high performance and always up to date data.
104 high performance and always up to date data.
105 - RSS / Atom feeds, gravatar support, downloadable sources as zip/tar/gz
105 - RSS / Atom feeds, gravatar support, downloadable sources as zip/tar/gz
106 - Optional async tasks for speed and performance using celery_
106 - Optional async tasks for speed and performance using celery_
107 - Backup scripts can do backup of whole app and send it over scp to desired
107 - Backup scripts can do backup of whole app and send it over scp to desired
108 location
108 location
109 - Based on pylons / sqlalchemy / sqlite / whoosh / vcs
109 - Based on pylons / sqlalchemy / sqlite / whoosh / vcs
110
110
111
111
112 Incoming / Plans
112 Incoming / Plans
113 ----------------
113 ----------------
114
114
115 - Finer granular permissions per branch, or subrepo
115 - Finer granular permissions per branch, or subrepo
116 - Web based merges for pull requests
116 - Web based merges for pull requests
117 - Tracking history for each lines in files
117 - Tracking history for each lines in files
118 - Simple issue tracker
118 - Simple issue tracker
119 - SSH based authentication with server side key management
119 - SSH based authentication with server side key management
120 - Commit based built in wiki system
120 - Commit based built in wiki system
121 - Gist server
121 - Gist server
122 - More statistics and graph (global annotation + some more statistics)
122 - More statistics and graph (global annotation + some more statistics)
123 - Other advancements as development continues (or you can of course make
123 - Other advancements as development continues (or you can of course make
124 additions and or requests)
124 additions and or requests)
125
125
126 License
126 License
127 -------
127 -------
128
128
129 ``RhodeCode`` is released under the GPLv3 license.
129 ``RhodeCode`` is released under the GPLv3 license.
130
130
131
131
132 Getting help
132 Getting help
133 ------------
133 ------------
134
134
135 Listed bellow are various support resources that should help.
135 Listed bellow are various support resources that should help.
136
136
137 .. note::
137 .. note::
138
138
139 Please try to read the documentation before posting any issues, especially
139 Please try to read the documentation before posting any issues, especially
140 the **troubleshooting section**
140 the **troubleshooting section**
141
141
142 - Join the `Google group <http://groups.google.com/group/rhodecode>`_ and ask
142 - Join the `Google group <http://groups.google.com/group/rhodecode>`_ and ask
143 any questions.
143 any questions.
144
144
145 - Open an issue at `issue tracker <http://bitbucket.org/marcinkuzminski/rhodecode/issues>`_
145 - Open an issue at `issue tracker <http://bitbucket.org/marcinkuzminski/rhodecode/issues>`_
146
146
147 - Join #rhodecode on FreeNode (irc.freenode.net)
147 - Join #rhodecode on FreeNode (irc.freenode.net)
148 or use http://webchat.freenode.net/?channels=rhodecode for web access to irc.
148 or use http://webchat.freenode.net/?channels=rhodecode for web access to irc.
149
149
150 - You can also follow me on twitter **@marcinkuzminski** where i often post some
150 - You can also follow me on twitter **@marcinkuzminski** where i often post some
151 news about RhodeCode
151 news about RhodeCode
152
152
153
153
154 Online documentation
154 Online documentation
155 --------------------
155 --------------------
156
156
157 Online documentation for the current version of RhodeCode is available at
157 Online documentation for the current version of RhodeCode is available at
158 - http://packages.python.org/RhodeCode/
158 - http://packages.python.org/RhodeCode/
159 - http://rhodecode.readthedocs.org/en/latest/index.html
159 - http://rhodecode.readthedocs.org/en/latest/index.html
160
160
161 You may also build the documentation for yourself - go into ``docs/`` and run::
161 You may also build the documentation for yourself - go into ``docs/`` and run::
162
162
163 make html
163 make html
164
164
165 (You need to have sphinx_ installed to build the documentation. If you don't
165 (You need to have sphinx_ installed to build the documentation. If you don't
166 have sphinx_ installed you can install it via the command:
166 have sphinx_ installed you can install it via the command:
167 ``easy_install sphinx``)
167 ``easy_install sphinx``)
168
168
169 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
169 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
170 .. _python: http://www.python.org/
170 .. _python: http://www.python.org/
171 .. _sphinx: http://sphinx.pocoo.org/
171 .. _sphinx: http://sphinx.pocoo.org/
172 .. _mercurial: http://mercurial.selenic.com/
172 .. _mercurial: http://mercurial.selenic.com/
173 .. _bitbucket: http://bitbucket.org/
173 .. _bitbucket: http://bitbucket.org/
174 .. _github: http://github.com/
174 .. _github: http://github.com/
175 .. _subversion: http://subversion.tigris.org/
175 .. _subversion: http://subversion.tigris.org/
176 .. _git: http://git-scm.com/
176 .. _git: http://git-scm.com/
177 .. _celery: http://celeryproject.org/
177 .. _celery: http://celeryproject.org/
178 .. _Sphinx: http://sphinx.pocoo.org/
178 .. _Sphinx: http://sphinx.pocoo.org/
179 .. _vcs: http://pypi.python.org/pypi/vcs No newline at end of file
179 .. _vcs: http://pypi.python.org/pypi/vcs
@@ -1,959 +1,959 b''
1 .. _api:
1 .. _api:
2
2
3 ===
3 ===
4 API
4 API
5 ===
5 ===
6
6
7
7
8 Starting from RhodeCode version 1.2 a simple API was implemented.
8 Starting from RhodeCode version 1.2 a simple API was implemented.
9 There's a single schema for calling all api methods. API is implemented
9 There's a single schema for calling all api methods. API is implemented
10 with JSON protocol both ways. An url to send API request to RhodeCode is
10 with JSON protocol both ways. An url to send API request to RhodeCode is
11 <your_server>/_admin/api
11 <your_server>/_admin/api
12
12
13 API ACCESS FOR WEB VIEWS
13 API ACCESS FOR WEB VIEWS
14 ++++++++++++++++++++++++
14 ++++++++++++++++++++++++
15
15
16 API access can also be turned on for each web view in RhodeCode that is
16 API access can also be turned on for each web view in RhodeCode that is
17 decorated with `@LoginRequired` decorator. To enable API access simple change
17 decorated with `@LoginRequired` decorator. To enable API access simple change
18 the standard login decorator to `@LoginRequired(api_access=True)`.
18 the standard login decorator to `@LoginRequired(api_access=True)`.
19 After this change, a rhodecode view can be accessed without login by adding a
19 After this change, a rhodecode view can be accessed without login by adding a
20 GET parameter `?api_key=<api_key>` to url. By default this is only
20 GET parameter `?api_key=<api_key>` to url. By default this is only
21 enabled on RSS/ATOM feed views.
21 enabled on RSS/ATOM feed views.
22
22
23
23
24 API ACCESS
24 API ACCESS
25 ++++++++++
25 ++++++++++
26
26
27 All clients are required to send JSON-RPC spec JSON data::
27 All clients are required to send JSON-RPC spec JSON data::
28
28
29 {
29 {
30 "id:"<id>",
30 "id:"<id>",
31 "api_key":"<api_key>",
31 "api_key":"<api_key>",
32 "method":"<method_name>",
32 "method":"<method_name>",
33 "args":{"<arg_key>":"<arg_val>"}
33 "args":{"<arg_key>":"<arg_val>"}
34 }
34 }
35
35
36 Example call for autopulling remotes repos using curl::
36 Example call for autopulling remotes repos using curl::
37 curl https://server.com/_admin/api -X POST -H 'content-type:text/plain' --data-binary '{"id":1,"api_key":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull","args":{"repo":"CPython"}}'
37 curl https://server.com/_admin/api -X POST -H 'content-type:text/plain' --data-binary '{"id":1,"api_key":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull","args":{"repo":"CPython"}}'
38
38
39 Simply provide
39 Simply provide
40 - *id* A value of any type, which is used to match the response with the request that it is replying to.
40 - *id* A value of any type, which is used to match the response with the request that it is replying to.
41 - *api_key* for access and permission validation.
41 - *api_key* for access and permission validation.
42 - *method* is name of method to call
42 - *method* is name of method to call
43 - *args* is an key:value list of arguments to pass to method
43 - *args* is an key:value list of arguments to pass to method
44
44
45 .. note::
45 .. note::
46
46
47 api_key can be found in your user account page
47 api_key can be found in your user account page
48
48
49
49
50 RhodeCode API will return always a JSON-RPC response::
50 RhodeCode API will return always a JSON-RPC response::
51
51
52 {
52 {
53 "id":<id>, # matching id sent by request
53 "id":<id>, # matching id sent by request
54 "result": "<result>"|null, # JSON formatted result, null if any errors
54 "result": "<result>"|null, # JSON formatted result, null if any errors
55 "error": "null"|<error_message> # JSON formatted error (if any)
55 "error": "null"|<error_message> # JSON formatted error (if any)
56 }
56 }
57
57
58 All responses from API will be `HTTP/1.0 200 OK`, if there's an error while
58 All responses from API will be `HTTP/1.0 200 OK`, if there's an error while
59 calling api *error* key from response will contain failure description
59 calling api *error* key from response will contain failure description
60 and result will be null.
60 and result will be null.
61
61
62
62
63 API CLIENT
63 API CLIENT
64 ++++++++++
64 ++++++++++
65
65
66 From version 1.4 RhodeCode adds a script that allows to easily
66 From version 1.4 RhodeCode adds a script that allows to easily
67 communicate with API. After installing RhodeCode a `rhodecode-api` script
67 communicate with API. After installing RhodeCode a `rhodecode-api` script
68 will be available.
68 will be available.
69
69
70 To get started quickly simply run::
70 To get started quickly simply run::
71
71
72 rhodecode-api _create_config --apikey=<youapikey> --apihost=<rhodecode host>
72 rhodecode-api _create_config --apikey=<youapikey> --apihost=<rhodecode host>
73
73
74 This will create a file named .config in the directory you executed it storing
74 This will create a file named .config in the directory you executed it storing
75 json config file with credentials. You can skip this step and always provide
75 json config file with credentials. You can skip this step and always provide
76 both of the arguments to be able to communicate with server
76 both of the arguments to be able to communicate with server
77
77
78
78
79 after that simply run any api command for example get_repo::
79 after that simply run any api command for example get_repo::
80
80
81 rhodecode-api get_repo
81 rhodecode-api get_repo
82
82
83 calling {"api_key": "<apikey>", "id": 75, "args": {}, "method": "get_repo"} to http://127.0.0.1:5000
83 calling {"api_key": "<apikey>", "id": 75, "args": {}, "method": "get_repo"} to http://127.0.0.1:5000
84 rhodecode said:
84 rhodecode said:
85 {'error': 'Missing non optional `repoid` arg in JSON DATA',
85 {'error': 'Missing non optional `repoid` arg in JSON DATA',
86 'id': 75,
86 'id': 75,
87 'result': None}
87 'result': None}
88
88
89 Ups looks like we forgot to add an argument
89 Ups looks like we forgot to add an argument
90
90
91 Let's try again now giving the repoid as parameters::
91 Let's try again now giving the repoid as parameters::
92
92
93 rhodecode-api get_repo repoid:rhodecode
93 rhodecode-api get_repo repoid:rhodecode
94
94
95 calling {"api_key": "<apikey>", "id": 39, "args": {"repoid": "rhodecode"}, "method": "get_repo"} to http://127.0.0.1:5000
95 calling {"api_key": "<apikey>", "id": 39, "args": {"repoid": "rhodecode"}, "method": "get_repo"} to http://127.0.0.1:5000
96 rhodecode said:
96 rhodecode said:
97 {'error': None,
97 {'error': None,
98 'id': 39,
98 'id': 39,
99 'result': <json data...>}
99 'result': <json data...>}
100
100
101
101
102
102
103 API METHODS
103 API METHODS
104 +++++++++++
104 +++++++++++
105
105
106
106
107 pull
107 pull
108 ----
108 ----
109
109
110 Pulls given repo from remote location. Can be used to automatically keep
110 Pulls given repo from remote location. Can be used to automatically keep
111 remote repos up to date. This command can be executed only using api_key
111 remote repos up to date. This command can be executed only using api_key
112 belonging to user with admin rights
112 belonging to user with admin rights
113
113
114 INPUT::
114 INPUT::
115
115
116 id : <id_for_response>
116 id : <id_for_response>
117 api_key : "<api_key>"
117 api_key : "<api_key>"
118 method : "pull"
118 method : "pull"
119 args : {
119 args : {
120 "repoid" : "<reponame or repo_id>"
120 "repoid" : "<reponame or repo_id>"
121 }
121 }
122
122
123 OUTPUT::
123 OUTPUT::
124
124
125 id : <id_given_in_input>
125 id : <id_given_in_input>
126 result : "Pulled from `<reponame>`"
126 result : "Pulled from `<reponame>`"
127 error : null
127 error : null
128
128
129
129
130 rescan_repos
130 rescan_repos
131 ------------
131 ------------
132
132
133 Dispatch rescan repositories action. If remove_obsolete is set
133 Dispatch rescan repositories action. If remove_obsolete is set
134 RhodeCode will delete repos that are in database but not in the filesystem.
134 RhodeCode will delete repos that are in database but not in the filesystem.
135 This command can be executed only using api_key belonging to user with admin
135 This command can be executed only using api_key belonging to user with admin
136 rights.
136 rights.
137
137
138 INPUT::
138 INPUT::
139
139
140 id : <id_for_response>
140 id : <id_for_response>
141 api_key : "<api_key>"
141 api_key : "<api_key>"
142 method : "rescan_repos"
142 method : "rescan_repos"
143 args : {
143 args : {
144 "remove_obsolete" : "<boolean = Optional(False)>"
144 "remove_obsolete" : "<boolean = Optional(False)>"
145 }
145 }
146
146
147 OUTPUT::
147 OUTPUT::
148
148
149 id : <id_given_in_input>
149 id : <id_given_in_input>
150 result : "{'added': [<list of names of added repos>],
150 result : "{'added': [<list of names of added repos>],
151 'removed': [<list of names of removed repos>]}"
151 'removed': [<list of names of removed repos>]}"
152 error : null
152 error : null
153
153
154
154
155 lock
155 lock
156 ----
156 ----
157
157
158 Set locking state on given repository by given user. If userid param is skipped
158 Set locking state on given repository by given user. If userid param is skipped
159 , then it is set to id of user whos calling this method.
159 , then it is set to id of user whos calling this method.
160 This command can be executed only using api_key belonging to user with admin
160 This command can be executed only using api_key belonging to user with admin
161 rights or regular user that have admin or write access to repository.
161 rights or regular user that have admin or write access to repository.
162
162
163 INPUT::
163 INPUT::
164
164
165 id : <id_for_response>
165 id : <id_for_response>
166 api_key : "<api_key>"
166 api_key : "<api_key>"
167 method : "lock"
167 method : "lock"
168 args : {
168 args : {
169 "repoid" : "<reponame or repo_id>"
169 "repoid" : "<reponame or repo_id>"
170 "userid" : "<user_id or username = Optional(=apiuser)>",
170 "userid" : "<user_id or username = Optional(=apiuser)>",
171 "locked" : "<bool true|false>"
171 "locked" : "<bool true|false>"
172 }
172 }
173
173
174 OUTPUT::
174 OUTPUT::
175
175
176 id : <id_given_in_input>
176 id : <id_given_in_input>
177 result : "User `<username>` set lock state for repo `<reponame>` to `true|false`"
177 result : "User `<username>` set lock state for repo `<reponame>` to `true|false`"
178 error : null
178 error : null
179
179
180
180
181 show_ip
181 show_ip
182 -------
182 -------
183
183
184 Shows IP address as seen from RhodeCode server, together with all
184 Shows IP address as seen from RhodeCode server, together with all
185 defined IP addresses for given user.
185 defined IP addresses for given user.
186 This command can be executed only using api_key belonging to user with admin
186 This command can be executed only using api_key belonging to user with admin
187 rights.
187 rights.
188
188
189 INPUT::
189 INPUT::
190
190
191 id : <id_for_response>
191 id : <id_for_response>
192 api_key : "<api_key>"
192 api_key : "<api_key>"
193 method : "show_ip"
193 method : "show_ip"
194 args : {
194 args : {
195 "userid" : "<user_id or username>",
195 "userid" : "<user_id or username>",
196 }
196 }
197
197
198 OUTPUT::
198 OUTPUT::
199
199
200 id : <id_given_in_input>
200 id : <id_given_in_input>
201 result : {
201 result : {
202 "ip_addr_server": <ip_from_clien>",
202 "ip_addr_server": <ip_from_clien>",
203 "user_ips": [
203 "user_ips": [
204 {
204 {
205 "ip_addr": "<ip_with_mask>",
205 "ip_addr": "<ip_with_mask>",
206 "ip_range": ["<start_ip>", "<end_ip>"],
206 "ip_range": ["<start_ip>", "<end_ip>"],
207 },
207 },
208 ...
208 ...
209 ]
209 ]
210 }
210 }
211
211
212 error : null
212 error : null
213
213
214
214
215 get_user
215 get_user
216 --------
216 --------
217
217
218 Get's an user by username or user_id, Returns empty result if user is not found.
218 Get's an user by username or user_id, Returns empty result if user is not found.
219 If userid param is skipped it is set to id of user who is calling this method.
219 If userid param is skipped it is set to id of user who is calling this method.
220 This command can be executed only using api_key belonging to user with admin
220 This command can be executed only using api_key belonging to user with admin
221 rights, or regular users that cannot specify different userid than theirs
221 rights, or regular users that cannot specify different userid than theirs
222
222
223
223
224 INPUT::
224 INPUT::
225
225
226 id : <id_for_response>
226 id : <id_for_response>
227 api_key : "<api_key>"
227 api_key : "<api_key>"
228 method : "get_user"
228 method : "get_user"
229 args : {
229 args : {
230 "userid" : "<username or user_id Optional(=apiuser)>"
230 "userid" : "<username or user_id Optional(=apiuser)>"
231 }
231 }
232
232
233 OUTPUT::
233 OUTPUT::
234
234
235 id : <id_given_in_input>
235 id : <id_given_in_input>
236 result: None if user does not exist or
236 result: None if user does not exist or
237 {
237 {
238 "user_id" : "<user_id>",
238 "user_id" : "<user_id>",
239 "api_key" : "<api_key>",
239 "api_key" : "<api_key>",
240 "username" : "<username>",
240 "username" : "<username>",
241 "firstname": "<firstname>",
241 "firstname": "<firstname>",
242 "lastname" : "<lastname>",
242 "lastname" : "<lastname>",
243 "email" : "<email>",
243 "email" : "<email>",
244 "emails": "<list_of_all_additional_emails>",
244 "emails": "<list_of_all_additional_emails>",
245 "ip_addresses": "<list_of_ip_addresses_for_user>",
245 "ip_addresses": "<list_of_ip_addresses_for_user>",
246 "active" : "<bool>",
246 "active" : "<bool>",
247 "admin" :Β  "<bool>",
247 "admin" :Β  "<bool>",
248 "ldap_dn" : "<ldap_dn>",
248 "ldap_dn" : "<ldap_dn>",
249 "last_login": "<last_login>",
249 "last_login": "<last_login>",
250 "permissions": {
250 "permissions": {
251 "global": ["hg.create.repository",
251 "global": ["hg.create.repository",
252 "repository.read",
252 "repository.read",
253 "hg.register.manual_activate"],
253 "hg.register.manual_activate"],
254 "repositories": {"repo1": "repository.none"},
254 "repositories": {"repo1": "repository.none"},
255 "repositories_groups": {"Group1": "group.read"}
255 "repositories_groups": {"Group1": "group.read"}
256 },
256 },
257 }
257 }
258
258
259 error: null
259 error: null
260
260
261
261
262 get_users
262 get_users
263 ---------
263 ---------
264
264
265 Lists all existing users. This command can be executed only using api_key
265 Lists all existing users. This command can be executed only using api_key
266 belonging to user with admin rights.
266 belonging to user with admin rights.
267
267
268
268
269 INPUT::
269 INPUT::
270
270
271 id : <id_for_response>
271 id : <id_for_response>
272 api_key : "<api_key>"
272 api_key : "<api_key>"
273 method : "get_users"
273 method : "get_users"
274 args : { }
274 args : { }
275
275
276 OUTPUT::
276 OUTPUT::
277
277
278 id : <id_given_in_input>
278 id : <id_given_in_input>
279 result: [
279 result: [
280 {
280 {
281 "user_id" : "<user_id>",
281 "user_id" : "<user_id>",
282 "username" : "<username>",
282 "username" : "<username>",
283 "firstname": "<firstname>",
283 "firstname": "<firstname>",
284 "lastname" : "<lastname>",
284 "lastname" : "<lastname>",
285 "email" : "<email>",
285 "email" : "<email>",
286 "emails": "<list_of_all_additional_emails>",
286 "emails": "<list_of_all_additional_emails>",
287 "ip_addresses": "<list_of_ip_addresses_for_user>",
287 "ip_addresses": "<list_of_ip_addresses_for_user>",
288 "active" : "<bool>",
288 "active" : "<bool>",
289 "admin" :Β  "<bool>",
289 "admin" :Β  "<bool>",
290 "ldap_dn" : "<ldap_dn>",
290 "ldap_dn" : "<ldap_dn>",
291 "last_login": "<last_login>",
291 "last_login": "<last_login>",
292 },
292 },
293 …
293 …
294 ]
294 ]
295 error: null
295 error: null
296
296
297
297
298 create_user
298 create_user
299 -----------
299 -----------
300
300
301 Creates new user. This command can
301 Creates new user. This command can
302 be executed only using api_key belonging to user with admin rights.
302 be executed only using api_key belonging to user with admin rights.
303
303
304
304
305 INPUT::
305 INPUT::
306
306
307 id : <id_for_response>
307 id : <id_for_response>
308 api_key : "<api_key>"
308 api_key : "<api_key>"
309 method : "create_user"
309 method : "create_user"
310 args : {
310 args : {
311 "username" : "<username>",
311 "username" : "<username>",
312 "email" : "<useremail>",
312 "email" : "<useremail>",
313 "password" : "<password>",
313 "password" : "<password>",
314 "firstname" : "<firstname> = Optional(None)",
314 "firstname" : "<firstname> = Optional(None)",
315 "lastname" : "<lastname> = Optional(None)",
315 "lastname" : "<lastname> = Optional(None)",
316 "active" : "<bool> = Optional(True)",
316 "active" : "<bool> = Optional(True)",
317 "admin" : "<bool> = Optional(False)",
317 "admin" : "<bool> = Optional(False)",
318 "ldap_dn" : "<ldap_dn> = Optional(None)"
318 "ldap_dn" : "<ldap_dn> = Optional(None)"
319 }
319 }
320
320
321 OUTPUT::
321 OUTPUT::
322
322
323 id : <id_given_in_input>
323 id : <id_given_in_input>
324 result: {
324 result: {
325 "msg" : "created new user `<username>`",
325 "msg" : "created new user `<username>`",
326 "user": {
326 "user": {
327 "user_id" : "<user_id>",
327 "user_id" : "<user_id>",
328 "username" : "<username>",
328 "username" : "<username>",
329 "firstname": "<firstname>",
329 "firstname": "<firstname>",
330 "lastname" : "<lastname>",
330 "lastname" : "<lastname>",
331 "email" : "<email>",
331 "email" : "<email>",
332 "emails": "<list_of_all_additional_emails>",
332 "emails": "<list_of_all_additional_emails>",
333 "active" : "<bool>",
333 "active" : "<bool>",
334 "admin" :Β  "<bool>",
334 "admin" :Β  "<bool>",
335 "ldap_dn" : "<ldap_dn>",
335 "ldap_dn" : "<ldap_dn>",
336 "last_login": "<last_login>",
336 "last_login": "<last_login>",
337 },
337 },
338 }
338 }
339 error: null
339 error: null
340
340
341
341
342 update_user
342 update_user
343 -----------
343 -----------
344
344
345 updates given user if such user exists. This command can
345 updates given user if such user exists. This command can
346 be executed only using api_key belonging to user with admin rights.
346 be executed only using api_key belonging to user with admin rights.
347
347
348
348
349 INPUT::
349 INPUT::
350
350
351 id : <id_for_response>
351 id : <id_for_response>
352 api_key : "<api_key>"
352 api_key : "<api_key>"
353 method : "update_user"
353 method : "update_user"
354 args : {
354 args : {
355 "userid" : "<user_id or username>",
355 "userid" : "<user_id or username>",
356 "username" : "<username> = Optional(None)",
356 "username" : "<username> = Optional(None)",
357 "email" : "<useremail> = Optional(None)",
357 "email" : "<useremail> = Optional(None)",
358 "password" : "<password> = Optional(None)",
358 "password" : "<password> = Optional(None)",
359 "firstname" : "<firstname> = Optional(None)",
359 "firstname" : "<firstname> = Optional(None)",
360 "lastname" : "<lastname> = Optional(None)",
360 "lastname" : "<lastname> = Optional(None)",
361 "active" : "<bool> = Optional(None)",
361 "active" : "<bool> = Optional(None)",
362 "admin" : "<bool> = Optional(None)",
362 "admin" : "<bool> = Optional(None)",
363 "ldap_dn" : "<ldap_dn> = Optional(None)"
363 "ldap_dn" : "<ldap_dn> = Optional(None)"
364 }
364 }
365
365
366 OUTPUT::
366 OUTPUT::
367
367
368 id : <id_given_in_input>
368 id : <id_given_in_input>
369 result: {
369 result: {
370 "msg" : "updated user ID:<userid> <username>",
370 "msg" : "updated user ID:<userid> <username>",
371 "user": {
371 "user": {
372 "user_id" : "<user_id>",
372 "user_id" : "<user_id>",
373 "username" : "<username>",
373 "username" : "<username>",
374 "firstname": "<firstname>",
374 "firstname": "<firstname>",
375 "lastname" : "<lastname>",
375 "lastname" : "<lastname>",
376 "email" : "<email>",
376 "email" : "<email>",
377 "emails": "<list_of_all_additional_emails>",
377 "emails": "<list_of_all_additional_emails>",
378 "active" : "<bool>",
378 "active" : "<bool>",
379 "admin" :Β  "<bool>",
379 "admin" :Β  "<bool>",
380 "ldap_dn" : "<ldap_dn>",
380 "ldap_dn" : "<ldap_dn>",
381 "last_login": "<last_login>",
381 "last_login": "<last_login>",
382 },
382 },
383 }
383 }
384 error: null
384 error: null
385
385
386
386
387 delete_user
387 delete_user
388 -----------
388 -----------
389
389
390
390
391 deletes givenuser if such user exists. This command can
391 deletes givenuser if such user exists. This command can
392 be executed only using api_key belonging to user with admin rights.
392 be executed only using api_key belonging to user with admin rights.
393
393
394
394
395 INPUT::
395 INPUT::
396
396
397 id : <id_for_response>
397 id : <id_for_response>
398 api_key : "<api_key>"
398 api_key : "<api_key>"
399 method : "delete_user"
399 method : "delete_user"
400 args : {
400 args : {
401 "userid" : "<user_id or username>",
401 "userid" : "<user_id or username>",
402 }
402 }
403
403
404 OUTPUT::
404 OUTPUT::
405
405
406 id : <id_given_in_input>
406 id : <id_given_in_input>
407 result: {
407 result: {
408 "msg" : "deleted user ID:<userid> <username>",
408 "msg" : "deleted user ID:<userid> <username>",
409 "user": null
409 "user": null
410 }
410 }
411 error: null
411 error: null
412
412
413
413
414 get_users_group
414 get_users_group
415 ---------------
415 ---------------
416
416
417 Gets an existing users group. This command can be executed only using api_key
417 Gets an existing users group. This command can be executed only using api_key
418 belonging to user with admin rights.
418 belonging to user with admin rights.
419
419
420
420
421 INPUT::
421 INPUT::
422
422
423 id : <id_for_response>
423 id : <id_for_response>
424 api_key : "<api_key>"
424 api_key : "<api_key>"
425 method : "get_users_group"
425 method : "get_users_group"
426 args : {
426 args : {
427 "usersgroupid" : "<users group id or name>"
427 "usersgroupid" : "<users group id or name>"
428 }
428 }
429
429
430 OUTPUT::
430 OUTPUT::
431
431
432 id : <id_given_in_input>
432 id : <id_given_in_input>
433 result : None if group not exist
433 result : None if group not exist
434 {
434 {
435 "users_group_id" : "<id>",
435 "users_group_id" : "<id>",
436 "group_name" : "<groupname>",
436 "group_name" : "<groupname>",
437 "active": "<bool>",
437 "active": "<bool>",
438 "members" : [
438 "members" : [
439 {
439 {
440 "user_id" : "<user_id>",
440 "user_id" : "<user_id>",
441 "username" : "<username>",
441 "username" : "<username>",
442 "firstname": "<firstname>",
442 "firstname": "<firstname>",
443 "lastname" : "<lastname>",
443 "lastname" : "<lastname>",
444 "email" : "<email>",
444 "email" : "<email>",
445 "emails": "<list_of_all_additional_emails>",
445 "emails": "<list_of_all_additional_emails>",
446 "active" : "<bool>",
446 "active" : "<bool>",
447 "admin" :Β  "<bool>",
447 "admin" :Β  "<bool>",
448 "ldap_dn" : "<ldap_dn>",
448 "ldap_dn" : "<ldap_dn>",
449 "last_login": "<last_login>",
449 "last_login": "<last_login>",
450 },
450 },
451 …
451 …
452 ]
452 ]
453 }
453 }
454 error : null
454 error : null
455
455
456
456
457 get_users_groups
457 get_users_groups
458 ----------------
458 ----------------
459
459
460 Lists all existing users groups. This command can be executed only using
460 Lists all existing users groups. This command can be executed only using
461 api_key belonging to user with admin rights.
461 api_key belonging to user with admin rights.
462
462
463
463
464 INPUT::
464 INPUT::
465
465
466 id : <id_for_response>
466 id : <id_for_response>
467 api_key : "<api_key>"
467 api_key : "<api_key>"
468 method : "get_users_groups"
468 method : "get_users_groups"
469 args : { }
469 args : { }
470
470
471 OUTPUT::
471 OUTPUT::
472
472
473 id : <id_given_in_input>
473 id : <id_given_in_input>
474 result : [
474 result : [
475 {
475 {
476 "users_group_id" : "<id>",
476 "users_group_id" : "<id>",
477 "group_name" : "<groupname>",
477 "group_name" : "<groupname>",
478 "active": "<bool>",
478 "active": "<bool>",
479 },
479 },
480 …
480 …
481 ]
481 ]
482 error : null
482 error : null
483
483
484
484
485 create_users_group
485 create_users_group
486 ------------------
486 ------------------
487
487
488 Creates new users group. This command can be executed only using api_key
488 Creates new users group. This command can be executed only using api_key
489 belonging to user with admin rights
489 belonging to user with admin rights
490
490
491
491
492 INPUT::
492 INPUT::
493
493
494 id : <id_for_response>
494 id : <id_for_response>
495 api_key : "<api_key>"
495 api_key : "<api_key>"
496 method : "create_users_group"
496 method : "create_users_group"
497 args: {
497 args: {
498 "group_name": "<groupname>",
498 "group_name": "<groupname>",
499 "active":"<bool> = Optional(True)"
499 "active":"<bool> = Optional(True)"
500 }
500 }
501
501
502 OUTPUT::
502 OUTPUT::
503
503
504 id : <id_given_in_input>
504 id : <id_given_in_input>
505 result: {
505 result: {
506 "msg": "created new users group `<groupname>`",
506 "msg": "created new users group `<groupname>`",
507 "users_group": {
507 "users_group": {
508 "users_group_id" : "<id>",
508 "users_group_id" : "<id>",
509 "group_name" : "<groupname>",
509 "group_name" : "<groupname>",
510 "active": "<bool>",
510 "active": "<bool>",
511 },
511 },
512 }
512 }
513 error: null
513 error: null
514
514
515
515
516 add_user_to_users_group
516 add_user_to_users_group
517 -----------------------
517 -----------------------
518
518
519 Adds a user to a users group. If user exists in that group success will be
519 Adds a user to a users group. If user exists in that group success will be
520 `false`. This command can be executed only using api_key
520 `false`. This command can be executed only using api_key
521 belonging to user with admin rights
521 belonging to user with admin rights
522
522
523
523
524 INPUT::
524 INPUT::
525
525
526 id : <id_for_response>
526 id : <id_for_response>
527 api_key : "<api_key>"
527 api_key : "<api_key>"
528 method : "add_user_users_group"
528 method : "add_user_users_group"
529 args: {
529 args: {
530 "usersgroupid" : "<users group id or name>",
530 "usersgroupid" : "<users group id or name>",
531 "userid" : "<user_id or username>",
531 "userid" : "<user_id or username>",
532 }
532 }
533
533
534 OUTPUT::
534 OUTPUT::
535
535
536 id : <id_given_in_input>
536 id : <id_given_in_input>
537 result: {
537 result: {
538 "success": True|False # depends on if member is in group
538 "success": True|False # depends on if member is in group
539 "msg": "added member `<username>` to users group `<groupname>` |
539 "msg": "added member `<username>` to users group `<groupname>` |
540 User is already in that group"
540 User is already in that group"
541 }
541 }
542 error: null
542 error: null
543
543
544
544
545 remove_user_from_users_group
545 remove_user_from_users_group
546 ----------------------------
546 ----------------------------
547
547
548 Removes a user from a users group. If user is not in given group success will
548 Removes a user from a users group. If user is not in given group success will
549 be `false`. This command can be executed only
549 be `false`. This command can be executed only
550 using api_key belonging to user with admin rights
550 using api_key belonging to user with admin rights
551
551
552
552
553 INPUT::
553 INPUT::
554
554
555 id : <id_for_response>
555 id : <id_for_response>
556 api_key : "<api_key>"
556 api_key : "<api_key>"
557 method : "remove_user_from_users_group"
557 method : "remove_user_from_users_group"
558 args: {
558 args: {
559 "usersgroupid" : "<users group id or name>",
559 "usersgroupid" : "<users group id or name>",
560 "userid" : "<user_id or username>",
560 "userid" : "<user_id or username>",
561 }
561 }
562
562
563 OUTPUT::
563 OUTPUT::
564
564
565 id : <id_given_in_input>
565 id : <id_given_in_input>
566 result: {
566 result: {
567 "success": True|False, # depends on if member is in group
567 "success": True|False, # depends on if member is in group
568 "msg": "removed member <username> from users group <groupname> |
568 "msg": "removed member <username> from users group <groupname> |
569 User wasn't in group"
569 User wasn't in group"
570 }
570 }
571 error: null
571 error: null
572
572
573
573
574 get_repo
574 get_repo
575 --------
575 --------
576
576
577 Gets an existing repository by it's name or repository_id. Members will return
577 Gets an existing repository by it's name or repository_id. Members will return
578 either users_group or user associated to that repository. This command can be
578 either users_group or user associated to that repository. This command can be
579 executed only using api_key belonging to user with admin
579 executed only using api_key belonging to user with admin
580 rights or regular user that have at least read access to repository.
580 rights or regular user that have at least read access to repository.
581
581
582
582
583 INPUT::
583 INPUT::
584
584
585 id : <id_for_response>
585 id : <id_for_response>
586 api_key : "<api_key>"
586 api_key : "<api_key>"
587 method : "get_repo"
587 method : "get_repo"
588 args: {
588 args: {
589 "repoid" : "<reponame or repo_id>"
589 "repoid" : "<reponame or repo_id>"
590 }
590 }
591
591
592 OUTPUT::
592 OUTPUT::
593
593
594 id : <id_given_in_input>
594 id : <id_given_in_input>
595 result: None if repository does not exist or
595 result: None if repository does not exist or
596 {
596 {
597 "repo_id" : "<repo_id>",
597 "repo_id" : "<repo_id>",
598 "repo_name" : "<reponame>"
598 "repo_name" : "<reponame>"
599 "repo_type" : "<repo_type>",
599 "repo_type" : "<repo_type>",
600 "clone_uri" : "<clone_uri>",
600 "clone_uri" : "<clone_uri>",
601 "enable_downloads": "<bool>",
601 "enable_downloads": "<bool>",
602 "enable_locking": "<bool>",
602 "enable_locking": "<bool>",
603 "enable_statistics": "<bool>",
603 "enable_statistics": "<bool>",
604 "private": "<bool>",
604 "private": "<bool>",
605 "created_on" : "<date_time_created>",
605 "created_on" : "<date_time_created>",
606 "description" : "<description>",
606 "description" : "<description>",
607 "landing_rev": "<landing_rev>",
607 "landing_rev": "<landing_rev>",
608 "last_changeset": {
608 "last_changeset": {
609 "author": "<full_author>",
609 "author": "<full_author>",
610 "date": "<date_time_of_commit>",
610 "date": "<date_time_of_commit>",
611 "message": "<commit_message>",
611 "message": "<commit_message>",
612 "raw_id": "<raw_id>",
612 "raw_id": "<raw_id>",
613 "revision": "<numeric_revision>",
613 "revision": "<numeric_revision>",
614 "short_id": "<short_id>"
614 "short_id": "<short_id>"
615 }
615 }
616 "owner": "<repo_owner>",
616 "owner": "<repo_owner>",
617 "fork_of": "<name_of_fork_parent>",
617 "fork_of": "<name_of_fork_parent>",
618 "members" : [
618 "members" : [
619 {
619 {
620 "type": "user",
620 "type": "user",
621 "user_id" : "<user_id>",
621 "user_id" : "<user_id>",
622 "username" : "<username>",
622 "username" : "<username>",
623 "firstname": "<firstname>",
623 "firstname": "<firstname>",
624 "lastname" : "<lastname>",
624 "lastname" : "<lastname>",
625 "email" : "<email>",
625 "email" : "<email>",
626 "emails": "<list_of_all_additional_emails>",
626 "emails": "<list_of_all_additional_emails>",
627 "active" : "<bool>",
627 "active" : "<bool>",
628 "admin" :Β  "<bool>",
628 "admin" :Β  "<bool>",
629 "ldap_dn" : "<ldap_dn>",
629 "ldap_dn" : "<ldap_dn>",
630 "last_login": "<last_login>",
630 "last_login": "<last_login>",
631 "permission" : "repository.(read|write|admin)"
631 "permission" : "repository.(read|write|admin)"
632 },
632 },
633 …
633 …
634 {
634 {
635 "type": "users_group",
635 "type": "users_group",
636 "id" : "<usersgroupid>",
636 "id" : "<usersgroupid>",
637 "name" : "<usersgroupname>",
637 "name" : "<usersgroupname>",
638 "active": "<bool>",
638 "active": "<bool>",
639 "permission" : "repository.(read|write|admin)"
639 "permission" : "repository.(read|write|admin)"
640 },
640 },
641 …
641 …
642 ]
642 ]
643 "followers": [
643 "followers": [
644 {
644 {
645 "user_id" : "<user_id>",
645 "user_id" : "<user_id>",
646 "username" : "<username>",
646 "username" : "<username>",
647 "firstname": "<firstname>",
647 "firstname": "<firstname>",
648 "lastname" : "<lastname>",
648 "lastname" : "<lastname>",
649 "email" : "<email>",
649 "email" : "<email>",
650 "emails": "<list_of_all_additional_emails>",
650 "emails": "<list_of_all_additional_emails>",
651 "ip_addresses": "<list_of_ip_addresses_for_user>",
651 "ip_addresses": "<list_of_ip_addresses_for_user>",
652 "active" : "<bool>",
652 "active" : "<bool>",
653 "admin" :Β  "<bool>",
653 "admin" :Β  "<bool>",
654 "ldap_dn" : "<ldap_dn>",
654 "ldap_dn" : "<ldap_dn>",
655 "last_login": "<last_login>",
655 "last_login": "<last_login>",
656 },
656 },
657 …
657 …
658 ]
658 ]
659 }
659 }
660 error: null
660 error: null
661
661
662
662
663 get_repos
663 get_repos
664 ---------
664 ---------
665
665
666 Lists all existing repositories. This command can be executed only using
666 Lists all existing repositories. This command can be executed only using
667 api_key belonging to user with admin rights or regular user that have
667 api_key belonging to user with admin rights or regular user that have
668 admin, write or read access to repository.
668 admin, write or read access to repository.
669
669
670
670
671 INPUT::
671 INPUT::
672
672
673 id : <id_for_response>
673 id : <id_for_response>
674 api_key : "<api_key>"
674 api_key : "<api_key>"
675 method : "get_repos"
675 method : "get_repos"
676 args: { }
676 args: { }
677
677
678 OUTPUT::
678 OUTPUT::
679
679
680 id : <id_given_in_input>
680 id : <id_given_in_input>
681 result: [
681 result: [
682 {
682 {
683 "repo_id" : "<repo_id>",
683 "repo_id" : "<repo_id>",
684 "repo_name" : "<reponame>"
684 "repo_name" : "<reponame>"
685 "repo_type" : "<repo_type>",
685 "repo_type" : "<repo_type>",
686 "clone_uri" : "<clone_uri>",
686 "clone_uri" : "<clone_uri>",
687 "private": : "<bool>",
687 "private": : "<bool>",
688 "created_on" : "<datetimecreated>",
688 "created_on" : "<datetimecreated>",
689 "description" : "<description>",
689 "description" : "<description>",
690 "landing_rev": "<landing_rev>",
690 "landing_rev": "<landing_rev>",
691 "owner": "<repo_owner>",
691 "owner": "<repo_owner>",
692 "fork_of": "<name_of_fork_parent>",
692 "fork_of": "<name_of_fork_parent>",
693 "enable_downloads": "<bool>",
693 "enable_downloads": "<bool>",
694 "enable_locking": "<bool>",
694 "enable_locking": "<bool>",
695 "enable_statistics": "<bool>",
695 "enable_statistics": "<bool>",
696 },
696 },
697 …
697 …
698 ]
698 ]
699 error: null
699 error: null
700
700
701
701
702 get_repo_nodes
702 get_repo_nodes
703 --------------
703 --------------
704
704
705 returns a list of nodes and it's children in a flat list for a given path
705 returns a list of nodes and it's children in a flat list for a given path
706 at given revision. It's possible to specify ret_type to show only `files` or
706 at given revision. It's possible to specify ret_type to show only `files` or
707 `dirs`. This command can be executed only using api_key belonging to user
707 `dirs`. This command can be executed only using api_key belonging to user
708 with admin rights
708 with admin rights
709
709
710
710
711 INPUT::
711 INPUT::
712
712
713 id : <id_for_response>
713 id : <id_for_response>
714 api_key : "<api_key>"
714 api_key : "<api_key>"
715 method : "get_repo_nodes"
715 method : "get_repo_nodes"
716 args: {
716 args: {
717 "repoid" : "<reponame or repo_id>"
717 "repoid" : "<reponame or repo_id>"
718 "revision" : "<revision>",
718 "revision" : "<revision>",
719 "root_path" : "<root_path>",
719 "root_path" : "<root_path>",
720 "ret_type" : "<ret_type> = Optional('all')"
720 "ret_type" : "<ret_type> = Optional('all')"
721 }
721 }
722
722
723 OUTPUT::
723 OUTPUT::
724
724
725 id : <id_given_in_input>
725 id : <id_given_in_input>
726 result: [
726 result: [
727 {
727 {
728 "name" : "<name>"
728 "name" : "<name>"
729 "type" : "<type>",
729 "type" : "<type>",
730 },
730 },
731 …
731 …
732 ]
732 ]
733 error: null
733 error: null
734
734
735
735
736 create_repo
736 create_repo
737 -----------
737 -----------
738
738
739 Creates a repository. If repository name contains "/", all needed repository
739 Creates a repository. If repository name contains "/", all needed repository
740 groups will be created. For example "foo/bar/baz" will create groups
740 groups will be created. For example "foo/bar/baz" will create groups
741 "foo", "bar" (with "foo" as parent), and create "baz" repository with
741 "foo", "bar" (with "foo" as parent), and create "baz" repository with
742 "bar" as group. This command can be executed only using api_key belonging to user with admin
742 "bar" as group. This command can be executed only using api_key belonging to user with admin
743 rights or regular user that have create repository permission. Regular users
743 rights or regular user that have create repository permission. Regular users
744 cannot specify owner parameter
744 cannot specify owner parameter
745
745
746
746
747 INPUT::
747 INPUT::
748
748
749 id : <id_for_response>
749 id : <id_for_response>
750 api_key : "<api_key>"
750 api_key : "<api_key>"
751 method : "create_repo"
751 method : "create_repo"
752 args: {
752 args: {
753 "repo_name" : "<reponame>",
753 "repo_name" : "<reponame>",
754 "owner" : "<onwer_name_or_id = Optional(=apiuser)>",
754 "owner" : "<onwer_name_or_id = Optional(=apiuser)>",
755 "repo_type" : "<repo_type> = Optional('hg')",
755 "repo_type" : "<repo_type> = Optional('hg')",
756 "description" : "<description> = Optional('')",
756 "description" : "<description> = Optional('')",
757 "private" : "<bool> = Optional(False)",
757 "private" : "<bool> = Optional(False)",
758 "clone_uri" : "<clone_uri> = Optional(None)",
758 "clone_uri" : "<clone_uri> = Optional(None)",
759 "landing_rev" : "<landing_rev> = Optional('tip')",
759 "landing_rev" : "<landing_rev> = Optional('tip')",
760 "enable_downloads": "<bool> = Optional(False)",
760 "enable_downloads": "<bool> = Optional(False)",
761 "enable_locking": "<bool> = Optional(False)",
761 "enable_locking": "<bool> = Optional(False)",
762 "enable_statistics": "<bool> = Optional(False)",
762 "enable_statistics": "<bool> = Optional(False)",
763 }
763 }
764
764
765 OUTPUT::
765 OUTPUT::
766
766
767 id : <id_given_in_input>
767 id : <id_given_in_input>
768 result: {
768 result: {
769 "msg": "Created new repository `<reponame>`",
769 "msg": "Created new repository `<reponame>`",
770 "repo": {
770 "repo": {
771 "repo_id" : "<repo_id>",
771 "repo_id" : "<repo_id>",
772 "repo_name" : "<reponame>"
772 "repo_name" : "<reponame>"
773 "repo_type" : "<repo_type>",
773 "repo_type" : "<repo_type>",
774 "clone_uri" : "<clone_uri>",
774 "clone_uri" : "<clone_uri>",
775 "private": : "<bool>",
775 "private": : "<bool>",
776 "created_on" : "<datetimecreated>",
776 "created_on" : "<datetimecreated>",
777 "description" : "<description>",
777 "description" : "<description>",
778 "landing_rev": "<landing_rev>",
778 "landing_rev": "<landing_rev>",
779 "owner": "<username or user_id>",
779 "owner": "<username or user_id>",
780 "fork_of": "<name_of_fork_parent>",
780 "fork_of": "<name_of_fork_parent>",
781 "enable_downloads": "<bool>",
781 "enable_downloads": "<bool>",
782 "enable_locking": "<bool>",
782 "enable_locking": "<bool>",
783 "enable_statistics": "<bool>",
783 "enable_statistics": "<bool>",
784 },
784 },
785 }
785 }
786 error: null
786 error: null
787
787
788
788
789 fork_repo
789 fork_repo
790 ---------
790 ---------
791
791
792 Creates a fork of given repo. In case of using celery this will
792 Creates a fork of given repo. In case of using celery this will
793 immidiatelly return success message, while fork is going to be created
793 immidiatelly return success message, while fork is going to be created
794 asynchronous. This command can be executed only using api_key belonging to
794 asynchronous. This command can be executed only using api_key belonging to
795 user with admin rights or regular user that have fork permission, and at least
795 user with admin rights or regular user that have fork permission, and at least
796 read access to forking repository. Regular users cannot specify owner parameter.
796 read access to forking repository. Regular users cannot specify owner parameter.
797
797
798
798
799 INPUT::
799 INPUT::
800
800
801 id : <id_for_response>
801 id : <id_for_response>
802 api_key : "<api_key>"
802 api_key : "<api_key>"
803 method : "fork_repo"
803 method : "fork_repo"
804 args: {
804 args: {
805 "repoid" : "<reponame or repo_id>",
805 "repoid" : "<reponame or repo_id>",
806 "fork_name": "<forkname>",
806 "fork_name": "<forkname>",
807 "owner": "<username or user_id = Optional(=apiuser)>",
807 "owner": "<username or user_id = Optional(=apiuser)>",
808 "description": "<description>",
808 "description": "<description>",
809 "copy_permissions": "<bool>",
809 "copy_permissions": "<bool>",
810 "private": "<bool>",
810 "private": "<bool>",
811 "landing_rev": "<landing_rev>"
811 "landing_rev": "<landing_rev>"
812
812
813 }
813 }
814
814
815 OUTPUT::
815 OUTPUT::
816
816
817 id : <id_given_in_input>
817 id : <id_given_in_input>
818 result: {
818 result: {
819 "msg": "Created fork of `<reponame>` as `<forkname>`",
819 "msg": "Created fork of `<reponame>` as `<forkname>`",
820 "success": true
820 "success": true
821 }
821 }
822 error: null
822 error: null
823
823
824
824
825 delete_repo
825 delete_repo
826 -----------
826 -----------
827
827
828 Deletes a repository. This command can be executed only using api_key belonging to user with admin
828 Deletes a repository. This command can be executed only using api_key belonging to user with admin
829 rights or regular user that have admin access to repository.
829 rights or regular user that have admin access to repository.
830
830
831
831
832 INPUT::
832 INPUT::
833
833
834 id : <id_for_response>
834 id : <id_for_response>
835 api_key : "<api_key>"
835 api_key : "<api_key>"
836 method : "delete_repo"
836 method : "delete_repo"
837 args: {
837 args: {
838 "repoid" : "<reponame or repo_id>"
838 "repoid" : "<reponame or repo_id>"
839 }
839 }
840
840
841 OUTPUT::
841 OUTPUT::
842
842
843 id : <id_given_in_input>
843 id : <id_given_in_input>
844 result: {
844 result: {
845 "msg": "Deleted repository `<reponame>`",
845 "msg": "Deleted repository `<reponame>`",
846 "success": true
846 "success": true
847 }
847 }
848 error: null
848 error: null
849
849
850
850
851 grant_user_permission
851 grant_user_permission
852 ---------------------
852 ---------------------
853
853
854 Grant permission for user on given repository, or update existing one
854 Grant permission for user on given repository, or update existing one
855 if found. This command can be executed only using api_key belonging to user
855 if found. This command can be executed only using api_key belonging to user
856 with admin rights.
856 with admin rights.
857
857
858
858
859 INPUT::
859 INPUT::
860
860
861 id : <id_for_response>
861 id : <id_for_response>
862 api_key : "<api_key>"
862 api_key : "<api_key>"
863 method : "grant_user_permission"
863 method : "grant_user_permission"
864 args: {
864 args: {
865 "repoid" : "<reponame or repo_id>"
865 "repoid" : "<reponame or repo_id>"
866 "userid" : "<username or user_id>"
866 "userid" : "<username or user_id>"
867 "perm" : "(repository.(none|read|write|admin))",
867 "perm" : "(repository.(none|read|write|admin))",
868 }
868 }
869
869
870 OUTPUT::
870 OUTPUT::
871
871
872 id : <id_given_in_input>
872 id : <id_given_in_input>
873 result: {
873 result: {
874 "msg" : "Granted perm: `<perm>` for user: `<username>` in repo: `<reponame>`",
874 "msg" : "Granted perm: `<perm>` for user: `<username>` in repo: `<reponame>`",
875 "success": true
875 "success": true
876 }
876 }
877 error: null
877 error: null
878
878
879
879
880 revoke_user_permission
880 revoke_user_permission
881 ----------------------
881 ----------------------
882
882
883 Revoke permission for user on given repository. This command can be executed
883 Revoke permission for user on given repository. This command can be executed
884 only using api_key belonging to user with admin rights.
884 only using api_key belonging to user with admin rights.
885
885
886
886
887 INPUT::
887 INPUT::
888
888
889 id : <id_for_response>
889 id : <id_for_response>
890 api_key : "<api_key>"
890 api_key : "<api_key>"
891 method : "revoke_user_permission"
891 method : "revoke_user_permission"
892 args: {
892 args: {
893 "repoid" : "<reponame or repo_id>"
893 "repoid" : "<reponame or repo_id>"
894 "userid" : "<username or user_id>"
894 "userid" : "<username or user_id>"
895 }
895 }
896
896
897 OUTPUT::
897 OUTPUT::
898
898
899 id : <id_given_in_input>
899 id : <id_given_in_input>
900 result: {
900 result: {
901 "msg" : "Revoked perm for user: `<username>` in repo: `<reponame>`",
901 "msg" : "Revoked perm for user: `<username>` in repo: `<reponame>`",
902 "success": true
902 "success": true
903 }
903 }
904 error: null
904 error: null
905
905
906
906
907 grant_users_group_permission
907 grant_users_group_permission
908 ----------------------------
908 ----------------------------
909
909
910 Grant permission for users group on given repository, or update
910 Grant permission for users group on given repository, or update
911 existing one if found. This command can be executed only using
911 existing one if found. This command can be executed only using
912 api_key belonging to user with admin rights.
912 api_key belonging to user with admin rights.
913
913
914
914
915 INPUT::
915 INPUT::
916
916
917 id : <id_for_response>
917 id : <id_for_response>
918 api_key : "<api_key>"
918 api_key : "<api_key>"
919 method : "grant_users_group_permission"
919 method : "grant_users_group_permission"
920 args: {
920 args: {
921 "repoid" : "<reponame or repo_id>"
921 "repoid" : "<reponame or repo_id>"
922 "usersgroupid" : "<users group id or name>"
922 "usersgroupid" : "<users group id or name>"
923 "perm" : "(repository.(none|read|write|admin))",
923 "perm" : "(repository.(none|read|write|admin))",
924 }
924 }
925
925
926 OUTPUT::
926 OUTPUT::
927
927
928 id : <id_given_in_input>
928 id : <id_given_in_input>
929 result: {
929 result: {
930 "msg" : "Granted perm: `<perm>` for group: `<usersgroupname>` in repo: `<reponame>`",
930 "msg" : "Granted perm: `<perm>` for group: `<usersgroupname>` in repo: `<reponame>`",
931 "success": true
931 "success": true
932 }
932 }
933 error: null
933 error: null
934
934
935
935
936 revoke_users_group_permission
936 revoke_users_group_permission
937 -----------------------------
937 -----------------------------
938
938
939 Revoke permission for users group on given repository.This command can be
939 Revoke permission for users group on given repository.This command can be
940 executed only using api_key belonging to user with admin rights.
940 executed only using api_key belonging to user with admin rights.
941
941
942 INPUT::
942 INPUT::
943
943
944 id : <id_for_response>
944 id : <id_for_response>
945 api_key : "<api_key>"
945 api_key : "<api_key>"
946 method : "revoke_users_group_permission"
946 method : "revoke_users_group_permission"
947 args: {
947 args: {
948 "repoid" : "<reponame or repo_id>"
948 "repoid" : "<reponame or repo_id>"
949 "usersgroupid" : "<users group id or name>"
949 "usersgroupid" : "<users group id or name>"
950 }
950 }
951
951
952 OUTPUT::
952 OUTPUT::
953
953
954 id : <id_given_in_input>
954 id : <id_given_in_input>
955 result: {
955 result: {
956 "msg" : "Revoked perm for group: `<usersgroupname>` in repo: `<reponame>`",
956 "msg" : "Revoked perm for group: `<usersgroupname>` in repo: `<reponame>`",
957 "success": true
957 "success": true
958 }
958 }
959 error: null No newline at end of file
959 error: null
@@ -1,35 +1,35 b''
1 .. _models:
1 .. _models:
2
2
3 ========================
3 ========================
4 The :mod:`models` Module
4 The :mod:`models` Module
5 ========================
5 ========================
6
6
7 .. automodule:: rhodecode.model
7 .. automodule:: rhodecode.model
8 :members:
8 :members:
9
9
10 .. automodule:: rhodecode.model.comment
10 .. automodule:: rhodecode.model.comment
11 :members:
11 :members:
12
12
13 .. automodule:: rhodecode.model.notification
13 .. automodule:: rhodecode.model.notification
14 :members:
14 :members:
15
15
16 .. automodule:: rhodecode.model.permission
16 .. automodule:: rhodecode.model.permission
17 :members:
17 :members:
18
18
19 .. automodule:: rhodecode.model.repo_permission
19 .. automodule:: rhodecode.model.repo_permission
20 :members:
20 :members:
21
21
22 .. automodule:: rhodecode.model.repo
22 .. automodule:: rhodecode.model.repo
23 :members:
23 :members:
24
24
25 .. automodule:: rhodecode.model.repos_group
25 .. automodule:: rhodecode.model.repos_group
26 :members:
26 :members:
27
27
28 .. automodule:: rhodecode.model.scm
28 .. automodule:: rhodecode.model.scm
29 :members:
29 :members:
30
30
31 .. automodule:: rhodecode.model.user
31 .. automodule:: rhodecode.model.user
32 :members:
32 :members:
33
33
34 .. automodule:: rhodecode.model.users_group
34 .. automodule:: rhodecode.model.users_group
35 :members: No newline at end of file
35 :members:
@@ -1,64 +1,64 b''
1 .. _index:
1 .. _index:
2
2
3 .. include:: ./../README.rst
3 .. include:: ./../README.rst
4
4
5 Users Guide
5 Users Guide
6 -----------
6 -----------
7
7
8 **Installation:**
8 **Installation:**
9
9
10 .. toctree::
10 .. toctree::
11 :maxdepth: 1
11 :maxdepth: 1
12
12
13 installation
13 installation
14 setup
14 setup
15 upgrade
15 upgrade
16
16
17 **Usage**
17 **Usage**
18
18
19 .. toctree::
19 .. toctree::
20 :maxdepth: 1
20 :maxdepth: 1
21
21
22 usage/general
22 usage/general
23 usage/git_support
23 usage/git_support
24 usage/performance
24 usage/performance
25 usage/locking
25 usage/locking
26 usage/statistics
26 usage/statistics
27 usage/backup
27 usage/backup
28 usage/subrepos
28 usage/subrepos
29 usage/debugging
29 usage/debugging
30 usage/troubleshooting
30 usage/troubleshooting
31
31
32 **Develop**
32 **Develop**
33
33
34 .. toctree::
34 .. toctree::
35 :maxdepth: 1
35 :maxdepth: 1
36
36
37 contributing
37 contributing
38 changelog
38 changelog
39
39
40 **API**
40 **API**
41
41
42 .. toctree::
42 .. toctree::
43 :maxdepth: 1
43 :maxdepth: 1
44
44
45 api/api
45 api/api
46 api/models
46 api/models
47
47
48
48
49 Other topics
49 Other topics
50 ------------
50 ------------
51
51
52 * :ref:`genindex`
52 * :ref:`genindex`
53 * :ref:`search`
53 * :ref:`search`
54
54
55 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
55 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
56 .. _python: http://www.python.org/
56 .. _python: http://www.python.org/
57 .. _django: http://www.djangoproject.com/
57 .. _django: http://www.djangoproject.com/
58 .. _mercurial: http://mercurial.selenic.com/
58 .. _mercurial: http://mercurial.selenic.com/
59 .. _bitbucket: http://bitbucket.org/
59 .. _bitbucket: http://bitbucket.org/
60 .. _subversion: http://subversion.tigris.org/
60 .. _subversion: http://subversion.tigris.org/
61 .. _git: http://git-scm.com/
61 .. _git: http://git-scm.com/
62 .. _celery: http://celeryproject.org/
62 .. _celery: http://celeryproject.org/
63 .. _Sphinx: http://sphinx.pocoo.org/
63 .. _Sphinx: http://sphinx.pocoo.org/
64 .. _vcs: http://pypi.python.org/pypi/vcs No newline at end of file
64 .. _vcs: http://pypi.python.org/pypi/vcs
@@ -1,250 +1,250 b''
1 .. _installation_win:
1 .. _installation_win:
2
2
3
3
4 Step by step Installation for Windows
4 Step by step Installation for Windows
5 =====================================
5 =====================================
6
6
7
7
8 RhodeCode step-by-step install Guide for Windows
8 RhodeCode step-by-step install Guide for Windows
9
9
10 Target OS: Windows XP SP3 32bit English (Clean installation)
10 Target OS: Windows XP SP3 32bit English (Clean installation)
11 + All Windows Updates until 24-may-2012
11 + All Windows Updates until 24-may-2012
12
12
13 .. note::
13 .. note::
14
14
15 This installation is for 32bit systems, for 64bit windows you might need
15 This installation is for 32bit systems, for 64bit windows you might need
16 to download proper 64bit version of "Windows Installer" and Win32py
16 to download proper 64bit version of "Windows Installer" and Win32py
17 extensions
17 extensions
18
18
19 Step1 - Install Visual Studio 2008 Express
19 Step1 - Install Visual Studio 2008 Express
20 ------------------------------------------
20 ------------------------------------------
21
21
22
22
23 Optional: You can also install MingW, but VS2008 installation is easier
23 Optional: You can also install MingW, but VS2008 installation is easier
24
24
25 Download "Visual C++ 2008 Express Edition with SP1" from:
25 Download "Visual C++ 2008 Express Edition with SP1" from:
26 http://www.microsoft.com/visualstudio/en-us/products/2008-editions/express
26 http://www.microsoft.com/visualstudio/en-us/products/2008-editions/express
27 (if not found or relocated, google for "visual studio 2008 express" for
27 (if not found or relocated, google for "visual studio 2008 express" for
28 updated link)
28 updated link)
29
29
30 You can also download full ISO file for offline installation, just
30 You can also download full ISO file for offline installation, just
31 choose "All - Offline Install ISO image file" in the previous page and
31 choose "All - Offline Install ISO image file" in the previous page and
32 choose "Visual C++ 2008 Express" when installing.
32 choose "Visual C++ 2008 Express" when installing.
33
33
34
34
35 .. note::
35 .. note::
36
36
37 Silverlight Runtime and SQL Server 2008 Express Edition are not
37 Silverlight Runtime and SQL Server 2008 Express Edition are not
38 required, you can uncheck them
38 required, you can uncheck them
39
39
40
40
41 Step2 - Install Python
41 Step2 - Install Python
42 ----------------------
42 ----------------------
43
43
44 Install Python 2.x.y (x >= 5) x86 version (32bit). DO NOT USE A 3.x version.
44 Install Python 2.x.y (x >= 5) x86 version (32bit). DO NOT USE A 3.x version.
45 Download Python 2.x.y from:
45 Download Python 2.x.y from:
46 http://www.python.org/download/
46 http://www.python.org/download/
47
47
48 Choose "Windows Installer" (32bit version) not "Windows X86-64
48 Choose "Windows Installer" (32bit version) not "Windows X86-64
49 Installer". While writing this guide, the latest version was v2.7.3.
49 Installer". While writing this guide, the latest version was v2.7.3.
50 Remember the specific major and minor version installed, because it will
50 Remember the specific major and minor version installed, because it will
51 be needed in the next step. In this case, it is "2.7".
51 be needed in the next step. In this case, it is "2.7".
52
52
53
53
54 Step3 - Install Win32py extensions
54 Step3 - Install Win32py extensions
55 ----------------------------------
55 ----------------------------------
56
56
57 Download pywin32 from:
57 Download pywin32 from:
58 http://sourceforge.net/projects/pywin32/files/
58 http://sourceforge.net/projects/pywin32/files/
59
59
60 - Click on "pywin32" folder
60 - Click on "pywin32" folder
61 - Click on the first folder (in this case, Build 217, maybe newer when you try)
61 - Click on the first folder (in this case, Build 217, maybe newer when you try)
62 - Choose the file ending with ".win32-py2.x.exe" -> x being the minor
62 - Choose the file ending with ".win32-py2.x.exe" -> x being the minor
63 version of Python you installed (in this case, 7)
63 version of Python you installed (in this case, 7)
64 When writing this guide, the file was:
64 When writing this guide, the file was:
65 http://sourceforge.net/projects/pywin32/files/pywin32/Build%20217/pywin32-217.win32-py2.7.exe/download
65 http://sourceforge.net/projects/pywin32/files/pywin32/Build%20217/pywin32-217.win32-py2.7.exe/download
66
66
67
67
68 Step4 - Python BIN
68 Step4 - Python BIN
69 ------------------
69 ------------------
70
70
71 Add Python BIN folder to the path
71 Add Python BIN folder to the path
72
72
73 You have to add the Python folder to the path, you can do it manually
73 You have to add the Python folder to the path, you can do it manually
74 (editing "PATH" environment variable) or using Windows Support Tools
74 (editing "PATH" environment variable) or using Windows Support Tools
75 that came preinstalled in Vista/7 and can be installed in Windows XP.
75 that came preinstalled in Vista/7 and can be installed in Windows XP.
76
76
77 - Using support tools on WINDOWS XP:
77 - Using support tools on WINDOWS XP:
78 If you use Windows XP you can install them using Windows XP CD and
78 If you use Windows XP you can install them using Windows XP CD and
79 navigating to \SUPPORT\TOOLS. There, execute Setup.EXE (not MSI).
79 navigating to \SUPPORT\TOOLS. There, execute Setup.EXE (not MSI).
80 Afterwards, open a CMD and type::
80 Afterwards, open a CMD and type::
81
81
82 SETX PATH "%PATH%;[your-python-path]" -M
82 SETX PATH "%PATH%;[your-python-path]" -M
83
83
84 Close CMD (the path variable will be updated then)
84 Close CMD (the path variable will be updated then)
85
85
86 - Using support tools on WINDOWS Vista/7:
86 - Using support tools on WINDOWS Vista/7:
87
87
88 Open a CMD and type::
88 Open a CMD and type::
89
89
90 SETX PATH "%PATH%;[your-python-path]" /M
90 SETX PATH "%PATH%;[your-python-path]" /M
91
91
92 Please substitute [your-python-path] with your Python installation path.
92 Please substitute [your-python-path] with your Python installation path.
93 Typically: C:\\Python27
93 Typically: C:\\Python27
94
94
95
95
96 Step5 - RhodeCode folder structure
96 Step5 - RhodeCode folder structure
97 ----------------------------------
97 ----------------------------------
98
98
99 Create a RhodeCode folder structure
99 Create a RhodeCode folder structure
100
100
101 This is only a example to install RhodeCode, you can of course change
101 This is only a example to install RhodeCode, you can of course change
102 it. However, this guide will follow the proposed structure, so please
102 it. However, this guide will follow the proposed structure, so please
103 later adapt the paths if you change them. My recommendation is to use
103 later adapt the paths if you change them. My recommendation is to use
104 folders with NO SPACES. But you can try if you are brave...
104 folders with NO SPACES. But you can try if you are brave...
105
105
106 Create the following folder structure::
106 Create the following folder structure::
107
107
108 C:\RhodeCode
108 C:\RhodeCode
109 C:\RhodeCode\Bin
109 C:\RhodeCode\Bin
110 C:\RhodeCode\Env
110 C:\RhodeCode\Env
111 C:\RhodeCode\Repos
111 C:\RhodeCode\Repos
112
112
113
113
114 Step6 - Install virtualenv
114 Step6 - Install virtualenv
115 ---------------------------
115 ---------------------------
116
116
117 Install Virtual Env for Python
117 Install Virtual Env for Python
118
118
119 Navigate to: http://www.virtualenv.org/en/latest/index.html#installation
119 Navigate to: http://www.virtualenv.org/en/latest/index.html#installation
120 Right click on "virtualenv.py" file and choose "Save link as...".
120 Right click on "virtualenv.py" file and choose "Save link as...".
121 Download to C:\\RhodeCode (or whatever you want)
121 Download to C:\\RhodeCode (or whatever you want)
122 (the file is located at
122 (the file is located at
123 https://raw.github.com/pypa/virtualenv/master/virtualenv.py)
123 https://raw.github.com/pypa/virtualenv/master/virtualenv.py)
124
124
125 Create a virtual Python environment in C:\\RhodeCode\\Env (or similar). To
125 Create a virtual Python environment in C:\\RhodeCode\\Env (or similar). To
126 do so, open a CMD (Python Path should be included in Step3), navigate
126 do so, open a CMD (Python Path should be included in Step3), navigate
127 where you downloaded "virtualenv.py", and write::
127 where you downloaded "virtualenv.py", and write::
128
128
129 python virtualenv.py C:\RhodeCode\Env
129 python virtualenv.py C:\RhodeCode\Env
130
130
131 (--no-site-packages is now the default behaviour of virtualenv, no need
131 (--no-site-packages is now the default behaviour of virtualenv, no need
132 to include it)
132 to include it)
133
133
134
134
135 Step7 - Install RhodeCode
135 Step7 - Install RhodeCode
136 -------------------------
136 -------------------------
137
137
138 Finally, install RhodeCode
138 Finally, install RhodeCode
139
139
140 Close previously opened command prompt/s, and open a Visual Studio 2008
140 Close previously opened command prompt/s, and open a Visual Studio 2008
141 Command Prompt (**IMPORTANT!!**). To do so, go to Start Menu, and then open
141 Command Prompt (**IMPORTANT!!**). To do so, go to Start Menu, and then open
142 "Microsoft Visual C++ 2008 Express Edition" -> "Visual Studio Tools" ->
142 "Microsoft Visual C++ 2008 Express Edition" -> "Visual Studio Tools" ->
143 "Visual Studio 2008 Command Prompt"
143 "Visual Studio 2008 Command Prompt"
144
144
145 In that CMD (loaded with VS2008 PATHs) type::
145 In that CMD (loaded with VS2008 PATHs) type::
146
146
147 cd C:\RhodeCode\Env\Scripts (or similar)
147 cd C:\RhodeCode\Env\Scripts (or similar)
148 activate
148 activate
149
149
150 The prompt will change into "(Env) C:\\RhodeCode\\Env\\Scripts" or similar
150 The prompt will change into "(Env) C:\\RhodeCode\\Env\\Scripts" or similar
151 (depending of your folder structure). Then type::
151 (depending of your folder structure). Then type::
152
152
153 pip install rhodecode
153 pip install rhodecode
154
154
155 (long step, please wait until fully complete)
155 (long step, please wait until fully complete)
156
156
157 Some warnings will appear, don't worry as they are normal.
157 Some warnings will appear, don't worry as they are normal.
158
158
159
159
160 Step8 - Configuring RhodeCode
160 Step8 - Configuring RhodeCode
161 -----------------------------
161 -----------------------------
162
162
163
163
164 steps taken from http://packages.python.org/RhodeCode/setup.html
164 steps taken from http://packages.python.org/RhodeCode/setup.html
165
165
166 You have to use the same Visual Studio 2008 command prompt as Step7, so
166 You have to use the same Visual Studio 2008 command prompt as Step7, so
167 if you closed it reopen it following the same commands (including the
167 if you closed it reopen it following the same commands (including the
168 "activate" one). When ready, just type::
168 "activate" one). When ready, just type::
169
169
170 cd C:\RhodeCode\Bin
170 cd C:\RhodeCode\Bin
171 paster make-config RhodeCode production.ini
171 paster make-config RhodeCode production.ini
172
172
173 Then, you must edit production.ini to fit your needs (ip address, ip
173 Then, you must edit production.ini to fit your needs (ip address, ip
174 port, mail settings, database, whatever). I recommend using NotePad++
174 port, mail settings, database, whatever). I recommend using NotePad++
175 (free) or similar text editor, as it handles well the EndOfLine
175 (free) or similar text editor, as it handles well the EndOfLine
176 character differences between Unix and Windows
176 character differences between Unix and Windows
177 (http://notepad-plus-plus.org/)
177 (http://notepad-plus-plus.org/)
178
178
179 For the sake of simplicity lets run it with the default settings. After
179 For the sake of simplicity lets run it with the default settings. After
180 your edits (if any), in the previous Command Prompt, type::
180 your edits (if any), in the previous Command Prompt, type::
181
181
182 paster setup-rhodecode production.ini
182 paster setup-rhodecode production.ini
183
183
184 (this time a NEW database will be installed, you must follow a different
184 (this time a NEW database will be installed, you must follow a different
185 step to later UPGRADE to a newer RhodeCode version)
185 step to later UPGRADE to a newer RhodeCode version)
186
186
187 The script will ask you for confirmation about creating a NEW database,
187 The script will ask you for confirmation about creating a NEW database,
188 answer yes (y)
188 answer yes (y)
189 The script will ask you for repository path, answer C:\\RhodeCode\\Repos
189 The script will ask you for repository path, answer C:\\RhodeCode\\Repos
190 (or similar)
190 (or similar)
191 The script will ask you for admin username and password, answer "admin"
191 The script will ask you for admin username and password, answer "admin"
192 + "123456" (or whatever you want)
192 + "123456" (or whatever you want)
193 The script will ask you for admin mail, answer "admin@xxxx.com" (or
193 The script will ask you for admin mail, answer "admin@xxxx.com" (or
194 whatever you want)
194 whatever you want)
195
195
196 If you make some mistake and the script does not end, don't worry, start
196 If you make some mistake and the script does not end, don't worry, start
197 it again.
197 it again.
198
198
199
199
200 Step9 - Running RhodeCode
200 Step9 - Running RhodeCode
201 -------------------------
201 -------------------------
202
202
203
203
204 In the previous command prompt, being in the C:\\RhodeCode\\Bin folder,
204 In the previous command prompt, being in the C:\\RhodeCode\\Bin folder,
205 just type::
205 just type::
206
206
207 paster serve production.ini
207 paster serve production.ini
208
208
209 Open yout web server, and go to http://127.0.0.1:5000
209 Open yout web server, and go to http://127.0.0.1:5000
210
210
211 It works!! :-)
211 It works!! :-)
212
212
213 Remark:
213 Remark:
214 If it does not work first time, just Ctrl-C the CMD process and start it
214 If it does not work first time, just Ctrl-C the CMD process and start it
215 again. Don't forget the "http://" in Internet Explorer
215 again. Don't forget the "http://" in Internet Explorer
216
216
217
217
218
218
219 What this Guide does not cover:
219 What this Guide does not cover:
220
220
221 - Installing Celery
221 - Installing Celery
222 - Running RhodeCode as Windows Service. You can investigate here:
222 - Running RhodeCode as Windows Service. You can investigate here:
223
223
224 - http://pypi.python.org/pypi/wsgisvc
224 - http://pypi.python.org/pypi/wsgisvc
225 - http://ryrobes.com/python/running-python-scripts-as-a-windows-service/
225 - http://ryrobes.com/python/running-python-scripts-as-a-windows-service/
226 - http://wiki.pylonshq.com/display/pylonscookbook/How+to+run+Pylons+as+a+Windows+service
226 - http://wiki.pylonshq.com/display/pylonscookbook/How+to+run+Pylons+as+a+Windows+service
227
227
228 - Using Apache. You can investigate here:
228 - Using Apache. You can investigate here:
229
229
230 - https://groups.google.com/group/rhodecode/msg/c433074e813ffdc4
230 - https://groups.google.com/group/rhodecode/msg/c433074e813ffdc4
231
231
232
232
233 Upgrading
233 Upgrading
234 =========
234 =========
235
235
236 Stop running RhodeCode
236 Stop running RhodeCode
237 Open a CommandPrompt like in Step7 (VS2008 path + activate) and type::
237 Open a CommandPrompt like in Step7 (VS2008 path + activate) and type::
238
238
239 easy_install -U rhodecode
239 easy_install -U rhodecode
240 cd \RhodeCode\Bin
240 cd \RhodeCode\Bin
241
241
242 { backup your production.ini file now} ::
242 { backup your production.ini file now} ::
243
243
244 paster make-config RhodeCode production.ini
244 paster make-config RhodeCode production.ini
245
245
246 (check changes and update your production.ini accordingly) ::
246 (check changes and update your production.ini accordingly) ::
247
247
248 paster upgrade-db production.ini (update database)
248 paster upgrade-db production.ini (update database)
249
249
250 Full steps in http://packages.python.org/RhodeCode/upgrade.html No newline at end of file
250 Full steps in http://packages.python.org/RhodeCode/upgrade.html
@@ -1,725 +1,725 b''
1 .. _setup:
1 .. _setup:
2
2
3 =====
3 =====
4 Setup
4 Setup
5 =====
5 =====
6
6
7
7
8 Setting up RhodeCode
8 Setting up RhodeCode
9 --------------------
9 --------------------
10
10
11 First, you will need to create a RhodeCode configuration file. Run the
11 First, you will need to create a RhodeCode configuration file. Run the
12 following command to do this::
12 following command to do this::
13
13
14 paster make-config RhodeCode production.ini
14 paster make-config RhodeCode production.ini
15
15
16 - This will create the file `production.ini` in the current directory. This
16 - This will create the file `production.ini` in the current directory. This
17 configuration file contains the various settings for RhodeCode, e.g proxy
17 configuration file contains the various settings for RhodeCode, e.g proxy
18 port, email settings, usage of static files, cache, celery settings and
18 port, email settings, usage of static files, cache, celery settings and
19 logging.
19 logging.
20
20
21
21
22 Next, you need to create the databases used by RhodeCode. I recommend that you
22 Next, you need to create the databases used by RhodeCode. I recommend that you
23 use postgresql or sqlite (default). If you choose a database other than the
23 use postgresql or sqlite (default). If you choose a database other than the
24 default ensure you properly adjust the db url in your production.ini
24 default ensure you properly adjust the db url in your production.ini
25 configuration file to use this other database. RhodeCode currently supports
25 configuration file to use this other database. RhodeCode currently supports
26 postgresql, sqlite and mysql databases. Create the database by running
26 postgresql, sqlite and mysql databases. Create the database by running
27 the following command::
27 the following command::
28
28
29 paster setup-rhodecode production.ini
29 paster setup-rhodecode production.ini
30
30
31 This will prompt you for a "root" path. This "root" path is the location where
31 This will prompt you for a "root" path. This "root" path is the location where
32 RhodeCode will store all of its repositories on the current machine. After
32 RhodeCode will store all of its repositories on the current machine. After
33 entering this "root" path ``setup-rhodecode`` will also prompt you for a username
33 entering this "root" path ``setup-rhodecode`` will also prompt you for a username
34 and password for the initial admin account which ``setup-rhodecode`` sets
34 and password for the initial admin account which ``setup-rhodecode`` sets
35 up for you.
35 up for you.
36
36
37 setup process can be fully automated, example for lazy::
37 setup process can be fully automated, example for lazy::
38
38
39 paster setup-rhodecode production.ini --user=marcink --password=secret --email=marcin@rhodecode.org --repos=/home/marcink/my_repos
39 paster setup-rhodecode production.ini --user=marcink --password=secret --email=marcin@rhodecode.org --repos=/home/marcink/my_repos
40
40
41
41
42 - The ``setup-rhodecode`` command will create all of the needed tables and an
42 - The ``setup-rhodecode`` command will create all of the needed tables and an
43 admin account. When choosing a root path you can either use a new empty
43 admin account. When choosing a root path you can either use a new empty
44 location, or a location which already contains existing repositories. If you
44 location, or a location which already contains existing repositories. If you
45 choose a location which contains existing repositories RhodeCode will simply
45 choose a location which contains existing repositories RhodeCode will simply
46 add all of the repositories at the chosen location to it's database.
46 add all of the repositories at the chosen location to it's database.
47 (Note: make sure you specify the correct path to the root).
47 (Note: make sure you specify the correct path to the root).
48 - Note: the given path for mercurial_ repositories **must** be write accessible
48 - Note: the given path for mercurial_ repositories **must** be write accessible
49 for the application. It's very important since the RhodeCode web interface
49 for the application. It's very important since the RhodeCode web interface
50 will work without write access, but when trying to do a push it will
50 will work without write access, but when trying to do a push it will
51 eventually fail with permission denied errors unless it has write access.
51 eventually fail with permission denied errors unless it has write access.
52
52
53 You are now ready to use RhodeCode, to run it simply execute::
53 You are now ready to use RhodeCode, to run it simply execute::
54
54
55 paster serve production.ini
55 paster serve production.ini
56
56
57 - This command runs the RhodeCode server. The web app should be available at the
57 - This command runs the RhodeCode server. The web app should be available at the
58 127.0.0.1:5000. This ip and port is configurable via the production.ini
58 127.0.0.1:5000. This ip and port is configurable via the production.ini
59 file created in previous step
59 file created in previous step
60 - Use the admin account you created above when running ``setup-rhodecode``
60 - Use the admin account you created above when running ``setup-rhodecode``
61 to login to the web app.
61 to login to the web app.
62 - The default permissions on each repository is read, and the owner is admin.
62 - The default permissions on each repository is read, and the owner is admin.
63 Remember to update these if needed.
63 Remember to update these if needed.
64 - In the admin panel you can toggle ldap, anonymous, permissions settings. As
64 - In the admin panel you can toggle ldap, anonymous, permissions settings. As
65 well as edit more advanced options on users and repositories
65 well as edit more advanced options on users and repositories
66
66
67 Optionally users can create `rcextensions` package that extends RhodeCode
67 Optionally users can create `rcextensions` package that extends RhodeCode
68 functionality. To do this simply execute::
68 functionality. To do this simply execute::
69
69
70 paster make-rcext production.ini
70 paster make-rcext production.ini
71
71
72 This will create `rcextensions` package in the same place that your `ini` file
72 This will create `rcextensions` package in the same place that your `ini` file
73 lives. With `rcextensions` it's possible to add additional mapping for whoosh,
73 lives. With `rcextensions` it's possible to add additional mapping for whoosh,
74 stats and add additional code into the push/pull/create/delete repo hooks.
74 stats and add additional code into the push/pull/create/delete repo hooks.
75 For example for sending signals to build-bots such as jenkins.
75 For example for sending signals to build-bots such as jenkins.
76 Please see the `__init__.py` file inside `rcextensions` package
76 Please see the `__init__.py` file inside `rcextensions` package
77 for more details.
77 for more details.
78
78
79
79
80 Using RhodeCode with SSH
80 Using RhodeCode with SSH
81 ------------------------
81 ------------------------
82
82
83 RhodeCode currently only hosts repositories using http and https. (The addition
83 RhodeCode currently only hosts repositories using http and https. (The addition
84 of ssh hosting is a planned future feature.) However you can easily use ssh in
84 of ssh hosting is a planned future feature.) However you can easily use ssh in
85 parallel with RhodeCode. (Repository access via ssh is a standard "out of
85 parallel with RhodeCode. (Repository access via ssh is a standard "out of
86 the box" feature of mercurial_ and you can use this to access any of the
86 the box" feature of mercurial_ and you can use this to access any of the
87 repositories that RhodeCode is hosting. See PublishingRepositories_)
87 repositories that RhodeCode is hosting. See PublishingRepositories_)
88
88
89 RhodeCode repository structures are kept in directories with the same name
89 RhodeCode repository structures are kept in directories with the same name
90 as the project. When using repository groups, each group is a subdirectory.
90 as the project. When using repository groups, each group is a subdirectory.
91 This allows you to easily use ssh for accessing repositories.
91 This allows you to easily use ssh for accessing repositories.
92
92
93 In order to use ssh you need to make sure that your web-server and the users
93 In order to use ssh you need to make sure that your web-server and the users
94 login accounts have the correct permissions set on the appropriate directories.
94 login accounts have the correct permissions set on the appropriate directories.
95 (Note that these permissions are independent of any permissions you have set up
95 (Note that these permissions are independent of any permissions you have set up
96 using the RhodeCode web interface.)
96 using the RhodeCode web interface.)
97
97
98 If your main directory (the same as set in RhodeCode settings) is for example
98 If your main directory (the same as set in RhodeCode settings) is for example
99 set to **/home/hg** and the repository you are using is named `rhodecode`, then
99 set to **/home/hg** and the repository you are using is named `rhodecode`, then
100 to clone via ssh you should run::
100 to clone via ssh you should run::
101
101
102 hg clone ssh://user@server.com/home/hg/rhodecode
102 hg clone ssh://user@server.com/home/hg/rhodecode
103
103
104 Using other external tools such as mercurial-server_ or using ssh key based
104 Using other external tools such as mercurial-server_ or using ssh key based
105 authentication is fully supported.
105 authentication is fully supported.
106
106
107 Note: In an advanced setup, in order for your ssh access to use the same
107 Note: In an advanced setup, in order for your ssh access to use the same
108 permissions as set up via the RhodeCode web interface, you can create an
108 permissions as set up via the RhodeCode web interface, you can create an
109 authentication hook to connect to the rhodecode db and runs check functions for
109 authentication hook to connect to the rhodecode db and runs check functions for
110 permissions against that.
110 permissions against that.
111
111
112 Setting up Whoosh full text search
112 Setting up Whoosh full text search
113 ----------------------------------
113 ----------------------------------
114
114
115 Starting from version 1.1 the whoosh index can be build by using the paster
115 Starting from version 1.1 the whoosh index can be build by using the paster
116 command ``make-index``. To use ``make-index`` you must specify the configuration
116 command ``make-index``. To use ``make-index`` you must specify the configuration
117 file that stores the location of the index. You may specify the location of the
117 file that stores the location of the index. You may specify the location of the
118 repositories (`--repo-location`). If not specified, this value is retrieved
118 repositories (`--repo-location`). If not specified, this value is retrieved
119 from the RhodeCode database. This was required prior to 1.2. Starting from
119 from the RhodeCode database. This was required prior to 1.2. Starting from
120 version 1.2 it is also possible to specify a comma separated list of
120 version 1.2 it is also possible to specify a comma separated list of
121 repositories (`--index-only`) to build index only on chooses repositories
121 repositories (`--index-only`) to build index only on chooses repositories
122 skipping any other found in repos location
122 skipping any other found in repos location
123
123
124 You may optionally pass the option `-f` to enable a full index rebuild. Without
124 You may optionally pass the option `-f` to enable a full index rebuild. Without
125 the `-f` option, indexing will run always in "incremental" mode.
125 the `-f` option, indexing will run always in "incremental" mode.
126
126
127 For an incremental index build use::
127 For an incremental index build use::
128
128
129 paster make-index production.ini
129 paster make-index production.ini
130
130
131 For a full index rebuild use::
131 For a full index rebuild use::
132
132
133 paster make-index production.ini -f
133 paster make-index production.ini -f
134
134
135
135
136 building index just for chosen repositories is possible with such command::
136 building index just for chosen repositories is possible with such command::
137
137
138 paster make-index production.ini --index-only=vcs,rhodecode
138 paster make-index production.ini --index-only=vcs,rhodecode
139
139
140
140
141 In order to do periodical index builds and keep your index always up to date.
141 In order to do periodical index builds and keep your index always up to date.
142 It's recommended to do a crontab entry for incremental indexing.
142 It's recommended to do a crontab entry for incremental indexing.
143 An example entry might look like this::
143 An example entry might look like this::
144
144
145 /path/to/python/bin/paster make-index /path/to/rhodecode/production.ini
145 /path/to/python/bin/paster make-index /path/to/rhodecode/production.ini
146
146
147 When using incremental mode (the default) whoosh will check the last
147 When using incremental mode (the default) whoosh will check the last
148 modification date of each file and add it to be reindexed if a newer file is
148 modification date of each file and add it to be reindexed if a newer file is
149 available. The indexing daemon checks for any removed files and removes them
149 available. The indexing daemon checks for any removed files and removes them
150 from index.
150 from index.
151
151
152 If you want to rebuild index from scratch, you can use the `-f` flag as above,
152 If you want to rebuild index from scratch, you can use the `-f` flag as above,
153 or in the admin panel you can check `build from scratch` flag.
153 or in the admin panel you can check `build from scratch` flag.
154
154
155
155
156 Setting up LDAP support
156 Setting up LDAP support
157 -----------------------
157 -----------------------
158
158
159 RhodeCode starting from version 1.1 supports ldap authentication. In order
159 RhodeCode starting from version 1.1 supports ldap authentication. In order
160 to use LDAP, you have to install the python-ldap_ package. This package is
160 to use LDAP, you have to install the python-ldap_ package. This package is
161 available via pypi, so you can install it by running
161 available via pypi, so you can install it by running
162
162
163 using easy_install::
163 using easy_install::
164
164
165 easy_install python-ldap
165 easy_install python-ldap
166
166
167 using pip::
167 using pip::
168
168
169 pip install python-ldap
169 pip install python-ldap
170
170
171 .. note::
171 .. note::
172 python-ldap requires some certain libs on your system, so before installing
172 python-ldap requires some certain libs on your system, so before installing
173 it check that you have at least `openldap`, and `sasl` libraries.
173 it check that you have at least `openldap`, and `sasl` libraries.
174
174
175 LDAP settings are located in admin->ldap section,
175 LDAP settings are located in admin->ldap section,
176
176
177 Here's a typical ldap setup::
177 Here's a typical ldap setup::
178
178
179 Connection settings
179 Connection settings
180 Enable LDAP = checked
180 Enable LDAP = checked
181 Host = host.example.org
181 Host = host.example.org
182 Port = 389
182 Port = 389
183 Account = <account>
183 Account = <account>
184 Password = <password>
184 Password = <password>
185 Connection Security = LDAPS connection
185 Connection Security = LDAPS connection
186 Certificate Checks = DEMAND
186 Certificate Checks = DEMAND
187
187
188 Search settings
188 Search settings
189 Base DN = CN=users,DC=host,DC=example,DC=org
189 Base DN = CN=users,DC=host,DC=example,DC=org
190 LDAP Filter = (&(objectClass=user)(!(objectClass=computer)))
190 LDAP Filter = (&(objectClass=user)(!(objectClass=computer)))
191 LDAP Search Scope = SUBTREE
191 LDAP Search Scope = SUBTREE
192
192
193 Attribute mappings
193 Attribute mappings
194 Login Attribute = uid
194 Login Attribute = uid
195 First Name Attribute = firstName
195 First Name Attribute = firstName
196 Last Name Attribute = lastName
196 Last Name Attribute = lastName
197 E-mail Attribute = mail
197 E-mail Attribute = mail
198
198
199 .. _enable_ldap:
199 .. _enable_ldap:
200
200
201 Enable LDAP : required
201 Enable LDAP : required
202 Whether to use LDAP for authenticating users.
202 Whether to use LDAP for authenticating users.
203
203
204 .. _ldap_host:
204 .. _ldap_host:
205
205
206 Host : required
206 Host : required
207 LDAP server hostname or IP address. Can be also a comma separated
207 LDAP server hostname or IP address. Can be also a comma separated
208 list of servers to support LDAP fail-over.
208 list of servers to support LDAP fail-over.
209
209
210 .. _Port:
210 .. _Port:
211
211
212 Port : required
212 Port : required
213 389 for un-encrypted LDAP, 636 for SSL-encrypted LDAP.
213 389 for un-encrypted LDAP, 636 for SSL-encrypted LDAP.
214
214
215 .. _ldap_account:
215 .. _ldap_account:
216
216
217 Account : optional
217 Account : optional
218 Only required if the LDAP server does not allow anonymous browsing of
218 Only required if the LDAP server does not allow anonymous browsing of
219 records. This should be a special account for record browsing. This
219 records. This should be a special account for record browsing. This
220 will require `LDAP Password`_ below.
220 will require `LDAP Password`_ below.
221
221
222 .. _LDAP Password:
222 .. _LDAP Password:
223
223
224 Password : optional
224 Password : optional
225 Only required if the LDAP server does not allow anonymous browsing of
225 Only required if the LDAP server does not allow anonymous browsing of
226 records.
226 records.
227
227
228 .. _Enable LDAPS:
228 .. _Enable LDAPS:
229
229
230 Connection Security : required
230 Connection Security : required
231 Defines the connection to LDAP server
231 Defines the connection to LDAP server
232
232
233 No encryption
233 No encryption
234 Plain non encrypted connection
234 Plain non encrypted connection
235
235
236 LDAPS connection
236 LDAPS connection
237 Enable ldaps connection. It will likely require `Port`_ to be set to
237 Enable ldaps connection. It will likely require `Port`_ to be set to
238 a different value (standard LDAPS port is 636). When LDAPS is enabled
238 a different value (standard LDAPS port is 636). When LDAPS is enabled
239 then `Certificate Checks`_ is required.
239 then `Certificate Checks`_ is required.
240
240
241 START_TLS on LDAP connection
241 START_TLS on LDAP connection
242 START TLS connection
242 START TLS connection
243
243
244 .. _Certificate Checks:
244 .. _Certificate Checks:
245
245
246 Certificate Checks : optional
246 Certificate Checks : optional
247 How SSL certificates verification is handled - this is only useful when
247 How SSL certificates verification is handled - this is only useful when
248 `Enable LDAPS`_ is enabled. Only DEMAND or HARD offer full SSL security
248 `Enable LDAPS`_ is enabled. Only DEMAND or HARD offer full SSL security
249 while the other options are susceptible to man-in-the-middle attacks. SSL
249 while the other options are susceptible to man-in-the-middle attacks. SSL
250 certificates can be installed to /etc/openldap/cacerts so that the
250 certificates can be installed to /etc/openldap/cacerts so that the
251 DEMAND or HARD options can be used with self-signed certificates or
251 DEMAND or HARD options can be used with self-signed certificates or
252 certificates that do not have traceable certificates of authority.
252 certificates that do not have traceable certificates of authority.
253
253
254 NEVER
254 NEVER
255 A serve certificate will never be requested or checked.
255 A serve certificate will never be requested or checked.
256
256
257 ALLOW
257 ALLOW
258 A server certificate is requested. Failure to provide a
258 A server certificate is requested. Failure to provide a
259 certificate or providing a bad certificate will not terminate the
259 certificate or providing a bad certificate will not terminate the
260 session.
260 session.
261
261
262 TRY
262 TRY
263 A server certificate is requested. Failure to provide a
263 A server certificate is requested. Failure to provide a
264 certificate does not halt the session; providing a bad certificate
264 certificate does not halt the session; providing a bad certificate
265 halts the session.
265 halts the session.
266
266
267 DEMAND
267 DEMAND
268 A server certificate is requested and must be provided and
268 A server certificate is requested and must be provided and
269 authenticated for the session to proceed.
269 authenticated for the session to proceed.
270
270
271 HARD
271 HARD
272 The same as DEMAND.
272 The same as DEMAND.
273
273
274 .. _Base DN:
274 .. _Base DN:
275
275
276 Base DN : required
276 Base DN : required
277 The Distinguished Name (DN) where searches for users will be performed.
277 The Distinguished Name (DN) where searches for users will be performed.
278 Searches can be controlled by `LDAP Filter`_ and `LDAP Search Scope`_.
278 Searches can be controlled by `LDAP Filter`_ and `LDAP Search Scope`_.
279
279
280 .. _LDAP Filter:
280 .. _LDAP Filter:
281
281
282 LDAP Filter : optional
282 LDAP Filter : optional
283 A LDAP filter defined by RFC 2254. This is more useful when `LDAP
283 A LDAP filter defined by RFC 2254. This is more useful when `LDAP
284 Search Scope`_ is set to SUBTREE. The filter is useful for limiting
284 Search Scope`_ is set to SUBTREE. The filter is useful for limiting
285 which LDAP objects are identified as representing Users for
285 which LDAP objects are identified as representing Users for
286 authentication. The filter is augmented by `Login Attribute`_ below.
286 authentication. The filter is augmented by `Login Attribute`_ below.
287 This can commonly be left blank.
287 This can commonly be left blank.
288
288
289 .. _LDAP Search Scope:
289 .. _LDAP Search Scope:
290
290
291 LDAP Search Scope : required
291 LDAP Search Scope : required
292 This limits how far LDAP will search for a matching object.
292 This limits how far LDAP will search for a matching object.
293
293
294 BASE
294 BASE
295 Only allows searching of `Base DN`_ and is usually not what you
295 Only allows searching of `Base DN`_ and is usually not what you
296 want.
296 want.
297
297
298 ONELEVEL
298 ONELEVEL
299 Searches all entries under `Base DN`_, but not Base DN itself.
299 Searches all entries under `Base DN`_, but not Base DN itself.
300
300
301 SUBTREE
301 SUBTREE
302 Searches all entries below `Base DN`_, but not Base DN itself.
302 Searches all entries below `Base DN`_, but not Base DN itself.
303 When using SUBTREE `LDAP Filter`_ is useful to limit object
303 When using SUBTREE `LDAP Filter`_ is useful to limit object
304 location.
304 location.
305
305
306 .. _Login Attribute:
306 .. _Login Attribute:
307
307
308 Login Attribute : required
308 Login Attribute : required
309 The LDAP record attribute that will be matched as the USERNAME or
309 The LDAP record attribute that will be matched as the USERNAME or
310 ACCOUNT used to connect to RhodeCode. This will be added to `LDAP
310 ACCOUNT used to connect to RhodeCode. This will be added to `LDAP
311 Filter`_ for locating the User object. If `LDAP Filter`_ is specified as
311 Filter`_ for locating the User object. If `LDAP Filter`_ is specified as
312 "LDAPFILTER", `Login Attribute`_ is specified as "uid" and the user has
312 "LDAPFILTER", `Login Attribute`_ is specified as "uid" and the user has
313 connected as "jsmith" then the `LDAP Filter`_ will be augmented as below
313 connected as "jsmith" then the `LDAP Filter`_ will be augmented as below
314 ::
314 ::
315
315
316 (&(LDAPFILTER)(uid=jsmith))
316 (&(LDAPFILTER)(uid=jsmith))
317
317
318 .. _ldap_attr_firstname:
318 .. _ldap_attr_firstname:
319
319
320 First Name Attribute : required
320 First Name Attribute : required
321 The LDAP record attribute which represents the user's first name.
321 The LDAP record attribute which represents the user's first name.
322
322
323 .. _ldap_attr_lastname:
323 .. _ldap_attr_lastname:
324
324
325 Last Name Attribute : required
325 Last Name Attribute : required
326 The LDAP record attribute which represents the user's last name.
326 The LDAP record attribute which represents the user's last name.
327
327
328 .. _ldap_attr_email:
328 .. _ldap_attr_email:
329
329
330 Email Attribute : required
330 Email Attribute : required
331 The LDAP record attribute which represents the user's email address.
331 The LDAP record attribute which represents the user's email address.
332
332
333 If all data are entered correctly, and python-ldap_ is properly installed
333 If all data are entered correctly, and python-ldap_ is properly installed
334 users should be granted access to RhodeCode with ldap accounts. At this
334 users should be granted access to RhodeCode with ldap accounts. At this
335 time user information is copied from LDAP into the RhodeCode user database.
335 time user information is copied from LDAP into the RhodeCode user database.
336 This means that updates of an LDAP user object may not be reflected as a
336 This means that updates of an LDAP user object may not be reflected as a
337 user update in RhodeCode.
337 user update in RhodeCode.
338
338
339 If You have problems with LDAP access and believe You entered correct
339 If You have problems with LDAP access and believe You entered correct
340 information check out the RhodeCode logs, any error messages sent from LDAP
340 information check out the RhodeCode logs, any error messages sent from LDAP
341 will be saved there.
341 will be saved there.
342
342
343 Active Directory
343 Active Directory
344 ''''''''''''''''
344 ''''''''''''''''
345
345
346 RhodeCode can use Microsoft Active Directory for user authentication. This
346 RhodeCode can use Microsoft Active Directory for user authentication. This
347 is done through an LDAP or LDAPS connection to Active Directory. The
347 is done through an LDAP or LDAPS connection to Active Directory. The
348 following LDAP configuration settings are typical for using Active
348 following LDAP configuration settings are typical for using Active
349 Directory ::
349 Directory ::
350
350
351 Base DN = OU=SBSUsers,OU=Users,OU=MyBusiness,DC=v3sys,DC=local
351 Base DN = OU=SBSUsers,OU=Users,OU=MyBusiness,DC=v3sys,DC=local
352 Login Attribute = sAMAccountName
352 Login Attribute = sAMAccountName
353 First Name Attribute = givenName
353 First Name Attribute = givenName
354 Last Name Attribute = sn
354 Last Name Attribute = sn
355 E-mail Attribute = mail
355 E-mail Attribute = mail
356
356
357 All other LDAP settings will likely be site-specific and should be
357 All other LDAP settings will likely be site-specific and should be
358 appropriately configured.
358 appropriately configured.
359
359
360
360
361 Authentication by container or reverse-proxy
361 Authentication by container or reverse-proxy
362 --------------------------------------------
362 --------------------------------------------
363
363
364 Starting with version 1.3, RhodeCode supports delegating the authentication
364 Starting with version 1.3, RhodeCode supports delegating the authentication
365 of users to its WSGI container, or to a reverse-proxy server through which all
365 of users to its WSGI container, or to a reverse-proxy server through which all
366 clients access the application.
366 clients access the application.
367
367
368 When these authentication methods are enabled in RhodeCode, it uses the
368 When these authentication methods are enabled in RhodeCode, it uses the
369 username that the container/proxy (Apache/Nginx/etc) authenticated and doesn't
369 username that the container/proxy (Apache/Nginx/etc) authenticated and doesn't
370 perform the authentication itself. The authorization, however, is still done by
370 perform the authentication itself. The authorization, however, is still done by
371 RhodeCode according to its settings.
371 RhodeCode according to its settings.
372
372
373 When a user logs in for the first time using these authentication methods,
373 When a user logs in for the first time using these authentication methods,
374 a matching user account is created in RhodeCode with default permissions. An
374 a matching user account is created in RhodeCode with default permissions. An
375 administrator can then modify it using RhodeCode's admin interface.
375 administrator can then modify it using RhodeCode's admin interface.
376 It's also possible for an administrator to create accounts and configure their
376 It's also possible for an administrator to create accounts and configure their
377 permissions before the user logs in for the first time.
377 permissions before the user logs in for the first time.
378
378
379 Container-based authentication
379 Container-based authentication
380 ''''''''''''''''''''''''''''''
380 ''''''''''''''''''''''''''''''
381
381
382 In a container-based authentication setup, RhodeCode reads the user name from
382 In a container-based authentication setup, RhodeCode reads the user name from
383 the ``REMOTE_USER`` server variable provided by the WSGI container.
383 the ``REMOTE_USER`` server variable provided by the WSGI container.
384
384
385 After setting up your container (see `Apache's WSGI config`_), you'd need
385 After setting up your container (see `Apache's WSGI config`_), you'd need
386 to configure it to require authentication on the location configured for
386 to configure it to require authentication on the location configured for
387 RhodeCode.
387 RhodeCode.
388
388
389 In order for RhodeCode to start using the provided username, you should set the
389 In order for RhodeCode to start using the provided username, you should set the
390 following in the [app:main] section of your .ini file::
390 following in the [app:main] section of your .ini file::
391
391
392 container_auth_enabled = true
392 container_auth_enabled = true
393
393
394
394
395 Proxy pass-through authentication
395 Proxy pass-through authentication
396 '''''''''''''''''''''''''''''''''
396 '''''''''''''''''''''''''''''''''
397
397
398 In a proxy pass-through authentication setup, RhodeCode reads the user name
398 In a proxy pass-through authentication setup, RhodeCode reads the user name
399 from the ``X-Forwarded-User`` request header, which should be configured to be
399 from the ``X-Forwarded-User`` request header, which should be configured to be
400 sent by the reverse-proxy server.
400 sent by the reverse-proxy server.
401
401
402 After setting up your proxy solution (see `Apache virtual host reverse proxy example`_,
402 After setting up your proxy solution (see `Apache virtual host reverse proxy example`_,
403 `Apache as subdirectory`_ or `Nginx virtual host example`_), you'd need to
403 `Apache as subdirectory`_ or `Nginx virtual host example`_), you'd need to
404 configure the authentication and add the username in a request header named
404 configure the authentication and add the username in a request header named
405 ``X-Forwarded-User``.
405 ``X-Forwarded-User``.
406
406
407 For example, the following config section for Apache sets a subdirectory in a
407 For example, the following config section for Apache sets a subdirectory in a
408 reverse-proxy setup with basic auth::
408 reverse-proxy setup with basic auth::
409
409
410 <Location /<someprefix> >
410 <Location /<someprefix> >
411 ProxyPass http://127.0.0.1:5000/<someprefix>
411 ProxyPass http://127.0.0.1:5000/<someprefix>
412 ProxyPassReverse http://127.0.0.1:5000/<someprefix>
412 ProxyPassReverse http://127.0.0.1:5000/<someprefix>
413 SetEnvIf X-Url-Scheme https HTTPS=1
413 SetEnvIf X-Url-Scheme https HTTPS=1
414
414
415 AuthType Basic
415 AuthType Basic
416 AuthName "RhodeCode authentication"
416 AuthName "RhodeCode authentication"
417 AuthUserFile /home/web/rhodecode/.htpasswd
417 AuthUserFile /home/web/rhodecode/.htpasswd
418 require valid-user
418 require valid-user
419
419
420 RequestHeader unset X-Forwarded-User
420 RequestHeader unset X-Forwarded-User
421
421
422 RewriteEngine On
422 RewriteEngine On
423 RewriteCond %{LA-U:REMOTE_USER} (.+)
423 RewriteCond %{LA-U:REMOTE_USER} (.+)
424 RewriteRule .* - [E=RU:%1]
424 RewriteRule .* - [E=RU:%1]
425 RequestHeader set X-Forwarded-User %{RU}e
425 RequestHeader set X-Forwarded-User %{RU}e
426 </Location>
426 </Location>
427
427
428 In order for RhodeCode to start using the forwarded username, you should set
428 In order for RhodeCode to start using the forwarded username, you should set
429 the following in the [app:main] section of your .ini file::
429 the following in the [app:main] section of your .ini file::
430
430
431 proxypass_auth_enabled = true
431 proxypass_auth_enabled = true
432
432
433 .. note::
433 .. note::
434 If you enable proxy pass-through authentication, make sure your server is
434 If you enable proxy pass-through authentication, make sure your server is
435 only accessible through the proxy. Otherwise, any client would be able to
435 only accessible through the proxy. Otherwise, any client would be able to
436 forge the authentication header and could effectively become authenticated
436 forge the authentication header and could effectively become authenticated
437 using any account of their liking.
437 using any account of their liking.
438
438
439 Integration with Issue trackers
439 Integration with Issue trackers
440 -------------------------------
440 -------------------------------
441
441
442 RhodeCode provides a simple integration with issue trackers. It's possible
442 RhodeCode provides a simple integration with issue trackers. It's possible
443 to define a regular expression that will fetch issue id stored in commit
443 to define a regular expression that will fetch issue id stored in commit
444 messages and replace that with an url to this issue. To enable this simply
444 messages and replace that with an url to this issue. To enable this simply
445 uncomment following variables in the ini file::
445 uncomment following variables in the ini file::
446
446
447 url_pat = (?:^#|\s#)(\w+)
447 url_pat = (?:^#|\s#)(\w+)
448 issue_server_link = https://myissueserver.com/{repo}/issue/{id}
448 issue_server_link = https://myissueserver.com/{repo}/issue/{id}
449 issue_prefix = #
449 issue_prefix = #
450
450
451 `url_pat` is the regular expression that will fetch issues from commit messages.
451 `url_pat` is the regular expression that will fetch issues from commit messages.
452 Default regex will match issues in format of #<number> eg. #300.
452 Default regex will match issues in format of #<number> eg. #300.
453
453
454 Matched issues will be replace with the link specified as `issue_server_link`
454 Matched issues will be replace with the link specified as `issue_server_link`
455 {id} will be replaced with issue id, and {repo} with repository name.
455 {id} will be replaced with issue id, and {repo} with repository name.
456 Since the # is striped `issue_prefix` is added as a prefix to url.
456 Since the # is striped `issue_prefix` is added as a prefix to url.
457 `issue_prefix` can be something different than # if you pass
457 `issue_prefix` can be something different than # if you pass
458 ISSUE- as issue prefix this will generate an url in format::
458 ISSUE- as issue prefix this will generate an url in format::
459
459
460 <a href="https://myissueserver.com/example_repo/issue/300">ISSUE-300</a>
460 <a href="https://myissueserver.com/example_repo/issue/300">ISSUE-300</a>
461
461
462 Hook management
462 Hook management
463 ---------------
463 ---------------
464
464
465 Hooks can be managed in similar way to this used in .hgrc files.
465 Hooks can be managed in similar way to this used in .hgrc files.
466 To access hooks setting click `advanced setup` on Hooks section of Mercurial
466 To access hooks setting click `advanced setup` on Hooks section of Mercurial
467 Settings in Admin.
467 Settings in Admin.
468
468
469 There are 4 built in hooks that cannot be changed (only enable/disable by
469 There are 4 built in hooks that cannot be changed (only enable/disable by
470 checkboxes on previos section).
470 checkboxes on previos section).
471 To add another custom hook simply fill in first section with
471 To add another custom hook simply fill in first section with
472 <name>.<hook_type> and the second one with hook path. Example hooks
472 <name>.<hook_type> and the second one with hook path. Example hooks
473 can be found at *rhodecode.lib.hooks*.
473 can be found at *rhodecode.lib.hooks*.
474
474
475
475
476 Changing default encoding
476 Changing default encoding
477 -------------------------
477 -------------------------
478
478
479 By default RhodeCode uses utf8 encoding, starting from 1.3 series this
479 By default RhodeCode uses utf8 encoding, starting from 1.3 series this
480 can be changed, simply edit default_encoding in .ini file to desired one.
480 can be changed, simply edit default_encoding in .ini file to desired one.
481 This affects many parts in rhodecode including commiters names, filenames,
481 This affects many parts in rhodecode including commiters names, filenames,
482 encoding of commit messages. In addition RhodeCode can detect if `chardet`
482 encoding of commit messages. In addition RhodeCode can detect if `chardet`
483 library is installed. If `chardet` is detected RhodeCode will fallback to it
483 library is installed. If `chardet` is detected RhodeCode will fallback to it
484 when there are encode/decode errors.
484 when there are encode/decode errors.
485
485
486
486
487 Setting Up Celery
487 Setting Up Celery
488 -----------------
488 -----------------
489
489
490 Since version 1.1 celery is configured by the rhodecode ini configuration files.
490 Since version 1.1 celery is configured by the rhodecode ini configuration files.
491 Simply set use_celery=true in the ini file then add / change the configuration
491 Simply set use_celery=true in the ini file then add / change the configuration
492 variables inside the ini file.
492 variables inside the ini file.
493
493
494 Remember that the ini files use the format with '.' not with '_' like celery.
494 Remember that the ini files use the format with '.' not with '_' like celery.
495 So for example setting `BROKER_HOST` in celery means setting `broker.host` in
495 So for example setting `BROKER_HOST` in celery means setting `broker.host` in
496 the config file.
496 the config file.
497
497
498 In order to start using celery run::
498 In order to start using celery run::
499
499
500 paster celeryd <configfile.ini>
500 paster celeryd <configfile.ini>
501
501
502
502
503 .. note::
503 .. note::
504 Make sure you run this command from the same virtualenv, and with the same
504 Make sure you run this command from the same virtualenv, and with the same
505 user that rhodecode runs.
505 user that rhodecode runs.
506
506
507 HTTPS support
507 HTTPS support
508 -------------
508 -------------
509
509
510 There are two ways to enable https:
510 There are two ways to enable https:
511
511
512 - Set HTTP_X_URL_SCHEME in your http server headers, than rhodecode will
512 - Set HTTP_X_URL_SCHEME in your http server headers, than rhodecode will
513 recognize this headers and make proper https redirections
513 recognize this headers and make proper https redirections
514 - Alternatively, change the `force_https = true` flag in the ini configuration
514 - Alternatively, change the `force_https = true` flag in the ini configuration
515 to force using https, no headers are needed than to enable https
515 to force using https, no headers are needed than to enable https
516
516
517
517
518 Nginx virtual host example
518 Nginx virtual host example
519 --------------------------
519 --------------------------
520
520
521 Sample config for nginx using proxy::
521 Sample config for nginx using proxy::
522
522
523 upstream rc {
523 upstream rc {
524 server 127.0.0.1:5000;
524 server 127.0.0.1:5000;
525 # add more instances for load balancing
525 # add more instances for load balancing
526 #server 127.0.0.1:5001;
526 #server 127.0.0.1:5001;
527 #server 127.0.0.1:5002;
527 #server 127.0.0.1:5002;
528 }
528 }
529
529
530 server {
530 server {
531 listen 80;
531 listen 80;
532 server_name hg.myserver.com;
532 server_name hg.myserver.com;
533 access_log /var/log/nginx/rhodecode.access.log;
533 access_log /var/log/nginx/rhodecode.access.log;
534 error_log /var/log/nginx/rhodecode.error.log;
534 error_log /var/log/nginx/rhodecode.error.log;
535
535
536 # uncomment if you have nginx with chunking module compiled
536 # uncomment if you have nginx with chunking module compiled
537 # fixes the issues of having to put postBuffer data for large git
537 # fixes the issues of having to put postBuffer data for large git
538 # pushes
538 # pushes
539 #chunkin on;
539 #chunkin on;
540 #error_page 411 = @my_411_error;
540 #error_page 411 = @my_411_error;
541 #location @my_411_error {
541 #location @my_411_error {
542 # chunkin_resume;
542 # chunkin_resume;
543 #}
543 #}
544
544
545 # uncomment if you want to serve static files by nginx
545 # uncomment if you want to serve static files by nginx
546 #root /path/to/installation/rhodecode/public;
546 #root /path/to/installation/rhodecode/public;
547
547
548 location / {
548 location / {
549 try_files $uri @rhode;
549 try_files $uri @rhode;
550 }
550 }
551
551
552 location @rhode {
552 location @rhode {
553 proxy_pass http://rc;
553 proxy_pass http://rc;
554 include /etc/nginx/proxy.conf;
554 include /etc/nginx/proxy.conf;
555 }
555 }
556
556
557 }
557 }
558
558
559 Here's the proxy.conf. It's tuned so it will not timeout on long
559 Here's the proxy.conf. It's tuned so it will not timeout on long
560 pushes or large pushes::
560 pushes or large pushes::
561
561
562 proxy_redirect off;
562 proxy_redirect off;
563 proxy_set_header Host $host;
563 proxy_set_header Host $host;
564 proxy_set_header X-Url-Scheme $scheme;
564 proxy_set_header X-Url-Scheme $scheme;
565 proxy_set_header X-Host $http_host;
565 proxy_set_header X-Host $http_host;
566 proxy_set_header X-Real-IP $remote_addr;
566 proxy_set_header X-Real-IP $remote_addr;
567 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
567 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
568 proxy_set_header Proxy-host $proxy_host;
568 proxy_set_header Proxy-host $proxy_host;
569 client_max_body_size 400m;
569 client_max_body_size 400m;
570 client_body_buffer_size 128k;
570 client_body_buffer_size 128k;
571 proxy_buffering off;
571 proxy_buffering off;
572 proxy_connect_timeout 7200;
572 proxy_connect_timeout 7200;
573 proxy_send_timeout 7200;
573 proxy_send_timeout 7200;
574 proxy_read_timeout 7200;
574 proxy_read_timeout 7200;
575 proxy_buffers 8 32k;
575 proxy_buffers 8 32k;
576
576
577 Also, when using root path with nginx you might set the static files to false
577 Also, when using root path with nginx you might set the static files to false
578 in the production.ini file::
578 in the production.ini file::
579
579
580 [app:main]
580 [app:main]
581 use = egg:rhodecode
581 use = egg:rhodecode
582 full_stack = true
582 full_stack = true
583 static_files = false
583 static_files = false
584 lang=en
584 lang=en
585 cache_dir = %(here)s/data
585 cache_dir = %(here)s/data
586
586
587 In order to not have the statics served by the application. This improves speed.
587 In order to not have the statics served by the application. This improves speed.
588
588
589
589
590 Apache virtual host reverse proxy example
590 Apache virtual host reverse proxy example
591 -----------------------------------------
591 -----------------------------------------
592
592
593 Here is a sample configuration file for apache using proxy::
593 Here is a sample configuration file for apache using proxy::
594
594
595 <VirtualHost *:80>
595 <VirtualHost *:80>
596 ServerName hg.myserver.com
596 ServerName hg.myserver.com
597 ServerAlias hg.myserver.com
597 ServerAlias hg.myserver.com
598
598
599 <Proxy *>
599 <Proxy *>
600 Order allow,deny
600 Order allow,deny
601 Allow from all
601 Allow from all
602 </Proxy>
602 </Proxy>
603
603
604 #important !
604 #important !
605 #Directive to properly generate url (clone url) for pylons
605 #Directive to properly generate url (clone url) for pylons
606 ProxyPreserveHost On
606 ProxyPreserveHost On
607
607
608 #rhodecode instance
608 #rhodecode instance
609 ProxyPass / http://127.0.0.1:5000/
609 ProxyPass / http://127.0.0.1:5000/
610 ProxyPassReverse / http://127.0.0.1:5000/
610 ProxyPassReverse / http://127.0.0.1:5000/
611
611
612 #to enable https use line below
612 #to enable https use line below
613 #SetEnvIf X-Url-Scheme https HTTPS=1
613 #SetEnvIf X-Url-Scheme https HTTPS=1
614
614
615 </VirtualHost>
615 </VirtualHost>
616
616
617
617
618 Additional tutorial
618 Additional tutorial
619 http://wiki.pylonshq.com/display/pylonscookbook/Apache+as+a+reverse+proxy+for+Pylons
619 http://wiki.pylonshq.com/display/pylonscookbook/Apache+as+a+reverse+proxy+for+Pylons
620
620
621
621
622 Apache as subdirectory
622 Apache as subdirectory
623 ----------------------
623 ----------------------
624
624
625 Apache subdirectory part::
625 Apache subdirectory part::
626
626
627 <Location /<someprefix> >
627 <Location /<someprefix> >
628 ProxyPass http://127.0.0.1:5000/<someprefix>
628 ProxyPass http://127.0.0.1:5000/<someprefix>
629 ProxyPassReverse http://127.0.0.1:5000/<someprefix>
629 ProxyPassReverse http://127.0.0.1:5000/<someprefix>
630 SetEnvIf X-Url-Scheme https HTTPS=1
630 SetEnvIf X-Url-Scheme https HTTPS=1
631 </Location>
631 </Location>
632
632
633 Besides the regular apache setup you will need to add the following line
633 Besides the regular apache setup you will need to add the following line
634 into [app:main] section of your .ini file::
634 into [app:main] section of your .ini file::
635
635
636 filter-with = proxy-prefix
636 filter-with = proxy-prefix
637
637
638 Add the following at the end of the .ini file::
638 Add the following at the end of the .ini file::
639
639
640 [filter:proxy-prefix]
640 [filter:proxy-prefix]
641 use = egg:PasteDeploy#prefix
641 use = egg:PasteDeploy#prefix
642 prefix = /<someprefix>
642 prefix = /<someprefix>
643
643
644
644
645 then change <someprefix> into your choosen prefix
645 then change <someprefix> into your choosen prefix
646
646
647 Apache's WSGI config
647 Apache's WSGI config
648 --------------------
648 --------------------
649
649
650 Alternatively, RhodeCode can be set up with Apache under mod_wsgi. For
650 Alternatively, RhodeCode can be set up with Apache under mod_wsgi. For
651 that, you'll need to:
651 that, you'll need to:
652
652
653 - Install mod_wsgi. If using a Debian-based distro, you can install
653 - Install mod_wsgi. If using a Debian-based distro, you can install
654 the package libapache2-mod-wsgi::
654 the package libapache2-mod-wsgi::
655
655
656 aptitude install libapache2-mod-wsgi
656 aptitude install libapache2-mod-wsgi
657
657
658 - Enable mod_wsgi::
658 - Enable mod_wsgi::
659
659
660 a2enmod wsgi
660 a2enmod wsgi
661
661
662 - Create a wsgi dispatch script, like the one below. Make sure you
662 - Create a wsgi dispatch script, like the one below. Make sure you
663 check the paths correctly point to where you installed RhodeCode
663 check the paths correctly point to where you installed RhodeCode
664 and its Python Virtual Environment.
664 and its Python Virtual Environment.
665 - Enable the WSGIScriptAlias directive for the wsgi dispatch script,
665 - Enable the WSGIScriptAlias directive for the wsgi dispatch script,
666 as in the following example. Once again, check the paths are
666 as in the following example. Once again, check the paths are
667 correctly specified.
667 correctly specified.
668
668
669 Here is a sample excerpt from an Apache Virtual Host configuration file::
669 Here is a sample excerpt from an Apache Virtual Host configuration file::
670
670
671 WSGIDaemonProcess pylons \
671 WSGIDaemonProcess pylons \
672 threads=4 \
672 threads=4 \
673 python-path=/home/web/rhodecode/pyenv/lib/python2.6/site-packages
673 python-path=/home/web/rhodecode/pyenv/lib/python2.6/site-packages
674 WSGIScriptAlias / /home/web/rhodecode/dispatch.wsgi
674 WSGIScriptAlias / /home/web/rhodecode/dispatch.wsgi
675 WSGIPassAuthorization On
675 WSGIPassAuthorization On
676
676
677 .. note::
677 .. note::
678 when running apache as root please add: `user=www-data group=www-data`
678 when running apache as root please add: `user=www-data group=www-data`
679 into above configuration
679 into above configuration
680
680
681 .. note::
681 .. note::
682 RhodeCode cannot be runned in multiprocess mode in apache, make sure
682 RhodeCode cannot be runned in multiprocess mode in apache, make sure
683 you don't specify `processes=num` directive in the config
683 you don't specify `processes=num` directive in the config
684
684
685
685
686 Example wsgi dispatch script::
686 Example wsgi dispatch script::
687
687
688 import os
688 import os
689 os.environ["HGENCODING"] = "UTF-8"
689 os.environ["HGENCODING"] = "UTF-8"
690 os.environ['PYTHON_EGG_CACHE'] = '/home/web/rhodecode/.egg-cache'
690 os.environ['PYTHON_EGG_CACHE'] = '/home/web/rhodecode/.egg-cache'
691
691
692 # sometimes it's needed to set the curent dir
692 # sometimes it's needed to set the curent dir
693 os.chdir('/home/web/rhodecode/')
693 os.chdir('/home/web/rhodecode/')
694
694
695 import site
695 import site
696 site.addsitedir("/home/web/rhodecode/pyenv/lib/python2.6/site-packages")
696 site.addsitedir("/home/web/rhodecode/pyenv/lib/python2.6/site-packages")
697
697
698 from paste.deploy import loadapp
698 from paste.deploy import loadapp
699 from paste.script.util.logging_config import fileConfig
699 from paste.script.util.logging_config import fileConfig
700
700
701 fileConfig('/home/web/rhodecode/production.ini')
701 fileConfig('/home/web/rhodecode/production.ini')
702 application = loadapp('config:/home/web/rhodecode/production.ini')
702 application = loadapp('config:/home/web/rhodecode/production.ini')
703
703
704 Note: when using mod_wsgi you'll need to install the same version of
704 Note: when using mod_wsgi you'll need to install the same version of
705 Mercurial that's inside RhodeCode's virtualenv also on the system's Python
705 Mercurial that's inside RhodeCode's virtualenv also on the system's Python
706 environment.
706 environment.
707
707
708
708
709 Other configuration files
709 Other configuration files
710 -------------------------
710 -------------------------
711
711
712 Some example init.d scripts can be found in init.d directory::
712 Some example init.d scripts can be found in init.d directory::
713
713
714 https://secure.rhodecode.org/rhodecode/files/beta/init.d
714 https://secure.rhodecode.org/rhodecode/files/beta/init.d
715
715
716 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
716 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
717 .. _python: http://www.python.org/
717 .. _python: http://www.python.org/
718 .. _mercurial: http://mercurial.selenic.com/
718 .. _mercurial: http://mercurial.selenic.com/
719 .. _celery: http://celeryproject.org/
719 .. _celery: http://celeryproject.org/
720 .. _rabbitmq: http://www.rabbitmq.com/
720 .. _rabbitmq: http://www.rabbitmq.com/
721 .. _python-ldap: http://www.python-ldap.org/
721 .. _python-ldap: http://www.python-ldap.org/
722 .. _mercurial-server: http://www.lshift.net/mercurial-server.html
722 .. _mercurial-server: http://www.lshift.net/mercurial-server.html
723 .. _PublishingRepositories: http://mercurial.selenic.com/wiki/PublishingRepositories
723 .. _PublishingRepositories: http://mercurial.selenic.com/wiki/PublishingRepositories
724 .. _Issues tracker: https://bitbucket.org/marcinkuzminski/rhodecode/issues
724 .. _Issues tracker: https://bitbucket.org/marcinkuzminski/rhodecode/issues
725 .. _google group rhodecode: http://groups.google.com/group/rhodecode No newline at end of file
725 .. _google group rhodecode: http://groups.google.com/group/rhodecode
@@ -1,26 +1,26 b''
1 .. _backup:
1 .. _backup:
2
2
3 ====================
3 ====================
4 Backing up RhodeCode
4 Backing up RhodeCode
5 ====================
5 ====================
6
6
7
7
8 Settings
8 Settings
9 --------
9 --------
10
10
11 Just copy your .ini file, it contains all RhodeCode settings.
11 Just copy your .ini file, it contains all RhodeCode settings.
12
12
13 Whoosh index
13 Whoosh index
14 ------------
14 ------------
15
15
16 Whoosh index is located in **/data/index** directory where you installed
16 Whoosh index is located in **/data/index** directory where you installed
17 RhodeCode ie. the same place where the ini file is located
17 RhodeCode ie. the same place where the ini file is located
18
18
19
19
20 Database
20 Database
21 --------
21 --------
22
22
23 When using sqlite just copy rhodecode.db.
23 When using sqlite just copy rhodecode.db.
24 Any other database engine requires a manual backup operation.
24 Any other database engine requires a manual backup operation.
25
25
26 Database backup will contain all gathered statistics No newline at end of file
26 Database backup will contain all gathered statistics
@@ -1,55 +1,55 b''
1 .. _git_support:
1 .. _git_support:
2
2
3 ===========
3 ===========
4 GIT support
4 GIT support
5 ===========
5 ===========
6
6
7
7
8 Git support in RhodeCode 1.3 was enabled by default. You need to have a git
8 Git support in RhodeCode 1.3 was enabled by default. You need to have a git
9 client installed on the machine to make git fully work.
9 client installed on the machine to make git fully work.
10
10
11 Although There is one limitation on git usage.
11 Although There is one limitation on git usage.
12
12
13 - large pushes requires a http server with chunked encoding support.
13 - large pushes requires a http server with chunked encoding support.
14
14
15 if you plan to use git you need to run RhodeCode with some
15 if you plan to use git you need to run RhodeCode with some
16 http server that supports chunked encoding which git http protocol uses,
16 http server that supports chunked encoding which git http protocol uses,
17 i recommend using waitress_ or gunicorn_ (linux only) for `paste` wsgi app
17 i recommend using waitress_ or gunicorn_ (linux only) for `paste` wsgi app
18 replacement. Starting from version 1.4 waitress_ is the default wsgi server
18 replacement. Starting from version 1.4 waitress_ is the default wsgi server
19 used in RhodeCode.
19 used in RhodeCode.
20
20
21 To use, simply change change the following in the .ini file::
21 To use, simply change change the following in the .ini file::
22
22
23 use = egg:Paste#http
23 use = egg:Paste#http
24
24
25 to::
25 to::
26
26
27 use = egg:waitress#main
27 use = egg:waitress#main
28
28
29 or::
29 or::
30
30
31 use = egg:gunicorn#main
31 use = egg:gunicorn#main
32
32
33
33
34 And comment out bellow options::
34 And comment out bellow options::
35
35
36 threadpool_workers =
36 threadpool_workers =
37 threadpool_max_requests =
37 threadpool_max_requests =
38 use_threadpool =
38 use_threadpool =
39
39
40
40
41 You can simply run `paster serve` as usual.
41 You can simply run `paster serve` as usual.
42
42
43
43
44 You can always disable git/hg support by editing a
44 You can always disable git/hg support by editing a
45 file **rhodecode/__init__.py** and commenting out backends
45 file **rhodecode/__init__.py** and commenting out backends
46
46
47 .. code-block:: python
47 .. code-block:: python
48
48
49 BACKENDS = {
49 BACKENDS = {
50 'hg': 'Mercurial repository',
50 'hg': 'Mercurial repository',
51 #'git': 'Git repository',
51 #'git': 'Git repository',
52 }
52 }
53
53
54 .. _waitress: http://pypi.python.org/pypi/waitress
54 .. _waitress: http://pypi.python.org/pypi/waitress
55 .. _gunicorn: http://pypi.python.org/pypi/gunicorn No newline at end of file
55 .. _gunicorn: http://pypi.python.org/pypi/gunicorn
@@ -1,41 +1,41 b''
1 .. _locking:
1 .. _locking:
2
2
3 ===================================
3 ===================================
4 RhodeCode repository locking system
4 RhodeCode repository locking system
5 ===================================
5 ===================================
6
6
7
7
8 | Repos with **locking function=disabled** is the default, that's how repos work
8 | Repos with **locking function=disabled** is the default, that's how repos work
9 today.
9 today.
10 | Repos with **locking function=enabled** behaves like follows:
10 | Repos with **locking function=enabled** behaves like follows:
11
11
12 Repos have a state called `locked` that can be true or false.
12 Repos have a state called `locked` that can be true or false.
13 The hg/git commands `hg/git clone`, `hg/git pull`, and `hg/git push`
13 The hg/git commands `hg/git clone`, `hg/git pull`, and `hg/git push`
14 influence this state:
14 influence this state:
15
15
16 - The command `hg/git pull <repo>` will lock that repo (locked=true)
16 - The command `hg/git pull <repo>` will lock that repo (locked=true)
17 if the user has write/admin permissions on this repo
17 if the user has write/admin permissions on this repo
18
18
19 - The command `hg/git clone <repo>` will lock that repo (locked=true) if the
19 - The command `hg/git clone <repo>` will lock that repo (locked=true) if the
20 user has write/admin permissions on this repo
20 user has write/admin permissions on this repo
21
21
22
22
23 RhodeCode will remember the user id who locked the repo
23 RhodeCode will remember the user id who locked the repo
24 only this specific user can unlock the repo (locked=false) by calling
24 only this specific user can unlock the repo (locked=false) by calling
25
25
26 - `hg/git push <repo>`
26 - `hg/git push <repo>`
27
27
28 every other command on that repo from this user and
28 every other command on that repo from this user and
29 every command from any other user will result in http return code 423 (locked)
29 every command from any other user will result in http return code 423 (locked)
30
30
31
31
32 additionally the http error includes the <user> that locked the repo
32 additionally the http error includes the <user> that locked the repo
33 (e.g. β€œrepository <repo> locked by user <user>”)
33 (e.g. β€œrepository <repo> locked by user <user>”)
34
34
35
35
36 So the scenario of use for repos with `locking function` enabled is that
36 So the scenario of use for repos with `locking function` enabled is that
37 every initial clone and every pull gives users (with write permission)
37 every initial clone and every pull gives users (with write permission)
38 the exclusive right to do a push.
38 the exclusive right to do a push.
39
39
40
40
41 Each repo can be manually unlocked by admin from the repo settings menu. No newline at end of file
41 Each repo can be manually unlocked by admin from the repo settings menu.
@@ -1,50 +1,50 b''
1 .. _performance:
1 .. _performance:
2
2
3 ================================
3 ================================
4 Optimizing RhodeCode Performance
4 Optimizing RhodeCode Performance
5 ================================
5 ================================
6
6
7 When serving large amount of big repositories RhodeCode can start
7 When serving large amount of big repositories RhodeCode can start
8 performing slower than expected. Because of demanding nature of handling large
8 performing slower than expected. Because of demanding nature of handling large
9 amount of data from version control systems here are some tips how to get
9 amount of data from version control systems here are some tips how to get
10 the best performance.
10 the best performance.
11
11
12 * RhodeCode will perform better on machines with faster disks (SSD/SAN). It's
12 * RhodeCode will perform better on machines with faster disks (SSD/SAN). It's
13 more important to have faster disk than faster CPU.
13 more important to have faster disk than faster CPU.
14
14
15 * Slowness on initial page can be easily fixed by grouping repositories, and/or
15 * Slowness on initial page can be easily fixed by grouping repositories, and/or
16 increasing cache size (see below)
16 increasing cache size (see below)
17
17
18
18
19 Follow these few steps to improve performance of RhodeCode system.
19 Follow these few steps to improve performance of RhodeCode system.
20
20
21
21
22 1. Increase cache
22 1. Increase cache
23
23
24 in the .ini file::
24 in the .ini file::
25
25
26 beaker.cache.sql_cache_long.expire=3600 <-- set this to higher number
26 beaker.cache.sql_cache_long.expire=3600 <-- set this to higher number
27
27
28 This option affects the cache expiration time for main page. Having
28 This option affects the cache expiration time for main page. Having
29 few hundreds of repositories on main page can sometimes make the system
29 few hundreds of repositories on main page can sometimes make the system
30 to behave slow when cache expires for all of them. Increasing `expire`
30 to behave slow when cache expires for all of them. Increasing `expire`
31 option to day (86400) or a week (604800) will improve general response
31 option to day (86400) or a week (604800) will improve general response
32 times for the main page. RhodeCode has an intelligent cache expiration
32 times for the main page. RhodeCode has an intelligent cache expiration
33 system and it will expire cache for repositories that had been changed.
33 system and it will expire cache for repositories that had been changed.
34
34
35 2. Switch from sqlite to postgres or mysql
35 2. Switch from sqlite to postgres or mysql
36
36
37 sqlite is a good option when having small load on the system. But due to
37 sqlite is a good option when having small load on the system. But due to
38 locking issues with sqlite, it's not recommended to use it for larger
38 locking issues with sqlite, it's not recommended to use it for larger
39 setup. Switching to mysql or postgres will result in a immediate
39 setup. Switching to mysql or postgres will result in a immediate
40 performance increase.
40 performance increase.
41
41
42 3. Scale RhodeCode horizontally
42 3. Scale RhodeCode horizontally
43
43
44 - running two or more instances on the same server can speed up things a lot
44 - running two or more instances on the same server can speed up things a lot
45 - load balance using round robin or ip hash
45 - load balance using round robin or ip hash
46 - you need to handle consistent user session storage by switching to
46 - you need to handle consistent user session storage by switching to
47 db sessions, client side sessions or sharing session data folder across
47 db sessions, client side sessions or sharing session data folder across
48 instances. See http://beaker.readthedocs.org/ docs for details.
48 instances. See http://beaker.readthedocs.org/ docs for details.
49 - remember that each instance needs it's own .ini file and unique
49 - remember that each instance needs it's own .ini file and unique
50 `instance_id` set in them No newline at end of file
50 `instance_id` set in them
@@ -1,37 +1,37 b''
1 .. _subrepos:
1 .. _subrepos:
2
2
3 =============================================
3 =============================================
4 working with RhodeCode and mercurial subrepos
4 working with RhodeCode and mercurial subrepos
5 =============================================
5 =============================================
6
6
7 example usage of Subrepos with RhodeCode::
7 example usage of Subrepos with RhodeCode::
8
8
9 ## init a simple repo
9 ## init a simple repo
10 hg init repo1
10 hg init repo1
11 cd repo1
11 cd repo1
12 echo "file1" > file1
12 echo "file1" > file1
13 hg add file1
13 hg add file1
14 hg ci --message "initial file 1"
14 hg ci --message "initial file 1"
15
15
16 #clone subrepo we want to add
16 #clone subrepo we want to add
17 hg clone http://rc.local/subrepo
17 hg clone http://rc.local/subrepo
18
18
19 ## use path like url to existing repo in RhodeCode
19 ## use path like url to existing repo in RhodeCode
20 echo "subrepo = http://rc.local/subrepo" > .hgsub
20 echo "subrepo = http://rc.local/subrepo" > .hgsub
21
21
22 hg add .hgsub
22 hg add .hgsub
23 hg ci --message "added remote subrepo"
23 hg ci --message "added remote subrepo"
24
24
25
25
26
26
27 In file list of repo1 you will see a connected subrepo at revision it was
27 In file list of repo1 you will see a connected subrepo at revision it was
28 during cloning.
28 during cloning.
29 Clicking in subrepos link should send you to proper repository in RhodeCode
29 Clicking in subrepos link should send you to proper repository in RhodeCode
30
30
31 cloning repo1 will also clone attached subrepository.
31 cloning repo1 will also clone attached subrepository.
32
32
33 Next we can edit the subrepo data, and push back to RhodeCode. This will update
33 Next we can edit the subrepo data, and push back to RhodeCode. This will update
34 both of repositories.
34 both of repositories.
35
35
36 see http://mercurial.aragost.com/kick-start/en/subrepositories/ for more
36 see http://mercurial.aragost.com/kick-start/en/subrepositories/ for more
37 information about subrepositories No newline at end of file
37 information about subrepositories
@@ -1,70 +1,70 b''
1 .. _troubleshooting:
1 .. _troubleshooting:
2
2
3
3
4 ===============
4 ===============
5 Troubleshooting
5 Troubleshooting
6 ===============
6 ===============
7
7
8 :Q: **Missing static files?**
8 :Q: **Missing static files?**
9 :A: Make sure either to set the `static_files = true` in the .ini file or
9 :A: Make sure either to set the `static_files = true` in the .ini file or
10 double check the root path for your http setup. It should point to
10 double check the root path for your http setup. It should point to
11 for example:
11 for example:
12 /home/my-virtual-python/lib/python2.6/site-packages/rhodecode/public
12 /home/my-virtual-python/lib/python2.6/site-packages/rhodecode/public
13
13
14 |
14 |
15
15
16 :Q: **Can't install celery/rabbitmq?**
16 :Q: **Can't install celery/rabbitmq?**
17 :A: Don't worry RhodeCode works without them too. No extra setup is required.
17 :A: Don't worry RhodeCode works without them too. No extra setup is required.
18 Try out great celery docs for further help.
18 Try out great celery docs for further help.
19
19
20 |
20 |
21
21
22 :Q: **Long lasting push timeouts?**
22 :Q: **Long lasting push timeouts?**
23 :A: Make sure you set a longer timeouts in your proxy/fcgi settings, timeouts
23 :A: Make sure you set a longer timeouts in your proxy/fcgi settings, timeouts
24 are caused by https server and not RhodeCode.
24 are caused by https server and not RhodeCode.
25
25
26 |
26 |
27
27
28 :Q: **Large pushes timeouts?**
28 :Q: **Large pushes timeouts?**
29 :A: Make sure you set a proper max_body_size for the http server. Very often
29 :A: Make sure you set a proper max_body_size for the http server. Very often
30 Apache, Nginx or other http servers kill the connection due to to large
30 Apache, Nginx or other http servers kill the connection due to to large
31 body.
31 body.
32
32
33 |
33 |
34
34
35 :Q: **Apache doesn't pass basicAuth on pull/push?**
35 :Q: **Apache doesn't pass basicAuth on pull/push?**
36 :A: Make sure you added `WSGIPassAuthorization true`.
36 :A: Make sure you added `WSGIPassAuthorization true`.
37
37
38 |
38 |
39
39
40 :Q: **Git fails on push/pull?**
40 :Q: **Git fails on push/pull?**
41 :A: Make sure you're using an wsgi http server that can handle chunked encoding
41 :A: Make sure you're using an wsgi http server that can handle chunked encoding
42 such as `waitress` or `gunicorn`
42 such as `waitress` or `gunicorn`
43
43
44 |
44 |
45
45
46 :Q: **How i use hooks in RhodeCode?**
46 :Q: **How i use hooks in RhodeCode?**
47 :A: It's easy if they are python hooks just use advanced link in hooks section
47 :A: It's easy if they are python hooks just use advanced link in hooks section
48 in Admin panel, that works only for Mercurial. If you want to use githooks,
48 in Admin panel, that works only for Mercurial. If you want to use githooks,
49 just install proper one in repository eg. create file in
49 just install proper one in repository eg. create file in
50 `/gitrepo/hooks/pre-receive`. You can also use RhodeCode-extensions to
50 `/gitrepo/hooks/pre-receive`. You can also use RhodeCode-extensions to
51 connect to callback hooks, for both Git and Mercurial.
51 connect to callback hooks, for both Git and Mercurial.
52
52
53 |
53 |
54
54
55 :Q: **RhodeCode is slow for me, how can i make it faster?**
55 :Q: **RhodeCode is slow for me, how can i make it faster?**
56 :A: See the :ref:`performance` section
56 :A: See the :ref:`performance` section
57
57
58 For further questions search the `Issues tracker`_, or post a message in the
58 For further questions search the `Issues tracker`_, or post a message in the
59 `google group rhodecode`_
59 `google group rhodecode`_
60
60
61 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
61 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
62 .. _python: http://www.python.org/
62 .. _python: http://www.python.org/
63 .. _mercurial: http://mercurial.selenic.com/
63 .. _mercurial: http://mercurial.selenic.com/
64 .. _celery: http://celeryproject.org/
64 .. _celery: http://celeryproject.org/
65 .. _rabbitmq: http://www.rabbitmq.com/
65 .. _rabbitmq: http://www.rabbitmq.com/
66 .. _python-ldap: http://www.python-ldap.org/
66 .. _python-ldap: http://www.python-ldap.org/
67 .. _mercurial-server: http://www.lshift.net/mercurial-server.html
67 .. _mercurial-server: http://www.lshift.net/mercurial-server.html
68 .. _PublishingRepositories: http://mercurial.selenic.com/wiki/PublishingRepositories
68 .. _PublishingRepositories: http://mercurial.selenic.com/wiki/PublishingRepositories
69 .. _Issues tracker: https://bitbucket.org/marcinkuzminski/rhodecode/issues
69 .. _Issues tracker: https://bitbucket.org/marcinkuzminski/rhodecode/issues
70 .. _google group rhodecode: http://groups.google.com/group/rhodecode No newline at end of file
70 .. _google group rhodecode: http://groups.google.com/group/rhodecode
General Comments 0
You need to be logged in to leave comments. Login now