##// END OF EJS Templates
release: Merge default into stable for release preparation
marcink -
r655:3c0cb104 merge stable
parent child Browse files
Show More

The requested changes are too big and content was truncated. Show full diff

@@ -0,0 +1,6 b''
1 {% extends "!footer.html" %}
2
3 {% block extrafooter %}
4 <br/>
5 Documentation defects and suggestions can be submitted <a href="https://issues.rhodecode.com/projects/documentation">here</a>
6 {% endblock %}
@@ -0,0 +1,77 b''
1 .. _deprecated-methods-ref:
2
3 deprecated methods
4 =================
5
6 changeset_comment
7 -----------------
8
9 .. py:function:: changeset_comment(apiuser, repoid, revision, message, userid=<Optional:<OptionalAttr:apiuser>>, status=<Optional:None>)
10
11 .. deprecated:: 3.4.0
12
13 Please use method `comment_commit` instead.
14
15
16 Set a changeset comment, and optionally change the status of the
17 changeset.
18
19 This command can only be run using an |authtoken| with admin
20 permissions on the |repo|.
21
22 :param apiuser: This is filled automatically from the |authtoken|.
23 :type apiuser: AuthUser
24 :param repoid: Set the repository name or repository ID.
25 :type repoid: str or int
26 :param revision: Specify the revision for which to set a comment.
27 :type revision: str
28 :param message: The comment text.
29 :type message: str
30 :param userid: Set the user name of the comment creator.
31 :type userid: Optional(str or int)
32 :param status: Set the comment status. The following are valid options:
33 * not_reviewed
34 * approved
35 * rejected
36 * under_review
37 :type status: str
38
39 Example error output:
40
41 .. code-block:: json
42
43 {
44 "id" : <id_given_in_input>,
45 "result" : {
46 "msg": "Commented on commit `<revision>` for repository `<repoid>`",
47 "status_change": null or <status>,
48 "success": true
49 },
50 "error" : null
51 }
52
53
54 get_locks
55 ---------
56
57 .. py:function:: get_locks(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
58
59 .. deprecated:: 4.0.0
60
61 Please use method `get_user_locks` instead.
62
63 None
64
65
66 show_ip
67 -------
68
69 .. py:function:: show_ip(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
70
71 .. deprecated:: 4.0.0
72
73 Please use method `get_ip` instead.
74
75 None
76
77
@@ -0,0 +1,121 b''
1 .. _gist-methods-ref:
2
3 gist methods
4 =================
5
6 create_gist
7 -----------
8
9 .. py:function:: create_gist(apiuser, files, gistid=<Optional:None>, owner=<Optional:<OptionalAttr:apiuser>>, gist_type=<Optional:u'public'>, lifetime=<Optional:-1>, acl_level=<Optional:u'acl_public'>, description=<Optional:''>)
10
11 Creates a new Gist.
12
13 :param apiuser: This is filled automatically from the |authtoken|.
14 :type apiuser: AuthUser
15 :param files: files to be added to the gist. The data structure has
16 to match the following example::
17
18 {'filename1': {'content':'...'}, 'filename2': {'content':'...'}}
19
20 :type files: dict
21 :param gistid: Set a custom id for the gist
22 :type gistid: Optional(str)
23 :param owner: Set the gist owner, defaults to api method caller
24 :type owner: Optional(str or int)
25 :param gist_type: type of gist ``public`` or ``private``
26 :type gist_type: Optional(str)
27 :param lifetime: time in minutes of gist lifetime
28 :type lifetime: Optional(int)
29 :param acl_level: acl level for this gist, can be
30 ``acl_public`` or ``acl_private`` If the value is set to
31 ``acl_private`` only logged in users are able to access this gist.
32 If not set it defaults to ``acl_public``.
33 :type acl_level: Optional(str)
34 :param description: gist description
35 :type description: Optional(str)
36
37 Example output:
38
39 .. code-block:: bash
40
41 id : <id_given_in_input>
42 result : {
43 "msg": "created new gist",
44 "gist": {}
45 }
46 error : null
47
48 Example error output:
49
50 .. code-block:: bash
51
52 id : <id_given_in_input>
53 result : null
54 error : {
55 "failed to create gist"
56 }
57
58
59 delete_gist
60 -----------
61
62 .. py:function:: delete_gist(apiuser, gistid)
63
64 Deletes existing gist
65
66 :param apiuser: filled automatically from apikey
67 :type apiuser: AuthUser
68 :param gistid: id of gist to delete
69 :type gistid: str
70
71 Example output:
72
73 .. code-block:: bash
74
75 id : <id_given_in_input>
76 result : {
77 "deleted gist ID: <gist_id>",
78 "gist": null
79 }
80 error : null
81
82 Example error output:
83
84 .. code-block:: bash
85
86 id : <id_given_in_input>
87 result : null
88 error : {
89 "failed to delete gist ID:<gist_id>"
90 }
91
92
93 get_gist
94 --------
95
96 .. py:function:: get_gist(apiuser, gistid, content=<Optional:False>)
97
98 Get the specified gist, based on the gist ID.
99
100 :param apiuser: This is filled automatically from the |authtoken|.
101 :type apiuser: AuthUser
102 :param gistid: Set the id of the private or public gist
103 :type gistid: str
104 :param content: Return the gist content. Default is false.
105 :type content: Optional(bool)
106
107
108 get_gists
109 ---------
110
111 .. py:function:: get_gists(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
112
113 Get all gists for given user. If userid is empty returned gists
114 are for user who called the api
115
116 :param apiuser: This is filled automatically from the |authtoken|.
117 :type apiuser: AuthUser
118 :param userid: user to get gists for
119 :type userid: Optional(str or int)
120
121
@@ -0,0 +1,71 b''
1 .. _license-methods-ref:
2
3 license methods
4 =================
5
6 get_license_info (EE only)
7 ----------------
8
9 .. py:function:: get_license_info(apiuser)
10
11 Returns the |RCE| license information.
12
13 :param apiuser: This is filled automatically from the |authtoken|.
14 :type apiuser: AuthUser
15
16 Example output:
17
18 .. code-block:: bash
19
20 id : <id_given_in_input>
21 result : {
22 'rhodecode_version': <rhodecode version>,
23 'token': <license token>,
24 'issued_to': <license owner>,
25 'issued_on': <license issue date>,
26 'expires_on': <license expiration date>,
27 'type': <license type>,
28 'users_limit': <license users limit>,
29 'key': <license key>
30 }
31 error : null
32
33
34 set_license_key (EE only)
35 ---------------
36
37 .. py:function:: set_license_key(apiuser, key)
38
39 Sets the |RCE| license key.
40
41 :param apiuser: This is filled automatically from the |authtoken|.
42 :type apiuser: AuthUser
43 :param key: This is the license key to be set.
44 :type key: str
45
46 Example output:
47
48 .. code-block:: bash
49
50 id : <id_given_in_input>
51 result: {
52 "msg" : "updated license information",
53 "key": <key>
54 }
55 error: null
56
57 Example error output:
58
59 .. code-block:: bash
60
61 id : <id_given_in_input>
62 result : null
63 error : {
64 "license key is not valid"
65 or
66 "trial licenses cannot be uploaded"
67 or
68 "error occurred while updating license"
69 }
70
71
@@ -0,0 +1,344 b''
1 .. _pull-request-methods-ref:
2
3 pull_request methods
4 =================
5
6 close_pull_request
7 ------------------
8
9 .. py:function:: close_pull_request(apiuser, repoid, pullrequestid, userid=<Optional:<OptionalAttr:apiuser>>)
10
11 Close the pull request specified by `pullrequestid`.
12
13 :param apiuser: This is filled automatically from the |authtoken|.
14 :type apiuser: AuthUser
15 :param repoid: Repository name or repository ID to which the pull
16 request belongs.
17 :type repoid: str or int
18 :param pullrequestid: ID of the pull request to be closed.
19 :type pullrequestid: int
20 :param userid: Close the pull request as this user.
21 :type userid: Optional(str or int)
22
23 Example output:
24
25 .. code-block:: bash
26
27 "id": <id_given_in_input>,
28 "result":
29 {
30 "pull_request_id": "<int>",
31 "closed": "<bool>"
32 },
33 "error": null
34
35
36 comment_pull_request
37 --------------------
38
39 .. py:function:: comment_pull_request(apiuser, repoid, pullrequestid, message=<Optional:None>, status=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
40
41 Comment on the pull request specified with the `pullrequestid`,
42 in the |repo| specified by the `repoid`, and optionally change the
43 review status.
44
45 :param apiuser: This is filled automatically from the |authtoken|.
46 :type apiuser: AuthUser
47 :param repoid: The repository name or repository ID.
48 :type repoid: str or int
49 :param pullrequestid: The pull request ID.
50 :type pullrequestid: int
51 :param message: The text content of the comment.
52 :type message: str
53 :param status: (**Optional**) Set the approval status of the pull
54 request. Valid options are:
55 * not_reviewed
56 * approved
57 * rejected
58 * under_review
59 :type status: str
60 :param userid: Comment on the pull request as this user
61 :type userid: Optional(str or int)
62
63 Example output:
64
65 .. code-block:: bash
66
67 id : <id_given_in_input>
68 result :
69 {
70 "pull_request_id": "<Integer>",
71 "comment_id": "<Integer>"
72 }
73 error : null
74
75
76 create_pull_request
77 -------------------
78
79 .. py:function:: create_pull_request(apiuser, source_repo, target_repo, source_ref, target_ref, title, description=<Optional:''>, reviewers=<Optional:None>)
80
81 Creates a new pull request.
82
83 Accepts refs in the following formats:
84
85 * branch:<branch_name>:<sha>
86 * branch:<branch_name>
87 * bookmark:<bookmark_name>:<sha> (Mercurial only)
88 * bookmark:<bookmark_name> (Mercurial only)
89
90 :param apiuser: This is filled automatically from the |authtoken|.
91 :type apiuser: AuthUser
92 :param source_repo: Set the source repository name.
93 :type source_repo: str
94 :param target_repo: Set the target repository name.
95 :type target_repo: str
96 :param source_ref: Set the source ref name.
97 :type source_ref: str
98 :param target_ref: Set the target ref name.
99 :type target_ref: str
100 :param title: Set the pull request title.
101 :type title: str
102 :param description: Set the pull request description.
103 :type description: Optional(str)
104 :param reviewers: Set the new pull request reviewers list.
105 :type reviewers: Optional(list)
106
107
108 get_pull_request
109 ----------------
110
111 .. py:function:: get_pull_request(apiuser, repoid, pullrequestid)
112
113 Get a pull request based on the given ID.
114
115 :param apiuser: This is filled automatically from the |authtoken|.
116 :type apiuser: AuthUser
117 :param repoid: Repository name or repository ID from where the pull
118 request was opened.
119 :type repoid: str or int
120 :param pullrequestid: ID of the requested pull request.
121 :type pullrequestid: int
122
123 Example output:
124
125 .. code-block:: bash
126
127 "id": <id_given_in_input>,
128 "result":
129 {
130 "pull_request_id": "<pull_request_id>",
131 "url": "<url>",
132 "title": "<title>",
133 "description": "<description>",
134 "status" : "<status>",
135 "created_on": "<date_time_created>",
136 "updated_on": "<date_time_updated>",
137 "commit_ids": [
138 ...
139 "<commit_id>",
140 "<commit_id>",
141 ...
142 ],
143 "review_status": "<review_status>",
144 "mergeable": {
145 "status": "<bool>",
146 "message": "<message>",
147 },
148 "source": {
149 "clone_url": "<clone_url>",
150 "repository": "<repository_name>",
151 "reference":
152 {
153 "name": "<name>",
154 "type": "<type>",
155 "commit_id": "<commit_id>",
156 }
157 },
158 "target": {
159 "clone_url": "<clone_url>",
160 "repository": "<repository_name>",
161 "reference":
162 {
163 "name": "<name>",
164 "type": "<type>",
165 "commit_id": "<commit_id>",
166 }
167 },
168 "author": <user_obj>,
169 "reviewers": [
170 ...
171 {
172 "user": "<user_obj>",
173 "review_status": "<review_status>",
174 }
175 ...
176 ]
177 },
178 "error": null
179
180
181 get_pull_requests
182 -----------------
183
184 .. py:function:: get_pull_requests(apiuser, repoid, status=<Optional:'new'>)
185
186 Get all pull requests from the repository specified in `repoid`.
187
188 :param apiuser: This is filled automatically from the |authtoken|.
189 :type apiuser: AuthUser
190 :param repoid: Repository name or repository ID.
191 :type repoid: str or int
192 :param status: Only return pull requests with the specified status.
193 Valid options are.
194 * ``new`` (default)
195 * ``open``
196 * ``closed``
197 :type status: str
198
199 Example output:
200
201 .. code-block:: bash
202
203 "id": <id_given_in_input>,
204 "result":
205 [
206 ...
207 {
208 "pull_request_id": "<pull_request_id>",
209 "url": "<url>",
210 "title" : "<title>",
211 "description": "<description>",
212 "status": "<status>",
213 "created_on": "<date_time_created>",
214 "updated_on": "<date_time_updated>",
215 "commit_ids": [
216 ...
217 "<commit_id>",
218 "<commit_id>",
219 ...
220 ],
221 "review_status": "<review_status>",
222 "mergeable": {
223 "status": "<bool>",
224 "message: "<message>",
225 },
226 "source": {
227 "clone_url": "<clone_url>",
228 "reference":
229 {
230 "name": "<name>",
231 "type": "<type>",
232 "commit_id": "<commit_id>",
233 }
234 },
235 "target": {
236 "clone_url": "<clone_url>",
237 "reference":
238 {
239 "name": "<name>",
240 "type": "<type>",
241 "commit_id": "<commit_id>",
242 }
243 },
244 "author": <user_obj>,
245 "reviewers": [
246 ...
247 {
248 "user": "<user_obj>",
249 "review_status": "<review_status>",
250 }
251 ...
252 ]
253 }
254 ...
255 ],
256 "error": null
257
258
259 merge_pull_request
260 ------------------
261
262 .. py:function:: merge_pull_request(apiuser, repoid, pullrequestid, userid=<Optional:<OptionalAttr:apiuser>>)
263
264 Merge the pull request specified by `pullrequestid` into its target
265 repository.
266
267 :param apiuser: This is filled automatically from the |authtoken|.
268 :type apiuser: AuthUser
269 :param repoid: The Repository name or repository ID of the
270 target repository to which the |pr| is to be merged.
271 :type repoid: str or int
272 :param pullrequestid: ID of the pull request which shall be merged.
273 :type pullrequestid: int
274 :param userid: Merge the pull request as this user.
275 :type userid: Optional(str or int)
276
277 Example output:
278
279 .. code-block:: bash
280
281 "id": <id_given_in_input>,
282 "result":
283 {
284 "executed": "<bool>",
285 "failure_reason": "<int>",
286 "merge_commit_id": "<merge_commit_id>",
287 "possible": "<bool>"
288 },
289 "error": null
290
291
292 update_pull_request
293 -------------------
294
295 .. py:function:: update_pull_request(apiuser, repoid, pullrequestid, title=<Optional:''>, description=<Optional:''>, reviewers=<Optional:None>, update_commits=<Optional:None>, close_pull_request=<Optional:None>)
296
297 Updates a pull request.
298
299 :param apiuser: This is filled automatically from the |authtoken|.
300 :type apiuser: AuthUser
301 :param repoid: The repository name or repository ID.
302 :type repoid: str or int
303 :param pullrequestid: The pull request ID.
304 :type pullrequestid: int
305 :param title: Set the pull request title.
306 :type title: str
307 :param description: Update pull request description.
308 :type description: Optional(str)
309 :param reviewers: Update pull request reviewers list with new value.
310 :type reviewers: Optional(list)
311 :param update_commits: Trigger update of commits for this pull request
312 :type: update_commits: Optional(bool)
313 :param close_pull_request: Close this pull request with rejected state
314 :type: close_pull_request: Optional(bool)
315
316 Example output:
317
318 .. code-block:: bash
319
320 id : <id_given_in_input>
321 result :
322 {
323 "msg": "Updated pull request `63`",
324 "pull_request": <pull_request_object>,
325 "updated_reviewers": {
326 "added": [
327 "username"
328 ],
329 "removed": []
330 },
331 "updated_commits": {
332 "added": [
333 "<sha1_hash>"
334 ],
335 "common": [
336 "<sha1_hash>",
337 "<sha1_hash>",
338 ],
339 "removed": []
340 }
341 }
342 error : null
343
344
@@ -0,0 +1,350 b''
1 .. _repo-group-methods-ref:
2
3 repo_group methods
4 =================
5
6 create_repo_group
7 -----------------
8
9 .. py:function:: create_repo_group(apiuser, group_name, description=<Optional:''>, owner=<Optional:<OptionalAttr:apiuser>>, copy_permissions=<Optional:False>)
10
11 Creates a repository group.
12
13 * If the repository group name contains "/", all the required repository
14 groups will be created.
15
16 For example "foo/bar/baz" will create |repo| groups "foo" and "bar"
17 (with "foo" as parent). It will also create the "baz" repository
18 with "bar" as |repo| group.
19
20 This command can only be run using an |authtoken| with admin
21 permissions.
22
23 :param apiuser: This is filled automatically from the |authtoken|.
24 :type apiuser: AuthUser
25 :param group_name: Set the repository group name.
26 :type group_name: str
27 :param description: Set the |repo| group description.
28 :type description: str
29 :param owner: Set the |repo| group owner.
30 :type owner: str
31 :param copy_permissions:
32 :type copy_permissions:
33
34 Example output:
35
36 .. code-block:: bash
37
38 id : <id_given_in_input>
39 result : {
40 "msg": "Created new repo group `<repo_group_name>`"
41 "repo_group": <repogroup_object>
42 }
43 error : null
44
45
46 Example error output:
47
48 .. code-block:: bash
49
50 id : <id_given_in_input>
51 result : null
52 error : {
53 failed to create repo group `<repogroupid>`
54 }
55
56
57 delete_repo_group
58 -----------------
59
60 .. py:function:: delete_repo_group(apiuser, repogroupid)
61
62 Deletes a |repo| group.
63
64 :param apiuser: This is filled automatically from the |authtoken|.
65 :type apiuser: AuthUser
66 :param repogroupid: Set the name or ID of repository group to be
67 deleted.
68 :type repogroupid: str or int
69
70 Example output:
71
72 .. code-block:: bash
73
74 id : <id_given_in_input>
75 result : {
76 'msg': 'deleted repo group ID:<repogroupid> <repogroupname>
77 'repo_group': null
78 }
79 error : null
80
81 Example error output:
82
83 .. code-block:: bash
84
85 id : <id_given_in_input>
86 result : null
87 error : {
88 "failed to delete repo group ID:<repogroupid> <repogroupname>"
89 }
90
91
92 get_repo_group
93 --------------
94
95 .. py:function:: get_repo_group(apiuser, repogroupid)
96
97 Return the specified |repo| group, along with permissions,
98 and repositories inside the group
99
100 :param apiuser: This is filled automatically from the |authtoken|.
101 :type apiuser: AuthUser
102 :param repogroupid: Specify the name of ID of the repository group.
103 :type repogroupid: str or int
104
105
106 Example output:
107
108 .. code-block:: bash
109
110 {
111 "error": null,
112 "id": repo-group-id,
113 "result": {
114 "group_description": "repo group description",
115 "group_id": 14,
116 "group_name": "group name",
117 "members": [
118 {
119 "name": "super-admin-username",
120 "origin": "super-admin",
121 "permission": "group.admin",
122 "type": "user"
123 },
124 {
125 "name": "owner-name",
126 "origin": "owner",
127 "permission": "group.admin",
128 "type": "user"
129 },
130 {
131 "name": "user-group-name",
132 "origin": "permission",
133 "permission": "group.write",
134 "type": "user_group"
135 }
136 ],
137 "owner": "owner-name",
138 "parent_group": null,
139 "repositories": [ repo-list ]
140 }
141 }
142
143
144 get_repo_groups
145 ---------------
146
147 .. py:function:: get_repo_groups(apiuser)
148
149 Returns all repository groups.
150
151 :param apiuser: This is filled automatically from the |authtoken|.
152 :type apiuser: AuthUser
153
154
155 grant_user_group_permission_to_repo_group
156 -----------------------------------------
157
158 .. py:function:: grant_user_group_permission_to_repo_group(apiuser, repogroupid, usergroupid, perm, apply_to_children=<Optional:'none'>)
159
160 Grant permission for a user group on given repository group, or update
161 existing permissions if found.
162
163 This command can only be run using an |authtoken| with admin
164 permissions on the |repo| group.
165
166 :param apiuser: This is filled automatically from the |authtoken|.
167 :type apiuser: AuthUser
168 :param repogroupid: Set the name or id of repository group
169 :type repogroupid: str or int
170 :param usergroupid: id of usergroup
171 :type usergroupid: str or int
172 :param perm: (group.(none|read|write|admin))
173 :type perm: str
174 :param apply_to_children: 'none', 'repos', 'groups', 'all'
175 :type apply_to_children: str
176
177 Example output:
178
179 .. code-block:: bash
180
181 id : <id_given_in_input>
182 result : {
183 "msg" : "Granted perm: `<perm>` (recursive:<apply_to_children>) for user group: `<usersgroupname>` in repo group: `<repo_group_name>`",
184 "success": true
185
186 }
187 error : null
188
189 Example error output:
190
191 .. code-block:: bash
192
193 id : <id_given_in_input>
194 result : null
195 error : {
196 "failed to edit permission for user group: `<usergroup>` in repo group: `<repo_group_name>`"
197 }
198
199
200 grant_user_permission_to_repo_group
201 -----------------------------------
202
203 .. py:function:: grant_user_permission_to_repo_group(apiuser, repogroupid, userid, perm, apply_to_children=<Optional:'none'>)
204
205 Grant permission for a user on the given repository group, or update
206 existing permissions if found.
207
208 This command can only be run using an |authtoken| with admin
209 permissions.
210
211 :param apiuser: This is filled automatically from the |authtoken|.
212 :type apiuser: AuthUser
213 :param repogroupid: Set the name or ID of repository group.
214 :type repogroupid: str or int
215 :param userid: Set the user name.
216 :type userid: str
217 :param perm: (group.(none|read|write|admin))
218 :type perm: str
219 :param apply_to_children: 'none', 'repos', 'groups', 'all'
220 :type apply_to_children: str
221
222 Example output:
223
224 .. code-block:: bash
225
226 id : <id_given_in_input>
227 result: {
228 "msg" : "Granted perm: `<perm>` (recursive:<apply_to_children>) for user: `<username>` in repo group: `<repo_group_name>`",
229 "success": true
230 }
231 error: null
232
233 Example error output:
234
235 .. code-block:: bash
236
237 id : <id_given_in_input>
238 result : null
239 error : {
240 "failed to edit permission for user: `<userid>` in repo group: `<repo_group_name>`"
241 }
242
243
244 revoke_user_group_permission_from_repo_group
245 --------------------------------------------
246
247 .. py:function:: revoke_user_group_permission_from_repo_group(apiuser, repogroupid, usergroupid, apply_to_children=<Optional:'none'>)
248
249 Revoke permission for user group on given repository.
250
251 This command can only be run using an |authtoken| with admin
252 permissions on the |repo| group.
253
254 :param apiuser: This is filled automatically from the |authtoken|.
255 :type apiuser: AuthUser
256 :param repogroupid: name or id of repository group
257 :type repogroupid: str or int
258 :param usergroupid:
259 :param apply_to_children: 'none', 'repos', 'groups', 'all'
260 :type apply_to_children: str
261
262 Example output:
263
264 .. code-block:: bash
265
266 id : <id_given_in_input>
267 result: {
268 "msg" : "Revoked perm (recursive:<apply_to_children>) for user group: `<usersgroupname>` in repo group: `<repo_group_name>`",
269 "success": true
270 }
271 error: null
272
273 Example error output:
274
275 .. code-block:: bash
276
277 id : <id_given_in_input>
278 result : null
279 error : {
280 "failed to edit permission for user group: `<usergroup>` in repo group: `<repo_group_name>`"
281 }
282
283
284 revoke_user_permission_from_repo_group
285 --------------------------------------
286
287 .. py:function:: revoke_user_permission_from_repo_group(apiuser, repogroupid, userid, apply_to_children=<Optional:'none'>)
288
289 Revoke permission for a user in a given repository group.
290
291 This command can only be run using an |authtoken| with admin
292 permissions on the |repo| group.
293
294 :param apiuser: This is filled automatically from the |authtoken|.
295 :type apiuser: AuthUser
296 :param repogroupid: Set the name or ID of the repository group.
297 :type repogroupid: str or int
298 :param userid: Set the user name to revoke.
299 :type userid: str
300 :param apply_to_children: 'none', 'repos', 'groups', 'all'
301 :type apply_to_children: str
302
303 Example output:
304
305 .. code-block:: bash
306
307 id : <id_given_in_input>
308 result: {
309 "msg" : "Revoked perm (recursive:<apply_to_children>) for user: `<username>` in repo group: `<repo_group_name>`",
310 "success": true
311 }
312 error: null
313
314 Example error output:
315
316 .. code-block:: bash
317
318 id : <id_given_in_input>
319 result : null
320 error : {
321 "failed to edit permission for user: `<userid>` in repo group: `<repo_group_name>`"
322 }
323
324
325 update_repo_group
326 -----------------
327
328 .. py:function:: update_repo_group(apiuser, repogroupid, group_name=<Optional:''>, description=<Optional:''>, owner=<Optional:<OptionalAttr:apiuser>>, parent=<Optional:None>, enable_locking=<Optional:False>)
329
330 Updates repository group with the details given.
331
332 This command can only be run using an |authtoken| with admin
333 permissions.
334
335 :param apiuser: This is filled automatically from the |authtoken|.
336 :type apiuser: AuthUser
337 :param repogroupid: Set the ID of repository group.
338 :type repogroupid: str or int
339 :param group_name: Set the name of the |repo| group.
340 :type group_name: str
341 :param description: Set a description for the group.
342 :type description: str
343 :param owner: Set the |repo| group owner.
344 :type owner: str
345 :param parent: Set the |repo| group parent.
346 :type parent: str or int
347 :param enable_locking: Enable |repo| locking. The default is false.
348 :type enable_locking: bool
349
350
This diff has been collapsed as it changes many lines, (967 lines changed) Show them Hide them
@@ -0,0 +1,967 b''
1 .. _repo-methods-ref:
2
3 repo methods
4 =================
5
6 add_field_to_repo
7 -----------------
8
9 .. py:function:: add_field_to_repo(apiuser, repoid, key, label=<Optional:''>, description=<Optional:''>)
10
11 Adds an extra field to a repository.
12
13 This command can only be run using an |authtoken| with at least
14 write permissions to the |repo|.
15
16 :param apiuser: This is filled automatically from the |authtoken|.
17 :type apiuser: AuthUser
18 :param repoid: Set the repository name or repository id.
19 :type repoid: str or int
20 :param key: Create a unique field key for this repository.
21 :type key: str
22 :param label:
23 :type label: Optional(str)
24 :param description:
25 :type description: Optional(str)
26
27
28 comment_commit
29 --------------
30
31 .. py:function:: comment_commit(apiuser, repoid, commit_id, message, userid=<Optional:<OptionalAttr:apiuser>>, status=<Optional:None>)
32
33 Set a commit comment, and optionally change the status of the commit.
34
35 :param apiuser: This is filled automatically from the |authtoken|.
36 :type apiuser: AuthUser
37 :param repoid: Set the repository name or repository ID.
38 :type repoid: str or int
39 :param commit_id: Specify the commit_id for which to set a comment.
40 :type commit_id: str
41 :param message: The comment text.
42 :type message: str
43 :param userid: Set the user name of the comment creator.
44 :type userid: Optional(str or int)
45 :param status: status, one of 'not_reviewed', 'approved', 'rejected',
46 'under_review'
47 :type status: str
48
49 Example error output:
50
51 .. code-block:: json
52
53 {
54 "id" : <id_given_in_input>,
55 "result" : {
56 "msg": "Commented on commit `<commit_id>` for repository `<repoid>`",
57 "status_change": null or <status>,
58 "success": true
59 },
60 "error" : null
61 }
62
63
64 create_repo
65 -----------
66
67 .. py:function:: create_repo(apiuser, repo_name, repo_type, owner=<Optional:<OptionalAttr:apiuser>>, description=<Optional:''>, private=<Optional:False>, clone_uri=<Optional:None>, landing_rev=<Optional:'rev:tip'>, enable_statistics=<Optional:False>, enable_locking=<Optional:False>, enable_downloads=<Optional:False>, copy_permissions=<Optional:False>)
68
69 Creates a repository.
70
71 * If the repository name contains "/", all the required repository
72 groups will be created.
73
74 For example "foo/bar/baz" will create |repo| groups "foo" and "bar"
75 (with "foo" as parent). It will also create the "baz" repository
76 with "bar" as |repo| group.
77
78 This command can only be run using an |authtoken| with at least
79 write permissions to the |repo|.
80
81 :param apiuser: This is filled automatically from the |authtoken|.
82 :type apiuser: AuthUser
83 :param repo_name: Set the repository name.
84 :type repo_name: str
85 :param repo_type: Set the repository type; 'hg','git', or 'svn'.
86 :type repo_type: str
87 :param owner: user_id or username
88 :type owner: Optional(str)
89 :param description: Set the repository description.
90 :type description: Optional(str)
91 :param private:
92 :type private: bool
93 :param clone_uri:
94 :type clone_uri: str
95 :param landing_rev: <rev_type>:<rev>
96 :type landing_rev: str
97 :param enable_locking:
98 :type enable_locking: bool
99 :param enable_downloads:
100 :type enable_downloads: bool
101 :param enable_statistics:
102 :type enable_statistics: bool
103 :param copy_permissions: Copy permission from group in which the
104 repository is being created.
105 :type copy_permissions: bool
106
107
108 Example output:
109
110 .. code-block:: bash
111
112 id : <id_given_in_input>
113 result: {
114 "msg": "Created new repository `<reponame>`",
115 "success": true,
116 "task": "<celery task id or None if done sync>"
117 }
118 error: null
119
120
121 Example error output:
122
123 .. code-block:: bash
124
125 id : <id_given_in_input>
126 result : null
127 error : {
128 'failed to create repository `<repo_name>`
129 }
130
131
132 delete_repo
133 -----------
134
135 .. py:function:: delete_repo(apiuser, repoid, forks=<Optional:''>)
136
137 Deletes a repository.
138
139 * When the `forks` parameter is set it's possible to detach or delete
140 forks of deleted repository.
141
142 This command can only be run using an |authtoken| with admin
143 permissions on the |repo|.
144
145 :param apiuser: This is filled automatically from the |authtoken|.
146 :type apiuser: AuthUser
147 :param repoid: Set the repository name or repository ID.
148 :type repoid: str or int
149 :param forks: Set to `detach` or `delete` forks from the |repo|.
150 :type forks: Optional(str)
151
152 Example error output:
153
154 .. code-block:: bash
155
156 id : <id_given_in_input>
157 result: {
158 "msg": "Deleted repository `<reponame>`",
159 "success": true
160 }
161 error: null
162
163
164 fork_repo
165 ---------
166
167 .. py:function:: fork_repo(apiuser, repoid, fork_name, owner=<Optional:<OptionalAttr:apiuser>>, description=<Optional:''>, copy_permissions=<Optional:False>, private=<Optional:False>, landing_rev=<Optional:'rev:tip'>)
168
169 Creates a fork of the specified |repo|.
170
171 * If using |RCE| with Celery this will immediately return a success
172 message, even though the fork will be created asynchronously.
173
174 This command can only be run using an |authtoken| with fork
175 permissions on the |repo|.
176
177 :param apiuser: This is filled automatically from the |authtoken|.
178 :type apiuser: AuthUser
179 :param repoid: Set repository name or repository ID.
180 :type repoid: str or int
181 :param fork_name: Set the fork name.
182 :type fork_name: str
183 :param owner: Set the fork owner.
184 :type owner: str
185 :param description: Set the fork descripton.
186 :type description: str
187 :param copy_permissions: Copy permissions from parent |repo|. The
188 default is False.
189 :type copy_permissions: bool
190 :param private: Make the fork private. The default is False.
191 :type private: bool
192 :param landing_rev: Set the landing revision. The default is tip.
193
194 Example output:
195
196 .. code-block:: bash
197
198 id : <id_for_response>
199 api_key : "<api_key>"
200 args: {
201 "repoid" : "<reponame or repo_id>",
202 "fork_name": "<forkname>",
203 "owner": "<username or user_id = Optional(=apiuser)>",
204 "description": "<description>",
205 "copy_permissions": "<bool>",
206 "private": "<bool>",
207 "landing_rev": "<landing_rev>"
208 }
209
210 Example error output:
211
212 .. code-block:: bash
213
214 id : <id_given_in_input>
215 result: {
216 "msg": "Created fork of `<reponame>` as `<forkname>`",
217 "success": true,
218 "task": "<celery task id or None if done sync>"
219 }
220 error: null
221
222
223 get_repo
224 --------
225
226 .. py:function:: get_repo(apiuser, repoid, cache=<Optional:True>)
227
228 Gets an existing repository by its name or repository_id.
229
230 The members section so the output returns users groups or users
231 associated with that repository.
232
233 This command can only be run using an |authtoken| with admin rights,
234 or users with at least read rights to the |repo|.
235
236 :param apiuser: This is filled automatically from the |authtoken|.
237 :type apiuser: AuthUser
238 :param repoid: The repository name or repository id.
239 :type repoid: str or int
240 :param cache: use the cached value for last changeset
241 :type: cache: Optional(bool)
242
243 Example output:
244
245 .. code-block:: bash
246
247 {
248 "error": null,
249 "id": <repo_id>,
250 "result": {
251 "clone_uri": null,
252 "created_on": "timestamp",
253 "description": "repo description",
254 "enable_downloads": false,
255 "enable_locking": false,
256 "enable_statistics": false,
257 "followers": [
258 {
259 "active": true,
260 "admin": false,
261 "api_key": "****************************************",
262 "api_keys": [
263 "****************************************"
264 ],
265 "email": "user@example.com",
266 "emails": [
267 "user@example.com"
268 ],
269 "extern_name": "rhodecode",
270 "extern_type": "rhodecode",
271 "firstname": "username",
272 "ip_addresses": [],
273 "language": null,
274 "last_login": "2015-09-16T17:16:35.854",
275 "lastname": "surname",
276 "user_id": <user_id>,
277 "username": "name"
278 }
279 ],
280 "fork_of": "parent-repo",
281 "landing_rev": [
282 "rev",
283 "tip"
284 ],
285 "last_changeset": {
286 "author": "User <user@example.com>",
287 "branch": "default",
288 "date": "timestamp",
289 "message": "last commit message",
290 "parents": [
291 {
292 "raw_id": "commit-id"
293 }
294 ],
295 "raw_id": "commit-id",
296 "revision": <revision number>,
297 "short_id": "short id"
298 },
299 "lock_reason": null,
300 "locked_by": null,
301 "locked_date": null,
302 "members": [
303 {
304 "name": "super-admin-name",
305 "origin": "super-admin",
306 "permission": "repository.admin",
307 "type": "user"
308 },
309 {
310 "name": "owner-name",
311 "origin": "owner",
312 "permission": "repository.admin",
313 "type": "user"
314 },
315 {
316 "name": "user-group-name",
317 "origin": "permission",
318 "permission": "repository.write",
319 "type": "user_group"
320 }
321 ],
322 "owner": "owner-name",
323 "permissions": [
324 {
325 "name": "super-admin-name",
326 "origin": "super-admin",
327 "permission": "repository.admin",
328 "type": "user"
329 },
330 {
331 "name": "owner-name",
332 "origin": "owner",
333 "permission": "repository.admin",
334 "type": "user"
335 },
336 {
337 "name": "user-group-name",
338 "origin": "permission",
339 "permission": "repository.write",
340 "type": "user_group"
341 }
342 ],
343 "private": true,
344 "repo_id": 676,
345 "repo_name": "user-group/repo-name",
346 "repo_type": "hg"
347 }
348 }
349
350
351 get_repo_changeset
352 ------------------
353
354 .. py:function:: get_repo_changeset(apiuser, repoid, revision, details=<Optional:'basic'>)
355
356 Returns information about a changeset.
357
358 Additionally parameters define the amount of details returned by
359 this function.
360
361 This command can only be run using an |authtoken| with admin rights,
362 or users with at least read rights to the |repo|.
363
364 :param apiuser: This is filled automatically from the |authtoken|.
365 :type apiuser: AuthUser
366 :param repoid: The repository name or repository id
367 :type repoid: str or int
368 :param revision: revision for which listing should be done
369 :type revision: str
370 :param details: details can be 'basic|extended|full' full gives diff
371 info details like the diff itself, and number of changed files etc.
372 :type details: Optional(str)
373
374
375 get_repo_changesets
376 -------------------
377
378 .. py:function:: get_repo_changesets(apiuser, repoid, start_rev, limit, details=<Optional:'basic'>)
379
380 Returns a set of commits limited by the number starting
381 from the `start_rev` option.
382
383 Additional parameters define the amount of details returned by this
384 function.
385
386 This command can only be run using an |authtoken| with admin rights,
387 or users with at least read rights to |repos|.
388
389 :param apiuser: This is filled automatically from the |authtoken|.
390 :type apiuser: AuthUser
391 :param repoid: The repository name or repository ID.
392 :type repoid: str or int
393 :param start_rev: The starting revision from where to get changesets.
394 :type start_rev: str
395 :param limit: Limit the number of commits to this amount
396 :type limit: str or int
397 :param details: Set the level of detail returned. Valid option are:
398 ``basic``, ``extended`` and ``full``.
399 :type details: Optional(str)
400
401 .. note::
402
403 Setting the parameter `details` to the value ``full`` is extensive
404 and returns details like the diff itself, and the number
405 of changed files.
406
407
408 get_repo_nodes
409 --------------
410
411 .. py:function:: get_repo_nodes(apiuser, repoid, revision, root_path, ret_type=<Optional:'all'>, details=<Optional:'basic'>, max_file_bytes=<Optional:None>)
412
413 Returns a list of nodes and children in a flat list for a given
414 path at given revision.
415
416 It's possible to specify ret_type to show only `files` or `dirs`.
417
418 This command can only be run using an |authtoken| with admin rights,
419 or users with at least read rights to |repos|.
420
421 :param apiuser: This is filled automatically from the |authtoken|.
422 :type apiuser: AuthUser
423 :param repoid: The repository name or repository ID.
424 :type repoid: str or int
425 :param revision: The revision for which listing should be done.
426 :type revision: str
427 :param root_path: The path from which to start displaying.
428 :type root_path: str
429 :param ret_type: Set the return type. Valid options are
430 ``all`` (default), ``files`` and ``dirs``.
431 :type ret_type: Optional(str)
432 :param details: Returns extended information about nodes, such as
433 md5, binary, and or content. The valid options are ``basic`` and
434 ``full``.
435 :type details: Optional(str)
436 :param max_file_bytes: Only return file content under this file size bytes
437 :type details: Optional(int)
438
439 Example output:
440
441 .. code-block:: bash
442
443 id : <id_given_in_input>
444 result: [
445 {
446 "name" : "<name>"
447 "type" : "<type>",
448 "binary": "<true|false>" (only in extended mode)
449 "md5" : "<md5 of file content>" (only in extended mode)
450 },
451 ...
452 ]
453 error: null
454
455
456 get_repo_refs
457 -------------
458
459 .. py:function:: get_repo_refs(apiuser, repoid)
460
461 Returns a dictionary of current references. It returns
462 bookmarks, branches, closed_branches, and tags for given repository
463
464 It's possible to specify ret_type to show only `files` or `dirs`.
465
466 This command can only be run using an |authtoken| with admin rights,
467 or users with at least read rights to |repos|.
468
469 :param apiuser: This is filled automatically from the |authtoken|.
470 :type apiuser: AuthUser
471 :param repoid: The repository name or repository ID.
472 :type repoid: str or int
473
474 Example output:
475
476 .. code-block:: bash
477
478 id : <id_given_in_input>
479 result: [
480 TODO...
481 ]
482 error: null
483
484
485 get_repo_settings
486 -----------------
487
488 .. py:function:: get_repo_settings(apiuser, repoid, key=<Optional:None>)
489
490 Returns all settings for a repository. If key is given it only returns the
491 setting identified by the key or null.
492
493 :param apiuser: This is filled automatically from the |authtoken|.
494 :type apiuser: AuthUser
495 :param repoid: The repository name or repository id.
496 :type repoid: str or int
497 :param key: Key of the setting to return.
498 :type: key: Optional(str)
499
500 Example output:
501
502 .. code-block:: bash
503
504 {
505 "error": null,
506 "id": 237,
507 "result": {
508 "extensions_largefiles": true,
509 "hooks_changegroup_push_logger": true,
510 "hooks_changegroup_repo_size": false,
511 "hooks_outgoing_pull_logger": true,
512 "phases_publish": "True",
513 "rhodecode_hg_use_rebase_for_merging": true,
514 "rhodecode_pr_merge_enabled": true,
515 "rhodecode_use_outdated_comments": true
516 }
517 }
518
519
520 get_repos
521 ---------
522
523 .. py:function:: get_repos(apiuser)
524
525 Lists all existing repositories.
526
527 This command can only be run using an |authtoken| with admin rights,
528 or users with at least read rights to |repos|.
529
530 :param apiuser: This is filled automatically from the |authtoken|.
531 :type apiuser: AuthUser
532
533 Example output:
534
535 .. code-block:: bash
536
537 id : <id_given_in_input>
538 result: [
539 {
540 "repo_id" : "<repo_id>",
541 "repo_name" : "<reponame>"
542 "repo_type" : "<repo_type>",
543 "clone_uri" : "<clone_uri>",
544 "private": : "<bool>",
545 "created_on" : "<datetimecreated>",
546 "description" : "<description>",
547 "landing_rev": "<landing_rev>",
548 "owner": "<repo_owner>",
549 "fork_of": "<name_of_fork_parent>",
550 "enable_downloads": "<bool>",
551 "enable_locking": "<bool>",
552 "enable_statistics": "<bool>",
553 },
554 ...
555 ]
556 error: null
557
558
559 grant_user_group_permission
560 ---------------------------
561
562 .. py:function:: grant_user_group_permission(apiuser, repoid, usergroupid, perm)
563
564 Grant permission for a user group on the specified repository,
565 or update existing permissions.
566
567 This command can only be run using an |authtoken| with admin
568 permissions on the |repo|.
569
570 :param apiuser: This is filled automatically from the |authtoken|.
571 :type apiuser: AuthUser
572 :param repoid: Set the repository name or repository ID.
573 :type repoid: str or int
574 :param usergroupid: Specify the ID of the user group.
575 :type usergroupid: str or int
576 :param perm: Set the user group permissions using the following
577 format: (repository.(none|read|write|admin))
578 :type perm: str
579
580 Example output:
581
582 .. code-block:: bash
583
584 id : <id_given_in_input>
585 result : {
586 "msg" : "Granted perm: `<perm>` for group: `<usersgroupname>` in repo: `<reponame>`",
587 "success": true
588
589 }
590 error : null
591
592 Example error output:
593
594 .. code-block:: bash
595
596 id : <id_given_in_input>
597 result : null
598 error : {
599 "failed to edit permission for user group: `<usergroup>` in repo `<repo>`'
600 }
601
602
603 grant_user_permission
604 ---------------------
605
606 .. py:function:: grant_user_permission(apiuser, repoid, userid, perm)
607
608 Grant permissions for the specified user on the given repository,
609 or update existing permissions if found.
610
611 This command can only be run using an |authtoken| with admin
612 permissions on the |repo|.
613
614 :param apiuser: This is filled automatically from the |authtoken|.
615 :type apiuser: AuthUser
616 :param repoid: Set the repository name or repository ID.
617 :type repoid: str or int
618 :param userid: Set the user name.
619 :type userid: str
620 :param perm: Set the user permissions, using the following format
621 ``(repository.(none|read|write|admin))``
622 :type perm: str
623
624 Example output:
625
626 .. code-block:: bash
627
628 id : <id_given_in_input>
629 result: {
630 "msg" : "Granted perm: `<perm>` for user: `<username>` in repo: `<reponame>`",
631 "success": true
632 }
633 error: null
634
635
636 invalidate_cache
637 ----------------
638
639 .. py:function:: invalidate_cache(apiuser, repoid, delete_keys=<Optional:False>)
640
641 Invalidates the cache for the specified repository.
642
643 This command can only be run using an |authtoken| with admin rights to
644 the specified repository.
645
646 This command takes the following options:
647
648 :param apiuser: This is filled automatically from |authtoken|.
649 :type apiuser: AuthUser
650 :param repoid: Sets the repository name or repository ID.
651 :type repoid: str or int
652 :param delete_keys: This deletes the invalidated keys instead of
653 just flagging them.
654 :type delete_keys: Optional(``True`` | ``False``)
655
656 Example output:
657
658 .. code-block:: bash
659
660 id : <id_given_in_input>
661 result : {
662 'msg': Cache for repository `<repository name>` was invalidated,
663 'repository': <repository name>
664 }
665 error : null
666
667 Example error output:
668
669 .. code-block:: bash
670
671 id : <id_given_in_input>
672 result : null
673 error : {
674 'Error occurred during cache invalidation action'
675 }
676
677
678 lock
679 ----
680
681 .. py:function:: lock(apiuser, repoid, locked=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
682
683 Sets the lock state of the specified |repo| by the given user.
684 From more information, see :ref:`repo-locking`.
685
686 * If the ``userid`` option is not set, the repository is locked to the
687 user who called the method.
688 * If the ``locked`` parameter is not set, the current lock state of the
689 repository is displayed.
690
691 This command can only be run using an |authtoken| with admin rights to
692 the specified repository.
693
694 This command takes the following options:
695
696 :param apiuser: This is filled automatically from the |authtoken|.
697 :type apiuser: AuthUser
698 :param repoid: Sets the repository name or repository ID.
699 :type repoid: str or int
700 :param locked: Sets the lock state.
701 :type locked: Optional(``True`` | ``False``)
702 :param userid: Set the repository lock to this user.
703 :type userid: Optional(str or int)
704
705 Example error output:
706
707 .. code-block:: bash
708
709 id : <id_given_in_input>
710 result : {
711 'repo': '<reponame>',
712 'locked': <bool: lock state>,
713 'locked_since': <int: lock timestamp>,
714 'locked_by': <username of person who made the lock>,
715 'lock_reason': <str: reason for locking>,
716 'lock_state_changed': <bool: True if lock state has been changed in this request>,
717 'msg': 'Repo `<reponame>` locked by `<username>` on <timestamp>.'
718 or
719 'msg': 'Repo `<repository name>` not locked.'
720 or
721 'msg': 'User `<user name>` set lock state for repo `<repository name>` to `<new lock state>`'
722 }
723 error : null
724
725 Example error output:
726
727 .. code-block:: bash
728
729 id : <id_given_in_input>
730 result : null
731 error : {
732 'Error occurred locking repository `<reponame>`
733 }
734
735
736 pull
737 ----
738
739 .. py:function:: pull(apiuser, repoid)
740
741 Triggers a pull on the given repository from a remote location. You
742 can use this to keep remote repositories up-to-date.
743
744 This command can only be run using an |authtoken| with admin
745 rights to the specified repository. For more information,
746 see :ref:`config-token-ref`.
747
748 This command takes the following options:
749
750 :param apiuser: This is filled automatically from the |authtoken|.
751 :type apiuser: AuthUser
752 :param repoid: The repository name or repository ID.
753 :type repoid: str or int
754
755 Example output:
756
757 .. code-block:: bash
758
759 id : <id_given_in_input>
760 result : {
761 "msg": "Pulled from `<repository name>`"
762 "repository": "<repository name>"
763 }
764 error : null
765
766 Example error output:
767
768 .. code-block:: bash
769
770 id : <id_given_in_input>
771 result : null
772 error : {
773 "Unable to pull changes from `<reponame>`"
774 }
775
776
777 remove_field_from_repo
778 ----------------------
779
780 .. py:function:: remove_field_from_repo(apiuser, repoid, key)
781
782 Removes an extra field from a repository.
783
784 This command can only be run using an |authtoken| with at least
785 write permissions to the |repo|.
786
787 :param apiuser: This is filled automatically from the |authtoken|.
788 :type apiuser: AuthUser
789 :param repoid: Set the repository name or repository ID.
790 :type repoid: str or int
791 :param key: Set the unique field key for this repository.
792 :type key: str
793
794
795 revoke_user_group_permission
796 ----------------------------
797
798 .. py:function:: revoke_user_group_permission(apiuser, repoid, usergroupid)
799
800 Revoke the permissions of a user group on a given repository.
801
802 This command can only be run using an |authtoken| with admin
803 permissions on the |repo|.
804
805 :param apiuser: This is filled automatically from the |authtoken|.
806 :type apiuser: AuthUser
807 :param repoid: Set the repository name or repository ID.
808 :type repoid: str or int
809 :param usergroupid: Specify the user group ID.
810 :type usergroupid: str or int
811
812 Example output:
813
814 .. code-block:: bash
815
816 id : <id_given_in_input>
817 result: {
818 "msg" : "Revoked perm for group: `<usersgroupname>` in repo: `<reponame>`",
819 "success": true
820 }
821 error: null
822
823
824 revoke_user_permission
825 ----------------------
826
827 .. py:function:: revoke_user_permission(apiuser, repoid, userid)
828
829 Revoke permission for a user on the specified repository.
830
831 This command can only be run using an |authtoken| with admin
832 permissions on the |repo|.
833
834 :param apiuser: This is filled automatically from the |authtoken|.
835 :type apiuser: AuthUser
836 :param repoid: Set the repository name or repository ID.
837 :type repoid: str or int
838 :param userid: Set the user name of revoked user.
839 :type userid: str or int
840
841 Example error output:
842
843 .. code-block:: bash
844
845 id : <id_given_in_input>
846 result: {
847 "msg" : "Revoked perm for user: `<username>` in repo: `<reponame>`",
848 "success": true
849 }
850 error: null
851
852
853 set_repo_settings
854 -----------------
855
856 .. py:function:: set_repo_settings(apiuser, repoid, settings)
857
858 Update repository settings. Returns true on success.
859
860 :param apiuser: This is filled automatically from the |authtoken|.
861 :type apiuser: AuthUser
862 :param repoid: The repository name or repository id.
863 :type repoid: str or int
864 :param settings: The new settings for the repository.
865 :type: settings: dict
866
867 Example output:
868
869 .. code-block:: bash
870
871 {
872 "error": null,
873 "id": 237,
874 "result": true
875 }
876
877
878 strip
879 -----
880
881 .. py:function:: strip(apiuser, repoid, revision, branch)
882
883 Strips the given revision from the specified repository.
884
885 * This will remove the revision and all of its decendants.
886
887 This command can only be run using an |authtoken| with admin rights to
888 the specified repository.
889
890 This command takes the following options:
891
892 :param apiuser: This is filled automatically from the |authtoken|.
893 :type apiuser: AuthUser
894 :param repoid: The repository name or repository ID.
895 :type repoid: str or int
896 :param revision: The revision you wish to strip.
897 :type revision: str
898 :param branch: The branch from which to strip the revision.
899 :type branch: str
900
901 Example output:
902
903 .. code-block:: bash
904
905 id : <id_given_in_input>
906 result : {
907 "msg": "'Stripped commit <commit_hash> from repo `<repository name>`'"
908 "repository": "<repository name>"
909 }
910 error : null
911
912 Example error output:
913
914 .. code-block:: bash
915
916 id : <id_given_in_input>
917 result : null
918 error : {
919 "Unable to strip commit <commit_hash> from repo `<repository name>`"
920 }
921
922
923 update_repo
924 -----------
925
926 .. py:function:: update_repo(apiuser, repoid, name=<Optional:None>, owner=<Optional:<OptionalAttr:apiuser>>, group=<Optional:None>, fork_of=<Optional:None>, description=<Optional:''>, private=<Optional:False>, clone_uri=<Optional:None>, landing_rev=<Optional:'rev:tip'>, enable_statistics=<Optional:False>, enable_locking=<Optional:False>, enable_downloads=<Optional:False>, fields=<Optional:''>)
927
928 Updates a repository with the given information.
929
930 This command can only be run using an |authtoken| with at least
931 write permissions to the |repo|.
932
933 :param apiuser: This is filled automatically from the |authtoken|.
934 :type apiuser: AuthUser
935 :param repoid: repository name or repository ID.
936 :type repoid: str or int
937 :param name: Update the |repo| name.
938 :type name: str
939 :param owner: Set the |repo| owner.
940 :type owner: str
941 :param group: Set the |repo| group the |repo| belongs to.
942 :type group: str
943 :param fork_of: Set the master |repo| name.
944 :type fork_of: str
945 :param description: Update the |repo| description.
946 :type description: str
947 :param private: Set the |repo| as private. (True | False)
948 :type private: bool
949 :param clone_uri: Update the |repo| clone URI.
950 :type clone_uri: str
951 :param landing_rev: Set the |repo| landing revision. Default is
952 ``tip``.
953 :type landing_rev: str
954 :param enable_statistics: Enable statistics on the |repo|,
955 (True | False).
956 :type enable_statistics: bool
957 :param enable_locking: Enable |repo| locking.
958 :type enable_locking: bool
959 :param enable_downloads: Enable downloads from the |repo|,
960 (True | False).
961 :type enable_downloads: bool
962 :param fields: Add extra fields to the |repo|. Use the following
963 example format: ``field_key=field_val,field_key2=fieldval2``.
964 Escape ', ' with \,
965 :type fields: str
966
967
@@ -0,0 +1,115 b''
1 .. _server-methods-ref:
2
3 server methods
4 =================
5
6 get_ip
7 ------
8
9 .. py:function:: get_ip(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
10
11 Displays the IP Address as seen from the |RCE| server.
12
13 * This command displays the IP Address, as well as all the defined IP
14 addresses for the specified user. If the ``userid`` is not set, the
15 data returned is for the user calling the method.
16
17 This command can only be run using an |authtoken| with admin rights to
18 the specified repository.
19
20 This command takes the following options:
21
22 :param apiuser: This is filled automatically from |authtoken|.
23 :type apiuser: AuthUser
24 :param userid: Sets the userid for which associated IP Address data
25 is returned.
26 :type userid: Optional(str or int)
27
28 Example output:
29
30 .. code-block:: bash
31
32 id : <id_given_in_input>
33 result : {
34 "server_ip_addr": "<ip_from_clien>",
35 "user_ips": [
36 {
37 "ip_addr": "<ip_with_mask>",
38 "ip_range": ["<start_ip>", "<end_ip>"],
39 },
40 ...
41 ]
42 }
43
44
45 get_server_info
46 ---------------
47
48 .. py:function:: get_server_info(apiuser)
49
50 Returns the |RCE| server information.
51
52 This includes the running version of |RCE| and all installed
53 packages. This command takes the following options:
54
55 :param apiuser: This is filled automatically from the |authtoken|.
56 :type apiuser: AuthUser
57
58 Example output:
59
60 .. code-block:: bash
61
62 id : <id_given_in_input>
63 result : {
64 'modules': [<module name>,...]
65 'py_version': <python version>,
66 'platform': <platform type>,
67 'rhodecode_version': <rhodecode version>
68 }
69 error : null
70
71
72 rescan_repos
73 ------------
74
75 .. py:function:: rescan_repos(apiuser, remove_obsolete=<Optional:False>)
76
77 Triggers a rescan of the specified repositories.
78
79 * If the ``remove_obsolete`` option is set, it also deletes repositories
80 that are found in the database but not on the file system, so called
81 "clean zombies".
82
83 This command can only be run using an |authtoken| with admin rights to
84 the specified repository.
85
86 This command takes the following options:
87
88 :param apiuser: This is filled automatically from the |authtoken|.
89 :type apiuser: AuthUser
90 :param remove_obsolete: Deletes repositories from the database that
91 are not found on the filesystem.
92 :type remove_obsolete: Optional(``True`` | ``False``)
93
94 Example output:
95
96 .. code-block:: bash
97
98 id : <id_given_in_input>
99 result : {
100 'added': [<added repository name>,...]
101 'removed': [<removed repository name>,...]
102 }
103 error : null
104
105 Example error output:
106
107 .. code-block:: bash
108
109 id : <id_given_in_input>
110 result : null
111 error : {
112 'Error occurred during rescan repositories action'
113 }
114
115
@@ -0,0 +1,406 b''
1 .. _user-group-methods-ref:
2
3 user_group methods
4 =================
5
6 add_user_to_user_group
7 ----------------------
8
9 .. py:function:: add_user_to_user_group(apiuser, usergroupid, userid)
10
11 Adds a user to a `user group`. If the user already exists in the group
12 this command will return false.
13
14 This command can only be run using an |authtoken| with admin rights to
15 the specified user group.
16
17 This command takes the following options:
18
19 :param apiuser: This is filled automatically from the |authtoken|.
20 :type apiuser: AuthUser
21 :param usergroupid: Set the name of the `user group` to which a
22 user will be added.
23 :type usergroupid: int
24 :param userid: Set the `user_id` of the user to add to the group.
25 :type userid: int
26
27 Example output:
28
29 .. code-block:: bash
30
31 id : <id_given_in_input>
32 result : {
33 "success": True|False # depends on if member is in group
34 "msg": "added member `<username>` to user group `<groupname>` |
35 User is already in that group"
36
37 }
38 error : null
39
40 Example error output:
41
42 .. code-block:: bash
43
44 id : <id_given_in_input>
45 result : null
46 error : {
47 "failed to add member to user group `<user_group_name>`"
48 }
49
50
51 create_user_group
52 -----------------
53
54 .. py:function:: create_user_group(apiuser, group_name, description=<Optional:''>, owner=<Optional:<OptionalAttr:apiuser>>, active=<Optional:True>)
55
56 Creates a new user group.
57
58 This command can only be run using an |authtoken| with admin rights to
59 the specified repository.
60
61 This command takes the following options:
62
63 :param apiuser: This is filled automatically from the |authtoken|.
64 :type apiuser: AuthUser
65 :param group_name: Set the name of the new user group.
66 :type group_name: str
67 :param description: Give a description of the new user group.
68 :type description: str
69 :param owner: Set the owner of the new user group.
70 If not set, the owner is the |authtoken| user.
71 :type owner: Optional(str or int)
72 :param active: Set this group as active.
73 :type active: Optional(``True`` | ``False``)
74
75 Example output:
76
77 .. code-block:: bash
78
79 id : <id_given_in_input>
80 result: {
81 "msg": "created new user group `<groupname>`",
82 "user_group": <user_group_object>
83 }
84 error: null
85
86 Example error output:
87
88 .. code-block:: bash
89
90 id : <id_given_in_input>
91 result : null
92 error : {
93 "user group `<group name>` already exist"
94 or
95 "failed to create group `<group name>`"
96 }
97
98
99 delete_user_group
100 -----------------
101
102 .. py:function:: delete_user_group(apiuser, usergroupid)
103
104 Deletes the specified `user group`.
105
106 This command can only be run using an |authtoken| with admin rights to
107 the specified repository.
108
109 This command takes the following options:
110
111 :param apiuser: filled automatically from apikey
112 :type apiuser: AuthUser
113 :param usergroupid:
114 :type usergroupid: int
115
116 Example output:
117
118 .. code-block:: bash
119
120 id : <id_given_in_input>
121 result : {
122 "msg": "deleted user group ID:<user_group_id> <user_group_name>"
123 }
124 error : null
125
126 Example error output:
127
128 .. code-block:: bash
129
130 id : <id_given_in_input>
131 result : null
132 error : {
133 "failed to delete user group ID:<user_group_id> <user_group_name>"
134 or
135 "RepoGroup assigned to <repo_groups_list>"
136 }
137
138
139 get_user_group
140 --------------
141
142 .. py:function:: get_user_group(apiuser, usergroupid)
143
144 Returns the data of an existing user group.
145
146 This command can only be run using an |authtoken| with admin rights to
147 the specified repository.
148
149 :param apiuser: This is filled automatically from the |authtoken|.
150 :type apiuser: AuthUser
151 :param usergroupid: Set the user group from which to return data.
152 :type usergroupid: str or int
153
154 Example error output:
155
156 .. code-block:: bash
157
158 {
159 "error": null,
160 "id": <id>,
161 "result": {
162 "active": true,
163 "group_description": "group description",
164 "group_name": "group name",
165 "members": [
166 {
167 "name": "owner-name",
168 "origin": "owner",
169 "permission": "usergroup.admin",
170 "type": "user"
171 },
172 {
173 {
174 "name": "user name",
175 "origin": "permission",
176 "permission": "usergroup.admin",
177 "type": "user"
178 },
179 {
180 "name": "user group name",
181 "origin": "permission",
182 "permission": "usergroup.write",
183 "type": "user_group"
184 }
185 ],
186 "owner": "owner name",
187 "users": [],
188 "users_group_id": 2
189 }
190 }
191
192
193 get_user_groups
194 ---------------
195
196 .. py:function:: get_user_groups(apiuser)
197
198 Lists all the existing user groups within RhodeCode.
199
200 This command can only be run using an |authtoken| with admin rights to
201 the specified repository.
202
203 This command takes the following options:
204
205 :param apiuser: This is filled automatically from the |authtoken|.
206 :type apiuser: AuthUser
207
208 Example error output:
209
210 .. code-block:: bash
211
212 id : <id_given_in_input>
213 result : [<user_group_obj>,...]
214 error : null
215
216
217 grant_user_group_permission_to_user_group
218 -----------------------------------------
219
220 .. py:function:: grant_user_group_permission_to_user_group(apiuser, usergroupid, sourceusergroupid, perm)
221
222 Give one user group permissions to another user group.
223
224 :param apiuser: This is filled automatically from the |authtoken|.
225 :type apiuser: AuthUser
226 :param usergroupid: Set the user group on which to edit permissions.
227 :type usergroupid: str or int
228 :param sourceusergroupid: Set the source user group to which
229 access/permissions will be granted.
230 :type sourceusergroupid: str or int
231 :param perm: (usergroup.(none|read|write|admin))
232 :type perm: str
233
234 Example output:
235
236 .. code-block:: bash
237
238 id : <id_given_in_input>
239 result : {
240 "msg": "Granted perm: `<perm_name>` for user group: `<source_user_group_name>` in user group: `<user_group_name>`",
241 "success": true
242 }
243 error : null
244
245
246 grant_user_permission_to_user_group
247 -----------------------------------
248
249 .. py:function:: grant_user_permission_to_user_group(apiuser, usergroupid, userid, perm)
250
251 Set permissions for a user in a user group.
252
253 :param apiuser: This is filled automatically from the |authtoken|.
254 :type apiuser: AuthUser
255 :param usergroupid: Set the user group to edit permissions on.
256 :type usergroupid: str or int
257 :param userid: Set the user from whom you wish to set permissions.
258 :type userid: str
259 :param perm: (usergroup.(none|read|write|admin))
260 :type perm: str
261
262 Example output:
263
264 .. code-block:: bash
265
266 id : <id_given_in_input>
267 result : {
268 "msg": "Granted perm: `<perm_name>` for user: `<username>` in user group: `<user_group_name>`",
269 "success": true
270 }
271 error : null
272
273
274 remove_user_from_user_group
275 ---------------------------
276
277 .. py:function:: remove_user_from_user_group(apiuser, usergroupid, userid)
278
279 Removes a user from a user group.
280
281 * If the specified user is not in the group, this command will return
282 `false`.
283
284 This command can only be run using an |authtoken| with admin rights to
285 the specified user group.
286
287 :param apiuser: This is filled automatically from the |authtoken|.
288 :type apiuser: AuthUser
289 :param usergroupid: Sets the user group name.
290 :type usergroupid: str or int
291 :param userid: The user you wish to remove from |RCE|.
292 :type userid: str or int
293
294 Example output:
295
296 .. code-block:: bash
297
298 id : <id_given_in_input>
299 result: {
300 "success": True|False, # depends on if member is in group
301 "msg": "removed member <username> from user group <groupname> |
302 User wasn't in group"
303 }
304 error: null
305
306
307 revoke_user_group_permission_from_user_group
308 --------------------------------------------
309
310 .. py:function:: revoke_user_group_permission_from_user_group(apiuser, usergroupid, sourceusergroupid)
311
312 Revoke the permissions that one user group has to another.
313
314 :param apiuser: This is filled automatically from the |authtoken|.
315 :type apiuser: AuthUser
316 :param usergroupid: Set the user group on which to edit permissions.
317 :type usergroupid: str or int
318 :param sourceusergroupid: Set the user group from which permissions
319 are revoked.
320 :type sourceusergroupid: str or int
321
322 Example output:
323
324 .. code-block:: bash
325
326 id : <id_given_in_input>
327 result : {
328 "msg": "Revoked perm for user group: `<user_group_name>` in user group: `<target_user_group_name>`",
329 "success": true
330 }
331 error : null
332
333
334 revoke_user_permission_from_user_group
335 --------------------------------------
336
337 .. py:function:: revoke_user_permission_from_user_group(apiuser, usergroupid, userid)
338
339 Revoke a users permissions in a user group.
340
341 :param apiuser: This is filled automatically from the |authtoken|.
342 :type apiuser: AuthUser
343 :param usergroupid: Set the user group from which to revoke the user
344 permissions.
345 :type: usergroupid: str or int
346 :param userid: Set the userid of the user whose permissions will be
347 revoked.
348 :type userid: str
349
350 Example output:
351
352 .. code-block:: bash
353
354 id : <id_given_in_input>
355 result : {
356 "msg": "Revoked perm for user: `<username>` in user group: `<user_group_name>`",
357 "success": true
358 }
359 error : null
360
361
362 update_user_group
363 -----------------
364
365 .. py:function:: update_user_group(apiuser, usergroupid, group_name=<Optional:''>, description=<Optional:''>, owner=<Optional:None>, active=<Optional:True>)
366
367 Updates the specified `user group` with the details provided.
368
369 This command can only be run using an |authtoken| with admin rights to
370 the specified repository.
371
372 :param apiuser: This is filled automatically from the |authtoken|.
373 :type apiuser: AuthUser
374 :param usergroupid: Set the id of the `user group` to update.
375 :type usergroupid: str or int
376 :param group_name: Set the new name the `user group`
377 :type group_name: str
378 :param description: Give a description for the `user group`
379 :type description: str
380 :param owner: Set the owner of the `user group`.
381 :type owner: Optional(str or int)
382 :param active: Set the group as active.
383 :type active: Optional(``True`` | ``False``)
384
385 Example output:
386
387 .. code-block:: bash
388
389 id : <id_given_in_input>
390 result : {
391 "msg": 'updated user group ID:<user group id> <user group name>',
392 "user_group": <user_group_object>
393 }
394 error : null
395
396 Example error output:
397
398 .. code-block:: bash
399
400 id : <id_given_in_input>
401 result : null
402 error : {
403 "failed to update user group `<user group name>`"
404 }
405
406
@@ -0,0 +1,295 b''
1 .. _user-methods-ref:
2
3 user methods
4 =================
5
6 create_user
7 -----------
8
9 .. py:function:: create_user(apiuser, username, email, password=<Optional:''>, firstname=<Optional:''>, lastname=<Optional:''>, active=<Optional:True>, admin=<Optional:False>, extern_name=<Optional:'rhodecode'>, extern_type=<Optional:'rhodecode'>, force_password_change=<Optional:False>)
10
11 Creates a new user and returns the new user object.
12
13 This command can only be run using an |authtoken| with admin rights to
14 the specified repository.
15
16 This command takes the following options:
17
18 :param apiuser: This is filled automatically from the |authtoken|.
19 :type apiuser: AuthUser
20 :param username: Set the new username.
21 :type username: str or int
22 :param email: Set the user email address.
23 :type email: str
24 :param password: Set the new user password.
25 :type password: Optional(str)
26 :param firstname: Set the new user firstname.
27 :type firstname: Optional(str)
28 :param lastname: Set the new user surname.
29 :type lastname: Optional(str)
30 :param active: Set the user as active.
31 :type active: Optional(``True`` | ``False``)
32 :param admin: Give the new user admin rights.
33 :type admin: Optional(``True`` | ``False``)
34 :param extern_name: Set the authentication plugin name.
35 Using LDAP this is filled with LDAP UID.
36 :type extern_name: Optional(str)
37 :param extern_type: Set the new user authentication plugin.
38 :type extern_type: Optional(str)
39 :param force_password_change: Force the new user to change password
40 on next login.
41 :type force_password_change: Optional(``True`` | ``False``)
42
43 Example output:
44
45 .. code-block:: bash
46
47 id : <id_given_in_input>
48 result: {
49 "msg" : "created new user `<username>`",
50 "user": <user_obj>
51 }
52 error: null
53
54 Example error output:
55
56 .. code-block:: bash
57
58 id : <id_given_in_input>
59 result : null
60 error : {
61 "user `<username>` already exist"
62 or
63 "email `<email>` already exist"
64 or
65 "failed to create user `<username>`"
66 }
67
68
69 delete_user
70 -----------
71
72 .. py:function:: delete_user(apiuser, userid)
73
74 Deletes the specified user from the |RCE| user database.
75
76 This command can only be run using an |authtoken| with admin rights to
77 the specified repository.
78
79 .. important::
80
81 Ensure all open pull requests and open code review
82 requests to this user are close.
83
84 Also ensure all repositories, or repository groups owned by this
85 user are reassigned before deletion.
86
87 This command takes the following options:
88
89 :param apiuser: This is filled automatically from the |authtoken|.
90 :type apiuser: AuthUser
91 :param userid: Set the user to delete.
92 :type userid: str or int
93
94 Example output:
95
96 .. code-block:: bash
97
98 id : <id_given_in_input>
99 result: {
100 "msg" : "deleted user ID:<userid> <username>",
101 "user": null
102 }
103 error: null
104
105 Example error output:
106
107 .. code-block:: bash
108
109 id : <id_given_in_input>
110 result : null
111 error : {
112 "failed to delete user ID:<userid> <username>"
113 }
114
115
116 get_user
117 --------
118
119 .. py:function:: get_user(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
120
121 Returns the information associated with a username or userid.
122
123 * If the ``userid`` is not set, this command returns the information
124 for the ``userid`` calling the method.
125
126 .. note::
127
128 Normal users may only run this command against their ``userid``. For
129 full privileges you must run this command using an |authtoken| with
130 admin rights.
131
132 :param apiuser: This is filled automatically from the |authtoken|.
133 :type apiuser: AuthUser
134 :param userid: Sets the userid for which data will be returned.
135 :type userid: Optional(str or int)
136
137 Example output:
138
139 .. code-block:: bash
140
141 {
142 "error": null,
143 "id": <id>,
144 "result": {
145 "active": true,
146 "admin": false,
147 "api_key": "api-key",
148 "api_keys": [ list of keys ],
149 "email": "user@example.com",
150 "emails": [
151 "user@example.com"
152 ],
153 "extern_name": "rhodecode",
154 "extern_type": "rhodecode",
155 "firstname": "username",
156 "ip_addresses": [],
157 "language": null,
158 "last_login": "Timestamp",
159 "lastname": "surnae",
160 "permissions": {
161 "global": [
162 "hg.inherit_default_perms.true",
163 "usergroup.read",
164 "hg.repogroup.create.false",
165 "hg.create.none",
166 "hg.extern_activate.manual",
167 "hg.create.write_on_repogroup.false",
168 "hg.usergroup.create.false",
169 "group.none",
170 "repository.none",
171 "hg.register.none",
172 "hg.fork.repository"
173 ],
174 "repositories": { "username/example": "repository.write"},
175 "repositories_groups": { "user-group/repo": "group.none" },
176 "user_groups": { "user_group_name": "usergroup.read" }
177 },
178 "user_id": 32,
179 "username": "username"
180 }
181 }
182
183
184 get_user_locks
185 --------------
186
187 .. py:function:: get_user_locks(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
188
189 Displays all repositories locked by the specified user.
190
191 * If this command is run by a non-admin user, it returns
192 a list of |repos| locked by that user.
193
194 This command takes the following options:
195
196 :param apiuser: This is filled automatically from the |authtoken|.
197 :type apiuser: AuthUser
198 :param userid: Sets the userid whose list of locked |repos| will be
199 displayed.
200 :type userid: Optional(str or int)
201
202 Example output:
203
204 .. code-block:: bash
205
206 id : <id_given_in_input>
207 result : {
208 [repo_object, repo_object,...]
209 }
210 error : null
211
212
213 get_users
214 ---------
215
216 .. py:function:: get_users(apiuser)
217
218 Lists all users in the |RCE| user database.
219
220 This command can only be run using an |authtoken| with admin rights to
221 the specified repository.
222
223 This command takes the following options:
224
225 :param apiuser: This is filled automatically from the |authtoken|.
226 :type apiuser: AuthUser
227
228 Example output:
229
230 .. code-block:: bash
231
232 id : <id_given_in_input>
233 result: [<user_object>, ...]
234 error: null
235
236
237 update_user
238 -----------
239
240 .. py:function:: update_user(apiuser, userid, username=<Optional:None>, email=<Optional:None>, password=<Optional:None>, firstname=<Optional:None>, lastname=<Optional:None>, active=<Optional:None>, admin=<Optional:None>, extern_type=<Optional:None>, extern_name=<Optional:None>)
241
242 Updates the details for the specified user, if that user exists.
243
244 This command can only be run using an |authtoken| with admin rights to
245 the specified repository.
246
247 This command takes the following options:
248
249 :param apiuser: This is filled automatically from |authtoken|.
250 :type apiuser: AuthUser
251 :param userid: Set the ``userid`` to update.
252 :type userid: str or int
253 :param username: Set the new username.
254 :type username: str or int
255 :param email: Set the new email.
256 :type email: str
257 :param password: Set the new password.
258 :type password: Optional(str)
259 :param firstname: Set the new first name.
260 :type firstname: Optional(str)
261 :param lastname: Set the new surname.
262 :type lastname: Optional(str)
263 :param active: Set the new user as active.
264 :type active: Optional(``True`` | ``False``)
265 :param admin: Give the user admin rights.
266 :type admin: Optional(``True`` | ``False``)
267 :param extern_name: Set the authentication plugin user name.
268 Using LDAP this is filled with LDAP UID.
269 :type extern_name: Optional(str)
270 :param extern_type: Set the authentication plugin type.
271 :type extern_type: Optional(str)
272
273
274 Example output:
275
276 .. code-block:: bash
277
278 id : <id_given_in_input>
279 result: {
280 "msg" : "updated user ID:<userid> <username>",
281 "user": <user_object>,
282 }
283 error: null
284
285 Example error output:
286
287 .. code-block:: bash
288
289 id : <id_given_in_input>
290 result : null
291 error : {
292 "failed to update user `<username>`"
293 }
294
295
@@ -0,0 +1,25 b''
1 .. _extensions-hooks-ref:
2
3 Extensions & Hooks
4 ==================
5
6 The extensions & hooks section references three concepts regularly,
7 so to clarify what is meant each time, read the following definitions:
8
9 * **Plugin**: A Plugin is software that adds a specific feature to
10 an existing software application.
11 * **Extension**: An extension extends the capabilities of,
12 or the data available to, an existing software application.
13 * **Hook**: A hook intercepts function calls, messages, or events passed
14 between software components and can be used to trigger plugins, or their
15 extensions.
16
17 .. toctree::
18
19 rcx
20 install-ext
21 config-ext
22 extensions
23 hooks
24 full-blown-example
25 int-slack
@@ -0,0 +1,23 b''
1 .. _integrations-email:
2
3 Email integration
4 =================
5
6 The email integration allows you to send the summary of repo pushes to a
7 list of email recipients in the format:
8
9 An example::
10
11 User: johndoe
12 Branches: default
13 Repository: http://rhodecode.company.com/repo
14 Commit: 8eab60a44a612e331edfcd59b8d96b2f6a935cd9
15 URL: http://rhodecode.company.com/repo/changeset/8eab60a44a612e331edfcd59b8d96b2f6a935cd9
16 Author: John Doe
17 Date: 2016-03-01 11:20:44
18 Commit Message:
19
20 fixed bug with thing
21
22
23 To create one, create a ``email`` integration in `creating-integrations`.
@@ -0,0 +1,14 b''
1 .. _integrations-hipchat:
2
3 Hipchat integration
4 ===================
5
6 In order to set a Hipchat integration up, it is necessary to obtain the Hipchat
7 service url by:
8
9 1. Log into Hipchat (https://your-hipchat.hipchat.com/)
10 2. Go to *Integrations* -> *Build your own*
11 3. Select a room to post notifications to and save it
12
13 Hipchat will create a URL for you to use in your integration as outlined in
14 :ref:`creating-integrations`. No newline at end of file
@@ -0,0 +1,27 b''
1 .. _integrations-jira:
2
3 JIRA integration
4 ================
5
6 .. important::
7
8 JIRA integration is only available in |RCEE|.
9
10
11 .. important::
12
13 In order to make issue numbers clickable in commit messages, see the
14 :ref:`rhodecode-issue-trackers-ref` section. The JIRA integration
15 only deals with altering JIRA issues.
16
17
18 The JIRA integration allows you to reference and change issue statuses in
19 JIRA directly from commit messages using commit message patterns such as
20 ``fixes #JIRA-235`` in order to change the status of issue JIRA-235 to
21 eg. "Resolved".
22
23 In order to apply a status to a JIRA issue, it is necessary to find the
24 transition status id in the *Workflow* section of JIRA.
25
26 Once you have the transition status id, you can create a JIRA integration
27 as outlined in :ref:`creating-integrations`.
@@ -0,0 +1,28 b''
1 .. _integrations-redmine:
2
3 Redmine integration
4 ===================
5
6 .. important::
7
8 Redmine integration is only available in |RCEE|.
9
10
11 .. important::
12
13 In order to make issue numbers clickable in commit messages, see the section
14 :ref:`rhodecode-issue-trackers-ref`. Redmine integration is specifically for
15 altering Redmine issues.
16
17
18 Redmine integration allows you to reference and change issue statuses in
19 Redmine directly from commit messages, using commit message patterns such as
20 ``fixes #235`` in order to change the status of issue 235 to eg. "Resolved".
21
22 To set a Redmine integration up, it is first necessary to obtain a Redmine API
23 key. This can be found under *My Account* in the Redmine application.
24 You may have to enable API Access in Redmine settings if it is not already
25 available.
26
27 Once you have the API key, create a Redmine integration as outlined in
28 :ref:`creating-integrations`.
@@ -0,0 +1,21 b''
1 .. _integrations-slack:
2
3 Slack integration
4 =================
5
6 To set a Slack integration up, it is first necessary to set up a Slack webhook
7 API endpoint for your Slack channel. This can be done at:
8
9 https://my.slack.com/services/new/incoming-webhook/
10
11 Select the channel you would like to use, and Slack will provide you with the
12 webhook URL for configuration.
13
14 You can now create a Slack integration as outlined in
15 :ref:`creating-integrations`.
16
17 .. note::
18 Some settings in the RhodeCode admin are identical to the options within the
19 Slack integration. For example, if notifications are to be sent in a private
20 chat, leave the "Channel" field blank. Likewise, the Emoji option within
21 RhodeCode can override the one set in the Slack admin. No newline at end of file
@@ -0,0 +1,12 b''
1 .. _integrations-webhook:
2
3 Webhook integration
4 ===================
5
6 The Webhook integration allows you to POST events such as repository pushes
7 or pull requests to a custom http endpoint as a json dict with details of the
8 event.
9
10 To create a webhook integration, select "webhook" in the integration settings
11 and use the url and key from your custom webhook. See
12 :ref:`creating-integrations` for additional instructions. No newline at end of file
@@ -0,0 +1,121 b''
1 |RCE| 4.3.0 |RNS|
2 -----------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2016-08-12
8
9
10 General
11 ^^^^^^^
12
13 - Subversion: detect requests also based on magic path.
14 This adds subversion 1.9 support for SVN backend.
15 - Summary/changelog: unified how data is displayed for those pages.
16 * use consistent order of columns
17 * fix the link to commit status
18 * fix order of displaying comments
19 - Live-chat: refactor live chat system for code review based on
20 latest channelstream changes.
21 - SVN: Add template to generate the apache mod_dav_svn config for all
22 repository groups. Repository groups can now be automatically mapped to be
23 supported by SVN backend. Set `svn.proxy.generate_config = true` and similar
24 options found inside .ini config.
25 - Readme/markup: improved order of generating readme files. Fixes #4050
26 * we now use order based on default system renderer
27 * having multiple readme files will pick correct one as set renderer
28 - Api: add a max_file_bytes parameter to get_nodes so that large files
29 can be skipped.
30 - Auth-ldap: added flag to set debug mode for LDAP connections.
31 - Labs: moved rebase-merge option from labs settings into VCS settings.
32 - System: send platform type and version to upgrade endpoint when checking
33 for new versions.
34 - Packaging: update rhodecode-tools from 0.8.3 to 0.10.0
35 - Packaging: update codemirror from 5.4.0 to 5.11.0
36 - Packaging: updated pygments to 2.1.3
37 - Packaging: bumped supervisor to 3.3.0
38 - Packaging: bumped psycopg2 to 2.6.1
39 - Packaging: bumped mercurial to 3.8.4
40
41
42 New Features
43 ^^^^^^^^^^^^
44
45 - Integrations: created new event based integration framework.
46 Allows to configure global, or per repo: Slack, Hipchat, Webhooks, Email
47 integrations. This also deprecated usage of rcextensions for those.
48 - Integrations (EE only): added smart commits for Jira and Redmine with
49 ability to map keywords into issue tracker actions.
50 `Fixes #123 -> resolves issues`, `Closes #123 -> closes issue` etc.
51 - Markdown: added improved support for Github flavored markdown.
52 - Labs: enable labs setting by default. Labs are new experimental features in
53 RhodeCode that can be used to test new upcomming features.
54 - Api: Add api methods to get/set repository settings, implements #4021.
55 - Gravatars: commit emails are now displayed based on the actual email
56 used inside commit rather then the main one of associated account
57 inside RhodeCode, #4037.
58 - Emails: All emails got new styling. They look now consistent
59 to UI of application. We also added bunch of usefull information into
60 email body, #4087.
61 - Pull requests: add show/hide comment functionality inside diffs, #4106.
62 - Notifications: added real-time notifications with via channelstream
63 about new comments when reviewing the code. Never miss someone replies
64 onto comments you submitted while doing a code-review.
65
66
67 Security
68 ^^^^^^^^
69
70 - Api: make `comment_commits` api call have consistent permissions
71 with web interface.
72 - Files: fixes display of "Add File" button missing or present despite
73 permissions, because of cached version of the page was rendered, fixes #4083.
74 - Login/Registration: fixed flash message problem on login/registration
75 pages, fixes #4043.
76 - Auth-token: allow other authentication types to use auth-token.
77 Accounts associated with other types like LDAP, or PAM can
78 now use auth-tokens to authenticate via RhodeCode.
79
80
81 Performance
82 ^^^^^^^^^^^
83
84 - Core: made all RhodeCode components gevent compatible. RhodeCode can now make
85 use of async workers. You can handle dozens of concurrent operations using a
86 single worker. This works only with new HTTP backend.
87 - Core: added new very efficient HTTP backend can be used to replace pyro4.
88 - Core: Set 'gzip_responses' to false by default. We no longer require any
89 gzip computations on backed, thus speeding up large file transfers.
90 - UI: optimized events system for JavaScript to boost performance on
91 large html pages.
92 - VCS: moved VCSMiddleware up to pyramid layer as wrapper around pylons app.
93 Skips few calls, and allows slightly faster clones/pulls and pushes.
94
95
96 Fixes
97 ^^^^^
98
99 - VCS: add vcsserver cache invalidation to mercurial backend.
100 Fixes multi-process problems after Mercurial 3.8.X release with server
101 side merges.
102 - VCS: clear caches on remap-and-rescan option.
103 - VCS: improved logic of updating commit caches in cases of rebases.
104 - Caches: Add an argument to make the cache context thread scoped. Brings
105 support to gevent compatible handling.
106 - Diff2way: fixed unicode problem on non-ascii files.
107 - Full text search: whoosh schema uses now bigger ints, fixes #4035
108 - File-browser: optimized cached tree calculation, reduced load times by
109 50% on complex file trees.
110 - Styling: #4086 fixing bug where long commit messages did not wrap in file view.
111 - SVN: Ignore the content length header from response, fixes #4112.
112 Fixes the "svn: E120106: ra_serf: The server sent a truncated HTTP response body."
113 - Auth: Fix password_changed function, fixes #4043.
114 - UI/tables: better message when tables are empty #685 #1832.
115 - UX: put gravatar and username together in user list #3203.
116 - Gists: use colander schema to validate input data.
117 * brings consistent validation acros API and web
118 * use nicer and stricter schemas to validate data
119 * fixes #4118
120 - Appenlight: error reporting can now also report VCSMiddleware errors.
121 - Users: hash email key for User.get_by_email() fixes #4132
@@ -0,0 +1,13 b''
1 # Copyright 2009 Facebook
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License"); you may
4 # not use this file except in compliance with the License. You may obtain
5 # a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 # License for the specific language governing permissions and limitations
13 # under the License.
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,6 +1,6 b''
1 [bumpversion]
1 [bumpversion]
2 current_version = 4.2.1
2 current_version = 4.3.0
3 message = release: Bump version {current_version} to {new_version}
3 message = release: Bump version {current_version} to {new_version}
4
4
5 [bumpversion:file:rhodecode/VERSION]
5 [bumpversion:file:rhodecode/VERSION]
6
6
@@ -1,58 +1,59 b''
1 syntax: glob
1 syntax: glob
2 *.egg
2 *.egg
3 *.egg-info
3 *.egg-info
4 *.idea
4 *.idea
5 *.orig
5 *.orig
6 *.pyc
6 *.pyc
7 *.sqlite-journal
7 *.sqlite-journal
8 *.swp
8 *.swp
9 *.tox
9 *.tox
10 *.DS_Store*
10 *.DS_Store*
11
11
12 syntax: regexp
12 syntax: regexp
13
13
14 #.filename
14 #.filename
15 ^\.settings$
15 ^\.settings$
16 ^\.project$
16 ^\.project$
17 ^\.pydevproject$
17 ^\.pydevproject$
18 ^\.coverage$
18 ^\.coverage$
19 ^\.cache.*$
19 ^\.cache.*$
20 ^\.rhodecode$
20 ^\.rhodecode$
21
21
22 ^rcextensions
22 ^rcextensions
23 ^_dev
23 ^_dev
24 ^._dev
24 ^._dev
25 ^build/
25 ^build/
26 ^coverage\.xml$
26 ^coverage\.xml$
27 ^data$
27 ^data$
28 ^\.eggs/
28 ^configs/data$
29 ^configs/data$
29 ^dev.ini$
30 ^dev.ini$
30 ^acceptance_tests/dev.*\.ini$
31 ^acceptance_tests/dev.*\.ini$
31 ^dist/
32 ^dist/
32 ^fabfile.py
33 ^fabfile.py
33 ^htmlcov
34 ^htmlcov
34 ^junit\.xml$
35 ^junit\.xml$
35 ^node_modules/
36 ^node_modules/
36 ^pylint.log$
37 ^pylint.log$
37 ^rcextensions/
38 ^rcextensions/
38 ^result$
39 ^result$
39 ^rhodecode/public/css/style.css$
40 ^rhodecode/public/css/style.css$
40 ^rhodecode/public/js/scripts.js$
41 ^rhodecode/public/js/scripts.js$
41 ^rhodecode\.db$
42 ^rhodecode\.db$
42 ^rhodecode\.log$
43 ^rhodecode\.log$
43 ^rhodecode_dev\.log$
44 ^rhodecode_dev\.log$
44 ^test\.db$
45 ^test\.db$
45
46
46 # ac-tests
47 # ac-tests
47 ^acceptance_tests/\.cache.*$
48 ^acceptance_tests/\.cache.*$
48 ^acceptance_tests/externals
49 ^acceptance_tests/externals
49 ^acceptance_tests/ghostdriver.log$
50 ^acceptance_tests/ghostdriver.log$
50 ^acceptance_tests/local(_.+)?\.ini$
51 ^acceptance_tests/local(_.+)?\.ini$
51
52
52 # docs
53 # docs
53 ^docs/_build$
54 ^docs/_build$
54 ^docs/result$
55 ^docs/result$
55 ^docs-internal/_build$
56 ^docs-internal/_build$
56
57
57 # Cythonized things
58 # Cythonized things
58 ^rhodecode/.*\.(c|so)$
59 ^rhodecode/.*\.(c|so)$
@@ -1,33 +1,28 b''
1 [DEFAULT]
1 [DEFAULT]
2 done = false
2 done = false
3
3
4 [task:bump_version]
4 [task:bump_version]
5 done = true
5 done = true
6
6
7 [task:rc_tools_pinned]
8 done = true
9
10 [task:fixes_on_stable]
7 [task:fixes_on_stable]
11 done = true
12
8
13 [task:pip2nix_generated]
9 [task:pip2nix_generated]
14 done = true
15
10
16 [task:changelog_updated]
11 [task:changelog_updated]
17 done = true
18
12
19 [task:generate_api_docs]
13 [task:generate_api_docs]
20 done = true
14
15 [task:updated_translation]
21
16
22 [release]
17 [release]
23 state = prepared
18 state = in_progress
24 version = 4.2.1
19 version = 4.3.0
25
20
26 [task:updated_translation]
21 [task:rc_tools_pinned]
27
22
28 [task:generate_js_routes]
23 [task:generate_js_routes]
29
24
30 [task:updated_trial_license]
25 [task:updated_trial_license]
31
26
32 [task:generate_oss_licenses]
27 [task:generate_oss_licenses]
33
28
@@ -1,139 +1,144 b''
1 module.exports = function(grunt) {
1 module.exports = function(grunt) {
2 grunt.initConfig({
2 grunt.initConfig({
3
3
4 dirs: {
4 dirs: {
5 css: "rhodecode/public/css",
5 css: "rhodecode/public/css",
6 js: {
6 js: {
7 "src": "rhodecode/public/js/src",
7 "src": "rhodecode/public/js/src",
8 "dest": "rhodecode/public/js"
8 "dest": "rhodecode/public/js"
9 }
9 }
10 },
10 },
11
11
12 concat: {
12 concat: {
13 dist: {
13 dist: {
14 src: [
14 src: [
15 // Base libraries
15 // Base libraries
16 '<%= dirs.js.src %>/jquery-1.11.1.min.js',
16 '<%= dirs.js.src %>/jquery-1.11.1.min.js',
17 '<%= dirs.js.src %>/logging.js',
17 '<%= dirs.js.src %>/logging.js',
18 '<%= dirs.js.src %>/bootstrap.js',
18 '<%= dirs.js.src %>/bootstrap.js',
19 '<%= dirs.js.src %>/mousetrap.js',
19 '<%= dirs.js.src %>/mousetrap.js',
20 '<%= dirs.js.src %>/moment.js',
20 '<%= dirs.js.src %>/moment.js',
21 '<%= dirs.js.src %>/appenlight-client-0.4.1.min.js',
21 '<%= dirs.js.src %>/appenlight-client-0.4.1.min.js',
22 '<%= dirs.js.src %>/i18n_utils.js',
22 '<%= dirs.js.src %>/i18n_utils.js',
23 '<%= dirs.js.src %>/deform.js',
23
24
24 // Plugins
25 // Plugins
25 '<%= dirs.js.src %>/plugins/jquery.pjax.js',
26 '<%= dirs.js.src %>/plugins/jquery.pjax.js',
26 '<%= dirs.js.src %>/plugins/jquery.dataTables.js',
27 '<%= dirs.js.src %>/plugins/jquery.dataTables.js',
27 '<%= dirs.js.src %>/plugins/flavoured_checkbox.js',
28 '<%= dirs.js.src %>/plugins/flavoured_checkbox.js',
28 '<%= dirs.js.src %>/plugins/jquery.auto-grow-input.js',
29 '<%= dirs.js.src %>/plugins/jquery.auto-grow-input.js',
29 '<%= dirs.js.src %>/plugins/jquery.autocomplete.js',
30 '<%= dirs.js.src %>/plugins/jquery.autocomplete.js',
30 '<%= dirs.js.src %>/plugins/jquery.debounce.js',
31 '<%= dirs.js.src %>/plugins/jquery.debounce.js',
31 '<%= dirs.js.src %>/plugins/jquery.mark.js',
32 '<%= dirs.js.src %>/plugins/jquery.mark.js',
32 '<%= dirs.js.src %>/plugins/jquery.timeago.js',
33 '<%= dirs.js.src %>/plugins/jquery.timeago.js',
33 '<%= dirs.js.src %>/plugins/jquery.timeago-extension.js',
34 '<%= dirs.js.src %>/plugins/jquery.timeago-extension.js',
35 '<%= dirs.js.src %>/plugins/toastr.js',
34
36
35 // Select2
37 // Select2
36 '<%= dirs.js.src %>/select2/select2.js',
38 '<%= dirs.js.src %>/select2/select2.js',
37
39
38 // Code-mirror
40 // Code-mirror
39 '<%= dirs.js.src %>/codemirror/codemirror.js',
41 '<%= dirs.js.src %>/codemirror/codemirror.js',
40 '<%= dirs.js.src %>/codemirror/codemirror_loadmode.js',
42 '<%= dirs.js.src %>/codemirror/codemirror_loadmode.js',
41 '<%= dirs.js.src %>/codemirror/codemirror_hint.js',
43 '<%= dirs.js.src %>/codemirror/codemirror_hint.js',
42 '<%= dirs.js.src %>/codemirror/codemirror_overlay.js',
44 '<%= dirs.js.src %>/codemirror/codemirror_overlay.js',
43 '<%= dirs.js.src %>/codemirror/codemirror_placeholder.js',
45 '<%= dirs.js.src %>/codemirror/codemirror_placeholder.js',
44 // TODO: mikhail: this is an exception. Since the code mirror modes
46 // TODO: mikhail: this is an exception. Since the code mirror modes
45 // are loaded "on the fly", we need to keep them in a public folder
47 // are loaded "on the fly", we need to keep them in a public folder
46 '<%= dirs.js.dest %>/mode/meta.js',
48 '<%= dirs.js.dest %>/mode/meta.js',
47 '<%= dirs.js.dest %>/mode/meta_ext.js',
49 '<%= dirs.js.dest %>/mode/meta_ext.js',
48 '<%= dirs.js.dest %>/rhodecode/i18n/select2/translations.js',
50 '<%= dirs.js.dest %>/rhodecode/i18n/select2/translations.js',
49
51
50 // Rhodecode utilities
52 // Rhodecode utilities
51 '<%= dirs.js.src %>/rhodecode/utils/array.js',
53 '<%= dirs.js.src %>/rhodecode/utils/array.js',
52 '<%= dirs.js.src %>/rhodecode/utils/string.js',
54 '<%= dirs.js.src %>/rhodecode/utils/string.js',
53 '<%= dirs.js.src %>/rhodecode/utils/pyroutes.js',
55 '<%= dirs.js.src %>/rhodecode/utils/pyroutes.js',
54 '<%= dirs.js.src %>/rhodecode/utils/ajax.js',
56 '<%= dirs.js.src %>/rhodecode/utils/ajax.js',
55 '<%= dirs.js.src %>/rhodecode/utils/autocomplete.js',
57 '<%= dirs.js.src %>/rhodecode/utils/autocomplete.js',
56 '<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js',
58 '<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js',
57 '<%= dirs.js.src %>/rhodecode/utils/ie.js',
59 '<%= dirs.js.src %>/rhodecode/utils/ie.js',
58 '<%= dirs.js.src %>/rhodecode/utils/os.js',
60 '<%= dirs.js.src %>/rhodecode/utils/os.js',
61 '<%= dirs.js.src %>/rhodecode/utils/topics.js',
59
62
60 // Rhodecode widgets
63 // Rhodecode widgets
61 '<%= dirs.js.src %>/rhodecode/widgets/multiselect.js',
64 '<%= dirs.js.src %>/rhodecode/widgets/multiselect.js',
62
65
63 // Rhodecode components
66 // Rhodecode components
64 '<%= dirs.js.src %>/rhodecode/init.js',
67 '<%= dirs.js.src %>/rhodecode/init.js',
68 '<%= dirs.js.src %>/rhodecode/connection_controller.js',
65 '<%= dirs.js.src %>/rhodecode/codemirror.js',
69 '<%= dirs.js.src %>/rhodecode/codemirror.js',
66 '<%= dirs.js.src %>/rhodecode/comments.js',
70 '<%= dirs.js.src %>/rhodecode/comments.js',
67 '<%= dirs.js.src %>/rhodecode/constants.js',
71 '<%= dirs.js.src %>/rhodecode/constants.js',
68 '<%= dirs.js.src %>/rhodecode/files.js',
72 '<%= dirs.js.src %>/rhodecode/files.js',
69 '<%= dirs.js.src %>/rhodecode/followers.js',
73 '<%= dirs.js.src %>/rhodecode/followers.js',
70 '<%= dirs.js.src %>/rhodecode/menus.js',
74 '<%= dirs.js.src %>/rhodecode/menus.js',
71 '<%= dirs.js.src %>/rhodecode/notifications.js',
75 '<%= dirs.js.src %>/rhodecode/notifications.js',
72 '<%= dirs.js.src %>/rhodecode/permissions.js',
76 '<%= dirs.js.src %>/rhodecode/permissions.js',
73 '<%= dirs.js.src %>/rhodecode/pjax.js',
77 '<%= dirs.js.src %>/rhodecode/pjax.js',
74 '<%= dirs.js.src %>/rhodecode/pullrequests.js',
78 '<%= dirs.js.src %>/rhodecode/pullrequests.js',
75 '<%= dirs.js.src %>/rhodecode/settings.js',
79 '<%= dirs.js.src %>/rhodecode/settings.js',
76 '<%= dirs.js.src %>/rhodecode/select2_widgets.js',
80 '<%= dirs.js.src %>/rhodecode/select2_widgets.js',
77 '<%= dirs.js.src %>/rhodecode/tooltips.js',
81 '<%= dirs.js.src %>/rhodecode/tooltips.js',
78 '<%= dirs.js.src %>/rhodecode/users.js',
82 '<%= dirs.js.src %>/rhodecode/users.js',
83 '<%= dirs.js.src %>/rhodecode/utils/notifications.js',
79 '<%= dirs.js.src %>/rhodecode/appenlight.js',
84 '<%= dirs.js.src %>/rhodecode/appenlight.js',
80
85
81 // Rhodecode main module
86 // Rhodecode main module
82 '<%= dirs.js.src %>/rhodecode.js'
87 '<%= dirs.js.src %>/rhodecode.js'
83 ],
88 ],
84 dest: '<%= dirs.js.dest %>/scripts.js',
89 dest: '<%= dirs.js.dest %>/scripts.js',
85 nonull: true
90 nonull: true
86 }
91 }
87 },
92 },
88
93
89 less: {
94 less: {
90 development: {
95 development: {
91 options: {
96 options: {
92 compress: false,
97 compress: false,
93 yuicompress: false,
98 yuicompress: false,
94 optimization: 0
99 optimization: 0
95 },
100 },
96 files: {
101 files: {
97 "<%= dirs.css %>/style.css": "<%= dirs.css %>/main.less"
102 "<%= dirs.css %>/style.css": "<%= dirs.css %>/main.less"
98 }
103 }
99 },
104 },
100 production: {
105 production: {
101 options: {
106 options: {
102 compress: true,
107 compress: true,
103 yuicompress: true,
108 yuicompress: true,
104 optimization: 2
109 optimization: 2
105 },
110 },
106 files: {
111 files: {
107 "<%= dirs.css %>/style.css": "<%= dirs.css %>/main.less"
112 "<%= dirs.css %>/style.css": "<%= dirs.css %>/main.less"
108 }
113 }
109 }
114 }
110 },
115 },
111
116
112 watch: {
117 watch: {
113 less: {
118 less: {
114 files: ["<%= dirs.css %>/*.less"],
119 files: ["<%= dirs.css %>/*.less"],
115 tasks: ["less:production"]
120 tasks: ["less:production"]
116 },
121 },
117 js: {
122 js: {
118 files: ["<%= dirs.js.src %>/**/*.js"],
123 files: ["<%= dirs.js.src %>/**/*.js"],
119 tasks: ["concat:dist"]
124 tasks: ["concat:dist"]
120 }
125 }
121 },
126 },
122
127
123 jshint: {
128 jshint: {
124 rhodecode: {
129 rhodecode: {
125 src: '<%= dirs.js.src %>/rhodecode/**/*.js',
130 src: '<%= dirs.js.src %>/rhodecode/**/*.js',
126 options: {
131 options: {
127 jshintrc: '.jshintrc'
132 jshintrc: '.jshintrc'
128 }
133 }
129 }
134 }
130 }
135 }
131 });
136 });
132
137
133 grunt.loadNpmTasks('grunt-contrib-less');
138 grunt.loadNpmTasks('grunt-contrib-less');
134 grunt.loadNpmTasks('grunt-contrib-concat');
139 grunt.loadNpmTasks('grunt-contrib-concat');
135 grunt.loadNpmTasks('grunt-contrib-watch');
140 grunt.loadNpmTasks('grunt-contrib-watch');
136 grunt.loadNpmTasks('grunt-contrib-jshint');
141 grunt.loadNpmTasks('grunt-contrib-jshint');
137
142
138 grunt.registerTask('default', ['less:production', 'concat:dist']);
143 grunt.registerTask('default', ['less:production', 'concat:dist']);
139 };
144 };
@@ -1,690 +1,692 b''
1 This program is free software: you can redistribute it and/or modify
1 This program is free software: you can redistribute it and/or modify
2 it under the terms of the GNU Affero General Public License, version 3
2 it under the terms of the GNU Affero General Public License, version 3
3 (only), as published by the Free Software Foundation.
3 (only), as published by the Free Software Foundation.
4
4
5
5
6 This program incorporates work covered by the following copyright and
6 This program incorporates work covered by the following copyright and
7 permission notice:
7 permission notice:
8
8
9 Copyright (c) 2014-2016 - packaging
9 Copyright (c) 2014-2016 - packaging
10 file:
10 file:
11 Copyright (c) 2008-2011 - msgpack-python
11 Copyright (c) 2008-2011 - msgpack-python
12 file:licenses/msgpack_license.txt
12 file:licenses/msgpack_license.txt
13 Copyright (c) 2009 - tornado
14 file:licenses/tornado_license.txt
13
15
14 Both licensed under the Apache License, Version 2.0 (the "License");
16 All licensed under the Apache License, Version 2.0 (the "License");
15 you may not use this file except in compliance with the License.
17 you may not use this file except in compliance with the License.
16 You may obtain a copy of the License at
18 You may obtain a copy of the License at
17
19
18 http://www.apache.org/licenses/LICENSE-2.0
20 http://www.apache.org/licenses/LICENSE-2.0
19
21
20 Unless required by applicable law or agreed to in writing, software
22 Unless required by applicable law or agreed to in writing, software
21 distributed under the License is distributed on an "AS IS" BASIS,
23 distributed under the License is distributed on an "AS IS" BASIS,
22 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23 See the License for the specific language governing permissions and
25 See the License for the specific language governing permissions and
24 imitations under the License.
26 imitations under the License.
25
27
26
28
27 Below is the full text of GNU Affero General Public License, version 3
29 Below is the full text of GNU Affero General Public License, version 3
28
30
29
31
30 GNU AFFERO GENERAL PUBLIC LICENSE
32 GNU AFFERO GENERAL PUBLIC LICENSE
31 Version 3, 19 November 2007
33 Version 3, 19 November 2007
32
34
33 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
35 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
34 Everyone is permitted to copy and distribute verbatim copies
36 Everyone is permitted to copy and distribute verbatim copies
35 of this license document, but changing it is not allowed.
37 of this license document, but changing it is not allowed.
36
38
37 Preamble
39 Preamble
38
40
39 The GNU Affero General Public License is a free, copyleft license for
41 The GNU Affero General Public License is a free, copyleft license for
40 software and other kinds of works, specifically designed to ensure
42 software and other kinds of works, specifically designed to ensure
41 cooperation with the community in the case of network server software.
43 cooperation with the community in the case of network server software.
42
44
43 The licenses for most software and other practical works are designed
45 The licenses for most software and other practical works are designed
44 to take away your freedom to share and change the works. By contrast,
46 to take away your freedom to share and change the works. By contrast,
45 our General Public Licenses are intended to guarantee your freedom to
47 our General Public Licenses are intended to guarantee your freedom to
46 share and change all versions of a program--to make sure it remains free
48 share and change all versions of a program--to make sure it remains free
47 software for all its users.
49 software for all its users.
48
50
49 When we speak of free software, we are referring to freedom, not
51 When we speak of free software, we are referring to freedom, not
50 price. Our General Public Licenses are designed to make sure that you
52 price. Our General Public Licenses are designed to make sure that you
51 have the freedom to distribute copies of free software (and charge for
53 have the freedom to distribute copies of free software (and charge for
52 them if you wish), that you receive source code or can get it if you
54 them if you wish), that you receive source code or can get it if you
53 want it, that you can change the software or use pieces of it in new
55 want it, that you can change the software or use pieces of it in new
54 free programs, and that you know you can do these things.
56 free programs, and that you know you can do these things.
55
57
56 Developers that use our General Public Licenses protect your rights
58 Developers that use our General Public Licenses protect your rights
57 with two steps: (1) assert copyright on the software, and (2) offer
59 with two steps: (1) assert copyright on the software, and (2) offer
58 you this License which gives you legal permission to copy, distribute
60 you this License which gives you legal permission to copy, distribute
59 and/or modify the software.
61 and/or modify the software.
60
62
61 A secondary benefit of defending all users' freedom is that
63 A secondary benefit of defending all users' freedom is that
62 improvements made in alternate versions of the program, if they
64 improvements made in alternate versions of the program, if they
63 receive widespread use, become available for other developers to
65 receive widespread use, become available for other developers to
64 incorporate. Many developers of free software are heartened and
66 incorporate. Many developers of free software are heartened and
65 encouraged by the resulting cooperation. However, in the case of
67 encouraged by the resulting cooperation. However, in the case of
66 software used on network servers, this result may fail to come about.
68 software used on network servers, this result may fail to come about.
67 The GNU General Public License permits making a modified version and
69 The GNU General Public License permits making a modified version and
68 letting the public access it on a server without ever releasing its
70 letting the public access it on a server without ever releasing its
69 source code to the public.
71 source code to the public.
70
72
71 The GNU Affero General Public License is designed specifically to
73 The GNU Affero General Public License is designed specifically to
72 ensure that, in such cases, the modified source code becomes available
74 ensure that, in such cases, the modified source code becomes available
73 to the community. It requires the operator of a network server to
75 to the community. It requires the operator of a network server to
74 provide the source code of the modified version running there to the
76 provide the source code of the modified version running there to the
75 users of that server. Therefore, public use of a modified version, on
77 users of that server. Therefore, public use of a modified version, on
76 a publicly accessible server, gives the public access to the source
78 a publicly accessible server, gives the public access to the source
77 code of the modified version.
79 code of the modified version.
78
80
79 An older license, called the Affero General Public License and
81 An older license, called the Affero General Public License and
80 published by Affero, was designed to accomplish similar goals. This is
82 published by Affero, was designed to accomplish similar goals. This is
81 a different license, not a version of the Affero GPL, but Affero has
83 a different license, not a version of the Affero GPL, but Affero has
82 released a new version of the Affero GPL which permits relicensing under
84 released a new version of the Affero GPL which permits relicensing under
83 this license.
85 this license.
84
86
85 The precise terms and conditions for copying, distribution and
87 The precise terms and conditions for copying, distribution and
86 modification follow.
88 modification follow.
87
89
88 TERMS AND CONDITIONS
90 TERMS AND CONDITIONS
89
91
90 0. Definitions.
92 0. Definitions.
91
93
92 "This License" refers to version 3 of the GNU Affero General Public License.
94 "This License" refers to version 3 of the GNU Affero General Public License.
93
95
94 "Copyright" also means copyright-like laws that apply to other kinds of
96 "Copyright" also means copyright-like laws that apply to other kinds of
95 works, such as semiconductor masks.
97 works, such as semiconductor masks.
96
98
97 "The Program" refers to any copyrightable work licensed under this
99 "The Program" refers to any copyrightable work licensed under this
98 License. Each licensee is addressed as "you". "Licensees" and
100 License. Each licensee is addressed as "you". "Licensees" and
99 "recipients" may be individuals or organizations.
101 "recipients" may be individuals or organizations.
100
102
101 To "modify" a work means to copy from or adapt all or part of the work
103 To "modify" a work means to copy from or adapt all or part of the work
102 in a fashion requiring copyright permission, other than the making of an
104 in a fashion requiring copyright permission, other than the making of an
103 exact copy. The resulting work is called a "modified version" of the
105 exact copy. The resulting work is called a "modified version" of the
104 earlier work or a work "based on" the earlier work.
106 earlier work or a work "based on" the earlier work.
105
107
106 A "covered work" means either the unmodified Program or a work based
108 A "covered work" means either the unmodified Program or a work based
107 on the Program.
109 on the Program.
108
110
109 To "propagate" a work means to do anything with it that, without
111 To "propagate" a work means to do anything with it that, without
110 permission, would make you directly or secondarily liable for
112 permission, would make you directly or secondarily liable for
111 infringement under applicable copyright law, except executing it on a
113 infringement under applicable copyright law, except executing it on a
112 computer or modifying a private copy. Propagation includes copying,
114 computer or modifying a private copy. Propagation includes copying,
113 distribution (with or without modification), making available to the
115 distribution (with or without modification), making available to the
114 public, and in some countries other activities as well.
116 public, and in some countries other activities as well.
115
117
116 To "convey" a work means any kind of propagation that enables other
118 To "convey" a work means any kind of propagation that enables other
117 parties to make or receive copies. Mere interaction with a user through
119 parties to make or receive copies. Mere interaction with a user through
118 a computer network, with no transfer of a copy, is not conveying.
120 a computer network, with no transfer of a copy, is not conveying.
119
121
120 An interactive user interface displays "Appropriate Legal Notices"
122 An interactive user interface displays "Appropriate Legal Notices"
121 to the extent that it includes a convenient and prominently visible
123 to the extent that it includes a convenient and prominently visible
122 feature that (1) displays an appropriate copyright notice, and (2)
124 feature that (1) displays an appropriate copyright notice, and (2)
123 tells the user that there is no warranty for the work (except to the
125 tells the user that there is no warranty for the work (except to the
124 extent that warranties are provided), that licensees may convey the
126 extent that warranties are provided), that licensees may convey the
125 work under this License, and how to view a copy of this License. If
127 work under this License, and how to view a copy of this License. If
126 the interface presents a list of user commands or options, such as a
128 the interface presents a list of user commands or options, such as a
127 menu, a prominent item in the list meets this criterion.
129 menu, a prominent item in the list meets this criterion.
128
130
129 1. Source Code.
131 1. Source Code.
130
132
131 The "source code" for a work means the preferred form of the work
133 The "source code" for a work means the preferred form of the work
132 for making modifications to it. "Object code" means any non-source
134 for making modifications to it. "Object code" means any non-source
133 form of a work.
135 form of a work.
134
136
135 A "Standard Interface" means an interface that either is an official
137 A "Standard Interface" means an interface that either is an official
136 standard defined by a recognized standards body, or, in the case of
138 standard defined by a recognized standards body, or, in the case of
137 interfaces specified for a particular programming language, one that
139 interfaces specified for a particular programming language, one that
138 is widely used among developers working in that language.
140 is widely used among developers working in that language.
139
141
140 The "System Libraries" of an executable work include anything, other
142 The "System Libraries" of an executable work include anything, other
141 than the work as a whole, that (a) is included in the normal form of
143 than the work as a whole, that (a) is included in the normal form of
142 packaging a Major Component, but which is not part of that Major
144 packaging a Major Component, but which is not part of that Major
143 Component, and (b) serves only to enable use of the work with that
145 Component, and (b) serves only to enable use of the work with that
144 Major Component, or to implement a Standard Interface for which an
146 Major Component, or to implement a Standard Interface for which an
145 implementation is available to the public in source code form. A
147 implementation is available to the public in source code form. A
146 "Major Component", in this context, means a major essential component
148 "Major Component", in this context, means a major essential component
147 (kernel, window system, and so on) of the specific operating system
149 (kernel, window system, and so on) of the specific operating system
148 (if any) on which the executable work runs, or a compiler used to
150 (if any) on which the executable work runs, or a compiler used to
149 produce the work, or an object code interpreter used to run it.
151 produce the work, or an object code interpreter used to run it.
150
152
151 The "Corresponding Source" for a work in object code form means all
153 The "Corresponding Source" for a work in object code form means all
152 the source code needed to generate, install, and (for an executable
154 the source code needed to generate, install, and (for an executable
153 work) run the object code and to modify the work, including scripts to
155 work) run the object code and to modify the work, including scripts to
154 control those activities. However, it does not include the work's
156 control those activities. However, it does not include the work's
155 System Libraries, or general-purpose tools or generally available free
157 System Libraries, or general-purpose tools or generally available free
156 programs which are used unmodified in performing those activities but
158 programs which are used unmodified in performing those activities but
157 which are not part of the work. For example, Corresponding Source
159 which are not part of the work. For example, Corresponding Source
158 includes interface definition files associated with source files for
160 includes interface definition files associated with source files for
159 the work, and the source code for shared libraries and dynamically
161 the work, and the source code for shared libraries and dynamically
160 linked subprograms that the work is specifically designed to require,
162 linked subprograms that the work is specifically designed to require,
161 such as by intimate data communication or control flow between those
163 such as by intimate data communication or control flow between those
162 subprograms and other parts of the work.
164 subprograms and other parts of the work.
163
165
164 The Corresponding Source need not include anything that users
166 The Corresponding Source need not include anything that users
165 can regenerate automatically from other parts of the Corresponding
167 can regenerate automatically from other parts of the Corresponding
166 Source.
168 Source.
167
169
168 The Corresponding Source for a work in source code form is that
170 The Corresponding Source for a work in source code form is that
169 same work.
171 same work.
170
172
171 2. Basic Permissions.
173 2. Basic Permissions.
172
174
173 All rights granted under this License are granted for the term of
175 All rights granted under this License are granted for the term of
174 copyright on the Program, and are irrevocable provided the stated
176 copyright on the Program, and are irrevocable provided the stated
175 conditions are met. This License explicitly affirms your unlimited
177 conditions are met. This License explicitly affirms your unlimited
176 permission to run the unmodified Program. The output from running a
178 permission to run the unmodified Program. The output from running a
177 covered work is covered by this License only if the output, given its
179 covered work is covered by this License only if the output, given its
178 content, constitutes a covered work. This License acknowledges your
180 content, constitutes a covered work. This License acknowledges your
179 rights of fair use or other equivalent, as provided by copyright law.
181 rights of fair use or other equivalent, as provided by copyright law.
180
182
181 You may make, run and propagate covered works that you do not
183 You may make, run and propagate covered works that you do not
182 convey, without conditions so long as your license otherwise remains
184 convey, without conditions so long as your license otherwise remains
183 in force. You may convey covered works to others for the sole purpose
185 in force. You may convey covered works to others for the sole purpose
184 of having them make modifications exclusively for you, or provide you
186 of having them make modifications exclusively for you, or provide you
185 with facilities for running those works, provided that you comply with
187 with facilities for running those works, provided that you comply with
186 the terms of this License in conveying all material for which you do
188 the terms of this License in conveying all material for which you do
187 not control copyright. Those thus making or running the covered works
189 not control copyright. Those thus making or running the covered works
188 for you must do so exclusively on your behalf, under your direction
190 for you must do so exclusively on your behalf, under your direction
189 and control, on terms that prohibit them from making any copies of
191 and control, on terms that prohibit them from making any copies of
190 your copyrighted material outside their relationship with you.
192 your copyrighted material outside their relationship with you.
191
193
192 Conveying under any other circumstances is permitted solely under
194 Conveying under any other circumstances is permitted solely under
193 the conditions stated below. Sublicensing is not allowed; section 10
195 the conditions stated below. Sublicensing is not allowed; section 10
194 makes it unnecessary.
196 makes it unnecessary.
195
197
196 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
198 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
197
199
198 No covered work shall be deemed part of an effective technological
200 No covered work shall be deemed part of an effective technological
199 measure under any applicable law fulfilling obligations under article
201 measure under any applicable law fulfilling obligations under article
200 11 of the WIPO copyright treaty adopted on 20 December 1996, or
202 11 of the WIPO copyright treaty adopted on 20 December 1996, or
201 similar laws prohibiting or restricting circumvention of such
203 similar laws prohibiting or restricting circumvention of such
202 measures.
204 measures.
203
205
204 When you convey a covered work, you waive any legal power to forbid
206 When you convey a covered work, you waive any legal power to forbid
205 circumvention of technological measures to the extent such circumvention
207 circumvention of technological measures to the extent such circumvention
206 is effected by exercising rights under this License with respect to
208 is effected by exercising rights under this License with respect to
207 the covered work, and you disclaim any intention to limit operation or
209 the covered work, and you disclaim any intention to limit operation or
208 modification of the work as a means of enforcing, against the work's
210 modification of the work as a means of enforcing, against the work's
209 users, your or third parties' legal rights to forbid circumvention of
211 users, your or third parties' legal rights to forbid circumvention of
210 technological measures.
212 technological measures.
211
213
212 4. Conveying Verbatim Copies.
214 4. Conveying Verbatim Copies.
213
215
214 You may convey verbatim copies of the Program's source code as you
216 You may convey verbatim copies of the Program's source code as you
215 receive it, in any medium, provided that you conspicuously and
217 receive it, in any medium, provided that you conspicuously and
216 appropriately publish on each copy an appropriate copyright notice;
218 appropriately publish on each copy an appropriate copyright notice;
217 keep intact all notices stating that this License and any
219 keep intact all notices stating that this License and any
218 non-permissive terms added in accord with section 7 apply to the code;
220 non-permissive terms added in accord with section 7 apply to the code;
219 keep intact all notices of the absence of any warranty; and give all
221 keep intact all notices of the absence of any warranty; and give all
220 recipients a copy of this License along with the Program.
222 recipients a copy of this License along with the Program.
221
223
222 You may charge any price or no price for each copy that you convey,
224 You may charge any price or no price for each copy that you convey,
223 and you may offer support or warranty protection for a fee.
225 and you may offer support or warranty protection for a fee.
224
226
225 5. Conveying Modified Source Versions.
227 5. Conveying Modified Source Versions.
226
228
227 You may convey a work based on the Program, or the modifications to
229 You may convey a work based on the Program, or the modifications to
228 produce it from the Program, in the form of source code under the
230 produce it from the Program, in the form of source code under the
229 terms of section 4, provided that you also meet all of these conditions:
231 terms of section 4, provided that you also meet all of these conditions:
230
232
231 a) The work must carry prominent notices stating that you modified
233 a) The work must carry prominent notices stating that you modified
232 it, and giving a relevant date.
234 it, and giving a relevant date.
233
235
234 b) The work must carry prominent notices stating that it is
236 b) The work must carry prominent notices stating that it is
235 released under this License and any conditions added under section
237 released under this License and any conditions added under section
236 7. This requirement modifies the requirement in section 4 to
238 7. This requirement modifies the requirement in section 4 to
237 "keep intact all notices".
239 "keep intact all notices".
238
240
239 c) You must license the entire work, as a whole, under this
241 c) You must license the entire work, as a whole, under this
240 License to anyone who comes into possession of a copy. This
242 License to anyone who comes into possession of a copy. This
241 License will therefore apply, along with any applicable section 7
243 License will therefore apply, along with any applicable section 7
242 additional terms, to the whole of the work, and all its parts,
244 additional terms, to the whole of the work, and all its parts,
243 regardless of how they are packaged. This License gives no
245 regardless of how they are packaged. This License gives no
244 permission to license the work in any other way, but it does not
246 permission to license the work in any other way, but it does not
245 invalidate such permission if you have separately received it.
247 invalidate such permission if you have separately received it.
246
248
247 d) If the work has interactive user interfaces, each must display
249 d) If the work has interactive user interfaces, each must display
248 Appropriate Legal Notices; however, if the Program has interactive
250 Appropriate Legal Notices; however, if the Program has interactive
249 interfaces that do not display Appropriate Legal Notices, your
251 interfaces that do not display Appropriate Legal Notices, your
250 work need not make them do so.
252 work need not make them do so.
251
253
252 A compilation of a covered work with other separate and independent
254 A compilation of a covered work with other separate and independent
253 works, which are not by their nature extensions of the covered work,
255 works, which are not by their nature extensions of the covered work,
254 and which are not combined with it such as to form a larger program,
256 and which are not combined with it such as to form a larger program,
255 in or on a volume of a storage or distribution medium, is called an
257 in or on a volume of a storage or distribution medium, is called an
256 "aggregate" if the compilation and its resulting copyright are not
258 "aggregate" if the compilation and its resulting copyright are not
257 used to limit the access or legal rights of the compilation's users
259 used to limit the access or legal rights of the compilation's users
258 beyond what the individual works permit. Inclusion of a covered work
260 beyond what the individual works permit. Inclusion of a covered work
259 in an aggregate does not cause this License to apply to the other
261 in an aggregate does not cause this License to apply to the other
260 parts of the aggregate.
262 parts of the aggregate.
261
263
262 6. Conveying Non-Source Forms.
264 6. Conveying Non-Source Forms.
263
265
264 You may convey a covered work in object code form under the terms
266 You may convey a covered work in object code form under the terms
265 of sections 4 and 5, provided that you also convey the
267 of sections 4 and 5, provided that you also convey the
266 machine-readable Corresponding Source under the terms of this License,
268 machine-readable Corresponding Source under the terms of this License,
267 in one of these ways:
269 in one of these ways:
268
270
269 a) Convey the object code in, or embodied in, a physical product
271 a) Convey the object code in, or embodied in, a physical product
270 (including a physical distribution medium), accompanied by the
272 (including a physical distribution medium), accompanied by the
271 Corresponding Source fixed on a durable physical medium
273 Corresponding Source fixed on a durable physical medium
272 customarily used for software interchange.
274 customarily used for software interchange.
273
275
274 b) Convey the object code in, or embodied in, a physical product
276 b) Convey the object code in, or embodied in, a physical product
275 (including a physical distribution medium), accompanied by a
277 (including a physical distribution medium), accompanied by a
276 written offer, valid for at least three years and valid for as
278 written offer, valid for at least three years and valid for as
277 long as you offer spare parts or customer support for that product
279 long as you offer spare parts or customer support for that product
278 model, to give anyone who possesses the object code either (1) a
280 model, to give anyone who possesses the object code either (1) a
279 copy of the Corresponding Source for all the software in the
281 copy of the Corresponding Source for all the software in the
280 product that is covered by this License, on a durable physical
282 product that is covered by this License, on a durable physical
281 medium customarily used for software interchange, for a price no
283 medium customarily used for software interchange, for a price no
282 more than your reasonable cost of physically performing this
284 more than your reasonable cost of physically performing this
283 conveying of source, or (2) access to copy the
285 conveying of source, or (2) access to copy the
284 Corresponding Source from a network server at no charge.
286 Corresponding Source from a network server at no charge.
285
287
286 c) Convey individual copies of the object code with a copy of the
288 c) Convey individual copies of the object code with a copy of the
287 written offer to provide the Corresponding Source. This
289 written offer to provide the Corresponding Source. This
288 alternative is allowed only occasionally and noncommercially, and
290 alternative is allowed only occasionally and noncommercially, and
289 only if you received the object code with such an offer, in accord
291 only if you received the object code with such an offer, in accord
290 with subsection 6b.
292 with subsection 6b.
291
293
292 d) Convey the object code by offering access from a designated
294 d) Convey the object code by offering access from a designated
293 place (gratis or for a charge), and offer equivalent access to the
295 place (gratis or for a charge), and offer equivalent access to the
294 Corresponding Source in the same way through the same place at no
296 Corresponding Source in the same way through the same place at no
295 further charge. You need not require recipients to copy the
297 further charge. You need not require recipients to copy the
296 Corresponding Source along with the object code. If the place to
298 Corresponding Source along with the object code. If the place to
297 copy the object code is a network server, the Corresponding Source
299 copy the object code is a network server, the Corresponding Source
298 may be on a different server (operated by you or a third party)
300 may be on a different server (operated by you or a third party)
299 that supports equivalent copying facilities, provided you maintain
301 that supports equivalent copying facilities, provided you maintain
300 clear directions next to the object code saying where to find the
302 clear directions next to the object code saying where to find the
301 Corresponding Source. Regardless of what server hosts the
303 Corresponding Source. Regardless of what server hosts the
302 Corresponding Source, you remain obligated to ensure that it is
304 Corresponding Source, you remain obligated to ensure that it is
303 available for as long as needed to satisfy these requirements.
305 available for as long as needed to satisfy these requirements.
304
306
305 e) Convey the object code using peer-to-peer transmission, provided
307 e) Convey the object code using peer-to-peer transmission, provided
306 you inform other peers where the object code and Corresponding
308 you inform other peers where the object code and Corresponding
307 Source of the work are being offered to the general public at no
309 Source of the work are being offered to the general public at no
308 charge under subsection 6d.
310 charge under subsection 6d.
309
311
310 A separable portion of the object code, whose source code is excluded
312 A separable portion of the object code, whose source code is excluded
311 from the Corresponding Source as a System Library, need not be
313 from the Corresponding Source as a System Library, need not be
312 included in conveying the object code work.
314 included in conveying the object code work.
313
315
314 A "User Product" is either (1) a "consumer product", which means any
316 A "User Product" is either (1) a "consumer product", which means any
315 tangible personal property which is normally used for personal, family,
317 tangible personal property which is normally used for personal, family,
316 or household purposes, or (2) anything designed or sold for incorporation
318 or household purposes, or (2) anything designed or sold for incorporation
317 into a dwelling. In determining whether a product is a consumer product,
319 into a dwelling. In determining whether a product is a consumer product,
318 doubtful cases shall be resolved in favor of coverage. For a particular
320 doubtful cases shall be resolved in favor of coverage. For a particular
319 product received by a particular user, "normally used" refers to a
321 product received by a particular user, "normally used" refers to a
320 typical or common use of that class of product, regardless of the status
322 typical or common use of that class of product, regardless of the status
321 of the particular user or of the way in which the particular user
323 of the particular user or of the way in which the particular user
322 actually uses, or expects or is expected to use, the product. A product
324 actually uses, or expects or is expected to use, the product. A product
323 is a consumer product regardless of whether the product has substantial
325 is a consumer product regardless of whether the product has substantial
324 commercial, industrial or non-consumer uses, unless such uses represent
326 commercial, industrial or non-consumer uses, unless such uses represent
325 the only significant mode of use of the product.
327 the only significant mode of use of the product.
326
328
327 "Installation Information" for a User Product means any methods,
329 "Installation Information" for a User Product means any methods,
328 procedures, authorization keys, or other information required to install
330 procedures, authorization keys, or other information required to install
329 and execute modified versions of a covered work in that User Product from
331 and execute modified versions of a covered work in that User Product from
330 a modified version of its Corresponding Source. The information must
332 a modified version of its Corresponding Source. The information must
331 suffice to ensure that the continued functioning of the modified object
333 suffice to ensure that the continued functioning of the modified object
332 code is in no case prevented or interfered with solely because
334 code is in no case prevented or interfered with solely because
333 modification has been made.
335 modification has been made.
334
336
335 If you convey an object code work under this section in, or with, or
337 If you convey an object code work under this section in, or with, or
336 specifically for use in, a User Product, and the conveying occurs as
338 specifically for use in, a User Product, and the conveying occurs as
337 part of a transaction in which the right of possession and use of the
339 part of a transaction in which the right of possession and use of the
338 User Product is transferred to the recipient in perpetuity or for a
340 User Product is transferred to the recipient in perpetuity or for a
339 fixed term (regardless of how the transaction is characterized), the
341 fixed term (regardless of how the transaction is characterized), the
340 Corresponding Source conveyed under this section must be accompanied
342 Corresponding Source conveyed under this section must be accompanied
341 by the Installation Information. But this requirement does not apply
343 by the Installation Information. But this requirement does not apply
342 if neither you nor any third party retains the ability to install
344 if neither you nor any third party retains the ability to install
343 modified object code on the User Product (for example, the work has
345 modified object code on the User Product (for example, the work has
344 been installed in ROM).
346 been installed in ROM).
345
347
346 The requirement to provide Installation Information does not include a
348 The requirement to provide Installation Information does not include a
347 requirement to continue to provide support service, warranty, or updates
349 requirement to continue to provide support service, warranty, or updates
348 for a work that has been modified or installed by the recipient, or for
350 for a work that has been modified or installed by the recipient, or for
349 the User Product in which it has been modified or installed. Access to a
351 the User Product in which it has been modified or installed. Access to a
350 network may be denied when the modification itself materially and
352 network may be denied when the modification itself materially and
351 adversely affects the operation of the network or violates the rules and
353 adversely affects the operation of the network or violates the rules and
352 protocols for communication across the network.
354 protocols for communication across the network.
353
355
354 Corresponding Source conveyed, and Installation Information provided,
356 Corresponding Source conveyed, and Installation Information provided,
355 in accord with this section must be in a format that is publicly
357 in accord with this section must be in a format that is publicly
356 documented (and with an implementation available to the public in
358 documented (and with an implementation available to the public in
357 source code form), and must require no special password or key for
359 source code form), and must require no special password or key for
358 unpacking, reading or copying.
360 unpacking, reading or copying.
359
361
360 7. Additional Terms.
362 7. Additional Terms.
361
363
362 "Additional permissions" are terms that supplement the terms of this
364 "Additional permissions" are terms that supplement the terms of this
363 License by making exceptions from one or more of its conditions.
365 License by making exceptions from one or more of its conditions.
364 Additional permissions that are applicable to the entire Program shall
366 Additional permissions that are applicable to the entire Program shall
365 be treated as though they were included in this License, to the extent
367 be treated as though they were included in this License, to the extent
366 that they are valid under applicable law. If additional permissions
368 that they are valid under applicable law. If additional permissions
367 apply only to part of the Program, that part may be used separately
369 apply only to part of the Program, that part may be used separately
368 under those permissions, but the entire Program remains governed by
370 under those permissions, but the entire Program remains governed by
369 this License without regard to the additional permissions.
371 this License without regard to the additional permissions.
370
372
371 When you convey a copy of a covered work, you may at your option
373 When you convey a copy of a covered work, you may at your option
372 remove any additional permissions from that copy, or from any part of
374 remove any additional permissions from that copy, or from any part of
373 it. (Additional permissions may be written to require their own
375 it. (Additional permissions may be written to require their own
374 removal in certain cases when you modify the work.) You may place
376 removal in certain cases when you modify the work.) You may place
375 additional permissions on material, added by you to a covered work,
377 additional permissions on material, added by you to a covered work,
376 for which you have or can give appropriate copyright permission.
378 for which you have or can give appropriate copyright permission.
377
379
378 Notwithstanding any other provision of this License, for material you
380 Notwithstanding any other provision of this License, for material you
379 add to a covered work, you may (if authorized by the copyright holders of
381 add to a covered work, you may (if authorized by the copyright holders of
380 that material) supplement the terms of this License with terms:
382 that material) supplement the terms of this License with terms:
381
383
382 a) Disclaiming warranty or limiting liability differently from the
384 a) Disclaiming warranty or limiting liability differently from the
383 terms of sections 15 and 16 of this License; or
385 terms of sections 15 and 16 of this License; or
384
386
385 b) Requiring preservation of specified reasonable legal notices or
387 b) Requiring preservation of specified reasonable legal notices or
386 author attributions in that material or in the Appropriate Legal
388 author attributions in that material or in the Appropriate Legal
387 Notices displayed by works containing it; or
389 Notices displayed by works containing it; or
388
390
389 c) Prohibiting misrepresentation of the origin of that material, or
391 c) Prohibiting misrepresentation of the origin of that material, or
390 requiring that modified versions of such material be marked in
392 requiring that modified versions of such material be marked in
391 reasonable ways as different from the original version; or
393 reasonable ways as different from the original version; or
392
394
393 d) Limiting the use for publicity purposes of names of licensors or
395 d) Limiting the use for publicity purposes of names of licensors or
394 authors of the material; or
396 authors of the material; or
395
397
396 e) Declining to grant rights under trademark law for use of some
398 e) Declining to grant rights under trademark law for use of some
397 trade names, trademarks, or service marks; or
399 trade names, trademarks, or service marks; or
398
400
399 f) Requiring indemnification of licensors and authors of that
401 f) Requiring indemnification of licensors and authors of that
400 material by anyone who conveys the material (or modified versions of
402 material by anyone who conveys the material (or modified versions of
401 it) with contractual assumptions of liability to the recipient, for
403 it) with contractual assumptions of liability to the recipient, for
402 any liability that these contractual assumptions directly impose on
404 any liability that these contractual assumptions directly impose on
403 those licensors and authors.
405 those licensors and authors.
404
406
405 All other non-permissive additional terms are considered "further
407 All other non-permissive additional terms are considered "further
406 restrictions" within the meaning of section 10. If the Program as you
408 restrictions" within the meaning of section 10. If the Program as you
407 received it, or any part of it, contains a notice stating that it is
409 received it, or any part of it, contains a notice stating that it is
408 governed by this License along with a term that is a further
410 governed by this License along with a term that is a further
409 restriction, you may remove that term. If a license document contains
411 restriction, you may remove that term. If a license document contains
410 a further restriction but permits relicensing or conveying under this
412 a further restriction but permits relicensing or conveying under this
411 License, you may add to a covered work material governed by the terms
413 License, you may add to a covered work material governed by the terms
412 of that license document, provided that the further restriction does
414 of that license document, provided that the further restriction does
413 not survive such relicensing or conveying.
415 not survive such relicensing or conveying.
414
416
415 If you add terms to a covered work in accord with this section, you
417 If you add terms to a covered work in accord with this section, you
416 must place, in the relevant source files, a statement of the
418 must place, in the relevant source files, a statement of the
417 additional terms that apply to those files, or a notice indicating
419 additional terms that apply to those files, or a notice indicating
418 where to find the applicable terms.
420 where to find the applicable terms.
419
421
420 Additional terms, permissive or non-permissive, may be stated in the
422 Additional terms, permissive or non-permissive, may be stated in the
421 form of a separately written license, or stated as exceptions;
423 form of a separately written license, or stated as exceptions;
422 the above requirements apply either way.
424 the above requirements apply either way.
423
425
424 8. Termination.
426 8. Termination.
425
427
426 You may not propagate or modify a covered work except as expressly
428 You may not propagate or modify a covered work except as expressly
427 provided under this License. Any attempt otherwise to propagate or
429 provided under this License. Any attempt otherwise to propagate or
428 modify it is void, and will automatically terminate your rights under
430 modify it is void, and will automatically terminate your rights under
429 this License (including any patent licenses granted under the third
431 this License (including any patent licenses granted under the third
430 paragraph of section 11).
432 paragraph of section 11).
431
433
432 However, if you cease all violation of this License, then your
434 However, if you cease all violation of this License, then your
433 license from a particular copyright holder is reinstated (a)
435 license from a particular copyright holder is reinstated (a)
434 provisionally, unless and until the copyright holder explicitly and
436 provisionally, unless and until the copyright holder explicitly and
435 finally terminates your license, and (b) permanently, if the copyright
437 finally terminates your license, and (b) permanently, if the copyright
436 holder fails to notify you of the violation by some reasonable means
438 holder fails to notify you of the violation by some reasonable means
437 prior to 60 days after the cessation.
439 prior to 60 days after the cessation.
438
440
439 Moreover, your license from a particular copyright holder is
441 Moreover, your license from a particular copyright holder is
440 reinstated permanently if the copyright holder notifies you of the
442 reinstated permanently if the copyright holder notifies you of the
441 violation by some reasonable means, this is the first time you have
443 violation by some reasonable means, this is the first time you have
442 received notice of violation of this License (for any work) from that
444 received notice of violation of this License (for any work) from that
443 copyright holder, and you cure the violation prior to 30 days after
445 copyright holder, and you cure the violation prior to 30 days after
444 your receipt of the notice.
446 your receipt of the notice.
445
447
446 Termination of your rights under this section does not terminate the
448 Termination of your rights under this section does not terminate the
447 licenses of parties who have received copies or rights from you under
449 licenses of parties who have received copies or rights from you under
448 this License. If your rights have been terminated and not permanently
450 this License. If your rights have been terminated and not permanently
449 reinstated, you do not qualify to receive new licenses for the same
451 reinstated, you do not qualify to receive new licenses for the same
450 material under section 10.
452 material under section 10.
451
453
452 9. Acceptance Not Required for Having Copies.
454 9. Acceptance Not Required for Having Copies.
453
455
454 You are not required to accept this License in order to receive or
456 You are not required to accept this License in order to receive or
455 run a copy of the Program. Ancillary propagation of a covered work
457 run a copy of the Program. Ancillary propagation of a covered work
456 occurring solely as a consequence of using peer-to-peer transmission
458 occurring solely as a consequence of using peer-to-peer transmission
457 to receive a copy likewise does not require acceptance. However,
459 to receive a copy likewise does not require acceptance. However,
458 nothing other than this License grants you permission to propagate or
460 nothing other than this License grants you permission to propagate or
459 modify any covered work. These actions infringe copyright if you do
461 modify any covered work. These actions infringe copyright if you do
460 not accept this License. Therefore, by modifying or propagating a
462 not accept this License. Therefore, by modifying or propagating a
461 covered work, you indicate your acceptance of this License to do so.
463 covered work, you indicate your acceptance of this License to do so.
462
464
463 10. Automatic Licensing of Downstream Recipients.
465 10. Automatic Licensing of Downstream Recipients.
464
466
465 Each time you convey a covered work, the recipient automatically
467 Each time you convey a covered work, the recipient automatically
466 receives a license from the original licensors, to run, modify and
468 receives a license from the original licensors, to run, modify and
467 propagate that work, subject to this License. You are not responsible
469 propagate that work, subject to this License. You are not responsible
468 for enforcing compliance by third parties with this License.
470 for enforcing compliance by third parties with this License.
469
471
470 An "entity transaction" is a transaction transferring control of an
472 An "entity transaction" is a transaction transferring control of an
471 organization, or substantially all assets of one, or subdividing an
473 organization, or substantially all assets of one, or subdividing an
472 organization, or merging organizations. If propagation of a covered
474 organization, or merging organizations. If propagation of a covered
473 work results from an entity transaction, each party to that
475 work results from an entity transaction, each party to that
474 transaction who receives a copy of the work also receives whatever
476 transaction who receives a copy of the work also receives whatever
475 licenses to the work the party's predecessor in interest had or could
477 licenses to the work the party's predecessor in interest had or could
476 give under the previous paragraph, plus a right to possession of the
478 give under the previous paragraph, plus a right to possession of the
477 Corresponding Source of the work from the predecessor in interest, if
479 Corresponding Source of the work from the predecessor in interest, if
478 the predecessor has it or can get it with reasonable efforts.
480 the predecessor has it or can get it with reasonable efforts.
479
481
480 You may not impose any further restrictions on the exercise of the
482 You may not impose any further restrictions on the exercise of the
481 rights granted or affirmed under this License. For example, you may
483 rights granted or affirmed under this License. For example, you may
482 not impose a license fee, royalty, or other charge for exercise of
484 not impose a license fee, royalty, or other charge for exercise of
483 rights granted under this License, and you may not initiate litigation
485 rights granted under this License, and you may not initiate litigation
484 (including a cross-claim or counterclaim in a lawsuit) alleging that
486 (including a cross-claim or counterclaim in a lawsuit) alleging that
485 any patent claim is infringed by making, using, selling, offering for
487 any patent claim is infringed by making, using, selling, offering for
486 sale, or importing the Program or any portion of it.
488 sale, or importing the Program or any portion of it.
487
489
488 11. Patents.
490 11. Patents.
489
491
490 A "contributor" is a copyright holder who authorizes use under this
492 A "contributor" is a copyright holder who authorizes use under this
491 License of the Program or a work on which the Program is based. The
493 License of the Program or a work on which the Program is based. The
492 work thus licensed is called the contributor's "contributor version".
494 work thus licensed is called the contributor's "contributor version".
493
495
494 A contributor's "essential patent claims" are all patent claims
496 A contributor's "essential patent claims" are all patent claims
495 owned or controlled by the contributor, whether already acquired or
497 owned or controlled by the contributor, whether already acquired or
496 hereafter acquired, that would be infringed by some manner, permitted
498 hereafter acquired, that would be infringed by some manner, permitted
497 by this License, of making, using, or selling its contributor version,
499 by this License, of making, using, or selling its contributor version,
498 but do not include claims that would be infringed only as a
500 but do not include claims that would be infringed only as a
499 consequence of further modification of the contributor version. For
501 consequence of further modification of the contributor version. For
500 purposes of this definition, "control" includes the right to grant
502 purposes of this definition, "control" includes the right to grant
501 patent sublicenses in a manner consistent with the requirements of
503 patent sublicenses in a manner consistent with the requirements of
502 this License.
504 this License.
503
505
504 Each contributor grants you a non-exclusive, worldwide, royalty-free
506 Each contributor grants you a non-exclusive, worldwide, royalty-free
505 patent license under the contributor's essential patent claims, to
507 patent license under the contributor's essential patent claims, to
506 make, use, sell, offer for sale, import and otherwise run, modify and
508 make, use, sell, offer for sale, import and otherwise run, modify and
507 propagate the contents of its contributor version.
509 propagate the contents of its contributor version.
508
510
509 In the following three paragraphs, a "patent license" is any express
511 In the following three paragraphs, a "patent license" is any express
510 agreement or commitment, however denominated, not to enforce a patent
512 agreement or commitment, however denominated, not to enforce a patent
511 (such as an express permission to practice a patent or covenant not to
513 (such as an express permission to practice a patent or covenant not to
512 sue for patent infringement). To "grant" such a patent license to a
514 sue for patent infringement). To "grant" such a patent license to a
513 party means to make such an agreement or commitment not to enforce a
515 party means to make such an agreement or commitment not to enforce a
514 patent against the party.
516 patent against the party.
515
517
516 If you convey a covered work, knowingly relying on a patent license,
518 If you convey a covered work, knowingly relying on a patent license,
517 and the Corresponding Source of the work is not available for anyone
519 and the Corresponding Source of the work is not available for anyone
518 to copy, free of charge and under the terms of this License, through a
520 to copy, free of charge and under the terms of this License, through a
519 publicly available network server or other readily accessible means,
521 publicly available network server or other readily accessible means,
520 then you must either (1) cause the Corresponding Source to be so
522 then you must either (1) cause the Corresponding Source to be so
521 available, or (2) arrange to deprive yourself of the benefit of the
523 available, or (2) arrange to deprive yourself of the benefit of the
522 patent license for this particular work, or (3) arrange, in a manner
524 patent license for this particular work, or (3) arrange, in a manner
523 consistent with the requirements of this License, to extend the patent
525 consistent with the requirements of this License, to extend the patent
524 license to downstream recipients. "Knowingly relying" means you have
526 license to downstream recipients. "Knowingly relying" means you have
525 actual knowledge that, but for the patent license, your conveying the
527 actual knowledge that, but for the patent license, your conveying the
526 covered work in a country, or your recipient's use of the covered work
528 covered work in a country, or your recipient's use of the covered work
527 in a country, would infringe one or more identifiable patents in that
529 in a country, would infringe one or more identifiable patents in that
528 country that you have reason to believe are valid.
530 country that you have reason to believe are valid.
529
531
530 If, pursuant to or in connection with a single transaction or
532 If, pursuant to or in connection with a single transaction or
531 arrangement, you convey, or propagate by procuring conveyance of, a
533 arrangement, you convey, or propagate by procuring conveyance of, a
532 covered work, and grant a patent license to some of the parties
534 covered work, and grant a patent license to some of the parties
533 receiving the covered work authorizing them to use, propagate, modify
535 receiving the covered work authorizing them to use, propagate, modify
534 or convey a specific copy of the covered work, then the patent license
536 or convey a specific copy of the covered work, then the patent license
535 you grant is automatically extended to all recipients of the covered
537 you grant is automatically extended to all recipients of the covered
536 work and works based on it.
538 work and works based on it.
537
539
538 A patent license is "discriminatory" if it does not include within
540 A patent license is "discriminatory" if it does not include within
539 the scope of its coverage, prohibits the exercise of, or is
541 the scope of its coverage, prohibits the exercise of, or is
540 conditioned on the non-exercise of one or more of the rights that are
542 conditioned on the non-exercise of one or more of the rights that are
541 specifically granted under this License. You may not convey a covered
543 specifically granted under this License. You may not convey a covered
542 work if you are a party to an arrangement with a third party that is
544 work if you are a party to an arrangement with a third party that is
543 in the business of distributing software, under which you make payment
545 in the business of distributing software, under which you make payment
544 to the third party based on the extent of your activity of conveying
546 to the third party based on the extent of your activity of conveying
545 the work, and under which the third party grants, to any of the
547 the work, and under which the third party grants, to any of the
546 parties who would receive the covered work from you, a discriminatory
548 parties who would receive the covered work from you, a discriminatory
547 patent license (a) in connection with copies of the covered work
549 patent license (a) in connection with copies of the covered work
548 conveyed by you (or copies made from those copies), or (b) primarily
550 conveyed by you (or copies made from those copies), or (b) primarily
549 for and in connection with specific products or compilations that
551 for and in connection with specific products or compilations that
550 contain the covered work, unless you entered into that arrangement,
552 contain the covered work, unless you entered into that arrangement,
551 or that patent license was granted, prior to 28 March 2007.
553 or that patent license was granted, prior to 28 March 2007.
552
554
553 Nothing in this License shall be construed as excluding or limiting
555 Nothing in this License shall be construed as excluding or limiting
554 any implied license or other defenses to infringement that may
556 any implied license or other defenses to infringement that may
555 otherwise be available to you under applicable patent law.
557 otherwise be available to you under applicable patent law.
556
558
557 12. No Surrender of Others' Freedom.
559 12. No Surrender of Others' Freedom.
558
560
559 If conditions are imposed on you (whether by court order, agreement or
561 If conditions are imposed on you (whether by court order, agreement or
560 otherwise) that contradict the conditions of this License, they do not
562 otherwise) that contradict the conditions of this License, they do not
561 excuse you from the conditions of this License. If you cannot convey a
563 excuse you from the conditions of this License. If you cannot convey a
562 covered work so as to satisfy simultaneously your obligations under this
564 covered work so as to satisfy simultaneously your obligations under this
563 License and any other pertinent obligations, then as a consequence you may
565 License and any other pertinent obligations, then as a consequence you may
564 not convey it at all. For example, if you agree to terms that obligate you
566 not convey it at all. For example, if you agree to terms that obligate you
565 to collect a royalty for further conveying from those to whom you convey
567 to collect a royalty for further conveying from those to whom you convey
566 the Program, the only way you could satisfy both those terms and this
568 the Program, the only way you could satisfy both those terms and this
567 License would be to refrain entirely from conveying the Program.
569 License would be to refrain entirely from conveying the Program.
568
570
569 13. Remote Network Interaction; Use with the GNU General Public License.
571 13. Remote Network Interaction; Use with the GNU General Public License.
570
572
571 Notwithstanding any other provision of this License, if you modify the
573 Notwithstanding any other provision of this License, if you modify the
572 Program, your modified version must prominently offer all users
574 Program, your modified version must prominently offer all users
573 interacting with it remotely through a computer network (if your version
575 interacting with it remotely through a computer network (if your version
574 supports such interaction) an opportunity to receive the Corresponding
576 supports such interaction) an opportunity to receive the Corresponding
575 Source of your version by providing access to the Corresponding Source
577 Source of your version by providing access to the Corresponding Source
576 from a network server at no charge, through some standard or customary
578 from a network server at no charge, through some standard or customary
577 means of facilitating copying of software. This Corresponding Source
579 means of facilitating copying of software. This Corresponding Source
578 shall include the Corresponding Source for any work covered by version 3
580 shall include the Corresponding Source for any work covered by version 3
579 of the GNU General Public License that is incorporated pursuant to the
581 of the GNU General Public License that is incorporated pursuant to the
580 following paragraph.
582 following paragraph.
581
583
582 Notwithstanding any other provision of this License, you have
584 Notwithstanding any other provision of this License, you have
583 permission to link or combine any covered work with a work licensed
585 permission to link or combine any covered work with a work licensed
584 under version 3 of the GNU General Public License into a single
586 under version 3 of the GNU General Public License into a single
585 combined work, and to convey the resulting work. The terms of this
587 combined work, and to convey the resulting work. The terms of this
586 License will continue to apply to the part which is the covered work,
588 License will continue to apply to the part which is the covered work,
587 but the work with which it is combined will remain governed by version
589 but the work with which it is combined will remain governed by version
588 3 of the GNU General Public License.
590 3 of the GNU General Public License.
589
591
590 14. Revised Versions of this License.
592 14. Revised Versions of this License.
591
593
592 The Free Software Foundation may publish revised and/or new versions of
594 The Free Software Foundation may publish revised and/or new versions of
593 the GNU Affero General Public License from time to time. Such new versions
595 the GNU Affero General Public License from time to time. Such new versions
594 will be similar in spirit to the present version, but may differ in detail to
596 will be similar in spirit to the present version, but may differ in detail to
595 address new problems or concerns.
597 address new problems or concerns.
596
598
597 Each version is given a distinguishing version number. If the
599 Each version is given a distinguishing version number. If the
598 Program specifies that a certain numbered version of the GNU Affero General
600 Program specifies that a certain numbered version of the GNU Affero General
599 Public License "or any later version" applies to it, you have the
601 Public License "or any later version" applies to it, you have the
600 option of following the terms and conditions either of that numbered
602 option of following the terms and conditions either of that numbered
601 version or of any later version published by the Free Software
603 version or of any later version published by the Free Software
602 Foundation. If the Program does not specify a version number of the
604 Foundation. If the Program does not specify a version number of the
603 GNU Affero General Public License, you may choose any version ever published
605 GNU Affero General Public License, you may choose any version ever published
604 by the Free Software Foundation.
606 by the Free Software Foundation.
605
607
606 If the Program specifies that a proxy can decide which future
608 If the Program specifies that a proxy can decide which future
607 versions of the GNU Affero General Public License can be used, that proxy's
609 versions of the GNU Affero General Public License can be used, that proxy's
608 public statement of acceptance of a version permanently authorizes you
610 public statement of acceptance of a version permanently authorizes you
609 to choose that version for the Program.
611 to choose that version for the Program.
610
612
611 Later license versions may give you additional or different
613 Later license versions may give you additional or different
612 permissions. However, no additional obligations are imposed on any
614 permissions. However, no additional obligations are imposed on any
613 author or copyright holder as a result of your choosing to follow a
615 author or copyright holder as a result of your choosing to follow a
614 later version.
616 later version.
615
617
616 15. Disclaimer of Warranty.
618 15. Disclaimer of Warranty.
617
619
618 THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
620 THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
619 APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
621 APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
620 HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
622 HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
621 OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
623 OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
622 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
624 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
623 PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
625 PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
624 IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
626 IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
625 ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
627 ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
626
628
627 16. Limitation of Liability.
629 16. Limitation of Liability.
628
630
629 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
631 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
630 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
632 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
631 THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
633 THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
632 GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
634 GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
633 USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
635 USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
634 DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
636 DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
635 PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
637 PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
636 EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
638 EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
637 SUCH DAMAGES.
639 SUCH DAMAGES.
638
640
639 17. Interpretation of Sections 15 and 16.
641 17. Interpretation of Sections 15 and 16.
640
642
641 If the disclaimer of warranty and limitation of liability provided
643 If the disclaimer of warranty and limitation of liability provided
642 above cannot be given local legal effect according to their terms,
644 above cannot be given local legal effect according to their terms,
643 reviewing courts shall apply local law that most closely approximates
645 reviewing courts shall apply local law that most closely approximates
644 an absolute waiver of all civil liability in connection with the
646 an absolute waiver of all civil liability in connection with the
645 Program, unless a warranty or assumption of liability accompanies a
647 Program, unless a warranty or assumption of liability accompanies a
646 copy of the Program in return for a fee.
648 copy of the Program in return for a fee.
647
649
648 END OF TERMS AND CONDITIONS
650 END OF TERMS AND CONDITIONS
649
651
650 How to Apply These Terms to Your New Programs
652 How to Apply These Terms to Your New Programs
651
653
652 If you develop a new program, and you want it to be of the greatest
654 If you develop a new program, and you want it to be of the greatest
653 possible use to the public, the best way to achieve this is to make it
655 possible use to the public, the best way to achieve this is to make it
654 free software which everyone can redistribute and change under these terms.
656 free software which everyone can redistribute and change under these terms.
655
657
656 To do so, attach the following notices to the program. It is safest
658 To do so, attach the following notices to the program. It is safest
657 to attach them to the start of each source file to most effectively
659 to attach them to the start of each source file to most effectively
658 state the exclusion of warranty; and each file should have at least
660 state the exclusion of warranty; and each file should have at least
659 the "copyright" line and a pointer to where the full notice is found.
661 the "copyright" line and a pointer to where the full notice is found.
660
662
661 <one line to give the program's name and a brief idea of what it does.>
663 <one line to give the program's name and a brief idea of what it does.>
662 Copyright (C) <year> <name of author>
664 Copyright (C) <year> <name of author>
663
665
664 This program is free software: you can redistribute it and/or modify
666 This program is free software: you can redistribute it and/or modify
665 it under the terms of the GNU Affero General Public License as published by
667 it under the terms of the GNU Affero General Public License as published by
666 the Free Software Foundation, either version 3 of the License, or
668 the Free Software Foundation, either version 3 of the License, or
667 (at your option) any later version.
669 (at your option) any later version.
668
670
669 This program is distributed in the hope that it will be useful,
671 This program is distributed in the hope that it will be useful,
670 but WITHOUT ANY WARRANTY; without even the implied warranty of
672 but WITHOUT ANY WARRANTY; without even the implied warranty of
671 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
673 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
672 GNU Affero General Public License for more details.
674 GNU Affero General Public License for more details.
673
675
674 You should have received a copy of the GNU Affero General Public License
676 You should have received a copy of the GNU Affero General Public License
675 along with this program. If not, see <http://www.gnu.org/licenses/>.
677 along with this program. If not, see <http://www.gnu.org/licenses/>.
676
678
677 Also add information on how to contact you by electronic and paper mail.
679 Also add information on how to contact you by electronic and paper mail.
678
680
679 If your software can interact with users remotely through a computer
681 If your software can interact with users remotely through a computer
680 network, you should also make sure that it provides a way for users to
682 network, you should also make sure that it provides a way for users to
681 get its source. For example, if your program is a web application, its
683 get its source. For example, if your program is a web application, its
682 interface could display a "Source" link that leads users to an archive
684 interface could display a "Source" link that leads users to an archive
683 of the code. There are many ways you could offer source, and different
685 of the code. There are many ways you could offer source, and different
684 solutions will be better for different programs; see section 13 for the
686 solutions will be better for different programs; see section 13 for the
685 specific requirements.
687 specific requirements.
686
688
687 You should also get your employer (if you work as a programmer) or school,
689 You should also get your employer (if you work as a programmer) or school,
688 if any, to sign a "copyright disclaimer" for the program, if necessary.
690 if any, to sign a "copyright disclaimer" for the program, if necessary.
689 For more information on this, and how to apply and follow the GNU AGPL, see
691 For more information on this, and how to apply and follow the GNU AGPL, see
690 <http://www.gnu.org/licenses/>.
692 <http://www.gnu.org/licenses/>.
@@ -1,48 +1,48 b''
1 # top level files
1 # top level files
2 include test.ini
2 include test.ini
3 include MANIFEST.in
3 include MANIFEST.in
4 include README.rst
4 include README.rst
5 include CHANGES.rst
6 include LICENSE.txt
7
5 include rhodecode/VERSION
8 include rhodecode/VERSION
6
9
7 # docs
10 # docs
8 recursive-include docs *
11 recursive-include docs *
9
12
10 # init.d
13 # all config files
11 recursive-include init.d *
14 recursive-include configs *
12
15
13 # translations
16 # translations
14 recursive-include rhodecode/i18n *
17 recursive-include rhodecode/i18n *
15
18
16 # bin stuff
17 recursive-include rhodecode/bin *
18
19 # hook templates
19 # hook templates
20 recursive-include rhodecode/config/hook_templates *
20 recursive-include rhodecode/config/hook_templates *
21
21
22 # non-python core stuff
22 # non-python core stuff
23 recursive-include rhodecode *.cfg
23 recursive-include rhodecode *.cfg
24 recursive-include rhodecode *.json
24 recursive-include rhodecode *.json
25 recursive-include rhodecode *.ini_tmpl
25 recursive-include rhodecode *.ini_tmpl
26 recursive-include rhodecode *.sh
26 recursive-include rhodecode *.sh
27
27
28 # images, css
28 # images, css
29 include rhodecode/public/css/*.css
29 include rhodecode/public/css/*.css
30 include rhodecode/public/images/*.*
30 include rhodecode/public/images/*.*
31
31
32 # sound files
32 # sound files
33 include rhodecode/public/sounds/*.mp3
33 include rhodecode/public/sounds/*.mp3
34 include rhodecode/public/sounds/*.wav
34 include rhodecode/public/sounds/*.wav
35
35
36 # fonts
36 # fonts
37 recursive-include rhodecode/public/fonts/ProximaNova *
37 recursive-include rhodecode/public/fonts/ProximaNova *
38 recursive-include rhodecode/public/fonts/RCIcons *
38 recursive-include rhodecode/public/fonts/RCIcons *
39
39
40 # js
40 # js
41 recursive-include rhodecode/public/js *
41 recursive-include rhodecode/public/js *
42
42
43 # templates
43 # templates
44 recursive-include rhodecode/templates *
44 recursive-include rhodecode/templates *
45
45
46 # skip any tests files
46 # skip any tests files
47 recursive-exclude rhodecode/tests *
47 recursive-exclude rhodecode/tests *
48
48
@@ -1,47 +1,47 b''
1
1
2 WEBPACK=./node_modules/webpack/bin/webpack.js
2 WEBPACK=./node_modules/webpack/bin/webpack.js
3 GRUNT=grunt
3 GRUNT=grunt
4 NODE_PATH=./node_modules
4 NODE_PATH=./node_modules
5 FLAKE8=flake8 setup.py pytest_pylons/ rhodecode/ --select=E124 --ignore=E711,E712,E510,E121,E122,E126,E127,E128,E501,F401 --max-line-length=100 --exclude=*rhodecode/lib/dbmigrate/*,*rhodecode/tests/*,*rhodecode/lib/vcs/utils/*
5 FLAKE8=flake8 setup.py pytest_pylons/ rhodecode/ --select=E124 --ignore=E711,E712,E510,E121,E122,E126,E127,E128,E501,F401 --max-line-length=100 --exclude=*rhodecode/lib/dbmigrate/*,*rhodecode/tests/*,*rhodecode/lib/vcs/utils/*
6 CI_PREFIX=enterprise
6 CI_PREFIX=enterprise
7
7
8 .PHONY: docs docs-clean ci-docs clean test test-clean test-lint test-only
8 .PHONY: docs docs-clean ci-docs clean test test-clean test-lint test-only
9
9
10
10
11 docs:
11 docs:
12 (cd docs; nix-build default.nix -o result; make clean html)
12 (cd docs; nix-build default.nix -o result; make clean html)
13
13
14 docs-clean:
14 docs-clean:
15 (cd docs; make clean)
15 (cd docs; make clean)
16
16
17 ci-docs: docs;
17 ci-docs: docs;
18
18
19
19
20 clean: test-clean
20 clean: test-clean
21 find . -type f \( -iname '*.c' -o -iname '*.pyc' -o -iname '*.so' \) -exec rm '{}' ';'
21 find . -type f \( -iname '*.c' -o -iname '*.pyc' -o -iname '*.so' \) -exec rm '{}' ';'
22
22
23 test: test-clean test-lint test-only
23 test: test-clean test-only
24
24
25 test-clean:
25 test-clean:
26 rm -rf coverage.xml htmlcov junit.xml pylint.log result
26 rm -rf coverage.xml htmlcov junit.xml pylint.log result
27
27
28 test-lint:
28 test-lint:
29 if [ "$$IN_NIX_SHELL" = "1" ]; then \
29 if [ "$$IN_NIX_SHELL" = "1" ]; then \
30 $(FLAKE8); \
30 $(FLAKE8); \
31 else \
31 else \
32 $(FLAKE8) --format=pylint --exit-zero > pylint.log; \
32 $(FLAKE8) --format=pylint --exit-zero > pylint.log; \
33 fi
33 fi
34
34
35 test-only:
35 test-only:
36 PYTHONHASHSEED=random py.test -vv -r xw --cov=rhodecode --cov-report=term-missing --cov-report=html rhodecode/tests/
36 PYTHONHASHSEED=random py.test -vv -r xw --cov=rhodecode --cov-report=term-missing --cov-report=html rhodecode/tests/
37
37
38 web-build:
38 web-build:
39 NODE_PATH=$(NODE_PATH) $(GRUNT)
39 NODE_PATH=$(NODE_PATH) $(GRUNT)
40
40
41 web-test:
41 web-test:
42 @echo "no test for our javascript, yet!"
42 @echo "no test for our javascript, yet!"
43
43
44 docs-bootstrap:
44 docs-bootstrap:
45 (cd docs; nix-build default.nix -o result)
45 (cd docs; nix-build default.nix -o result)
46 @echo "Please go to docs folder and run make html"
46 @echo "Please go to docs folder and run make html"
47
47
@@ -1,612 +1,672 b''
1 ################################################################################
1
2
2 ################################################################################
3 ################################################################################
3 # RhodeCode Enterprise - configuration file #
4 ## RHODECODE ENTERPRISE CONFIGURATION ##
4 # Built-in functions and variables #
5 # The %(here)s variable will be replaced with the parent directory of this file#
5 # The %(here)s variable will be replaced with the parent directory of this file#
6 # #
7 ################################################################################
6 ################################################################################
8
7
9 [DEFAULT]
8 [DEFAULT]
10 debug = true
9 debug = true
10
11 ################################################################################
11 ################################################################################
12 ## EMAIL CONFIGURATION ##
12 ## Uncomment and replace with the email address which should receive ##
13 ## Uncomment and replace with the email address which should receive ##
13 ## any error reports after an application crash ##
14 ## any error reports after an application crash ##
14 ## Additionally these settings will be used by the RhodeCode mailing system ##
15 ## Additionally these settings will be used by the RhodeCode mailing system ##
15 ################################################################################
16 ################################################################################
16 #email_to = admin@localhost
17
17 #error_email_from = paste_error@localhost
18 ## prefix all emails subjects with given prefix, helps filtering out emails
19 #email_prefix = [RhodeCode]
20
21 ## email FROM address all mails will be sent
18 #app_email_from = rhodecode-noreply@localhost
22 #app_email_from = rhodecode-noreply@localhost
23
24 ## Uncomment and replace with the address which should receive any error report
25 ## note: using appenlight for error handling doesn't need this to be uncommented
26 #email_to = admin@localhost
27
28 ## in case of Application errors, sent an error email form
29 #error_email_from = rhodecode_error@localhost
30
31 ## additional error message to be send in case of server crash
19 #error_message =
32 #error_message =
20 #email_prefix = [RhodeCode]
33
21
34
22 #smtp_server = mail.server.com
35 #smtp_server = mail.server.com
23 #smtp_username =
36 #smtp_username =
24 #smtp_password =
37 #smtp_password =
25 #smtp_port =
38 #smtp_port =
26 #smtp_use_tls = false
39 #smtp_use_tls = false
27 #smtp_use_ssl = true
40 #smtp_use_ssl = true
28 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
41 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
29 #smtp_auth =
42 #smtp_auth =
30
43
31 [server:main]
44 [server:main]
32 ## COMMON ##
45 ## COMMON ##
33 host = 127.0.0.1
46 host = 127.0.0.1
34 port = 5000
47 port = 5000
35
48
36 ##################################
49 ##################################
37 ## WAITRESS WSGI SERVER ##
50 ## WAITRESS WSGI SERVER ##
38 ## Recommended for Development ##
51 ## Recommended for Development ##
39 ##################################
52 ##################################
53
40 use = egg:waitress#main
54 use = egg:waitress#main
41 ## number of worker threads
55 ## number of worker threads
42 threads = 5
56 threads = 5
43 ## MAX BODY SIZE 100GB
57 ## MAX BODY SIZE 100GB
44 max_request_body_size = 107374182400
58 max_request_body_size = 107374182400
45 ## Use poll instead of select, fixes file descriptors limits problems.
59 ## Use poll instead of select, fixes file descriptors limits problems.
46 ## May not work on old windows systems.
60 ## May not work on old windows systems.
47 asyncore_use_poll = true
61 asyncore_use_poll = true
48
62
49
63
50 ##########################
64 ##########################
51 ## GUNICORN WSGI SERVER ##
65 ## GUNICORN WSGI SERVER ##
52 ##########################
66 ##########################
53 ## run with gunicorn --log-config <inifile.ini> --paste <inifile.ini>
67 ## run with gunicorn --log-config <inifile.ini> --paste <inifile.ini>
68
54 #use = egg:gunicorn#main
69 #use = egg:gunicorn#main
55 ## Sets the number of process workers. You must set `instance_id = *`
70 ## Sets the number of process workers. You must set `instance_id = *`
56 ## when this option is set to more than one worker, recommended
71 ## when this option is set to more than one worker, recommended
57 ## value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
72 ## value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
58 ## The `instance_id = *` must be set in the [app:main] section below
73 ## The `instance_id = *` must be set in the [app:main] section below
59 #workers = 2
74 #workers = 2
60 ## number of threads for each of the worker, must be set to 1 for gevent
75 ## number of threads for each of the worker, must be set to 1 for gevent
61 ## generally recommened to be at 1
76 ## generally recommened to be at 1
62 #threads = 1
77 #threads = 1
63 ## process name
78 ## process name
64 #proc_name = rhodecode
79 #proc_name = rhodecode
65 ## type of worker class, one of sync, gevent
80 ## type of worker class, one of sync, gevent
66 ## recommended for bigger setup is using of of other than sync one
81 ## recommended for bigger setup is using of of other than sync one
67 #worker_class = sync
82 #worker_class = sync
68 ## The maximum number of simultaneous clients. Valid only for Gevent
83 ## The maximum number of simultaneous clients. Valid only for Gevent
69 #worker_connections = 10
84 #worker_connections = 10
70 ## max number of requests that worker will handle before being gracefully
85 ## max number of requests that worker will handle before being gracefully
71 ## restarted, could prevent memory leaks
86 ## restarted, could prevent memory leaks
72 #max_requests = 1000
87 #max_requests = 1000
73 #max_requests_jitter = 30
88 #max_requests_jitter = 30
74 ## amount of time a worker can spend with handling a request before it
89 ## amount of time a worker can spend with handling a request before it
75 ## gets killed and restarted. Set to 6hrs
90 ## gets killed and restarted. Set to 6hrs
76 #timeout = 21600
91 #timeout = 21600
77
92
78
93
79 ## prefix middleware for RhodeCode, disables force_https flag.
94 ## prefix middleware for RhodeCode, disables force_https flag.
95 ## recommended when using proxy setup.
80 ## allows to set RhodeCode under a prefix in server.
96 ## allows to set RhodeCode under a prefix in server.
81 ## eg https://server.com/<prefix>. Enable `filter-with =` option below as well.
97 ## eg https://server.com/<prefix>. Enable `filter-with =` option below as well.
82 #[filter:proxy-prefix]
98 ## optionally set prefix like: `prefix = /<your-prefix>`
83 #use = egg:PasteDeploy#prefix
99 [filter:proxy-prefix]
84 #prefix = /<your-prefix>
100 use = egg:PasteDeploy#prefix
101 prefix = /
85
102
86 [app:main]
103 [app:main]
87 use = egg:rhodecode-enterprise-ce
104 use = egg:rhodecode-enterprise-ce
88 ## enable proxy prefix middleware, defined below
105
106 ## enable proxy prefix middleware, defined above
89 #filter-with = proxy-prefix
107 #filter-with = proxy-prefix
90
108
91 # During development the we want to have the debug toolbar enabled
109 # During development the we want to have the debug toolbar enabled
92 pyramid.includes =
110 pyramid.includes =
93 pyramid_debugtoolbar
111 pyramid_debugtoolbar
94 rhodecode.utils.debugtoolbar
112 rhodecode.utils.debugtoolbar
95 rhodecode.lib.middleware.request_wrapper
113 rhodecode.lib.middleware.request_wrapper
96
114
97 pyramid.reload_templates = true
115 pyramid.reload_templates = true
98
116
99 debugtoolbar.hosts = 0.0.0.0/0
117 debugtoolbar.hosts = 0.0.0.0/0
100 debugtoolbar.exclude_prefixes =
118 debugtoolbar.exclude_prefixes =
101 /css
119 /css
102 /fonts
120 /fonts
103 /images
121 /images
104 /js
122 /js
105
123
106 ## RHODECODE PLUGINS ##
124 ## RHODECODE PLUGINS ##
107 rhodecode.includes =
125 rhodecode.includes =
108 rhodecode.api
126 rhodecode.api
109
127
110
128
111 # api prefix url
129 # api prefix url
112 rhodecode.api.url = /_admin/api
130 rhodecode.api.url = /_admin/api
113
131
114
132
115 ## END RHODECODE PLUGINS ##
133 ## END RHODECODE PLUGINS ##
116
134
117 ## encryption key used to encrypt social plugin tokens,
135 ## encryption key used to encrypt social plugin tokens,
118 ## remote_urls with credentials etc, if not set it defaults to
136 ## remote_urls with credentials etc, if not set it defaults to
119 ## `beaker.session.secret`
137 ## `beaker.session.secret`
120 #rhodecode.encrypted_values.secret =
138 #rhodecode.encrypted_values.secret =
121
139
122 ## decryption strict mode (enabled by default). It controls if decryption raises
140 ## decryption strict mode (enabled by default). It controls if decryption raises
123 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
141 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
124 #rhodecode.encrypted_values.strict = false
142 #rhodecode.encrypted_values.strict = false
125
143
126 full_stack = true
144 ## return gzipped responses from Rhodecode (static files/application)
145 gzip_responses = false
127
146
128 ## Serve static files via RhodeCode, disable to serve them via HTTP server
147 ## autogenerate javascript routes file on startup
129 static_files = true
130
131 # autogenerate javascript routes file on startup
132 generate_js_files = false
148 generate_js_files = false
133
149
134 ## Optional Languages
150 ## Optional Languages
135 ## en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
151 ## en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
136 lang = en
152 lang = en
137
153
138 ## perform a full repository scan on each server start, this should be
154 ## perform a full repository scan on each server start, this should be
139 ## set to false after first startup, to allow faster server restarts.
155 ## set to false after first startup, to allow faster server restarts.
140 startup.import_repos = false
156 startup.import_repos = false
141
157
142 ## Uncomment and set this path to use archive download cache.
158 ## Uncomment and set this path to use archive download cache.
143 ## Once enabled, generated archives will be cached at this location
159 ## Once enabled, generated archives will be cached at this location
144 ## and served from the cache during subsequent requests for the same archive of
160 ## and served from the cache during subsequent requests for the same archive of
145 ## the repository.
161 ## the repository.
146 #archive_cache_dir = /tmp/tarballcache
162 #archive_cache_dir = /tmp/tarballcache
147
163
148 ## change this to unique ID for security
164 ## change this to unique ID for security
149 app_instance_uuid = rc-production
165 app_instance_uuid = rc-production
150
166
151 ## cut off limit for large diffs (size in bytes)
167 ## cut off limit for large diffs (size in bytes)
152 cut_off_limit_diff = 1024000
168 cut_off_limit_diff = 1024000
153 cut_off_limit_file = 256000
169 cut_off_limit_file = 256000
154
170
155 ## use cache version of scm repo everywhere
171 ## use cache version of scm repo everywhere
156 vcs_full_cache = true
172 vcs_full_cache = true
157
173
158 ## force https in RhodeCode, fixes https redirects, assumes it's always https
174 ## force https in RhodeCode, fixes https redirects, assumes it's always https
159 ## Normally this is controlled by proper http flags sent from http server
175 ## Normally this is controlled by proper http flags sent from http server
160 force_https = false
176 force_https = false
161
177
162 ## use Strict-Transport-Security headers
178 ## use Strict-Transport-Security headers
163 use_htsts = false
179 use_htsts = false
164
180
165 ## number of commits stats will parse on each iteration
181 ## number of commits stats will parse on each iteration
166 commit_parse_limit = 25
182 commit_parse_limit = 25
167
183
168 ## git rev filter option, --all is the default filter, if you need to
184 ## git rev filter option, --all is the default filter, if you need to
169 ## hide all refs in changelog switch this to --branches --tags
185 ## hide all refs in changelog switch this to --branches --tags
170 git_rev_filter = --branches --tags
186 git_rev_filter = --branches --tags
171
187
172 # Set to true if your repos are exposed using the dumb protocol
188 # Set to true if your repos are exposed using the dumb protocol
173 git_update_server_info = false
189 git_update_server_info = false
174
190
175 ## RSS/ATOM feed options
191 ## RSS/ATOM feed options
176 rss_cut_off_limit = 256000
192 rss_cut_off_limit = 256000
177 rss_items_per_page = 10
193 rss_items_per_page = 10
178 rss_include_diff = false
194 rss_include_diff = false
179
195
180 ## gist URL alias, used to create nicer urls for gist. This should be an
196 ## gist URL alias, used to create nicer urls for gist. This should be an
181 ## url that does rewrites to _admin/gists/<gistid>.
197 ## url that does rewrites to _admin/gists/<gistid>.
182 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
198 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
183 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/<gistid>
199 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/<gistid>
184 gist_alias_url =
200 gist_alias_url =
185
201
186 ## List of controllers (using glob pattern syntax) that AUTH TOKENS could be
202 ## List of controllers (using glob pattern syntax) that AUTH TOKENS could be
187 ## used for access.
203 ## used for access.
188 ## Adding ?auth_token = <token> to the url authenticates this request as if it
204 ## Adding ?auth_token = <token> to the url authenticates this request as if it
189 ## came from the the logged in user who own this authentication token.
205 ## came from the the logged in user who own this authentication token.
190 ##
206 ##
191 ## Syntax is <ControllerClass>:<function_pattern>.
207 ## Syntax is <ControllerClass>:<function_pattern>.
192 ## To enable access to raw_files put `FilesController:raw`.
208 ## To enable access to raw_files put `FilesController:raw`.
193 ## To enable access to patches add `ChangesetController:changeset_patch`.
209 ## To enable access to patches add `ChangesetController:changeset_patch`.
194 ## The list should be "," separated and on a single line.
210 ## The list should be "," separated and on a single line.
195 ##
211 ##
196 ## Recommended controllers to enable:
212 ## Recommended controllers to enable:
197 # ChangesetController:changeset_patch,
213 # ChangesetController:changeset_patch,
198 # ChangesetController:changeset_raw,
214 # ChangesetController:changeset_raw,
199 # FilesController:raw,
215 # FilesController:raw,
200 # FilesController:archivefile,
216 # FilesController:archivefile,
201 # GistsController:*,
217 # GistsController:*,
202 api_access_controllers_whitelist =
218 api_access_controllers_whitelist =
203
219
204 ## default encoding used to convert from and to unicode
220 ## default encoding used to convert from and to unicode
205 ## can be also a comma separated list of encoding in case of mixed encodings
221 ## can be also a comma separated list of encoding in case of mixed encodings
206 default_encoding = UTF-8
222 default_encoding = UTF-8
207
223
208 ## instance-id prefix
224 ## instance-id prefix
209 ## a prefix key for this instance used for cache invalidation when running
225 ## a prefix key for this instance used for cache invalidation when running
210 ## multiple instances of rhodecode, make sure it's globally unique for
226 ## multiple instances of rhodecode, make sure it's globally unique for
211 ## all running rhodecode instances. Leave empty if you don't use it
227 ## all running rhodecode instances. Leave empty if you don't use it
212 instance_id =
228 instance_id =
213
229
214 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
230 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
215 ## of an authentication plugin also if it is disabled by it's settings.
231 ## of an authentication plugin also if it is disabled by it's settings.
216 ## This could be useful if you are unable to log in to the system due to broken
232 ## This could be useful if you are unable to log in to the system due to broken
217 ## authentication settings. Then you can enable e.g. the internal rhodecode auth
233 ## authentication settings. Then you can enable e.g. the internal rhodecode auth
218 ## module to log in again and fix the settings.
234 ## module to log in again and fix the settings.
219 ##
235 ##
220 ## Available builtin plugin IDs (hash is part of the ID):
236 ## Available builtin plugin IDs (hash is part of the ID):
221 ## egg:rhodecode-enterprise-ce#rhodecode
237 ## egg:rhodecode-enterprise-ce#rhodecode
222 ## egg:rhodecode-enterprise-ce#pam
238 ## egg:rhodecode-enterprise-ce#pam
223 ## egg:rhodecode-enterprise-ce#ldap
239 ## egg:rhodecode-enterprise-ce#ldap
224 ## egg:rhodecode-enterprise-ce#jasig_cas
240 ## egg:rhodecode-enterprise-ce#jasig_cas
225 ## egg:rhodecode-enterprise-ce#headers
241 ## egg:rhodecode-enterprise-ce#headers
226 ## egg:rhodecode-enterprise-ce#crowd
242 ## egg:rhodecode-enterprise-ce#crowd
227 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
243 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
228
244
229 ## alternative return HTTP header for failed authentication. Default HTTP
245 ## alternative return HTTP header for failed authentication. Default HTTP
230 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
246 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
231 ## handling that causing a series of failed authentication calls.
247 ## handling that causing a series of failed authentication calls.
232 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
248 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
233 ## This will be served instead of default 401 on bad authnetication
249 ## This will be served instead of default 401 on bad authnetication
234 auth_ret_code =
250 auth_ret_code =
235
251
236 ## use special detection method when serving auth_ret_code, instead of serving
252 ## use special detection method when serving auth_ret_code, instead of serving
237 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
253 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
238 ## and then serve auth_ret_code to clients
254 ## and then serve auth_ret_code to clients
239 auth_ret_code_detection = false
255 auth_ret_code_detection = false
240
256
241 ## locking return code. When repository is locked return this HTTP code. 2XX
257 ## locking return code. When repository is locked return this HTTP code. 2XX
242 ## codes don't break the transactions while 4XX codes do
258 ## codes don't break the transactions while 4XX codes do
243 lock_ret_code = 423
259 lock_ret_code = 423
244
260
245 ## allows to change the repository location in settings page
261 ## allows to change the repository location in settings page
246 allow_repo_location_change = true
262 allow_repo_location_change = true
247
263
248 ## allows to setup custom hooks in settings page
264 ## allows to setup custom hooks in settings page
249 allow_custom_hooks_settings = true
265 allow_custom_hooks_settings = true
250
266
251 ## generated license token, goto license page in RhodeCode settings to obtain
267 ## generated license token, goto license page in RhodeCode settings to obtain
252 ## new token
268 ## new token
253 license_token =
269 license_token =
254
270
255 ## supervisor connection uri, for managing supervisor and logs.
271 ## supervisor connection uri, for managing supervisor and logs.
256 supervisor.uri =
272 supervisor.uri =
257 ## supervisord group name/id we only want this RC instance to handle
273 ## supervisord group name/id we only want this RC instance to handle
258 supervisor.group_id = dev
274 supervisor.group_id = dev
259
275
260 ## Display extended labs settings
276 ## Display extended labs settings
261 labs_settings_active = true
277 labs_settings_active = true
262
278
263 ####################################
279 ####################################
264 ### CELERY CONFIG ####
280 ### CELERY CONFIG ####
265 ####################################
281 ####################################
266 use_celery = false
282 use_celery = false
267 broker.host = localhost
283 broker.host = localhost
268 broker.vhost = rabbitmqhost
284 broker.vhost = rabbitmqhost
269 broker.port = 5672
285 broker.port = 5672
270 broker.user = rabbitmq
286 broker.user = rabbitmq
271 broker.password = qweqwe
287 broker.password = qweqwe
272
288
273 celery.imports = rhodecode.lib.celerylib.tasks
289 celery.imports = rhodecode.lib.celerylib.tasks
274
290
275 celery.result.backend = amqp
291 celery.result.backend = amqp
276 celery.result.dburi = amqp://
292 celery.result.dburi = amqp://
277 celery.result.serialier = json
293 celery.result.serialier = json
278
294
279 #celery.send.task.error.emails = true
295 #celery.send.task.error.emails = true
280 #celery.amqp.task.result.expires = 18000
296 #celery.amqp.task.result.expires = 18000
281
297
282 celeryd.concurrency = 2
298 celeryd.concurrency = 2
283 #celeryd.log.file = celeryd.log
299 #celeryd.log.file = celeryd.log
284 celeryd.log.level = debug
300 celeryd.log.level = debug
285 celeryd.max.tasks.per.child = 1
301 celeryd.max.tasks.per.child = 1
286
302
287 ## tasks will never be sent to the queue, but executed locally instead.
303 ## tasks will never be sent to the queue, but executed locally instead.
288 celery.always.eager = false
304 celery.always.eager = false
289
305
290 ####################################
306 ####################################
291 ### BEAKER CACHE ####
307 ### BEAKER CACHE ####
292 ####################################
308 ####################################
293 # default cache dir for templates. Putting this into a ramdisk
309 # default cache dir for templates. Putting this into a ramdisk
294 ## can boost performance, eg. %(here)s/data_ramdisk
310 ## can boost performance, eg. %(here)s/data_ramdisk
295 cache_dir = %(here)s/data
311 cache_dir = %(here)s/data
296
312
297 ## locking and default file storage for Beaker. Putting this into a ramdisk
313 ## locking and default file storage for Beaker. Putting this into a ramdisk
298 ## can boost performance, eg. %(here)s/data_ramdisk/cache/beaker_data
314 ## can boost performance, eg. %(here)s/data_ramdisk/cache/beaker_data
299 beaker.cache.data_dir = %(here)s/data/cache/beaker_data
315 beaker.cache.data_dir = %(here)s/data/cache/beaker_data
300 beaker.cache.lock_dir = %(here)s/data/cache/beaker_lock
316 beaker.cache.lock_dir = %(here)s/data/cache/beaker_lock
301
317
302 beaker.cache.regions = super_short_term, short_term, long_term, sql_cache_short, auth_plugins, repo_cache_long
318 beaker.cache.regions = super_short_term, short_term, long_term, sql_cache_short, auth_plugins, repo_cache_long
303
319
304 beaker.cache.super_short_term.type = memory
320 beaker.cache.super_short_term.type = memory
305 beaker.cache.super_short_term.expire = 10
321 beaker.cache.super_short_term.expire = 10
306 beaker.cache.super_short_term.key_length = 256
322 beaker.cache.super_short_term.key_length = 256
307
323
308 beaker.cache.short_term.type = memory
324 beaker.cache.short_term.type = memory
309 beaker.cache.short_term.expire = 60
325 beaker.cache.short_term.expire = 60
310 beaker.cache.short_term.key_length = 256
326 beaker.cache.short_term.key_length = 256
311
327
312 beaker.cache.long_term.type = memory
328 beaker.cache.long_term.type = memory
313 beaker.cache.long_term.expire = 36000
329 beaker.cache.long_term.expire = 36000
314 beaker.cache.long_term.key_length = 256
330 beaker.cache.long_term.key_length = 256
315
331
316 beaker.cache.sql_cache_short.type = memory
332 beaker.cache.sql_cache_short.type = memory
317 beaker.cache.sql_cache_short.expire = 10
333 beaker.cache.sql_cache_short.expire = 10
318 beaker.cache.sql_cache_short.key_length = 256
334 beaker.cache.sql_cache_short.key_length = 256
319
335
320 # default is memory cache, configure only if required
336 ## default is memory cache, configure only if required
321 # using multi-node or multi-worker setup
337 ## using multi-node or multi-worker setup
322 #beaker.cache.auth_plugins.type = ext:database
338 #beaker.cache.auth_plugins.type = ext:database
323 #beaker.cache.auth_plugins.lock_dir = %(here)s/data/cache/auth_plugin_lock
339 #beaker.cache.auth_plugins.lock_dir = %(here)s/data/cache/auth_plugin_lock
324 #beaker.cache.auth_plugins.url = postgresql://postgres:secret@localhost/rhodecode
340 #beaker.cache.auth_plugins.url = postgresql://postgres:secret@localhost/rhodecode
325 #beaker.cache.auth_plugins.url = mysql://root:secret@127.0.0.1/rhodecode
341 #beaker.cache.auth_plugins.url = mysql://root:secret@127.0.0.1/rhodecode
326 #beaker.cache.auth_plugins.sa.pool_recycle = 3600
342 #beaker.cache.auth_plugins.sa.pool_recycle = 3600
327 #beaker.cache.auth_plugins.sa.pool_size = 10
343 #beaker.cache.auth_plugins.sa.pool_size = 10
328 #beaker.cache.auth_plugins.sa.max_overflow = 0
344 #beaker.cache.auth_plugins.sa.max_overflow = 0
329
345
330 beaker.cache.repo_cache_long.type = memorylru_base
346 beaker.cache.repo_cache_long.type = memorylru_base
331 beaker.cache.repo_cache_long.max_items = 4096
347 beaker.cache.repo_cache_long.max_items = 4096
332 beaker.cache.repo_cache_long.expire = 2592000
348 beaker.cache.repo_cache_long.expire = 2592000
333
349
334 # default is memorylru_base cache, configure only if required
350 ## default is memorylru_base cache, configure only if required
335 # using multi-node or multi-worker setup
351 ## using multi-node or multi-worker setup
336 #beaker.cache.repo_cache_long.type = ext:memcached
352 #beaker.cache.repo_cache_long.type = ext:memcached
337 #beaker.cache.repo_cache_long.url = localhost:11211
353 #beaker.cache.repo_cache_long.url = localhost:11211
338 #beaker.cache.repo_cache_long.expire = 1209600
354 #beaker.cache.repo_cache_long.expire = 1209600
339 #beaker.cache.repo_cache_long.key_length = 256
355 #beaker.cache.repo_cache_long.key_length = 256
340
356
341 ####################################
357 ####################################
342 ### BEAKER SESSION ####
358 ### BEAKER SESSION ####
343 ####################################
359 ####################################
344
360
345 ## .session.type is type of storage options for the session, current allowed
361 ## .session.type is type of storage options for the session, current allowed
346 ## types are file, ext:memcached, ext:database, and memory (default).
362 ## types are file, ext:memcached, ext:database, and memory (default).
347 beaker.session.type = file
363 beaker.session.type = file
348 beaker.session.data_dir = %(here)s/data/sessions/data
364 beaker.session.data_dir = %(here)s/data/sessions/data
349
365
350 ## db based session, fast, and allows easy management over logged in users ##
366 ## db based session, fast, and allows easy management over logged in users
351 #beaker.session.type = ext:database
367 #beaker.session.type = ext:database
352 #beaker.session.table_name = db_session
368 #beaker.session.table_name = db_session
353 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
369 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
354 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
370 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
355 #beaker.session.sa.pool_recycle = 3600
371 #beaker.session.sa.pool_recycle = 3600
356 #beaker.session.sa.echo = false
372 #beaker.session.sa.echo = false
357
373
358 beaker.session.key = rhodecode
374 beaker.session.key = rhodecode
359 beaker.session.secret = develop-rc-uytcxaz
375 beaker.session.secret = develop-rc-uytcxaz
360 beaker.session.lock_dir = %(here)s/data/sessions/lock
376 beaker.session.lock_dir = %(here)s/data/sessions/lock
361
377
362 ## Secure encrypted cookie. Requires AES and AES python libraries
378 ## Secure encrypted cookie. Requires AES and AES python libraries
363 ## you must disable beaker.session.secret to use this
379 ## you must disable beaker.session.secret to use this
364 #beaker.session.encrypt_key = <key_for_encryption>
380 #beaker.session.encrypt_key = <key_for_encryption>
365 #beaker.session.validate_key = <validation_key>
381 #beaker.session.validate_key = <validation_key>
366
382
367 ## sets session as invalid(also logging out user) if it haven not been
383 ## sets session as invalid(also logging out user) if it haven not been
368 ## accessed for given amount of time in seconds
384 ## accessed for given amount of time in seconds
369 beaker.session.timeout = 2592000
385 beaker.session.timeout = 2592000
370 beaker.session.httponly = true
386 beaker.session.httponly = true
387 ## Path to use for the cookie.
371 #beaker.session.cookie_path = /<your-prefix>
388 #beaker.session.cookie_path = /<your-prefix>
372
389
373 ## uncomment for https secure cookie
390 ## uncomment for https secure cookie
374 beaker.session.secure = false
391 beaker.session.secure = false
375
392
376 ## auto save the session to not to use .save()
393 ## auto save the session to not to use .save()
377 beaker.session.auto = false
394 beaker.session.auto = false
378
395
379 ## default cookie expiration time in seconds, set to `true` to set expire
396 ## default cookie expiration time in seconds, set to `true` to set expire
380 ## at browser close
397 ## at browser close
381 #beaker.session.cookie_expires = 3600
398 #beaker.session.cookie_expires = 3600
382
399
383 ###################################
400 ###################################
384 ## SEARCH INDEXING CONFIGURATION ##
401 ## SEARCH INDEXING CONFIGURATION ##
385 ###################################
402 ###################################
386 ## Full text search indexer is available in rhodecode-tools under
403 ## Full text search indexer is available in rhodecode-tools under
387 ## `rhodecode-tools index` command
404 ## `rhodecode-tools index` command
388
405
389 # WHOOSH Backend, doesn't require additional services to run
406 # WHOOSH Backend, doesn't require additional services to run
390 # it works good with few dozen repos
407 # it works good with few dozen repos
391 search.module = rhodecode.lib.index.whoosh
408 search.module = rhodecode.lib.index.whoosh
392 search.location = %(here)s/data/index
409 search.location = %(here)s/data/index
393
410
411 ########################################
412 ### CHANNELSTREAM CONFIG ####
413 ########################################
414 ## channelstream enables persistent connections and live notification
415 ## in the system. It's also used by the chat system
416
417 channelstream.enabled = true
418 ## location of channelstream server on the backend
419 channelstream.server = 127.0.0.1:9800
420 ## location of the channelstream server from outside world
421 ## most likely this would be an http server special backend URL, that handles
422 ## websocket connections see nginx example for config
423 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
424 channelstream.secret = secret
425 channelstream.history.location = %(here)s/channelstream_history
426
427
394 ###################################
428 ###################################
395 ## APPENLIGHT CONFIG ##
429 ## APPENLIGHT CONFIG ##
396 ###################################
430 ###################################
397
431
398 ## Appenlight is tailored to work with RhodeCode, see
432 ## Appenlight is tailored to work with RhodeCode, see
399 ## http://appenlight.com for details how to obtain an account
433 ## http://appenlight.com for details how to obtain an account
400
434
401 ## appenlight integration enabled
435 ## appenlight integration enabled
402 appenlight = false
436 appenlight = false
403
437
404 appenlight.server_url = https://api.appenlight.com
438 appenlight.server_url = https://api.appenlight.com
405 appenlight.api_key = YOUR_API_KEY
439 appenlight.api_key = YOUR_API_KEY
406 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
440 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
407
441
408 # used for JS client
442 # used for JS client
409 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
443 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
410
444
411 ## TWEAK AMOUNT OF INFO SENT HERE
445 ## TWEAK AMOUNT OF INFO SENT HERE
412
446
413 ## enables 404 error logging (default False)
447 ## enables 404 error logging (default False)
414 appenlight.report_404 = false
448 appenlight.report_404 = false
415
449
416 ## time in seconds after request is considered being slow (default 1)
450 ## time in seconds after request is considered being slow (default 1)
417 appenlight.slow_request_time = 1
451 appenlight.slow_request_time = 1
418
452
419 ## record slow requests in application
453 ## record slow requests in application
420 ## (needs to be enabled for slow datastore recording and time tracking)
454 ## (needs to be enabled for slow datastore recording and time tracking)
421 appenlight.slow_requests = true
455 appenlight.slow_requests = true
422
456
423 ## enable hooking to application loggers
457 ## enable hooking to application loggers
424 appenlight.logging = true
458 appenlight.logging = true
425
459
426 ## minimum log level for log capture
460 ## minimum log level for log capture
427 appenlight.logging.level = WARNING
461 appenlight.logging.level = WARNING
428
462
429 ## send logs only from erroneous/slow requests
463 ## send logs only from erroneous/slow requests
430 ## (saves API quota for intensive logging)
464 ## (saves API quota for intensive logging)
431 appenlight.logging_on_error = false
465 appenlight.logging_on_error = false
432
466
433 ## list of additonal keywords that should be grabbed from environ object
467 ## list of additonal keywords that should be grabbed from environ object
434 ## can be string with comma separated list of words in lowercase
468 ## can be string with comma separated list of words in lowercase
435 ## (by default client will always send following info:
469 ## (by default client will always send following info:
436 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
470 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
437 ## start with HTTP* this list be extended with additional keywords here
471 ## start with HTTP* this list be extended with additional keywords here
438 appenlight.environ_keys_whitelist =
472 appenlight.environ_keys_whitelist =
439
473
440 ## list of keywords that should be blanked from request object
474 ## list of keywords that should be blanked from request object
441 ## can be string with comma separated list of words in lowercase
475 ## can be string with comma separated list of words in lowercase
442 ## (by default client will always blank keys that contain following words
476 ## (by default client will always blank keys that contain following words
443 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
477 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
444 ## this list be extended with additional keywords set here
478 ## this list be extended with additional keywords set here
445 appenlight.request_keys_blacklist =
479 appenlight.request_keys_blacklist =
446
480
447 ## list of namespaces that should be ignores when gathering log entries
481 ## list of namespaces that should be ignores when gathering log entries
448 ## can be string with comma separated list of namespaces
482 ## can be string with comma separated list of namespaces
449 ## (by default the client ignores own entries: appenlight_client.client)
483 ## (by default the client ignores own entries: appenlight_client.client)
450 appenlight.log_namespace_blacklist =
484 appenlight.log_namespace_blacklist =
451
485
452
486
453 ################################################################################
487 ################################################################################
454 ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* ##
488 ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* ##
455 ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ##
489 ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ##
456 ## execute malicious code after an exception is raised. ##
490 ## execute malicious code after an exception is raised. ##
457 ################################################################################
491 ################################################################################
458 #set debug = false
492 #set debug = false
459
493
460
494
461 ##############
495 ##############
462 ## STYLING ##
496 ## STYLING ##
463 ##############
497 ##############
464 debug_style = true
498 debug_style = true
465
499
466 #########################################################
500 #########################################################
467 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
501 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
468 #########################################################
502 #########################################################
469 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
503 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
470 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
504 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
471 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
505 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
506 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
472
507
473 # see sqlalchemy docs for other advanced settings
508 # see sqlalchemy docs for other advanced settings
474
509
475 ## print the sql statements to output
510 ## print the sql statements to output
476 sqlalchemy.db1.echo = false
511 sqlalchemy.db1.echo = false
477 ## recycle the connections after this ammount of seconds
512 ## recycle the connections after this ammount of seconds
478 sqlalchemy.db1.pool_recycle = 3600
513 sqlalchemy.db1.pool_recycle = 3600
479 sqlalchemy.db1.convert_unicode = true
514 sqlalchemy.db1.convert_unicode = true
480
515
481 ## the number of connections to keep open inside the connection pool.
516 ## the number of connections to keep open inside the connection pool.
482 ## 0 indicates no limit
517 ## 0 indicates no limit
483 #sqlalchemy.db1.pool_size = 5
518 #sqlalchemy.db1.pool_size = 5
484
519
485 ## the number of connections to allow in connection pool "overflow", that is
520 ## the number of connections to allow in connection pool "overflow", that is
486 ## connections that can be opened above and beyond the pool_size setting,
521 ## connections that can be opened above and beyond the pool_size setting,
487 ## which defaults to five.
522 ## which defaults to five.
488 #sqlalchemy.db1.max_overflow = 10
523 #sqlalchemy.db1.max_overflow = 10
489
524
490
525
491 ##################
526 ##################
492 ### VCS CONFIG ###
527 ### VCS CONFIG ###
493 ##################
528 ##################
494 vcs.server.enable = true
529 vcs.server.enable = true
495 vcs.server = localhost:9900
530 vcs.server = localhost:9900
496
531
497 ## Web server connectivity protocol, responsible for web based VCS operatations
532 ## Web server connectivity protocol, responsible for web based VCS operatations
498 ## Available protocols are:
533 ## Available protocols are:
499 ## `pyro4` - using pyro4 server
534 ## `pyro4` - using pyro4 server
500 ## `http` - using http-rpc backend
535 ## `http` - using http-rpc backend
501 #vcs.server.protocol = http
536 vcs.server.protocol = http
502
537
503 ## Push/Pull operations protocol, available options are:
538 ## Push/Pull operations protocol, available options are:
504 ## `pyro4` - using pyro4 server
539 ## `pyro4` - using pyro4 server
505 ## `rhodecode.lib.middleware.utils.scm_app_http` - Http based, recommended
540 ## `rhodecode.lib.middleware.utils.scm_app_http` - Http based, recommended
506 ## `vcsserver.scm_app` - internal app (EE only)
541 ## `vcsserver.scm_app` - internal app (EE only)
507 #vcs.scm_app_implementation = rhodecode.lib.middleware.utils.scm_app_http
542 vcs.scm_app_implementation = rhodecode.lib.middleware.utils.scm_app_http
508
543
509 ## Push/Pull operations hooks protocol, available options are:
544 ## Push/Pull operations hooks protocol, available options are:
510 ## `pyro4` - using pyro4 server
545 ## `pyro4` - using pyro4 server
511 ## `http` - using http-rpc backend
546 ## `http` - using http-rpc backend
512 #vcs.hooks.protocol = http
547 vcs.hooks.protocol = http
513
548
514 vcs.server.log_level = debug
549 vcs.server.log_level = debug
515 ## Start VCSServer with this instance as a subprocess, usefull for development
550 ## Start VCSServer with this instance as a subprocess, usefull for development
516 vcs.start_server = true
551 vcs.start_server = true
552
553 ## List of enabled VCS backends, available options are:
554 ## `hg` - mercurial
555 ## `git` - git
556 ## `svn` - subversion
517 vcs.backends = hg, git, svn
557 vcs.backends = hg, git, svn
558
518 vcs.connection_timeout = 3600
559 vcs.connection_timeout = 3600
519 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
560 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
520 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible
561 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible
521 #vcs.svn.compatible_version = pre-1.8-compatible
562 #vcs.svn.compatible_version = pre-1.8-compatible
522
563
564
565 ############################################################
566 ### Subversion proxy support (mod_dav_svn) ###
567 ### Maps RhodeCode repo groups into SVN paths for Apache ###
568 ############################################################
569 ## Enable or disable the config file generation.
570 svn.proxy.generate_config = false
571 ## Generate config file with `SVNListParentPath` set to `On`.
572 svn.proxy.list_parent_path = true
573 ## Set location and file name of generated config file.
574 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
575 ## File system path to the directory containing the repositories served by
576 ## RhodeCode.
577 svn.proxy.parent_path_root = /path/to/repo_store
578 ## Used as a prefix to the <Location> block in the generated config file. In
579 ## most cases it should be set to `/`.
580 svn.proxy.location_root = /
581
582
523 ################################
583 ################################
524 ### LOGGING CONFIGURATION ####
584 ### LOGGING CONFIGURATION ####
525 ################################
585 ################################
526 [loggers]
586 [loggers]
527 keys = root, routes, rhodecode, sqlalchemy, beaker, pyro4, templates
587 keys = root, routes, rhodecode, sqlalchemy, beaker, pyro4, templates
528
588
529 [handlers]
589 [handlers]
530 keys = console, console_sql
590 keys = console, console_sql
531
591
532 [formatters]
592 [formatters]
533 keys = generic, color_formatter, color_formatter_sql
593 keys = generic, color_formatter, color_formatter_sql
534
594
535 #############
595 #############
536 ## LOGGERS ##
596 ## LOGGERS ##
537 #############
597 #############
538 [logger_root]
598 [logger_root]
539 level = NOTSET
599 level = NOTSET
540 handlers = console
600 handlers = console
541
601
542 [logger_routes]
602 [logger_routes]
543 level = DEBUG
603 level = DEBUG
544 handlers =
604 handlers =
545 qualname = routes.middleware
605 qualname = routes.middleware
546 ## "level = DEBUG" logs the route matched and routing variables.
606 ## "level = DEBUG" logs the route matched and routing variables.
547 propagate = 1
607 propagate = 1
548
608
549 [logger_beaker]
609 [logger_beaker]
550 level = DEBUG
610 level = DEBUG
551 handlers =
611 handlers =
552 qualname = beaker.container
612 qualname = beaker.container
553 propagate = 1
613 propagate = 1
554
614
555 [logger_pyro4]
615 [logger_pyro4]
556 level = DEBUG
616 level = DEBUG
557 handlers =
617 handlers =
558 qualname = Pyro4
618 qualname = Pyro4
559 propagate = 1
619 propagate = 1
560
620
561 [logger_templates]
621 [logger_templates]
562 level = INFO
622 level = INFO
563 handlers =
623 handlers =
564 qualname = pylons.templating
624 qualname = pylons.templating
565 propagate = 1
625 propagate = 1
566
626
567 [logger_rhodecode]
627 [logger_rhodecode]
568 level = DEBUG
628 level = DEBUG
569 handlers =
629 handlers =
570 qualname = rhodecode
630 qualname = rhodecode
571 propagate = 1
631 propagate = 1
572
632
573 [logger_sqlalchemy]
633 [logger_sqlalchemy]
574 level = INFO
634 level = INFO
575 handlers = console_sql
635 handlers = console_sql
576 qualname = sqlalchemy.engine
636 qualname = sqlalchemy.engine
577 propagate = 0
637 propagate = 0
578
638
579 ##############
639 ##############
580 ## HANDLERS ##
640 ## HANDLERS ##
581 ##############
641 ##############
582
642
583 [handler_console]
643 [handler_console]
584 class = StreamHandler
644 class = StreamHandler
585 args = (sys.stderr,)
645 args = (sys.stderr,)
586 level = DEBUG
646 level = DEBUG
587 formatter = color_formatter
647 formatter = color_formatter
588
648
589 [handler_console_sql]
649 [handler_console_sql]
590 class = StreamHandler
650 class = StreamHandler
591 args = (sys.stderr,)
651 args = (sys.stderr,)
592 level = DEBUG
652 level = DEBUG
593 formatter = color_formatter_sql
653 formatter = color_formatter_sql
594
654
595 ################
655 ################
596 ## FORMATTERS ##
656 ## FORMATTERS ##
597 ################
657 ################
598
658
599 [formatter_generic]
659 [formatter_generic]
600 class = rhodecode.lib.logging_formatter.Pyro4AwareFormatter
660 class = rhodecode.lib.logging_formatter.Pyro4AwareFormatter
601 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
661 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
602 datefmt = %Y-%m-%d %H:%M:%S
662 datefmt = %Y-%m-%d %H:%M:%S
603
663
604 [formatter_color_formatter]
664 [formatter_color_formatter]
605 class = rhodecode.lib.logging_formatter.ColorFormatter
665 class = rhodecode.lib.logging_formatter.ColorFormatter
606 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
666 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
607 datefmt = %Y-%m-%d %H:%M:%S
667 datefmt = %Y-%m-%d %H:%M:%S
608
668
609 [formatter_color_formatter_sql]
669 [formatter_color_formatter_sql]
610 class = rhodecode.lib.logging_formatter.ColorFormatterSql
670 class = rhodecode.lib.logging_formatter.ColorFormatterSql
611 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
671 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
612 datefmt = %Y-%m-%d %H:%M:%S
672 datefmt = %Y-%m-%d %H:%M:%S
@@ -1,581 +1,641 b''
1 ################################################################################
1
2
2 ################################################################################
3 ################################################################################
3 # RhodeCode Enterprise - configuration file #
4 ## RHODECODE ENTERPRISE CONFIGURATION ##
4 # Built-in functions and variables #
5 # The %(here)s variable will be replaced with the parent directory of this file#
5 # The %(here)s variable will be replaced with the parent directory of this file#
6 # #
7 ################################################################################
6 ################################################################################
8
7
9 [DEFAULT]
8 [DEFAULT]
10 debug = true
9 debug = true
10
11 ################################################################################
11 ################################################################################
12 ## EMAIL CONFIGURATION ##
12 ## Uncomment and replace with the email address which should receive ##
13 ## Uncomment and replace with the email address which should receive ##
13 ## any error reports after an application crash ##
14 ## any error reports after an application crash ##
14 ## Additionally these settings will be used by the RhodeCode mailing system ##
15 ## Additionally these settings will be used by the RhodeCode mailing system ##
15 ################################################################################
16 ################################################################################
16 #email_to = admin@localhost
17
17 #error_email_from = paste_error@localhost
18 ## prefix all emails subjects with given prefix, helps filtering out emails
19 #email_prefix = [RhodeCode]
20
21 ## email FROM address all mails will be sent
18 #app_email_from = rhodecode-noreply@localhost
22 #app_email_from = rhodecode-noreply@localhost
23
24 ## Uncomment and replace with the address which should receive any error report
25 ## note: using appenlight for error handling doesn't need this to be uncommented
26 #email_to = admin@localhost
27
28 ## in case of Application errors, sent an error email form
29 #error_email_from = rhodecode_error@localhost
30
31 ## additional error message to be send in case of server crash
19 #error_message =
32 #error_message =
20 #email_prefix = [RhodeCode]
33
21
34
22 #smtp_server = mail.server.com
35 #smtp_server = mail.server.com
23 #smtp_username =
36 #smtp_username =
24 #smtp_password =
37 #smtp_password =
25 #smtp_port =
38 #smtp_port =
26 #smtp_use_tls = false
39 #smtp_use_tls = false
27 #smtp_use_ssl = true
40 #smtp_use_ssl = true
28 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
41 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
29 #smtp_auth =
42 #smtp_auth =
30
43
31 [server:main]
44 [server:main]
32 ## COMMON ##
45 ## COMMON ##
33 host = 127.0.0.1
46 host = 127.0.0.1
34 port = 5000
47 port = 5000
35
48
36 ##################################
49 ##################################
37 ## WAITRESS WSGI SERVER ##
50 ## WAITRESS WSGI SERVER ##
38 ## Recommended for Development ##
51 ## Recommended for Development ##
39 ##################################
52 ##################################
53
40 #use = egg:waitress#main
54 #use = egg:waitress#main
41 ## number of worker threads
55 ## number of worker threads
42 #threads = 5
56 #threads = 5
43 ## MAX BODY SIZE 100GB
57 ## MAX BODY SIZE 100GB
44 #max_request_body_size = 107374182400
58 #max_request_body_size = 107374182400
45 ## Use poll instead of select, fixes file descriptors limits problems.
59 ## Use poll instead of select, fixes file descriptors limits problems.
46 ## May not work on old windows systems.
60 ## May not work on old windows systems.
47 #asyncore_use_poll = true
61 #asyncore_use_poll = true
48
62
49
63
50 ##########################
64 ##########################
51 ## GUNICORN WSGI SERVER ##
65 ## GUNICORN WSGI SERVER ##
52 ##########################
66 ##########################
53 ## run with gunicorn --log-config <inifile.ini> --paste <inifile.ini>
67 ## run with gunicorn --log-config <inifile.ini> --paste <inifile.ini>
68
54 use = egg:gunicorn#main
69 use = egg:gunicorn#main
55 ## Sets the number of process workers. You must set `instance_id = *`
70 ## Sets the number of process workers. You must set `instance_id = *`
56 ## when this option is set to more than one worker, recommended
71 ## when this option is set to more than one worker, recommended
57 ## value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
72 ## value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
58 ## The `instance_id = *` must be set in the [app:main] section below
73 ## The `instance_id = *` must be set in the [app:main] section below
59 workers = 2
74 workers = 2
60 ## number of threads for each of the worker, must be set to 1 for gevent
75 ## number of threads for each of the worker, must be set to 1 for gevent
61 ## generally recommened to be at 1
76 ## generally recommened to be at 1
62 #threads = 1
77 #threads = 1
63 ## process name
78 ## process name
64 proc_name = rhodecode
79 proc_name = rhodecode
65 ## type of worker class, one of sync, gevent
80 ## type of worker class, one of sync, gevent
66 ## recommended for bigger setup is using of of other than sync one
81 ## recommended for bigger setup is using of of other than sync one
67 worker_class = sync
82 worker_class = sync
68 ## The maximum number of simultaneous clients. Valid only for Gevent
83 ## The maximum number of simultaneous clients. Valid only for Gevent
69 #worker_connections = 10
84 #worker_connections = 10
70 ## max number of requests that worker will handle before being gracefully
85 ## max number of requests that worker will handle before being gracefully
71 ## restarted, could prevent memory leaks
86 ## restarted, could prevent memory leaks
72 max_requests = 1000
87 max_requests = 1000
73 max_requests_jitter = 30
88 max_requests_jitter = 30
74 ## amount of time a worker can spend with handling a request before it
89 ## amount of time a worker can spend with handling a request before it
75 ## gets killed and restarted. Set to 6hrs
90 ## gets killed and restarted. Set to 6hrs
76 timeout = 21600
91 timeout = 21600
77
92
78
93
79 ## prefix middleware for RhodeCode, disables force_https flag.
94 ## prefix middleware for RhodeCode, disables force_https flag.
95 ## recommended when using proxy setup.
80 ## allows to set RhodeCode under a prefix in server.
96 ## allows to set RhodeCode under a prefix in server.
81 ## eg https://server.com/<prefix>. Enable `filter-with =` option below as well.
97 ## eg https://server.com/<prefix>. Enable `filter-with =` option below as well.
82 #[filter:proxy-prefix]
98 ## optionally set prefix like: `prefix = /<your-prefix>`
83 #use = egg:PasteDeploy#prefix
99 [filter:proxy-prefix]
84 #prefix = /<your-prefix>
100 use = egg:PasteDeploy#prefix
101 prefix = /
85
102
86 [app:main]
103 [app:main]
87 use = egg:rhodecode-enterprise-ce
104 use = egg:rhodecode-enterprise-ce
88 ## enable proxy prefix middleware, defined below
105
106 ## enable proxy prefix middleware, defined above
89 #filter-with = proxy-prefix
107 #filter-with = proxy-prefix
90
108
91 ## encryption key used to encrypt social plugin tokens,
109 ## encryption key used to encrypt social plugin tokens,
92 ## remote_urls with credentials etc, if not set it defaults to
110 ## remote_urls with credentials etc, if not set it defaults to
93 ## `beaker.session.secret`
111 ## `beaker.session.secret`
94 #rhodecode.encrypted_values.secret =
112 #rhodecode.encrypted_values.secret =
95
113
96 ## decryption strict mode (enabled by default). It controls if decryption raises
114 ## decryption strict mode (enabled by default). It controls if decryption raises
97 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
115 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
98 #rhodecode.encrypted_values.strict = false
116 #rhodecode.encrypted_values.strict = false
99
117
100 full_stack = true
118 ## return gzipped responses from Rhodecode (static files/application)
119 gzip_responses = false
101
120
102 ## Serve static files via RhodeCode, disable to serve them via HTTP server
121 ## autogenerate javascript routes file on startup
103 static_files = true
104
105 # autogenerate javascript routes file on startup
106 generate_js_files = false
122 generate_js_files = false
107
123
108 ## Optional Languages
124 ## Optional Languages
109 ## en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
125 ## en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
110 lang = en
126 lang = en
111
127
112 ## perform a full repository scan on each server start, this should be
128 ## perform a full repository scan on each server start, this should be
113 ## set to false after first startup, to allow faster server restarts.
129 ## set to false after first startup, to allow faster server restarts.
114 startup.import_repos = false
130 startup.import_repos = false
115
131
116 ## Uncomment and set this path to use archive download cache.
132 ## Uncomment and set this path to use archive download cache.
117 ## Once enabled, generated archives will be cached at this location
133 ## Once enabled, generated archives will be cached at this location
118 ## and served from the cache during subsequent requests for the same archive of
134 ## and served from the cache during subsequent requests for the same archive of
119 ## the repository.
135 ## the repository.
120 #archive_cache_dir = /tmp/tarballcache
136 #archive_cache_dir = /tmp/tarballcache
121
137
122 ## change this to unique ID for security
138 ## change this to unique ID for security
123 app_instance_uuid = rc-production
139 app_instance_uuid = rc-production
124
140
125 ## cut off limit for large diffs (size in bytes)
141 ## cut off limit for large diffs (size in bytes)
126 cut_off_limit_diff = 1024000
142 cut_off_limit_diff = 1024000
127 cut_off_limit_file = 256000
143 cut_off_limit_file = 256000
128
144
129 ## use cache version of scm repo everywhere
145 ## use cache version of scm repo everywhere
130 vcs_full_cache = true
146 vcs_full_cache = true
131
147
132 ## force https in RhodeCode, fixes https redirects, assumes it's always https
148 ## force https in RhodeCode, fixes https redirects, assumes it's always https
133 ## Normally this is controlled by proper http flags sent from http server
149 ## Normally this is controlled by proper http flags sent from http server
134 force_https = false
150 force_https = false
135
151
136 ## use Strict-Transport-Security headers
152 ## use Strict-Transport-Security headers
137 use_htsts = false
153 use_htsts = false
138
154
139 ## number of commits stats will parse on each iteration
155 ## number of commits stats will parse on each iteration
140 commit_parse_limit = 25
156 commit_parse_limit = 25
141
157
142 ## git rev filter option, --all is the default filter, if you need to
158 ## git rev filter option, --all is the default filter, if you need to
143 ## hide all refs in changelog switch this to --branches --tags
159 ## hide all refs in changelog switch this to --branches --tags
144 git_rev_filter = --branches --tags
160 git_rev_filter = --branches --tags
145
161
146 # Set to true if your repos are exposed using the dumb protocol
162 # Set to true if your repos are exposed using the dumb protocol
147 git_update_server_info = false
163 git_update_server_info = false
148
164
149 ## RSS/ATOM feed options
165 ## RSS/ATOM feed options
150 rss_cut_off_limit = 256000
166 rss_cut_off_limit = 256000
151 rss_items_per_page = 10
167 rss_items_per_page = 10
152 rss_include_diff = false
168 rss_include_diff = false
153
169
154 ## gist URL alias, used to create nicer urls for gist. This should be an
170 ## gist URL alias, used to create nicer urls for gist. This should be an
155 ## url that does rewrites to _admin/gists/<gistid>.
171 ## url that does rewrites to _admin/gists/<gistid>.
156 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
172 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
157 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/<gistid>
173 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/<gistid>
158 gist_alias_url =
174 gist_alias_url =
159
175
160 ## List of controllers (using glob pattern syntax) that AUTH TOKENS could be
176 ## List of controllers (using glob pattern syntax) that AUTH TOKENS could be
161 ## used for access.
177 ## used for access.
162 ## Adding ?auth_token = <token> to the url authenticates this request as if it
178 ## Adding ?auth_token = <token> to the url authenticates this request as if it
163 ## came from the the logged in user who own this authentication token.
179 ## came from the the logged in user who own this authentication token.
164 ##
180 ##
165 ## Syntax is <ControllerClass>:<function_pattern>.
181 ## Syntax is <ControllerClass>:<function_pattern>.
166 ## To enable access to raw_files put `FilesController:raw`.
182 ## To enable access to raw_files put `FilesController:raw`.
167 ## To enable access to patches add `ChangesetController:changeset_patch`.
183 ## To enable access to patches add `ChangesetController:changeset_patch`.
168 ## The list should be "," separated and on a single line.
184 ## The list should be "," separated and on a single line.
169 ##
185 ##
170 ## Recommended controllers to enable:
186 ## Recommended controllers to enable:
171 # ChangesetController:changeset_patch,
187 # ChangesetController:changeset_patch,
172 # ChangesetController:changeset_raw,
188 # ChangesetController:changeset_raw,
173 # FilesController:raw,
189 # FilesController:raw,
174 # FilesController:archivefile,
190 # FilesController:archivefile,
175 # GistsController:*,
191 # GistsController:*,
176 api_access_controllers_whitelist =
192 api_access_controllers_whitelist =
177
193
178 ## default encoding used to convert from and to unicode
194 ## default encoding used to convert from and to unicode
179 ## can be also a comma separated list of encoding in case of mixed encodings
195 ## can be also a comma separated list of encoding in case of mixed encodings
180 default_encoding = UTF-8
196 default_encoding = UTF-8
181
197
182 ## instance-id prefix
198 ## instance-id prefix
183 ## a prefix key for this instance used for cache invalidation when running
199 ## a prefix key for this instance used for cache invalidation when running
184 ## multiple instances of rhodecode, make sure it's globally unique for
200 ## multiple instances of rhodecode, make sure it's globally unique for
185 ## all running rhodecode instances. Leave empty if you don't use it
201 ## all running rhodecode instances. Leave empty if you don't use it
186 instance_id =
202 instance_id =
187
203
188 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
204 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
189 ## of an authentication plugin also if it is disabled by it's settings.
205 ## of an authentication plugin also if it is disabled by it's settings.
190 ## This could be useful if you are unable to log in to the system due to broken
206 ## This could be useful if you are unable to log in to the system due to broken
191 ## authentication settings. Then you can enable e.g. the internal rhodecode auth
207 ## authentication settings. Then you can enable e.g. the internal rhodecode auth
192 ## module to log in again and fix the settings.
208 ## module to log in again and fix the settings.
193 ##
209 ##
194 ## Available builtin plugin IDs (hash is part of the ID):
210 ## Available builtin plugin IDs (hash is part of the ID):
195 ## egg:rhodecode-enterprise-ce#rhodecode
211 ## egg:rhodecode-enterprise-ce#rhodecode
196 ## egg:rhodecode-enterprise-ce#pam
212 ## egg:rhodecode-enterprise-ce#pam
197 ## egg:rhodecode-enterprise-ce#ldap
213 ## egg:rhodecode-enterprise-ce#ldap
198 ## egg:rhodecode-enterprise-ce#jasig_cas
214 ## egg:rhodecode-enterprise-ce#jasig_cas
199 ## egg:rhodecode-enterprise-ce#headers
215 ## egg:rhodecode-enterprise-ce#headers
200 ## egg:rhodecode-enterprise-ce#crowd
216 ## egg:rhodecode-enterprise-ce#crowd
201 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
217 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
202
218
203 ## alternative return HTTP header for failed authentication. Default HTTP
219 ## alternative return HTTP header for failed authentication. Default HTTP
204 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
220 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
205 ## handling that causing a series of failed authentication calls.
221 ## handling that causing a series of failed authentication calls.
206 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
222 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
207 ## This will be served instead of default 401 on bad authnetication
223 ## This will be served instead of default 401 on bad authnetication
208 auth_ret_code =
224 auth_ret_code =
209
225
210 ## use special detection method when serving auth_ret_code, instead of serving
226 ## use special detection method when serving auth_ret_code, instead of serving
211 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
227 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
212 ## and then serve auth_ret_code to clients
228 ## and then serve auth_ret_code to clients
213 auth_ret_code_detection = false
229 auth_ret_code_detection = false
214
230
215 ## locking return code. When repository is locked return this HTTP code. 2XX
231 ## locking return code. When repository is locked return this HTTP code. 2XX
216 ## codes don't break the transactions while 4XX codes do
232 ## codes don't break the transactions while 4XX codes do
217 lock_ret_code = 423
233 lock_ret_code = 423
218
234
219 ## allows to change the repository location in settings page
235 ## allows to change the repository location in settings page
220 allow_repo_location_change = true
236 allow_repo_location_change = true
221
237
222 ## allows to setup custom hooks in settings page
238 ## allows to setup custom hooks in settings page
223 allow_custom_hooks_settings = true
239 allow_custom_hooks_settings = true
224
240
225 ## generated license token, goto license page in RhodeCode settings to obtain
241 ## generated license token, goto license page in RhodeCode settings to obtain
226 ## new token
242 ## new token
227 license_token =
243 license_token =
228
244
229 ## supervisor connection uri, for managing supervisor and logs.
245 ## supervisor connection uri, for managing supervisor and logs.
230 supervisor.uri =
246 supervisor.uri =
231 ## supervisord group name/id we only want this RC instance to handle
247 ## supervisord group name/id we only want this RC instance to handle
232 supervisor.group_id = prod
248 supervisor.group_id = prod
233
249
234 ## Display extended labs settings
250 ## Display extended labs settings
235 labs_settings_active = true
251 labs_settings_active = true
236
252
237 ####################################
253 ####################################
238 ### CELERY CONFIG ####
254 ### CELERY CONFIG ####
239 ####################################
255 ####################################
240 use_celery = false
256 use_celery = false
241 broker.host = localhost
257 broker.host = localhost
242 broker.vhost = rabbitmqhost
258 broker.vhost = rabbitmqhost
243 broker.port = 5672
259 broker.port = 5672
244 broker.user = rabbitmq
260 broker.user = rabbitmq
245 broker.password = qweqwe
261 broker.password = qweqwe
246
262
247 celery.imports = rhodecode.lib.celerylib.tasks
263 celery.imports = rhodecode.lib.celerylib.tasks
248
264
249 celery.result.backend = amqp
265 celery.result.backend = amqp
250 celery.result.dburi = amqp://
266 celery.result.dburi = amqp://
251 celery.result.serialier = json
267 celery.result.serialier = json
252
268
253 #celery.send.task.error.emails = true
269 #celery.send.task.error.emails = true
254 #celery.amqp.task.result.expires = 18000
270 #celery.amqp.task.result.expires = 18000
255
271
256 celeryd.concurrency = 2
272 celeryd.concurrency = 2
257 #celeryd.log.file = celeryd.log
273 #celeryd.log.file = celeryd.log
258 celeryd.log.level = debug
274 celeryd.log.level = debug
259 celeryd.max.tasks.per.child = 1
275 celeryd.max.tasks.per.child = 1
260
276
261 ## tasks will never be sent to the queue, but executed locally instead.
277 ## tasks will never be sent to the queue, but executed locally instead.
262 celery.always.eager = false
278 celery.always.eager = false
263
279
264 ####################################
280 ####################################
265 ### BEAKER CACHE ####
281 ### BEAKER CACHE ####
266 ####################################
282 ####################################
267 # default cache dir for templates. Putting this into a ramdisk
283 # default cache dir for templates. Putting this into a ramdisk
268 ## can boost performance, eg. %(here)s/data_ramdisk
284 ## can boost performance, eg. %(here)s/data_ramdisk
269 cache_dir = %(here)s/data
285 cache_dir = %(here)s/data
270
286
271 ## locking and default file storage for Beaker. Putting this into a ramdisk
287 ## locking and default file storage for Beaker. Putting this into a ramdisk
272 ## can boost performance, eg. %(here)s/data_ramdisk/cache/beaker_data
288 ## can boost performance, eg. %(here)s/data_ramdisk/cache/beaker_data
273 beaker.cache.data_dir = %(here)s/data/cache/beaker_data
289 beaker.cache.data_dir = %(here)s/data/cache/beaker_data
274 beaker.cache.lock_dir = %(here)s/data/cache/beaker_lock
290 beaker.cache.lock_dir = %(here)s/data/cache/beaker_lock
275
291
276 beaker.cache.regions = super_short_term, short_term, long_term, sql_cache_short, auth_plugins, repo_cache_long
292 beaker.cache.regions = super_short_term, short_term, long_term, sql_cache_short, auth_plugins, repo_cache_long
277
293
278 beaker.cache.super_short_term.type = memory
294 beaker.cache.super_short_term.type = memory
279 beaker.cache.super_short_term.expire = 10
295 beaker.cache.super_short_term.expire = 10
280 beaker.cache.super_short_term.key_length = 256
296 beaker.cache.super_short_term.key_length = 256
281
297
282 beaker.cache.short_term.type = memory
298 beaker.cache.short_term.type = memory
283 beaker.cache.short_term.expire = 60
299 beaker.cache.short_term.expire = 60
284 beaker.cache.short_term.key_length = 256
300 beaker.cache.short_term.key_length = 256
285
301
286 beaker.cache.long_term.type = memory
302 beaker.cache.long_term.type = memory
287 beaker.cache.long_term.expire = 36000
303 beaker.cache.long_term.expire = 36000
288 beaker.cache.long_term.key_length = 256
304 beaker.cache.long_term.key_length = 256
289
305
290 beaker.cache.sql_cache_short.type = memory
306 beaker.cache.sql_cache_short.type = memory
291 beaker.cache.sql_cache_short.expire = 10
307 beaker.cache.sql_cache_short.expire = 10
292 beaker.cache.sql_cache_short.key_length = 256
308 beaker.cache.sql_cache_short.key_length = 256
293
309
294 # default is memory cache, configure only if required
310 ## default is memory cache, configure only if required
295 # using multi-node or multi-worker setup
311 ## using multi-node or multi-worker setup
296 #beaker.cache.auth_plugins.type = ext:database
312 #beaker.cache.auth_plugins.type = ext:database
297 #beaker.cache.auth_plugins.lock_dir = %(here)s/data/cache/auth_plugin_lock
313 #beaker.cache.auth_plugins.lock_dir = %(here)s/data/cache/auth_plugin_lock
298 #beaker.cache.auth_plugins.url = postgresql://postgres:secret@localhost/rhodecode
314 #beaker.cache.auth_plugins.url = postgresql://postgres:secret@localhost/rhodecode
299 #beaker.cache.auth_plugins.url = mysql://root:secret@127.0.0.1/rhodecode
315 #beaker.cache.auth_plugins.url = mysql://root:secret@127.0.0.1/rhodecode
300 #beaker.cache.auth_plugins.sa.pool_recycle = 3600
316 #beaker.cache.auth_plugins.sa.pool_recycle = 3600
301 #beaker.cache.auth_plugins.sa.pool_size = 10
317 #beaker.cache.auth_plugins.sa.pool_size = 10
302 #beaker.cache.auth_plugins.sa.max_overflow = 0
318 #beaker.cache.auth_plugins.sa.max_overflow = 0
303
319
304 beaker.cache.repo_cache_long.type = memorylru_base
320 beaker.cache.repo_cache_long.type = memorylru_base
305 beaker.cache.repo_cache_long.max_items = 4096
321 beaker.cache.repo_cache_long.max_items = 4096
306 beaker.cache.repo_cache_long.expire = 2592000
322 beaker.cache.repo_cache_long.expire = 2592000
307
323
308 # default is memorylru_base cache, configure only if required
324 ## default is memorylru_base cache, configure only if required
309 # using multi-node or multi-worker setup
325 ## using multi-node or multi-worker setup
310 #beaker.cache.repo_cache_long.type = ext:memcached
326 #beaker.cache.repo_cache_long.type = ext:memcached
311 #beaker.cache.repo_cache_long.url = localhost:11211
327 #beaker.cache.repo_cache_long.url = localhost:11211
312 #beaker.cache.repo_cache_long.expire = 1209600
328 #beaker.cache.repo_cache_long.expire = 1209600
313 #beaker.cache.repo_cache_long.key_length = 256
329 #beaker.cache.repo_cache_long.key_length = 256
314
330
315 ####################################
331 ####################################
316 ### BEAKER SESSION ####
332 ### BEAKER SESSION ####
317 ####################################
333 ####################################
318
334
319 ## .session.type is type of storage options for the session, current allowed
335 ## .session.type is type of storage options for the session, current allowed
320 ## types are file, ext:memcached, ext:database, and memory (default).
336 ## types are file, ext:memcached, ext:database, and memory (default).
321 beaker.session.type = file
337 beaker.session.type = file
322 beaker.session.data_dir = %(here)s/data/sessions/data
338 beaker.session.data_dir = %(here)s/data/sessions/data
323
339
324 ## db based session, fast, and allows easy management over logged in users ##
340 ## db based session, fast, and allows easy management over logged in users
325 #beaker.session.type = ext:database
341 #beaker.session.type = ext:database
326 #beaker.session.table_name = db_session
342 #beaker.session.table_name = db_session
327 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
343 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
328 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
344 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
329 #beaker.session.sa.pool_recycle = 3600
345 #beaker.session.sa.pool_recycle = 3600
330 #beaker.session.sa.echo = false
346 #beaker.session.sa.echo = false
331
347
332 beaker.session.key = rhodecode
348 beaker.session.key = rhodecode
333 beaker.session.secret = production-rc-uytcxaz
349 beaker.session.secret = production-rc-uytcxaz
334 beaker.session.lock_dir = %(here)s/data/sessions/lock
350 beaker.session.lock_dir = %(here)s/data/sessions/lock
335
351
336 ## Secure encrypted cookie. Requires AES and AES python libraries
352 ## Secure encrypted cookie. Requires AES and AES python libraries
337 ## you must disable beaker.session.secret to use this
353 ## you must disable beaker.session.secret to use this
338 #beaker.session.encrypt_key = <key_for_encryption>
354 #beaker.session.encrypt_key = <key_for_encryption>
339 #beaker.session.validate_key = <validation_key>
355 #beaker.session.validate_key = <validation_key>
340
356
341 ## sets session as invalid(also logging out user) if it haven not been
357 ## sets session as invalid(also logging out user) if it haven not been
342 ## accessed for given amount of time in seconds
358 ## accessed for given amount of time in seconds
343 beaker.session.timeout = 2592000
359 beaker.session.timeout = 2592000
344 beaker.session.httponly = true
360 beaker.session.httponly = true
361 ## Path to use for the cookie.
345 #beaker.session.cookie_path = /<your-prefix>
362 #beaker.session.cookie_path = /<your-prefix>
346
363
347 ## uncomment for https secure cookie
364 ## uncomment for https secure cookie
348 beaker.session.secure = false
365 beaker.session.secure = false
349
366
350 ## auto save the session to not to use .save()
367 ## auto save the session to not to use .save()
351 beaker.session.auto = false
368 beaker.session.auto = false
352
369
353 ## default cookie expiration time in seconds, set to `true` to set expire
370 ## default cookie expiration time in seconds, set to `true` to set expire
354 ## at browser close
371 ## at browser close
355 #beaker.session.cookie_expires = 3600
372 #beaker.session.cookie_expires = 3600
356
373
357 ###################################
374 ###################################
358 ## SEARCH INDEXING CONFIGURATION ##
375 ## SEARCH INDEXING CONFIGURATION ##
359 ###################################
376 ###################################
360 ## Full text search indexer is available in rhodecode-tools under
377 ## Full text search indexer is available in rhodecode-tools under
361 ## `rhodecode-tools index` command
378 ## `rhodecode-tools index` command
362
379
363 # WHOOSH Backend, doesn't require additional services to run
380 # WHOOSH Backend, doesn't require additional services to run
364 # it works good with few dozen repos
381 # it works good with few dozen repos
365 search.module = rhodecode.lib.index.whoosh
382 search.module = rhodecode.lib.index.whoosh
366 search.location = %(here)s/data/index
383 search.location = %(here)s/data/index
367
384
385 ########################################
386 ### CHANNELSTREAM CONFIG ####
387 ########################################
388 ## channelstream enables persistent connections and live notification
389 ## in the system. It's also used by the chat system
390
391 channelstream.enabled = true
392 ## location of channelstream server on the backend
393 channelstream.server = 127.0.0.1:9800
394 ## location of the channelstream server from outside world
395 ## most likely this would be an http server special backend URL, that handles
396 ## websocket connections see nginx example for config
397 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
398 channelstream.secret = secret
399 channelstream.history.location = %(here)s/channelstream_history
400
401
368 ###################################
402 ###################################
369 ## APPENLIGHT CONFIG ##
403 ## APPENLIGHT CONFIG ##
370 ###################################
404 ###################################
371
405
372 ## Appenlight is tailored to work with RhodeCode, see
406 ## Appenlight is tailored to work with RhodeCode, see
373 ## http://appenlight.com for details how to obtain an account
407 ## http://appenlight.com for details how to obtain an account
374
408
375 ## appenlight integration enabled
409 ## appenlight integration enabled
376 appenlight = false
410 appenlight = false
377
411
378 appenlight.server_url = https://api.appenlight.com
412 appenlight.server_url = https://api.appenlight.com
379 appenlight.api_key = YOUR_API_KEY
413 appenlight.api_key = YOUR_API_KEY
380 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
414 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
381
415
382 # used for JS client
416 # used for JS client
383 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
417 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
384
418
385 ## TWEAK AMOUNT OF INFO SENT HERE
419 ## TWEAK AMOUNT OF INFO SENT HERE
386
420
387 ## enables 404 error logging (default False)
421 ## enables 404 error logging (default False)
388 appenlight.report_404 = false
422 appenlight.report_404 = false
389
423
390 ## time in seconds after request is considered being slow (default 1)
424 ## time in seconds after request is considered being slow (default 1)
391 appenlight.slow_request_time = 1
425 appenlight.slow_request_time = 1
392
426
393 ## record slow requests in application
427 ## record slow requests in application
394 ## (needs to be enabled for slow datastore recording and time tracking)
428 ## (needs to be enabled for slow datastore recording and time tracking)
395 appenlight.slow_requests = true
429 appenlight.slow_requests = true
396
430
397 ## enable hooking to application loggers
431 ## enable hooking to application loggers
398 appenlight.logging = true
432 appenlight.logging = true
399
433
400 ## minimum log level for log capture
434 ## minimum log level for log capture
401 appenlight.logging.level = WARNING
435 appenlight.logging.level = WARNING
402
436
403 ## send logs only from erroneous/slow requests
437 ## send logs only from erroneous/slow requests
404 ## (saves API quota for intensive logging)
438 ## (saves API quota for intensive logging)
405 appenlight.logging_on_error = false
439 appenlight.logging_on_error = false
406
440
407 ## list of additonal keywords that should be grabbed from environ object
441 ## list of additonal keywords that should be grabbed from environ object
408 ## can be string with comma separated list of words in lowercase
442 ## can be string with comma separated list of words in lowercase
409 ## (by default client will always send following info:
443 ## (by default client will always send following info:
410 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
444 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
411 ## start with HTTP* this list be extended with additional keywords here
445 ## start with HTTP* this list be extended with additional keywords here
412 appenlight.environ_keys_whitelist =
446 appenlight.environ_keys_whitelist =
413
447
414 ## list of keywords that should be blanked from request object
448 ## list of keywords that should be blanked from request object
415 ## can be string with comma separated list of words in lowercase
449 ## can be string with comma separated list of words in lowercase
416 ## (by default client will always blank keys that contain following words
450 ## (by default client will always blank keys that contain following words
417 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
451 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
418 ## this list be extended with additional keywords set here
452 ## this list be extended with additional keywords set here
419 appenlight.request_keys_blacklist =
453 appenlight.request_keys_blacklist =
420
454
421 ## list of namespaces that should be ignores when gathering log entries
455 ## list of namespaces that should be ignores when gathering log entries
422 ## can be string with comma separated list of namespaces
456 ## can be string with comma separated list of namespaces
423 ## (by default the client ignores own entries: appenlight_client.client)
457 ## (by default the client ignores own entries: appenlight_client.client)
424 appenlight.log_namespace_blacklist =
458 appenlight.log_namespace_blacklist =
425
459
426
460
427 ################################################################################
461 ################################################################################
428 ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* ##
462 ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* ##
429 ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ##
463 ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ##
430 ## execute malicious code after an exception is raised. ##
464 ## execute malicious code after an exception is raised. ##
431 ################################################################################
465 ################################################################################
432 set debug = false
466 set debug = false
433
467
434
468
435 #########################################################
469 #########################################################
436 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
470 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
437 #########################################################
471 #########################################################
438 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
472 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
473 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
474 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
439 sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
475 sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
440 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
441
476
442 # see sqlalchemy docs for other advanced settings
477 # see sqlalchemy docs for other advanced settings
443
478
444 ## print the sql statements to output
479 ## print the sql statements to output
445 sqlalchemy.db1.echo = false
480 sqlalchemy.db1.echo = false
446 ## recycle the connections after this ammount of seconds
481 ## recycle the connections after this ammount of seconds
447 sqlalchemy.db1.pool_recycle = 3600
482 sqlalchemy.db1.pool_recycle = 3600
448 sqlalchemy.db1.convert_unicode = true
483 sqlalchemy.db1.convert_unicode = true
449
484
450 ## the number of connections to keep open inside the connection pool.
485 ## the number of connections to keep open inside the connection pool.
451 ## 0 indicates no limit
486 ## 0 indicates no limit
452 #sqlalchemy.db1.pool_size = 5
487 #sqlalchemy.db1.pool_size = 5
453
488
454 ## the number of connections to allow in connection pool "overflow", that is
489 ## the number of connections to allow in connection pool "overflow", that is
455 ## connections that can be opened above and beyond the pool_size setting,
490 ## connections that can be opened above and beyond the pool_size setting,
456 ## which defaults to five.
491 ## which defaults to five.
457 #sqlalchemy.db1.max_overflow = 10
492 #sqlalchemy.db1.max_overflow = 10
458
493
459
494
460 ##################
495 ##################
461 ### VCS CONFIG ###
496 ### VCS CONFIG ###
462 ##################
497 ##################
463 vcs.server.enable = true
498 vcs.server.enable = true
464 vcs.server = localhost:9900
499 vcs.server = localhost:9900
465
500
466 ## Web server connectivity protocol, responsible for web based VCS operatations
501 ## Web server connectivity protocol, responsible for web based VCS operatations
467 ## Available protocols are:
502 ## Available protocols are:
468 ## `pyro4` - using pyro4 server
503 ## `pyro4` - using pyro4 server
469 ## `http` - using http-rpc backend
504 ## `http` - using http-rpc backend
470 #vcs.server.protocol = http
505 #vcs.server.protocol = http
471
506
472 ## Push/Pull operations protocol, available options are:
507 ## Push/Pull operations protocol, available options are:
473 ## `pyro4` - using pyro4 server
508 ## `pyro4` - using pyro4 server
474 ## `rhodecode.lib.middleware.utils.scm_app_http` - Http based, recommended
509 ## `rhodecode.lib.middleware.utils.scm_app_http` - Http based, recommended
475 ## `vcsserver.scm_app` - internal app (EE only)
510 ## `vcsserver.scm_app` - internal app (EE only)
476 #vcs.scm_app_implementation = rhodecode.lib.middleware.utils.scm_app_http
511 #vcs.scm_app_implementation = rhodecode.lib.middleware.utils.scm_app_http
477
512
478 ## Push/Pull operations hooks protocol, available options are:
513 ## Push/Pull operations hooks protocol, available options are:
479 ## `pyro4` - using pyro4 server
514 ## `pyro4` - using pyro4 server
480 ## `http` - using http-rpc backend
515 ## `http` - using http-rpc backend
481 #vcs.hooks.protocol = http
516 #vcs.hooks.protocol = http
482
517
483 vcs.server.log_level = info
518 vcs.server.log_level = info
484 ## Start VCSServer with this instance as a subprocess, usefull for development
519 ## Start VCSServer with this instance as a subprocess, usefull for development
485 vcs.start_server = false
520 vcs.start_server = false
521
522 ## List of enabled VCS backends, available options are:
523 ## `hg` - mercurial
524 ## `git` - git
525 ## `svn` - subversion
486 vcs.backends = hg, git, svn
526 vcs.backends = hg, git, svn
527
487 vcs.connection_timeout = 3600
528 vcs.connection_timeout = 3600
488 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
529 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
489 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible
530 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible
490 #vcs.svn.compatible_version = pre-1.8-compatible
531 #vcs.svn.compatible_version = pre-1.8-compatible
491
532
533
534 ############################################################
535 ### Subversion proxy support (mod_dav_svn) ###
536 ### Maps RhodeCode repo groups into SVN paths for Apache ###
537 ############################################################
538 ## Enable or disable the config file generation.
539 svn.proxy.generate_config = false
540 ## Generate config file with `SVNListParentPath` set to `On`.
541 svn.proxy.list_parent_path = true
542 ## Set location and file name of generated config file.
543 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
544 ## File system path to the directory containing the repositories served by
545 ## RhodeCode.
546 svn.proxy.parent_path_root = /path/to/repo_store
547 ## Used as a prefix to the <Location> block in the generated config file. In
548 ## most cases it should be set to `/`.
549 svn.proxy.location_root = /
550
551
492 ################################
552 ################################
493 ### LOGGING CONFIGURATION ####
553 ### LOGGING CONFIGURATION ####
494 ################################
554 ################################
495 [loggers]
555 [loggers]
496 keys = root, routes, rhodecode, sqlalchemy, beaker, pyro4, templates
556 keys = root, routes, rhodecode, sqlalchemy, beaker, pyro4, templates
497
557
498 [handlers]
558 [handlers]
499 keys = console, console_sql
559 keys = console, console_sql
500
560
501 [formatters]
561 [formatters]
502 keys = generic, color_formatter, color_formatter_sql
562 keys = generic, color_formatter, color_formatter_sql
503
563
504 #############
564 #############
505 ## LOGGERS ##
565 ## LOGGERS ##
506 #############
566 #############
507 [logger_root]
567 [logger_root]
508 level = NOTSET
568 level = NOTSET
509 handlers = console
569 handlers = console
510
570
511 [logger_routes]
571 [logger_routes]
512 level = DEBUG
572 level = DEBUG
513 handlers =
573 handlers =
514 qualname = routes.middleware
574 qualname = routes.middleware
515 ## "level = DEBUG" logs the route matched and routing variables.
575 ## "level = DEBUG" logs the route matched and routing variables.
516 propagate = 1
576 propagate = 1
517
577
518 [logger_beaker]
578 [logger_beaker]
519 level = DEBUG
579 level = DEBUG
520 handlers =
580 handlers =
521 qualname = beaker.container
581 qualname = beaker.container
522 propagate = 1
582 propagate = 1
523
583
524 [logger_pyro4]
584 [logger_pyro4]
525 level = DEBUG
585 level = DEBUG
526 handlers =
586 handlers =
527 qualname = Pyro4
587 qualname = Pyro4
528 propagate = 1
588 propagate = 1
529
589
530 [logger_templates]
590 [logger_templates]
531 level = INFO
591 level = INFO
532 handlers =
592 handlers =
533 qualname = pylons.templating
593 qualname = pylons.templating
534 propagate = 1
594 propagate = 1
535
595
536 [logger_rhodecode]
596 [logger_rhodecode]
537 level = DEBUG
597 level = DEBUG
538 handlers =
598 handlers =
539 qualname = rhodecode
599 qualname = rhodecode
540 propagate = 1
600 propagate = 1
541
601
542 [logger_sqlalchemy]
602 [logger_sqlalchemy]
543 level = INFO
603 level = INFO
544 handlers = console_sql
604 handlers = console_sql
545 qualname = sqlalchemy.engine
605 qualname = sqlalchemy.engine
546 propagate = 0
606 propagate = 0
547
607
548 ##############
608 ##############
549 ## HANDLERS ##
609 ## HANDLERS ##
550 ##############
610 ##############
551
611
552 [handler_console]
612 [handler_console]
553 class = StreamHandler
613 class = StreamHandler
554 args = (sys.stderr,)
614 args = (sys.stderr,)
555 level = INFO
615 level = INFO
556 formatter = generic
616 formatter = generic
557
617
558 [handler_console_sql]
618 [handler_console_sql]
559 class = StreamHandler
619 class = StreamHandler
560 args = (sys.stderr,)
620 args = (sys.stderr,)
561 level = WARN
621 level = WARN
562 formatter = generic
622 formatter = generic
563
623
564 ################
624 ################
565 ## FORMATTERS ##
625 ## FORMATTERS ##
566 ################
626 ################
567
627
568 [formatter_generic]
628 [formatter_generic]
569 class = rhodecode.lib.logging_formatter.Pyro4AwareFormatter
629 class = rhodecode.lib.logging_formatter.Pyro4AwareFormatter
570 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
630 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
571 datefmt = %Y-%m-%d %H:%M:%S
631 datefmt = %Y-%m-%d %H:%M:%S
572
632
573 [formatter_color_formatter]
633 [formatter_color_formatter]
574 class = rhodecode.lib.logging_formatter.ColorFormatter
634 class = rhodecode.lib.logging_formatter.ColorFormatter
575 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
635 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
576 datefmt = %Y-%m-%d %H:%M:%S
636 datefmt = %Y-%m-%d %H:%M:%S
577
637
578 [formatter_color_formatter_sql]
638 [formatter_color_formatter_sql]
579 class = rhodecode.lib.logging_formatter.ColorFormatterSql
639 class = rhodecode.lib.logging_formatter.ColorFormatterSql
580 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
640 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
581 datefmt = %Y-%m-%d %H:%M:%S
641 datefmt = %Y-%m-%d %H:%M:%S
@@ -1,227 +1,229 b''
1 # Nix environment for the community edition
1 # Nix environment for the community edition
2 #
2 #
3 # This shall be as lean as possible, just producing the Enterprise
3 # This shall be as lean as possible, just producing the Enterprise
4 # derivation. For advanced tweaks to pimp up the development environment we use
4 # derivation. For advanced tweaks to pimp up the development environment we use
5 # "shell.nix" so that it does not have to clutter this file.
5 # "shell.nix" so that it does not have to clutter this file.
6
6
7 { pkgs ? (import <nixpkgs> {})
7 { pkgs ? (import <nixpkgs> {})
8 , pythonPackages ? "python27Packages"
8 , pythonPackages ? "python27Packages"
9 , pythonExternalOverrides ? self: super: {}
9 , pythonExternalOverrides ? self: super: {}
10 , doCheck ? true
10 , doCheck ? true
11 }:
11 }:
12
12
13 let pkgs_ = pkgs; in
13 let pkgs_ = pkgs; in
14
14
15 let
15 let
16 pkgs = pkgs_.overridePackages (self: super: {
16 pkgs = pkgs_.overridePackages (self: super: {
17 # Override subversion derivation to
17 # Override subversion derivation to
18 # - activate python bindings
18 # - activate python bindings
19 # - set version to 1.8
19 # - set version to 1.8
20 subversion = super.subversion18.override {
20 subversion = super.subversion18.override {
21 httpSupport = true;
21 httpSupport = true;
22 pythonBindings = true;
22 pythonBindings = true;
23 python = self.python27Packages.python;
23 python = self.python27Packages.python;
24 };
24 };
25 });
25 });
26
26
27 inherit (pkgs.lib) fix extends;
27 inherit (pkgs.lib) fix extends;
28
28
29 basePythonPackages = with builtins; if isAttrs pythonPackages
29 basePythonPackages = with builtins; if isAttrs pythonPackages
30 then pythonPackages
30 then pythonPackages
31 else getAttr pythonPackages pkgs;
31 else getAttr pythonPackages pkgs;
32
32
33 elem = builtins.elem;
33 elem = builtins.elem;
34 basename = path: with pkgs.lib; last (splitString "/" path);
34 basename = path: with pkgs.lib; last (splitString "/" path);
35 startsWith = prefix: full: let
35 startsWith = prefix: full: let
36 actualPrefix = builtins.substring 0 (builtins.stringLength prefix) full;
36 actualPrefix = builtins.substring 0 (builtins.stringLength prefix) full;
37 in actualPrefix == prefix;
37 in actualPrefix == prefix;
38
38
39 src-filter = path: type: with pkgs.lib;
39 src-filter = path: type: with pkgs.lib;
40 let
40 let
41 ext = last (splitString "." path);
41 ext = last (splitString "." path);
42 in
42 in
43 !elem (basename path) [
43 !elem (basename path) [
44 ".git" ".hg" "__pycache__" ".eggs" "node_modules"
44 ".git" ".hg" "__pycache__" ".eggs" "node_modules"
45 "build" "data" "tmp"] &&
45 "build" "data" "tmp"] &&
46 !elem ext ["egg-info" "pyc"] &&
46 !elem ext ["egg-info" "pyc"] &&
47 !startsWith "result" path;
47 !startsWith "result" path;
48
48
49 sources = pkgs.config.rc.sources or {};
49 sources = pkgs.config.rc.sources or {};
50 rhodecode-enterprise-ce-src = builtins.filterSource src-filter ./.;
50 rhodecode-enterprise-ce-src = builtins.filterSource src-filter ./.;
51
51
52 # Load the generated node packages
52 # Load the generated node packages
53 nodePackages = pkgs.callPackage "${pkgs.path}/pkgs/top-level/node-packages.nix" rec {
53 nodePackages = pkgs.callPackage "${pkgs.path}/pkgs/top-level/node-packages.nix" rec {
54 self = nodePackages;
54 self = nodePackages;
55 generated = pkgs.callPackage ./pkgs/node-packages.nix { inherit self; };
55 generated = pkgs.callPackage ./pkgs/node-packages.nix { inherit self; };
56 };
56 };
57
57
58 # TODO: Should be taken automatically out of the generates packages.
58 # TODO: Should be taken automatically out of the generates packages.
59 # apps.nix has one solution for this, although I'd prefer to have the deps
59 # apps.nix has one solution for this, although I'd prefer to have the deps
60 # from package.json mapped in here.
60 # from package.json mapped in here.
61 nodeDependencies = with nodePackages; [
61 nodeDependencies = with nodePackages; [
62 grunt
62 grunt
63 grunt-contrib-concat
63 grunt-contrib-concat
64 grunt-contrib-jshint
64 grunt-contrib-jshint
65 grunt-contrib-less
65 grunt-contrib-less
66 grunt-contrib-watch
66 grunt-contrib-watch
67 jshint
67 jshint
68 ];
68 ];
69
69
70 pythonGeneratedPackages = self: basePythonPackages.override (a: {
70 pythonGeneratedPackages = self: basePythonPackages.override (a: {
71 inherit self;
71 inherit self;
72 })
72 })
73 // (scopedImport {
73 // (scopedImport {
74 self = self;
74 self = self;
75 super = basePythonPackages;
75 super = basePythonPackages;
76 inherit pkgs;
76 inherit pkgs;
77 inherit (pkgs) fetchurl fetchgit;
77 inherit (pkgs) fetchurl fetchgit;
78 } ./pkgs/python-packages.nix);
78 } ./pkgs/python-packages.nix);
79
79
80 pythonOverrides = import ./pkgs/python-packages-overrides.nix {
80 pythonOverrides = import ./pkgs/python-packages-overrides.nix {
81 inherit
81 inherit
82 basePythonPackages
82 basePythonPackages
83 pkgs;
83 pkgs;
84 };
84 };
85
85
86 pythonLocalOverrides = self: super: {
86 pythonLocalOverrides = self: super: {
87 rhodecode-enterprise-ce =
87 rhodecode-enterprise-ce =
88 let
88 let
89 version = builtins.readFile ./rhodecode/VERSION;
89 version = builtins.readFile ./rhodecode/VERSION;
90 linkNodeModules = ''
90 linkNodeModules = ''
91 echo "Link node packages"
91 echo "Link node packages"
92 # TODO: check if this adds stuff as a dependency, closure size
92 # TODO: check if this adds stuff as a dependency, closure size
93 rm -fr node_modules
93 rm -fr node_modules
94 mkdir -p node_modules
94 mkdir -p node_modules
95 ${pkgs.lib.concatMapStrings (dep: ''
95 ${pkgs.lib.concatMapStrings (dep: ''
96 ln -sfv ${dep}/lib/node_modules/${dep.pkgName} node_modules/
96 ln -sfv ${dep}/lib/node_modules/${dep.pkgName} node_modules/
97 '') nodeDependencies}
97 '') nodeDependencies}
98 echo "DONE: Link node packages"
98 echo "DONE: Link node packages"
99 '';
99 '';
100 in super.rhodecode-enterprise-ce.override (attrs: {
100 in super.rhodecode-enterprise-ce.override (attrs: {
101
101
102 inherit
102 inherit
103 doCheck
103 doCheck
104 version;
104 version;
105 name = "rhodecode-enterprise-ce-${version}";
105 name = "rhodecode-enterprise-ce-${version}";
106 releaseName = "RhodeCodeEnterpriseCE-${version}";
106 releaseName = "RhodeCodeEnterpriseCE-${version}";
107 src = rhodecode-enterprise-ce-src;
107 src = rhodecode-enterprise-ce-src;
108
108
109 buildInputs =
109 buildInputs =
110 attrs.buildInputs ++
110 attrs.buildInputs ++
111 (with self; [
111 (with self; [
112 pkgs.nodePackages.grunt-cli
112 pkgs.nodePackages.grunt-cli
113 pkgs.subversion
113 pkgs.subversion
114 pytest-catchlog
114 pytest-catchlog
115 rhodecode-testdata
115 rhodecode-testdata
116 ]);
116 ]);
117
117
118 propagatedBuildInputs = attrs.propagatedBuildInputs ++ (with self; [
118 propagatedBuildInputs = attrs.propagatedBuildInputs ++ (with self; [
119 rhodecode-tools
119 rhodecode-tools
120 ]);
120 ]);
121
121
122 # TODO: johbo: Make a nicer way to expose the parts. Maybe
122 # TODO: johbo: Make a nicer way to expose the parts. Maybe
123 # pkgs/default.nix?
123 # pkgs/default.nix?
124 passthru = {
124 passthru = {
125 inherit
125 inherit
126 pythonLocalOverrides
126 linkNodeModules
127 myPythonPackagesUnfix;
127 myPythonPackagesUnfix
128 pythonLocalOverrides;
128 pythonPackages = self;
129 pythonPackages = self;
129 };
130 };
130
131
131 LC_ALL = "en_US.UTF-8";
132 LC_ALL = "en_US.UTF-8";
132 LOCALE_ARCHIVE =
133 LOCALE_ARCHIVE =
133 if pkgs.stdenv ? glibc
134 if pkgs.stdenv ? glibc
134 then "${pkgs.glibcLocales}/lib/locale/locale-archive"
135 then "${pkgs.glibcLocales}/lib/locale/locale-archive"
135 else "";
136 else "";
136
137
137 # Somewhat snappier setup of the development environment
138 # Somewhat snappier setup of the development environment
138 # TODO: move into shell.nix
139 # TODO: move into shell.nix
139 # TODO: think of supporting a stable path again, so that multiple shells
140 # TODO: think of supporting a stable path again, so that multiple shells
140 # can share it.
141 # can share it.
141 shellHook = ''
142 shellHook = ''
142 tmp_path=$(mktemp -d)
143 tmp_path=$(mktemp -d)
143 export PATH="$tmp_path/bin:$PATH"
144 export PATH="$tmp_path/bin:$PATH"
144 export PYTHONPATH="$tmp_path/${self.python.sitePackages}:$PYTHONPATH"
145 export PYTHONPATH="$tmp_path/${self.python.sitePackages}:$PYTHONPATH"
145 mkdir -p $tmp_path/${self.python.sitePackages}
146 mkdir -p $tmp_path/${self.python.sitePackages}
146 python setup.py develop --prefix $tmp_path --allow-hosts ""
147 python setup.py develop --prefix $tmp_path --allow-hosts ""
147 '' + linkNodeModules;
148 '' + linkNodeModules;
148
149
149 preCheck = ''
150 preCheck = ''
150 export PATH="$out/bin:$PATH"
151 export PATH="$out/bin:$PATH"
151 '';
152 '';
152
153
153 postCheck = ''
154 postCheck = ''
154 rm -rf $out/lib/${self.python.libPrefix}/site-packages/pytest_pylons
155 rm -rf $out/lib/${self.python.libPrefix}/site-packages/pytest_pylons
155 rm -rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/tests
156 rm -rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/tests
156 '';
157 '';
157
158
158 preBuild = linkNodeModules + ''
159 preBuild = linkNodeModules + ''
159 grunt
160 grunt
160 rm -fr node_modules
161 rm -fr node_modules
161 '';
162 '';
162
163
163 postInstall = ''
164 postInstall = ''
164 # python based programs need to be wrapped
165 # python based programs need to be wrapped
165 ln -s ${self.supervisor}/bin/supervisor* $out/bin/
166 ln -s ${self.supervisor}/bin/supervisor* $out/bin/
166 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
167 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
167 ln -s ${self.PasteScript}/bin/paster $out/bin/
168 ln -s ${self.PasteScript}/bin/paster $out/bin/
169 ln -s ${self.channelstream}/bin/channelstream $out/bin/
168 ln -s ${self.pyramid}/bin/* $out/bin/ #*/
170 ln -s ${self.pyramid}/bin/* $out/bin/ #*/
169
171
170 # rhodecode-tools
172 # rhodecode-tools
171 # TODO: johbo: re-think this. Do the tools import anything from enterprise?
173 # TODO: johbo: re-think this. Do the tools import anything from enterprise?
172 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
174 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
173
175
174 # note that condition should be restricted when adding further tools
176 # note that condition should be restricted when adding further tools
175 for file in $out/bin/*; do #*/
177 for file in $out/bin/*; do #*/
176 wrapProgram $file \
178 wrapProgram $file \
177 --prefix PYTHONPATH : $PYTHONPATH \
179 --prefix PYTHONPATH : $PYTHONPATH \
178 --prefix PATH : $PATH \
180 --prefix PATH : $PATH \
179 --set PYTHONHASHSEED random
181 --set PYTHONHASHSEED random
180 done
182 done
181
183
182 mkdir $out/etc
184 mkdir $out/etc
183 cp configs/production.ini $out/etc
185 cp configs/production.ini $out/etc
184
186
185 echo "Writing meta information for rccontrol to nix-support/rccontrol"
187 echo "Writing meta information for rccontrol to nix-support/rccontrol"
186 mkdir -p $out/nix-support/rccontrol
188 mkdir -p $out/nix-support/rccontrol
187 cp -v rhodecode/VERSION $out/nix-support/rccontrol/version
189 cp -v rhodecode/VERSION $out/nix-support/rccontrol/version
188 echo "DONE: Meta information for rccontrol written"
190 echo "DONE: Meta information for rccontrol written"
189
191
190 # TODO: johbo: Make part of ac-tests
192 # TODO: johbo: Make part of ac-tests
191 if [ ! -f rhodecode/public/js/scripts.js ]; then
193 if [ ! -f rhodecode/public/js/scripts.js ]; then
192 echo "Missing scripts.js"
194 echo "Missing scripts.js"
193 exit 1
195 exit 1
194 fi
196 fi
195 if [ ! -f rhodecode/public/css/style.css ]; then
197 if [ ! -f rhodecode/public/css/style.css ]; then
196 echo "Missing style.css"
198 echo "Missing style.css"
197 exit 1
199 exit 1
198 fi
200 fi
199 '';
201 '';
200
202
201 });
203 });
202
204
203 rhodecode-testdata = import "${rhodecode-testdata-src}/default.nix" {
205 rhodecode-testdata = import "${rhodecode-testdata-src}/default.nix" {
204 inherit
206 inherit
205 doCheck
207 doCheck
206 pkgs
208 pkgs
207 pythonPackages;
209 pythonPackages;
208 };
210 };
209
211
210 };
212 };
211
213
212 rhodecode-testdata-src = sources.rhodecode-testdata or (
214 rhodecode-testdata-src = sources.rhodecode-testdata or (
213 pkgs.fetchhg {
215 pkgs.fetchhg {
214 url = "https://code.rhodecode.com/upstream/rc_testdata";
216 url = "https://code.rhodecode.com/upstream/rc_testdata";
215 rev = "v0.8.0";
217 rev = "v0.8.0";
216 sha256 = "0hy1ba134rq2f9si85yx7j4qhc9ky0hjzdk553s3q026i7km809m";
218 sha256 = "0hy1ba134rq2f9si85yx7j4qhc9ky0hjzdk553s3q026i7km809m";
217 });
219 });
218
220
219 # Apply all overrides and fix the final package set
221 # Apply all overrides and fix the final package set
220 myPythonPackagesUnfix =
222 myPythonPackagesUnfix =
221 (extends pythonExternalOverrides
223 (extends pythonExternalOverrides
222 (extends pythonLocalOverrides
224 (extends pythonLocalOverrides
223 (extends pythonOverrides
225 (extends pythonOverrides
224 pythonGeneratedPackages)));
226 pythonGeneratedPackages)));
225 myPythonPackages = (fix myPythonPackagesUnfix);
227 myPythonPackages = (fix myPythonPackagesUnfix);
226
228
227 in myPythonPackages.rhodecode-enterprise-ce
229 in myPythonPackages.rhodecode-enterprise-ce
@@ -1,33 +1,33 b''
1 Apache Reverse Proxy
1 Apache Reverse Proxy
2 ^^^^^^^^^^^^^^^^^^^^
2 ^^^^^^^^^^^^^^^^^^^^
3
3
4 Here is a sample configuration file for using Apache as a reverse proxy.
4 Here is a sample configuration file for using Apache as a reverse proxy.
5
5
6 .. code-block:: apache
6 .. code-block:: apache
7
7
8 <VirtualHost *:80>
8 <VirtualHost *:80>
9 ServerName hg.myserver.com
9 ServerName hg.myserver.com
10 ServerAlias hg.myserver.com
10 ServerAlias hg.myserver.com
11
11
12 ## uncomment root directive if you want to serve static files by
12 ## uncomment to serve static files by Apache
13 ## Apache requires static_files = false in .ini file
13 ## ProxyPass /_static/rhodecode !
14 #DocumentRoot /path/to/rhodecode/installation/public
14 ## Alias /_static/rhodecode /path/to/.rccontrol/enterprise-1/static
15
15
16 <Proxy *>
16 <Proxy *>
17 Order allow,deny
17 Order allow,deny
18 Allow from all
18 Allow from all
19 </Proxy>
19 </Proxy>
20
20
21 ## Important !
21 ## Important !
22 ## Directive to properly generate url (clone url) for pylons
22 ## Directive to properly generate url (clone url) for pylons
23 ProxyPreserveHost On
23 ProxyPreserveHost On
24
24
25 ## RhodeCode instance running
25 ## RhodeCode instance running
26 ProxyPass / http://127.0.0.1:10002/
26 ProxyPass / http://127.0.0.1:10002/
27 ProxyPassReverse / http://127.0.0.1:10002/
27 ProxyPassReverse / http://127.0.0.1:10002/
28
28
29 ## to enable https use line below
29 ## to enable https use line below
30 #SetEnvIf X-Url-Scheme https HTTPS=1
30 #SetEnvIf X-Url-Scheme https HTTPS=1
31
31
32 </VirtualHost>
32 </VirtualHost>
33
33
@@ -1,32 +1,33 b''
1 .. _apache-sub-ref:
1 .. _apache-sub-ref:
2
2
3 Apache URL Prefix Configuration
3 Apache URL Prefix Configuration
4 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
5
5
6 Use the following example to configure Apache to use a URL prefix.
6 Use the following example to configure Apache to use a URL prefix.
7
7
8 .. code-block:: apache
8 .. code-block:: apache
9
9
10 <Location /<someprefix> > # Change <someprefix> into your chosen prefix
10 <Location /<someprefix> > # Change <someprefix> into your chosen prefix
11 ProxyPass http://127.0.0.1:5000/<someprefix>
11 ProxyPass http://127.0.0.1:5000/<someprefix>
12 ProxyPassReverse http://127.0.0.1:5000/<someprefix>
12 ProxyPassReverse http://127.0.0.1:5000/<someprefix>
13 SetEnvIf X-Url-Scheme https HTTPS=1
13 SetEnvIf X-Url-Scheme https HTTPS=1
14 </Location>
14 </Location>
15
15
16 In addition to the regular Apache setup you will need to add the following
16 In addition to the regular Apache setup you will need to add the following
17 lines into the ``rhodecode.ini`` file.
17 lines into the ``rhodecode.ini`` file.
18
18
19 * Above ``[app:main]`` section of the ``rhodecode.ini`` file add the
20 following section if it doesn't exist yet.
21
22 .. code-block:: ini
23
24 [filter:proxy-prefix]
25 use = egg:PasteDeploy#prefix
26 prefix = /<someprefix> # Change <someprefix> into your chosen prefix
27
19 * In the the ``[app:main]`` section of your ``rhodecode.ini`` file add the
28 * In the the ``[app:main]`` section of your ``rhodecode.ini`` file add the
20 following line.
29 following line.
21
30
22 .. code-block:: ini
31 .. code-block:: ini
23
32
24 filter-with = proxy-prefix
33 filter-with = proxy-prefix
25
26 * At the end of the ``rhodecode.ini`` file add the following section.
27
28 .. code-block:: ini
29
30 [filter:proxy-prefix]
31 use = egg:PasteDeploy#prefix
32 prefix = /<someprefix> # Change <someprefix> into your chosen prefix
@@ -1,127 +1,127 b''
1 .. _backup-ref:
1 .. _backup-ref:
2
2
3 Backup and Restore
3 Backup and Restore
4 ==================
4 ==================
5
5
6 *“The condition of any backup is unknown until a restore is attempted.”*
6 *“The condition of any backup is unknown until a restore is attempted.”*
7 `Schrödinger's Backup`_
7 `Schrödinger's Backup`_
8
8
9 To snapshot an instance of |RCE|, and save its settings, you need to backup the
9 To snapshot an instance of |RCE|, and save its settings, you need to backup the
10 following parts of the system at the same time.
10 following parts of the system at the same time.
11
11
12 * The |repos| managed by the instance.
12 * The |repos| managed by the instance.
13 * The |RCE| database.
13 * The |RCE| database.
14 * Any configuration files or extensions that you've configured.
14 * Any configuration files or extensions that you've configured.
15
15
16 .. important::
16 .. important::
17
17
18 Ideally you should script all of these functions so that it creates a
18 Ideally you should script all of these functions so that it creates a
19 backup snapshot of your system at a particular timestamp and then run that
19 backup snapshot of your system at a particular timestamp and then run that
20 script regularly.
20 script regularly.
21
21
22 Backup Details
22 Backup Details
23 --------------
23 --------------
24
24
25 To backup the relevant parts of |RCE| required to restore your system, use
25 To backup the relevant parts of |RCE| required to restore your system, use
26 the information in this section to identify what is important to you.
26 the information in this section to identify what is important to you.
27
27
28 Repository Backup
28 Repository Backup
29 ^^^^^^^^^^^^^^^^^
29 ^^^^^^^^^^^^^^^^^
30
30
31 To back up your |repos|, use the API to get a list of all |repos| managed,
31 To back up your |repos|, use the API to get a list of all |repos| managed,
32 and then clone them to your backup location.
32 and then clone them to your backup location.
33
33
34 Use the ``get_repos`` method to list all your managed |repos|,
34 Use the ``get_repos`` method to list all your managed |repos|,
35 and use the ``clone_uri`` information that is returned. See the :ref:`api`
35 and use the ``clone_uri`` information that is returned. See the :ref:`api`
36 for more information.
36 for more information.
37
37
38 .. important::
38 .. important::
39
39
40 This will not work for |svn| |repos|. Currently the only way to back up
40 This will not work for |svn| |repos|. Currently the only way to back up
41 your |svn| |repos| is to make a copy of them.
41 your |svn| |repos| is to make a copy of them.
42
42
43 It is also important to note, that you can only restore the |svn| |repos|
43 It is also important to note, that you can only restore the |svn| |repos|
44 using the same version as they were saved with.
44 using the same version as they were saved with.
45
45
46 Database Backup
46 Database Backup
47 ^^^^^^^^^^^^^^^
47 ^^^^^^^^^^^^^^^
48
48
49 The instance database contains all the |RCE| permissions settings,
49 The instance database contains all the |RCE| permissions settings,
50 and user management information. To backup your database,
50 and user management information. To backup your database,
51 export it using the following appropriate example, and then move it to your
51 export it using the following appropriate example, and then move it to your
52 backup location:
52 backup location:
53
53
54 .. code-block:: bash
54 .. code-block:: bash
55
55
56 # For MySQL DBs
56 # For MySQL DBs
57 $ mysqldump -u <uname> -p <pass> db_name > mysql-db-backup
57 $ mysqldump -u <uname> -p <pass> db_name > mysql-db-backup
58
58
59 # For PostgreSQL DBs
59 # For PostgreSQL DBs
60 $ pg_dump dbname > postgresql-db-backup
60 $ pg_dump dbname > postgresql-db-backup
61
61
62 # For SQLlite
62 # For SQLlite
63 $ sqlite3 rhodecode.db ‘.dump’ > sqlite-db-backup
63 $ sqlite3 rhodecode.db ‘.dump’ > sqlite-db-backup
64
64
65
65
66 The default |RCE| SQLite database location is
66 The default |RCE| SQLite database location is
67 :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.db`
67 :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.db`
68
68
69 If running MySQL or PostgreSQL databases, you will have configured these
69 If running MySQL or PostgreSQL databases, you will have configured these
70 separately, for more information see :ref:`rhodecode-database-ref`
70 separately, for more information see :ref:`rhodecode-database-ref`
71
71
72 Configuration File Backup
72 Configuration File Backup
73 ^^^^^^^^^^^^^^^^^^^^^^^^^
73 ^^^^^^^^^^^^^^^^^^^^^^^^^
74
74
75 Depending on your setup, you could have a number of configuration files that
75 Depending on your setup, you could have a number of configuration files that
76 should be backed up. You may have some, or all of the configuration files
76 should be backed up. You may have some, or all of the configuration files
77 listed in the :ref:`config-rce-files` section. Ideally you should back these
77 listed in the :ref:`config-rce-files` section. Ideally you should back these
78 up at the same time as the database and |repos|.
78 up at the same time as the database and |repos|.
79
79
80 Gist Backup
80 Gist Backup
81 ^^^^^^^^^^^
81 ^^^^^^^^^^^
82
82
83 To backup the gists on your |RCE| instance you can use the ``get_users`` and
83 To backup the gists on your |RCE| instance you can use the ``get_users`` and
84 ``get_gists`` API methods to fetch the gists for each user on the instance.
84 ``get_gists`` API methods to fetch the gists for each user on the instance.
85
85
86 Extension Backups
86 Extension Backups
87 ^^^^^^^^^^^^^^^^^
87 ^^^^^^^^^^^^^^^^^
88
88
89 You should also backup any extensions added in the
89 You should also backup any extensions added in the
90 :file:`home/{user}/.rccontrol/{instance-id}/rcextensions` directory.
90 :file:`home/{user}/.rccontrol/{instance-id}/rcextensions` directory.
91
91
92 Full-text Search Backup
92 Full-text Search Backup
93 ^^^^^^^^^^^^^^^^^^^^^^^
93 ^^^^^^^^^^^^^^^^^^^^^^^
94
94
95 You may also have full text search set up, but the index can be rebuild from
95 You may also have full text search set up, but the index can be rebuild from
96 re-imported |repos| if necessary. You will most likely want to backup your
96 re-imported |repos| if necessary. You will most likely want to backup your
97 :file:`mapping.ini` file if you've configured that. For more information, see
97 :file:`mapping.ini` file if you've configured that. For more information, see
98 the :ref:`indexing-ref` section.
98 the :ref:`indexing-ref` section.
99
99
100 Restoration Steps
100 Restoration Steps
101 -----------------
101 -----------------
102
102
103 To restore an instance of |RCE| from its backed up components, use the
103 To restore an instance of |RCE| from its backed up components, use the
104 following steps.
104 following steps.
105
105
106 1. Install a new instance of |RCE|.
106 1. Install a new instance of |RCE|.
107 2. Once installed, configure the instance to use the backed up
107 2. Once installed, configure the instance to use the backed up
108 :file:`rhodecode.ini` file. Ensure this file points to the backed up
108 :file:`rhodecode.ini` file. Ensure this file points to the backed up
109 database, see the :ref:`config-database` section.
109 database, see the :ref:`config-database` section.
110 3. Restart |RCE| and remap and rescan your |repos|, see the
110 3. Restart |RCE| and remap and rescan your |repos|, see the
111 :ref:`remap-rescan` section.
111 :ref:`remap-rescan` section.
112
112
113 Post Restoration Steps
113 Post Restoration Steps
114 ^^^^^^^^^^^^^^^^^^^^^^
114 ^^^^^^^^^^^^^^^^^^^^^^
115
115
116 Once you have restored your |RCE| instance to basic functionality, you can
116 Once you have restored your |RCE| instance to basic functionality, you can
117 then work on restoring any specific setup changes you had made.
117 then work on restoring any specific setup changes you had made.
118
118
119 * To recreate the |RCE| index, use the backed up :file:`mapping.ini` file if
119 * To recreate the |RCE| index, use the backed up :file:`mapping.ini` file if
120 you had made changes and rerun the indexer. See the
120 you had made changes and rerun the indexer. See the
121 :ref:`indexing-ref` section for details.
121 :ref:`indexing-ref` section for details.
122 * To reconfigure any extensions, copy the backed up extensions into the
122 * To reconfigure any extensions, copy the backed up extensions into the
123 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions` and also specify
123 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions` and also specify
124 any custom hooks if necessary. See the :ref:`integrations-ref` section for
124 any custom hooks if necessary. See the :ref:`extensions-hooks-ref` section for
125 details.
125 details.
126
126
127 .. _Schrödinger's Backup: http://novabackup.novastor.com/blog/schrodingers-backup-good-bad-backup/
127 .. _Schrödinger's Backup: http://novabackup.novastor.com/blog/schrodingers-backup-good-bad-backup/
@@ -1,72 +1,120 b''
1 Nginx Configuration Example
1 Nginx Configuration Example
2 ---------------------------
2 ---------------------------
3
3
4 Use the following example to configure Nginx as a your web server.
4 Use the following example to configure Nginx as a your web server.
5
5
6 .. code-block:: nginx
6 .. code-block:: nginx
7
7
8 log_format log_custom '$remote_addr - $remote_user [$time_local] '
9 '"$request" $status $body_bytes_sent '
10 '"$http_referer" "$http_user_agent" '
11 '$request_time $upstream_response_time $pipe';
12
8 upstream rc {
13 upstream rc {
9
14
10 server 127.0.0.1:10002;
15 server 127.0.0.1:10002;
11
16
12 # add more instances for load balancing
17 # add more instances for load balancing
13 # server 127.0.0.1:10003;
18 # server 127.0.0.1:10003;
14 # server 127.0.0.1:10004;
19 # server 127.0.0.1:10004;
15 }
20 }
16
21
17 ## gist alias
22 ## gist alias server, for serving nicer GIST urls
18
23
19 server {
24 server {
20 listen 443;
25 listen 443;
21 server_name gist.myserver.com;
26 server_name gist.myserver.com;
22 access_log /var/log/nginx/gist.access.log;
27 access_log /var/log/nginx/gist.access.log log_custom;
23 error_log /var/log/nginx/gist.error.log;
28 error_log /var/log/nginx/gist.error.log;
24
29
25 ssl on;
30 ssl on;
26 ssl_certificate gist.rhodecode.myserver.com.crt;
31 ssl_certificate gist.rhodecode.myserver.com.crt;
27 ssl_certificate_key gist.rhodecode.myserver.com.key;
32 ssl_certificate_key gist.rhodecode.myserver.com.key;
28
33
29 ssl_session_timeout 5m;
34 ssl_session_timeout 5m;
30
35
31 ssl_protocols SSLv3 TLSv1;
36 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
32 ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;
33 ssl_prefer_server_ciphers on;
37 ssl_prefer_server_ciphers on;
38 ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
39
34 add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
40 add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
35
41
36 # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
42 # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
37 ssl_dhparam /etc/nginx/ssl/dhparam.pem;
43 #ssl_dhparam /etc/nginx/ssl/dhparam.pem;
38
44
39 rewrite ^/(.+)$ https://rhodecode.myserver.com/_admin/gists/$1;
45 rewrite ^/(.+)$ https://rhodecode.myserver.com/_admin/gists/$1;
40 rewrite (.*) https://rhodecode.myserver.com/_admin/gists;
46 rewrite (.*) https://rhodecode.myserver.com/_admin/gists;
41 }
47 }
42
48
49 ## HTTP to HTTPS rewrite
43 server {
50 server {
44 listen 443;
51 listen 80;
45 server_name rhodecode.myserver.com;
52 server_name rhodecode.myserver.com;
46 access_log /var/log/nginx/rhodecode.access.log;
53
47 error_log /var/log/nginx/rhodecode.error.log;
54 if ($http_host = rhodecode.myserver.com) {
55 rewrite (.*) https://rhodecode.myserver.com$1 permanent;
56 }
57 }
58
59 ## MAIN SSL enabled server
60 server {
61 listen 443 ssl;
62 server_name rhodecode.myserver.com;
63
64 access_log /var/log/nginx/rhodecode.access.log log_custom;
65 error_log /var/log/nginx/rhodecode.error.log;
48
66
49 ssl on;
67 ssl on;
50 ssl_certificate rhodecode.myserver.com.crt;
68 ssl_certificate rhodecode.myserver.com.crt;
51 ssl_certificate_key rhodecode.myserver.com.key;
69 ssl_certificate_key rhodecode.myserver.com.key;
52
70
53 ssl_session_timeout 5m;
71 ssl_session_timeout 5m;
54
72
55 ssl_protocols SSLv3 TLSv1;
73 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
56 ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;
57 ssl_prefer_server_ciphers on;
74 ssl_prefer_server_ciphers on;
75 ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
76
77 # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
78 #ssl_dhparam /etc/nginx/ssl/dhparam.pem;
79
80 include /etc/nginx/proxy.conf;
81
82 ## serve static files by nginx, recommended
83 # location /_static/rhodecode {
84 # alias /path/to/.rccontrol/enterprise-1/static;
85 # }
58
86
59 ## uncomment root directive if you want to serve static files by nginx
87 ## channel stream live components
60 ## requires static_files = false in .ini file
88 location /_channelstream {
61 # root /path/to/rhodecode/installation/public;
89 rewrite /_channelstream/(.*) /$1 break;
90 proxy_pass http://127.0.0.1:9800;
62
91
63 include /etc/nginx/proxy.conf;
92 proxy_connect_timeout 10;
93 proxy_send_timeout 10m;
94 proxy_read_timeout 10m;
95 tcp_nodelay off;
96 proxy_set_header Host $host;
97 proxy_set_header X-Real-IP $remote_addr;
98 proxy_set_header X-Url-Scheme $scheme;
99 proxy_set_header X-Forwarded-Proto $scheme;
100 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
101 gzip off;
102 proxy_http_version 1.1;
103 proxy_set_header Upgrade $http_upgrade;
104 proxy_set_header Connection "upgrade";
105 }
64
106
65 location / {
107 location / {
66 try_files $uri @rhode;
108 try_files $uri @rhode;
67 }
109 }
68
110
69 location @rhode {
111 location @rhode {
70 proxy_pass http://rc;
112 proxy_pass http://rc;
71 }
113 }
72 }
114
115 ## custom 502 error page
116 error_page 502 /502.html;
117 location = /502.html {
118 root /path/to/.rccontrol/enterprise-1/static;
119 }
120 } No newline at end of file
@@ -1,33 +1,36 b''
1 .. _nginx_url-pre:
1 .. _nginx_url-pre:
2
2
3 Nginx URL Prefix Configuration
3 Nginx URL Prefix Configuration
4 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
5
5
6 Use the following example to configure Nginx to use a URL prefix.
6 Use the following example to configure Nginx to use a URL prefix.
7
7
8 .. code-block:: nginx
8 .. code-block:: nginx
9
9
10 location /foo {
10 location /foo {
11 rewrite /foo(.*) /$1 break;
11 rewrite /foo(.*) /$1 break;
12 proxy_pass http://localhost:3200;
12 proxy_pass http://localhost:3200;
13 proxy_redirect off;
13 proxy_redirect off;
14 proxy_set_header Host $host;
14 proxy_set_header Host $host;
15 }
15 }
16
16
17 In addition to the Nginx configuration you will need to add the following
17 In addition to the Nginx configuration you will need to add the following
18 lines into the ``rhodecode.ini`` file.
18 lines (if they not exist) into the ``rhodecode.ini`` file.
19
20 * Above ``[app:main]`` section of the ``rhodecode.ini`` file add the
21 following section if it doesn't exist yet.
22
23 .. code-block:: ini
24
25 [filter:proxy-prefix]
26 use = egg:PasteDeploy#prefix
27 prefix = /<someprefix> # Change <someprefix> into your chosen prefix
19
28
20 * In the the ``[app:main]`` section of your ``rhodecode.ini`` file add the
29 * In the the ``[app:main]`` section of your ``rhodecode.ini`` file add the
21 following line.
30 following line.
22
31
23 .. code-block:: ini
32 .. code-block:: ini
24
33
25 filter-with = proxy-prefix
34 filter-with = proxy-prefix
26
35
27 * At the end of the ``rhodecode.ini`` file add the following section.
28
36
29 .. code-block:: ini
30
31 [filter:proxy-prefix]
32 use = egg:PasteDeploy#prefix
33 prefix = /<someprefix> # Change <someprefix> into your chosen prefix
@@ -1,68 +1,68 b''
1 .. _repo-xtra:
1 .. _repo-xtra:
2
2
3 Repository Extra Fields
3 Repository Extra Fields
4 =======================
4 =======================
5
5
6 Extra fields attached to a |repo| allow you to configure additional actions for
6 Extra fields attached to a |repo| allow you to configure additional actions for
7 |RCX|. To install and read more about |RCX|, see the :ref:`install-rcx` section.
7 |RCX|. To install and read more about |RCX|, see the :ref:`install-rcx` section.
8
8
9 Enabling Extra Fields
9 Enabling Extra Fields
10 ---------------------
10 ---------------------
11
11
12 To enable extra fields on |repos|, use the following steps:
12 To enable extra fields on |repos|, use the following steps:
13
13
14 1. Go to the :menuselection:`Admin --> Settings --> Visual` page.
14 1. Go to the :menuselection:`Admin --> Settings --> Visual` page.
15 2. Check the :guilabel:`Use repository extra fields` box.
15 2. Check the :guilabel:`Use repository extra fields` box.
16 3. Save your changes.
16 3. Save your changes.
17
17
18
18
19 Configuring Extra Fields
19 Configuring Extra Fields
20 ------------------------
20 ------------------------
21
21
22 To configure extra fields per repository, use the following steps:
22 To configure extra fields per repository, use the following steps:
23
23
24 1. Go to :menuselection:`Admin --> Repositories` and select :guilabel:`Edit`
24 1. Go to :menuselection:`Admin --> Repositories` and select :guilabel:`Edit`
25 beside the |repo| to which you wish to add extra fields.
25 beside the |repo| to which you wish to add extra fields.
26 2. On the |repo| settings page, select the :guilabel:`Extra fields` tab.
26 2. On the |repo| settings page, select the :guilabel:`Extra fields` tab.
27
27
28 .. image:: ../images/extra-repo-fields.png
28 .. image:: ../images/extra-repo-fields.png
29
29
30
30
31 Example Usage
31 Example Usage
32 -------------
32 -------------
33
33
34 To use the extra fields in an extension, see the example below. For more
34 To use the extra fields in an extension, see the example below. For more
35 information and examples, see the :ref:`integrations-ref` section.
35 information and examples, see the :ref:`extensions-hooks-ref` section.
36
36
37 .. code-block:: python
37 .. code-block:: python
38
38
39 call = load_extension('http_notify.py')
39 call = load_extension('http_notify.py')
40 if call:
40 if call:
41 url = 'http://default.url' # <url for post data>
41 url = 'http://default.url' # <url for post data>
42
42
43 # possibly extract the URL from extra fields
43 # possibly extract the URL from extra fields
44 call = load_extension('extra_fields.py')
44 call = load_extension('extra_fields.py')
45 if call:
45 if call:
46 repo_extra_fields = call(**kwargs)
46 repo_extra_fields = call(**kwargs)
47 # now update if we have extra fields, they have precedence
47 # now update if we have extra fields, they have precedence
48 # this way users can store any configuration inside the database per
48 # this way users can store any configuration inside the database per
49 # repo
49 # repo
50 for key, data in repo_extra_fields.items():
50 for key, data in repo_extra_fields.items():
51 kwargs[key] = data['field_value']
51 kwargs[key] = data['field_value']
52
52
53 # an endpoint url data will be sent to, fetched from extra fields
53 # an endpoint url data will be sent to, fetched from extra fields
54 # if exists, or fallback to default
54 # if exists, or fallback to default
55 kwargs['URL'] = kwargs.pop('webhook_url', None) or url
55 kwargs['URL'] = kwargs.pop('webhook_url', None) or url
56
56
57 # fetch pushed commits, from commit_ids list
57 # fetch pushed commits, from commit_ids list
58 call = load_extension('extract_commits.py')
58 call = load_extension('extract_commits.py')
59 extracted_commits = {}
59 extracted_commits = {}
60 if call:
60 if call:
61 extracted_commits = call(**kwargs)
61 extracted_commits = call(**kwargs)
62 # store the commits for the next call chain
62 # store the commits for the next call chain
63 kwargs['COMMITS'] = extracted_commits
63 kwargs['COMMITS'] = extracted_commits
64
64
65 # set additional keys and values to be sent via POST to given URL
65 # set additional keys and values to be sent via POST to given URL
66 kwargs['caller_type'] = 'rhodecode'
66 kwargs['caller_type'] = 'rhodecode'
67 kwargs['date'] = time.time() # import time before
67 kwargs['date'] = time.time() # import time before
68 call(**kwargs)
68 call(**kwargs)
@@ -1,95 +1,95 b''
1 .. _rhodecode-reset-ref:
1 .. _rhodecode-reset-ref:
2
2
3 Settings Management
3 Settings Management
4 -------------------
4 -------------------
5
5
6 All |RCE| settings can be set from the user interface, but in the event that
6 All |RCE| settings can be set from the user interface, but in the event that
7 it somehow becomes unavailable you can use ``ishell`` inside your |RCE|
7 it somehow becomes unavailable you can use ``ishell`` inside your |RCE|
8 ``virtualenv`` to carry out emergency measures.
8 ``virtualenv`` to carry out emergency measures.
9
9
10 .. warning::
10 .. warning::
11
11
12 Logging into the |RCE| database with ``iShell`` should only be done by an
12 Logging into the |RCE| database with ``iShell`` should only be done by an
13 experienced and knowledgeable database administrator.
13 experienced and knowledgeable database administrator.
14
14
15 Reset Admin Account Privileges
15 Reset Admin Account Privileges
16 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
16 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
17
17
18 If you accidentally remove your admin privileges from the admin account you
18 If you accidentally remove your admin privileges from the admin account you
19 can restore them using ``ishell``. Use the following example to reset your
19 can restore them using ``ishell``. Use the following example to reset your
20 account permissions.
20 account permissions.
21
21
22 .. code-block:: bash
22 .. code-block:: bash
23
23
24 # Open iShell from the terminal
24 # Open iShell from the terminal
25 $ .rccontrol/enterprise-5/profile/bin/paster \
25 $ .rccontrol/enterprise-5/profile/bin/paster \
26 ishell .rccontrol/enterprise-5/rhodecode.ini
26 ishell .rccontrol/enterprise-5/rhodecode.ini
27
27
28 .. code-block:: mysql
28 .. code-block:: mysql
29
29
30 # Use this example to change user permissions
30 # Use this example to change user permissions
31 In [1]: adminuser = User.get_by_username('username')
31 In [1]: adminuser = User.get_by_username('username')
32 In [2]: adminuser.admin = True
32 In [2]: adminuser.admin = True
33 In [3]: Session.add(adminuser);Session().commit()
33 In [3]: Session().add(adminuser);Session().commit()
34 In [4]: exit()
34 In [4]: exit()
35
35
36 Set to read global ``.hgrc`` file
36 Set to read global ``.hgrc`` file
37 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
37 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
38
38
39 By default, |RCE| does not read global ``hgrc`` files in
39 By default, |RCE| does not read global ``hgrc`` files in
40 ``/etc/mercurial/hgrc`` or ``/etc/mercurial/hgrc.d`` because it
40 ``/etc/mercurial/hgrc`` or ``/etc/mercurial/hgrc.d`` because it
41 can lead to issues. This is set in the ``rhodecode_ui`` table for which
41 can lead to issues. This is set in the ``rhodecode_ui`` table for which
42 there is no UI. If you need to edit this you can
42 there is no UI. If you need to edit this you can
43 manually change the settings using SQL statements with ``ishell``. Use the
43 manually change the settings using SQL statements with ``ishell``. Use the
44 following example to make changes to this table.
44 following example to make changes to this table.
45
45
46 .. code-block:: bash
46 .. code-block:: bash
47
47
48 # Open iShell from the terminal
48 # Open iShell from the terminal
49 $ .rccontrol/enterprise-5/profile/bin/paster \
49 $ .rccontrol/enterprise-5/profile/bin/paster \
50 ishell.rccontrol/enterprise-5/rhodecode.ini
50 ishell.rccontrol/enterprise-5/rhodecode.ini
51
51
52 .. code-block:: mysql
52 .. code-block:: mysql
53
53
54 # Use this example to enable global .hgrc access
54 # Use this example to enable global .hgrc access
55 In [4]: new_option = RhodeCodeUi()
55 In [4]: new_option = RhodeCodeUi()
56 In [5]: new_option.ui_section='web'
56 In [5]: new_option.ui_section='web'
57 In [6]: new_option.ui_key='allow_push'
57 In [6]: new_option.ui_key='allow_push'
58 In [7]: new_option.ui_value='*'
58 In [7]: new_option.ui_value='*'
59 In [8]: Session().add(new_option);Session().commit()
59 In [8]: Session().add(new_option);Session().commit()
60
60
61 Manually Reset Password
61 Manually Reset Password
62 ^^^^^^^^^^^^^^^^^^^^^^^
62 ^^^^^^^^^^^^^^^^^^^^^^^
63
63
64 If you need to manually reset a user password, use the following steps.
64 If you need to manually reset a user password, use the following steps.
65
65
66 1. Navigate to your |RCE| install location.
66 1. Navigate to your |RCE| install location.
67 2. Run the interactive ``ishell`` prompt.
67 2. Run the interactive ``ishell`` prompt.
68 3. Set a new password.
68 3. Set a new password.
69
69
70 Use the following code example to carry out these steps.
70 Use the following code example to carry out these steps.
71
71
72 .. code-block:: bash
72 .. code-block:: bash
73
73
74 # starts the ishell interactive prompt
74 # starts the ishell interactive prompt
75 $ .rccontrol/enterprise-5/profile/bin/paster \
75 $ .rccontrol/enterprise-5/profile/bin/paster \
76 ishell .rccontrol/enterprise-5/rhodecode.ini
76 ishell .rccontrol/enterprise-5/rhodecode.ini
77
77
78 .. code-block:: mysql
78 .. code-block:: mysql
79
79
80 from rhodecode.lib.auth import generate_auth_token
80 from rhodecode.lib.auth import generate_auth_token
81 from rhodecode.lib.auth import get_crypt_password
81 from rhodecode.lib.auth import get_crypt_password
82
82
83 # Enter the user name whose password you wish to change
83 # Enter the user name whose password you wish to change
84 my_user = 'USERNAME'
84 my_user = 'USERNAME'
85 u = User.get_by_username(my_user)
85 u = User.get_by_username(my_user)
86
86
87 # If this fails then the user does not exist
87 # If this fails then the user does not exist
88 u.auth_token = generate_auth_token(my_user)
88 u.auth_token = generate_auth_token(my_user)
89
89
90 # Set the new password
90 # Set the new password
91 u.password = get_crypt_password('PASSWORD')
91 u.password = get_crypt_password('PASSWORD')
92
92
93 Session().add(u)
93 Session().add(u)
94 Session().commit()
94 Session().commit()
95 exit
95 exit
@@ -1,84 +1,84 b''
1 .. _svn-http:
1 .. _svn-http:
2
2
3 |svn| With Write Over HTTP
3 |svn| With Write Over HTTP
4 --------------------------
4 --------------------------
5
5
6 To use |svn| with write access, the currently supported method is over HTTP.
6 To use |svn| with write access, the currently supported method is over HTTP.
7 This requires you to configure your local machine so that it can access your
7 This requires you to configure your local machine so that it can access your
8 |RCE| instance.
8 |RCE| instance.
9
9
10 Prerequisites
10 Prerequisites
11 ^^^^^^^^^^^^^
11 ^^^^^^^^^^^^^
12
12
13 - Enable lab setting on your |RCE| instance, see :ref:`lab-settings`.
13 - Enable lab setting on your |RCE| instance, see :ref:`lab-settings`.
14 - You need to install the following tools on your local machine: ``Apache`` and
14 - You need to install the following tools on your local machine: ``Apache`` and
15 ``mod_dav_svn``. Use the following Ubuntu as an example.
15 ``mod_dav_svn``. Use the following Ubuntu as an example.
16
16
17 .. code-block:: bash
17 .. code-block:: bash
18
18
19 $ sudo apt-get install apache2 libapache2-mod-svn
19 $ sudo apt-get install apache2 libapache2-mod-svn
20
20
21 Once installed you need to enable ``dav_svn``:
21 Once installed you need to enable ``dav_svn``:
22
22
23 .. code-block:: bash
23 .. code-block:: bash
24
24
25 $ sudo a2enmod dav_svn
25 $ sudo a2enmod dav_svn
26
26
27 Configuring Apache Setup
27 Configuring Apache Setup
28 ^^^^^^^^^^^^^^^^^^^^^^^^
28 ^^^^^^^^^^^^^^^^^^^^^^^^
29
29
30 .. tip::
30 .. tip::
31
31
32 It is recommended to run Apache on a port other than 80, due to possible
32 It is recommended to run Apache on a port other than 80, due to possible
33 conflicts with other HTTP servers like nginx. To do this, set the
33 conflicts with other HTTP servers like nginx. To do this, set the
34 ``Listen`` parameter in the ``/etc/apache2/ports.conf`` file, for example
34 ``Listen`` parameter in the ``/etc/apache2/ports.conf`` file, for example
35 ``Listen 8090``
35 ``Listen 8090``
36
36
37 It is also recommended to run apache as the same user as |RCE|, otherwise
37 It is also recommended to run apache as the same user as |RCE|, otherwise
38 permission issues could occur. To do this edit the ``/etc/apache2/envvars``
38 permission issues could occur. To do this edit the ``/etc/apache2/envvars``
39
39
40 .. code-block:: apache
40 .. code-block:: apache
41
41
42 export APACHE_RUN_USER=ubuntu
42 export APACHE_RUN_USER=ubuntu
43 export APACHE_RUN_GROUP=ubuntu
43 export APACHE_RUN_GROUP=ubuntu
44
44
45 1. To configure Apache, create and edit a virtual hosts file, for example
45 1. To configure Apache, create and edit a virtual hosts file, for example
46 :file:`/etc/apache2/sites-available/default.conf`, or create another
46 :file:`/etc/apache2/sites-available/default.conf`, or create another
47 virtual hosts file and add a location section inside the
47 virtual hosts file and add a location section inside the
48 ``<VirtualHost>`` section.
48 ``<VirtualHost>`` section.
49
49
50 .. code-block:: apache
50 .. code-block:: apache
51
51
52 <Location />
52 <Location />
53 DAV svn
53 DAV svn
54 # Must be explicit path, relative not supported
54 # Must be explicit path, relative not supported
55 SVNParentPath /PATH/TO/REPOSITORIES
55 SVNParentPath /PATH/TO/REPOSITORIES
56 SVNListParentPath On
56 SVNListParentPath On
57 Allow from all
57 Allow from all
58 Order allow,deny
58 Order allow,deny
59 </Location>
59 </Location>
60
60
61 .. note::
61 .. note::
62
62
63 Once configured, check that you can see the list of repositories on your
63 Once configured, check that you can see the list of repositories on your
64 |RCE| instance.
64 |RCE| instance.
65
65
66 2. Go to the :menuselection:`Admin --> Settings --> Labs` page, and
66 2. Go to the :menuselection:`Admin --> Settings --> Labs` page, and
67 enable :guilabel:`Proxy Subversion HTTP requests`, and specify the
67 enable :guilabel:`Proxy Subversion HTTP requests`, and specify the
68 :guilabel:`Subversion HTTP Server URL`.
68 :guilabel:`Subversion HTTP Server URL`.
69
69
70 Using |svn|
70 Using |svn|
71 ^^^^^^^^^^^
71 ^^^^^^^^^^^
72
72
73 Once |svn| has been enabled on your instance, you can use it using the
73 Once |svn| has been enabled on your instance, you can use it using the
74 following examples. For more |svn| information, see the `Subversion Red Book`_
74 following examples. For more |svn| information, see the `Subversion Red Book`_
75
75
76 .. code-block:: bash
76 .. code-block:: bash
77
77
78 # To clone a repository
78 # To clone a repository
79 svn clone http://my-svn-server.example.com/my-svn-repo
79 svn checkout http://my-svn-server.example.com/my-svn-repo
80
80
81 # svn commit
81 # svn commit
82 svn commit
82 svn commit
83
83
84 .. _Subversion Red Book: http://svnbook.red-bean.com/en/1.7/svn-book.html#svn.ref.svn
84 .. _Subversion Red Book: http://svnbook.red-bean.com/en/1.7/svn-book.html#svn.ref.svn
This diff has been collapsed as it changes many lines, (2637 lines changed) Show them Hide them
@@ -1,2824 +1,207 b''
1 .. _api:
1 .. _api:
2
2
3 API Documentation
3 API Documentation
4 =================
4 =================
5
5
6 The |RCE| API uses a single scheme for calling all API methods. The API is
6 The |RCE| API uses a single scheme for calling all API methods. The API is
7 implemented with JSON protocol in both directions. To send API requests to
7 implemented with JSON protocol in both directions. To send API requests to
8 your instance of |RCE|, use the following URL format
8 your instance of |RCE|, use the following URL format
9 ``<your_server>/_admin``
9 ``<your_server>/_admin``
10
10
11 .. note::
11 .. note::
12
12
13 To use the API, you should configure the :file:`~/.rhoderc` file with
13 To use the API, you should configure the :file:`~/.rhoderc` file with
14 access details per instance. For more information, see
14 access details per instance. For more information, see
15 :ref:`config-rhoderc`.
15 :ref:`config-rhoderc`.
16
16
17
17
18 API ACCESS FOR WEB VIEWS
18 API ACCESS FOR WEB VIEWS
19 ------------------------
19 ------------------------
20
20
21 API access can also be turned on for each web view in |RCE| that is
21 API access can also be turned on for each web view in |RCE| that is
22 decorated with a `@LoginRequired` decorator. To enable API access, change
22 decorated with a `@LoginRequired` decorator. To enable API access, change
23 the standard login decorator to `@LoginRequired(api_access=True)`.
23 the standard login decorator to `@LoginRequired(api_access=True)`.
24
24
25 From |RCM| version 1.7.0 you can configure a white list
25 From |RCM| version 1.7.0 you can configure a white list
26 of views that have API access enabled by default. To enable these,
26 of views that have API access enabled by default. To enable these,
27 edit the |RCM| configuration ``.ini`` file. The default location is:
27 edit the |RCM| configuration ``.ini`` file. The default location is:
28
28
29 * |RCM| Pre-2.2.7 :file:`root/rhodecode/data/production.ini`
29 * |RCM| Pre-2.2.7 :file:`root/rhodecode/data/production.ini`
30 * |RCM| 3.0 :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
30 * |RCM| 3.0 :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
31
31
32 To configure the white list, edit this section of the file. In this
32 To configure the white list, edit this section of the file. In this
33 configuration example, API access is granted to the patch/diff raw file and
33 configuration example, API access is granted to the patch/diff raw file and
34 archive.
34 archive.
35
35
36 .. code-block:: ini
36 .. code-block:: ini
37
37
38 ## List of controllers (using glob syntax) that AUTH TOKENS could be used for access.
38 ## List of controllers (using glob syntax) that AUTH TOKENS could be used for access.
39 ## Adding ?auth_token = <token> to the url authenticates this request as if it
39 ## Adding ?auth_token = <token> to the url authenticates this request as if it
40 ## came from the the logged in user who own this authentication token.
40 ## came from the the logged in user who own this authentication token.
41 ##
41 ##
42 ## Syntax is <ControllerClass>:<function_pattern>.
42 ## Syntax is <ControllerClass>:<function_pattern>.
43 ## The list should be "," separated and on a single line.
43 ## The list should be "," separated and on a single line.
44 ##
44 ##
45 api_access_controllers_whitelist = ChangesetController:changeset_patch,ChangesetController:changeset_raw,ilesController:raw,FilesController:archivefile,
45 api_access_controllers_whitelist = ChangesetController:changeset_patch,ChangesetController:changeset_raw,ilesController:raw,FilesController:archivefile,
46
46
47 After this change, a |RCE| view can be accessed without login by adding a
47 After this change, a |RCE| view can be accessed without login by adding a
48 GET parameter ``?auth_token=<auth_token>`` to a url. For example to
48 GET parameter ``?auth_token=<auth_token>`` to a url. For example to
49 access the raw diff.
49 access the raw diff.
50
50
51 .. code-block:: html
51 .. code-block:: html
52
52
53 http://<server>/<repo>/changeset-diff/<sha>?auth_token=<auth_token>
53 http://<server>/<repo>/changeset-diff/<sha>?auth_token=<auth_token>
54
54
55 By default this is only enabled on RSS/ATOM feed views. Exposing raw diffs is a
55 By default this is only enabled on RSS/ATOM feed views. Exposing raw diffs is a
56 good way to integrate with 3rd party services like code review, or build farms
56 good way to integrate with 3rd party services like code review, or build farms
57 that could download archives.
57 that could download archives.
58
58
59 API ACCESS
59 API ACCESS
60 ----------
60 ----------
61
61
62 All clients are required to send JSON-RPC spec JSON data.
62 All clients are required to send JSON-RPC spec JSON data.
63
63
64 .. code-block:: bash
64 .. code-block:: bash
65
65
66 {
66 {
67 "id:"<id>",
67 "id:"<id>",
68 "auth_token":"<auth_token>",
68 "auth_token":"<auth_token>",
69 "method":"<method_name>",
69 "method":"<method_name>",
70 "args":{"<arg_key>":"<arg_val>"}
70 "args":{"<arg_key>":"<arg_val>"}
71 }
71 }
72
72
73 Example call for auto pulling from remote repositories using curl:
73 Example call for auto pulling from remote repositories using curl:
74
74
75 .. code-block:: bash
75 .. code-block:: bash
76
76
77 curl https://server.com/_admin/api -X POST -H 'content-type:text/plain' --data-binary '{"id":1,
77 curl https://server.com/_admin/api -X POST -H 'content-type:text/plain' --data-binary '{"id":1,
78 "auth_token":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull", "args":{"repo":"CPython"}}'
78 "auth_token":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull", "args":{"repo":"CPython"}}'
79
79
80 Provide those parameters:
80 Provide those parameters:
81 - **id** A value of any type, which is used to match the response with the
81 - **id** A value of any type, which is used to match the response with the
82 request that it is replying to.
82 request that it is replying to.
83 - **auth_token** for access and permission validation.
83 - **auth_token** for access and permission validation.
84 - **method** is name of method to call
84 - **method** is name of method to call
85 - **args** is an ``key:value`` list of arguments to pass to method
85 - **args** is an ``key:value`` list of arguments to pass to method
86
86
87 .. note::
87 .. note::
88
88
89 To get your |authtoken|, from the |RCE| interface,
89 To get your |authtoken|, from the |RCE| interface,
90 go to:
90 go to:
91 :menuselection:`username --> My account --> Auth tokens`
91 :menuselection:`username --> My account --> Auth tokens`
92
92
93 For security reasons you should always create a dedicated |authtoken| for
93 For security reasons you should always create a dedicated |authtoken| for
94 API use only.
94 API use only.
95
95
96
96
97 The |RCE| API will always return a JSON-RPC response:
97 The |RCE| API will always return a JSON-RPC response:
98
98
99 .. code-block:: bash
99 .. code-block:: bash
100
100
101 {
101 {
102 "id": <id>, # matching id sent by request
102 "id": <id>, # matching id sent by request
103 "result": "<result>"|null, # JSON formatted result, null if any errors
103 "result": "<result>"|null, # JSON formatted result, null if any errors
104 "error": "null"|<error_message> # JSON formatted error (if any)
104 "error": "null"|<error_message> # JSON formatted error (if any)
105 }
105 }
106
106
107 All responses from API will be with `HTTP/1.0 200 OK` status code.
107 All responses from API will be with `HTTP/1.0 200 OK` status code.
108 If there is an error when calling the API, the *error* key will contain a
108 If there is an error when calling the API, the *error* key will contain a
109 failure description and the *result* will be `null`.
109 failure description and the *result* will be `null`.
110
110
111 API CLIENT
111 API CLIENT
112 ----------
112 ----------
113
113
114 To install the |RCE| API, see :ref:`install-tools`. To configure the API per
114 To install the |RCE| API, see :ref:`install-tools`. To configure the API per
115 instance, see the :ref:`rc-tools` section as you need to configure a
115 instance, see the :ref:`rc-tools` section as you need to configure a
116 :file:`~/.rhoderc` file with your |authtokens|.
116 :file:`~/.rhoderc` file with your |authtokens|.
117
117
118 Once you have set up your instance API access, use the following examples to
118 Once you have set up your instance API access, use the following examples to
119 get started.
119 get started.
120
120
121 .. code-block:: bash
121 .. code-block:: bash
122
122
123 # Getting the 'rhodecode' repository
123 # Getting the 'rhodecode' repository
124 # from a RhodeCode Enterprise instance
124 # from a RhodeCode Enterprise instance
125 rhodecode-api --instance-name=enterprise-1 get_repo repoid:rhodecode
125 rhodecode-api --instance-name=enterprise-1 get_repo repoid:rhodecode
126
126
127 Calling method get_repo => http://127.0.0.1:5000
127 Calling method get_repo => http://127.0.0.1:5000
128 Server response
128 Server response
129 {
129 {
130 <json data>
130 <json data>
131 }
131 }
132
132
133 # Creating a new mercurial repository called 'brand-new'
133 # Creating a new mercurial repository called 'brand-new'
134 # with a description 'Repo-description'
134 # with a description 'Repo-description'
135 rhodecode-api --instance-name=enterprise-1 create_repo repo_name:brand-new repo_type:hg description:Repo-description
135 rhodecode-api --instance-name=enterprise-1 create_repo repo_name:brand-new repo_type:hg description:Repo-description
136 {
136 {
137 "error": null,
137 "error": null,
138 "id": 1110,
138 "id": 1110,
139 "result": {
139 "result": {
140 "msg": "Created new repository `brand-new`",
140 "msg": "Created new repository `brand-new`",
141 "success": true,
141 "success": true,
142 "task": null
142 "task": null
143 }
143 }
144 }
144 }
145
145
146 A broken example, what not to do.
146 A broken example, what not to do.
147
147
148 .. code-block:: bash
148 .. code-block:: bash
149
149
150 # A call missing the required arguments
150 # A call missing the required arguments
151 # and not specifying the instance
151 # and not specifying the instance
152 rhodecode-api get_repo
152 rhodecode-api get_repo
153
153
154 Calling method get_repo => http://127.0.0.1:5000
154 Calling method get_repo => http://127.0.0.1:5000
155 Server response
155 Server response
156 "Missing non optional `repoid` arg in JSON DATA"
156 "Missing non optional `repoid` arg in JSON DATA"
157
157
158 You can specify pure JSON using the ``--format`` parameter.
158 You can specify pure JSON using the ``--format`` parameter.
159
159
160 .. code-block:: bash
160 .. code-block:: bash
161
161
162 rhodecode-api --format=json get_repo repoid:rhodecode
162 rhodecode-api --format=json get_repo repoid:rhodecode
163
163
164 In such case only output that this function shows is pure JSON, we can use that
164 In such case only output that this function shows is pure JSON, we can use that
165 and pipe output to some json formatter.
165 and pipe output to some json formatter.
166
166
167 If output is in pure JSON format, you can pipe output to a JSON formatter.
167 If output is in pure JSON format, you can pipe output to a JSON formatter.
168
168
169 .. code-block:: bash
169 .. code-block:: bash
170
170
171 rhodecode-api --instance-name=enterprise-1 --format=json get_repo repoid:rhodecode | python -m json.tool
171 rhodecode-api --instance-name=enterprise-1 --format=json get_repo repoid:rhodecode | python -m json.tool
172
172
173 API METHODS
173 API METHODS
174 -----------
174 -----------
175
175
176 Each method by default required following arguments.
176 Each method by default required following arguments.
177
177
178 .. code-block:: bash
178 .. code-block:: bash
179
179
180 id : "<id_for_response>"
180 id : "<id_for_response>"
181 auth_token : "<auth_token>"
181 auth_token : "<auth_token>"
182 method : "<method name>"
182 method : "<method name>"
183 args : {}
183 args : {}
184
184
185 Use each **param** from docs and put it in args, Optional parameters
185 Use each **param** from docs and put it in args, Optional parameters
186 are not required in args.
186 are not required in args.
187
187
188 .. code-block:: bash
188 .. code-block:: bash
189
189
190 args: {"repoid": "rhodecode"}
190 args: {"repoid": "rhodecode"}
191
191
192 .. Note: From this point on things are generated by the script in
192 .. Note: From this point on things are generated by the script in
193 `scripts/fabfile.py`. To change things below, update the docstrings in the
193 `scripts/fabfile.py`. To change things below, update the docstrings in the
194 ApiController.
194 ApiController.
195
195
196 .. --- API DEFS MARKER ---
196 .. --- API DEFS MARKER ---
197
197 .. toctree::
198 pull
199 ----
200
201 .. py:function:: pull(apiuser, repoid)
202
203 Triggers a pull on the given repository from a remote location. You
204 can use this to keep remote repositories up-to-date.
205
206 This command can only be run using an |authtoken| with admin
207 rights to the specified repository. For more information,
208 see :ref:`config-token-ref`.
209
210 This command takes the following options:
211
212 :param apiuser: This is filled automatically from the |authtoken|.
213 :type apiuser: AuthUser
214 :param repoid: The repository name or repository ID.
215 :type repoid: str or int
216
217 Example output:
218
219 .. code-block:: bash
220
221 id : <id_given_in_input>
222 result : {
223 "msg": "Pulled from `<repository name>`"
224 "repository": "<repository name>"
225 }
226 error : null
227
228 Example error output:
229
230 .. code-block:: bash
231
232 id : <id_given_in_input>
233 result : null
234 error : {
235 "Unable to pull changes from `<reponame>`"
236 }
237
238
239 strip
240 -----
241
242 .. py:function:: strip(apiuser, repoid, revision, branch)
243
244 Strips the given revision from the specified repository.
245
246 * This will remove the revision and all of its decendants.
247
248 This command can only be run using an |authtoken| with admin rights to
249 the specified repository.
250
251 This command takes the following options:
252
253 :param apiuser: This is filled automatically from the |authtoken|.
254 :type apiuser: AuthUser
255 :param repoid: The repository name or repository ID.
256 :type repoid: str or int
257 :param revision: The revision you wish to strip.
258 :type revision: str
259 :param branch: The branch from which to strip the revision.
260 :type branch: str
261
262 Example output:
263
264 .. code-block:: bash
265
266 id : <id_given_in_input>
267 result : {
268 "msg": "'Stripped commit <commit_hash> from repo `<repository name>`'"
269 "repository": "<repository name>"
270 }
271 error : null
272
273 Example error output:
274
275 .. code-block:: bash
276
277 id : <id_given_in_input>
278 result : null
279 error : {
280 "Unable to strip commit <commit_hash> from repo `<repository name>`"
281 }
282
283
284 rescan_repos
285 ------------
286
287 .. py:function:: rescan_repos(apiuser, remove_obsolete=<Optional:False>)
288
289 Triggers a rescan of the specified repositories.
290
291 * If the ``remove_obsolete`` option is set, it also deletes repositories
292 that are found in the database but not on the file system, so called
293 "clean zombies".
294
295 This command can only be run using an |authtoken| with admin rights to
296 the specified repository.
297
298 This command takes the following options:
299
300 :param apiuser: This is filled automatically from the |authtoken|.
301 :type apiuser: AuthUser
302 :param remove_obsolete: Deletes repositories from the database that
303 are not found on the filesystem.
304 :type remove_obsolete: Optional(``True`` | ``False``)
305
306 Example output:
307
308 .. code-block:: bash
309
310 id : <id_given_in_input>
311 result : {
312 'added': [<added repository name>,...]
313 'removed': [<removed repository name>,...]
314 }
315 error : null
316
317 Example error output:
318
319 .. code-block:: bash
320
321 id : <id_given_in_input>
322 result : null
323 error : {
324 'Error occurred during rescan repositories action'
325 }
326
327
328 invalidate_cache
329 ----------------
330
331 .. py:function:: invalidate_cache(apiuser, repoid, delete_keys=<Optional:False>)
332
333 Invalidates the cache for the specified repository.
334
335 This command can only be run using an |authtoken| with admin rights to
336 the specified repository.
337
338 This command takes the following options:
339
340 :param apiuser: This is filled automatically from |authtoken|.
341 :type apiuser: AuthUser
342 :param repoid: Sets the repository name or repository ID.
343 :type repoid: str or int
344 :param delete_keys: This deletes the invalidated keys instead of
345 just flagging them.
346 :type delete_keys: Optional(``True`` | ``False``)
347
348 Example output:
349
350 .. code-block:: bash
351
352 id : <id_given_in_input>
353 result : {
354 'msg': Cache for repository `<repository name>` was invalidated,
355 'repository': <repository name>
356 }
357 error : null
358
359 Example error output:
360
361 .. code-block:: bash
362
363 id : <id_given_in_input>
364 result : null
365 error : {
366 'Error occurred during cache invalidation action'
367 }
368
369
370 lock
371 ----
372
373 .. py:function:: lock(apiuser, repoid, locked=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
374
375 Sets the lock state of the specified |repo| by the given user.
376 From more information, see :ref:`repo-locking`.
377
378 * If the ``userid`` option is not set, the repository is locked to the
379 user who called the method.
380 * If the ``locked`` parameter is not set, the current lock state of the
381 repository is displayed.
382
383 This command can only be run using an |authtoken| with admin rights to
384 the specified repository.
385
386 This command takes the following options:
387
388 :param apiuser: This is filled automatically from the |authtoken|.
389 :type apiuser: AuthUser
390 :param repoid: Sets the repository name or repository ID.
391 :type repoid: str or int
392 :param locked: Sets the lock state.
393 :type locked: Optional(``True`` | ``False``)
394 :param userid: Set the repository lock to this user.
395 :type userid: Optional(str or int)
396
397 Example error output:
398
399 .. code-block:: bash
400
401 id : <id_given_in_input>
402 result : {
403 'repo': '<reponame>',
404 'locked': <bool: lock state>,
405 'locked_since': <int: lock timestamp>,
406 'locked_by': <username of person who made the lock>,
407 'lock_reason': <str: reason for locking>,
408 'lock_state_changed': <bool: True if lock state has been changed in this request>,
409 'msg': 'Repo `<reponame>` locked by `<username>` on <timestamp>.'
410 or
411 'msg': 'Repo `<repository name>` not locked.'
412 or
413 'msg': 'User `<user name>` set lock state for repo `<repository name>` to `<new lock state>`'
414 }
415 error : null
416
417 Example error output:
418
419 .. code-block:: bash
420
421 id : <id_given_in_input>
422 result : null
423 error : {
424 'Error occurred locking repository `<reponame>`
425 }
426
427
428 get_locks
429 ---------
430
431 .. py:function:: get_locks(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
432
433 Displays all repositories locked by the specified user.
434
435 * If this command is run by a non-admin user, it returns
436 a list of |repos| locked by that user.
437
438 This command takes the following options:
439
440 :param apiuser: This is filled automatically from the |authtoken|.
441 :type apiuser: AuthUser
442 :param userid: Sets the userid whose list of locked |repos| will be
443 displayed.
444 :type userid: Optional(str or int)
445
446 Example output:
447
448 .. code-block:: bash
449
450 id : <id_given_in_input>
451 result : {
452 [repo_object, repo_object,...]
453 }
454 error : null
455
456
457 get_ip
458 ------
459
460 .. py:function:: get_ip(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
461
462 Displays the IP Address as seen from the |RCE| server.
463
464 * This command displays the IP Address, as well as all the defined IP
465 addresses for the specified user. If the ``userid`` is not set, the
466 data returned is for the user calling the method.
467
468 This command can only be run using an |authtoken| with admin rights to
469 the specified repository.
470
471 This command takes the following options:
472
473 :param apiuser: This is filled automatically from |authtoken|.
474 :type apiuser: AuthUser
475 :param userid: Sets the userid for which associated IP Address data
476 is returned.
477 :type userid: Optional(str or int)
478
479 Example output:
480
481 .. code-block:: bash
482
483 id : <id_given_in_input>
484 result : {
485 "server_ip_addr": "<ip_from_clien>",
486 "user_ips": [
487 {
488 "ip_addr": "<ip_with_mask>",
489 "ip_range": ["<start_ip>", "<end_ip>"],
490 },
491 ...
492 ]
493 }
494
495
496 show_ip
497 -------
498
499 .. py:function:: show_ip(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
500
501 Displays the IP Address as seen from the |RCE| server.
502
503 * This command displays the IP Address, as well as all the defined IP
504 addresses for the specified user. If the ``userid`` is not set, the
505 data returned is for the user calling the method.
506
507 This command can only be run using an |authtoken| with admin rights to
508 the specified repository.
509
510 This command takes the following options:
511
512 :param apiuser: This is filled automatically from |authtoken|.
513 :type apiuser: AuthUser
514 :param userid: Sets the userid for which associated IP Address data
515 is returned.
516 :type userid: Optional(str or int)
517
518 Example output:
519
520 .. code-block:: bash
521
522 id : <id_given_in_input>
523 result : {
524 "server_ip_addr": "<ip_from_clien>",
525 "user_ips": [
526 {
527 "ip_addr": "<ip_with_mask>",
528 "ip_range": ["<start_ip>", "<end_ip>"],
529 },
530 ...
531 ]
532 }
533
534
535 get_license_info
536 ----------------
537
538 .. py:function:: get_license_info(apiuser)
539
540 Returns the |RCE| license information.
541
542 :param apiuser: This is filled automatically from the |authtoken|.
543 :type apiuser: AuthUser
544
545 Example output:
546
547 .. code-block:: bash
548
549 id : <id_given_in_input>
550 result : {
551 'rhodecode_version': <rhodecode version>,
552 'token': <license token>,
553 'issued_to': <license owner>,
554 'issued_on': <license issue date>,
555 'expires_on': <license expiration date>,
556 'type': <license type>,
557 'users_limit': <license users limit>,
558 'key': <license key>
559 }
560 error : null
561
562
563 set_license_key
564 ---------------
565
566 .. py:function:: set_license_key(apiuser, key)
567
568 Sets the |RCE| license key.
569
570 :param apiuser: This is filled automatically from the |authtoken|.
571 :type apiuser: AuthUser
572 :param key: This is the license key to be set.
573 :type key: str
574
575 Example output:
576
577 .. code-block:: bash
578
579 id : <id_given_in_input>
580 result: {
581 "msg" : "updated license information",
582 "key": <key>
583 }
584 error: null
585
586 Example error output:
587
588 .. code-block:: bash
589
590 id : <id_given_in_input>
591 result : null
592 error : {
593 "license key is not valid"
594 or
595 "trial licenses cannot be uploaded"
596 or
597 "error occurred while updating license"
598 }
599
600
601 get_server_info
602 ---------------
603
604 .. py:function:: get_server_info(apiuser)
605
606 Returns the |RCE| server information.
607
608 This includes the running version of |RCE| and all installed
609 packages. This command takes the following options:
610
611 :param apiuser: This is filled automatically from the |authtoken|.
612 :type apiuser: AuthUser
613
614 Example output:
615
616 .. code-block:: bash
617
618 id : <id_given_in_input>
619 result : {
620 'modules': [<module name>,...]
621 'py_version': <python version>,
622 'platform': <platform type>,
623 'rhodecode_version': <rhodecode version>
624 }
625 error : null
626
627
628 get_user
629 --------
630
631 .. py:function:: get_user(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
632
633 Returns the information associated with a username or userid.
634
635 * If the ``userid`` is not set, this command returns the information
636 for the ``userid`` calling the method.
637
638 .. note::
639
640 Normal users may only run this command against their ``userid``. For
641 full privileges you must run this command using an |authtoken| with
642 admin rights.
643
644 This command takes the following options:
645
646 :param apiuser: This is filled automatically from the |authtoken|.
647 :type apiuser: AuthUser
648 :param userid: Sets the userid for which data will be returned.
649 :type userid: Optional(str or int)
650
651 Example output:
652
653 .. code-block:: bash
654
655 {
656 "error": null,
657 "id": <id>,
658 "result": {
659 "active": true,
660 "admin": false,
661 "api_key": "api-key",
662 "api_keys": [ list of keys ],
663 "email": "user@example.com",
664 "emails": [
665 "user@example.com"
666 ],
667 "extern_name": "rhodecode",
668 "extern_type": "rhodecode",
669 "firstname": "username",
670 "ip_addresses": [],
671 "language": null,
672 "last_login": "Timestamp",
673 "lastname": "surnae",
674 "permissions": {
675 "global": [
676 "hg.inherit_default_perms.true",
677 "usergroup.read",
678 "hg.repogroup.create.false",
679 "hg.create.none",
680 "hg.extern_activate.manual",
681 "hg.create.write_on_repogroup.false",
682 "hg.usergroup.create.false",
683 "group.none",
684 "repository.none",
685 "hg.register.none",
686 "hg.fork.repository"
687 ],
688 "repositories": { "username/example": "repository.write"},
689 "repositories_groups": { "user-group/repo": "group.none" },
690 "user_groups": { "user_group_name": "usergroup.read" }
691 },
692 "user_id": 32,
693 "username": "username"
694 }
695 }
696
697
698 get_users
699 ---------
700
701 .. py:function:: get_users(apiuser)
702
703 Lists all users in the |RCE| user database.
704
705 This command can only be run using an |authtoken| with admin rights to
706 the specified repository.
707
708 This command takes the following options:
709
710 :param apiuser: This is filled automatically from the |authtoken|.
711 :type apiuser: AuthUser
712
713 Example output:
714
715 .. code-block:: bash
716
717 id : <id_given_in_input>
718 result: [<user_object>, ...]
719 error: null
720
721
722 create_user
723 -----------
724
725 .. py:function:: create_user(apiuser, username, email, password=<Optional:''>, firstname=<Optional:''>, lastname=<Optional:''>, active=<Optional:True>, admin=<Optional:False>, extern_name=<Optional:'rhodecode'>, extern_type=<Optional:'rhodecode'>, force_password_change=<Optional:False>)
726
727 Creates a new user and returns the new user object.
728
729 This command can only be run using an |authtoken| with admin rights to
730 the specified repository.
731
732 This command takes the following options:
733
734 :param apiuser: This is filled automatically from the |authtoken|.
735 :type apiuser: AuthUser
736 :param username: Set the new username.
737 :type username: str or int
738 :param email: Set the user email address.
739 :type email: str
740 :param password: Set the new user password.
741 :type password: Optional(str)
742 :param firstname: Set the new user firstname.
743 :type firstname: Optional(str)
744 :param lastname: Set the new user surname.
745 :type lastname: Optional(str)
746 :param active: Set the user as active.
747 :type active: Optional(``True`` | ``False``)
748 :param admin: Give the new user admin rights.
749 :type admin: Optional(``True`` | ``False``)
750 :param extern_name: Set the authentication plugin name.
751 Using LDAP this is filled with LDAP UID.
752 :type extern_name: Optional(str)
753 :param extern_type: Set the new user authentication plugin.
754 :type extern_type: Optional(str)
755 :param force_password_change: Force the new user to change password
756 on next login.
757 :type force_password_change: Optional(``True`` | ``False``)
758
759 Example output:
760
761 .. code-block:: bash
762
763 id : <id_given_in_input>
764 result: {
765 "msg" : "created new user `<username>`",
766 "user": <user_obj>
767 }
768 error: null
769
770 Example error output:
771
772 .. code-block:: bash
773
774 id : <id_given_in_input>
775 result : null
776 error : {
777 "user `<username>` already exist"
778 or
779 "email `<email>` already exist"
780 or
781 "failed to create user `<username>`"
782 }
783
784
785 update_user
786 -----------
787
788 .. py:function:: update_user(apiuser, userid, username=<Optional:None>, email=<Optional:None>, password=<Optional:None>, firstname=<Optional:None>, lastname=<Optional:None>, active=<Optional:None>, admin=<Optional:None>, extern_type=<Optional:None>, extern_name=<Optional:None>)
789
790 Updates the details for the specified user, if that user exists.
791
792 This command can only be run using an |authtoken| with admin rights to
793 the specified repository.
794
795 This command takes the following options:
796
797 :param apiuser: This is filled automatically from |authtoken|.
798 :type apiuser: AuthUser
799 :param userid: Set the ``userid`` to update.
800 :type userid: str or int
801 :param username: Set the new username.
802 :type username: str or int
803 :param email: Set the new email.
804 :type email: str
805 :param password: Set the new password.
806 :type password: Optional(str)
807 :param firstname: Set the new first name.
808 :type firstname: Optional(str)
809 :param lastname: Set the new surname.
810 :type lastname: Optional(str)
811 :param active: Set the new user as active.
812 :type active: Optional(``True`` | ``False``)
813 :param admin: Give the user admin rights.
814 :type admin: Optional(``True`` | ``False``)
815 :param extern_name: Set the authentication plugin user name.
816 Using LDAP this is filled with LDAP UID.
817 :type extern_name: Optional(str)
818 :param extern_type: Set the authentication plugin type.
819 :type extern_type: Optional(str)
820
821
822 Example output:
823
824 .. code-block:: bash
825
826 id : <id_given_in_input>
827 result: {
828 "msg" : "updated user ID:<userid> <username>",
829 "user": <user_object>,
830 }
831 error: null
832
833 Example error output:
834
835 .. code-block:: bash
836
837 id : <id_given_in_input>
838 result : null
839 error : {
840 "failed to update user `<username>`"
841 }
842
843
844 delete_user
845 -----------
846
847 .. py:function:: delete_user(apiuser, userid)
848
849 Deletes the specified user from the |RCE| user database.
850
851 This command can only be run using an |authtoken| with admin rights to
852 the specified repository.
853
854 .. important::
855
856 Ensure all open pull requests and open code review
857 requests to this user are close.
858
859 Also ensure all repositories, or repository groups owned by this
860 user are reassigned before deletion.
861
862 This command takes the following options:
863
864 :param apiuser: This is filled automatically from the |authtoken|.
865 :type apiuser: AuthUser
866 :param userid: Set the user to delete.
867 :type userid: str or int
868
869 Example output:
870
871 .. code-block:: bash
872
873 id : <id_given_in_input>
874 result: {
875 "msg" : "deleted user ID:<userid> <username>",
876 "user": null
877 }
878 error: null
879
880 Example error output:
881
882 .. code-block:: bash
883
884 id : <id_given_in_input>
885 result : null
886 error : {
887 "failed to delete user ID:<userid> <username>"
888 }
889
890
891 get_user_group
892 --------------
893
894 .. py:function:: get_user_group(apiuser, usergroupid)
895
896 Returns the data of an existing user group.
897
898 This command can only be run using an |authtoken| with admin rights to
899 the specified repository.
900
901 :param apiuser: This is filled automatically from the |authtoken|.
902 :type apiuser: AuthUser
903 :param usergroupid: Set the user group from which to return data.
904 :type usergroupid: str or int
905
906 Example error output:
907
908 .. code-block:: bash
909
910 {
911 "error": null,
912 "id": <id>,
913 "result": {
914 "active": true,
915 "group_description": "group description",
916 "group_name": "group name",
917 "members": [
918 {
919 "name": "owner-name",
920 "origin": "owner",
921 "permission": "usergroup.admin",
922 "type": "user"
923 },
924 {
925 {
926 "name": "user name",
927 "origin": "permission",
928 "permission": "usergroup.admin",
929 "type": "user"
930 },
931 {
932 "name": "user group name",
933 "origin": "permission",
934 "permission": "usergroup.write",
935 "type": "user_group"
936 }
937 ],
938 "owner": "owner name",
939 "users": [],
940 "users_group_id": 2
941 }
942 }
943
944
945 get_user_groups
946 ---------------
947
948 .. py:function:: get_user_groups(apiuser)
949
950 Lists all the existing user groups within RhodeCode.
951
952 This command can only be run using an |authtoken| with admin rights to
953 the specified repository.
954
955 This command takes the following options:
956
957 :param apiuser: This is filled automatically from the |authtoken|.
958 :type apiuser: AuthUser
959
960 Example error output:
961
962 .. code-block:: bash
963
964 id : <id_given_in_input>
965 result : [<user_group_obj>,...]
966 error : null
967
968
969 create_user_group
970 -----------------
971
972 .. py:function:: create_user_group(apiuser, group_name, description=<Optional:''>, owner=<Optional:<OptionalAttr:apiuser>>, active=<Optional:True>)
973
974 Creates a new user group.
975
976 This command can only be run using an |authtoken| with admin rights to
977 the specified repository.
978
979 This command takes the following options:
980
981 :param apiuser: This is filled automatically from the |authtoken|.
982 :type apiuser: AuthUser
983 :param group_name: Set the name of the new user group.
984 :type group_name: str
985 :param description: Give a description of the new user group.
986 :type description: str
987 :param owner: Set the owner of the new user group.
988 If not set, the owner is the |authtoken| user.
989 :type owner: Optional(str or int)
990 :param active: Set this group as active.
991 :type active: Optional(``True`` | ``False``)
992
993 Example output:
994
995 .. code-block:: bash
996
997 id : <id_given_in_input>
998 result: {
999 "msg": "created new user group `<groupname>`",
1000 "user_group": <user_group_object>
1001 }
1002 error: null
1003
1004 Example error output:
1005
1006 .. code-block:: bash
1007
1008 id : <id_given_in_input>
1009 result : null
1010 error : {
1011 "user group `<group name>` already exist"
1012 or
1013 "failed to create group `<group name>`"
1014 }
1015
1016
1017 update_user_group
1018 -----------------
1019
1020 .. py:function:: update_user_group(apiuser, usergroupid, group_name=<Optional:''>, description=<Optional:''>, owner=<Optional:None>, active=<Optional:True>)
1021
1022 Updates the specified `user group` with the details provided.
1023
1024 This command can only be run using an |authtoken| with admin rights to
1025 the specified repository.
1026
1027 :param apiuser: This is filled automatically from the |authtoken|.
1028 :type apiuser: AuthUser
1029 :param usergroupid: Set the id of the `user group` to update.
1030 :type usergroupid: str or int
1031 :param group_name: Set the new name the `user group`
1032 :type group_name: str
1033 :param description: Give a description for the `user group`
1034 :type description: str
1035 :param owner: Set the owner of the `user group`.
1036 :type owner: Optional(str or int)
1037 :param active: Set the group as active.
1038 :type active: Optional(``True`` | ``False``)
1039
1040 Example output:
1041
1042 .. code-block:: bash
1043
1044 id : <id_given_in_input>
1045 result : {
1046 "msg": 'updated user group ID:<user group id> <user group name>',
1047 "user_group": <user_group_object>
1048 }
1049 error : null
1050
1051 Example error output:
1052
1053 .. code-block:: bash
1054
1055 id : <id_given_in_input>
1056 result : null
1057 error : {
1058 "failed to update user group `<user group name>`"
1059 }
1060
1061
1062 delete_user_group
1063 -----------------
1064
1065 .. py:function:: delete_user_group(apiuser, usergroupid)
1066
1067 Deletes the specified `user group`.
1068
1069 This command can only be run using an |authtoken| with admin rights to
1070 the specified repository.
1071
1072 This command takes the following options:
1073
1074 :param apiuser: filled automatically from apikey
1075 :type apiuser: AuthUser
1076 :param usergroupid:
1077 :type usergroupid: int
1078
1079 Example output:
1080
1081 .. code-block:: bash
1082
1083 id : <id_given_in_input>
1084 result : {
1085 "msg": "deleted user group ID:<user_group_id> <user_group_name>"
1086 }
1087 error : null
1088
1089 Example error output:
1090
1091 .. code-block:: bash
1092
1093 id : <id_given_in_input>
1094 result : null
1095 error : {
1096 "failed to delete user group ID:<user_group_id> <user_group_name>"
1097 or
1098 "RepoGroup assigned to <repo_groups_list>"
1099 }
1100
1101
1102 add_user_to_user_group
1103 ----------------------
1104
1105 .. py:function:: add_user_to_user_group(apiuser, usergroupid, userid)
1106
1107 Adds a user to a `user group`. If the user already exists in the group
1108 this command will return false.
1109
1110 This command can only be run using an |authtoken| with admin rights to
1111 the specified user group.
1112
1113 This command takes the following options:
1114
1115 :param apiuser: This is filled automatically from the |authtoken|.
1116 :type apiuser: AuthUser
1117 :param usergroupid: Set the name of the `user group` to which a
1118 user will be added.
1119 :type usergroupid: int
1120 :param userid: Set the `user_id` of the user to add to the group.
1121 :type userid: int
1122
1123 Example output:
1124
1125 .. code-block:: bash
1126
1127 id : <id_given_in_input>
1128 result : {
1129 "success": True|False # depends on if member is in group
1130 "msg": "added member `<username>` to user group `<groupname>` |
1131 User is already in that group"
1132
1133 }
1134 error : null
1135
1136 Example error output:
1137
1138 .. code-block:: bash
1139
1140 id : <id_given_in_input>
1141 result : null
1142 error : {
1143 "failed to add member to user group `<user_group_name>`"
1144 }
1145
1146
1147 remove_user_from_user_group
1148 ---------------------------
1149
1150 .. py:function:: remove_user_from_user_group(apiuser, usergroupid, userid)
1151
1152 Removes a user from a user group.
1153
1154 * If the specified user is not in the group, this command will return
1155 `false`.
1156
1157 This command can only be run using an |authtoken| with admin rights to
1158 the specified user group.
1159
1160 :param apiuser: This is filled automatically from the |authtoken|.
1161 :type apiuser: AuthUser
1162 :param usergroupid: Sets the user group name.
1163 :type usergroupid: str or int
1164 :param userid: The user you wish to remove from |RCE|.
1165 :type userid: str or int
1166
1167 Example output:
1168
1169 .. code-block:: bash
1170
1171 id : <id_given_in_input>
1172 result: {
1173 "success": True|False, # depends on if member is in group
1174 "msg": "removed member <username> from user group <groupname> |
1175 User wasn't in group"
1176 }
1177 error: null
1178
1179
1180 grant_user_permission_to_user_group
1181 -----------------------------------
1182
1183 .. py:function:: grant_user_permission_to_user_group(apiuser, usergroupid, userid, perm)
1184
1185 Set permissions for a user in a user group.
1186
1187 :param apiuser: This is filled automatically from the |authtoken|.
1188 :type apiuser: AuthUser
1189 :param usergroupid: Set the user group to edit permissions on.
1190 :type usergroupid: str or int
1191 :param userid: Set the user from whom you wish to set permissions.
1192 :type userid: str
1193 :param perm: (usergroup.(none|read|write|admin))
1194 :type perm: str
1195
1196 Example output:
1197
1198 .. code-block:: bash
1199
1200 id : <id_given_in_input>
1201 result : {
1202 "msg": "Granted perm: `<perm_name>` for user: `<username>` in user group: `<user_group_name>`",
1203 "success": true
1204 }
1205 error : null
1206
1207
1208 revoke_user_permission_from_user_group
1209 --------------------------------------
1210
1211 .. py:function:: revoke_user_permission_from_user_group(apiuser, usergroupid, userid)
1212
1213 Revoke a users permissions in a user group.
1214
1215 :param apiuser: This is filled automatically from the |authtoken|.
1216 :type apiuser: AuthUser
1217 :param usergroupid: Set the user group from which to revoke the user
1218 permissions.
1219 :type: usergroupid: str or int
1220 :param userid: Set the userid of the user whose permissions will be
1221 revoked.
1222 :type userid: str
1223
1224 Example output:
1225
1226 .. code-block:: bash
1227
1228 id : <id_given_in_input>
1229 result : {
1230 "msg": "Revoked perm for user: `<username>` in user group: `<user_group_name>`",
1231 "success": true
1232 }
1233 error : null
1234
1235
1236 grant_user_group_permission_to_user_group
1237 -----------------------------------------
1238
1239 .. py:function:: grant_user_group_permission_to_user_group(apiuser, usergroupid, sourceusergroupid, perm)
1240
1241 Give one user group permissions to another user group.
1242
1243 :param apiuser: This is filled automatically from the |authtoken|.
1244 :type apiuser: AuthUser
1245 :param usergroupid: Set the user group on which to edit permissions.
1246 :type usergroupid: str or int
1247 :param sourceusergroupid: Set the source user group to which
1248 access/permissions will be granted.
1249 :type sourceusergroupid: str or int
1250 :param perm: (usergroup.(none|read|write|admin))
1251 :type perm: str
1252
1253 Example output:
1254
1255 .. code-block:: bash
1256
1257 id : <id_given_in_input>
1258 result : {
1259 "msg": "Granted perm: `<perm_name>` for user group: `<source_user_group_name>` in user group: `<user_group_name>`",
1260 "success": true
1261 }
1262 error : null
1263
1264
1265 revoke_user_group_permission_from_user_group
1266 --------------------------------------------
1267
1268 .. py:function:: revoke_user_group_permission_from_user_group(apiuser, usergroupid, sourceusergroupid)
1269
1270 Revoke the permissions that one user group has to another.
1271
1272 :param apiuser: This is filled automatically from the |authtoken|.
1273 :type apiuser: AuthUser
1274 :param usergroupid: Set the user group on which to edit permissions.
1275 :type usergroupid: str or int
1276 :param sourceusergroupid: Set the user group from which permissions
1277 are revoked.
1278 :type sourceusergroupid: str or int
1279
1280 Example output:
1281
1282 .. code-block:: bash
1283
1284 id : <id_given_in_input>
1285 result : {
1286 "msg": "Revoked perm for user group: `<user_group_name>` in user group: `<target_user_group_name>`",
1287 "success": true
1288 }
1289 error : null
1290
1291
1292 get_pull_request
1293 ----------------
1294
1295 .. py:function:: get_pull_request(apiuser, repoid, pullrequestid)
1296
1297 Get a pull request based on the given ID.
1298
1299 :param apiuser: This is filled automatically from the |authtoken|.
1300 :type apiuser: AuthUser
1301 :param repoid: Repository name or repository ID from where the pull
1302 request was opened.
1303 :type repoid: str or int
1304 :param pullrequestid: ID of the requested pull request.
1305 :type pullrequestid: int
1306
1307 Example output:
1308
1309 .. code-block:: bash
1310
1311 "id": <id_given_in_input>,
1312 "result":
1313 {
1314 "pull_request_id": "<pull_request_id>",
1315 "url": "<url>",
1316 "title": "<title>",
1317 "description": "<description>",
1318 "status" : "<status>",
1319 "created_on": "<date_time_created>",
1320 "updated_on": "<date_time_updated>",
1321 "commit_ids": [
1322 ...
1323 "<commit_id>",
1324 "<commit_id>",
1325 ...
1326 ],
1327 "review_status": "<review_status>",
1328 "mergeable": {
1329 "status": "<bool>",
1330 "message": "<message>",
1331 },
1332 "source": {
1333 "clone_url": "<clone_url>",
1334 "repository": "<repository_name>",
1335 "reference":
1336 {
1337 "name": "<name>",
1338 "type": "<type>",
1339 "commit_id": "<commit_id>",
1340 }
1341 },
1342 "target": {
1343 "clone_url": "<clone_url>",
1344 "repository": "<repository_name>",
1345 "reference":
1346 {
1347 "name": "<name>",
1348 "type": "<type>",
1349 "commit_id": "<commit_id>",
1350 }
1351 },
1352 "author": <user_obj>,
1353 "reviewers": [
1354 ...
1355 {
1356 "user": "<user_obj>",
1357 "review_status": "<review_status>",
1358 }
1359 ...
1360 ]
1361 },
1362 "error": null
1363
1364
1365 get_pull_requests
1366 -----------------
1367
1368 .. py:function:: get_pull_requests(apiuser, repoid, status=<Optional:'new'>)
1369
1370 Get all pull requests from the repository specified in `repoid`.
1371
1372 :param apiuser: This is filled automatically from the |authtoken|.
1373 :type apiuser: AuthUser
1374 :param repoid: Repository name or repository ID.
1375 :type repoid: str or int
1376 :param status: Only return pull requests with the specified status.
1377 Valid options are.
1378 * ``new`` (default)
1379 * ``open``
1380 * ``closed``
1381 :type status: str
1382
1383 Example output:
1384
1385 .. code-block:: bash
1386
1387 "id": <id_given_in_input>,
1388 "result":
1389 [
1390 ...
1391 {
1392 "pull_request_id": "<pull_request_id>",
1393 "url": "<url>",
1394 "title" : "<title>",
1395 "description": "<description>",
1396 "status": "<status>",
1397 "created_on": "<date_time_created>",
1398 "updated_on": "<date_time_updated>",
1399 "commit_ids": [
1400 ...
1401 "<commit_id>",
1402 "<commit_id>",
1403 ...
1404 ],
1405 "review_status": "<review_status>",
1406 "mergeable": {
1407 "status": "<bool>",
1408 "message: "<message>",
1409 },
1410 "source": {
1411 "clone_url": "<clone_url>",
1412 "reference":
1413 {
1414 "name": "<name>",
1415 "type": "<type>",
1416 "commit_id": "<commit_id>",
1417 }
1418 },
1419 "target": {
1420 "clone_url": "<clone_url>",
1421 "reference":
1422 {
1423 "name": "<name>",
1424 "type": "<type>",
1425 "commit_id": "<commit_id>",
1426 }
1427 },
1428 "author": <user_obj>,
1429 "reviewers": [
1430 ...
1431 {
1432 "user": "<user_obj>",
1433 "review_status": "<review_status>",
1434 }
1435 ...
1436 ]
1437 }
1438 ...
1439 ],
1440 "error": null
1441
1442
1443 merge_pull_request
1444 ------------------
1445
1446 .. py:function:: merge_pull_request(apiuser, repoid, pullrequestid, userid=<Optional:<OptionalAttr:apiuser>>)
1447
1448 Merge the pull request specified by `pullrequestid` into its target
1449 repository.
1450
1451 :param apiuser: This is filled automatically from the |authtoken|.
1452 :type apiuser: AuthUser
1453 :param repoid: The Repository name or repository ID of the
1454 target repository to which the |pr| is to be merged.
1455 :type repoid: str or int
1456 :param pullrequestid: ID of the pull request which shall be merged.
1457 :type pullrequestid: int
1458 :param userid: Merge the pull request as this user.
1459 :type userid: Optional(str or int)
1460
1461 Example output:
1462
1463 .. code-block:: bash
1464
1465 "id": <id_given_in_input>,
1466 "result":
1467 {
1468 "executed": "<bool>",
1469 "failure_reason": "<int>",
1470 "merge_commit_id": "<merge_commit_id>",
1471 "possible": "<bool>"
1472 },
1473 "error": null
1474
1475
1476 close_pull_request
1477 ------------------
1478
1479 .. py:function:: close_pull_request(apiuser, repoid, pullrequestid, userid=<Optional:<OptionalAttr:apiuser>>)
1480
1481 Close the pull request specified by `pullrequestid`.
1482
1483 :param apiuser: This is filled automatically from the |authtoken|.
1484 :type apiuser: AuthUser
1485 :param repoid: Repository name or repository ID to which the pull
1486 request belongs.
1487 :type repoid: str or int
1488 :param pullrequestid: ID of the pull request to be closed.
1489 :type pullrequestid: int
1490 :param userid: Close the pull request as this user.
1491 :type userid: Optional(str or int)
1492
1493 Example output:
1494
1495 .. code-block:: bash
1496
1497 "id": <id_given_in_input>,
1498 "result":
1499 {
1500 "pull_request_id": "<int>",
1501 "closed": "<bool>"
1502 },
1503 "error": null
1504
1505
1506 comment_pull_request
1507 --------------------
1508
1509 .. py:function:: comment_pull_request(apiuser, repoid, pullrequestid, message=<Optional:None>, status=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
1510
198
1511 Comment on the pull request specified with the `pullrequestid`,
199 methods/license-methods
1512 in the |repo| specified by the `repoid`, and optionally change the
200 methods/deprecated-methods
1513 review status.
201 methods/gist-methods
1514
202 methods/pull-request-methods
1515 :param apiuser: This is filled automatically from the |authtoken|.
203 methods/repo-methods
1516 :type apiuser: AuthUser
204 methods/repo-group-methods
1517 :param repoid: The repository name or repository ID.
205 methods/server-methods
1518 :type repoid: str or int
206 methods/user-methods
1519 :param pullrequestid: The pull request ID.
207 methods/user-group-methods
1520 :type pullrequestid: int
1521 :param message: The text content of the comment.
1522 :type message: str
1523 :param status: (**Optional**) Set the approval status of the pull
1524 request. Valid options are:
1525 * not_reviewed
1526 * approved
1527 * rejected
1528 * under_review
1529 :type status: str
1530 :param userid: Comment on the pull request as this user
1531 :type userid: Optional(str or int)
1532
1533 Example output:
1534
1535 .. code-block:: bash
1536
1537 id : <id_given_in_input>
1538 result :
1539 {
1540 "pull_request_id": "<Integer>",
1541 "comment_id": "<Integer>"
1542 }
1543 error : null
1544
1545
1546 create_pull_request
1547 -------------------
1548
1549 .. py:function:: create_pull_request(apiuser, source_repo, target_repo, source_ref, target_ref, title, description=<Optional:''>, reviewers=<Optional:None>)
1550
1551 Creates a new pull request.
1552
1553 Accepts refs in the following formats:
1554
1555 * branch:<branch_name>:<sha>
1556 * branch:<branch_name>
1557 * bookmark:<bookmark_name>:<sha> (Mercurial only)
1558 * bookmark:<bookmark_name> (Mercurial only)
1559
1560 :param apiuser: This is filled automatically from the |authtoken|.
1561 :type apiuser: AuthUser
1562 :param source_repo: Set the source repository name.
1563 :type source_repo: str
1564 :param target_repo: Set the target repository name.
1565 :type target_repo: str
1566 :param source_ref: Set the source ref name.
1567 :type source_ref: str
1568 :param target_ref: Set the target ref name.
1569 :type target_ref: str
1570 :param title: Set the pull request title.
1571 :type title: str
1572 :param description: Set the pull request description.
1573 :type description: Optional(str)
1574 :param reviewers: Set the new pull request reviewers list.
1575 :type reviewers: Optional(list)
1576
1577
1578 update_pull_request
1579 -------------------
1580
1581 .. py:function:: update_pull_request(apiuser, repoid, pullrequestid, title=<Optional:''>, description=<Optional:''>, reviewers=<Optional:None>, update_commits=<Optional:None>, close_pull_request=<Optional:None>)
1582
1583 Updates a pull request.
1584
1585 :param apiuser: This is filled automatically from the |authtoken|.
1586 :type apiuser: AuthUser
1587 :param repoid: The repository name or repository ID.
1588 :type repoid: str or int
1589 :param pullrequestid: The pull request ID.
1590 :type pullrequestid: int
1591 :param title: Set the pull request title.
1592 :type title: str
1593 :param description: Update pull request description.
1594 :type description: Optional(str)
1595 :param reviewers: Update pull request reviewers list with new value.
1596 :type reviewers: Optional(list)
1597 :param update_commits: Trigger update of commits for this pull request
1598 :type: update_commits: Optional(bool)
1599 :param close_pull_request: Close this pull request with rejected state
1600 :type: close_pull_request: Optional(bool)
1601
1602 Example output:
1603
1604 .. code-block:: bash
1605
1606 id : <id_given_in_input>
1607 result :
1608 {
1609 "msg": "Updated pull request `63`",
1610 "pull_request": <pull_request_object>,
1611 "updated_reviewers": {
1612 "added": [
1613 "username"
1614 ],
1615 "removed": []
1616 },
1617 "updated_commits": {
1618 "added": [
1619 "<sha1_hash>"
1620 ],
1621 "common": [
1622 "<sha1_hash>",
1623 "<sha1_hash>",
1624 ],
1625 "removed": []
1626 }
1627 }
1628 error : null
1629
1630
1631 get_repo
1632 --------
1633
1634 .. py:function:: get_repo(apiuser, repoid, cache=<Optional:True>)
1635
1636 Gets an existing repository by its name or repository_id.
1637
1638 The members section so the output returns users groups or users
1639 associated with that repository.
1640
1641 This command can only be run using an |authtoken| with admin rights,
1642 or users with at least read rights to the |repo|.
1643
1644 :param apiuser: This is filled automatically from the |authtoken|.
1645 :type apiuser: AuthUser
1646 :param repoid: The repository name or repository id.
1647 :type repoid: str or int
1648 :param cache: use the cached value for last changeset
1649 :type: cache: Optional(bool)
1650
1651 Example output:
1652
1653 .. code-block:: bash
1654
1655 {
1656 "error": null,
1657 "id": <repo_id>,
1658 "result": {
1659 "clone_uri": null,
1660 "created_on": "timestamp",
1661 "description": "repo description",
1662 "enable_downloads": false,
1663 "enable_locking": false,
1664 "enable_statistics": false,
1665 "followers": [
1666 {
1667 "active": true,
1668 "admin": false,
1669 "api_key": "****************************************",
1670 "api_keys": [
1671 "****************************************"
1672 ],
1673 "email": "user@example.com",
1674 "emails": [
1675 "user@example.com"
1676 ],
1677 "extern_name": "rhodecode",
1678 "extern_type": "rhodecode",
1679 "firstname": "username",
1680 "ip_addresses": [],
1681 "language": null,
1682 "last_login": "2015-09-16T17:16:35.854",
1683 "lastname": "surname",
1684 "user_id": <user_id>,
1685 "username": "name"
1686 }
1687 ],
1688 "fork_of": "parent-repo",
1689 "landing_rev": [
1690 "rev",
1691 "tip"
1692 ],
1693 "last_changeset": {
1694 "author": "User <user@example.com>",
1695 "branch": "default",
1696 "date": "timestamp",
1697 "message": "last commit message",
1698 "parents": [
1699 {
1700 "raw_id": "commit-id"
1701 }
1702 ],
1703 "raw_id": "commit-id",
1704 "revision": <revision number>,
1705 "short_id": "short id"
1706 },
1707 "lock_reason": null,
1708 "locked_by": null,
1709 "locked_date": null,
1710 "members": [
1711 {
1712 "name": "super-admin-name",
1713 "origin": "super-admin",
1714 "permission": "repository.admin",
1715 "type": "user"
1716 },
1717 {
1718 "name": "owner-name",
1719 "origin": "owner",
1720 "permission": "repository.admin",
1721 "type": "user"
1722 },
1723 {
1724 "name": "user-group-name",
1725 "origin": "permission",
1726 "permission": "repository.write",
1727 "type": "user_group"
1728 }
1729 ],
1730 "owner": "owner-name",
1731 "permissions": [
1732 {
1733 "name": "super-admin-name",
1734 "origin": "super-admin",
1735 "permission": "repository.admin",
1736 "type": "user"
1737 },
1738 {
1739 "name": "owner-name",
1740 "origin": "owner",
1741 "permission": "repository.admin",
1742 "type": "user"
1743 },
1744 {
1745 "name": "user-group-name",
1746 "origin": "permission",
1747 "permission": "repository.write",
1748 "type": "user_group"
1749 }
1750 ],
1751 "private": true,
1752 "repo_id": 676,
1753 "repo_name": "user-group/repo-name",
1754 "repo_type": "hg"
1755 }
1756 }
1757
1758
1759 get_repos
1760 ---------
1761
1762 .. py:function:: get_repos(apiuser)
1763
1764 Lists all existing repositories.
1765
1766 This command can only be run using an |authtoken| with admin rights,
1767 or users with at least read rights to |repos|.
1768
1769 :param apiuser: This is filled automatically from the |authtoken|.
1770 :type apiuser: AuthUser
1771
1772 Example output:
1773
1774 .. code-block:: bash
1775
1776 id : <id_given_in_input>
1777 result: [
1778 {
1779 "repo_id" : "<repo_id>",
1780 "repo_name" : "<reponame>"
1781 "repo_type" : "<repo_type>",
1782 "clone_uri" : "<clone_uri>",
1783 "private": : "<bool>",
1784 "created_on" : "<datetimecreated>",
1785 "description" : "<description>",
1786 "landing_rev": "<landing_rev>",
1787 "owner": "<repo_owner>",
1788 "fork_of": "<name_of_fork_parent>",
1789 "enable_downloads": "<bool>",
1790 "enable_locking": "<bool>",
1791 "enable_statistics": "<bool>",
1792 },
1793 ...
1794 ]
1795 error: null
1796
1797
1798 get_repo_changeset
1799 ------------------
1800
1801 .. py:function:: get_repo_changeset(apiuser, repoid, revision, details=<Optional:'basic'>)
1802
1803 Returns information about a changeset.
1804
1805 Additionally parameters define the amount of details returned by
1806 this function.
1807
1808 This command can only be run using an |authtoken| with admin rights,
1809 or users with at least read rights to the |repo|.
1810
1811 :param apiuser: This is filled automatically from the |authtoken|.
1812 :type apiuser: AuthUser
1813 :param repoid: The repository name or repository id
1814 :type repoid: str or int
1815 :param revision: revision for which listing should be done
1816 :type revision: str
1817 :param details: details can be 'basic|extended|full' full gives diff
1818 info details like the diff itself, and number of changed files etc.
1819 :type details: Optional(str)
1820
1821
1822 get_repo_changesets
1823 -------------------
1824
1825 .. py:function:: get_repo_changesets(apiuser, repoid, start_rev, limit, details=<Optional:'basic'>)
1826
1827 Returns a set of changesets limited by the number of commits starting
1828 from the `start_rev` option.
1829
1830 Additional parameters define the amount of details returned by this
1831 function.
1832
1833 This command can only be run using an |authtoken| with admin rights,
1834 or users with at least read rights to |repos|.
1835
1836 :param apiuser: This is filled automatically from the |authtoken|.
1837 :type apiuser: AuthUser
1838 :param repoid: The repository name or repository ID.
1839 :type repoid: str or int
1840 :param start_rev: The starting revision from where to get changesets.
1841 :type start_rev: str
1842 :param limit: Limit the number of changesets to this amount
1843 :type limit: str or int
1844 :param details: Set the level of detail returned. Valid option are:
1845 ``basic``, ``extended`` and ``full``.
1846 :type details: Optional(str)
1847
1848 .. note::
1849
1850 Setting the parameter `details` to the value ``full`` is extensive
1851 and returns details like the diff itself, and the number
1852 of changed files.
1853
1854
1855 get_repo_nodes
1856 --------------
1857
1858 .. py:function:: get_repo_nodes(apiuser, repoid, revision, root_path, ret_type=<Optional:'all'>, details=<Optional:'basic'>)
1859
1860 Returns a list of nodes and children in a flat list for a given
1861 path at given revision.
1862
1863 It's possible to specify ret_type to show only `files` or `dirs`.
1864
1865 This command can only be run using an |authtoken| with admin rights,
1866 or users with at least read rights to |repos|.
1867
1868 :param apiuser: This is filled automatically from the |authtoken|.
1869 :type apiuser: AuthUser
1870 :param repoid: The repository name or repository ID.
1871 :type repoid: str or int
1872 :param revision: The revision for which listing should be done.
1873 :type revision: str
1874 :param root_path: The path from which to start displaying.
1875 :type root_path: str
1876 :param ret_type: Set the return type. Valid options are
1877 ``all`` (default), ``files`` and ``dirs``.
1878 :type ret_type: Optional(str)
1879 :param details: Returns extended information about nodes, such as
1880 md5, binary, and or content. The valid options are ``basic`` and
1881 ``full``.
1882 :type details: Optional(str)
1883
1884 Example output:
1885
1886 .. code-block:: bash
1887
1888 id : <id_given_in_input>
1889 result: [
1890 {
1891 "name" : "<name>"
1892 "type" : "<type>",
1893 "binary": "<true|false>" (only in extended mode)
1894 "md5" : "<md5 of file content>" (only in extended mode)
1895 },
1896 ...
1897 ]
1898 error: null
1899
1900
1901 create_repo
1902 -----------
1903
1904 .. py:function:: create_repo(apiuser, repo_name, repo_type, owner=<Optional:<OptionalAttr:apiuser>>, description=<Optional:''>, private=<Optional:False>, clone_uri=<Optional:None>, landing_rev=<Optional:'rev:tip'>, enable_statistics=<Optional:False>, enable_locking=<Optional:False>, enable_downloads=<Optional:False>, copy_permissions=<Optional:False>)
1905
1906 Creates a repository.
1907
1908 * If the repository name contains "/", all the required repository
1909 groups will be created.
1910
1911 For example "foo/bar/baz" will create |repo| groups "foo" and "bar"
1912 (with "foo" as parent). It will also create the "baz" repository
1913 with "bar" as |repo| group.
1914
1915 This command can only be run using an |authtoken| with at least
1916 write permissions to the |repo|.
1917
1918 :param apiuser: This is filled automatically from the |authtoken|.
1919 :type apiuser: AuthUser
1920 :param repo_name: Set the repository name.
1921 :type repo_name: str
1922 :param repo_type: Set the repository type; 'hg','git', or 'svn'.
1923 :type repo_type: str
1924 :param owner: user_id or username
1925 :type owner: Optional(str)
1926 :param description: Set the repository description.
1927 :type description: Optional(str)
1928 :param private:
1929 :type private: bool
1930 :param clone_uri:
1931 :type clone_uri: str
1932 :param landing_rev: <rev_type>:<rev>
1933 :type landing_rev: str
1934 :param enable_locking:
1935 :type enable_locking: bool
1936 :param enable_downloads:
1937 :type enable_downloads: bool
1938 :param enable_statistics:
1939 :type enable_statistics: bool
1940 :param copy_permissions: Copy permission from group in which the
1941 repository is being created.
1942 :type copy_permissions: bool
1943
1944
1945 Example output:
1946
1947 .. code-block:: bash
1948
1949 id : <id_given_in_input>
1950 result: {
1951 "msg": "Created new repository `<reponame>`",
1952 "success": true,
1953 "task": "<celery task id or None if done sync>"
1954 }
1955 error: null
1956
1957
1958 Example error output:
1959
1960 .. code-block:: bash
1961
1962 id : <id_given_in_input>
1963 result : null
1964 error : {
1965 'failed to create repository `<repo_name>`
1966 }
1967
1968
1969 add_field_to_repo
1970 -----------------
1971
1972 .. py:function:: add_field_to_repo(apiuser, repoid, key, label=<Optional:''>, description=<Optional:''>)
1973
1974 Adds an extra field to a repository.
1975
1976 This command can only be run using an |authtoken| with at least
1977 write permissions to the |repo|.
1978
1979 :param apiuser: This is filled automatically from the |authtoken|.
1980 :type apiuser: AuthUser
1981 :param repoid: Set the repository name or repository id.
1982 :type repoid: str or int
1983 :param key: Create a unique field key for this repository.
1984 :type key: str
1985 :param label:
1986 :type label: Optional(str)
1987 :param description:
1988 :type description: Optional(str)
1989
1990
1991 remove_field_from_repo
1992 ----------------------
1993
1994 .. py:function:: remove_field_from_repo(apiuser, repoid, key)
1995
1996 Removes an extra field from a repository.
1997
1998 This command can only be run using an |authtoken| with at least
1999 write permissions to the |repo|.
2000
2001 :param apiuser: This is filled automatically from the |authtoken|.
2002 :type apiuser: AuthUser
2003 :param repoid: Set the repository name or repository ID.
2004 :type repoid: str or int
2005 :param key: Set the unique field key for this repository.
2006 :type key: str
2007
2008
2009 update_repo
2010 -----------
2011
2012 .. py:function:: update_repo(apiuser, repoid, name=<Optional:None>, owner=<Optional:<OptionalAttr:apiuser>>, group=<Optional:None>, fork_of=<Optional:None>, description=<Optional:''>, private=<Optional:False>, clone_uri=<Optional:None>, landing_rev=<Optional:'rev:tip'>, enable_statistics=<Optional:False>, enable_locking=<Optional:False>, enable_downloads=<Optional:False>, fields=<Optional:''>)
2013
2014 Updates a repository with the given information.
2015
2016 This command can only be run using an |authtoken| with at least
2017 write permissions to the |repo|.
2018
2019 :param apiuser: This is filled automatically from the |authtoken|.
2020 :type apiuser: AuthUser
2021 :param repoid: repository name or repository ID.
2022 :type repoid: str or int
2023 :param name: Update the |repo| name.
2024 :type name: str
2025 :param owner: Set the |repo| owner.
2026 :type owner: str
2027 :param group: Set the |repo| group the |repo| belongs to.
2028 :type group: str
2029 :param fork_of: Set the master |repo| name.
2030 :type fork_of: str
2031 :param description: Update the |repo| description.
2032 :type description: str
2033 :param private: Set the |repo| as private. (True | False)
2034 :type private: bool
2035 :param clone_uri: Update the |repo| clone URI.
2036 :type clone_uri: str
2037 :param landing_rev: Set the |repo| landing revision. Default is
2038 ``tip``.
2039 :type landing_rev: str
2040 :param enable_statistics: Enable statistics on the |repo|,
2041 (True | False).
2042 :type enable_statistics: bool
2043 :param enable_locking: Enable |repo| locking.
2044 :type enable_locking: bool
2045 :param enable_downloads: Enable downloads from the |repo|,
2046 (True | False).
2047 :type enable_downloads: bool
2048 :param fields: Add extra fields to the |repo|. Use the following
2049 example format: ``field_key=field_val,field_key2=fieldval2``.
2050 Escape ', ' with \,
2051 :type fields: str
2052
2053
2054 fork_repo
2055 ---------
2056
2057 .. py:function:: fork_repo(apiuser, repoid, fork_name, owner=<Optional:<OptionalAttr:apiuser>>, description=<Optional:''>, copy_permissions=<Optional:False>, private=<Optional:False>, landing_rev=<Optional:'rev:tip'>)
2058
2059 Creates a fork of the specified |repo|.
2060
2061 * If using |RCE| with Celery this will immediately return a success
2062 message, even though the fork will be created asynchronously.
2063
2064 This command can only be run using an |authtoken| with fork
2065 permissions on the |repo|.
2066
2067 :param apiuser: This is filled automatically from the |authtoken|.
2068 :type apiuser: AuthUser
2069 :param repoid: Set repository name or repository ID.
2070 :type repoid: str or int
2071 :param fork_name: Set the fork name.
2072 :type fork_name: str
2073 :param owner: Set the fork owner.
2074 :type owner: str
2075 :param description: Set the fork descripton.
2076 :type description: str
2077 :param copy_permissions: Copy permissions from parent |repo|. The
2078 default is False.
2079 :type copy_permissions: bool
2080 :param private: Make the fork private. The default is False.
2081 :type private: bool
2082 :param landing_rev: Set the landing revision. The default is tip.
2083
2084 Example output:
2085
2086 .. code-block:: bash
2087
2088 id : <id_for_response>
2089 api_key : "<api_key>"
2090 args: {
2091 "repoid" : "<reponame or repo_id>",
2092 "fork_name": "<forkname>",
2093 "owner": "<username or user_id = Optional(=apiuser)>",
2094 "description": "<description>",
2095 "copy_permissions": "<bool>",
2096 "private": "<bool>",
2097 "landing_rev": "<landing_rev>"
2098 }
2099
2100 Example error output:
2101
2102 .. code-block:: bash
2103
2104 id : <id_given_in_input>
2105 result: {
2106 "msg": "Created fork of `<reponame>` as `<forkname>`",
2107 "success": true,
2108 "task": "<celery task id or None if done sync>"
2109 }
2110 error: null
2111
2112
2113 delete_repo
2114 -----------
2115
2116 .. py:function:: delete_repo(apiuser, repoid, forks=<Optional:''>)
2117
2118 Deletes a repository.
2119
2120 * When the `forks` parameter is set it's possible to detach or delete
2121 forks of deleted repository.
2122
2123 This command can only be run using an |authtoken| with admin
2124 permissions on the |repo|.
2125
2126 :param apiuser: This is filled automatically from the |authtoken|.
2127 :type apiuser: AuthUser
2128 :param repoid: Set the repository name or repository ID.
2129 :type repoid: str or int
2130 :param forks: Set to `detach` or `delete` forks from the |repo|.
2131 :type forks: Optional(str)
2132
2133 Example error output:
2134
2135 .. code-block:: bash
2136
2137 id : <id_given_in_input>
2138 result: {
2139 "msg": "Deleted repository `<reponame>`",
2140 "success": true
2141 }
2142 error: null
2143
2144
2145 comment_commit
2146 --------------
2147
2148 .. py:function:: comment_commit(apiuser, repoid, commit_id, message, userid=<Optional:<OptionalAttr:apiuser>>, status=<Optional:None>)
2149
2150 Set a commit comment, and optionally change the status of the commit.
2151 This command can be executed only using api_key belonging to user
2152 with admin rights, or repository administrator.
2153
2154 :param apiuser: This is filled automatically from the |authtoken|.
2155 :type apiuser: AuthUser
2156 :param repoid: Set the repository name or repository ID.
2157 :type repoid: str or int
2158 :param commit_id: Specify the commit_id for which to set a comment.
2159 :type commit_id: str
2160 :param message: The comment text.
2161 :type message: str
2162 :param userid: Set the user name of the comment creator.
2163 :type userid: Optional(str or int)
2164 :param status: status, one of 'not_reviewed', 'approved', 'rejected',
2165 'under_review'
2166 :type status: str
2167
2168 Example error output:
2169
2170 .. code-block:: json
2171
2172 {
2173 "id" : <id_given_in_input>,
2174 "result" : {
2175 "msg": "Commented on commit `<commit_id>` for repository `<repoid>`",
2176 "status_change": null or <status>,
2177 "success": true
2178 },
2179 "error" : null
2180 }
2181
2182
2183 changeset_comment
2184 -----------------
2185
2186 .. py:function:: changeset_comment(apiuser, repoid, revision, message, userid=<Optional:<OptionalAttr:apiuser>>, status=<Optional:None>)
2187
2188 .. deprecated:: 3.4.0
2189
2190 Please use method `comment_commit` instead.
2191
2192
2193 Set a changeset comment, and optionally change the status of the
2194 changeset.
2195
2196 This command can only be run using an |authtoken| with admin
2197 permissions on the |repo|.
2198
2199 :param apiuser: This is filled automatically from the |authtoken|.
2200 :type apiuser: AuthUser
2201 :param repoid: Set the repository name or repository ID.
2202 :type repoid: str or int
2203 :param revision: Specify the revision for which to set a comment.
2204 :type revision: str
2205 :param message: The comment text.
2206 :type message: str
2207 :param userid: Set the user name of the comment creator.
2208 :type userid: Optional(str or int)
2209 :param status: Set the comment status. The following are valid options:
2210 * not_reviewed
2211 * approved
2212 * rejected
2213 * under_review
2214 :type status: str
2215
2216 Example error output:
2217
2218 .. code-block:: json
2219
2220 {
2221 "id" : <id_given_in_input>,
2222 "result" : {
2223 "msg": "Commented on commit `<revision>` for repository `<repoid>`",
2224 "status_change": null or <status>,
2225 "success": true
2226 },
2227 "error" : null
2228 }
2229
2230
2231 grant_user_permission
2232 ---------------------
2233
2234 .. py:function:: grant_user_permission(apiuser, repoid, userid, perm)
2235
2236 Grant permissions for the specified user on the given repository,
2237 or update existing permissions if found.
2238
2239 This command can only be run using an |authtoken| with admin
2240 permissions on the |repo|.
2241
2242 :param apiuser: This is filled automatically from the |authtoken|.
2243 :type apiuser: AuthUser
2244 :param repoid: Set the repository name or repository ID.
2245 :type repoid: str or int
2246 :param userid: Set the user name.
2247 :type userid: str
2248 :param perm: Set the user permissions, using the following format
2249 ``(repository.(none|read|write|admin))``
2250 :type perm: str
2251
2252 Example output:
2253
2254 .. code-block:: bash
2255
2256 id : <id_given_in_input>
2257 result: {
2258 "msg" : "Granted perm: `<perm>` for user: `<username>` in repo: `<reponame>`",
2259 "success": true
2260 }
2261 error: null
2262
2263
2264 revoke_user_permission
2265 ----------------------
2266
2267 .. py:function:: revoke_user_permission(apiuser, repoid, userid)
2268
2269 Revoke permission for a user on the specified repository.
2270
2271 This command can only be run using an |authtoken| with admin
2272 permissions on the |repo|.
2273
2274 :param apiuser: This is filled automatically from the |authtoken|.
2275 :type apiuser: AuthUser
2276 :param repoid: Set the repository name or repository ID.
2277 :type repoid: str or int
2278 :param userid: Set the user name of revoked user.
2279 :type userid: str or int
2280
2281 Example error output:
2282
2283 .. code-block:: bash
2284
2285 id : <id_given_in_input>
2286 result: {
2287 "msg" : "Revoked perm for user: `<username>` in repo: `<reponame>`",
2288 "success": true
2289 }
2290 error: null
2291
2292
2293 grant_user_group_permission
2294 ---------------------------
2295
2296 .. py:function:: grant_user_group_permission(apiuser, repoid, usergroupid, perm)
2297
2298 Grant permission for a user group on the specified repository,
2299 or update existing permissions.
2300
2301 This command can only be run using an |authtoken| with admin
2302 permissions on the |repo|.
2303
2304 :param apiuser: This is filled automatically from the |authtoken|.
2305 :type apiuser: AuthUser
2306 :param repoid: Set the repository name or repository ID.
2307 :type repoid: str or int
2308 :param usergroupid: Specify the ID of the user group.
2309 :type usergroupid: str or int
2310 :param perm: Set the user group permissions using the following
2311 format: (repository.(none|read|write|admin))
2312 :type perm: str
2313
2314 Example output:
2315
2316 .. code-block:: bash
2317
2318 id : <id_given_in_input>
2319 result : {
2320 "msg" : "Granted perm: `<perm>` for group: `<usersgroupname>` in repo: `<reponame>`",
2321 "success": true
2322
2323 }
2324 error : null
2325
2326 Example error output:
2327
2328 .. code-block:: bash
2329
2330 id : <id_given_in_input>
2331 result : null
2332 error : {
2333 "failed to edit permission for user group: `<usergroup>` in repo `<repo>`'
2334 }
2335
2336
2337 revoke_user_group_permission
2338 ----------------------------
2339
2340 .. py:function:: revoke_user_group_permission(apiuser, repoid, usergroupid)
2341
2342 Revoke the permissions of a user group on a given repository.
2343
2344 This command can only be run using an |authtoken| with admin
2345 permissions on the |repo|.
2346
2347 :param apiuser: This is filled automatically from the |authtoken|.
2348 :type apiuser: AuthUser
2349 :param repoid: Set the repository name or repository ID.
2350 :type repoid: str or int
2351 :param usergroupid: Specify the user group ID.
2352 :type usergroupid: str or int
2353
2354 Example output:
2355
2356 .. code-block:: bash
2357
2358 id : <id_given_in_input>
2359 result: {
2360 "msg" : "Revoked perm for group: `<usersgroupname>` in repo: `<reponame>`",
2361 "success": true
2362 }
2363 error: null
2364
2365
2366 get_repo_group
2367 --------------
2368
2369 .. py:function:: get_repo_group(apiuser, repogroupid)
2370
2371 Return the specified |repo| group, along with permissions,
2372 and repositories inside the group
2373
2374 :param apiuser: This is filled automatically from the |authtoken|.
2375 :type apiuser: AuthUser
2376 :param repogroupid: Specify the name of ID of the repository group.
2377 :type repogroupid: str or int
2378
2379
2380 Example output:
2381
2382 .. code-block:: bash
2383
2384 {
2385 "error": null,
2386 "id": repo-group-id,
2387 "result": {
2388 "group_description": "repo group description",
2389 "group_id": 14,
2390 "group_name": "group name",
2391 "members": [
2392 {
2393 "name": "super-admin-username",
2394 "origin": "super-admin",
2395 "permission": "group.admin",
2396 "type": "user"
2397 },
2398 {
2399 "name": "owner-name",
2400 "origin": "owner",
2401 "permission": "group.admin",
2402 "type": "user"
2403 },
2404 {
2405 "name": "user-group-name",
2406 "origin": "permission",
2407 "permission": "group.write",
2408 "type": "user_group"
2409 }
2410 ],
2411 "owner": "owner-name",
2412 "parent_group": null,
2413 "repositories": [ repo-list ]
2414 }
2415 }
2416
2417
2418 get_repo_groups
2419 ---------------
2420
2421 .. py:function:: get_repo_groups(apiuser)
2422
2423 Returns all repository groups.
2424
2425 :param apiuser: This is filled automatically from the |authtoken|.
2426 :type apiuser: AuthUser
2427
2428
2429 create_repo_group
2430 -----------------
2431
2432 .. py:function:: create_repo_group(apiuser, group_name, description=<Optional:''>, owner=<Optional:<OptionalAttr:apiuser>>, copy_permissions=<Optional:False>)
2433
2434 Creates a repository group.
2435
2436 * If the repository group name contains "/", all the required repository
2437 groups will be created.
2438
2439 For example "foo/bar/baz" will create |repo| groups "foo" and "bar"
2440 (with "foo" as parent). It will also create the "baz" repository
2441 with "bar" as |repo| group.
2442
2443 This command can only be run using an |authtoken| with admin
2444 permissions.
2445
2446 :param apiuser: This is filled automatically from the |authtoken|.
2447 :type apiuser: AuthUser
2448 :param group_name: Set the repository group name.
2449 :type group_name: str
2450 :param description: Set the |repo| group description.
2451 :type description: str
2452 :param owner: Set the |repo| group owner.
2453 :type owner: str
2454 :param copy_permissions:
2455 :type copy_permissions:
2456
2457 Example output:
2458
2459 .. code-block:: bash
2460
2461 id : <id_given_in_input>
2462 result : {
2463 "msg": "Created new repo group `<repo_group_name>`"
2464 "repo_group": <repogroup_object>
2465 }
2466 error : null
2467
2468
2469 Example error output:
2470
2471 .. code-block:: bash
2472
2473 id : <id_given_in_input>
2474 result : null
2475 error : {
2476 failed to create repo group `<repogroupid>`
2477 }
2478
2479
2480 update_repo_group
2481 -----------------
2482
2483 .. py:function:: update_repo_group(apiuser, repogroupid, group_name=<Optional:''>, description=<Optional:''>, owner=<Optional:<OptionalAttr:apiuser>>, parent=<Optional:None>, enable_locking=<Optional:False>)
2484
2485 Updates repository group with the details given.
2486
2487 This command can only be run using an |authtoken| with admin
2488 permissions.
2489
2490 :param apiuser: This is filled automatically from the |authtoken|.
2491 :type apiuser: AuthUser
2492 :param repogroupid: Set the ID of repository group.
2493 :type repogroupid: str or int
2494 :param group_name: Set the name of the |repo| group.
2495 :type group_name: str
2496 :param description: Set a description for the group.
2497 :type description: str
2498 :param owner: Set the |repo| group owner.
2499 :type owner: str
2500 :param parent: Set the |repo| group parent.
2501 :type parent: str or int
2502 :param enable_locking: Enable |repo| locking. The default is false.
2503 :type enable_locking: bool
2504
2505
2506 delete_repo_group
2507 -----------------
2508
2509 .. py:function:: delete_repo_group(apiuser, repogroupid)
2510
2511 Deletes a |repo| group.
2512
2513 :param apiuser: This is filled automatically from the |authtoken|.
2514 :type apiuser: AuthUser
2515 :param repogroupid: Set the name or ID of repository group to be
2516 deleted.
2517 :type repogroupid: str or int
2518
2519 Example output:
2520
2521 .. code-block:: bash
2522
2523 id : <id_given_in_input>
2524 result : {
2525 'msg': 'deleted repo group ID:<repogroupid> <repogroupname>
2526 'repo_group': null
2527 }
2528 error : null
2529
2530 Example error output:
2531
2532 .. code-block:: bash
2533
2534 id : <id_given_in_input>
2535 result : null
2536 error : {
2537 "failed to delete repo group ID:<repogroupid> <repogroupname>"
2538 }
2539
2540
2541 grant_user_permission_to_repo_group
2542 -----------------------------------
2543
2544 .. py:function:: grant_user_permission_to_repo_group(apiuser, repogroupid, userid, perm, apply_to_children=<Optional:'none'>)
2545
2546 Grant permission for a user on the given repository group, or update
2547 existing permissions if found.
2548
2549 This command can only be run using an |authtoken| with admin
2550 permissions.
2551
2552 :param apiuser: This is filled automatically from the |authtoken|.
2553 :type apiuser: AuthUser
2554 :param repogroupid: Set the name or ID of repository group.
2555 :type repogroupid: str or int
2556 :param userid: Set the user name.
2557 :type userid: str
2558 :param perm: (group.(none|read|write|admin))
2559 :type perm: str
2560 :param apply_to_children: 'none', 'repos', 'groups', 'all'
2561 :type apply_to_children: str
2562
2563 Example output:
2564
2565 .. code-block:: bash
2566
2567 id : <id_given_in_input>
2568 result: {
2569 "msg" : "Granted perm: `<perm>` (recursive:<apply_to_children>) for user: `<username>` in repo group: `<repo_group_name>`",
2570 "success": true
2571 }
2572 error: null
2573
2574 Example error output:
2575
2576 .. code-block:: bash
2577
2578 id : <id_given_in_input>
2579 result : null
2580 error : {
2581 "failed to edit permission for user: `<userid>` in repo group: `<repo_group_name>`"
2582 }
2583
2584
2585 revoke_user_permission_from_repo_group
2586 --------------------------------------
2587
2588 .. py:function:: revoke_user_permission_from_repo_group(apiuser, repogroupid, userid, apply_to_children=<Optional:'none'>)
2589
2590 Revoke permission for a user in a given repository group.
2591
2592 This command can only be run using an |authtoken| with admin
2593 permissions on the |repo| group.
2594
2595 :param apiuser: This is filled automatically from the |authtoken|.
2596 :type apiuser: AuthUser
2597 :param repogroupid: Set the name or ID of the repository group.
2598 :type repogroupid: str or int
2599 :param userid: Set the user name to revoke.
2600 :type userid: str
2601 :param apply_to_children: 'none', 'repos', 'groups', 'all'
2602 :type apply_to_children: str
2603
2604 Example output:
2605
2606 .. code-block:: bash
2607
2608 id : <id_given_in_input>
2609 result: {
2610 "msg" : "Revoked perm (recursive:<apply_to_children>) for user: `<username>` in repo group: `<repo_group_name>`",
2611 "success": true
2612 }
2613 error: null
2614
2615 Example error output:
2616
2617 .. code-block:: bash
2618
2619 id : <id_given_in_input>
2620 result : null
2621 error : {
2622 "failed to edit permission for user: `<userid>` in repo group: `<repo_group_name>`"
2623 }
2624
2625
2626 grant_user_group_permission_to_repo_group
2627 -----------------------------------------
2628
2629 .. py:function:: grant_user_group_permission_to_repo_group(apiuser, repogroupid, usergroupid, perm, apply_to_children=<Optional:'none'>)
2630
2631 Grant permission for a user group on given repository group, or update
2632 existing permissions if found.
2633
2634 This command can only be run using an |authtoken| with admin
2635 permissions on the |repo| group.
2636
2637 :param apiuser: This is filled automatically from the |authtoken|.
2638 :type apiuser: AuthUser
2639 :param repogroupid: Set the name or id of repository group
2640 :type repogroupid: str or int
2641 :param usergroupid: id of usergroup
2642 :type usergroupid: str or int
2643 :param perm: (group.(none|read|write|admin))
2644 :type perm: str
2645 :param apply_to_children: 'none', 'repos', 'groups', 'all'
2646 :type apply_to_children: str
2647
2648 Example output:
2649
2650 .. code-block:: bash
2651
2652 id : <id_given_in_input>
2653 result : {
2654 "msg" : "Granted perm: `<perm>` (recursive:<apply_to_children>) for user group: `<usersgroupname>` in repo group: `<repo_group_name>`",
2655 "success": true
2656
2657 }
2658 error : null
2659
2660 Example error output:
2661
2662 .. code-block:: bash
2663
2664 id : <id_given_in_input>
2665 result : null
2666 error : {
2667 "failed to edit permission for user group: `<usergroup>` in repo group: `<repo_group_name>`"
2668 }
2669
2670
2671 revoke_user_group_permission_from_repo_group
2672 --------------------------------------------
2673
2674 .. py:function:: revoke_user_group_permission_from_repo_group(apiuser, repogroupid, usergroupid, apply_to_children=<Optional:'none'>)
2675
2676 Revoke permission for user group on given repository.
2677
2678 This command can only be run using an |authtoken| with admin
2679 permissions on the |repo| group.
2680
2681 :param apiuser: This is filled automatically from the |authtoken|.
2682 :type apiuser: AuthUser
2683 :param repogroupid: name or id of repository group
2684 :type repogroupid: str or int
2685 :param usergroupid:
2686 :param apply_to_children: 'none', 'repos', 'groups', 'all'
2687 :type apply_to_children: str
2688
2689 Example output:
2690
2691 .. code-block:: bash
2692
2693 id : <id_given_in_input>
2694 result: {
2695 "msg" : "Revoked perm (recursive:<apply_to_children>) for user group: `<usersgroupname>` in repo group: `<repo_group_name>`",
2696 "success": true
2697 }
2698 error: null
2699
2700 Example error output:
2701
2702 .. code-block:: bash
2703
2704 id : <id_given_in_input>
2705 result : null
2706 error : {
2707 "failed to edit permission for user group: `<usergroup>` in repo group: `<repo_group_name>`"
2708 }
2709
2710
2711 get_gist
2712 --------
2713
2714 .. py:function:: get_gist(apiuser, gistid, content=<Optional:False>)
2715
2716 Get the specified gist, based on the gist ID.
2717
2718 :param apiuser: This is filled automatically from the |authtoken|.
2719 :type apiuser: AuthUser
2720 :param gistid: Set the id of the private or public gist
2721 :type gistid: str
2722 :param content: Return the gist content. Default is false.
2723 :type content: Optional(bool)
2724
2725
2726 get_gists
2727 ---------
2728
2729 .. py:function:: get_gists(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
2730
2731 Get all gists for given user. If userid is empty returned gists
2732 are for user who called the api
2733
2734 :param apiuser: This is filled automatically from the |authtoken|.
2735 :type apiuser: AuthUser
2736 :param userid: user to get gists for
2737 :type userid: Optional(str or int)
2738
2739
2740 create_gist
2741 -----------
2742
2743 .. py:function:: create_gist(apiuser, files, owner=<Optional:<OptionalAttr:apiuser>>, gist_type=<Optional:u'public'>, lifetime=<Optional:-1>, acl_level=<Optional:u'acl_public'>, description=<Optional:''>)
2744
2745 Creates a new Gist.
2746
2747 :param apiuser: This is filled automatically from the |authtoken|.
2748 :type apiuser: AuthUser
2749 :param files: files to be added to the gist. The data structure has
2750 to match the following example::
2751
2752 {'filename': {'content':'...', 'lexer': null},
2753 'filename2': {'content':'...', 'lexer': null}}
2754
2755 :type files: dict
2756 :param owner: Set the gist owner, defaults to api method caller
2757 :type owner: Optional(str or int)
2758 :param gist_type: type of gist ``public`` or ``private``
2759 :type gist_type: Optional(str)
2760 :param lifetime: time in minutes of gist lifetime
2761 :type lifetime: Optional(int)
2762 :param acl_level: acl level for this gist, can be
2763 ``acl_public`` or ``acl_private`` If the value is set to
2764 ``acl_private`` only logged in users are able to access this gist.
2765 If not set it defaults to ``acl_public``.
2766 :type acl_level: Optional(str)
2767 :param description: gist description
2768 :type description: Optional(str)
2769
2770 Example output:
2771
2772 .. code-block:: bash
2773
2774 id : <id_given_in_input>
2775 result : {
2776 "msg": "created new gist",
2777 "gist": {}
2778 }
2779 error : null
2780
2781 Example error output:
2782
2783 .. code-block:: bash
2784
2785 id : <id_given_in_input>
2786 result : null
2787 error : {
2788 "failed to create gist"
2789 }
2790
2791
2792 delete_gist
2793 -----------
2794
2795 .. py:function:: delete_gist(apiuser, gistid)
2796
2797 Deletes existing gist
2798
2799 :param apiuser: filled automatically from apikey
2800 :type apiuser: AuthUser
2801 :param gistid: id of gist to delete
2802 :type gistid: str
2803
2804 Example output:
2805
2806 .. code-block:: bash
2807
2808 id : <id_given_in_input>
2809 result : {
2810 "deleted gist ID: <gist_id>",
2811 "gist": null
2812 }
2813 error : null
2814
2815 Example error output:
2816
2817 .. code-block:: bash
2818
2819 id : <id_given_in_input>
2820 result : null
2821 error : {
2822 "failed to delete gist ID:<gist_id>"
2823 }
2824
@@ -1,27 +1,27 b''
1 .. _code-review-ref:
1 .. _code-review-ref:
2
2
3 Code Review
3 Code Review
4 ===========
4 ===========
5
5
6 |RCM| provides two ways in which you can review code. You can review |prs| or
6 |RCM| provides two ways in which you can review code. You can review |prs| or
7 commits. To better understand |prs|, see the :ref:`pull-requests-ref`
7 commits. To better understand |prs|, see the :ref:`pull-requests-ref`
8 and :ref:`collaborate-ref` sections. For more information about why
8 and :ref:`collaborate-ref` sections. For more information about why
9 code review matters, see these posts on the topic:
9 code review matters, see these posts on the topic:
10
10
11 * `Code Review - Fix Bugs Early and Often`_
11 * `Code Review - Fix Bugs Early and Often`_
12 * `Code Review - How to Convince a Skeptic`_
12 * `Code Review - How to Convince a Skeptic`_
13 * `Code Review - Learn How NASA Codes`_
13 * `Code Review - Learn How NASA Codes`_
14
14
15 You can also use the |RCE| API set up continuous integration servers to leave
15 You can also use the |RCE| API set up continuous integration servers to leave
16 comments from a test suite. See the :ref:`api` and
16 comments from a test suite. See the :ref:`api` and
17 :ref:`integrations-ref` sections for examples on how to set this up.
17 :ref:`extensions-hooks-ref` sections for examples on how to set this up.
18
18
19 .. toctree::
19 .. toctree::
20
20
21 review-diffs
21 review-diffs
22 approve-changes
22 approve-changes
23 reviewing-best-practices
23 reviewing-best-practices
24
24
25 .. _Code Review - Fix Bugs Early and Often: https://rhodecode.com/blog/code-review-fix-bugs-early-often/
25 .. _Code Review - Fix Bugs Early and Often: https://rhodecode.com/blog/code-review-fix-bugs-early-often/
26 .. _Code Review - How to Convince a Skeptic: https://rhodecode.com/blog/code-review-convince-skeptic/
26 .. _Code Review - How to Convince a Skeptic: https://rhodecode.com/blog/code-review-convince-skeptic/
27 .. _Code Review - Learn How NASA Codes: https://rhodecode.com/blog/code-review-learn-nasa-codes/
27 .. _Code Review - Learn How NASA Codes: https://rhodecode.com/blog/code-review-learn-nasa-codes/
@@ -1,34 +1,36 b''
1 # Try and keep this list alphabetical
1 # Try and keep this list alphabetical
2 # ui is for user interface elements and messages
2 # ui is for user interface elements and messages
3 # button - that's obvious
3 # button - that's obvious
4
4
5 rst_epilog = '''
5 rst_epilog = '''
6 .. |AE| replace:: Appenlight
6 .. |AE| replace:: Appenlight
7 .. |authtoken| replace:: Authentication Token
7 .. |authtoken| replace:: Authentication Token
8 .. |authtokens| replace:: **Auth Tokens**
8 .. |authtokens| replace:: **Auth Tokens**
9 .. |RCCEshort| replace:: Community
10 .. |RCEEshort| replace:: Enterprise
9 .. |git| replace:: Git
11 .. |git| replace:: Git
10 .. |hg| replace:: Mercurial
12 .. |hg| replace:: Mercurial
11 .. |svn| replace:: Subversion
13 .. |svn| replace:: Subversion
12 .. |LDAP| replace:: LDAP / Active Directory
14 .. |LDAP| replace:: LDAP / Active Directory
13 .. |os| replace:: operating system
15 .. |os| replace:: operating system
14 .. |OS| replace:: Operating System
16 .. |OS| replace:: Operating System
15 .. |PY| replace:: Python
17 .. |PY| replace:: Python
16 .. |pr| replace:: pull request
18 .. |pr| replace:: pull request
17 .. |prs| replace:: pull requests
19 .. |prs| replace:: pull requests
18 .. |psf| replace:: Python Software Foundation
20 .. |psf| replace:: Python Software Foundation
19 .. |repo| replace:: repository
21 .. |repo| replace:: repository
20 .. |repos| replace:: repositories
22 .. |repos| replace:: repositories
21 .. |RCI| replace:: RhodeCode Control
23 .. |RCI| replace:: RhodeCode Control
22 .. |RCC| replace:: RhodeCode Control
24 .. |RCC| replace:: RhodeCode Control
23 .. |RCV| replace:: RhodeCode Enterprise
25 .. |RCV| replace:: RhodeCode Enterprise
24 .. |RCM| replace:: RhodeCode Enterprise
26 .. |RCM| replace:: RhodeCode Enterprise
25 .. |RCE| replace:: RhodeCode Enterprise
27 .. |RCE| replace:: RhodeCode Enterprise
26 .. |RCCE| replace:: RhodeCode Community
28 .. |RCCE| replace:: RhodeCode Community
27 .. |RCEE| replace:: RhodeCode Enterprise
29 .. |RCEE| replace:: RhodeCode Enterprise
28 .. |RCX| replace:: RhodeCode Extensions
30 .. |RCX| replace:: RhodeCode Extensions
29 .. |RCT| replace:: RhodeCode Tools
31 .. |RCT| replace:: RhodeCode Tools
30 .. |RCEBOLD| replace:: **RhodeCode Enterprise**
32 .. |RCEBOLD| replace:: **RhodeCode Enterprise**
31 .. |RCEITALICS| replace:: `RhodeCode Enterprise`
33 .. |RCEITALICS| replace:: `RhodeCode Enterprise`
32 .. |RC| replace:: RhodeCode
34 .. |RC| replace:: RhodeCode
33 .. |RNS| replace:: Release Notes
35 .. |RNS| replace:: Release Notes
34 '''
36 '''
@@ -1,144 +1,157 b''
1 .. _dev-setup:
1 .. _dev-setup:
2
2
3 ===================
3 ===================
4 Development setup
4 Development setup
5 ===================
5 ===================
6
6
7
7
8 RhodeCode Enterprise runs inside a Nix managed environment. This ensures build
8 RhodeCode Enterprise runs inside a Nix managed environment. This ensures build
9 environment dependencies are correctly declared and installed during setup.
9 environment dependencies are correctly declared and installed during setup.
10 It also enables atomic upgrades, rollbacks, and multiple instances of RhodeCode
10 It also enables atomic upgrades, rollbacks, and multiple instances of RhodeCode
11 Enterprise running with isolation.
11 Enterprise running with isolation.
12
12
13 To set up RhodeCode Enterprise inside the Nix environment, use the following steps:
13 To set up RhodeCode Enterprise inside the Nix environment, use the following steps:
14
14
15
15
16
16
17 Setup Nix Package Manager
17 Setup Nix Package Manager
18 -------------------------
18 -------------------------
19
19
20 To install the Nix Package Manager, please run::
20 To install the Nix Package Manager, please run::
21
21
22 $ curl https://nixos.org/nix/install | sh
22 $ curl https://nixos.org/nix/install | sh
23
23
24 or go to https://nixos.org/nix/ and follow the installation instructions.
24 or go to https://nixos.org/nix/ and follow the installation instructions.
25 Once this is correctly set up on your system, you should be able to use the
25 Once this is correctly set up on your system, you should be able to use the
26 following commands:
26 following commands:
27
27
28 * `nix-env`
28 * `nix-env`
29
29
30 * `nix-shell`
30 * `nix-shell`
31
31
32
32
33 .. tip::
33 .. tip::
34
34
35 Update your channels frequently by running ``nix-channel --upgrade``.
35 Update your channels frequently by running ``nix-channel --upgrade``.
36
36
37
37
38 Switch nix to the latest STABLE channel
38 Switch nix to the latest STABLE channel
39 ---------------------------------------
39 ---------------------------------------
40
40
41 run::
41 run::
42
42
43 nix-channel --add https://nixos.org/channels/nixos-16.03 nixpkgs
43 nix-channel --add https://nixos.org/channels/nixos-16.03 nixpkgs
44
44
45 Followed by::
45 Followed by::
46
46
47 nix-channel --update
47 nix-channel --update
48
48
49
49
50 Clone the required repositories
50 Clone the required repositories
51 -------------------------------
51 -------------------------------
52
52
53 After Nix is set up, clone the RhodeCode Enterprise Community Edition and
53 After Nix is set up, clone the RhodeCode Enterprise Community Edition and
54 RhodeCode VCSServer repositories into the same directory.
54 RhodeCode VCSServer repositories into the same directory.
55 To do this, use the following example::
55 To do this, use the following example::
56
56
57 mkdir rhodecode-develop && cd rhodecode-develop
57 mkdir rhodecode-develop && cd rhodecode-develop
58 hg clone https://code.rhodecode.com/rhodecode-enterprise-ce
58 hg clone https://code.rhodecode.com/rhodecode-enterprise-ce
59 hg clone https://code.rhodecode.com/rhodecode-vcsserver
59 hg clone https://code.rhodecode.com/rhodecode-vcsserver
60
60
61 .. note::
61 .. note::
62
62
63 If you cannot clone the repository, please request read permissions
63 If you cannot clone the repository, please request read permissions
64 via support@rhodecode.com
64 via support@rhodecode.com
65
65
66
66
67
67
68 Enter the Development Shell
68 Enter the Development Shell
69 ---------------------------
69 ---------------------------
70
70
71 The final step is to start the development shell. To do this, run the
71 The final step is to start the development shell. To do this, run the
72 following command from inside the cloned repository::
72 following command from inside the cloned repository::
73
73
74 cd ~/rhodecode-enterprise-ce
74 cd ~/rhodecode-enterprise-ce
75 nix-shell
75 nix-shell
76
76
77 .. note::
77 .. note::
78
78
79 On the first run, this will take a while to download and optionally compile
79 On the first run, this will take a while to download and optionally compile
80 a few things. The following runs will be faster. The development shell works
80 a few things. The following runs will be faster. The development shell works
81 fine on MacOS and Linux platforms.
81 fine on both MacOS and Linux platforms.
82
82
83
83
84
84
85 Creating a Development Configuration
85 Creating a Development Configuration
86 ------------------------------------
86 ------------------------------------
87
87
88 To create a development environment for RhodeCode Enterprise,
88 To create a development environment for RhodeCode Enterprise,
89 use the following steps:
89 use the following steps:
90
90
91 1. Create a copy of `~/rhodecode-enterprise-ce/configs/development.ini`
91 1. Create a copy of `~/rhodecode-enterprise-ce/configs/development.ini`
92 2. Adjust the configuration settings to your needs
92 2. Adjust the configuration settings to your needs
93
93
94 .. note::
94 .. note::
95
95
96 It is recommended to use the name `dev.ini`.
96 It is recommended to use the name `dev.ini`.
97
97
98
98
99 Setup the Development Database
99 Setup the Development Database
100 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
100 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
101
101
102 To create a development database, use the following example. This is a one
102 To create a development database, use the following example. This is a one
103 time operation::
103 time operation::
104
104
105 paster setup-rhodecode dev.ini \
105 paster setup-rhodecode dev.ini \
106 --user=admin --password=secret \
106 --user=admin --password=secret \
107 --email=admin@example.com \
107 --email=admin@example.com \
108 --repos=~/my_dev_repos
108 --repos=~/my_dev_repos
109
109
110
110
111 Compile CSS and JavaScript
112 ^^^^^^^^^^^^^^^^^^^^^^^^^^
113
114 To use the application's frontend, you will need to compile the CSS and
115 JavaScript with Grunt. This is easily done from within the nix-shell using the
116 following command::
117
118 make web-build
119
120 You will need to recompile following any changes made to the CSS or JavaScript
121 files.
122
123
111 Start the Development Server
124 Start the Development Server
112 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
125 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
113
126
114 When starting the development server, you should start the vcsserver as a
127 From the rhodecode-vcsserver directory, start the development server in another
115 separate process. To do this, use one of the following examples:
128 nix-shell, using the following command::
116
129
117 1. Set the `start.vcs_server` flag in the ``dev.ini`` file to true. For example:
130 pserve configs/development.ini http_port=9900
118
131
119 .. code-block:: python
132 In the adjacent nix-shell which you created for your development server, you may
133 now start CE with the following command::
120
134
121 ### VCS CONFIG ###
122 ##################
123 vcs.start_server = true
124 vcs.server = localhost:9900
125 vcs.server.log_level = debug
126
135
127 Then start the server using the following command: ``rcserver dev.ini``
136 rcserver dev.ini
128
137
129 2. Start the development server using the following example::
138 .. note::
130
131 rcserver --with-vcsserver dev.ini
132
139
133 3. Start the development server in a different terminal using the following
140 To automatically refresh - and recompile the frontend assets - when changes
134 example::
141 are made in the source code, you can use the option `--reload`.
135
136 vcsserver
137
142
138
143
139 Run the Environment Tests
144 Run the Environment Tests
140 ^^^^^^^^^^^^^^^^^^^^^^^^^
145 ^^^^^^^^^^^^^^^^^^^^^^^^^
141
146
142 Please make sure that the tests are passing to verify that your environment is
147 Please make sure that the tests are passing to verify that your environment is
143 set up correctly. RhodeCode uses py.test to run tests.
148 set up correctly. RhodeCode uses py.test to run tests.
144 Please simply run ``make test`` to run the basic test suite.
149 While your instance is running, start a new nix-shell and simply run
150 ``make test`` to run the basic test suite.
151
152
153 Need Help?
154 ^^^^^^^^^^
155
156 Join us on Slack via https://rhodecode.com/join or post questions in our
157 Community Portal at https://community.rhodecode.com
@@ -1,111 +1,108 b''
1
1
2 =======================
2 =======================
3 Contributing Overview
3 Contributing Overview
4 =======================
4 =======================
5
5
6
6
7 RhodeCode Community Edition is an open source code management platform. We
7 RhodeCode Community Edition is an open source code management platform. We
8 encourage contributions to our project from the community. This is a basic
8 encourage contributions to our project from the community. This is a basic
9 overview of the procedures for adding your contribution to RhodeCode.
9 overview of the procedures for adding your contribution to RhodeCode.
10
10
11
11
12
12
13 Check the Issue Tracker
13 Check the Issue Tracker
14 =======================
14 =======================
15
15
16 Make an account at https://issues.rhodecode.com/account/register and browse the
16 Make an account at https://issues.rhodecode.com/account/register and browse the
17 current tickets for bugs to fix and tasks to do. Have a bug or feature that you
17 current tickets for bugs to fix and tasks to do. Have a bug or feature that you
18 can't find in the tracker? Create a new issue for it. When you select a ticket,
18 can't find in the tracker? Create a new issue for it. When you select a ticket,
19 make sure to assign it to yourself and mark it "in progress" to avoid duplicated
19 make sure to assign it to yourself and mark it "in progress" to avoid duplicated
20 work.
20 work.
21
21
22
22
23
23
24 Sign Up at code.rhodecode.com
24 Sign Up at code.rhodecode.com
25 =============================
25 =============================
26
26
27 Make an account at https://code.rhodecode.com/ using an email or your existing
27 Make an account at https://code.rhodecode.com/ using an email or your existing
28 GitHub, Bitbucket, Google, or Twitter account. Fork the repo you'd like to
28 GitHub, Bitbucket, Google, or Twitter account. Fork the repo you'd like to
29 contribute to; we suggest adding your username to the fork name. Clone your fork
29 contribute to; we suggest adding your username to the fork name. Clone your fork
30 to your computer. We use Mercurial for source control management; see
30 to your computer. We use Mercurial for source control management; see
31 https://www.mercurial-scm.org/guide to get started quickly.
31 https://www.mercurial-scm.org/guide to get started quickly.
32
32
33
33
34
34
35 Set Up A Local Instance
35 Set Up A Local Instance
36 =======================
36 =======================
37
37
38 You will need to set up an instance of RhodeCode CE using VCSServer so that you
38 You will need to set up an instance of RhodeCode CE using VCSServer so that you
39 can see your work locally as you make changes. We recommend using Linux for this
39 can see your work locally as you make changes. We recommend using Linux for this
40 but it can also be built on OSX.
40 but it can also be built on OSX.
41
41
42 See :doc:`dev-setup` for instructions.
42 See :doc:`dev-setup` for instructions.
43
43
44
44
45
45
46 Code!
46 Code!
47 =====
47 =====
48
48
49 You can now make, see, and test your changes locally. We are always improving to
49 You can now make, see, and test your changes locally. We are always improving to
50 keep our code clean and the cost of maintaining it low. This applies in the same
50 keep our code clean and the cost of maintaining it low. This applies in the same
51 way for contributions. We run automated checks on our pull requests, and expect
51 way for contributions. We run automated checks on our pull requests, and expect
52 understandable code. We also aim to provide test coverage for as much of our
52 understandable code. We also aim to provide test coverage for as much of our
53 codebase as possible; any new features should be augmented with tests.
53 codebase as possible; any new features should be augmented with tests.
54
54
55 Keep in mind that when we accept your contribution, we also take responsibility
55 Keep in mind that when we accept your contribution, we also take responsibility
56 for it; we must understand it to take on that responsibility.
56 for it; we must understand it to take on that responsibility.
57
57
58 See :doc:`standards` for more detailed information.
58 See :doc:`standards` for more detailed information.
59
59
60
60
61
61
62 Commit And Push Your Changes
62 Commit And Push Your Changes
63 ============================
63 ============================
64
64
65 We highly recommend making a new bookmark for each feature, bug, or set of
65 We highly recommend making a new bookmark for each feature, bug, or set of
66 commits you make so that you can point to it when creating your pull request.
66 commits you make so that you can point to it when creating your pull request.
67 Please also reference the ticket number in your commit messages. Don't forget to
67 Please also reference the ticket number in your commit messages. Don't forget to
68 push the bookmark!
68 push the bookmark!
69
69
70
70
71
71
72 Submit a Pull Request
72 Submit a Pull Request
73 =====================
73 =====================
74
74
75 Go to your fork, and choose "Create Pull Request" from the Options menu. Use
75 Go to your fork, and choose "Create Pull Request" from the Options menu. Use
76 your bookmark as the source, and choose someone to review it. Don't worry about
76 your bookmark as the source, and choose someone to review it. Don't worry about
77 chosing the right person; we'll assign the best contributor for the job. You'll
77 chosing the right person; we'll assign the best contributor for the job. You'll
78 get feedback and an assigned status.
78 get feedback and an assigned status.
79
79
80 Be prepared to make updates to your pull request after some feedback.
80 Be prepared to make updates to your pull request after some feedback.
81 Collaboration is part of the process and improvements can often be made.
81 Collaboration is part of the process and improvements can often be made.
82
82
83
83
84
84
85 Sign the Contributor License Agreement
85 Sign the Contributor License Agreement
86 ======================================
86 ======================================
87
87
88 If your contribution is approved, you will need to virtually sign the license
88 If your contribution is approved, you will need to virtually sign the license
89 agreement in order for it to be merged into the project's codebase. You can read
89 agreement in order for it to be merged into the project's codebase.
90 it on our website here: https://rhodecode.com/static/pdf/RhodeCode-CLA.pdf
91
90
92 To sign, go to code.rhodecode.com
91 You can read it on our website at https://rhodecode.com/rhodecode-cla
93 and clone the CLA repository. Add your name and make a pull request to add it to
92
94 the contributor agreement; this serves as your virtual signature. Once your
93 To sign electronically, go to https://rhodecode.com/sign-cla
95 signature is merged, add a link to the relevant commit to your contribution
96 pull request.
97
94
98
95
99
96
100 That's it! We'll take it from there. Thanks for your contribution!
97 That's it! We'll take it from there. Thanks for your contribution!
101 ------------------------------------------------------------------
98 ------------------------------------------------------------------
102
99
103 .. note:: If you have any questions or comments, feel free to contact us through
100 .. note:: If you have any questions or comments, feel free to contact us through
104 either the community portal(community.rhodecode.com), IRC
101 either the community portal(community.rhodecode.com), IRC
105 (irc.freenode.net), or Slack (rhodecode.com/join).
102 (irc.freenode.net), or Slack (rhodecode.com/join).
106
103
107
104
108
105
109
106
110
107
111
108
@@ -1,134 +1,144 b''
1 { system ? builtins.currentSystem
1 { system ? builtins.currentSystem
2 }:
2 }:
3
3
4 let
4 let
5
5
6 pkgs = import <nixpkgs> { inherit system; };
6 pkgs = import <nixpkgs> { inherit system; };
7
7
8 inherit (pkgs) fetchurl fetchgit;
8 inherit (pkgs) fetchurl fetchgit;
9
9
10 buildPythonPackage = pkgs.python27Packages.buildPythonPackage;
10 buildPythonPackage = pkgs.python27Packages.buildPythonPackage;
11 python = pkgs.python27Packages.python;
11 python = pkgs.python27Packages.python;
12
12
13 Jinja2 = buildPythonPackage rec {
13 Jinja2 = buildPythonPackage rec {
14 name = "Jinja2-2.7.3";
14 name = "Jinja2-2.7.3";
15 src = fetchurl {
15 src = fetchurl {
16 url = "http://pypi.python.org/packages/source/J/Jinja2/${name}.tar.gz";
16 url = "http://pypi.python.org/packages/source/J/Jinja2/${name}.tar.gz";
17 md5 = "b9dffd2f3b43d673802fe857c8445b1a";
17 md5 = "b9dffd2f3b43d673802fe857c8445b1a";
18 };
18 };
19 propagatedBuildInputs = [ MarkupSafe ];
19 propagatedBuildInputs = [ MarkupSafe ];
20 };
20 };
21
21
22 MarkupSafe = buildPythonPackage rec {
22 MarkupSafe = buildPythonPackage rec {
23 name = "MarkupSafe-0.23";
23 name = "MarkupSafe-0.23";
24 src = fetchurl {
24 src = fetchurl {
25 url = "https://pypi.python.org/packages/source/M/MarkupSafe/${name}.tar.gz";
25 url = "https://pypi.python.org/packages/source/M/MarkupSafe/${name}.tar.gz";
26 md5 = "f5ab3deee4c37cd6a922fb81e730da6e";
26 md5 = "f5ab3deee4c37cd6a922fb81e730da6e";
27 };
27 };
28 };
28 };
29
29
30 Pygments = buildPythonPackage rec {
30 Pygments = buildPythonPackage rec {
31 name = "Pygments-2.0.2";
31 name = "Pygments-2.1.3";
32 doCheck = false;
32 src = fetchurl {
33 src = fetchurl {
33 url = "https://pypi.python.org/packages/source/P/Pygments/${name}.tar.gz";
34 url = "https://pypi.python.org/packages/b8/67/ab177979be1c81bc99c8d0592ef22d547e70bb4c6815c383286ed5dec504/Pygments-2.1.3.tar.gz";
34 md5 = "238587a1370d62405edabd0794b3ec4a";
35 md5 = "ed3fba2467c8afcda4d317e4ef2c6150";
35 };
36 };
36 };
37 };
37
38
38 alabaster = buildPythonPackage rec {
39 alabaster = buildPythonPackage rec {
39 name = "alabaster-0.7.3";
40 name = "alabaster-0.7.3";
40 src = fetchurl {
41 src = fetchurl {
41 url = "https://pypi.python.org/packages/source/a/alabaster/${name}.tar.gz";
42 url = "https://pypi.python.org/packages/source/a/alabaster/${name}.tar.gz";
42 md5 = "67428d1383fd833f1282fed5deba0898";
43 md5 = "67428d1383fd833f1282fed5deba0898";
43 };
44 };
44 };
45 };
45
46
46 six = buildPythonPackage rec {
47 six = buildPythonPackage rec {
47 name = "six-1.9.0";
48 name = "six-1.9.0";
48 src = fetchurl {
49 src = fetchurl {
49 url = "https://pypi.python.org/packages/source/s/six/${name}.tar.gz";
50 url = "https://pypi.python.org/packages/source/s/six/${name}.tar.gz";
50 md5 = "476881ef4012262dfc8adc645ee786c4";
51 md5 = "476881ef4012262dfc8adc645ee786c4";
51 };
52 };
52 };
53 };
53
54
54 snowballstemmer = buildPythonPackage rec {
55 snowballstemmer = buildPythonPackage rec {
55 name = "snowballstemmer-1.2.0";
56 name = "snowballstemmer-1.2.0";
56 src = fetchurl {
57 src = fetchurl {
57 url = "https://pypi.python.org/packages/source/s/snowballstemmer/${name}.tar.gz";
58 url = "https://pypi.python.org/packages/source/s/snowballstemmer/${name}.tar.gz";
58 md5 = "51f2ef829db8129dd0f2354f0b209970";
59 md5 = "51f2ef829db8129dd0f2354f0b209970";
59 };
60 };
60 };
61 };
61
62
62 pytz = buildPythonPackage rec {
63 pytz = buildPythonPackage rec {
63 name = "pytz-2015.2";
64 name = "pytz-2015.2";
64 src = fetchurl {
65 src = fetchurl {
65 url = "https://pypi.python.org/packages/source/p/pytz/${name}.tar.gz";
66 url = "https://pypi.python.org/packages/source/p/pytz/${name}.tar.gz";
66 md5 = "08440d994cfbbf13d3343362cc3173f7";
67 md5 = "08440d994cfbbf13d3343362cc3173f7";
67 };
68 };
68 };
69 };
69
70
70 babel = buildPythonPackage rec {
71 babel = buildPythonPackage rec {
71 name = "Babel-1.3";
72 name = "Babel-1.3";
72 src = fetchurl {
73 src = fetchurl {
73 url = "https://pypi.python.org/packages/source/B/Babel/${name}.tar.gz";
74 url = "https://pypi.python.org/packages/source/B/Babel/${name}.tar.gz";
74 md5 = "5264ceb02717843cbc9ffce8e6e06bdb";
75 md5 = "5264ceb02717843cbc9ffce8e6e06bdb";
75 };
76 };
76 propagatedBuildInputs = [
77 propagatedBuildInputs = [
77 pytz
78 pytz
78 ];
79 ];
79 };
80 };
80
81
81 Sphinx = buildPythonPackage (rec {
82 imagesize = buildPythonPackage rec {
82 name = "Sphinx-1.3.1";
83 name = "imagesize-0.7.1";
83 src = fetchurl {
84 src = fetchurl {
84 url = "http://pypi.python.org/packages/source/S/Sphinx/${name}.tar.gz";
85 url = "https://pypi.python.org/packages/53/72/6c6f1e787d9cab2cc733cf042f125abec07209a58308831c9f292504e826/${name}.tar.gz";
85 md5 = "8786a194acf9673464c5455b11fd4332";
86 md5 = "976148283286a6ba5f69b0f81aef8052";
87 };
88 };
89
90 Sphinx = buildPythonPackage (rec {
91 name = "Sphinx-1.4.4";
92 src = fetchurl {
93 url = "https://pypi.python.org/packages/20/a2/72f44c84f6c4115e3fef58d36d657ec311d80196eab9fd5ec7bcde76143b/${name}.tar.gz";
94 md5 = "64ce2ec08d37ed56313a98232cbe2aee";
86 };
95 };
87 propagatedBuildInputs = [
96 propagatedBuildInputs = [
88 docutils
97 docutils
89 Jinja2
98 Jinja2
90 Pygments
99 Pygments
91 alabaster
100 alabaster
92 six
101 six
93 snowballstemmer
102 snowballstemmer
94 pytz
103 pytz
95 babel
104 babel
105 imagesize
96
106
97 # TODO: johbo: Had to include it here so that can be imported
107 # TODO: johbo: Had to include it here so that can be imported
98 sphinx_rtd_theme
108 sphinx_rtd_theme
99 ];
109 ];
100 });
110 });
101
111
102 docutils = buildPythonPackage rec {
112 docutils = buildPythonPackage rec {
103 name = "docutils-0.12";
113 name = "docutils-0.12";
104 src = fetchurl {
114 src = fetchurl {
105 url = "https://pypi.python.org/packages/source/d/docutils/${name}.tar.gz";
115 url = "https://pypi.python.org/packages/source/d/docutils/${name}.tar.gz";
106 md5 = "4622263b62c5c771c03502afa3157768";
116 md5 = "4622263b62c5c771c03502afa3157768";
107 };
117 };
108 };
118 };
109
119
110 sphinx_rtd_theme = buildPythonPackage rec {
120 sphinx_rtd_theme = buildPythonPackage rec {
111 name = "sphinx_rtd_theme-0.1.9";
121 name = "sphinx_rtd_theme-0.1.9";
112 src = fetchurl {
122 src = fetchurl {
113 url = "https://pypi.python.org/packages/source/s/sphinx_rtd_theme/${name}.tar.gz";
123 url = "https://pypi.python.org/packages/source/s/sphinx_rtd_theme/${name}.tar.gz";
114 md5 = "86a25c8d47147c872e42dc84cc66f97b";
124 md5 = "86a25c8d47147c872e42dc84cc66f97b";
115 };
125 };
116
126
117 # Note: johbo: Sphinx needs this package and this package needs sphinx,
127 # Note: johbo: Sphinx needs this package and this package needs sphinx,
118 # ignore the requirements file to solve this cycle.
128 # ignore the requirements file to solve this cycle.
119 postPatch = ''
129 postPatch = ''
120 rm requirements.txt
130 rm requirements.txt
121 touch requirements.txt
131 touch requirements.txt
122 '';
132 '';
123
133
124 # TODO: johbo: Tests would require sphinx and this creates recursion issues
134 # TODO: johbo: Tests would require sphinx and this creates recursion issues
125 doCheck = false;
135 doCheck = false;
126 };
136 };
127
137
128 in python.buildEnv.override {
138 in python.buildEnv.override {
129 inherit python;
139 inherit python;
130 extraLibs = [
140 extraLibs = [
131 Sphinx
141 Sphinx
132 sphinx_rtd_theme
142 sphinx_rtd_theme
133 ];
143 ];
134 }
144 }
1 NO CONTENT: file renamed from docs/integrations/config-ext.rst to docs/extensions/config-ext.rst
NO CONTENT: file renamed from docs/integrations/config-ext.rst to docs/extensions/config-ext.rst
1 NO CONTENT: file renamed from docs/integrations/example-ext.py to docs/extensions/example-ext.py
NO CONTENT: file renamed from docs/integrations/example-ext.py to docs/extensions/example-ext.py
1 NO CONTENT: file renamed from docs/integrations/extensions.rst to docs/extensions/extensions.rst
NO CONTENT: file renamed from docs/integrations/extensions.rst to docs/extensions/extensions.rst
1 NO CONTENT: file renamed from docs/integrations/full-blown-example.rst to docs/extensions/full-blown-example.rst
NO CONTENT: file renamed from docs/integrations/full-blown-example.rst to docs/extensions/full-blown-example.rst
1 NO CONTENT: file renamed from docs/integrations/hooks.rst to docs/extensions/hooks.rst
NO CONTENT: file renamed from docs/integrations/hooks.rst to docs/extensions/hooks.rst
1 NO CONTENT: file renamed from docs/integrations/install-ext.rst to docs/extensions/install-ext.rst
NO CONTENT: file renamed from docs/integrations/install-ext.rst to docs/extensions/install-ext.rst
1 NO CONTENT: file renamed from docs/integrations/int-slack.rst to docs/extensions/int-slack.rst
NO CONTENT: file renamed from docs/integrations/int-slack.rst to docs/extensions/int-slack.rst
1 NO CONTENT: file renamed from docs/integrations/rcx.rst to docs/extensions/rcx.rst
NO CONTENT: file renamed from docs/integrations/rcx.rst to docs/extensions/rcx.rst
@@ -1,84 +1,85 b''
1 |RCM|
1 |RCM|
2 =====
2 =====
3
3
4 |RCM| is a high-performance source code management and collaboration system.
4 |RCM| is a high-performance source code management and collaboration system.
5 It enables you to develop projects securely behind the firewall while
5 It enables you to develop projects securely behind the firewall while
6 providing collaboration tools that work with |git|, |hg|,
6 providing collaboration tools that work with |git|, |hg|,
7 and |svn| |repos|. The user interface allows you to create, edit,
7 and |svn| |repos|. The user interface allows you to create, edit,
8 and commit files and |repos| while managing their security permissions.
8 and commit files and |repos| while managing their security permissions.
9
9
10 |RCM| provides the following features:
10 |RCM| provides the following features:
11
11
12 * Source code management.
12 * Source code management.
13 * Extended permissions management.
13 * Extended permissions management.
14 * Integrated code collaboration tools.
14 * Integrated code collaboration tools.
15 * Integrated code review and notifications.
15 * Integrated code review and notifications.
16 * Scalability provided by multi-node setup.
16 * Scalability provided by multi-node setup.
17 * Fully programmable automation API.
17 * Fully programmable automation API.
18 * Web-based hook management.
18 * Web-based hook management.
19 * Native |svn| support.
19 * Native |svn| support.
20 * Migration from existing databases.
20 * Migration from existing databases.
21 * |RCM| SDK.
21 * |RCM| SDK.
22 * Built-in analytics
22 * Built-in analytics
23 * Pluggable authentication system.
23 * Pluggable authentication system.
24 * Support for |LDAP|, Crowd, CAS, PAM.
24 * Support for |LDAP|, Crowd, CAS, PAM.
25 * Debug modes of operation.
25 * Debug modes of operation.
26 * Private and public gists.
26 * Private and public gists.
27 * Gists with limited lifetimes and within instance only sharing.
27 * Gists with limited lifetimes and within instance only sharing.
28 * Fully integrated code search function.
28 * Fully integrated code search function.
29 * Always on SSL connectivity.
29 * Always on SSL connectivity.
30
30
31 .. only:: html
31 .. only:: html
32
32
33 Table of Contents
33 Table of Contents
34 -----------------
34 -----------------
35
35
36 .. toctree::
36 .. toctree::
37 :maxdepth: 1
37 :maxdepth: 1
38 :caption: Admin Documentation
38 :caption: Admin Documentation
39
39
40 install/quick-start
40 install/quick-start
41 install/install-database
41 install/install-database
42 install/install-steps
42 install/install-steps
43 admin/system-overview
43 admin/system-overview
44 nix/default-env
44 nix/default-env
45 admin/system-admin
45 admin/system-admin
46 admin/user-admin
46 admin/user-admin
47 admin/setting-repo-perms
47 admin/setting-repo-perms
48 admin/security-tips
48 admin/security-tips
49 auth/auth
49 auth/auth
50 issue-trackers/issue-trackers
50 issue-trackers/issue-trackers
51 admin/lab-settings
51 admin/lab-settings
52
52
53 .. toctree::
53 .. toctree::
54 :maxdepth: 1
54 :maxdepth: 1
55 :caption: Feature Documentation
55 :caption: Feature Documentation
56
56
57 collaboration/collaboration
57 collaboration/collaboration
58 collaboration/review-notifications
58 collaboration/review-notifications
59 collaboration/pull-requests
59 collaboration/pull-requests
60 code-review/code-review
60 code-review/code-review
61 integrations/integrations
61
62
62 .. toctree::
63 .. toctree::
63 :maxdepth: 1
64 :maxdepth: 1
64 :caption: Developer Documentation
65 :caption: Developer Documentation
65
66
66 api/api
67 api/api
67 tools/rhodecode-tools
68 tools/rhodecode-tools
68 integrations/integrations
69 extensions/extensions-hooks
69 contributing/contributing
70 contributing/contributing
70
71
71 .. toctree::
72 .. toctree::
72 :maxdepth: 1
73 :maxdepth: 1
73 :caption: User Documentation
74 :caption: User Documentation
74
75
75 usage/basic-usage
76 usage/basic-usage
76 tutorials/tutorials
77 tutorials/tutorials
77
78
78 .. toctree::
79 .. toctree::
79 :maxdepth: 1
80 :maxdepth: 1
80 :caption: About
81 :caption: About
81
82
82 known-issues/known-issues
83 known-issues/known-issues
83 release-notes/release-notes
84 release-notes/release-notes
84 admin/glossary
85 admin/glossary
@@ -1,109 +1,109 b''
1 .. _quick-start:
1 .. _quick-start:
2
2
3 Quick Start Guide
3 Quick Start Installation Guide
4 =================
4 ==============================
5
5
6 .. important::
6 .. important::
7
7
8 These are quick start instructions. To optimize your |RCE|,
8 These are quick start instructions. To optimize your |RCE|,
9 |RCC|, and |RCT| usage, read the more detailed instructions in our guides.
9 |RCC|, and |RCT| usage, read the more detailed instructions in our guides.
10 For detailed installation instructions, see
10 For detailed installation instructions, see
11 :ref:`RhodeCode Control Documentation <control:rcc>`
11 :ref:`RhodeCode Control Documentation <control:rcc>`
12
12
13 .. tip::
13 .. tip::
14
14
15 If using a non-SQLite database, install and configure the database, create
15 If using a non-SQLite database, install and configure the database, create
16 a new user, and grant permissions. You will be prompted for this user's
16 a new user, and grant permissions. You will be prompted for this user's
17 credentials during |RCE| installation. See the relevant database
17 credentials during |RCE| installation. See the relevant database
18 documentation for more details.
18 documentation for more details.
19
19
20 To get |RCE| up and running, run through the below steps:
20 To get |RCE| up and running, run through the below steps:
21
21
22 1. Download the latest |RCC| installer from your `rhodecode.com`_ profile
22 1. Download the latest |RCC| installer from your `rhodecode.com`_ profile
23 or main page.
23 or main page.
24 If you don't have an account, sign up at `rhodecode.com/register`_.
24 If you don't have an account, sign up at `rhodecode.com/register`_.
25
25
26 2. Run the |RCC| installer and accept the End User Licence using the
26 2. Run the |RCC| installer and accept the End User Licence using the
27 following example:
27 following example:
28
28
29 .. code-block:: bash
29 .. code-block:: bash
30
30
31 $ chmod 755 RhodeCode-installer-linux-*
31 $ chmod 755 RhodeCode-installer-linux-*
32 $ ./RhodeCode-installer-linux-*
32 $ ./RhodeCode-installer-linux-*
33
33
34 3. Install a VCS Server, and configure it to start at boot.
34 3. Install a VCS Server, and configure it to start at boot.
35
35
36 .. code-block:: bash
36 .. code-block:: bash
37
37
38 $ rccontrol install VCSServer
38 $ rccontrol install VCSServer
39
39
40 Agree to the licence agreement? [y/N]: y
40 Agree to the licence agreement? [y/N]: y
41 IP to start the server on [127.0.0.1]:
41 IP to start the server on [127.0.0.1]:
42 Port for the server to start [10005]:
42 Port for the server to start [10005]:
43 Creating new instance: vcsserver-1
43 Creating new instance: vcsserver-1
44 Installing RhodeCode VCSServer
44 Installing RhodeCode VCSServer
45 Configuring RhodeCode VCS Server ...
45 Configuring RhodeCode VCS Server ...
46 Supervisord state is: RUNNING
46 Supervisord state is: RUNNING
47 Added process group vcsserver-1
47 Added process group vcsserver-1
48
48
49
49
50 4. Install |RCEE| or |RCCE|. If using MySQL or PostgreSQL, during
50 4. Install |RCEE| or |RCCE|. If using MySQL or PostgreSQL, during
51 installation you'll be asked for your database credentials, so have them at hand.
51 installation you'll be asked for your database credentials, so have them at hand.
52 Mysql or Postgres needs to be running and a new database needs to be created.
52 Mysql or Postgres needs to be running and a new database needs to be created.
53 You don't need any credentials or to create a database for SQLite.
53 You don't need any credentials or to create a database for SQLite.
54
54
55 .. code-block:: bash
55 .. code-block:: bash
56 :emphasize-lines: 11-16
56 :emphasize-lines: 11-16
57
57
58 $ rccontrol install Community
58 $ rccontrol install Community
59
59
60 or
60 or
61
61
62 $ rccontrol install Enterprise
62 $ rccontrol install Enterprise
63
63
64 Username [admin]: username
64 Username [admin]: username
65 Password (min 6 chars):
65 Password (min 6 chars):
66 Repeat for confirmation:
66 Repeat for confirmation:
67 Email: your@mail.com
67 Email: your@mail.com
68 Respositories location [/home/brian/repos]:
68 Respositories location [/home/brian/repos]:
69 IP to start the Enterprise server on [127.0.0.1]:
69 IP to start the Enterprise server on [127.0.0.1]:
70 Port for the Enterprise server to use [10004]:
70 Port for the Enterprise server to use [10004]:
71 Database type - [s]qlite, [m]ysql, [p]ostresql:
71 Database type - [s]qlite, [m]ysql, [p]ostresql:
72 PostgreSQL selected
72 PostgreSQL selected
73 Database host [127.0.0.1]:
73 Database host [127.0.0.1]:
74 Database port [5432]:
74 Database port [5432]:
75 Database username: db-user-name
75 Database username: db-user-name
76 Database password: somepassword
76 Database password: somepassword
77 Database name: example-db-name
77 Database name: example-db-name
78
78
79 5. Check the status of your installation. You |RCEE|/|RCCE| instance runs
79 5. Check the status of your installation. You |RCEE|/|RCCE| instance runs
80 on the URL displayed in the status message.
80 on the URL displayed in the status message.
81
81
82 .. code-block:: bash
82 .. code-block:: bash
83
83
84 $ rccontrol status
84 $ rccontrol status
85
85
86 - NAME: enterprise-1
86 - NAME: enterprise-1
87 - STATUS: RUNNING
87 - STATUS: RUNNING
88 - TYPE: Enterprise
88 - TYPE: Enterprise
89 - VERSION: 4.1.0
89 - VERSION: 4.1.0
90 - URL: http://127.0.0.1:10003
90 - URL: http://127.0.0.1:10003
91
91
92 - NAME: vcsserver-1
92 - NAME: vcsserver-1
93 - STATUS: RUNNING
93 - STATUS: RUNNING
94 - TYPE: VCSServer
94 - TYPE: VCSServer
95 - VERSION: 4.1.0
95 - VERSION: 4.1.0
96 - URL: http://127.0.0.1:10001
96 - URL: http://127.0.0.1:10001
97
97
98 .. note::
98 .. note::
99
99
100 Recommended post quick start install instructions:
100 Recommended post quick start install instructions:
101
101
102 * Read the documentation
102 * Read the documentation
103 * Carry out the :ref:`rhodecode-post-instal-ref`
103 * Carry out the :ref:`rhodecode-post-instal-ref`
104 * Set up :ref:`indexing-ref`
104 * Set up :ref:`indexing-ref`
105 * Familiarise yourself with the :ref:`rhodecode-admin-ref` section.
105 * Familiarise yourself with the :ref:`rhodecode-admin-ref` section.
106
106
107 .. _rhodecode.com/download/: https://rhodecode.com/download/
107 .. _rhodecode.com/download/: https://rhodecode.com/download/
108 .. _rhodecode.com: https://rhodecode.com/
108 .. _rhodecode.com: https://rhodecode.com/
109 .. _rhodecode.com/register: https://rhodecode.com/register/
109 .. _rhodecode.com/register: https://rhodecode.com/register/
@@ -1,25 +1,52 b''
1 .. _integrations-ref:
1 .. _integrations:
2
3 Integrations
4 ------------
2
5
3 Integrations and Extensions
6 Rhodecode supports integrations with external services for various events,
4 ===========================
7 such as commit pushes and pull requests. Multiple integrations of the same type
8 can be added at the same time; this is useful for posting different events to
9 different Slack channels, for example.
5
10
6 The integrations section references three concepts regularly,
11 Supported integrations
7 so to clarify what is meant each time, read the following definitions:
12 ^^^^^^^^^^^^^^^^^^^^^^
8
13
9 * **Plugin**: A Plugin is software that adds a specific feature to
14 ============================ ============ =====================================
10 an existing software application.
15 Type/Name |RC| Edition Description
11 * **Extension**: An extension extends the capabilities of,
16 ============================ ============ =====================================
12 or the data available to, an existing software application.
17 :ref:`integrations-slack` |RCCEshort| https://slack.com/
13 * **Hook**: A hook intercepts function calls, messages, or events passed
18 :ref:`integrations-hipchat` |RCCEshort| https://www.hipchat.com/
14 between software components and can be used to trigger plugins, or their
19 :ref:`integrations-webhook` |RCCEshort| POST events as `json` to a custom url
15 extensions.
20 :ref:`integrations-email` |RCEEshort| Send repo push commits by email
21 :ref:`integrations-redmine` |RCEEshort| Close/Resolve/Reference redmine issues
22 :ref:`integrations-jira` |RCEEshort| Close/Resolve/Reference JIRA issues
23 ============================ ============ =====================================
24
25 .. _creating-integrations:
26
27 Creating an Integration
28 ^^^^^^^^^^^^^^^^^^^^^^^
29
30 Integrations can be added globally via the admin UI:
31
32 :menuselection:`Admin --> Integrations`
33
34 or per repository in each repository's settings:
35
36 :menuselection:`Admin --> Repositories --> Edit --> Integrations`
37
38 To create an integration, select the type from the list in the *Create New
39 Integration* section.
40
41 The *Current Integrations* section shows existing integrations that have been
42 created along with their type (eg. Slack) and enabled status.
43
44 See pages specific to each type of integration for more instructions:
16
45
17 .. toctree::
46 .. toctree::
18
47
19 rcx
48 slack
20 install-ext
49 hipchat
21 config-ext
50 redmine
22 extensions
51 jira
23 hooks
52 webhook
24 full-blown-example
25 int-slack
@@ -1,82 +1,81 b''
1 .. _rhodecode-issue-trackers-ref:
1 .. _rhodecode-issue-trackers-ref:
2
2
3 Issue Tracker Integration
3 Issue Tracker Integration
4 =========================
4 =========================
5
5
6 You can set an issue tracker connection in two ways with |RCE|.
6 You can set an issue tracker connection in two ways with |RCE|.
7
7
8 * At instance level you can set a default issue tracker.
8 * At the instance level, you can set a default issue tracker.
9 * At |repo| level you can configure an integration with a different issue
9 * At the |repo| level, you can configure an integration with a different issue
10 tracker.
10 tracker.
11
11
12 To integrate |RCM| with an issue tracker you need to define a regular
12 To integrate |RCM| with an issue tracker, you need to define a regular
13 expression that will fetch the issue ID stored in commit messages and replace
13 expression that will fetch the issue ID stored in commit messages, and replace
14 it with a URL. This enables |RCE| to generate a link matching each issue to the
14 it with a URL. This enables |RCE| to generate a link matching each issue to the
15 target |repo|.
15 target |repo|.
16
16
17 Default Issue Tracker Configuration
17 Default Issue Tracker Configuration
18 -----------------------------------
18 -----------------------------------
19
19
20 To integrate your issue tracker, use the following steps:
20 To integrate your issue tracker, use the following steps:
21
21
22 1. Open :menuselection:`Admin --> Settings --> Issue Tracker`.
22 1. Open :menuselection:`Admin --> Settings --> Issue Tracker`.
23 2. In the new entry field, enter the following information:
23 2. In the new entry field, enter the following information:
24
24
25 * :guilabel:`Description`: A name for this set of rules.
25 * :guilabel:`Description`: A name for this set of rules.
26 * :guilabel:`Pattern`: The regular expression that will match issues
26 * :guilabel:`Pattern`: The regular expression that will match issues
27 tagged in commit messages, or more see :ref:`issue-tr-eg-ref`.
27 tagged in commit messages, or more see :ref:`issue-tr-eg-ref`.
28 * :guilabel:`URL`: The URL to your issue tracker.
28 * :guilabel:`URL`: The URL to your issue tracker.
29 * :guilabel:`Prefix`: The prefix with which you want to mark issues.
29 * :guilabel:`Prefix`: The prefix with which you want to mark issues.
30
30
31 3. Select **Add** so save the rule to your issue tracker configuration.
31 3. Select **Add** so save the rule to your issue tracker configuration.
32
32
33 Repository Issue Tracker Configuration
33 Repository Issue Tracker Configuration
34 --------------------------------------
34 --------------------------------------
35
35
36 You can configure specific |repos| to use a different issue tracker if
36 You can configure specific |repos| to use a different issue tracker than the
37 you need to connect to a non-default one. See the instructions in
37 default one. See the instructions in :ref:`repo-it`
38 :ref:`repo-it`
39
38
40 .. _issue-tr-eg-ref:
39 .. _issue-tr-eg-ref:
41
40
42 Jira Integration
41 Jira Integration
43 ----------------
42 ----------------
44
43
45 * Regex = ``(?:^#|\s#)(\w+-\d+)``
44 * Regex = ``(?:^#|\s#)(\w+-\d+)``
46 * URL = ``https://myissueserver.com/issue/${id}``
45 * URL = ``https://myissueserver.com/issue/${id}``
47 * Issue Prefix = ``#``
46 * Issue Prefix = ``#``
48
47
49 Confluence (Wiki)
48 Confluence (Wiki)
50 -----------------
49 -----------------
51
50
52 * Regex = ``(?:conf-)([A-Z0-9]+)``
51 * Regex = ``(?:conf-)([A-Z0-9]+)``
53 * URL = ``https://example.atlassian.net/display/wiki/${id}/${repo_name}``
52 * URL = ``https://example.atlassian.net/display/wiki/${id}/${repo_name}``
54 * issue prefix = ``CONF-``
53 * issue prefix = ``CONF-``
55
54
56 Redmine Integration
55 Redmine Integration
57 -------------------
56 -------------------
58
57
59 * Regex = ``(issue-+\d+)``
58 * Regex = ``(issue-+\d+)``
60 * URL = ``https://myissueserver.com/redmine/issue/${id}``
59 * URL = ``https://myissueserver.com/redmine/issue/${id}``
61 * Issue Prefix = ``issue-``
60 * Issue Prefix = ``issue-``
62
61
63 Redmine (wiki)
62 Redmine (wiki)
64 --------------
63 --------------
65
64
66 * Regex = ``(?:wiki-)([a-zA-Z0-9]+)``
65 * Regex = ``(?:wiki-)([a-zA-Z0-9]+)``
67 * URL = ``https://example.com/redmine/projects/wiki/${repo_name}``
66 * URL = ``https://example.com/redmine/projects/wiki/${repo_name}``
68 * Issue prefix = ``Issue-``
67 * Issue prefix = ``Issue-``
69
68
70 Pivotal Tracker
69 Pivotal Tracker
71 ---------------
70 ---------------
72
71
73 * Regex = ``(?:pivot-)(?<project_id>\d+)-(?<story>\d+)``
72 * Regex = ``(?:pivot-)(?<project_id>\d+)-(?<story>\d+)``
74 * URL = ``https://www.pivotaltracker.com/s/projects/${project_id}/stories/${story}``
73 * URL = ``https://www.pivotaltracker.com/s/projects/${project_id}/stories/${story}``
75 * Issue prefix = ``Piv-``
74 * Issue prefix = ``Piv-``
76
75
77 Trello
76 Trello
78 ------
77 ------
79
78
80 * Regex = ``(?:trello-)(?<card_id>[a-zA-Z0-9]+)``
79 * Regex = ``(?:trello-)(?<card_id>[a-zA-Z0-9]+)``
81 * URL = ``https://trello.com/example.com/${card_id}``
80 * URL = ``https://trello.com/example.com/${card_id}``
82 * Issue prefix = ``Trello-``
81 * Issue prefix = ``Trello-``
@@ -1,14 +1,14 b''
1 |RCE| 4.2.1 |RNS|
1 |RCE| 4.2.1 |RNS|
2 -----------------
2 -----------------
3
3
4 Release Date
4 Release Date
5 ^^^^^^^^^^^^
5 ^^^^^^^^^^^^
6
6
7 - 2016-07-04
7 - 2016-07-04
8
8
9 Fixes
9 Fixes
10 ^^^^^
10 ^^^^^
11
11
12 - ui: fixed empty labels caused by missing translation of JS components
12 - UI: fixed empty labels caused by missing translation of JS components.
13 - login: fixed bad routing URL in comments when user is not logged in.
13 - Login: fixed bad routing URL in comments when user is not logged in.
14 - celery: make sure to run tasks in sync mode if connection to celery is lost.
14 - Celery: make sure to run tasks in sync mode if connection to celery is lost.
@@ -1,84 +1,85 b''
1 .. _rhodecode-release-notes-ref:
1 .. _rhodecode-release-notes-ref:
2
2
3 Release Notes
3 Release Notes
4 =============
4 =============
5
5
6 |RCE| 4.x Versions
6 |RCE| 4.x Versions
7 ------------------
7 ------------------
8
8
9 .. toctree::
9 .. toctree::
10 :maxdepth: 1
10 :maxdepth: 1
11
11
12 release-notes-4.3.0.rst
12 release-notes-4.2.1.rst
13 release-notes-4.2.1.rst
13 release-notes-4.2.0.rst
14 release-notes-4.2.0.rst
14 release-notes-4.1.2.rst
15 release-notes-4.1.2.rst
15 release-notes-4.1.1.rst
16 release-notes-4.1.1.rst
16 release-notes-4.1.0.rst
17 release-notes-4.1.0.rst
17 release-notes-4.0.1.rst
18 release-notes-4.0.1.rst
18 release-notes-4.0.0.rst
19 release-notes-4.0.0.rst
19
20
20 |RCE| 3.x Versions
21 |RCE| 3.x Versions
21 ------------------
22 ------------------
22
23
23 .. toctree::
24 .. toctree::
24 :maxdepth: 1
25 :maxdepth: 1
25
26
26 release-notes-3.8.4.rst
27 release-notes-3.8.4.rst
27 release-notes-3.8.3.rst
28 release-notes-3.8.3.rst
28 release-notes-3.8.2.rst
29 release-notes-3.8.2.rst
29 release-notes-3.8.1.rst
30 release-notes-3.8.1.rst
30 release-notes-3.8.0.rst
31 release-notes-3.8.0.rst
31 release-notes-3.7.1.rst
32 release-notes-3.7.1.rst
32 release-notes-3.7.0.rst
33 release-notes-3.7.0.rst
33 release-notes-3.6.1.rst
34 release-notes-3.6.1.rst
34 release-notes-3.6.0.rst
35 release-notes-3.6.0.rst
35 release-notes-3.5.2.rst
36 release-notes-3.5.2.rst
36 release-notes-3.5.1.rst
37 release-notes-3.5.1.rst
37 release-notes-3.5.0.rst
38 release-notes-3.5.0.rst
38 release-notes-3.4.1.rst
39 release-notes-3.4.1.rst
39 release-notes-3.4.0.rst
40 release-notes-3.4.0.rst
40 release-notes-3.3.4.rst
41 release-notes-3.3.4.rst
41 release-notes-3.3.3.rst
42 release-notes-3.3.3.rst
42 release-notes-3.3.2.rst
43 release-notes-3.3.2.rst
43 release-notes-3.3.1.rst
44 release-notes-3.3.1.rst
44 release-notes-3.3.0.rst
45 release-notes-3.3.0.rst
45 release-notes-3.2.3.rst
46 release-notes-3.2.3.rst
46 release-notes-3.2.2.rst
47 release-notes-3.2.2.rst
47 release-notes-3.2.1.rst
48 release-notes-3.2.1.rst
48 release-notes-3.2.0.rst
49 release-notes-3.2.0.rst
49 release-notes-3.1.1.rst
50 release-notes-3.1.1.rst
50 release-notes-3.1.0.rst
51 release-notes-3.1.0.rst
51 release-notes-3.0.2.rst
52 release-notes-3.0.2.rst
52 release-notes-3.0.1.rst
53 release-notes-3.0.1.rst
53 release-notes-3.0.0.rst
54 release-notes-3.0.0.rst
54
55
55 |RCE| 2.x Versions
56 |RCE| 2.x Versions
56 ------------------
57 ------------------
57
58
58 .. toctree::
59 .. toctree::
59 :maxdepth: 1
60 :maxdepth: 1
60
61
61 release-notes-2.2.8.rst
62 release-notes-2.2.8.rst
62 release-notes-2.2.7.rst
63 release-notes-2.2.7.rst
63 release-notes-2.2.6.rst
64 release-notes-2.2.6.rst
64 release-notes-2.2.5.rst
65 release-notes-2.2.5.rst
65 release-notes-2.2.4.rst
66 release-notes-2.2.4.rst
66 release-notes-2.2.3.rst
67 release-notes-2.2.3.rst
67 release-notes-2.2.2.rst
68 release-notes-2.2.2.rst
68 release-notes-2.2.1.rst
69 release-notes-2.2.1.rst
69 release-notes-2.2.0.rst
70 release-notes-2.2.0.rst
70 release-notes-2.1.0.rst
71 release-notes-2.1.0.rst
71 release-notes-2.0.2.rst
72 release-notes-2.0.2.rst
72 release-notes-2.0.1.rst
73 release-notes-2.0.1.rst
73 release-notes-2.0.0.rst
74 release-notes-2.0.0.rst
74
75
75 |RCE| 1.x Versions
76 |RCE| 1.x Versions
76 ------------------
77 ------------------
77
78
78 .. toctree::
79 .. toctree::
79 :maxdepth: 1
80 :maxdepth: 1
80
81
81 release-notes-1.7.2.rst
82 release-notes-1.7.2.rst
82 release-notes-1.7.1.rst
83 release-notes-1.7.1.rst
83 release-notes-1.7.0.rst
84 release-notes-1.7.0.rst
84 release-notes-1.6.0.rst
85 release-notes-1.6.0.rst
@@ -1,677 +1,677 b''
1 .. _tools-cli:
1 .. _tools-cli:
2
2
3 |RCT| CLI
3 |RCT| CLI
4 ---------
4 ---------
5
5
6 The commands available with |RCT| can be split into three categories:
6 The commands available with |RCT| can be split into three categories:
7
7
8 - Remotely executable commands that can be run from your local machine once you
8 - Remotely executable commands that can be run from your local machine once you
9 have your connection details to |RCE| configured.
9 have your connection details to |RCE| configured.
10 - Locally executable commands the can be run on the server to carry out
10 - Locally executable commands the can be run on the server to carry out
11 general maintenance.
11 general maintenance.
12 - Local configuration commands used to help set up your |RCT| configuration.
12 - Local configuration commands used to help set up your |RCT| configuration.
13
13
14
14
15 rhodecode-tools
15 rhodecode-tools
16 ---------------
16 ---------------
17
17
18 Use |RCT| to setup automation, run the indexer, and install extensions for
18 Use |RCT| to setup automation, run the indexer, and install extensions for
19 your |RCM| instances. Options:
19 your |RCM| instances. Options:
20
20
21 .. rst-class:: dl-horizontal
21 .. rst-class:: dl-horizontal
22
22
23 \ - -apihost <api_host>
23 \ - -apihost <api_host>
24 Set the API host value.
24 Set the API host value.
25
25
26 \ - -apikey <apikey_value>
26 \ - -apikey <apikey_value>
27 Set the API key value.
27 Set the API key value.
28
28
29 \-c, - -config <config_file>
29 \-c, - -config <config_file>
30 Create a configuration file. The default file is created
30 Create a configuration file. The default file is created
31 in ``~/.rhoderc``
31 in ``~/.rhoderc``
32
32
33 \ - -save-config
33 \ - -save-config
34 Save the configuration file.
34 Save the configuration file.
35
35
36 \ - -show-config
36 \ - -show-config
37 Show the current configuration values.
37 Show the current configuration values.
38
38
39 \ - -format {json,pretty}
39 \ - -format {json,pretty}
40 Set the formatted representation.
40 Set the formatted representation.
41
41
42 Example usage:
42 Example usage:
43
43
44 .. code-block:: bash
44 .. code-block:: bash
45
45
46 $ rhodecode-tools --apikey=key --apihost=http://rhodecode.server \
46 $ rhodecode-tools --apikey=key --apihost=http://rhodecode.server \
47 --save-config
47 --save-config
48
48
49 rhodecode-api
49 rhodecode-api
50 -------------
50 -------------
51
51
52 The |RC| API lets you connect to |RCE| and carry out management tasks from a
52 The |RC| API lets you connect to |RCE| and carry out management tasks from a
53 remote machine, for more information about the API, see the :ref:`api`. To
53 remote machine, for more information about the API, see the :ref:`api`. To
54 pass arguments on the command-line use the ``method:option`` syntax.
54 pass arguments on the command-line use the ``method:option`` syntax.
55
55
56 Example usage:
56 Example usage:
57
57
58 .. code-block:: bash
58 .. code-block:: bash
59
59
60 # Run the get_repos API call and sample output
60 # Run the get_repos API call and sample output
61 $ rhodecode-api --instance-name=enterprise-1 create_repo \
61 $ rhodecode-api --instance-name=enterprise-1 create_repo \
62 repo_name:brand-new repo_type:hg description:repo-desc
62 repo_name:brand-new repo_type:hg description:repo-desc
63
63
64 {
64 {
65 "error": null,
65 "error": null,
66 "id": 1110,
66 "id": 1110,
67 "result": {
67 "result": {
68 "msg": "Created new repository `brand-new`",
68 "msg": "Created new repository `brand-new`",
69 "success": true,
69 "success": true,
70 "task": null
70 "task": null
71 }
71 }
72 }
72 }
73
73
74 Options:
74 Options:
75
75
76 .. rst-class:: dl-horizontal
76 .. rst-class:: dl-horizontal
77
77
78 \ - -api-cache-only
78 \ - -api-cache-only
79 Requires a cache to be present when running this call
79 Requires a cache to be present when running this call
80
80
81 \ - -api-cache-rebuild
81 \ - -api-cache-rebuild
82 Replaces existing cached values with new ones from server
82 Replaces existing cached values with new ones from server
83
83
84 \ - -api-cache <PATH>
84 \ - -api-cache <PATH>
85 Use a special cache dir to read responses from instead of the server
85 Use a special cache dir to read responses from instead of the server
86
86
87 \ - -api-cert-verify
87 \ - -api-cert-verify
88 Verify the endpoint ssl certificate
88 Verify the endpoint ssl certificate
89
89
90 \ - -api-cert <PATH>
90 \ - -api-cert <PATH>
91 Path to alternate CA bundle.
91 Path to alternate CA bundle.
92
92
93 \ - -apihost <api_host>
93 \ - -apihost <api_host>
94 Set the API host value.
94 Set the API host value.
95
95
96 \ - -apikey <apikey_value>
96 \ - -apikey <apikey_value>
97 Set the API key value.
97 Set the API key value.
98
98
99 \ - -instance-name <instance-id>
99 \ - -instance-name <instance-id>
100 Set the instance name
100 Set the instance name
101
101
102 \-I, - -install-dir <DIR>
102 \-I, - -install-dir <DIR>
103 Location of application instances
103 Location of application instances
104
104
105 \-c, - -config <.rhoderc-file>
105 \-c, - -config <.rhoderc-file>
106 Location of the :file:`.rhoderc`
106 Location of the :file:`.rhoderc`
107
107
108 \-F, - -format {json,pretty}
108 \-F, - -format {json,pretty}
109 Set the formatted representation.
109 Set the formatted representation.
110
110
111 \-h, - -help
111 \-h, - -help
112 Show help messages.
112 Show help messages.
113
113
114 \-v, - -verbose
114 \-v, - -verbose
115 Enable verbose messaging
115 Enable verbose messaging
116
116
117 rhodecode-cleanup-gists
117 rhodecode-cleanup-gists
118 -----------------------
118 -----------------------
119
119
120 Use this to delete gists within |RCM|. Options:
120 Use this to delete gists within |RCM|. Options:
121
121
122 .. rst-class:: dl-horizontal
122 .. rst-class:: dl-horizontal
123
123
124 \-c, - -config <config_file>
124 \-c, - -config <config_file>
125 Set the file path to the configuration file. The default file is
125 Set the file path to the configuration file. The default file is
126 :file:`/home/{user}/.rhoderc`
126 :file:`/home/{user}/.rhoderc`
127
127
128 \ - -corrupted
128 \ - -corrupted
129 Remove gists with corrupted metadata.
129 Remove gists with corrupted metadata.
130
130
131 \ - -dont-ask
131 \ - -dont-ask
132 Remove gists without asking for confirmation.
132 Remove gists without asking for confirmation.
133
133
134 \-h, - -help
134 \-h, - -help
135 Show help messages. current configuration values.
135 Show help messages. current configuration values.
136
136
137 \ - -instance-name <instance-id>
137 \ - -instance-name <instance-id>
138 Set the instance name.
138 Set the instance name.
139
139
140 \-R, - -repo-dir
140 \-R, - -repo-dir
141 Set the repository file path.
141 Set the repository file path.
142
142
143 \ - -version
143 \ - -version
144 Display your |RCT| version.
144 Display your |RCT| version.
145
145
146 Example usage:
146 Example usage:
147
147
148 .. code-block:: bash
148 .. code-block:: bash
149
149
150 # Clean up gists related to an instance
150 # Clean up gists related to an instance
151 $ rhodecode-cleanup-gists --instance-name=enterprise-1
151 $ rhodecode-cleanup-gists --instance-name=enterprise-1
152 Scanning for gists in /home/brian/repos/.rc_gist_store...
152 Scanning for gists in /home/brian/repos/.rc_gist_store...
153 preparing to remove [3] found gists
153 preparing to remove [3] found gists
154
154
155 # Clean up corrupted gists in an instance
155 # Clean up corrupted gists in an instance
156 $ rhodecode-cleanup-gists --instance-name=enterprise-1 --corrupted
156 $ rhodecode-cleanup-gists --instance-name=enterprise-1 --corrupted
157 Scanning for gists in /home/brian/repos/.rc_gist_store...
157 Scanning for gists in /home/brian/repos/.rc_gist_store...
158 preparing to remove [2] found gists
158 preparing to remove [2] found gists
159 the following gists will be archived:
159 the following gists will be archived:
160 * EXPIRED: BAD METADATA | /home/brian/repos/.rc_gist_store/5
160 * EXPIRED: BAD METADATA | /home/brian/repos/.rc_gist_store/5
161 * EXPIRED: BAD METADATA | /home/brian/repos/.rc_gist_store/8FtC
161 * EXPIRED: BAD METADATA | /home/brian/repos/.rc_gist_store/8FtC
162 are you sure you want to archive them? [y/N]: y
162 are you sure you want to archive them? [y/N]: y
163 removing gist /home/brian/repos/.rc_gist_store/5
163 removing gist /home/brian/repos/.rc_gist_store/5
164 removing gist /home/brian/repos/.rc_gist_store/8FtCKdcbRKmEvRzTVsEt
164 removing gist /home/brian/repos/.rc_gist_store/8FtCKdcbRKmEvRzTVsEt
165
165
166 rhodecode-cleanup-repos
166 rhodecode-cleanup-repos
167 -----------------------
167 -----------------------
168
168
169 Use this to manage |repos| and |repo| groups within |RCM|. Options:
169 Use this to manage |repos| and |repo| groups within |RCM|. Options:
170
170
171 .. rst-class:: dl-horizontal
171 .. rst-class:: dl-horizontal
172
172
173 \-c, - -config <config_file>
173 \-c, - -config <config_file>
174 Set the file path to the configuration file. The default file is
174 Set the file path to the configuration file. The default file is
175 :file:`/home/{user}/.rhoderc`.
175 :file:`/home/{user}/.rhoderc`.
176
176
177 \-h, - -help
177 \-h, - -help
178 Show help messages. current configuration values.
178 Show help messages. current configuration values.
179
179
180 \ - -interactive
180 \ - -interactive
181 Enable an interactive prompt for each repository when deleting.
181 Enable an interactive prompt for each repository when deleting.
182
182
183 \ - -include-groups
183 \ - -include-groups
184 Remove repository groups.
184 Remove repository groups.
185
185
186 \ - -instance-name <instance-id>
186 \ - -instance-name <instance-id>
187 Set the instance name.
187 Set the instance name.
188
188
189 \ - -list-only
189 \ - -list-only
190 Display repositories selected for deletion.
190 Display repositories selected for deletion.
191
191
192 \ - -older-than <str>
192 \ - -older-than <str>
193 Delete repositories older that a specified time.
193 Delete repositories older that a specified time.
194 You can use the following suffixes; d for days, h for hours,
194 You can use the following suffixes; d for days, h for hours,
195 m for minutes, s for seconds.
195 m for minutes, s for seconds.
196
196
197 \-R, - -repo-dir
197 \-R, - -repo-dir
198 Set the repository file path
198 Set the repository file path
199
199
200 Example usage:
200 Example usage:
201
201
202 .. code-block:: bash
202 .. code-block:: bash
203
203
204 # Cleaning up repos using tools installed with RCE 350 and above
204 # Cleaning up repos using tools installed with RCE 350 and above
205 $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-cleanup-repos \
205 $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-cleanup-repos \
206 --instance-name=enterprise-4 --older-than=1d
206 --instance-name=enterprise-4 --older-than=1d
207 Scanning for repositories in /home/brian/repos...
207 Scanning for repositories in /home/brian/repos...
208 preparing to remove [2] found repositories older than 1 day, 0:00:00 (1d)
208 preparing to remove [2] found repositories older than 1 day, 0:00:00 (1d)
209
209
210 the following repositories will be deleted completely:
210 the following repositories will be deleted completely:
211 * REMOVED: 2015-08-05 00:23:18 | /home/brian/repos/rm__20150805_002318_831
211 * REMOVED: 2015-08-05 00:23:18 | /home/brian/repos/rm__20150805_002318_831
212 * REMOVED: 2015-08-04 01:22:10 | /home/brian/repos/rm__20150804_012210_336
212 * REMOVED: 2015-08-04 01:22:10 | /home/brian/repos/rm__20150804_012210_336
213 are you sure you want to remove them? [y/N]:
213 are you sure you want to remove them? [y/N]:
214
214
215 # Clean up repos older than 1 year
215 # Clean up repos older than 1 year
216 # If using virtualenv and pre RCE 350 tools installation
216 # If using virtualenv and pre RCE 350 tools installation
217 (venv)$ rhodecode-cleanup-repos --instance-name=enterprise-1 \
217 (venv)$ rhodecode-cleanup-repos --instance-name=enterprise-1 \
218 --older-than=365d
218 --older-than=365d
219
219
220 Scanning for repositories in /home/brian/repos...
220 Scanning for repositories in /home/brian/repos...
221 preparing to remove [343] found repositories older than 365 days
221 preparing to remove [343] found repositories older than 365 days
222
222
223 # clean up repos older than 3 days
223 # clean up repos older than 3 days
224 # If using virtualenv and pre RCE 350 tools installation
224 # If using virtualenv and pre RCE 350 tools installation
225 (venv)$ rhodecode-cleanup-repos --instance-name=enterprise-1 \
225 (venv)$ rhodecode-cleanup-repos --instance-name=enterprise-1 \
226 --older-than=3d
226 --older-than=3d
227 Scanning for repositories in /home/brian/repos...
227 Scanning for repositories in /home/brian/repos...
228 preparing to remove [3] found repositories older than 3 days
228 preparing to remove [3] found repositories older than 3 days
229
229
230 .. _tools-config:
230 .. _tools-config:
231
231
232 rhodecode-config
232 rhodecode-config
233 ----------------
233 ----------------
234
234
235 Use this to create or update a |RCE| configuration file on the local machine.
235 Use this to create or update a |RCE| configuration file on the local machine.
236
236
237 .. rst-class:: dl-horizontal
237 .. rst-class:: dl-horizontal
238
238
239 \- -filename </path/to/config_file>
239 \- -filename </path/to/config_file>
240 Set the file path to the |RCE| configuration file.
240 Set the file path to the |RCE| configuration file.
241
241
242 \- -show-defaults
242 \- -show-defaults
243 Display the defaults set in the |RCE| configuration file.
243 Display the defaults set in the |RCE| configuration file.
244
244
245 \- -update
245 \- -update
246 Update the configuration with the new settings passed on the command
246 Update the configuration with the new settings passed on the command
247 line.
247 line.
248
248
249 .. code-block:: bash
249 .. code-block:: bash
250
250
251 # Create a new config file
251 # Create a new config file
252 $ rhodecode-config --filename=dev.ini
252 $ rhodecode-config --filename=dev.ini
253 Wrote new config file in /Users/user/dev.ini
253 Wrote new config file in /Users/user/dev.ini
254
254
255 # Update config value for given section:
255 # Update config value for given section:
256 $ rhodecode-config --update --filename=prod.ini [handler_console]level=INFO
256 $ rhodecode-config --update --filename=prod.ini [handler_console]level=INFO
257
257
258 $ rhodecode-config --filename=dev.ini --show-defaults
258 $ rhodecode-config --filename=dev.ini --show-defaults
259 lang=en
259 lang=en
260 cpu_number=4
260 cpu_number=4
261 uuid=<function <lambda> at 0x10d86ac08>
261 uuid=<function <lambda> at 0x10d86ac08>
262 license_token=ff1e-aa9c-bb66-11e5
262 license_token=ff1e-aa9c-bb66-11e5
263 host=127.0.0.1
263 host=127.0.0.1
264 here=/Users/brian
264 here=/Users/brian
265 error_aggregation_service=None
265 error_aggregation_service=None
266 database_url=sqlite:///%(here)s/rhodecode.db?timeout=30
266 database_url=sqlite:///%(here)s/rhodecode.db?timeout=30
267 git_path=git
267 git_path=git
268 http_server=waitress
268 http_server=waitress
269 port=5000
269 port=5000
270
270
271 .. _tools-rhodecode-extensions:
271 .. _tools-rhodecode-extensions:
272
272
273 rhodecode-extensions
273 rhodecode-extensions
274 --------------------
274 --------------------
275
275
276 |RCT| adds additional mapping for :ref:`indexing-ref`, statistics, and adds
276 |RCT| adds additional mapping for :ref:`indexing-ref`, statistics, and adds
277 additional code for push/pull/create/delete |repo| hooks. These hooks can be
277 additional code for push/pull/create/delete |repo| hooks. These hooks can be
278 used to send signals to build-bots such as jenkins. Options:
278 used to send signals to build-bots such as jenkins. Options:
279
279
280 .. rst-class:: dl-horizontal
280 .. rst-class:: dl-horizontal
281
281
282 \-c, - -config <config_file>
282 \-c, - -config <config_file>
283 Create a configuration file. The default file is created
283 Create a configuration file. The default file is created
284 in ``~/.rhoderc``
284 in ``~/.rhoderc``
285
285
286 \-h, - -help
286 \-h, - -help
287 Show help messages.
287 Show help messages.
288
288
289 \-F, - -format {json,pretty}
289 \-F, - -format {json,pretty}
290 Set the formatted representation.
290 Set the formatted representation.
291
291
292 \-I, - -install-dir <str>
292 \-I, - -install-dir <str>
293 Set the location of the |RCE| installation. The default location is
293 Set the location of the |RCE| installation. The default location is
294 :file:`/home/{user}/.rccontrol/`.
294 :file:`/home/{user}/.rccontrol/`.
295
295
296 \ - -ini-file <str>
296 \ - -ini-file <str>
297 Path to the :file:`rhodecode.ini` file for that instance.
297 Path to the :file:`rhodecode.ini` file for that instance.
298
298
299 \ - -instance-name <instance-id>
299 \ - -instance-name <instance-id>
300 Set the instance name.
300 Set the instance name.
301
301
302 \ - -plugins
302 \ - -plugins
303 Add plugins to your |RCE| installation. See the
303 Add plugins to your |RCE| installation. See the
304 :ref:`integrations-ref` section for more details.
304 :ref:`extensions-hooks-ref` section for more details.
305
305
306 \ - -version
306 \ - -version
307 Display your |RCT| version.
307 Display your |RCT| version.
308
308
309
309
310 Once installed, you will see a :file:`rcextensions` folder in the instance
310 Once installed, you will see a :file:`rcextensions` folder in the instance
311 directory, for example :file:`home/{user}/.rccontrol/{instance-id}/rcextensions`
311 directory, for example :file:`home/{user}/.rccontrol/{instance-id}/rcextensions`
312
312
313 To install ``rcextensions``, use the following example:
313 To install ``rcextensions``, use the following example:
314
314
315 .. code-block:: bash
315 .. code-block:: bash
316
316
317 # install extensions on the given instance
317 # install extensions on the given instance
318 # If using virtualenv prior to RCE 350
318 # If using virtualenv prior to RCE 350
319 (venv)$ rhodecode-extensions --instance-name=enterprise-1 \
319 (venv)$ rhodecode-extensions --instance-name=enterprise-1 \
320 --ini-file=rhodecode.ini
320 --ini-file=rhodecode.ini
321 Writen new extensions file to rcextensions
321 Writen new extensions file to rcextensions
322
322
323 # install extensions with additional plugins on the given instance
323 # install extensions with additional plugins on the given instance
324 (venv)$ rhodecode-extensions --instance-name=enterprise-1 \
324 (venv)$ rhodecode-extensions --instance-name=enterprise-1 \
325 --ini-file=rhodecode.ini --plugins
325 --ini-file=rhodecode.ini --plugins
326 Writen new extensions file to rcextensions
326 Writen new extensions file to rcextensions
327
327
328 # installing extensions from 350 onwards
328 # installing extensions from 350 onwards
329 # as they are packaged with RCE
329 # as they are packaged with RCE
330 $ .rccontrol/enterprise-4/profile/bin/rhodecode-extensions --plugins \
330 $ .rccontrol/enterprise-4/profile/bin/rhodecode-extensions --plugins \
331 --instance-name=enterprise-4 --ini-file=rhodecode.ini
331 --instance-name=enterprise-4 --ini-file=rhodecode.ini
332
332
333 Writen new extensions file to rcextensions
333 Writen new extensions file to rcextensions
334
334
335 See the new extensions inside this directory for more details about the
335 See the new extensions inside this directory for more details about the
336 additional hooks available, for example see the ``push_post.py`` file.
336 additional hooks available, for example see the ``push_post.py`` file.
337
337
338 .. code-block:: python
338 .. code-block:: python
339
339
340 import urllib
340 import urllib
341 import urllib2
341 import urllib2
342
342
343 def run(*args, **kwargs):
343 def run(*args, **kwargs):
344 """
344 """
345 Extra params
345 Extra params
346
346
347 :param URL: url to send the data to
347 :param URL: url to send the data to
348 """
348 """
349
349
350 url = kwargs.pop('URL', None)
350 url = kwargs.pop('URL', None)
351 if url:
351 if url:
352 from rhodecode.lib.compat import json
352 from rhodecode.lib.compat import json
353 from rhodecode.model.db import Repository
353 from rhodecode.model.db import Repository
354
354
355 repo = Repository.get_by_repo_name(kwargs['repository'])
355 repo = Repository.get_by_repo_name(kwargs['repository'])
356 changesets = []
356 changesets = []
357 vcs_repo = repo.scm_instance_no_cache()
357 vcs_repo = repo.scm_instance_no_cache()
358 for r in kwargs['pushed_revs']:
358 for r in kwargs['pushed_revs']:
359 cs = vcs_repo.get_changeset(r)
359 cs = vcs_repo.get_changeset(r)
360 changesets.append(json.dumps(cs))
360 changesets.append(json.dumps(cs))
361
361
362 kwargs['pushed_revs'] = changesets
362 kwargs['pushed_revs'] = changesets
363 headers = {
363 headers = {
364 'User-Agent': 'RhodeCode-SCM web hook',
364 'User-Agent': 'RhodeCode-SCM web hook',
365 'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
365 'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
366 'Accept': 'text/javascript, text/html, application/xml, '
366 'Accept': 'text/javascript, text/html, application/xml, '
367 'text/xml, */*',
367 'text/xml, */*',
368 'Accept-Encoding': 'gzip,deflate,sdch',
368 'Accept-Encoding': 'gzip,deflate,sdch',
369 }
369 }
370
370
371 data = kwargs
371 data = kwargs
372 data = urllib.urlencode(data)
372 data = urllib.urlencode(data)
373 req = urllib2.Request(url, data, headers)
373 req = urllib2.Request(url, data, headers)
374 response = urllib2.urlopen(req)
374 response = urllib2.urlopen(req)
375 response.read()
375 response.read()
376 return 0
376 return 0
377
377
378
378
379 rhodecode-gist
379 rhodecode-gist
380 --------------
380 --------------
381
381
382 Use this to create, list, show, or delete gists within |RCM|. Options:
382 Use this to create, list, show, or delete gists within |RCM|. Options:
383
383
384 .. rst-class:: dl-horizontal
384 .. rst-class:: dl-horizontal
385
385
386 \ - -api-cache-only
386 \ - -api-cache-only
387 Requires a cache to be present when running this call
387 Requires a cache to be present when running this call
388
388
389 \ - -api-cache-rebuild
389 \ - -api-cache-rebuild
390 Replaces existing cached values with new ones from server
390 Replaces existing cached values with new ones from server
391
391
392 \ - -api-cache PATH
392 \ - -api-cache PATH
393 Use a special cache dir to read responses from instead of the server
393 Use a special cache dir to read responses from instead of the server
394
394
395 \ - -api-cert-verify
395 \ - -api-cert-verify
396 Verify the endpoint ssl certificate
396 Verify the endpoint ssl certificate
397
397
398 \ - -api-cert PATH
398 \ - -api-cert PATH
399 Path to alternate CA bundle.
399 Path to alternate CA bundle.
400
400
401 \ - -apihost <api_host>
401 \ - -apihost <api_host>
402 Set the API host value.
402 Set the API host value.
403
403
404 \ - -apikey <apikey_value>
404 \ - -apikey <apikey_value>
405 Set the API key value.
405 Set the API key value.
406
406
407 \-c, - -config <config_file>
407 \-c, - -config <config_file>
408 Create a configuration file.
408 Create a configuration file.
409 The default file is created in :file:`~/.rhoderc`
409 The default file is created in :file:`~/.rhoderc`
410
410
411 \ - -create <gistname>
411 \ - -create <gistname>
412 create the gist
412 create the gist
413
413
414 \-d, - -description <str>
414 \-d, - -description <str>
415 Set gist description
415 Set gist description
416
416
417 \ - -delete <gistid>
417 \ - -delete <gistid>
418 Delete the gist
418 Delete the gist
419
419
420 \-f, - -file
420 \-f, - -file
421 Specify the filename The file extension will enable syntax highlighting.
421 Specify the filename The file extension will enable syntax highlighting.
422
422
423 \-F, - -format {json,pretty}
423 \-F, - -format {json,pretty}
424 Set the formatted representation.
424 Set the formatted representation.
425
425
426 \ - -help
426 \ - -help
427 Show help messages.
427 Show help messages.
428
428
429 \-I, - -install-dir <DIR>
429 \-I, - -install-dir <DIR>
430 Location of application instances
430 Location of application instances
431
431
432 \ - -instance-name <instance-id>
432 \ - -instance-name <instance-id>
433 Set the instance name.
433 Set the instance name.
434
434
435 \ - -list
435 \ - -list
436 Display instance gists.
436 Display instance gists.
437
437
438 \-l, --lifetime <minutes>
438 \-l, --lifetime <minutes>
439 Set the gist lifetime. The default value is (-1) forever
439 Set the gist lifetime. The default value is (-1) forever
440
440
441 \ - -show <gistname>
441 \ - -show <gistname>
442 Show the content of the gist
442 Show the content of the gist
443
443
444 \-o, - -open
444 \-o, - -open
445 After creating Gist open it in browser
445 After creating Gist open it in browser
446
446
447 \-p, - -private
447 \-p, - -private
448 Create a private gist
448 Create a private gist
449
449
450 \ - -version
450 \ - -version
451 Display your |RCT| version.
451 Display your |RCT| version.
452
452
453 Example usage:
453 Example usage:
454
454
455 .. code-block:: bash
455 .. code-block:: bash
456
456
457 # List the gists in an instance
457 # List the gists in an instance
458 (venv)brian@ubuntu:~$ rhodecode-gist --instance-name=enterprise-1 list
458 (venv)brian@ubuntu:~$ rhodecode-gist --instance-name=enterprise-1 list
459 {
459 {
460 "error": null,
460 "error": null,
461 "id": 7102,
461 "id": 7102,
462 "result": [
462 "result": [
463 {
463 {
464 "access_id": "2",
464 "access_id": "2",
465 "content": null,
465 "content": null,
466 "created_on": "2015-01-19T12:52:26.494",
466 "created_on": "2015-01-19T12:52:26.494",
467 "description": "A public gust",
467 "description": "A public gust",
468 "expires": -1.0,
468 "expires": -1.0,
469 "gist_id": 2,
469 "gist_id": 2,
470 "type": "public",
470 "type": "public",
471 "url": "http://127.0.0.1:10003/_admin/gists/2"
471 "url": "http://127.0.0.1:10003/_admin/gists/2"
472 },
472 },
473 {
473 {
474 "access_id": "7gs6BsSEC4pKUEPLz5AB",
474 "access_id": "7gs6BsSEC4pKUEPLz5AB",
475 "content": null,
475 "content": null,
476 "created_on": "2015-01-19T11:27:40.812",
476 "created_on": "2015-01-19T11:27:40.812",
477 "description": "Gist testing API",
477 "description": "Gist testing API",
478 "expires": -1.0,
478 "expires": -1.0,
479 "gist_id": 1,
479 "gist_id": 1,
480 "type": "private",
480 "type": "private",
481 "url": "http://127.0.0.1:10003/_admin/gists/7gs6BsSEC4pKUEPLz5AB"
481 "url": "http://127.0.0.1:10003/_admin/gists/7gs6BsSEC4pKUEPLz5AB"
482 }
482 }
483 ]
483 ]
484 }
484 }
485
485
486 # delete a particular gist
486 # delete a particular gist
487 # You use the access_id to specify the gist to delete
487 # You use the access_id to specify the gist to delete
488 (venv)brian@ubuntu:~$ rhodecode-gist delete 2 --instance-name=enterprise-1
488 (venv)brian@ubuntu:~$ rhodecode-gist delete 2 --instance-name=enterprise-1
489 {
489 {
490 "error": null,
490 "error": null,
491 "id": 6284,
491 "id": 6284,
492 "result": {
492 "result": {
493 "gist": null,
493 "gist": null,
494 "msg": "deleted gist ID:2"
494 "msg": "deleted gist ID:2"
495 }
495 }
496 }
496 }
497
497
498 # cat a file and pipe to new gist
498 # cat a file and pipe to new gist
499 # This is if you are using virtualenv
499 # This is if you are using virtualenv
500 (venv)$ cat ~/.rhoderc | rhodecode-gist --instance-name=enterprise-1 \
500 (venv)$ cat ~/.rhoderc | rhodecode-gist --instance-name=enterprise-1 \
501 -d '.rhoderc copy' create
501 -d '.rhoderc copy' create
502
502
503 {
503 {
504 "error": null,
504 "error": null,
505 "id": 5374,
505 "id": 5374,
506 "result": {
506 "result": {
507 "gist": {
507 "gist": {
508 "access_id": "7",
508 "access_id": "7",
509 "content": null,
509 "content": null,
510 "created_on": "2015-01-26T11:31:58.774",
510 "created_on": "2015-01-26T11:31:58.774",
511 "description": ".rhoderc copy",
511 "description": ".rhoderc copy",
512 "expires": -1.0,
512 "expires": -1.0,
513 "gist_id": 7,
513 "gist_id": 7,
514 "type": "public",
514 "type": "public",
515 "url": "http://127.0.0.1:10003/_admin/gists/7"
515 "url": "http://127.0.0.1:10003/_admin/gists/7"
516 },
516 },
517 "msg": "created new gist"
517 "msg": "created new gist"
518 }
518 }
519 }
519 }
520
520
521 # Cat a file and pipe to gist
521 # Cat a file and pipe to gist
522 # in RCE 3.5.0 tools and above
522 # in RCE 3.5.0 tools and above
523 $ cat ~/.rhoderc | ~/.rccontrol/{instance-id}/profile/bin/rhodecode-gist \
523 $ cat ~/.rhoderc | ~/.rccontrol/{instance-id}/profile/bin/rhodecode-gist \
524 --instance-name=enterprise-4 -d '.rhoderc copy' create
524 --instance-name=enterprise-4 -d '.rhoderc copy' create
525 {
525 {
526 "error": null,
526 "error": null,
527 "id": 9253,
527 "id": 9253,
528 "result": {
528 "result": {
529 "gist": {
529 "gist": {
530 "access_id": "4",
530 "access_id": "4",
531 "acl_level": "acl_public",
531 "acl_level": "acl_public",
532 "content": null,
532 "content": null,
533 "created_on": "2015-08-20T05:54:11.250",
533 "created_on": "2015-08-20T05:54:11.250",
534 "description": ".rhoderc copy",
534 "description": ".rhoderc copy",
535 "expires": -1.0,
535 "expires": -1.0,
536 "gist_id": 4,
536 "gist_id": 4,
537 "modified_at": "2015-08-20T05:54:11.250",
537 "modified_at": "2015-08-20T05:54:11.250",
538 "type": "public",
538 "type": "public",
539 "url": "http://127.0.0.1:10000/_admin/gists/4"
539 "url": "http://127.0.0.1:10000/_admin/gists/4"
540 },
540 },
541 "msg": "created new gist"
541 "msg": "created new gist"
542 }
542 }
543 }
543 }
544
544
545
545
546 rhodecode-index
546 rhodecode-index
547 ---------------
547 ---------------
548
548
549 More detailed information regarding setting up the indexer is available in
549 More detailed information regarding setting up the indexer is available in
550 the :ref:`indexing-ref` section. Options:
550 the :ref:`indexing-ref` section. Options:
551
551
552 .. rst-class:: dl-horizontal
552 .. rst-class:: dl-horizontal
553
553
554 \ - -api-cache-only
554 \ - -api-cache-only
555 Requires a cache to be present when running this call
555 Requires a cache to be present when running this call
556
556
557 \ - -api-cache-rebuild
557 \ - -api-cache-rebuild
558 Replaces existing cached values with new ones from server
558 Replaces existing cached values with new ones from server
559
559
560 \ - -api-cache PATH
560 \ - -api-cache PATH
561 Use a special cache dir to read responses from instead of the server
561 Use a special cache dir to read responses from instead of the server
562
562
563 \ - -api-cert-verify
563 \ - -api-cert-verify
564 Verify the endpoint ssl certificate
564 Verify the endpoint ssl certificate
565
565
566 \ - -api-cert PATH
566 \ - -api-cert PATH
567 Path to alternate CA bundle.
567 Path to alternate CA bundle.
568
568
569 \ - -apihost <api_host>
569 \ - -apihost <api_host>
570 Set the API host value.
570 Set the API host value.
571
571
572 \ - -apikey <apikey_value>
572 \ - -apikey <apikey_value>
573 Set the API key value.
573 Set the API key value.
574
574
575 \-c, --config <config_file>
575 \-c, --config <config_file>
576 Create a configuration file.
576 Create a configuration file.
577 The default file is created in :file:`~/.rhoderc`
577 The default file is created in :file:`~/.rhoderc`
578
578
579 \ - -create-mapping <PATH>
579 \ - -create-mapping <PATH>
580 Creates an example mapping configuration for indexer.
580 Creates an example mapping configuration for indexer.
581
581
582 \-F, - -format {json,pretty}
582 \-F, - -format {json,pretty}
583 Set the formatted representation.
583 Set the formatted representation.
584
584
585 \-h, - -help
585 \-h, - -help
586 Show help messages.
586 Show help messages.
587
587
588 \ - -instance-name <instance-id>
588 \ - -instance-name <instance-id>
589 Set the instance name
589 Set the instance name
590
590
591 \-I, - -install-dir <DIR>
591 \-I, - -install-dir <DIR>
592 Location of application instances
592 Location of application instances
593
593
594 \-m, - -mapping <file_name>
594 \-m, - -mapping <file_name>
595 Parse the output to the .ini mapping file.
595 Parse the output to the .ini mapping file.
596
596
597 \ - -optimize
597 \ - -optimize
598 Optimize index for performance by amalgamating multiple index files
598 Optimize index for performance by amalgamating multiple index files
599 into one. Greatly increases incremental indexing speed.
599 into one. Greatly increases incremental indexing speed.
600
600
601 \-R, - -repo-dir <DIRECTORY>
601 \-R, - -repo-dir <DIRECTORY>
602 Location of repositories
602 Location of repositories
603
603
604 \ - -source <PATH>
604 \ - -source <PATH>
605 Use a special source JSON file to feed the indexer
605 Use a special source JSON file to feed the indexer
606
606
607 \ - -version
607 \ - -version
608 Display your |RCT| version.
608 Display your |RCT| version.
609
609
610 Example usage:
610 Example usage:
611
611
612 .. code-block:: bash
612 .. code-block:: bash
613
613
614 # Run the indexer
614 # Run the indexer
615 $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-index \
615 $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-index \
616 --instance-name=enterprise-4
616 --instance-name=enterprise-4
617
617
618 # Run indexer based on mapping.ini file
618 # Run indexer based on mapping.ini file
619 # This is using pre-350 virtualenv
619 # This is using pre-350 virtualenv
620 (venv)$ rhodecode-index --instance-name=enterprise-1
620 (venv)$ rhodecode-index --instance-name=enterprise-1
621
621
622 # Index from the command line without creating
622 # Index from the command line without creating
623 # the .rhoderc file
623 # the .rhoderc file
624 $ rhodecode-index --apikey=key --apihost=http://rhodecode.server \
624 $ rhodecode-index --apikey=key --apihost=http://rhodecode.server \
625 --instance-name=enterprise-2 --save-config
625 --instance-name=enterprise-2 --save-config
626
626
627 # Create the indexing mapping file
627 # Create the indexing mapping file
628 $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-index \
628 $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-index \
629 --create-mapping mapping.ini --instance-name=enterprise-4
629 --create-mapping mapping.ini --instance-name=enterprise-4
630
630
631 .. _tools-rhodecode-list-instance:
631 .. _tools-rhodecode-list-instance:
632
632
633 rhodecode-list-instances
633 rhodecode-list-instances
634 ------------------------
634 ------------------------
635
635
636 Use this command to list the instance details configured in the
636 Use this command to list the instance details configured in the
637 :file:`~/.rhoderc` file.
637 :file:`~/.rhoderc` file.
638
638
639 .. code-block:: bash
639 .. code-block:: bash
640
640
641 $ .rccontrol/enterprise-1/profile/bin/rhodecode-list-instances
641 $ .rccontrol/enterprise-1/profile/bin/rhodecode-list-instances
642 [instance:production] - Config only
642 [instance:production] - Config only
643 API-HOST: https://some.url.com
643 API-HOST: https://some.url.com
644 API-KEY: some.auth.token
644 API-KEY: some.auth.token
645
645
646 [instance:development] - Config only
646 [instance:development] - Config only
647 API-HOST: http://some.ip.address
647 API-HOST: http://some.ip.address
648 API-KEY: some.auth.token
648 API-KEY: some.auth.token
649
649
650
650
651 .. _tools-setup-config:
651 .. _tools-setup-config:
652
652
653 rhodecode-setup-config
653 rhodecode-setup-config
654 ----------------------
654 ----------------------
655
655
656 Use this command to create the ``~.rhoderc`` file required by |RCT| to access
656 Use this command to create the ``~.rhoderc`` file required by |RCT| to access
657 remote instances.
657 remote instances.
658
658
659 .. rst-class:: dl-horizontal
659 .. rst-class:: dl-horizontal
660
660
661 \- -instance-name <name>
661 \- -instance-name <name>
662 Specify the instance name in the :file:`~/.rhoderc`
662 Specify the instance name in the :file:`~/.rhoderc`
663
663
664 \api_host <hostname>
664 \api_host <hostname>
665 Create a configuration file. The default file is created
665 Create a configuration file. The default file is created
666 in ``~/.rhoderc``
666 in ``~/.rhoderc``
667
667
668 \api_key <auth-token>
668 \api_key <auth-token>
669 Create a configuration file. The default file is created
669 Create a configuration file. The default file is created
670 in ``~/.rhoderc``
670 in ``~/.rhoderc``
671
671
672
672
673 .. code-block:: bash
673 .. code-block:: bash
674
674
675 (venv)$ rhodecode-setup-config --instance-name=tea api_host=URL api_key=xyz
675 (venv)$ rhodecode-setup-config --instance-name=tea api_host=URL api_key=xyz
676 Config not found under /Users/username/.rhoderc, creating a new one
676 Config not found under /Users/username/.rhoderc, creating a new one
677 Wrote new configuration into /Users/username/.rhoderc
677 Wrote new configuration into /Users/username/.rhoderc
@@ -1,12 +1,12 b''
1 diff --git a/requirements.txt b/requirements.txt
1 diff --git a/requirements.txt b/requirements.txt
2 --- a/requirements.txt
2 --- a/requirements.txt
3 +++ b/requirements.txt
3 +++ b/requirements.txt
4 @@ -3,7 +3,7 @@future==0.14.3
4 @@ -3,7 +3,7 @@ future==0.14.3
5 six==1.9.0
5 six==1.9.0
6 mako==1.0.1
6 mako==1.0.1
7 markupsafe==0.23
7 markupsafe==0.23
8 -requests==2.5.1
8 -requests==2.5.1
9 +requests
9 +requests
10 #responses
11 whoosh==2.7.0
10 whoosh==2.7.0
12 elasticsearch==2.3.0 No newline at end of file
11 elasticsearch==2.3.0
12 elasticsearch-dsl==2.0.0 No newline at end of file
@@ -1,273 +1,281 b''
1 # Overrides for the generated python-packages.nix
1 # Overrides for the generated python-packages.nix
2 #
2 #
3 # This function is intended to be used as an extension to the generated file
3 # This function is intended to be used as an extension to the generated file
4 # python-packages.nix. The main objective is to add needed dependencies of C
4 # python-packages.nix. The main objective is to add needed dependencies of C
5 # libraries and tweak the build instructions where needed.
5 # libraries and tweak the build instructions where needed.
6
6
7 { pkgs, basePythonPackages }:
7 { pkgs, basePythonPackages }:
8
8
9 let
9 let
10 sed = "sed -i";
10 sed = "sed -i";
11 localLicenses = {
11 localLicenses = {
12 repoze = {
12 repoze = {
13 fullName = "Repoze License";
13 fullName = "Repoze License";
14 url = http://www.repoze.org/LICENSE.txt;
14 url = http://www.repoze.org/LICENSE.txt;
15 };
15 };
16 };
16 };
17 in
17 in
18
18
19 self: super: {
19 self: super: {
20
20
21 appenlight-client = super.appenlight-client.override (attrs: {
21 appenlight-client = super.appenlight-client.override (attrs: {
22 meta = {
22 meta = {
23 license = [ pkgs.lib.licenses.bsdOriginal ];
23 license = [ pkgs.lib.licenses.bsdOriginal ];
24 };
24 };
25 });
25 });
26
26
27 future = super.future.override (attrs: {
27 future = super.future.override (attrs: {
28 meta = {
28 meta = {
29 license = [ pkgs.lib.licenses.mit ];
29 license = [ pkgs.lib.licenses.mit ];
30 };
30 };
31 });
31 });
32
32
33 gnureadline = super.gnureadline.override (attrs: {
33 gnureadline = super.gnureadline.override (attrs: {
34 buildInputs = attrs.buildInputs ++ [
34 buildInputs = attrs.buildInputs ++ [
35 pkgs.ncurses
35 pkgs.ncurses
36 ];
36 ];
37 patchPhase = ''
37 patchPhase = ''
38 substituteInPlace setup.py --replace "/bin/bash" "${pkgs.bash}/bin/bash"
38 substituteInPlace setup.py --replace "/bin/bash" "${pkgs.bash}/bin/bash"
39 '';
39 '';
40 });
40 });
41
41
42 gunicorn = super.gunicorn.override (attrs: {
42 gunicorn = super.gunicorn.override (attrs: {
43 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
43 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
44 # johbo: futures is needed as long as we are on Python 2, otherwise
44 # johbo: futures is needed as long as we are on Python 2, otherwise
45 # gunicorn explodes if used with multiple threads per worker.
45 # gunicorn explodes if used with multiple threads per worker.
46 self.futures
46 self.futures
47 ];
47 ];
48 });
48 });
49
49
50 ipython = super.ipython.override (attrs: {
50 ipython = super.ipython.override (attrs: {
51 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
51 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
52 self.gnureadline
52 self.gnureadline
53 ];
53 ];
54 });
54 });
55
55
56 kombu = super.kombu.override (attrs: {
56 kombu = super.kombu.override (attrs: {
57 # The current version of kombu needs some patching to work with the
57 # The current version of kombu needs some patching to work with the
58 # other libs. Should be removed once we update celery and kombu.
58 # other libs. Should be removed once we update celery and kombu.
59 patches = [
59 patches = [
60 ./patch-kombu-py-2-7-11.diff
60 ./patch-kombu-py-2-7-11.diff
61 ./patch-kombu-msgpack.diff
61 ./patch-kombu-msgpack.diff
62 ];
62 ];
63 });
63 });
64
64
65 lxml = super.lxml.override (attrs: {
65 lxml = super.lxml.override (attrs: {
66 buildInputs = with self; [
66 buildInputs = with self; [
67 pkgs.libxml2
67 pkgs.libxml2
68 pkgs.libxslt
68 pkgs.libxslt
69 ];
69 ];
70 });
70 });
71
71
72 MySQL-python = super.MySQL-python.override (attrs: {
72 MySQL-python = super.MySQL-python.override (attrs: {
73 buildInputs = attrs.buildInputs ++ [
73 buildInputs = attrs.buildInputs ++ [
74 pkgs.openssl
74 pkgs.openssl
75 ];
75 ];
76 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
76 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
77 pkgs.mysql.lib
77 pkgs.mysql.lib
78 pkgs.zlib
78 pkgs.zlib
79 ];
79 ];
80 });
80 });
81
81
82 psutil = super.psutil.override (attrs: {
82 psutil = super.psutil.override (attrs: {
83 buildInputs = attrs.buildInputs ++
83 buildInputs = attrs.buildInputs ++
84 pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.darwin.IOKit;
84 pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.darwin.IOKit;
85 });
85 });
86
86
87 psycopg2 = super.psycopg2.override (attrs: {
87 psycopg2 = super.psycopg2.override (attrs: {
88 buildInputs = attrs.buildInputs ++
88 buildInputs = attrs.buildInputs ++
89 pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.openssl;
89 pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.openssl;
90 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
90 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
91 pkgs.postgresql
91 pkgs.postgresql
92 ];
92 ];
93 meta = {
93 meta = {
94 license = pkgs.lib.licenses.lgpl3Plus;
94 license = pkgs.lib.licenses.lgpl3Plus;
95 };
95 };
96 });
96 });
97
97
98 py-gfm = super.py-gfm.override {
99 src = pkgs.fetchgit {
100 url = "https://code.rhodecode.com/upstream/py-gfm";
101 rev = "0d66a19bc16e3d49de273c0f797d4e4781e8c0f2";
102 sha256 = "0ryp74jyihd3ckszq31bml5jr3bciimhfp7va7kw6ld92930ksv3";
103 };
104 };
105
98 pycurl = super.pycurl.override (attrs: {
106 pycurl = super.pycurl.override (attrs: {
99 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
107 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
100 pkgs.curl
108 pkgs.curl
101 pkgs.openssl
109 pkgs.openssl
102 ];
110 ];
103 preConfigure = ''
111 preConfigure = ''
104 substituteInPlace setup.py --replace '--static-libs' '--libs'
112 substituteInPlace setup.py --replace '--static-libs' '--libs'
105 export PYCURL_SSL_LIBRARY=openssl
113 export PYCURL_SSL_LIBRARY=openssl
106 '';
114 '';
107 meta = {
115 meta = {
108 # TODO: It is LGPL and MIT
116 # TODO: It is LGPL and MIT
109 license = pkgs.lib.licenses.mit;
117 license = pkgs.lib.licenses.mit;
110 };
118 };
111 });
119 });
112
120
113 Pylons = super.Pylons.override (attrs: {
121 Pylons = super.Pylons.override (attrs: {
114 name = "Pylons-1.0.1-patch1";
122 name = "Pylons-1.0.1-patch1";
115 src = pkgs.fetchgit {
123 src = pkgs.fetchgit {
116 url = "https://code.rhodecode.com/upstream/pylons";
124 url = "https://code.rhodecode.com/upstream/pylons";
117 rev = "707354ee4261b9c10450404fc9852ccea4fd667d";
125 rev = "707354ee4261b9c10450404fc9852ccea4fd667d";
118 sha256 = "b2763274c2780523a335f83a1df65be22ebe4ff413a7bc9e9288d23c1f62032e";
126 sha256 = "b2763274c2780523a335f83a1df65be22ebe4ff413a7bc9e9288d23c1f62032e";
119 };
127 };
120 });
128 });
121
129
122 pyramid = super.pyramid.override (attrs: {
130 pyramid = super.pyramid.override (attrs: {
123 postFixup = ''
131 postFixup = ''
124 wrapPythonPrograms
132 wrapPythonPrograms
125 # TODO: johbo: "wrapPython" adds this magic line which
133 # TODO: johbo: "wrapPython" adds this magic line which
126 # confuses pserve.
134 # confuses pserve.
127 ${sed} '/import sys; sys.argv/d' $out/bin/.pserve-wrapped
135 ${sed} '/import sys; sys.argv/d' $out/bin/.pserve-wrapped
128 '';
136 '';
129 meta = {
137 meta = {
130 license = localLicenses.repoze;
138 license = localLicenses.repoze;
131 };
139 };
132 });
140 });
133
141
134 pyramid-debugtoolbar = super.pyramid-debugtoolbar.override (attrs: {
142 pyramid-debugtoolbar = super.pyramid-debugtoolbar.override (attrs: {
135 meta = {
143 meta = {
136 license = [ pkgs.lib.licenses.bsdOriginal localLicenses.repoze ];
144 license = [ pkgs.lib.licenses.bsdOriginal localLicenses.repoze ];
137 };
145 };
138 });
146 });
139
147
140 Pyro4 = super.Pyro4.override (attrs: {
148 Pyro4 = super.Pyro4.override (attrs: {
141 # TODO: Was not able to generate this version, needs further
149 # TODO: Was not able to generate this version, needs further
142 # investigation.
150 # investigation.
143 name = "Pyro4-4.35";
151 name = "Pyro4-4.35";
144 src = pkgs.fetchurl {
152 src = pkgs.fetchurl {
145 url = "https://pypi.python.org/packages/source/P/Pyro4/Pyro4-4.35.src.tar.gz";
153 url = "https://pypi.python.org/packages/source/P/Pyro4/Pyro4-4.35.src.tar.gz";
146 md5 = "cbe6cb855f086a0f092ca075005855f3";
154 md5 = "cbe6cb855f086a0f092ca075005855f3";
147 };
155 };
148 });
156 });
149
157
150 pysqlite = super.pysqlite.override (attrs: {
158 pysqlite = super.pysqlite.override (attrs: {
151 propagatedBuildInputs = [
159 propagatedBuildInputs = [
152 pkgs.sqlite
160 pkgs.sqlite
153 ];
161 ];
154 meta = {
162 meta = {
155 license = [ pkgs.lib.licenses.zlib pkgs.lib.licenses.libpng ];
163 license = [ pkgs.lib.licenses.zlib pkgs.lib.licenses.libpng ];
156 };
164 };
157 });
165 });
158
166
159 pytest-runner = super.pytest-runner.override (attrs: {
167 pytest-runner = super.pytest-runner.override (attrs: {
160 propagatedBuildInputs = [
168 propagatedBuildInputs = [
161 self.setuptools-scm
169 self.setuptools-scm
162 ];
170 ];
163 });
171 });
164
172
165 python-ldap = super.python-ldap.override (attrs: {
173 python-ldap = super.python-ldap.override (attrs: {
166 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
174 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
167 pkgs.cyrus_sasl
175 pkgs.cyrus_sasl
168 pkgs.openldap
176 pkgs.openldap
169 pkgs.openssl
177 pkgs.openssl
170 ];
178 ];
171 NIX_CFLAGS_COMPILE = "-I${pkgs.cyrus_sasl}/include/sasl";
179 NIX_CFLAGS_COMPILE = "-I${pkgs.cyrus_sasl}/include/sasl";
172 });
180 });
173
181
174 python-pam = super.python-pam.override (attrs:
182 python-pam = super.python-pam.override (attrs:
175 let
183 let
176 includeLibPam = pkgs.stdenv.isLinux;
184 includeLibPam = pkgs.stdenv.isLinux;
177 in {
185 in {
178 # TODO: johbo: Move the option up into the default.nix, we should
186 # TODO: johbo: Move the option up into the default.nix, we should
179 # include python-pam only on supported platforms.
187 # include python-pam only on supported platforms.
180 propagatedBuildInputs = attrs.propagatedBuildInputs ++
188 propagatedBuildInputs = attrs.propagatedBuildInputs ++
181 pkgs.lib.optional includeLibPam [
189 pkgs.lib.optional includeLibPam [
182 pkgs.pam
190 pkgs.pam
183 ];
191 ];
184 # TODO: johbo: Check if this can be avoided, or transform into
192 # TODO: johbo: Check if this can be avoided, or transform into
185 # a real patch
193 # a real patch
186 patchPhase = pkgs.lib.optionals includeLibPam ''
194 patchPhase = pkgs.lib.optionals includeLibPam ''
187 substituteInPlace pam.py \
195 substituteInPlace pam.py \
188 --replace 'find_library("pam")' '"${pkgs.pam}/lib/libpam.so.0"'
196 --replace 'find_library("pam")' '"${pkgs.pam}/lib/libpam.so.0"'
189 '';
197 '';
190 });
198 });
191
199
192 rhodecode-tools = super.rhodecode-tools.override (attrs: {
200 rhodecode-tools = super.rhodecode-tools.override (attrs: {
193 patches = [
201 patches = [
194 ./patch-rhodecode-tools-setup.diff
202 ./patch-rhodecode-tools-setup.diff
195 ];
203 ];
196 });
204 });
197
205
198 URLObject = super.URLObject.override (attrs: {
206 URLObject = super.URLObject.override (attrs: {
199 meta = {
207 meta = {
200 license = {
208 license = {
201 spdxId = "Unlicense";
209 spdxId = "Unlicense";
202 fullName = "The Unlicense";
210 fullName = "The Unlicense";
203 url = http://unlicense.org/;
211 url = http://unlicense.org/;
204 };
212 };
205 };
213 };
206 });
214 });
207
215
208 amqplib = super.amqplib.override (attrs: {
216 amqplib = super.amqplib.override (attrs: {
209 meta = {
217 meta = {
210 license = pkgs.lib.licenses.lgpl3;
218 license = pkgs.lib.licenses.lgpl3;
211 };
219 };
212 });
220 });
213
221
214 docutils = super.docutils.override (attrs: {
222 docutils = super.docutils.override (attrs: {
215 meta = {
223 meta = {
216 license = pkgs.lib.licenses.bsd2;
224 license = pkgs.lib.licenses.bsd2;
217 };
225 };
218 });
226 });
219
227
220 colander = super.colander.override (attrs: {
228 colander = super.colander.override (attrs: {
221 meta = {
229 meta = {
222 license = localLicenses.repoze;
230 license = localLicenses.repoze;
223 };
231 };
224 });
232 });
225
233
226 pyramid-beaker = super.pyramid-beaker.override (attrs: {
234 pyramid-beaker = super.pyramid-beaker.override (attrs: {
227 meta = {
235 meta = {
228 license = localLicenses.repoze;
236 license = localLicenses.repoze;
229 };
237 };
230 });
238 });
231
239
232 pyramid-mako = super.pyramid-mako.override (attrs: {
240 pyramid-mako = super.pyramid-mako.override (attrs: {
233 meta = {
241 meta = {
234 license = localLicenses.repoze;
242 license = localLicenses.repoze;
235 };
243 };
236 });
244 });
237
245
238 repoze.lru = super.repoze.lru.override (attrs: {
246 repoze.lru = super.repoze.lru.override (attrs: {
239 meta = {
247 meta = {
240 license = localLicenses.repoze;
248 license = localLicenses.repoze;
241 };
249 };
242 });
250 });
243
251
244 recaptcha-client = super.recaptcha-client.override (attrs: {
252 recaptcha-client = super.recaptcha-client.override (attrs: {
245 meta = {
253 meta = {
246 # TODO: It is MIT/X11
254 # TODO: It is MIT/X11
247 license = pkgs.lib.licenses.mit;
255 license = pkgs.lib.licenses.mit;
248 };
256 };
249 });
257 });
250
258
251 python-editor = super.python-editor.override (attrs: {
259 python-editor = super.python-editor.override (attrs: {
252 meta = {
260 meta = {
253 license = pkgs.lib.licenses.asl20;
261 license = pkgs.lib.licenses.asl20;
254 };
262 };
255 });
263 });
256
264
257 translationstring = super.translationstring.override (attrs: {
265 translationstring = super.translationstring.override (attrs: {
258 meta = {
266 meta = {
259 license = localLicenses.repoze;
267 license = localLicenses.repoze;
260 };
268 };
261 });
269 });
262
270
263 venusian = super.venusian.override (attrs: {
271 venusian = super.venusian.override (attrs: {
264 meta = {
272 meta = {
265 license = localLicenses.repoze;
273 license = localLicenses.repoze;
266 };
274 };
267 });
275 });
268
276
269 # Avoid that setuptools is replaced, this leads to trouble
277 # Avoid that setuptools is replaced, this leads to trouble
270 # with buildPythonPackage.
278 # with buildPythonPackage.
271 setuptools = basePythonPackages.setuptools;
279 setuptools = basePythonPackages.setuptools;
272
280
273 }
281 }
@@ -1,1628 +1,1732 b''
1 {
1 {
2 Babel = super.buildPythonPackage {
2 Babel = super.buildPythonPackage {
3 name = "Babel-1.3";
3 name = "Babel-1.3";
4 buildInputs = with self; [];
4 buildInputs = with self; [];
5 doCheck = false;
5 doCheck = false;
6 propagatedBuildInputs = with self; [pytz];
6 propagatedBuildInputs = with self; [pytz];
7 src = fetchurl {
7 src = fetchurl {
8 url = "https://pypi.python.org/packages/33/27/e3978243a03a76398c384c83f7ca879bc6e8f1511233a621fcada135606e/Babel-1.3.tar.gz";
8 url = "https://pypi.python.org/packages/33/27/e3978243a03a76398c384c83f7ca879bc6e8f1511233a621fcada135606e/Babel-1.3.tar.gz";
9 md5 = "5264ceb02717843cbc9ffce8e6e06bdb";
9 md5 = "5264ceb02717843cbc9ffce8e6e06bdb";
10 };
10 };
11 meta = {
11 meta = {
12 license = [ pkgs.lib.licenses.bsdOriginal ];
12 license = [ pkgs.lib.licenses.bsdOriginal ];
13 };
13 };
14 };
14 };
15 Beaker = super.buildPythonPackage {
15 Beaker = super.buildPythonPackage {
16 name = "Beaker-1.7.0";
16 name = "Beaker-1.7.0";
17 buildInputs = with self; [];
17 buildInputs = with self; [];
18 doCheck = false;
18 doCheck = false;
19 propagatedBuildInputs = with self; [];
19 propagatedBuildInputs = with self; [];
20 src = fetchurl {
20 src = fetchurl {
21 url = "https://pypi.python.org/packages/97/8e/409d2e7c009b8aa803dc9e6f239f1db7c3cdf578249087a404e7c27a505d/Beaker-1.7.0.tar.gz";
21 url = "https://pypi.python.org/packages/97/8e/409d2e7c009b8aa803dc9e6f239f1db7c3cdf578249087a404e7c27a505d/Beaker-1.7.0.tar.gz";
22 md5 = "386be3f7fe427358881eee4622b428b3";
22 md5 = "386be3f7fe427358881eee4622b428b3";
23 };
23 };
24 meta = {
24 meta = {
25 license = [ pkgs.lib.licenses.bsdOriginal ];
25 license = [ pkgs.lib.licenses.bsdOriginal ];
26 };
26 };
27 };
27 };
28 CProfileV = super.buildPythonPackage {
28 CProfileV = super.buildPythonPackage {
29 name = "CProfileV-1.0.6";
29 name = "CProfileV-1.0.6";
30 buildInputs = with self; [];
30 buildInputs = with self; [];
31 doCheck = false;
31 doCheck = false;
32 propagatedBuildInputs = with self; [bottle];
32 propagatedBuildInputs = with self; [bottle];
33 src = fetchurl {
33 src = fetchurl {
34 url = "https://pypi.python.org/packages/eb/df/983a0b6cfd3ac94abf023f5011cb04f33613ace196e33f53c86cf91850d5/CProfileV-1.0.6.tar.gz";
34 url = "https://pypi.python.org/packages/eb/df/983a0b6cfd3ac94abf023f5011cb04f33613ace196e33f53c86cf91850d5/CProfileV-1.0.6.tar.gz";
35 md5 = "08c7c242b6e64237bc53c5d13537e03d";
35 md5 = "08c7c242b6e64237bc53c5d13537e03d";
36 };
36 };
37 meta = {
37 meta = {
38 license = [ pkgs.lib.licenses.mit ];
38 license = [ pkgs.lib.licenses.mit ];
39 };
39 };
40 };
40 };
41 Chameleon = super.buildPythonPackage {
42 name = "Chameleon-2.24";
43 buildInputs = with self; [];
44 doCheck = false;
45 propagatedBuildInputs = with self; [];
46 src = fetchurl {
47 url = "https://pypi.python.org/packages/5a/9e/637379ffa13c5172b5c0e704833ffea6bf51cec7567f93fd6e903d53ed74/Chameleon-2.24.tar.gz";
48 md5 = "1b01f1f6533a8a11d0d2f2366dec5342";
49 };
50 meta = {
51 license = [ { fullName = "BSD-like (http://repoze.org/license.html)"; } ];
52 };
53 };
41 Fabric = super.buildPythonPackage {
54 Fabric = super.buildPythonPackage {
42 name = "Fabric-1.10.0";
55 name = "Fabric-1.10.0";
43 buildInputs = with self; [];
56 buildInputs = with self; [];
44 doCheck = false;
57 doCheck = false;
45 propagatedBuildInputs = with self; [paramiko];
58 propagatedBuildInputs = with self; [paramiko];
46 src = fetchurl {
59 src = fetchurl {
47 url = "https://pypi.python.org/packages/e3/5f/b6ebdb5241d5ec9eab582a5c8a01255c1107da396f849e538801d2fe64a5/Fabric-1.10.0.tar.gz";
60 url = "https://pypi.python.org/packages/e3/5f/b6ebdb5241d5ec9eab582a5c8a01255c1107da396f849e538801d2fe64a5/Fabric-1.10.0.tar.gz";
48 md5 = "2cb96473387f0e7aa035210892352f4a";
61 md5 = "2cb96473387f0e7aa035210892352f4a";
49 };
62 };
50 meta = {
63 meta = {
51 license = [ pkgs.lib.licenses.bsdOriginal ];
64 license = [ pkgs.lib.licenses.bsdOriginal ];
52 };
65 };
53 };
66 };
54 FormEncode = super.buildPythonPackage {
67 FormEncode = super.buildPythonPackage {
55 name = "FormEncode-1.2.4";
68 name = "FormEncode-1.2.4";
56 buildInputs = with self; [];
69 buildInputs = with self; [];
57 doCheck = false;
70 doCheck = false;
58 propagatedBuildInputs = with self; [];
71 propagatedBuildInputs = with self; [];
59 src = fetchurl {
72 src = fetchurl {
60 url = "https://pypi.python.org/packages/8e/59/0174271a6f004512e0201188593e6d319db139d14cb7490e488bbb078015/FormEncode-1.2.4.tar.gz";
73 url = "https://pypi.python.org/packages/8e/59/0174271a6f004512e0201188593e6d319db139d14cb7490e488bbb078015/FormEncode-1.2.4.tar.gz";
61 md5 = "6bc17fb9aed8aea198975e888e2077f4";
74 md5 = "6bc17fb9aed8aea198975e888e2077f4";
62 };
75 };
63 meta = {
76 meta = {
64 license = [ pkgs.lib.licenses.psfl ];
77 license = [ pkgs.lib.licenses.psfl ];
65 };
78 };
66 };
79 };
67 Jinja2 = super.buildPythonPackage {
80 Jinja2 = super.buildPythonPackage {
68 name = "Jinja2-2.7.3";
81 name = "Jinja2-2.7.3";
69 buildInputs = with self; [];
82 buildInputs = with self; [];
70 doCheck = false;
83 doCheck = false;
71 propagatedBuildInputs = with self; [MarkupSafe];
84 propagatedBuildInputs = with self; [MarkupSafe];
72 src = fetchurl {
85 src = fetchurl {
73 url = "https://pypi.python.org/packages/b0/73/eab0bca302d6d6a0b5c402f47ad1760dc9cb2dd14bbc1873ad48db258e4d/Jinja2-2.7.3.tar.gz";
86 url = "https://pypi.python.org/packages/b0/73/eab0bca302d6d6a0b5c402f47ad1760dc9cb2dd14bbc1873ad48db258e4d/Jinja2-2.7.3.tar.gz";
74 md5 = "b9dffd2f3b43d673802fe857c8445b1a";
87 md5 = "b9dffd2f3b43d673802fe857c8445b1a";
75 };
88 };
76 meta = {
89 meta = {
77 license = [ pkgs.lib.licenses.bsdOriginal ];
90 license = [ pkgs.lib.licenses.bsdOriginal ];
78 };
91 };
79 };
92 };
80 Mako = super.buildPythonPackage {
93 Mako = super.buildPythonPackage {
81 name = "Mako-1.0.1";
94 name = "Mako-1.0.1";
82 buildInputs = with self; [];
95 buildInputs = with self; [];
83 doCheck = false;
96 doCheck = false;
84 propagatedBuildInputs = with self; [MarkupSafe];
97 propagatedBuildInputs = with self; [MarkupSafe];
85 src = fetchurl {
98 src = fetchurl {
86 url = "https://pypi.python.org/packages/8e/a4/aa56533ecaa5f22ca92428f74e074d0c9337282933c722391902c8f9e0f8/Mako-1.0.1.tar.gz";
99 url = "https://pypi.python.org/packages/8e/a4/aa56533ecaa5f22ca92428f74e074d0c9337282933c722391902c8f9e0f8/Mako-1.0.1.tar.gz";
87 md5 = "9f0aafd177b039ef67b90ea350497a54";
100 md5 = "9f0aafd177b039ef67b90ea350497a54";
88 };
101 };
89 meta = {
102 meta = {
90 license = [ pkgs.lib.licenses.mit ];
103 license = [ pkgs.lib.licenses.mit ];
91 };
104 };
92 };
105 };
93 Markdown = super.buildPythonPackage {
106 Markdown = super.buildPythonPackage {
94 name = "Markdown-2.6.2";
107 name = "Markdown-2.6.2";
95 buildInputs = with self; [];
108 buildInputs = with self; [];
96 doCheck = false;
109 doCheck = false;
97 propagatedBuildInputs = with self; [];
110 propagatedBuildInputs = with self; [];
98 src = fetchurl {
111 src = fetchurl {
99 url = "https://pypi.python.org/packages/62/8b/83658b5f6c220d5fcde9f9852d46ea54765d734cfbc5a9f4c05bfc36db4d/Markdown-2.6.2.tar.gz";
112 url = "https://pypi.python.org/packages/62/8b/83658b5f6c220d5fcde9f9852d46ea54765d734cfbc5a9f4c05bfc36db4d/Markdown-2.6.2.tar.gz";
100 md5 = "256d19afcc564dc4ce4c229bb762f7ae";
113 md5 = "256d19afcc564dc4ce4c229bb762f7ae";
101 };
114 };
102 meta = {
115 meta = {
103 license = [ pkgs.lib.licenses.bsdOriginal ];
116 license = [ pkgs.lib.licenses.bsdOriginal ];
104 };
117 };
105 };
118 };
106 MarkupSafe = super.buildPythonPackage {
119 MarkupSafe = super.buildPythonPackage {
107 name = "MarkupSafe-0.23";
120 name = "MarkupSafe-0.23";
108 buildInputs = with self; [];
121 buildInputs = with self; [];
109 doCheck = false;
122 doCheck = false;
110 propagatedBuildInputs = with self; [];
123 propagatedBuildInputs = with self; [];
111 src = fetchurl {
124 src = fetchurl {
112 url = "https://pypi.python.org/packages/c0/41/bae1254e0396c0cc8cf1751cb7d9afc90a602353695af5952530482c963f/MarkupSafe-0.23.tar.gz";
125 url = "https://pypi.python.org/packages/c0/41/bae1254e0396c0cc8cf1751cb7d9afc90a602353695af5952530482c963f/MarkupSafe-0.23.tar.gz";
113 md5 = "f5ab3deee4c37cd6a922fb81e730da6e";
126 md5 = "f5ab3deee4c37cd6a922fb81e730da6e";
114 };
127 };
115 meta = {
128 meta = {
116 license = [ pkgs.lib.licenses.bsdOriginal ];
129 license = [ pkgs.lib.licenses.bsdOriginal ];
117 };
130 };
118 };
131 };
119 MySQL-python = super.buildPythonPackage {
132 MySQL-python = super.buildPythonPackage {
120 name = "MySQL-python-1.2.5";
133 name = "MySQL-python-1.2.5";
121 buildInputs = with self; [];
134 buildInputs = with self; [];
122 doCheck = false;
135 doCheck = false;
123 propagatedBuildInputs = with self; [];
136 propagatedBuildInputs = with self; [];
124 src = fetchurl {
137 src = fetchurl {
125 url = "https://pypi.python.org/packages/a5/e9/51b544da85a36a68debe7a7091f068d802fc515a3a202652828c73453cad/MySQL-python-1.2.5.zip";
138 url = "https://pypi.python.org/packages/a5/e9/51b544da85a36a68debe7a7091f068d802fc515a3a202652828c73453cad/MySQL-python-1.2.5.zip";
126 md5 = "654f75b302db6ed8dc5a898c625e030c";
139 md5 = "654f75b302db6ed8dc5a898c625e030c";
127 };
140 };
128 meta = {
141 meta = {
129 license = [ pkgs.lib.licenses.gpl1 ];
142 license = [ pkgs.lib.licenses.gpl1 ];
130 };
143 };
131 };
144 };
132 Paste = super.buildPythonPackage {
145 Paste = super.buildPythonPackage {
133 name = "Paste-2.0.2";
146 name = "Paste-2.0.2";
134 buildInputs = with self; [];
147 buildInputs = with self; [];
135 doCheck = false;
148 doCheck = false;
136 propagatedBuildInputs = with self; [six];
149 propagatedBuildInputs = with self; [six];
137 src = fetchurl {
150 src = fetchurl {
138 url = "https://pypi.python.org/packages/d5/8d/0f8ac40687b97ff3e07ebd1369be20bdb3f93864d2dc3c2ff542edb4ce50/Paste-2.0.2.tar.gz";
151 url = "https://pypi.python.org/packages/d5/8d/0f8ac40687b97ff3e07ebd1369be20bdb3f93864d2dc3c2ff542edb4ce50/Paste-2.0.2.tar.gz";
139 md5 = "4bfc8a7eaf858f6309d2ac0f40fc951c";
152 md5 = "4bfc8a7eaf858f6309d2ac0f40fc951c";
140 };
153 };
141 meta = {
154 meta = {
142 license = [ pkgs.lib.licenses.mit ];
155 license = [ pkgs.lib.licenses.mit ];
143 };
156 };
144 };
157 };
145 PasteDeploy = super.buildPythonPackage {
158 PasteDeploy = super.buildPythonPackage {
146 name = "PasteDeploy-1.5.2";
159 name = "PasteDeploy-1.5.2";
147 buildInputs = with self; [];
160 buildInputs = with self; [];
148 doCheck = false;
161 doCheck = false;
149 propagatedBuildInputs = with self; [];
162 propagatedBuildInputs = with self; [];
150 src = fetchurl {
163 src = fetchurl {
151 url = "https://pypi.python.org/packages/0f/90/8e20cdae206c543ea10793cbf4136eb9a8b3f417e04e40a29d72d9922cbd/PasteDeploy-1.5.2.tar.gz";
164 url = "https://pypi.python.org/packages/0f/90/8e20cdae206c543ea10793cbf4136eb9a8b3f417e04e40a29d72d9922cbd/PasteDeploy-1.5.2.tar.gz";
152 md5 = "352b7205c78c8de4987578d19431af3b";
165 md5 = "352b7205c78c8de4987578d19431af3b";
153 };
166 };
154 meta = {
167 meta = {
155 license = [ pkgs.lib.licenses.mit ];
168 license = [ pkgs.lib.licenses.mit ];
156 };
169 };
157 };
170 };
158 PasteScript = super.buildPythonPackage {
171 PasteScript = super.buildPythonPackage {
159 name = "PasteScript-1.7.5";
172 name = "PasteScript-1.7.5";
160 buildInputs = with self; [];
173 buildInputs = with self; [];
161 doCheck = false;
174 doCheck = false;
162 propagatedBuildInputs = with self; [Paste PasteDeploy];
175 propagatedBuildInputs = with self; [Paste PasteDeploy];
163 src = fetchurl {
176 src = fetchurl {
164 url = "https://pypi.python.org/packages/a5/05/fc60efa7c2f17a1dbaeccb2a903a1e90902d92b9d00eebabe3095829d806/PasteScript-1.7.5.tar.gz";
177 url = "https://pypi.python.org/packages/a5/05/fc60efa7c2f17a1dbaeccb2a903a1e90902d92b9d00eebabe3095829d806/PasteScript-1.7.5.tar.gz";
165 md5 = "4c72d78dcb6bb993f30536842c16af4d";
178 md5 = "4c72d78dcb6bb993f30536842c16af4d";
166 };
179 };
167 meta = {
180 meta = {
168 license = [ pkgs.lib.licenses.mit ];
181 license = [ pkgs.lib.licenses.mit ];
169 };
182 };
170 };
183 };
171 Pygments = super.buildPythonPackage {
184 Pygments = super.buildPythonPackage {
172 name = "Pygments-2.0.2";
185 name = "Pygments-2.1.3";
173 buildInputs = with self; [];
186 buildInputs = with self; [];
174 doCheck = false;
187 doCheck = false;
175 propagatedBuildInputs = with self; [];
188 propagatedBuildInputs = with self; [];
176 src = fetchurl {
189 src = fetchurl {
177 url = "https://pypi.python.org/packages/f4/c6/bdbc5a8a112256b2b6136af304dbae93d8b1ef8738ff2d12a51018800e46/Pygments-2.0.2.tar.gz";
190 url = "https://pypi.python.org/packages/b8/67/ab177979be1c81bc99c8d0592ef22d547e70bb4c6815c383286ed5dec504/Pygments-2.1.3.tar.gz";
178 md5 = "238587a1370d62405edabd0794b3ec4a";
191 md5 = "ed3fba2467c8afcda4d317e4ef2c6150";
179 };
192 };
180 meta = {
193 meta = {
181 license = [ pkgs.lib.licenses.bsdOriginal ];
194 license = [ pkgs.lib.licenses.bsdOriginal ];
182 };
195 };
183 };
196 };
184 Pylons = super.buildPythonPackage {
197 Pylons = super.buildPythonPackage {
185 name = "Pylons-1.0.1";
198 name = "Pylons-1.0.1";
186 buildInputs = with self; [];
199 buildInputs = with self; [];
187 doCheck = false;
200 doCheck = false;
188 propagatedBuildInputs = with self; [Routes WebHelpers Beaker Paste PasteDeploy PasteScript FormEncode simplejson decorator nose Mako WebError WebTest Tempita MarkupSafe WebOb];
201 propagatedBuildInputs = with self; [Routes WebHelpers Beaker Paste PasteDeploy PasteScript FormEncode simplejson decorator nose Mako WebError WebTest Tempita MarkupSafe WebOb];
189 src = fetchurl {
202 src = fetchurl {
190 url = "https://pypi.python.org/packages/a2/69/b835a6bad00acbfeed3f33c6e44fa3f936efc998c795bfb15c61a79ecf62/Pylons-1.0.1.tar.gz";
203 url = "https://pypi.python.org/packages/a2/69/b835a6bad00acbfeed3f33c6e44fa3f936efc998c795bfb15c61a79ecf62/Pylons-1.0.1.tar.gz";
191 md5 = "6cb880d75fa81213192142b07a6e4915";
204 md5 = "6cb880d75fa81213192142b07a6e4915";
192 };
205 };
193 meta = {
206 meta = {
194 license = [ pkgs.lib.licenses.bsdOriginal ];
207 license = [ pkgs.lib.licenses.bsdOriginal ];
195 };
208 };
196 };
209 };
197 Pyro4 = super.buildPythonPackage {
210 Pyro4 = super.buildPythonPackage {
198 name = "Pyro4-4.41";
211 name = "Pyro4-4.41";
199 buildInputs = with self; [];
212 buildInputs = with self; [];
200 doCheck = false;
213 doCheck = false;
201 propagatedBuildInputs = with self; [serpent];
214 propagatedBuildInputs = with self; [serpent];
202 src = fetchurl {
215 src = fetchurl {
203 url = "https://pypi.python.org/packages/56/2b/89b566b4bf3e7f8ba790db2d1223852f8cb454c52cab7693dd41f608ca2a/Pyro4-4.41.tar.gz";
216 url = "https://pypi.python.org/packages/56/2b/89b566b4bf3e7f8ba790db2d1223852f8cb454c52cab7693dd41f608ca2a/Pyro4-4.41.tar.gz";
204 md5 = "ed69e9bfafa9c06c049a87cb0c4c2b6c";
217 md5 = "ed69e9bfafa9c06c049a87cb0c4c2b6c";
205 };
218 };
206 meta = {
219 meta = {
207 license = [ pkgs.lib.licenses.mit ];
220 license = [ pkgs.lib.licenses.mit ];
208 };
221 };
209 };
222 };
210 Routes = super.buildPythonPackage {
223 Routes = super.buildPythonPackage {
211 name = "Routes-1.13";
224 name = "Routes-1.13";
212 buildInputs = with self; [];
225 buildInputs = with self; [];
213 doCheck = false;
226 doCheck = false;
214 propagatedBuildInputs = with self; [repoze.lru];
227 propagatedBuildInputs = with self; [repoze.lru];
215 src = fetchurl {
228 src = fetchurl {
216 url = "https://pypi.python.org/packages/88/d3/259c3b3cde8837eb9441ab5f574a660e8a4acea8f54a078441d4d2acac1c/Routes-1.13.tar.gz";
229 url = "https://pypi.python.org/packages/88/d3/259c3b3cde8837eb9441ab5f574a660e8a4acea8f54a078441d4d2acac1c/Routes-1.13.tar.gz";
217 md5 = "d527b0ab7dd9172b1275a41f97448783";
230 md5 = "d527b0ab7dd9172b1275a41f97448783";
218 };
231 };
219 meta = {
232 meta = {
220 license = [ pkgs.lib.licenses.bsdOriginal ];
233 license = [ pkgs.lib.licenses.bsdOriginal ];
221 };
234 };
222 };
235 };
223 SQLAlchemy = super.buildPythonPackage {
236 SQLAlchemy = super.buildPythonPackage {
224 name = "SQLAlchemy-0.9.9";
237 name = "SQLAlchemy-0.9.9";
225 buildInputs = with self; [];
238 buildInputs = with self; [];
226 doCheck = false;
239 doCheck = false;
227 propagatedBuildInputs = with self; [];
240 propagatedBuildInputs = with self; [];
228 src = fetchurl {
241 src = fetchurl {
229 url = "https://pypi.python.org/packages/28/f7/1bbfd0d8597e8c358d5e15a166a486ad82fc5579b4e67b6ef7c05b1d182b/SQLAlchemy-0.9.9.tar.gz";
242 url = "https://pypi.python.org/packages/28/f7/1bbfd0d8597e8c358d5e15a166a486ad82fc5579b4e67b6ef7c05b1d182b/SQLAlchemy-0.9.9.tar.gz";
230 md5 = "8a10a9bd13ed3336ef7333ac2cc679ff";
243 md5 = "8a10a9bd13ed3336ef7333ac2cc679ff";
231 };
244 };
232 meta = {
245 meta = {
233 license = [ pkgs.lib.licenses.mit ];
246 license = [ pkgs.lib.licenses.mit ];
234 };
247 };
235 };
248 };
236 Sphinx = super.buildPythonPackage {
249 Sphinx = super.buildPythonPackage {
237 name = "Sphinx-1.2.2";
250 name = "Sphinx-1.2.2";
238 buildInputs = with self; [];
251 buildInputs = with self; [];
239 doCheck = false;
252 doCheck = false;
240 propagatedBuildInputs = with self; [Pygments docutils Jinja2];
253 propagatedBuildInputs = with self; [Pygments docutils Jinja2];
241 src = fetchurl {
254 src = fetchurl {
242 url = "https://pypi.python.org/packages/0a/50/34017e6efcd372893a416aba14b84a1a149fc7074537b0e9cb6ca7b7abe9/Sphinx-1.2.2.tar.gz";
255 url = "https://pypi.python.org/packages/0a/50/34017e6efcd372893a416aba14b84a1a149fc7074537b0e9cb6ca7b7abe9/Sphinx-1.2.2.tar.gz";
243 md5 = "3dc73ccaa8d0bfb2d62fb671b1f7e8a4";
256 md5 = "3dc73ccaa8d0bfb2d62fb671b1f7e8a4";
244 };
257 };
245 meta = {
258 meta = {
246 license = [ pkgs.lib.licenses.bsdOriginal ];
259 license = [ pkgs.lib.licenses.bsdOriginal ];
247 };
260 };
248 };
261 };
249 Tempita = super.buildPythonPackage {
262 Tempita = super.buildPythonPackage {
250 name = "Tempita-0.5.2";
263 name = "Tempita-0.5.2";
251 buildInputs = with self; [];
264 buildInputs = with self; [];
252 doCheck = false;
265 doCheck = false;
253 propagatedBuildInputs = with self; [];
266 propagatedBuildInputs = with self; [];
254 src = fetchurl {
267 src = fetchurl {
255 url = "https://pypi.python.org/packages/56/c8/8ed6eee83dbddf7b0fc64dd5d4454bc05e6ccaafff47991f73f2894d9ff4/Tempita-0.5.2.tar.gz";
268 url = "https://pypi.python.org/packages/56/c8/8ed6eee83dbddf7b0fc64dd5d4454bc05e6ccaafff47991f73f2894d9ff4/Tempita-0.5.2.tar.gz";
256 md5 = "4c2f17bb9d481821c41b6fbee904cea1";
269 md5 = "4c2f17bb9d481821c41b6fbee904cea1";
257 };
270 };
258 meta = {
271 meta = {
259 license = [ pkgs.lib.licenses.mit ];
272 license = [ pkgs.lib.licenses.mit ];
260 };
273 };
261 };
274 };
262 URLObject = super.buildPythonPackage {
275 URLObject = super.buildPythonPackage {
263 name = "URLObject-2.4.0";
276 name = "URLObject-2.4.0";
264 buildInputs = with self; [];
277 buildInputs = with self; [];
265 doCheck = false;
278 doCheck = false;
266 propagatedBuildInputs = with self; [];
279 propagatedBuildInputs = with self; [];
267 src = fetchurl {
280 src = fetchurl {
268 url = "https://pypi.python.org/packages/cb/b6/e25e58500f9caef85d664bec71ec67c116897bfebf8622c32cb75d1ca199/URLObject-2.4.0.tar.gz";
281 url = "https://pypi.python.org/packages/cb/b6/e25e58500f9caef85d664bec71ec67c116897bfebf8622c32cb75d1ca199/URLObject-2.4.0.tar.gz";
269 md5 = "2ed819738a9f0a3051f31dc9924e3065";
282 md5 = "2ed819738a9f0a3051f31dc9924e3065";
270 };
283 };
271 meta = {
284 meta = {
272 license = [ ];
285 license = [ ];
273 };
286 };
274 };
287 };
275 WebError = super.buildPythonPackage {
288 WebError = super.buildPythonPackage {
276 name = "WebError-0.10.3";
289 name = "WebError-0.10.3";
277 buildInputs = with self; [];
290 buildInputs = with self; [];
278 doCheck = false;
291 doCheck = false;
279 propagatedBuildInputs = with self; [WebOb Tempita Pygments Paste];
292 propagatedBuildInputs = with self; [WebOb Tempita Pygments Paste];
280 src = fetchurl {
293 src = fetchurl {
281 url = "https://pypi.python.org/packages/35/76/e7e5c2ce7e9c7f31b54c1ff295a495886d1279a002557d74dd8957346a79/WebError-0.10.3.tar.gz";
294 url = "https://pypi.python.org/packages/35/76/e7e5c2ce7e9c7f31b54c1ff295a495886d1279a002557d74dd8957346a79/WebError-0.10.3.tar.gz";
282 md5 = "84b9990b0baae6fd440b1e60cdd06f9a";
295 md5 = "84b9990b0baae6fd440b1e60cdd06f9a";
283 };
296 };
284 meta = {
297 meta = {
285 license = [ pkgs.lib.licenses.mit ];
298 license = [ pkgs.lib.licenses.mit ];
286 };
299 };
287 };
300 };
288 WebHelpers = super.buildPythonPackage {
301 WebHelpers = super.buildPythonPackage {
289 name = "WebHelpers-1.3";
302 name = "WebHelpers-1.3";
290 buildInputs = with self; [];
303 buildInputs = with self; [];
291 doCheck = false;
304 doCheck = false;
292 propagatedBuildInputs = with self; [MarkupSafe];
305 propagatedBuildInputs = with self; [MarkupSafe];
293 src = fetchurl {
306 src = fetchurl {
294 url = "https://pypi.python.org/packages/ee/68/4d07672821d514184357f1552f2dad923324f597e722de3b016ca4f7844f/WebHelpers-1.3.tar.gz";
307 url = "https://pypi.python.org/packages/ee/68/4d07672821d514184357f1552f2dad923324f597e722de3b016ca4f7844f/WebHelpers-1.3.tar.gz";
295 md5 = "32749ffadfc40fea51075a7def32588b";
308 md5 = "32749ffadfc40fea51075a7def32588b";
296 };
309 };
297 meta = {
310 meta = {
298 license = [ pkgs.lib.licenses.bsdOriginal ];
311 license = [ pkgs.lib.licenses.bsdOriginal ];
299 };
312 };
300 };
313 };
301 WebHelpers2 = super.buildPythonPackage {
314 WebHelpers2 = super.buildPythonPackage {
302 name = "WebHelpers2-2.0";
315 name = "WebHelpers2-2.0";
303 buildInputs = with self; [];
316 buildInputs = with self; [];
304 doCheck = false;
317 doCheck = false;
305 propagatedBuildInputs = with self; [MarkupSafe six];
318 propagatedBuildInputs = with self; [MarkupSafe six];
306 src = fetchurl {
319 src = fetchurl {
307 url = "https://pypi.python.org/packages/ff/30/56342c6ea522439e3662427c8d7b5e5b390dff4ff2dc92d8afcb8ab68b75/WebHelpers2-2.0.tar.gz";
320 url = "https://pypi.python.org/packages/ff/30/56342c6ea522439e3662427c8d7b5e5b390dff4ff2dc92d8afcb8ab68b75/WebHelpers2-2.0.tar.gz";
308 md5 = "0f6b68d70c12ee0aed48c00b24da13d3";
321 md5 = "0f6b68d70c12ee0aed48c00b24da13d3";
309 };
322 };
310 meta = {
323 meta = {
311 license = [ pkgs.lib.licenses.mit ];
324 license = [ pkgs.lib.licenses.mit ];
312 };
325 };
313 };
326 };
314 WebOb = super.buildPythonPackage {
327 WebOb = super.buildPythonPackage {
315 name = "WebOb-1.3.1";
328 name = "WebOb-1.3.1";
316 buildInputs = with self; [];
329 buildInputs = with self; [];
317 doCheck = false;
330 doCheck = false;
318 propagatedBuildInputs = with self; [];
331 propagatedBuildInputs = with self; [];
319 src = fetchurl {
332 src = fetchurl {
320 url = "https://pypi.python.org/packages/16/78/adfc0380b8a0d75b2d543fa7085ba98a573b1ae486d9def88d172b81b9fa/WebOb-1.3.1.tar.gz";
333 url = "https://pypi.python.org/packages/16/78/adfc0380b8a0d75b2d543fa7085ba98a573b1ae486d9def88d172b81b9fa/WebOb-1.3.1.tar.gz";
321 md5 = "20918251c5726956ba8fef22d1556177";
334 md5 = "20918251c5726956ba8fef22d1556177";
322 };
335 };
323 meta = {
336 meta = {
324 license = [ pkgs.lib.licenses.mit ];
337 license = [ pkgs.lib.licenses.mit ];
325 };
338 };
326 };
339 };
327 WebTest = super.buildPythonPackage {
340 WebTest = super.buildPythonPackage {
328 name = "WebTest-1.4.3";
341 name = "WebTest-1.4.3";
329 buildInputs = with self; [];
342 buildInputs = with self; [];
330 doCheck = false;
343 doCheck = false;
331 propagatedBuildInputs = with self; [WebOb];
344 propagatedBuildInputs = with self; [WebOb];
332 src = fetchurl {
345 src = fetchurl {
333 url = "https://pypi.python.org/packages/51/3d/84fd0f628df10b30c7db87895f56d0158e5411206b721ca903cb51bfd948/WebTest-1.4.3.zip";
346 url = "https://pypi.python.org/packages/51/3d/84fd0f628df10b30c7db87895f56d0158e5411206b721ca903cb51bfd948/WebTest-1.4.3.zip";
334 md5 = "631ce728bed92c681a4020a36adbc353";
347 md5 = "631ce728bed92c681a4020a36adbc353";
335 };
348 };
336 meta = {
349 meta = {
337 license = [ pkgs.lib.licenses.mit ];
350 license = [ pkgs.lib.licenses.mit ];
338 };
351 };
339 };
352 };
340 Whoosh = super.buildPythonPackage {
353 Whoosh = super.buildPythonPackage {
341 name = "Whoosh-2.7.0";
354 name = "Whoosh-2.7.0";
342 buildInputs = with self; [];
355 buildInputs = with self; [];
343 doCheck = false;
356 doCheck = false;
344 propagatedBuildInputs = with self; [];
357 propagatedBuildInputs = with self; [];
345 src = fetchurl {
358 src = fetchurl {
346 url = "https://pypi.python.org/packages/1c/dc/2f0231ff3875ded36df8c1ab851451e51a237dc0e5a86d3d96036158da94/Whoosh-2.7.0.zip";
359 url = "https://pypi.python.org/packages/1c/dc/2f0231ff3875ded36df8c1ab851451e51a237dc0e5a86d3d96036158da94/Whoosh-2.7.0.zip";
347 md5 = "7abfd970f16fadc7311960f3fa0bc7a9";
360 md5 = "7abfd970f16fadc7311960f3fa0bc7a9";
348 };
361 };
349 meta = {
362 meta = {
350 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.bsd2 ];
363 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.bsd2 ];
351 };
364 };
352 };
365 };
353 alembic = super.buildPythonPackage {
366 alembic = super.buildPythonPackage {
354 name = "alembic-0.8.4";
367 name = "alembic-0.8.4";
355 buildInputs = with self; [];
368 buildInputs = with self; [];
356 doCheck = false;
369 doCheck = false;
357 propagatedBuildInputs = with self; [SQLAlchemy Mako python-editor];
370 propagatedBuildInputs = with self; [SQLAlchemy Mako python-editor];
358 src = fetchurl {
371 src = fetchurl {
359 url = "https://pypi.python.org/packages/ca/7e/299b4499b5c75e5a38c5845145ad24755bebfb8eec07a2e1c366b7181eeb/alembic-0.8.4.tar.gz";
372 url = "https://pypi.python.org/packages/ca/7e/299b4499b5c75e5a38c5845145ad24755bebfb8eec07a2e1c366b7181eeb/alembic-0.8.4.tar.gz";
360 md5 = "5f95d8ee62b443f9b37eb5bee76c582d";
373 md5 = "5f95d8ee62b443f9b37eb5bee76c582d";
361 };
374 };
362 meta = {
375 meta = {
363 license = [ pkgs.lib.licenses.mit ];
376 license = [ pkgs.lib.licenses.mit ];
364 };
377 };
365 };
378 };
366 amqplib = super.buildPythonPackage {
379 amqplib = super.buildPythonPackage {
367 name = "amqplib-1.0.2";
380 name = "amqplib-1.0.2";
368 buildInputs = with self; [];
381 buildInputs = with self; [];
369 doCheck = false;
382 doCheck = false;
370 propagatedBuildInputs = with self; [];
383 propagatedBuildInputs = with self; [];
371 src = fetchurl {
384 src = fetchurl {
372 url = "https://pypi.python.org/packages/75/b7/8c2429bf8d92354a0118614f9a4d15e53bc69ebedce534284111de5a0102/amqplib-1.0.2.tgz";
385 url = "https://pypi.python.org/packages/75/b7/8c2429bf8d92354a0118614f9a4d15e53bc69ebedce534284111de5a0102/amqplib-1.0.2.tgz";
373 md5 = "5c92f17fbedd99b2b4a836d4352d1e2f";
386 md5 = "5c92f17fbedd99b2b4a836d4352d1e2f";
374 };
387 };
375 meta = {
388 meta = {
376 license = [ { fullName = "LGPL"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
389 license = [ { fullName = "LGPL"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
377 };
390 };
378 };
391 };
379 anyjson = super.buildPythonPackage {
392 anyjson = super.buildPythonPackage {
380 name = "anyjson-0.3.3";
393 name = "anyjson-0.3.3";
381 buildInputs = with self; [];
394 buildInputs = with self; [];
382 doCheck = false;
395 doCheck = false;
383 propagatedBuildInputs = with self; [];
396 propagatedBuildInputs = with self; [];
384 src = fetchurl {
397 src = fetchurl {
385 url = "https://pypi.python.org/packages/c3/4d/d4089e1a3dd25b46bebdb55a992b0797cff657b4477bc32ce28038fdecbc/anyjson-0.3.3.tar.gz";
398 url = "https://pypi.python.org/packages/c3/4d/d4089e1a3dd25b46bebdb55a992b0797cff657b4477bc32ce28038fdecbc/anyjson-0.3.3.tar.gz";
386 md5 = "2ea28d6ec311aeeebaf993cb3008b27c";
399 md5 = "2ea28d6ec311aeeebaf993cb3008b27c";
387 };
400 };
388 meta = {
401 meta = {
389 license = [ pkgs.lib.licenses.bsdOriginal ];
402 license = [ pkgs.lib.licenses.bsdOriginal ];
390 };
403 };
391 };
404 };
392 appenlight-client = super.buildPythonPackage {
405 appenlight-client = super.buildPythonPackage {
393 name = "appenlight-client-0.6.14";
406 name = "appenlight-client-0.6.14";
394 buildInputs = with self; [];
407 buildInputs = with self; [];
395 doCheck = false;
408 doCheck = false;
396 propagatedBuildInputs = with self; [WebOb requests];
409 propagatedBuildInputs = with self; [WebOb requests];
397 src = fetchurl {
410 src = fetchurl {
398 url = "https://pypi.python.org/packages/4d/e0/23fee3ebada8143f707e65c06bcb82992040ee64ea8355e044ed55ebf0c1/appenlight_client-0.6.14.tar.gz";
411 url = "https://pypi.python.org/packages/4d/e0/23fee3ebada8143f707e65c06bcb82992040ee64ea8355e044ed55ebf0c1/appenlight_client-0.6.14.tar.gz";
399 md5 = "578c69b09f4356d898fff1199b98a95c";
412 md5 = "578c69b09f4356d898fff1199b98a95c";
400 };
413 };
401 meta = {
414 meta = {
402 license = [ pkgs.lib.licenses.bsdOriginal { fullName = "DFSG approved"; } ];
415 license = [ pkgs.lib.licenses.bsdOriginal { fullName = "DFSG approved"; } ];
403 };
416 };
404 };
417 };
405 authomatic = super.buildPythonPackage {
418 authomatic = super.buildPythonPackage {
406 name = "authomatic-0.1.0.post1";
419 name = "authomatic-0.1.0.post1";
407 buildInputs = with self; [];
420 buildInputs = with self; [];
408 doCheck = false;
421 doCheck = false;
409 propagatedBuildInputs = with self; [];
422 propagatedBuildInputs = with self; [];
410 src = fetchurl {
423 src = fetchurl {
411 url = "https://pypi.python.org/packages/08/1a/8a930461e604c2d5a7a871e1ac59fa82ccf994c32e807230c8d2fb07815a/Authomatic-0.1.0.post1.tar.gz";
424 url = "https://pypi.python.org/packages/08/1a/8a930461e604c2d5a7a871e1ac59fa82ccf994c32e807230c8d2fb07815a/Authomatic-0.1.0.post1.tar.gz";
412 md5 = "be3f3ce08747d776aae6d6cc8dcb49a9";
425 md5 = "be3f3ce08747d776aae6d6cc8dcb49a9";
413 };
426 };
414 meta = {
427 meta = {
415 license = [ pkgs.lib.licenses.mit ];
428 license = [ pkgs.lib.licenses.mit ];
416 };
429 };
417 };
430 };
418 backport-ipaddress = super.buildPythonPackage {
431 backport-ipaddress = super.buildPythonPackage {
419 name = "backport-ipaddress-0.1";
432 name = "backport-ipaddress-0.1";
420 buildInputs = with self; [];
433 buildInputs = with self; [];
421 doCheck = false;
434 doCheck = false;
422 propagatedBuildInputs = with self; [];
435 propagatedBuildInputs = with self; [];
423 src = fetchurl {
436 src = fetchurl {
424 url = "https://pypi.python.org/packages/d3/30/54c6dab05a4dec44db25ff309f1fbb6b7a8bde3f2bade38bb9da67bbab8f/backport_ipaddress-0.1.tar.gz";
437 url = "https://pypi.python.org/packages/d3/30/54c6dab05a4dec44db25ff309f1fbb6b7a8bde3f2bade38bb9da67bbab8f/backport_ipaddress-0.1.tar.gz";
425 md5 = "9c1f45f4361f71b124d7293a60006c05";
438 md5 = "9c1f45f4361f71b124d7293a60006c05";
426 };
439 };
427 meta = {
440 meta = {
428 license = [ pkgs.lib.licenses.psfl ];
441 license = [ pkgs.lib.licenses.psfl ];
429 };
442 };
430 };
443 };
431 bottle = super.buildPythonPackage {
444 bottle = super.buildPythonPackage {
432 name = "bottle-0.12.8";
445 name = "bottle-0.12.8";
433 buildInputs = with self; [];
446 buildInputs = with self; [];
434 doCheck = false;
447 doCheck = false;
435 propagatedBuildInputs = with self; [];
448 propagatedBuildInputs = with self; [];
436 src = fetchurl {
449 src = fetchurl {
437 url = "https://pypi.python.org/packages/52/df/e4a408f3a7af396d186d4ecd3b389dd764f0f943b4fa8d257bfe7b49d343/bottle-0.12.8.tar.gz";
450 url = "https://pypi.python.org/packages/52/df/e4a408f3a7af396d186d4ecd3b389dd764f0f943b4fa8d257bfe7b49d343/bottle-0.12.8.tar.gz";
438 md5 = "13132c0a8f607bf860810a6ee9064c5b";
451 md5 = "13132c0a8f607bf860810a6ee9064c5b";
439 };
452 };
440 meta = {
453 meta = {
441 license = [ pkgs.lib.licenses.mit ];
454 license = [ pkgs.lib.licenses.mit ];
442 };
455 };
443 };
456 };
444 bumpversion = super.buildPythonPackage {
457 bumpversion = super.buildPythonPackage {
445 name = "bumpversion-0.5.3";
458 name = "bumpversion-0.5.3";
446 buildInputs = with self; [];
459 buildInputs = with self; [];
447 doCheck = false;
460 doCheck = false;
448 propagatedBuildInputs = with self; [];
461 propagatedBuildInputs = with self; [];
449 src = fetchurl {
462 src = fetchurl {
450 url = "https://pypi.python.org/packages/14/41/8c9da3549f8e00c84f0432c3a8cf8ed6898374714676aab91501d48760db/bumpversion-0.5.3.tar.gz";
463 url = "https://pypi.python.org/packages/14/41/8c9da3549f8e00c84f0432c3a8cf8ed6898374714676aab91501d48760db/bumpversion-0.5.3.tar.gz";
451 md5 = "c66a3492eafcf5ad4b024be9fca29820";
464 md5 = "c66a3492eafcf5ad4b024be9fca29820";
452 };
465 };
453 meta = {
466 meta = {
454 license = [ pkgs.lib.licenses.mit ];
467 license = [ pkgs.lib.licenses.mit ];
455 };
468 };
456 };
469 };
457 celery = super.buildPythonPackage {
470 celery = super.buildPythonPackage {
458 name = "celery-2.2.10";
471 name = "celery-2.2.10";
459 buildInputs = with self; [];
472 buildInputs = with self; [];
460 doCheck = false;
473 doCheck = false;
461 propagatedBuildInputs = with self; [python-dateutil anyjson kombu pyparsing];
474 propagatedBuildInputs = with self; [python-dateutil anyjson kombu pyparsing];
462 src = fetchurl {
475 src = fetchurl {
463 url = "https://pypi.python.org/packages/b1/64/860fd50e45844c83442e7953effcddeff66b2851d90b2d784f7201c111b8/celery-2.2.10.tar.gz";
476 url = "https://pypi.python.org/packages/b1/64/860fd50e45844c83442e7953effcddeff66b2851d90b2d784f7201c111b8/celery-2.2.10.tar.gz";
464 md5 = "898bc87e54f278055b561316ba73e222";
477 md5 = "898bc87e54f278055b561316ba73e222";
465 };
478 };
466 meta = {
479 meta = {
467 license = [ pkgs.lib.licenses.bsdOriginal ];
480 license = [ pkgs.lib.licenses.bsdOriginal ];
468 };
481 };
469 };
482 };
483 channelstream = super.buildPythonPackage {
484 name = "channelstream-0.5.2";
485 buildInputs = with self; [];
486 doCheck = false;
487 propagatedBuildInputs = with self; [gevent ws4py pyramid pyramid-jinja2 itsdangerous requests six];
488 src = fetchurl {
489 url = "https://pypi.python.org/packages/2b/31/29a8e085cf5bf97fa88e7b947adabfc581a18a3463adf77fb6dada34a65f/channelstream-0.5.2.tar.gz";
490 md5 = "1c5eb2a8a405be6f1073da94da6d81d3";
491 };
492 meta = {
493 license = [ pkgs.lib.licenses.bsdOriginal ];
494 };
495 };
470 click = super.buildPythonPackage {
496 click = super.buildPythonPackage {
471 name = "click-5.1";
497 name = "click-5.1";
472 buildInputs = with self; [];
498 buildInputs = with self; [];
473 doCheck = false;
499 doCheck = false;
474 propagatedBuildInputs = with self; [];
500 propagatedBuildInputs = with self; [];
475 src = fetchurl {
501 src = fetchurl {
476 url = "https://pypi.python.org/packages/b7/34/a496632c4fb6c1ee76efedf77bb8d28b29363d839953d95095b12defe791/click-5.1.tar.gz";
502 url = "https://pypi.python.org/packages/b7/34/a496632c4fb6c1ee76efedf77bb8d28b29363d839953d95095b12defe791/click-5.1.tar.gz";
477 md5 = "9c5323008cccfe232a8b161fc8196d41";
503 md5 = "9c5323008cccfe232a8b161fc8196d41";
478 };
504 };
479 meta = {
505 meta = {
480 license = [ pkgs.lib.licenses.bsdOriginal ];
506 license = [ pkgs.lib.licenses.bsdOriginal ];
481 };
507 };
482 };
508 };
483 colander = super.buildPythonPackage {
509 colander = super.buildPythonPackage {
484 name = "colander-1.2";
510 name = "colander-1.2";
485 buildInputs = with self; [];
511 buildInputs = with self; [];
486 doCheck = false;
512 doCheck = false;
487 propagatedBuildInputs = with self; [translationstring iso8601];
513 propagatedBuildInputs = with self; [translationstring iso8601];
488 src = fetchurl {
514 src = fetchurl {
489 url = "https://pypi.python.org/packages/14/23/c9ceba07a6a1dc0eefbb215fc0dc64aabc2b22ee756bc0f0c13278fa0887/colander-1.2.tar.gz";
515 url = "https://pypi.python.org/packages/14/23/c9ceba07a6a1dc0eefbb215fc0dc64aabc2b22ee756bc0f0c13278fa0887/colander-1.2.tar.gz";
490 md5 = "83db21b07936a0726e588dae1914b9ed";
516 md5 = "83db21b07936a0726e588dae1914b9ed";
491 };
517 };
492 meta = {
518 meta = {
493 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
519 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
494 };
520 };
495 };
521 };
496 configobj = super.buildPythonPackage {
522 configobj = super.buildPythonPackage {
497 name = "configobj-5.0.6";
523 name = "configobj-5.0.6";
498 buildInputs = with self; [];
524 buildInputs = with self; [];
499 doCheck = false;
525 doCheck = false;
500 propagatedBuildInputs = with self; [six];
526 propagatedBuildInputs = with self; [six];
501 src = fetchurl {
527 src = fetchurl {
502 url = "https://pypi.python.org/packages/64/61/079eb60459c44929e684fa7d9e2fdca403f67d64dd9dbac27296be2e0fab/configobj-5.0.6.tar.gz";
528 url = "https://pypi.python.org/packages/64/61/079eb60459c44929e684fa7d9e2fdca403f67d64dd9dbac27296be2e0fab/configobj-5.0.6.tar.gz";
503 md5 = "e472a3a1c2a67bb0ec9b5d54c13a47d6";
529 md5 = "e472a3a1c2a67bb0ec9b5d54c13a47d6";
504 };
530 };
505 meta = {
531 meta = {
506 license = [ pkgs.lib.licenses.bsdOriginal ];
532 license = [ pkgs.lib.licenses.bsdOriginal ];
507 };
533 };
508 };
534 };
509 cov-core = super.buildPythonPackage {
535 cov-core = super.buildPythonPackage {
510 name = "cov-core-1.15.0";
536 name = "cov-core-1.15.0";
511 buildInputs = with self; [];
537 buildInputs = with self; [];
512 doCheck = false;
538 doCheck = false;
513 propagatedBuildInputs = with self; [coverage];
539 propagatedBuildInputs = with self; [coverage];
514 src = fetchurl {
540 src = fetchurl {
515 url = "https://pypi.python.org/packages/4b/87/13e75a47b4ba1be06f29f6d807ca99638bedc6b57fa491cd3de891ca2923/cov-core-1.15.0.tar.gz";
541 url = "https://pypi.python.org/packages/4b/87/13e75a47b4ba1be06f29f6d807ca99638bedc6b57fa491cd3de891ca2923/cov-core-1.15.0.tar.gz";
516 md5 = "f519d4cb4c4e52856afb14af52919fe6";
542 md5 = "f519d4cb4c4e52856afb14af52919fe6";
517 };
543 };
518 meta = {
544 meta = {
519 license = [ pkgs.lib.licenses.mit ];
545 license = [ pkgs.lib.licenses.mit ];
520 };
546 };
521 };
547 };
522 coverage = super.buildPythonPackage {
548 coverage = super.buildPythonPackage {
523 name = "coverage-3.7.1";
549 name = "coverage-3.7.1";
524 buildInputs = with self; [];
550 buildInputs = with self; [];
525 doCheck = false;
551 doCheck = false;
526 propagatedBuildInputs = with self; [];
552 propagatedBuildInputs = with self; [];
527 src = fetchurl {
553 src = fetchurl {
528 url = "https://pypi.python.org/packages/09/4f/89b06c7fdc09687bca507dc411c342556ef9c5a3b26756137a4878ff19bf/coverage-3.7.1.tar.gz";
554 url = "https://pypi.python.org/packages/09/4f/89b06c7fdc09687bca507dc411c342556ef9c5a3b26756137a4878ff19bf/coverage-3.7.1.tar.gz";
529 md5 = "c47b36ceb17eaff3ecfab3bcd347d0df";
555 md5 = "c47b36ceb17eaff3ecfab3bcd347d0df";
530 };
556 };
531 meta = {
557 meta = {
532 license = [ pkgs.lib.licenses.bsdOriginal ];
558 license = [ pkgs.lib.licenses.bsdOriginal ];
533 };
559 };
534 };
560 };
535 cssselect = super.buildPythonPackage {
561 cssselect = super.buildPythonPackage {
536 name = "cssselect-0.9.1";
562 name = "cssselect-0.9.1";
537 buildInputs = with self; [];
563 buildInputs = with self; [];
538 doCheck = false;
564 doCheck = false;
539 propagatedBuildInputs = with self; [];
565 propagatedBuildInputs = with self; [];
540 src = fetchurl {
566 src = fetchurl {
541 url = "https://pypi.python.org/packages/aa/e5/9ee1460d485b94a6d55732eb7ad5b6c084caf73dd6f9cb0bb7d2a78fafe8/cssselect-0.9.1.tar.gz";
567 url = "https://pypi.python.org/packages/aa/e5/9ee1460d485b94a6d55732eb7ad5b6c084caf73dd6f9cb0bb7d2a78fafe8/cssselect-0.9.1.tar.gz";
542 md5 = "c74f45966277dc7a0f768b9b0f3522ac";
568 md5 = "c74f45966277dc7a0f768b9b0f3522ac";
543 };
569 };
544 meta = {
570 meta = {
545 license = [ pkgs.lib.licenses.bsdOriginal ];
571 license = [ pkgs.lib.licenses.bsdOriginal ];
546 };
572 };
547 };
573 };
548 decorator = super.buildPythonPackage {
574 decorator = super.buildPythonPackage {
549 name = "decorator-3.4.2";
575 name = "decorator-3.4.2";
550 buildInputs = with self; [];
576 buildInputs = with self; [];
551 doCheck = false;
577 doCheck = false;
552 propagatedBuildInputs = with self; [];
578 propagatedBuildInputs = with self; [];
553 src = fetchurl {
579 src = fetchurl {
554 url = "https://pypi.python.org/packages/35/3a/42566eb7a2cbac774399871af04e11d7ae3fc2579e7dae85213b8d1d1c57/decorator-3.4.2.tar.gz";
580 url = "https://pypi.python.org/packages/35/3a/42566eb7a2cbac774399871af04e11d7ae3fc2579e7dae85213b8d1d1c57/decorator-3.4.2.tar.gz";
555 md5 = "9e0536870d2b83ae27d58dbf22582f4d";
581 md5 = "9e0536870d2b83ae27d58dbf22582f4d";
556 };
582 };
557 meta = {
583 meta = {
558 license = [ pkgs.lib.licenses.bsdOriginal ];
584 license = [ pkgs.lib.licenses.bsdOriginal ];
559 };
585 };
560 };
586 };
587 deform = super.buildPythonPackage {
588 name = "deform-2.0a2";
589 buildInputs = with self; [];
590 doCheck = false;
591 propagatedBuildInputs = with self; [Chameleon colander peppercorn translationstring zope.deprecation];
592 src = fetchurl {
593 url = "https://pypi.python.org/packages/8d/b3/aab57e81da974a806dc9c5fa024a6404720f890a6dcf2e80885e3cb4609a/deform-2.0a2.tar.gz";
594 md5 = "7a90d41f7fbc18002ce74f39bd90a5e4";
595 };
596 meta = {
597 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
598 };
599 };
561 docutils = super.buildPythonPackage {
600 docutils = super.buildPythonPackage {
562 name = "docutils-0.12";
601 name = "docutils-0.12";
563 buildInputs = with self; [];
602 buildInputs = with self; [];
564 doCheck = false;
603 doCheck = false;
565 propagatedBuildInputs = with self; [];
604 propagatedBuildInputs = with self; [];
566 src = fetchurl {
605 src = fetchurl {
567 url = "https://pypi.python.org/packages/37/38/ceda70135b9144d84884ae2fc5886c6baac4edea39550f28bcd144c1234d/docutils-0.12.tar.gz";
606 url = "https://pypi.python.org/packages/37/38/ceda70135b9144d84884ae2fc5886c6baac4edea39550f28bcd144c1234d/docutils-0.12.tar.gz";
568 md5 = "4622263b62c5c771c03502afa3157768";
607 md5 = "4622263b62c5c771c03502afa3157768";
569 };
608 };
570 meta = {
609 meta = {
571 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.publicDomain pkgs.lib.licenses.gpl1 { fullName = "public domain, Python, 2-Clause BSD, GPL 3 (see COPYING.txt)"; } pkgs.lib.licenses.psfl ];
610 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.publicDomain pkgs.lib.licenses.gpl1 { fullName = "public domain, Python, 2-Clause BSD, GPL 3 (see COPYING.txt)"; } pkgs.lib.licenses.psfl ];
572 };
611 };
573 };
612 };
574 dogpile.cache = super.buildPythonPackage {
613 dogpile.cache = super.buildPythonPackage {
575 name = "dogpile.cache-0.5.7";
614 name = "dogpile.cache-0.6.1";
576 buildInputs = with self; [];
615 buildInputs = with self; [];
577 doCheck = false;
616 doCheck = false;
578 propagatedBuildInputs = with self; [dogpile.core];
617 propagatedBuildInputs = with self; [];
579 src = fetchurl {
618 src = fetchurl {
580 url = "https://pypi.python.org/packages/07/74/2a83bedf758156d9c95d112691bbad870d3b77ccbcfb781b4ef836ea7d96/dogpile.cache-0.5.7.tar.gz";
619 url = "https://pypi.python.org/packages/f6/a0/6f2142c58c6588d17c734265b103ae1cd0741e1681dd9483a63f22033375/dogpile.cache-0.6.1.tar.gz";
581 md5 = "3e58ce41af574aab41d78e9c4190f194";
620 md5 = "35d7fb30f22bbd0685763d894dd079a9";
582 };
621 };
583 meta = {
622 meta = {
584 license = [ pkgs.lib.licenses.bsdOriginal ];
623 license = [ pkgs.lib.licenses.bsdOriginal ];
585 };
624 };
586 };
625 };
587 dogpile.core = super.buildPythonPackage {
626 dogpile.core = super.buildPythonPackage {
588 name = "dogpile.core-0.4.1";
627 name = "dogpile.core-0.4.1";
589 buildInputs = with self; [];
628 buildInputs = with self; [];
590 doCheck = false;
629 doCheck = false;
591 propagatedBuildInputs = with self; [];
630 propagatedBuildInputs = with self; [];
592 src = fetchurl {
631 src = fetchurl {
593 url = "https://pypi.python.org/packages/0e/77/e72abc04c22aedf874301861e5c1e761231c288b5de369c18be8f4b5c9bb/dogpile.core-0.4.1.tar.gz";
632 url = "https://pypi.python.org/packages/0e/77/e72abc04c22aedf874301861e5c1e761231c288b5de369c18be8f4b5c9bb/dogpile.core-0.4.1.tar.gz";
594 md5 = "01cb19f52bba3e95c9b560f39341f045";
633 md5 = "01cb19f52bba3e95c9b560f39341f045";
595 };
634 };
596 meta = {
635 meta = {
597 license = [ pkgs.lib.licenses.bsdOriginal ];
636 license = [ pkgs.lib.licenses.bsdOriginal ];
598 };
637 };
599 };
638 };
600 dulwich = super.buildPythonPackage {
639 dulwich = super.buildPythonPackage {
601 name = "dulwich-0.12.0";
640 name = "dulwich-0.12.0";
602 buildInputs = with self; [];
641 buildInputs = with self; [];
603 doCheck = false;
642 doCheck = false;
604 propagatedBuildInputs = with self; [];
643 propagatedBuildInputs = with self; [];
605 src = fetchurl {
644 src = fetchurl {
606 url = "https://pypi.python.org/packages/6f/04/fbe561b6d45c0ec758330d5b7f5ba4b6cb4f1ca1ab49859d2fc16320da75/dulwich-0.12.0.tar.gz";
645 url = "https://pypi.python.org/packages/6f/04/fbe561b6d45c0ec758330d5b7f5ba4b6cb4f1ca1ab49859d2fc16320da75/dulwich-0.12.0.tar.gz";
607 md5 = "f3a8a12bd9f9dd8c233e18f3d49436fa";
646 md5 = "f3a8a12bd9f9dd8c233e18f3d49436fa";
608 };
647 };
609 meta = {
648 meta = {
610 license = [ pkgs.lib.licenses.gpl2Plus ];
649 license = [ pkgs.lib.licenses.gpl2Plus ];
611 };
650 };
612 };
651 };
613 ecdsa = super.buildPythonPackage {
652 ecdsa = super.buildPythonPackage {
614 name = "ecdsa-0.11";
653 name = "ecdsa-0.11";
615 buildInputs = with self; [];
654 buildInputs = with self; [];
616 doCheck = false;
655 doCheck = false;
617 propagatedBuildInputs = with self; [];
656 propagatedBuildInputs = with self; [];
618 src = fetchurl {
657 src = fetchurl {
619 url = "https://pypi.python.org/packages/6c/3f/92fe5dcdcaa7bd117be21e5520c9a54375112b66ec000d209e9e9519fad1/ecdsa-0.11.tar.gz";
658 url = "https://pypi.python.org/packages/6c/3f/92fe5dcdcaa7bd117be21e5520c9a54375112b66ec000d209e9e9519fad1/ecdsa-0.11.tar.gz";
620 md5 = "8ef586fe4dbb156697d756900cb41d7c";
659 md5 = "8ef586fe4dbb156697d756900cb41d7c";
621 };
660 };
622 meta = {
661 meta = {
623 license = [ pkgs.lib.licenses.mit ];
662 license = [ pkgs.lib.licenses.mit ];
624 };
663 };
625 };
664 };
626 elasticsearch = super.buildPythonPackage {
665 elasticsearch = super.buildPythonPackage {
627 name = "elasticsearch-2.3.0";
666 name = "elasticsearch-2.3.0";
628 buildInputs = with self; [];
667 buildInputs = with self; [];
629 doCheck = false;
668 doCheck = false;
630 propagatedBuildInputs = with self; [urllib3];
669 propagatedBuildInputs = with self; [urllib3];
631 src = fetchurl {
670 src = fetchurl {
632 url = "https://pypi.python.org/packages/10/35/5fd52c5f0b0ee405ed4b5195e8bce44c5e041787680dc7b94b8071cac600/elasticsearch-2.3.0.tar.gz";
671 url = "https://pypi.python.org/packages/10/35/5fd52c5f0b0ee405ed4b5195e8bce44c5e041787680dc7b94b8071cac600/elasticsearch-2.3.0.tar.gz";
633 md5 = "2550f3b51629cf1ef9636608af92c340";
672 md5 = "2550f3b51629cf1ef9636608af92c340";
634 };
673 };
635 meta = {
674 meta = {
636 license = [ pkgs.lib.licenses.asl20 ];
675 license = [ pkgs.lib.licenses.asl20 ];
637 };
676 };
638 };
677 };
639 elasticsearch-dsl = super.buildPythonPackage {
678 elasticsearch-dsl = super.buildPythonPackage {
640 name = "elasticsearch-dsl-2.0.0";
679 name = "elasticsearch-dsl-2.0.0";
641 buildInputs = with self; [];
680 buildInputs = with self; [];
642 doCheck = false;
681 doCheck = false;
643 propagatedBuildInputs = with self; [six python-dateutil elasticsearch];
682 propagatedBuildInputs = with self; [six python-dateutil elasticsearch];
644 src = fetchurl {
683 src = fetchurl {
645 url = "https://pypi.python.org/packages/4e/5d/e788ae8dbe2ff4d13426db0a027533386a5c276c77a2654dc0e2007ce04a/elasticsearch-dsl-2.0.0.tar.gz";
684 url = "https://pypi.python.org/packages/4e/5d/e788ae8dbe2ff4d13426db0a027533386a5c276c77a2654dc0e2007ce04a/elasticsearch-dsl-2.0.0.tar.gz";
646 md5 = "4cdfec81bb35383dd3b7d02d7dc5ee68";
685 md5 = "4cdfec81bb35383dd3b7d02d7dc5ee68";
647 };
686 };
648 meta = {
687 meta = {
649 license = [ pkgs.lib.licenses.asl20 ];
688 license = [ pkgs.lib.licenses.asl20 ];
650 };
689 };
651 };
690 };
652 flake8 = super.buildPythonPackage {
691 flake8 = super.buildPythonPackage {
653 name = "flake8-2.4.1";
692 name = "flake8-2.4.1";
654 buildInputs = with self; [];
693 buildInputs = with self; [];
655 doCheck = false;
694 doCheck = false;
656 propagatedBuildInputs = with self; [pyflakes pep8 mccabe];
695 propagatedBuildInputs = with self; [pyflakes pep8 mccabe];
657 src = fetchurl {
696 src = fetchurl {
658 url = "https://pypi.python.org/packages/8f/b5/9a73c66c7dba273bac8758398f060c008a25f3e84531063b42503b5d0a95/flake8-2.4.1.tar.gz";
697 url = "https://pypi.python.org/packages/8f/b5/9a73c66c7dba273bac8758398f060c008a25f3e84531063b42503b5d0a95/flake8-2.4.1.tar.gz";
659 md5 = "ed45d3db81a3b7c88bd63c6e37ca1d65";
698 md5 = "ed45d3db81a3b7c88bd63c6e37ca1d65";
660 };
699 };
661 meta = {
700 meta = {
662 license = [ pkgs.lib.licenses.mit ];
701 license = [ pkgs.lib.licenses.mit ];
663 };
702 };
664 };
703 };
665 future = super.buildPythonPackage {
704 future = super.buildPythonPackage {
666 name = "future-0.14.3";
705 name = "future-0.14.3";
667 buildInputs = with self; [];
706 buildInputs = with self; [];
668 doCheck = false;
707 doCheck = false;
669 propagatedBuildInputs = with self; [];
708 propagatedBuildInputs = with self; [];
670 src = fetchurl {
709 src = fetchurl {
671 url = "https://pypi.python.org/packages/83/80/8ef3a11a15f8eaafafa0937b20c1b3f73527e69ab6b3fa1cf94a5a96aabb/future-0.14.3.tar.gz";
710 url = "https://pypi.python.org/packages/83/80/8ef3a11a15f8eaafafa0937b20c1b3f73527e69ab6b3fa1cf94a5a96aabb/future-0.14.3.tar.gz";
672 md5 = "e94079b0bd1fc054929e8769fc0f6083";
711 md5 = "e94079b0bd1fc054929e8769fc0f6083";
673 };
712 };
674 meta = {
713 meta = {
675 license = [ { fullName = "OSI Approved"; } pkgs.lib.licenses.mit ];
714 license = [ { fullName = "OSI Approved"; } pkgs.lib.licenses.mit ];
676 };
715 };
677 };
716 };
678 futures = super.buildPythonPackage {
717 futures = super.buildPythonPackage {
679 name = "futures-3.0.2";
718 name = "futures-3.0.2";
680 buildInputs = with self; [];
719 buildInputs = with self; [];
681 doCheck = false;
720 doCheck = false;
682 propagatedBuildInputs = with self; [];
721 propagatedBuildInputs = with self; [];
683 src = fetchurl {
722 src = fetchurl {
684 url = "https://pypi.python.org/packages/f8/e7/fc0fcbeb9193ba2d4de00b065e7fd5aecd0679e93ce95a07322b2b1434f4/futures-3.0.2.tar.gz";
723 url = "https://pypi.python.org/packages/f8/e7/fc0fcbeb9193ba2d4de00b065e7fd5aecd0679e93ce95a07322b2b1434f4/futures-3.0.2.tar.gz";
685 md5 = "42aaf1e4de48d6e871d77dc1f9d96d5a";
724 md5 = "42aaf1e4de48d6e871d77dc1f9d96d5a";
686 };
725 };
687 meta = {
726 meta = {
688 license = [ pkgs.lib.licenses.bsdOriginal ];
727 license = [ pkgs.lib.licenses.bsdOriginal ];
689 };
728 };
690 };
729 };
730 gevent = super.buildPythonPackage {
731 name = "gevent-1.1.1";
732 buildInputs = with self; [];
733 doCheck = false;
734 propagatedBuildInputs = with self; [greenlet];
735 src = fetchurl {
736 url = "https://pypi.python.org/packages/12/dc/0b2e57823225de86f6e111a65d212c9e3b64847dddaa19691a6cb94b0b2e/gevent-1.1.1.tar.gz";
737 md5 = "1532f5396ab4d07a231f1935483be7c3";
738 };
739 meta = {
740 license = [ pkgs.lib.licenses.mit ];
741 };
742 };
691 gnureadline = super.buildPythonPackage {
743 gnureadline = super.buildPythonPackage {
692 name = "gnureadline-6.3.3";
744 name = "gnureadline-6.3.3";
693 buildInputs = with self; [];
745 buildInputs = with self; [];
694 doCheck = false;
746 doCheck = false;
695 propagatedBuildInputs = with self; [];
747 propagatedBuildInputs = with self; [];
696 src = fetchurl {
748 src = fetchurl {
697 url = "https://pypi.python.org/packages/3a/ee/2c3f568b0a74974791ac590ec742ef6133e2fbd287a074ba72a53fa5e97c/gnureadline-6.3.3.tar.gz";
749 url = "https://pypi.python.org/packages/3a/ee/2c3f568b0a74974791ac590ec742ef6133e2fbd287a074ba72a53fa5e97c/gnureadline-6.3.3.tar.gz";
698 md5 = "c4af83c9a3fbeac8f2da9b5a7c60e51c";
750 md5 = "c4af83c9a3fbeac8f2da9b5a7c60e51c";
699 };
751 };
700 meta = {
752 meta = {
701 license = [ pkgs.lib.licenses.gpl1 ];
753 license = [ pkgs.lib.licenses.gpl1 ];
702 };
754 };
703 };
755 };
704 gprof2dot = super.buildPythonPackage {
756 gprof2dot = super.buildPythonPackage {
705 name = "gprof2dot-2015.12.1";
757 name = "gprof2dot-2015.12.01";
706 buildInputs = with self; [];
758 buildInputs = with self; [];
707 doCheck = false;
759 doCheck = false;
708 propagatedBuildInputs = with self; [];
760 propagatedBuildInputs = with self; [];
709 src = fetchurl {
761 src = fetchurl {
710 url = "https://pypi.python.org/packages/b9/34/7bf93c1952d40fa5c95ad963f4d8344b61ef58558632402eca18e6c14127/gprof2dot-2015.12.1.tar.gz";
762 url = "https://pypi.python.org/packages/b9/34/7bf93c1952d40fa5c95ad963f4d8344b61ef58558632402eca18e6c14127/gprof2dot-2015.12.1.tar.gz";
711 md5 = "e23bf4e2f94db032750c193384b4165b";
763 md5 = "e23bf4e2f94db032750c193384b4165b";
712 };
764 };
713 meta = {
765 meta = {
714 license = [ { fullName = "LGPL"; } ];
766 license = [ { fullName = "LGPL"; } ];
715 };
767 };
716 };
768 };
769 greenlet = super.buildPythonPackage {
770 name = "greenlet-0.4.9";
771 buildInputs = with self; [];
772 doCheck = false;
773 propagatedBuildInputs = with self; [];
774 src = fetchurl {
775 url = "https://pypi.python.org/packages/4e/3d/9d421539b74e33608b245092870156b2e171fb49f2b51390aa4641eecb4a/greenlet-0.4.9.zip";
776 md5 = "c6659cdb2a5e591723e629d2eef22e82";
777 };
778 meta = {
779 license = [ pkgs.lib.licenses.mit ];
780 };
781 };
717 gunicorn = super.buildPythonPackage {
782 gunicorn = super.buildPythonPackage {
718 name = "gunicorn-19.6.0";
783 name = "gunicorn-19.6.0";
719 buildInputs = with self; [];
784 buildInputs = with self; [];
720 doCheck = false;
785 doCheck = false;
721 propagatedBuildInputs = with self; [];
786 propagatedBuildInputs = with self; [];
722 src = fetchurl {
787 src = fetchurl {
723 url = "https://pypi.python.org/packages/84/ce/7ea5396efad1cef682bbc4068e72a0276341d9d9d0f501da609fab9fcb80/gunicorn-19.6.0.tar.gz";
788 url = "https://pypi.python.org/packages/84/ce/7ea5396efad1cef682bbc4068e72a0276341d9d9d0f501da609fab9fcb80/gunicorn-19.6.0.tar.gz";
724 md5 = "338e5e8a83ea0f0625f768dba4597530";
789 md5 = "338e5e8a83ea0f0625f768dba4597530";
725 };
790 };
726 meta = {
791 meta = {
727 license = [ pkgs.lib.licenses.mit ];
792 license = [ pkgs.lib.licenses.mit ];
728 };
793 };
729 };
794 };
730 infrae.cache = super.buildPythonPackage {
795 infrae.cache = super.buildPythonPackage {
731 name = "infrae.cache-1.0.1";
796 name = "infrae.cache-1.0.1";
732 buildInputs = with self; [];
797 buildInputs = with self; [];
733 doCheck = false;
798 doCheck = false;
734 propagatedBuildInputs = with self; [Beaker repoze.lru];
799 propagatedBuildInputs = with self; [Beaker repoze.lru];
735 src = fetchurl {
800 src = fetchurl {
736 url = "https://pypi.python.org/packages/bb/f0/e7d5e984cf6592fd2807dc7bc44a93f9d18e04e6a61f87fdfb2622422d74/infrae.cache-1.0.1.tar.gz";
801 url = "https://pypi.python.org/packages/bb/f0/e7d5e984cf6592fd2807dc7bc44a93f9d18e04e6a61f87fdfb2622422d74/infrae.cache-1.0.1.tar.gz";
737 md5 = "b09076a766747e6ed2a755cc62088e32";
802 md5 = "b09076a766747e6ed2a755cc62088e32";
738 };
803 };
739 meta = {
804 meta = {
740 license = [ pkgs.lib.licenses.zpt21 ];
805 license = [ pkgs.lib.licenses.zpt21 ];
741 };
806 };
742 };
807 };
743 invoke = super.buildPythonPackage {
808 invoke = super.buildPythonPackage {
744 name = "invoke-0.13.0";
809 name = "invoke-0.13.0";
745 buildInputs = with self; [];
810 buildInputs = with self; [];
746 doCheck = false;
811 doCheck = false;
747 propagatedBuildInputs = with self; [];
812 propagatedBuildInputs = with self; [];
748 src = fetchurl {
813 src = fetchurl {
749 url = "https://pypi.python.org/packages/47/bf/d07ef52fa1ac645468858bbac7cb95b246a972a045e821493d17d89c81be/invoke-0.13.0.tar.gz";
814 url = "https://pypi.python.org/packages/47/bf/d07ef52fa1ac645468858bbac7cb95b246a972a045e821493d17d89c81be/invoke-0.13.0.tar.gz";
750 md5 = "c0d1ed4bfb34eaab551662d8cfee6540";
815 md5 = "c0d1ed4bfb34eaab551662d8cfee6540";
751 };
816 };
752 meta = {
817 meta = {
753 license = [ pkgs.lib.licenses.bsdOriginal ];
818 license = [ pkgs.lib.licenses.bsdOriginal ];
754 };
819 };
755 };
820 };
756 ipdb = super.buildPythonPackage {
821 ipdb = super.buildPythonPackage {
757 name = "ipdb-0.8";
822 name = "ipdb-0.8";
758 buildInputs = with self; [];
823 buildInputs = with self; [];
759 doCheck = false;
824 doCheck = false;
760 propagatedBuildInputs = with self; [ipython];
825 propagatedBuildInputs = with self; [ipython];
761 src = fetchurl {
826 src = fetchurl {
762 url = "https://pypi.python.org/packages/f0/25/d7dd430ced6cd8dc242a933c8682b5dbf32eb4011d82f87e34209e5ec845/ipdb-0.8.zip";
827 url = "https://pypi.python.org/packages/f0/25/d7dd430ced6cd8dc242a933c8682b5dbf32eb4011d82f87e34209e5ec845/ipdb-0.8.zip";
763 md5 = "96dca0712efa01aa5eaf6b22071dd3ed";
828 md5 = "96dca0712efa01aa5eaf6b22071dd3ed";
764 };
829 };
765 meta = {
830 meta = {
766 license = [ pkgs.lib.licenses.gpl1 ];
831 license = [ pkgs.lib.licenses.gpl1 ];
767 };
832 };
768 };
833 };
769 ipython = super.buildPythonPackage {
834 ipython = super.buildPythonPackage {
770 name = "ipython-3.1.0";
835 name = "ipython-3.1.0";
771 buildInputs = with self; [];
836 buildInputs = with self; [];
772 doCheck = false;
837 doCheck = false;
773 propagatedBuildInputs = with self; [];
838 propagatedBuildInputs = with self; [];
774 src = fetchurl {
839 src = fetchurl {
775 url = "https://pypi.python.org/packages/06/91/120c0835254c120af89f066afaabf81289bc2726c1fc3ca0555df6882f58/ipython-3.1.0.tar.gz";
840 url = "https://pypi.python.org/packages/06/91/120c0835254c120af89f066afaabf81289bc2726c1fc3ca0555df6882f58/ipython-3.1.0.tar.gz";
776 md5 = "a749d90c16068687b0ec45a27e72ef8f";
841 md5 = "a749d90c16068687b0ec45a27e72ef8f";
777 };
842 };
778 meta = {
843 meta = {
779 license = [ pkgs.lib.licenses.bsdOriginal ];
844 license = [ pkgs.lib.licenses.bsdOriginal ];
780 };
845 };
781 };
846 };
782 iso8601 = super.buildPythonPackage {
847 iso8601 = super.buildPythonPackage {
783 name = "iso8601-0.1.11";
848 name = "iso8601-0.1.11";
784 buildInputs = with self; [];
849 buildInputs = with self; [];
785 doCheck = false;
850 doCheck = false;
786 propagatedBuildInputs = with self; [];
851 propagatedBuildInputs = with self; [];
787 src = fetchurl {
852 src = fetchurl {
788 url = "https://pypi.python.org/packages/c0/75/c9209ee4d1b5975eb8c2cba4428bde6b61bd55664a98290dd015cdb18e98/iso8601-0.1.11.tar.gz";
853 url = "https://pypi.python.org/packages/c0/75/c9209ee4d1b5975eb8c2cba4428bde6b61bd55664a98290dd015cdb18e98/iso8601-0.1.11.tar.gz";
789 md5 = "b06d11cd14a64096f907086044f0fe38";
854 md5 = "b06d11cd14a64096f907086044f0fe38";
790 };
855 };
791 meta = {
856 meta = {
792 license = [ pkgs.lib.licenses.mit ];
857 license = [ pkgs.lib.licenses.mit ];
793 };
858 };
794 };
859 };
795 itsdangerous = super.buildPythonPackage {
860 itsdangerous = super.buildPythonPackage {
796 name = "itsdangerous-0.24";
861 name = "itsdangerous-0.24";
797 buildInputs = with self; [];
862 buildInputs = with self; [];
798 doCheck = false;
863 doCheck = false;
799 propagatedBuildInputs = with self; [];
864 propagatedBuildInputs = with self; [];
800 src = fetchurl {
865 src = fetchurl {
801 url = "https://pypi.python.org/packages/dc/b4/a60bcdba945c00f6d608d8975131ab3f25b22f2bcfe1dab221165194b2d4/itsdangerous-0.24.tar.gz";
866 url = "https://pypi.python.org/packages/dc/b4/a60bcdba945c00f6d608d8975131ab3f25b22f2bcfe1dab221165194b2d4/itsdangerous-0.24.tar.gz";
802 md5 = "a3d55aa79369aef5345c036a8a26307f";
867 md5 = "a3d55aa79369aef5345c036a8a26307f";
803 };
868 };
804 meta = {
869 meta = {
805 license = [ pkgs.lib.licenses.bsdOriginal ];
870 license = [ pkgs.lib.licenses.bsdOriginal ];
806 };
871 };
807 };
872 };
808 kombu = super.buildPythonPackage {
873 kombu = super.buildPythonPackage {
809 name = "kombu-1.5.1";
874 name = "kombu-1.5.1";
810 buildInputs = with self; [];
875 buildInputs = with self; [];
811 doCheck = false;
876 doCheck = false;
812 propagatedBuildInputs = with self; [anyjson amqplib];
877 propagatedBuildInputs = with self; [anyjson amqplib];
813 src = fetchurl {
878 src = fetchurl {
814 url = "https://pypi.python.org/packages/19/53/74bf2a624644b45f0850a638752514fc10a8e1cbd738f10804951a6df3f5/kombu-1.5.1.tar.gz";
879 url = "https://pypi.python.org/packages/19/53/74bf2a624644b45f0850a638752514fc10a8e1cbd738f10804951a6df3f5/kombu-1.5.1.tar.gz";
815 md5 = "50662f3c7e9395b3d0721fb75d100b63";
880 md5 = "50662f3c7e9395b3d0721fb75d100b63";
816 };
881 };
817 meta = {
882 meta = {
818 license = [ pkgs.lib.licenses.bsdOriginal ];
883 license = [ pkgs.lib.licenses.bsdOriginal ];
819 };
884 };
820 };
885 };
821 lxml = super.buildPythonPackage {
886 lxml = super.buildPythonPackage {
822 name = "lxml-3.4.4";
887 name = "lxml-3.4.4";
823 buildInputs = with self; [];
888 buildInputs = with self; [];
824 doCheck = false;
889 doCheck = false;
825 propagatedBuildInputs = with self; [];
890 propagatedBuildInputs = with self; [];
826 src = fetchurl {
891 src = fetchurl {
827 url = "https://pypi.python.org/packages/63/c7/4f2a2a4ad6c6fa99b14be6b3c1cece9142e2d915aa7c43c908677afc8fa4/lxml-3.4.4.tar.gz";
892 url = "https://pypi.python.org/packages/63/c7/4f2a2a4ad6c6fa99b14be6b3c1cece9142e2d915aa7c43c908677afc8fa4/lxml-3.4.4.tar.gz";
828 md5 = "a9a65972afc173ec7a39c585f4eea69c";
893 md5 = "a9a65972afc173ec7a39c585f4eea69c";
829 };
894 };
830 meta = {
895 meta = {
831 license = [ pkgs.lib.licenses.bsdOriginal ];
896 license = [ pkgs.lib.licenses.bsdOriginal ];
832 };
897 };
833 };
898 };
834 mccabe = super.buildPythonPackage {
899 mccabe = super.buildPythonPackage {
835 name = "mccabe-0.3";
900 name = "mccabe-0.3";
836 buildInputs = with self; [];
901 buildInputs = with self; [];
837 doCheck = false;
902 doCheck = false;
838 propagatedBuildInputs = with self; [];
903 propagatedBuildInputs = with self; [];
839 src = fetchurl {
904 src = fetchurl {
840 url = "https://pypi.python.org/packages/c9/2e/75231479e11a906b64ac43bad9d0bb534d00080b18bdca8db9da46e1faf7/mccabe-0.3.tar.gz";
905 url = "https://pypi.python.org/packages/c9/2e/75231479e11a906b64ac43bad9d0bb534d00080b18bdca8db9da46e1faf7/mccabe-0.3.tar.gz";
841 md5 = "81640948ff226f8c12b3277059489157";
906 md5 = "81640948ff226f8c12b3277059489157";
842 };
907 };
843 meta = {
908 meta = {
844 license = [ { fullName = "Expat license"; } pkgs.lib.licenses.mit ];
909 license = [ { fullName = "Expat license"; } pkgs.lib.licenses.mit ];
845 };
910 };
846 };
911 };
847 meld3 = super.buildPythonPackage {
912 meld3 = super.buildPythonPackage {
848 name = "meld3-1.0.2";
913 name = "meld3-1.0.2";
849 buildInputs = with self; [];
914 buildInputs = with self; [];
850 doCheck = false;
915 doCheck = false;
851 propagatedBuildInputs = with self; [];
916 propagatedBuildInputs = with self; [];
852 src = fetchurl {
917 src = fetchurl {
853 url = "https://pypi.python.org/packages/45/a0/317c6422b26c12fe0161e936fc35f36552069ba8e6f7ecbd99bbffe32a5f/meld3-1.0.2.tar.gz";
918 url = "https://pypi.python.org/packages/45/a0/317c6422b26c12fe0161e936fc35f36552069ba8e6f7ecbd99bbffe32a5f/meld3-1.0.2.tar.gz";
854 md5 = "3ccc78cd79cffd63a751ad7684c02c91";
919 md5 = "3ccc78cd79cffd63a751ad7684c02c91";
855 };
920 };
856 meta = {
921 meta = {
857 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
922 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
858 };
923 };
859 };
924 };
860 mock = super.buildPythonPackage {
925 mock = super.buildPythonPackage {
861 name = "mock-1.0.1";
926 name = "mock-1.0.1";
862 buildInputs = with self; [];
927 buildInputs = with self; [];
863 doCheck = false;
928 doCheck = false;
864 propagatedBuildInputs = with self; [];
929 propagatedBuildInputs = with self; [];
865 src = fetchurl {
930 src = fetchurl {
866 url = "https://pypi.python.org/packages/15/45/30273ee91feb60dabb8fbb2da7868520525f02cf910279b3047182feed80/mock-1.0.1.zip";
931 url = "https://pypi.python.org/packages/15/45/30273ee91feb60dabb8fbb2da7868520525f02cf910279b3047182feed80/mock-1.0.1.zip";
867 md5 = "869f08d003c289a97c1a6610faf5e913";
932 md5 = "869f08d003c289a97c1a6610faf5e913";
868 };
933 };
869 meta = {
934 meta = {
870 license = [ pkgs.lib.licenses.bsdOriginal ];
935 license = [ pkgs.lib.licenses.bsdOriginal ];
871 };
936 };
872 };
937 };
873 msgpack-python = super.buildPythonPackage {
938 msgpack-python = super.buildPythonPackage {
874 name = "msgpack-python-0.4.6";
939 name = "msgpack-python-0.4.6";
875 buildInputs = with self; [];
940 buildInputs = with self; [];
876 doCheck = false;
941 doCheck = false;
877 propagatedBuildInputs = with self; [];
942 propagatedBuildInputs = with self; [];
878 src = fetchurl {
943 src = fetchurl {
879 url = "https://pypi.python.org/packages/15/ce/ff2840885789ef8035f66cd506ea05bdb228340307d5e71a7b1e3f82224c/msgpack-python-0.4.6.tar.gz";
944 url = "https://pypi.python.org/packages/15/ce/ff2840885789ef8035f66cd506ea05bdb228340307d5e71a7b1e3f82224c/msgpack-python-0.4.6.tar.gz";
880 md5 = "8b317669314cf1bc881716cccdaccb30";
945 md5 = "8b317669314cf1bc881716cccdaccb30";
881 };
946 };
882 meta = {
947 meta = {
883 license = [ pkgs.lib.licenses.asl20 ];
948 license = [ pkgs.lib.licenses.asl20 ];
884 };
949 };
885 };
950 };
886 nose = super.buildPythonPackage {
951 nose = super.buildPythonPackage {
887 name = "nose-1.3.6";
952 name = "nose-1.3.6";
888 buildInputs = with self; [];
953 buildInputs = with self; [];
889 doCheck = false;
954 doCheck = false;
890 propagatedBuildInputs = with self; [];
955 propagatedBuildInputs = with self; [];
891 src = fetchurl {
956 src = fetchurl {
892 url = "https://pypi.python.org/packages/70/c7/469e68148d17a0d3db5ed49150242fd70a74a8147b8f3f8b87776e028d99/nose-1.3.6.tar.gz";
957 url = "https://pypi.python.org/packages/70/c7/469e68148d17a0d3db5ed49150242fd70a74a8147b8f3f8b87776e028d99/nose-1.3.6.tar.gz";
893 md5 = "0ca546d81ca8309080fc80cb389e7a16";
958 md5 = "0ca546d81ca8309080fc80cb389e7a16";
894 };
959 };
895 meta = {
960 meta = {
896 license = [ { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "GNU LGPL"; } ];
961 license = [ { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "GNU LGPL"; } ];
897 };
962 };
898 };
963 };
899 objgraph = super.buildPythonPackage {
964 objgraph = super.buildPythonPackage {
900 name = "objgraph-2.0.0";
965 name = "objgraph-2.0.0";
901 buildInputs = with self; [];
966 buildInputs = with self; [];
902 doCheck = false;
967 doCheck = false;
903 propagatedBuildInputs = with self; [];
968 propagatedBuildInputs = with self; [];
904 src = fetchurl {
969 src = fetchurl {
905 url = "https://pypi.python.org/packages/d7/33/ace750b59247496ed769b170586c5def7202683f3d98e737b75b767ff29e/objgraph-2.0.0.tar.gz";
970 url = "https://pypi.python.org/packages/d7/33/ace750b59247496ed769b170586c5def7202683f3d98e737b75b767ff29e/objgraph-2.0.0.tar.gz";
906 md5 = "25b0d5e5adc74aa63ead15699614159c";
971 md5 = "25b0d5e5adc74aa63ead15699614159c";
907 };
972 };
908 meta = {
973 meta = {
909 license = [ pkgs.lib.licenses.mit ];
974 license = [ pkgs.lib.licenses.mit ];
910 };
975 };
911 };
976 };
912 packaging = super.buildPythonPackage {
977 packaging = super.buildPythonPackage {
913 name = "packaging-15.2";
978 name = "packaging-15.2";
914 buildInputs = with self; [];
979 buildInputs = with self; [];
915 doCheck = false;
980 doCheck = false;
916 propagatedBuildInputs = with self; [];
981 propagatedBuildInputs = with self; [];
917 src = fetchurl {
982 src = fetchurl {
918 url = "https://pypi.python.org/packages/24/c4/185da1304f07047dc9e0c46c31db75c0351bd73458ac3efad7da3dbcfbe1/packaging-15.2.tar.gz";
983 url = "https://pypi.python.org/packages/24/c4/185da1304f07047dc9e0c46c31db75c0351bd73458ac3efad7da3dbcfbe1/packaging-15.2.tar.gz";
919 md5 = "c16093476f6ced42128bf610e5db3784";
984 md5 = "c16093476f6ced42128bf610e5db3784";
920 };
985 };
921 meta = {
986 meta = {
922 license = [ pkgs.lib.licenses.asl20 ];
987 license = [ pkgs.lib.licenses.asl20 ];
923 };
988 };
924 };
989 };
925 paramiko = super.buildPythonPackage {
990 paramiko = super.buildPythonPackage {
926 name = "paramiko-1.15.1";
991 name = "paramiko-1.15.1";
927 buildInputs = with self; [];
992 buildInputs = with self; [];
928 doCheck = false;
993 doCheck = false;
929 propagatedBuildInputs = with self; [pycrypto ecdsa];
994 propagatedBuildInputs = with self; [pycrypto ecdsa];
930 src = fetchurl {
995 src = fetchurl {
931 url = "https://pypi.python.org/packages/04/2b/a22d2a560c1951abbbf95a0628e245945565f70dc082d9e784666887222c/paramiko-1.15.1.tar.gz";
996 url = "https://pypi.python.org/packages/04/2b/a22d2a560c1951abbbf95a0628e245945565f70dc082d9e784666887222c/paramiko-1.15.1.tar.gz";
932 md5 = "48c274c3f9b1282932567b21f6acf3b5";
997 md5 = "48c274c3f9b1282932567b21f6acf3b5";
933 };
998 };
934 meta = {
999 meta = {
935 license = [ { fullName = "LGPL"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
1000 license = [ { fullName = "LGPL"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
936 };
1001 };
937 };
1002 };
938 pep8 = super.buildPythonPackage {
1003 pep8 = super.buildPythonPackage {
939 name = "pep8-1.5.7";
1004 name = "pep8-1.5.7";
940 buildInputs = with self; [];
1005 buildInputs = with self; [];
941 doCheck = false;
1006 doCheck = false;
942 propagatedBuildInputs = with self; [];
1007 propagatedBuildInputs = with self; [];
943 src = fetchurl {
1008 src = fetchurl {
944 url = "https://pypi.python.org/packages/8b/de/259f5e735897ada1683489dd514b2a1c91aaa74e5e6b68f80acf128a6368/pep8-1.5.7.tar.gz";
1009 url = "https://pypi.python.org/packages/8b/de/259f5e735897ada1683489dd514b2a1c91aaa74e5e6b68f80acf128a6368/pep8-1.5.7.tar.gz";
945 md5 = "f6adbdd69365ecca20513c709f9b7c93";
1010 md5 = "f6adbdd69365ecca20513c709f9b7c93";
946 };
1011 };
947 meta = {
1012 meta = {
948 license = [ { fullName = "Expat license"; } pkgs.lib.licenses.mit ];
1013 license = [ { fullName = "Expat license"; } pkgs.lib.licenses.mit ];
949 };
1014 };
950 };
1015 };
1016 peppercorn = super.buildPythonPackage {
1017 name = "peppercorn-0.5";
1018 buildInputs = with self; [];
1019 doCheck = false;
1020 propagatedBuildInputs = with self; [];
1021 src = fetchurl {
1022 url = "https://pypi.python.org/packages/45/ec/a62ec317d1324a01567c5221b420742f094f05ee48097e5157d32be3755c/peppercorn-0.5.tar.gz";
1023 md5 = "f08efbca5790019ab45d76b7244abd40";
1024 };
1025 meta = {
1026 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1027 };
1028 };
951 psutil = super.buildPythonPackage {
1029 psutil = super.buildPythonPackage {
952 name = "psutil-2.2.1";
1030 name = "psutil-2.2.1";
953 buildInputs = with self; [];
1031 buildInputs = with self; [];
954 doCheck = false;
1032 doCheck = false;
955 propagatedBuildInputs = with self; [];
1033 propagatedBuildInputs = with self; [];
956 src = fetchurl {
1034 src = fetchurl {
957 url = "https://pypi.python.org/packages/df/47/ee54ef14dd40f8ce831a7581001a5096494dc99fe71586260ca6b531fe86/psutil-2.2.1.tar.gz";
1035 url = "https://pypi.python.org/packages/df/47/ee54ef14dd40f8ce831a7581001a5096494dc99fe71586260ca6b531fe86/psutil-2.2.1.tar.gz";
958 md5 = "1a2b58cd9e3a53528bb6148f0c4d5244";
1036 md5 = "1a2b58cd9e3a53528bb6148f0c4d5244";
959 };
1037 };
960 meta = {
1038 meta = {
961 license = [ pkgs.lib.licenses.bsdOriginal ];
1039 license = [ pkgs.lib.licenses.bsdOriginal ];
962 };
1040 };
963 };
1041 };
964 psycopg2 = super.buildPythonPackage {
1042 psycopg2 = super.buildPythonPackage {
965 name = "psycopg2-2.6";
1043 name = "psycopg2-2.6.1";
966 buildInputs = with self; [];
1044 buildInputs = with self; [];
967 doCheck = false;
1045 doCheck = false;
968 propagatedBuildInputs = with self; [];
1046 propagatedBuildInputs = with self; [];
969 src = fetchurl {
1047 src = fetchurl {
970 url = "https://pypi.python.org/packages/dd/c7/9016ff8ff69da269b1848276eebfb264af5badf6b38caad805426771f04d/psycopg2-2.6.tar.gz";
1048 url = "https://pypi.python.org/packages/86/fd/cc8315be63a41fe000cce20482a917e874cdc1151e62cb0141f5e55f711e/psycopg2-2.6.1.tar.gz";
971 md5 = "fbbb039a8765d561a1c04969bbae7c74";
1049 md5 = "842b44f8c95517ed5b792081a2370da1";
972 };
1050 };
973 meta = {
1051 meta = {
974 license = [ pkgs.lib.licenses.zpt21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ];
1052 license = [ pkgs.lib.licenses.zpt21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ];
975 };
1053 };
976 };
1054 };
977 py = super.buildPythonPackage {
1055 py = super.buildPythonPackage {
978 name = "py-1.4.29";
1056 name = "py-1.4.29";
979 buildInputs = with self; [];
1057 buildInputs = with self; [];
980 doCheck = false;
1058 doCheck = false;
981 propagatedBuildInputs = with self; [];
1059 propagatedBuildInputs = with self; [];
982 src = fetchurl {
1060 src = fetchurl {
983 url = "https://pypi.python.org/packages/2a/bc/a1a4a332ac10069b8e5e25136a35e08a03f01fd6ab03d819889d79a1fd65/py-1.4.29.tar.gz";
1061 url = "https://pypi.python.org/packages/2a/bc/a1a4a332ac10069b8e5e25136a35e08a03f01fd6ab03d819889d79a1fd65/py-1.4.29.tar.gz";
984 md5 = "c28e0accba523a29b35a48bb703fb96c";
1062 md5 = "c28e0accba523a29b35a48bb703fb96c";
985 };
1063 };
986 meta = {
1064 meta = {
987 license = [ pkgs.lib.licenses.mit ];
1065 license = [ pkgs.lib.licenses.mit ];
988 };
1066 };
989 };
1067 };
990 py-bcrypt = super.buildPythonPackage {
1068 py-bcrypt = super.buildPythonPackage {
991 name = "py-bcrypt-0.4";
1069 name = "py-bcrypt-0.4";
992 buildInputs = with self; [];
1070 buildInputs = with self; [];
993 doCheck = false;
1071 doCheck = false;
994 propagatedBuildInputs = with self; [];
1072 propagatedBuildInputs = with self; [];
995 src = fetchurl {
1073 src = fetchurl {
996 url = "https://pypi.python.org/packages/68/b1/1c3068c5c4d2e35c48b38dcc865301ebfdf45f54507086ac65ced1fd3b3d/py-bcrypt-0.4.tar.gz";
1074 url = "https://pypi.python.org/packages/68/b1/1c3068c5c4d2e35c48b38dcc865301ebfdf45f54507086ac65ced1fd3b3d/py-bcrypt-0.4.tar.gz";
997 md5 = "dd8b367d6b716a2ea2e72392525f4e36";
1075 md5 = "dd8b367d6b716a2ea2e72392525f4e36";
998 };
1076 };
999 meta = {
1077 meta = {
1000 license = [ pkgs.lib.licenses.bsdOriginal ];
1078 license = [ pkgs.lib.licenses.bsdOriginal ];
1001 };
1079 };
1002 };
1080 };
1081 py-gfm = super.buildPythonPackage {
1082 name = "py-gfm-0.1.3";
1083 buildInputs = with self; [];
1084 doCheck = false;
1085 propagatedBuildInputs = with self; [setuptools Markdown];
1086 src = fetchurl {
1087 url = "https://pypi.python.org/packages/12/e4/6b3d8678da04f97d7490d8264d8de51c2dc9fb91209ccee9c515c95e14c5/py-gfm-0.1.3.tar.gz";
1088 md5 = "e588d9e69640a241b97e2c59c22527a6";
1089 };
1090 meta = {
1091 license = [ pkgs.lib.licenses.bsdOriginal ];
1092 };
1093 };
1003 pycrypto = super.buildPythonPackage {
1094 pycrypto = super.buildPythonPackage {
1004 name = "pycrypto-2.6.1";
1095 name = "pycrypto-2.6.1";
1005 buildInputs = with self; [];
1096 buildInputs = with self; [];
1006 doCheck = false;
1097 doCheck = false;
1007 propagatedBuildInputs = with self; [];
1098 propagatedBuildInputs = with self; [];
1008 src = fetchurl {
1099 src = fetchurl {
1009 url = "https://pypi.python.org/packages/60/db/645aa9af249f059cc3a368b118de33889219e0362141e75d4eaf6f80f163/pycrypto-2.6.1.tar.gz";
1100 url = "https://pypi.python.org/packages/60/db/645aa9af249f059cc3a368b118de33889219e0362141e75d4eaf6f80f163/pycrypto-2.6.1.tar.gz";
1010 md5 = "55a61a054aa66812daf5161a0d5d7eda";
1101 md5 = "55a61a054aa66812daf5161a0d5d7eda";
1011 };
1102 };
1012 meta = {
1103 meta = {
1013 license = [ pkgs.lib.licenses.publicDomain ];
1104 license = [ pkgs.lib.licenses.publicDomain ];
1014 };
1105 };
1015 };
1106 };
1016 pycurl = super.buildPythonPackage {
1107 pycurl = super.buildPythonPackage {
1017 name = "pycurl-7.19.5";
1108 name = "pycurl-7.19.5";
1018 buildInputs = with self; [];
1109 buildInputs = with self; [];
1019 doCheck = false;
1110 doCheck = false;
1020 propagatedBuildInputs = with self; [];
1111 propagatedBuildInputs = with self; [];
1021 src = fetchurl {
1112 src = fetchurl {
1022 url = "https://pypi.python.org/packages/6c/48/13bad289ef6f4869b1d8fc11ae54de8cfb3cc4a2eb9f7419c506f763be46/pycurl-7.19.5.tar.gz";
1113 url = "https://pypi.python.org/packages/6c/48/13bad289ef6f4869b1d8fc11ae54de8cfb3cc4a2eb9f7419c506f763be46/pycurl-7.19.5.tar.gz";
1023 md5 = "47b4eac84118e2606658122104e62072";
1114 md5 = "47b4eac84118e2606658122104e62072";
1024 };
1115 };
1025 meta = {
1116 meta = {
1026 license = [ pkgs.lib.licenses.mit { fullName = "LGPL/MIT"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
1117 license = [ pkgs.lib.licenses.mit { fullName = "LGPL/MIT"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
1027 };
1118 };
1028 };
1119 };
1029 pyflakes = super.buildPythonPackage {
1120 pyflakes = super.buildPythonPackage {
1030 name = "pyflakes-0.8.1";
1121 name = "pyflakes-0.8.1";
1031 buildInputs = with self; [];
1122 buildInputs = with self; [];
1032 doCheck = false;
1123 doCheck = false;
1033 propagatedBuildInputs = with self; [];
1124 propagatedBuildInputs = with self; [];
1034 src = fetchurl {
1125 src = fetchurl {
1035 url = "https://pypi.python.org/packages/75/22/a90ec0252f4f87f3ffb6336504de71fe16a49d69c4538dae2f12b9360a38/pyflakes-0.8.1.tar.gz";
1126 url = "https://pypi.python.org/packages/75/22/a90ec0252f4f87f3ffb6336504de71fe16a49d69c4538dae2f12b9360a38/pyflakes-0.8.1.tar.gz";
1036 md5 = "905fe91ad14b912807e8fdc2ac2e2c23";
1127 md5 = "905fe91ad14b912807e8fdc2ac2e2c23";
1037 };
1128 };
1038 meta = {
1129 meta = {
1039 license = [ pkgs.lib.licenses.mit ];
1130 license = [ pkgs.lib.licenses.mit ];
1040 };
1131 };
1041 };
1132 };
1042 pyparsing = super.buildPythonPackage {
1133 pyparsing = super.buildPythonPackage {
1043 name = "pyparsing-1.5.7";
1134 name = "pyparsing-1.5.7";
1044 buildInputs = with self; [];
1135 buildInputs = with self; [];
1045 doCheck = false;
1136 doCheck = false;
1046 propagatedBuildInputs = with self; [];
1137 propagatedBuildInputs = with self; [];
1047 src = fetchurl {
1138 src = fetchurl {
1048 url = "https://pypi.python.org/packages/2e/26/e8fb5b4256a5f5036be7ce115ef8db8d06bc537becfbdc46c6af008314ee/pyparsing-1.5.7.zip";
1139 url = "https://pypi.python.org/packages/2e/26/e8fb5b4256a5f5036be7ce115ef8db8d06bc537becfbdc46c6af008314ee/pyparsing-1.5.7.zip";
1049 md5 = "b86854857a368d6ccb4d5b6e76d0637f";
1140 md5 = "b86854857a368d6ccb4d5b6e76d0637f";
1050 };
1141 };
1051 meta = {
1142 meta = {
1052 license = [ pkgs.lib.licenses.mit ];
1143 license = [ pkgs.lib.licenses.mit ];
1053 };
1144 };
1054 };
1145 };
1055 pyramid = super.buildPythonPackage {
1146 pyramid = super.buildPythonPackage {
1056 name = "pyramid-1.6.1";
1147 name = "pyramid-1.6.1";
1057 buildInputs = with self; [];
1148 buildInputs = with self; [];
1058 doCheck = false;
1149 doCheck = false;
1059 propagatedBuildInputs = with self; [setuptools WebOb repoze.lru zope.interface zope.deprecation venusian translationstring PasteDeploy];
1150 propagatedBuildInputs = with self; [setuptools WebOb repoze.lru zope.interface zope.deprecation venusian translationstring PasteDeploy];
1060 src = fetchurl {
1151 src = fetchurl {
1061 url = "https://pypi.python.org/packages/30/b3/fcc4a2a4800cbf21989e00454b5828cf1f7fe35c63e0810b350e56d4c475/pyramid-1.6.1.tar.gz";
1152 url = "https://pypi.python.org/packages/30/b3/fcc4a2a4800cbf21989e00454b5828cf1f7fe35c63e0810b350e56d4c475/pyramid-1.6.1.tar.gz";
1062 md5 = "b18688ff3cc33efdbb098a35b45dd122";
1153 md5 = "b18688ff3cc33efdbb098a35b45dd122";
1063 };
1154 };
1064 meta = {
1155 meta = {
1065 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1156 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1066 };
1157 };
1067 };
1158 };
1068 pyramid-beaker = super.buildPythonPackage {
1159 pyramid-beaker = super.buildPythonPackage {
1069 name = "pyramid-beaker-0.8";
1160 name = "pyramid-beaker-0.8";
1070 buildInputs = with self; [];
1161 buildInputs = with self; [];
1071 doCheck = false;
1162 doCheck = false;
1072 propagatedBuildInputs = with self; [pyramid Beaker];
1163 propagatedBuildInputs = with self; [pyramid Beaker];
1073 src = fetchurl {
1164 src = fetchurl {
1074 url = "https://pypi.python.org/packages/d9/6e/b85426e00fd3d57f4545f74e1c3828552d8700f13ededeef9233f7bca8be/pyramid_beaker-0.8.tar.gz";
1165 url = "https://pypi.python.org/packages/d9/6e/b85426e00fd3d57f4545f74e1c3828552d8700f13ededeef9233f7bca8be/pyramid_beaker-0.8.tar.gz";
1075 md5 = "22f14be31b06549f80890e2c63a93834";
1166 md5 = "22f14be31b06549f80890e2c63a93834";
1076 };
1167 };
1077 meta = {
1168 meta = {
1078 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1169 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1079 };
1170 };
1080 };
1171 };
1081 pyramid-debugtoolbar = super.buildPythonPackage {
1172 pyramid-debugtoolbar = super.buildPythonPackage {
1082 name = "pyramid-debugtoolbar-2.4.2";
1173 name = "pyramid-debugtoolbar-2.4.2";
1083 buildInputs = with self; [];
1174 buildInputs = with self; [];
1084 doCheck = false;
1175 doCheck = false;
1085 propagatedBuildInputs = with self; [pyramid pyramid-mako repoze.lru Pygments];
1176 propagatedBuildInputs = with self; [pyramid pyramid-mako repoze.lru Pygments];
1086 src = fetchurl {
1177 src = fetchurl {
1087 url = "https://pypi.python.org/packages/89/00/ed5426ee41ed747ba3ffd30e8230841a6878286ea67d480b1444d24f06a2/pyramid_debugtoolbar-2.4.2.tar.gz";
1178 url = "https://pypi.python.org/packages/89/00/ed5426ee41ed747ba3ffd30e8230841a6878286ea67d480b1444d24f06a2/pyramid_debugtoolbar-2.4.2.tar.gz";
1088 md5 = "073ea67086cc4bd5decc3a000853642d";
1179 md5 = "073ea67086cc4bd5decc3a000853642d";
1089 };
1180 };
1090 meta = {
1181 meta = {
1091 license = [ { fullName = "Repoze Public License"; } pkgs.lib.licenses.bsdOriginal ];
1182 license = [ { fullName = "Repoze Public License"; } pkgs.lib.licenses.bsdOriginal ];
1092 };
1183 };
1093 };
1184 };
1094 pyramid-jinja2 = super.buildPythonPackage {
1185 pyramid-jinja2 = super.buildPythonPackage {
1095 name = "pyramid-jinja2-2.5";
1186 name = "pyramid-jinja2-2.5";
1096 buildInputs = with self; [];
1187 buildInputs = with self; [];
1097 doCheck = false;
1188 doCheck = false;
1098 propagatedBuildInputs = with self; [pyramid zope.deprecation Jinja2 MarkupSafe];
1189 propagatedBuildInputs = with self; [pyramid zope.deprecation Jinja2 MarkupSafe];
1099 src = fetchurl {
1190 src = fetchurl {
1100 url = "https://pypi.python.org/packages/a1/80/595e26ffab7deba7208676b6936b7e5a721875710f982e59899013cae1ed/pyramid_jinja2-2.5.tar.gz";
1191 url = "https://pypi.python.org/packages/a1/80/595e26ffab7deba7208676b6936b7e5a721875710f982e59899013cae1ed/pyramid_jinja2-2.5.tar.gz";
1101 md5 = "07cb6547204ac5e6f0b22a954ccee928";
1192 md5 = "07cb6547204ac5e6f0b22a954ccee928";
1102 };
1193 };
1103 meta = {
1194 meta = {
1104 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1195 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1105 };
1196 };
1106 };
1197 };
1107 pyramid-mako = super.buildPythonPackage {
1198 pyramid-mako = super.buildPythonPackage {
1108 name = "pyramid-mako-1.0.2";
1199 name = "pyramid-mako-1.0.2";
1109 buildInputs = with self; [];
1200 buildInputs = with self; [];
1110 doCheck = false;
1201 doCheck = false;
1111 propagatedBuildInputs = with self; [pyramid Mako];
1202 propagatedBuildInputs = with self; [pyramid Mako];
1112 src = fetchurl {
1203 src = fetchurl {
1113 url = "https://pypi.python.org/packages/f1/92/7e69bcf09676d286a71cb3bbb887b16595b96f9ba7adbdc239ffdd4b1eb9/pyramid_mako-1.0.2.tar.gz";
1204 url = "https://pypi.python.org/packages/f1/92/7e69bcf09676d286a71cb3bbb887b16595b96f9ba7adbdc239ffdd4b1eb9/pyramid_mako-1.0.2.tar.gz";
1114 md5 = "ee25343a97eb76bd90abdc2a774eb48a";
1205 md5 = "ee25343a97eb76bd90abdc2a774eb48a";
1115 };
1206 };
1116 meta = {
1207 meta = {
1117 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1208 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1118 };
1209 };
1119 };
1210 };
1120 pysqlite = super.buildPythonPackage {
1211 pysqlite = super.buildPythonPackage {
1121 name = "pysqlite-2.6.3";
1212 name = "pysqlite-2.6.3";
1122 buildInputs = with self; [];
1213 buildInputs = with self; [];
1123 doCheck = false;
1214 doCheck = false;
1124 propagatedBuildInputs = with self; [];
1215 propagatedBuildInputs = with self; [];
1125 src = fetchurl {
1216 src = fetchurl {
1126 url = "https://pypi.python.org/packages/5c/a6/1c429cd4c8069cf4bfbd0eb4d592b3f4042155a8202df83d7e9b93aa3dc2/pysqlite-2.6.3.tar.gz";
1217 url = "https://pypi.python.org/packages/5c/a6/1c429cd4c8069cf4bfbd0eb4d592b3f4042155a8202df83d7e9b93aa3dc2/pysqlite-2.6.3.tar.gz";
1127 md5 = "7ff1cedee74646b50117acff87aa1cfa";
1218 md5 = "7ff1cedee74646b50117acff87aa1cfa";
1128 };
1219 };
1129 meta = {
1220 meta = {
1130 license = [ { fullName = "zlib/libpng License"; } { fullName = "zlib/libpng license"; } ];
1221 license = [ { fullName = "zlib/libpng License"; } { fullName = "zlib/libpng license"; } ];
1131 };
1222 };
1132 };
1223 };
1133 pytest = super.buildPythonPackage {
1224 pytest = super.buildPythonPackage {
1134 name = "pytest-2.8.5";
1225 name = "pytest-2.8.5";
1135 buildInputs = with self; [];
1226 buildInputs = with self; [];
1136 doCheck = false;
1227 doCheck = false;
1137 propagatedBuildInputs = with self; [py];
1228 propagatedBuildInputs = with self; [py];
1138 src = fetchurl {
1229 src = fetchurl {
1139 url = "https://pypi.python.org/packages/b1/3d/d7ea9b0c51e0cacded856e49859f0a13452747491e842c236bbab3714afe/pytest-2.8.5.zip";
1230 url = "https://pypi.python.org/packages/b1/3d/d7ea9b0c51e0cacded856e49859f0a13452747491e842c236bbab3714afe/pytest-2.8.5.zip";
1140 md5 = "8493b06f700862f1294298d6c1b715a9";
1231 md5 = "8493b06f700862f1294298d6c1b715a9";
1141 };
1232 };
1142 meta = {
1233 meta = {
1143 license = [ pkgs.lib.licenses.mit ];
1234 license = [ pkgs.lib.licenses.mit ];
1144 };
1235 };
1145 };
1236 };
1146 pytest-catchlog = super.buildPythonPackage {
1237 pytest-catchlog = super.buildPythonPackage {
1147 name = "pytest-catchlog-1.2.2";
1238 name = "pytest-catchlog-1.2.2";
1148 buildInputs = with self; [];
1239 buildInputs = with self; [];
1149 doCheck = false;
1240 doCheck = false;
1150 propagatedBuildInputs = with self; [py pytest];
1241 propagatedBuildInputs = with self; [py pytest];
1151 src = fetchurl {
1242 src = fetchurl {
1152 url = "https://pypi.python.org/packages/f2/2b/2faccdb1a978fab9dd0bf31cca9f6847fbe9184a0bdcc3011ac41dd44191/pytest-catchlog-1.2.2.zip";
1243 url = "https://pypi.python.org/packages/f2/2b/2faccdb1a978fab9dd0bf31cca9f6847fbe9184a0bdcc3011ac41dd44191/pytest-catchlog-1.2.2.zip";
1153 md5 = "09d890c54c7456c818102b7ff8c182c8";
1244 md5 = "09d890c54c7456c818102b7ff8c182c8";
1154 };
1245 };
1155 meta = {
1246 meta = {
1156 license = [ pkgs.lib.licenses.mit ];
1247 license = [ pkgs.lib.licenses.mit ];
1157 };
1248 };
1158 };
1249 };
1159 pytest-cov = super.buildPythonPackage {
1250 pytest-cov = super.buildPythonPackage {
1160 name = "pytest-cov-1.8.1";
1251 name = "pytest-cov-1.8.1";
1161 buildInputs = with self; [];
1252 buildInputs = with self; [];
1162 doCheck = false;
1253 doCheck = false;
1163 propagatedBuildInputs = with self; [py pytest coverage cov-core];
1254 propagatedBuildInputs = with self; [py pytest coverage cov-core];
1164 src = fetchurl {
1255 src = fetchurl {
1165 url = "https://pypi.python.org/packages/11/4b/b04646e97f1721878eb21e9f779102d84dd044d324382263b1770a3e4838/pytest-cov-1.8.1.tar.gz";
1256 url = "https://pypi.python.org/packages/11/4b/b04646e97f1721878eb21e9f779102d84dd044d324382263b1770a3e4838/pytest-cov-1.8.1.tar.gz";
1166 md5 = "76c778afa2494088270348be42d759fc";
1257 md5 = "76c778afa2494088270348be42d759fc";
1167 };
1258 };
1168 meta = {
1259 meta = {
1169 license = [ pkgs.lib.licenses.mit ];
1260 license = [ pkgs.lib.licenses.mit ];
1170 };
1261 };
1171 };
1262 };
1172 pytest-profiling = super.buildPythonPackage {
1263 pytest-profiling = super.buildPythonPackage {
1173 name = "pytest-profiling-1.0.1";
1264 name = "pytest-profiling-1.0.1";
1174 buildInputs = with self; [];
1265 buildInputs = with self; [];
1175 doCheck = false;
1266 doCheck = false;
1176 propagatedBuildInputs = with self; [six pytest gprof2dot];
1267 propagatedBuildInputs = with self; [six pytest gprof2dot];
1177 src = fetchurl {
1268 src = fetchurl {
1178 url = "https://pypi.python.org/packages/d8/67/8ffab73406e22870e07fa4dc8dce1d7689b26dba8efd00161c9b6fc01ec0/pytest-profiling-1.0.1.tar.gz";
1269 url = "https://pypi.python.org/packages/d8/67/8ffab73406e22870e07fa4dc8dce1d7689b26dba8efd00161c9b6fc01ec0/pytest-profiling-1.0.1.tar.gz";
1179 md5 = "354404eb5b3fd4dc5eb7fffbb3d9b68b";
1270 md5 = "354404eb5b3fd4dc5eb7fffbb3d9b68b";
1180 };
1271 };
1181 meta = {
1272 meta = {
1182 license = [ pkgs.lib.licenses.mit ];
1273 license = [ pkgs.lib.licenses.mit ];
1183 };
1274 };
1184 };
1275 };
1185 pytest-runner = super.buildPythonPackage {
1276 pytest-runner = super.buildPythonPackage {
1186 name = "pytest-runner-2.7.1";
1277 name = "pytest-runner-2.7.1";
1187 buildInputs = with self; [];
1278 buildInputs = with self; [];
1188 doCheck = false;
1279 doCheck = false;
1189 propagatedBuildInputs = with self; [];
1280 propagatedBuildInputs = with self; [];
1190 src = fetchurl {
1281 src = fetchurl {
1191 url = "https://pypi.python.org/packages/99/6b/c4ff4418d3424d4475b7af60724fd4a5cdd91ed8e489dc9443281f0052bc/pytest-runner-2.7.1.tar.gz";
1282 url = "https://pypi.python.org/packages/99/6b/c4ff4418d3424d4475b7af60724fd4a5cdd91ed8e489dc9443281f0052bc/pytest-runner-2.7.1.tar.gz";
1192 md5 = "e56f0bc8d79a6bd91772b44ef4215c7e";
1283 md5 = "e56f0bc8d79a6bd91772b44ef4215c7e";
1193 };
1284 };
1194 meta = {
1285 meta = {
1195 license = [ pkgs.lib.licenses.mit ];
1286 license = [ pkgs.lib.licenses.mit ];
1196 };
1287 };
1197 };
1288 };
1198 pytest-timeout = super.buildPythonPackage {
1289 pytest-timeout = super.buildPythonPackage {
1199 name = "pytest-timeout-0.4";
1290 name = "pytest-timeout-0.4";
1200 buildInputs = with self; [];
1291 buildInputs = with self; [];
1201 doCheck = false;
1292 doCheck = false;
1202 propagatedBuildInputs = with self; [pytest];
1293 propagatedBuildInputs = with self; [pytest];
1203 src = fetchurl {
1294 src = fetchurl {
1204 url = "https://pypi.python.org/packages/24/48/5f6bd4b8026a26e1dd427243d560a29a0f1b24a5c7cffca4bf049a7bb65b/pytest-timeout-0.4.tar.gz";
1295 url = "https://pypi.python.org/packages/24/48/5f6bd4b8026a26e1dd427243d560a29a0f1b24a5c7cffca4bf049a7bb65b/pytest-timeout-0.4.tar.gz";
1205 md5 = "03b28aff69cbbfb959ed35ade5fde262";
1296 md5 = "03b28aff69cbbfb959ed35ade5fde262";
1206 };
1297 };
1207 meta = {
1298 meta = {
1208 license = [ pkgs.lib.licenses.mit { fullName = "DFSG approved"; } ];
1299 license = [ pkgs.lib.licenses.mit { fullName = "DFSG approved"; } ];
1209 };
1300 };
1210 };
1301 };
1211 python-dateutil = super.buildPythonPackage {
1302 python-dateutil = super.buildPythonPackage {
1212 name = "python-dateutil-1.5";
1303 name = "python-dateutil-1.5";
1213 buildInputs = with self; [];
1304 buildInputs = with self; [];
1214 doCheck = false;
1305 doCheck = false;
1215 propagatedBuildInputs = with self; [];
1306 propagatedBuildInputs = with self; [];
1216 src = fetchurl {
1307 src = fetchurl {
1217 url = "https://pypi.python.org/packages/b4/7c/df59c89a753eb33c7c44e1dd42de0e9bc2ccdd5a4d576e0bfad97cc280cb/python-dateutil-1.5.tar.gz";
1308 url = "https://pypi.python.org/packages/b4/7c/df59c89a753eb33c7c44e1dd42de0e9bc2ccdd5a4d576e0bfad97cc280cb/python-dateutil-1.5.tar.gz";
1218 md5 = "0dcb1de5e5cad69490a3b6ab63f0cfa5";
1309 md5 = "0dcb1de5e5cad69490a3b6ab63f0cfa5";
1219 };
1310 };
1220 meta = {
1311 meta = {
1221 license = [ pkgs.lib.licenses.psfl ];
1312 license = [ pkgs.lib.licenses.psfl ];
1222 };
1313 };
1223 };
1314 };
1224 python-editor = super.buildPythonPackage {
1315 python-editor = super.buildPythonPackage {
1225 name = "python-editor-1.0.1";
1316 name = "python-editor-1.0.1";
1226 buildInputs = with self; [];
1317 buildInputs = with self; [];
1227 doCheck = false;
1318 doCheck = false;
1228 propagatedBuildInputs = with self; [];
1319 propagatedBuildInputs = with self; [];
1229 src = fetchurl {
1320 src = fetchurl {
1230 url = "https://pypi.python.org/packages/2b/c0/df7b87d5cf016f82eab3b05cd35f53287c1178ad8c42bfb6fa61b89b22f6/python-editor-1.0.1.tar.gz";
1321 url = "https://pypi.python.org/packages/2b/c0/df7b87d5cf016f82eab3b05cd35f53287c1178ad8c42bfb6fa61b89b22f6/python-editor-1.0.1.tar.gz";
1231 md5 = "e1fa63535b40e022fa4fd646fd8b511a";
1322 md5 = "e1fa63535b40e022fa4fd646fd8b511a";
1232 };
1323 };
1233 meta = {
1324 meta = {
1234 license = [ pkgs.lib.licenses.asl20 ];
1325 license = [ pkgs.lib.licenses.asl20 ];
1235 };
1326 };
1236 };
1327 };
1237 python-ldap = super.buildPythonPackage {
1328 python-ldap = super.buildPythonPackage {
1238 name = "python-ldap-2.4.19";
1329 name = "python-ldap-2.4.19";
1239 buildInputs = with self; [];
1330 buildInputs = with self; [];
1240 doCheck = false;
1331 doCheck = false;
1241 propagatedBuildInputs = with self; [setuptools];
1332 propagatedBuildInputs = with self; [setuptools];
1242 src = fetchurl {
1333 src = fetchurl {
1243 url = "https://pypi.python.org/packages/42/81/1b64838c82e64f14d4e246ff00b52e650a35c012551b891ada2b85d40737/python-ldap-2.4.19.tar.gz";
1334 url = "https://pypi.python.org/packages/42/81/1b64838c82e64f14d4e246ff00b52e650a35c012551b891ada2b85d40737/python-ldap-2.4.19.tar.gz";
1244 md5 = "b941bf31d09739492aa19ef679e94ae3";
1335 md5 = "b941bf31d09739492aa19ef679e94ae3";
1245 };
1336 };
1246 meta = {
1337 meta = {
1247 license = [ pkgs.lib.licenses.psfl ];
1338 license = [ pkgs.lib.licenses.psfl ];
1248 };
1339 };
1249 };
1340 };
1250 python-memcached = super.buildPythonPackage {
1341 python-memcached = super.buildPythonPackage {
1251 name = "python-memcached-1.57";
1342 name = "python-memcached-1.57";
1252 buildInputs = with self; [];
1343 buildInputs = with self; [];
1253 doCheck = false;
1344 doCheck = false;
1254 propagatedBuildInputs = with self; [six];
1345 propagatedBuildInputs = with self; [six];
1255 src = fetchurl {
1346 src = fetchurl {
1256 url = "https://pypi.python.org/packages/52/9d/eebc0dcbc5c7c66840ad207dfc1baa376dadb74912484bff73819cce01e6/python-memcached-1.57.tar.gz";
1347 url = "https://pypi.python.org/packages/52/9d/eebc0dcbc5c7c66840ad207dfc1baa376dadb74912484bff73819cce01e6/python-memcached-1.57.tar.gz";
1257 md5 = "de21f64b42b2d961f3d4ad7beb5468a1";
1348 md5 = "de21f64b42b2d961f3d4ad7beb5468a1";
1258 };
1349 };
1259 meta = {
1350 meta = {
1260 license = [ pkgs.lib.licenses.psfl ];
1351 license = [ pkgs.lib.licenses.psfl ];
1261 };
1352 };
1262 };
1353 };
1263 python-pam = super.buildPythonPackage {
1354 python-pam = super.buildPythonPackage {
1264 name = "python-pam-1.8.2";
1355 name = "python-pam-1.8.2";
1265 buildInputs = with self; [];
1356 buildInputs = with self; [];
1266 doCheck = false;
1357 doCheck = false;
1267 propagatedBuildInputs = with self; [];
1358 propagatedBuildInputs = with self; [];
1268 src = fetchurl {
1359 src = fetchurl {
1269 url = "https://pypi.python.org/packages/de/8c/f8f5d38b4f26893af267ea0b39023d4951705ab0413a39e0cf7cf4900505/python-pam-1.8.2.tar.gz";
1360 url = "https://pypi.python.org/packages/de/8c/f8f5d38b4f26893af267ea0b39023d4951705ab0413a39e0cf7cf4900505/python-pam-1.8.2.tar.gz";
1270 md5 = "db71b6b999246fb05d78ecfbe166629d";
1361 md5 = "db71b6b999246fb05d78ecfbe166629d";
1271 };
1362 };
1272 meta = {
1363 meta = {
1273 license = [ { fullName = "License :: OSI Approved :: MIT License"; } pkgs.lib.licenses.mit ];
1364 license = [ { fullName = "License :: OSI Approved :: MIT License"; } pkgs.lib.licenses.mit ];
1274 };
1365 };
1275 };
1366 };
1276 pytz = super.buildPythonPackage {
1367 pytz = super.buildPythonPackage {
1277 name = "pytz-2015.4";
1368 name = "pytz-2015.4";
1278 buildInputs = with self; [];
1369 buildInputs = with self; [];
1279 doCheck = false;
1370 doCheck = false;
1280 propagatedBuildInputs = with self; [];
1371 propagatedBuildInputs = with self; [];
1281 src = fetchurl {
1372 src = fetchurl {
1282 url = "https://pypi.python.org/packages/7e/1a/f43b5c92df7b156822030fed151327ea096bcf417e45acc23bd1df43472f/pytz-2015.4.zip";
1373 url = "https://pypi.python.org/packages/7e/1a/f43b5c92df7b156822030fed151327ea096bcf417e45acc23bd1df43472f/pytz-2015.4.zip";
1283 md5 = "233f2a2b370d03f9b5911700cc9ebf3c";
1374 md5 = "233f2a2b370d03f9b5911700cc9ebf3c";
1284 };
1375 };
1285 meta = {
1376 meta = {
1286 license = [ pkgs.lib.licenses.mit ];
1377 license = [ pkgs.lib.licenses.mit ];
1287 };
1378 };
1288 };
1379 };
1289 pyzmq = super.buildPythonPackage {
1380 pyzmq = super.buildPythonPackage {
1290 name = "pyzmq-14.6.0";
1381 name = "pyzmq-14.6.0";
1291 buildInputs = with self; [];
1382 buildInputs = with self; [];
1292 doCheck = false;
1383 doCheck = false;
1293 propagatedBuildInputs = with self; [];
1384 propagatedBuildInputs = with self; [];
1294 src = fetchurl {
1385 src = fetchurl {
1295 url = "https://pypi.python.org/packages/8a/3b/5463d5a9d712cd8bbdac335daece0d69f6a6792da4e3dd89956c0db4e4e6/pyzmq-14.6.0.tar.gz";
1386 url = "https://pypi.python.org/packages/8a/3b/5463d5a9d712cd8bbdac335daece0d69f6a6792da4e3dd89956c0db4e4e6/pyzmq-14.6.0.tar.gz";
1296 md5 = "395b5de95a931afa5b14c9349a5b8024";
1387 md5 = "395b5de95a931afa5b14c9349a5b8024";
1297 };
1388 };
1298 meta = {
1389 meta = {
1299 license = [ pkgs.lib.licenses.bsdOriginal { fullName = "LGPL+BSD"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
1390 license = [ pkgs.lib.licenses.bsdOriginal { fullName = "LGPL+BSD"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
1300 };
1391 };
1301 };
1392 };
1302 recaptcha-client = super.buildPythonPackage {
1393 recaptcha-client = super.buildPythonPackage {
1303 name = "recaptcha-client-1.0.6";
1394 name = "recaptcha-client-1.0.6";
1304 buildInputs = with self; [];
1395 buildInputs = with self; [];
1305 doCheck = false;
1396 doCheck = false;
1306 propagatedBuildInputs = with self; [];
1397 propagatedBuildInputs = with self; [];
1307 src = fetchurl {
1398 src = fetchurl {
1308 url = "https://pypi.python.org/packages/0a/ea/5f2fbbfd894bdac1c68ef8d92019066cfcf9fbff5fe3d728d2b5c25c8db4/recaptcha-client-1.0.6.tar.gz";
1399 url = "https://pypi.python.org/packages/0a/ea/5f2fbbfd894bdac1c68ef8d92019066cfcf9fbff5fe3d728d2b5c25c8db4/recaptcha-client-1.0.6.tar.gz";
1309 md5 = "74228180f7e1fb76c4d7089160b0d919";
1400 md5 = "74228180f7e1fb76c4d7089160b0d919";
1310 };
1401 };
1311 meta = {
1402 meta = {
1312 license = [ { fullName = "MIT/X11"; } ];
1403 license = [ { fullName = "MIT/X11"; } ];
1313 };
1404 };
1314 };
1405 };
1315 repoze.lru = super.buildPythonPackage {
1406 repoze.lru = super.buildPythonPackage {
1316 name = "repoze.lru-0.6";
1407 name = "repoze.lru-0.6";
1317 buildInputs = with self; [];
1408 buildInputs = with self; [];
1318 doCheck = false;
1409 doCheck = false;
1319 propagatedBuildInputs = with self; [];
1410 propagatedBuildInputs = with self; [];
1320 src = fetchurl {
1411 src = fetchurl {
1321 url = "https://pypi.python.org/packages/6e/1e/aa15cc90217e086dc8769872c8778b409812ff036bf021b15795638939e4/repoze.lru-0.6.tar.gz";
1412 url = "https://pypi.python.org/packages/6e/1e/aa15cc90217e086dc8769872c8778b409812ff036bf021b15795638939e4/repoze.lru-0.6.tar.gz";
1322 md5 = "2c3b64b17a8e18b405f55d46173e14dd";
1413 md5 = "2c3b64b17a8e18b405f55d46173e14dd";
1323 };
1414 };
1324 meta = {
1415 meta = {
1325 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1416 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1326 };
1417 };
1327 };
1418 };
1328 requests = super.buildPythonPackage {
1419 requests = super.buildPythonPackage {
1329 name = "requests-2.9.1";
1420 name = "requests-2.9.1";
1330 buildInputs = with self; [];
1421 buildInputs = with self; [];
1331 doCheck = false;
1422 doCheck = false;
1332 propagatedBuildInputs = with self; [];
1423 propagatedBuildInputs = with self; [];
1333 src = fetchurl {
1424 src = fetchurl {
1334 url = "https://pypi.python.org/packages/f9/6d/07c44fb1ebe04d069459a189e7dab9e4abfe9432adcd4477367c25332748/requests-2.9.1.tar.gz";
1425 url = "https://pypi.python.org/packages/f9/6d/07c44fb1ebe04d069459a189e7dab9e4abfe9432adcd4477367c25332748/requests-2.9.1.tar.gz";
1335 md5 = "0b7f480d19012ec52bab78292efd976d";
1426 md5 = "0b7f480d19012ec52bab78292efd976d";
1336 };
1427 };
1337 meta = {
1428 meta = {
1338 license = [ pkgs.lib.licenses.asl20 ];
1429 license = [ pkgs.lib.licenses.asl20 ];
1339 };
1430 };
1340 };
1431 };
1341 rhodecode-enterprise-ce = super.buildPythonPackage {
1432 rhodecode-enterprise-ce = super.buildPythonPackage {
1342 name = "rhodecode-enterprise-ce-4.2.1";
1433 name = "rhodecode-enterprise-ce-4.3.0";
1343 buildInputs = with self; [WebTest configobj cssselect flake8 lxml mock pytest pytest-cov pytest-runner];
1434 buildInputs = with self; [WebTest configobj cssselect flake8 lxml mock pytest pytest-cov pytest-runner];
1344 doCheck = true;
1435 doCheck = true;
1345 propagatedBuildInputs = with self; [Babel Beaker FormEncode Mako Markdown MarkupSafe MySQL-python Paste PasteDeploy PasteScript Pygments Pylons Pyro4 Routes SQLAlchemy Tempita URLObject WebError WebHelpers WebHelpers2 WebOb WebTest Whoosh alembic amqplib anyjson appenlight-client authomatic backport-ipaddress celery colander decorator docutils gunicorn infrae.cache ipython iso8601 kombu msgpack-python packaging psycopg2 pycrypto pycurl pyparsing pyramid pyramid-debugtoolbar pyramid-mako pyramid-beaker pysqlite python-dateutil python-ldap python-memcached python-pam recaptcha-client repoze.lru requests simplejson waitress zope.cachedescriptors psutil py-bcrypt];
1436 propagatedBuildInputs = with self; [Babel Beaker FormEncode Mako Markdown MarkupSafe MySQL-python Paste PasteDeploy PasteScript Pygments Pylons Pyro4 Routes SQLAlchemy Tempita URLObject WebError WebHelpers WebHelpers2 WebOb WebTest Whoosh alembic amqplib anyjson appenlight-client authomatic backport-ipaddress celery channelstream colander decorator deform docutils gevent gunicorn infrae.cache ipython iso8601 kombu msgpack-python packaging psycopg2 py-gfm pycrypto pycurl pyparsing pyramid pyramid-debugtoolbar pyramid-mako pyramid-beaker pysqlite python-dateutil python-ldap python-memcached python-pam recaptcha-client repoze.lru requests simplejson waitress zope.cachedescriptors dogpile.cache dogpile.core psutil py-bcrypt];
1346 src = ./.;
1437 src = ./.;
1347 meta = {
1438 meta = {
1348 license = [ { fullName = "AGPLv3, and Commercial License"; } ];
1439 license = [ { fullName = "AGPLv3, and Commercial License"; } ];
1349 };
1440 };
1350 };
1441 };
1351 rhodecode-tools = super.buildPythonPackage {
1442 rhodecode-tools = super.buildPythonPackage {
1352 name = "rhodecode-tools-0.8.3";
1443 name = "rhodecode-tools-0.10.0";
1353 buildInputs = with self; [];
1444 buildInputs = with self; [];
1354 doCheck = false;
1445 doCheck = false;
1355 propagatedBuildInputs = with self; [click future six Mako MarkupSafe requests Whoosh elasticsearch elasticsearch-dsl];
1446 propagatedBuildInputs = with self; [click future six Mako MarkupSafe requests Whoosh elasticsearch elasticsearch-dsl];
1356 src = fetchurl {
1447 src = fetchurl {
1357 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.8.3.zip";
1448 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.10.0.zip";
1358 md5 = "9acdfd71b8ddf4056057065f37ab9ccb";
1449 md5 = "4762391473ded761bead3aa58c748044";
1359 };
1450 };
1360 meta = {
1451 meta = {
1361 license = [ { fullName = "AGPLv3 and Proprietary"; } ];
1452 license = [ { fullName = "AGPLv3 and Proprietary"; } ];
1362 };
1453 };
1363 };
1454 };
1364 serpent = super.buildPythonPackage {
1455 serpent = super.buildPythonPackage {
1365 name = "serpent-1.12";
1456 name = "serpent-1.12";
1366 buildInputs = with self; [];
1457 buildInputs = with self; [];
1367 doCheck = false;
1458 doCheck = false;
1368 propagatedBuildInputs = with self; [];
1459 propagatedBuildInputs = with self; [];
1369 src = fetchurl {
1460 src = fetchurl {
1370 url = "https://pypi.python.org/packages/3b/19/1e0e83b47c09edaef8398655088036e7e67386b5c48770218ebb339fbbd5/serpent-1.12.tar.gz";
1461 url = "https://pypi.python.org/packages/3b/19/1e0e83b47c09edaef8398655088036e7e67386b5c48770218ebb339fbbd5/serpent-1.12.tar.gz";
1371 md5 = "05869ac7b062828b34f8f927f0457b65";
1462 md5 = "05869ac7b062828b34f8f927f0457b65";
1372 };
1463 };
1373 meta = {
1464 meta = {
1374 license = [ pkgs.lib.licenses.mit ];
1465 license = [ pkgs.lib.licenses.mit ];
1375 };
1466 };
1376 };
1467 };
1377 setproctitle = super.buildPythonPackage {
1468 setproctitle = super.buildPythonPackage {
1378 name = "setproctitle-1.1.8";
1469 name = "setproctitle-1.1.8";
1379 buildInputs = with self; [];
1470 buildInputs = with self; [];
1380 doCheck = false;
1471 doCheck = false;
1381 propagatedBuildInputs = with self; [];
1472 propagatedBuildInputs = with self; [];
1382 src = fetchurl {
1473 src = fetchurl {
1383 url = "https://pypi.python.org/packages/33/c3/ad367a4f4f1ca90468863ae727ac62f6edb558fc09a003d344a02cfc6ea6/setproctitle-1.1.8.tar.gz";
1474 url = "https://pypi.python.org/packages/33/c3/ad367a4f4f1ca90468863ae727ac62f6edb558fc09a003d344a02cfc6ea6/setproctitle-1.1.8.tar.gz";
1384 md5 = "728f4c8c6031bbe56083a48594027edd";
1475 md5 = "728f4c8c6031bbe56083a48594027edd";
1385 };
1476 };
1386 meta = {
1477 meta = {
1387 license = [ pkgs.lib.licenses.bsdOriginal ];
1478 license = [ pkgs.lib.licenses.bsdOriginal ];
1388 };
1479 };
1389 };
1480 };
1390 setuptools = super.buildPythonPackage {
1481 setuptools = super.buildPythonPackage {
1391 name = "setuptools-20.8.1";
1482 name = "setuptools-20.8.1";
1392 buildInputs = with self; [];
1483 buildInputs = with self; [];
1393 doCheck = false;
1484 doCheck = false;
1394 propagatedBuildInputs = with self; [];
1485 propagatedBuildInputs = with self; [];
1395 src = fetchurl {
1486 src = fetchurl {
1396 url = "https://pypi.python.org/packages/c4/19/c1bdc88b53da654df43770f941079dbab4e4788c2dcb5658fb86259894c7/setuptools-20.8.1.zip";
1487 url = "https://pypi.python.org/packages/c4/19/c1bdc88b53da654df43770f941079dbab4e4788c2dcb5658fb86259894c7/setuptools-20.8.1.zip";
1397 md5 = "fe58a5cac0df20bb83942b252a4b0543";
1488 md5 = "fe58a5cac0df20bb83942b252a4b0543";
1398 };
1489 };
1399 meta = {
1490 meta = {
1400 license = [ pkgs.lib.licenses.mit ];
1491 license = [ pkgs.lib.licenses.mit ];
1401 };
1492 };
1402 };
1493 };
1403 setuptools-scm = super.buildPythonPackage {
1494 setuptools-scm = super.buildPythonPackage {
1404 name = "setuptools-scm-1.11.0";
1495 name = "setuptools-scm-1.11.0";
1405 buildInputs = with self; [];
1496 buildInputs = with self; [];
1406 doCheck = false;
1497 doCheck = false;
1407 propagatedBuildInputs = with self; [];
1498 propagatedBuildInputs = with self; [];
1408 src = fetchurl {
1499 src = fetchurl {
1409 url = "https://pypi.python.org/packages/cd/5f/e3a038292358058d83d764a47d09114aa5a8003ed4529518f9e580f1a94f/setuptools_scm-1.11.0.tar.gz";
1500 url = "https://pypi.python.org/packages/cd/5f/e3a038292358058d83d764a47d09114aa5a8003ed4529518f9e580f1a94f/setuptools_scm-1.11.0.tar.gz";
1410 md5 = "4c5c896ba52e134bbc3507bac6400087";
1501 md5 = "4c5c896ba52e134bbc3507bac6400087";
1411 };
1502 };
1412 meta = {
1503 meta = {
1413 license = [ pkgs.lib.licenses.mit ];
1504 license = [ pkgs.lib.licenses.mit ];
1414 };
1505 };
1415 };
1506 };
1416 simplejson = super.buildPythonPackage {
1507 simplejson = super.buildPythonPackage {
1417 name = "simplejson-3.7.2";
1508 name = "simplejson-3.7.2";
1418 buildInputs = with self; [];
1509 buildInputs = with self; [];
1419 doCheck = false;
1510 doCheck = false;
1420 propagatedBuildInputs = with self; [];
1511 propagatedBuildInputs = with self; [];
1421 src = fetchurl {
1512 src = fetchurl {
1422 url = "https://pypi.python.org/packages/6d/89/7f13f099344eea9d6722779a1f165087cb559598107844b1ac5dbd831fb1/simplejson-3.7.2.tar.gz";
1513 url = "https://pypi.python.org/packages/6d/89/7f13f099344eea9d6722779a1f165087cb559598107844b1ac5dbd831fb1/simplejson-3.7.2.tar.gz";
1423 md5 = "a5fc7d05d4cb38492285553def5d4b46";
1514 md5 = "a5fc7d05d4cb38492285553def5d4b46";
1424 };
1515 };
1425 meta = {
1516 meta = {
1426 license = [ pkgs.lib.licenses.mit pkgs.lib.licenses.afl21 ];
1517 license = [ pkgs.lib.licenses.mit pkgs.lib.licenses.afl21 ];
1427 };
1518 };
1428 };
1519 };
1429 six = super.buildPythonPackage {
1520 six = super.buildPythonPackage {
1430 name = "six-1.9.0";
1521 name = "six-1.9.0";
1431 buildInputs = with self; [];
1522 buildInputs = with self; [];
1432 doCheck = false;
1523 doCheck = false;
1433 propagatedBuildInputs = with self; [];
1524 propagatedBuildInputs = with self; [];
1434 src = fetchurl {
1525 src = fetchurl {
1435 url = "https://pypi.python.org/packages/16/64/1dc5e5976b17466fd7d712e59cbe9fb1e18bec153109e5ba3ed6c9102f1a/six-1.9.0.tar.gz";
1526 url = "https://pypi.python.org/packages/16/64/1dc5e5976b17466fd7d712e59cbe9fb1e18bec153109e5ba3ed6c9102f1a/six-1.9.0.tar.gz";
1436 md5 = "476881ef4012262dfc8adc645ee786c4";
1527 md5 = "476881ef4012262dfc8adc645ee786c4";
1437 };
1528 };
1438 meta = {
1529 meta = {
1439 license = [ pkgs.lib.licenses.mit ];
1530 license = [ pkgs.lib.licenses.mit ];
1440 };
1531 };
1441 };
1532 };
1442 subprocess32 = super.buildPythonPackage {
1533 subprocess32 = super.buildPythonPackage {
1443 name = "subprocess32-3.2.6";
1534 name = "subprocess32-3.2.6";
1444 buildInputs = with self; [];
1535 buildInputs = with self; [];
1445 doCheck = false;
1536 doCheck = false;
1446 propagatedBuildInputs = with self; [];
1537 propagatedBuildInputs = with self; [];
1447 src = fetchurl {
1538 src = fetchurl {
1448 url = "https://pypi.python.org/packages/28/8d/33ccbff51053f59ae6c357310cac0e79246bbed1d345ecc6188b176d72c3/subprocess32-3.2.6.tar.gz";
1539 url = "https://pypi.python.org/packages/28/8d/33ccbff51053f59ae6c357310cac0e79246bbed1d345ecc6188b176d72c3/subprocess32-3.2.6.tar.gz";
1449 md5 = "754c5ab9f533e764f931136974b618f1";
1540 md5 = "754c5ab9f533e764f931136974b618f1";
1450 };
1541 };
1451 meta = {
1542 meta = {
1452 license = [ pkgs.lib.licenses.psfl ];
1543 license = [ pkgs.lib.licenses.psfl ];
1453 };
1544 };
1454 };
1545 };
1455 supervisor = super.buildPythonPackage {
1546 supervisor = super.buildPythonPackage {
1456 name = "supervisor-3.1.3";
1547 name = "supervisor-3.3.0";
1457 buildInputs = with self; [];
1548 buildInputs = with self; [];
1458 doCheck = false;
1549 doCheck = false;
1459 propagatedBuildInputs = with self; [meld3];
1550 propagatedBuildInputs = with self; [meld3];
1460 src = fetchurl {
1551 src = fetchurl {
1461 url = "https://pypi.python.org/packages/a6/41/65ad5bd66230b173eb4d0b8810230f3a9c59ef52ae066e540b6b99895db7/supervisor-3.1.3.tar.gz";
1552 url = "https://pypi.python.org/packages/44/80/d28047d120bfcc8158b4e41127706731ee6a3419c661e0a858fb0e7c4b2d/supervisor-3.3.0.tar.gz";
1462 md5 = "aad263c4fbc070de63dd354864d5e552";
1553 md5 = "46bac00378d1eddb616752b990c67416";
1463 };
1554 };
1464 meta = {
1555 meta = {
1465 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1556 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1466 };
1557 };
1467 };
1558 };
1468 transifex-client = super.buildPythonPackage {
1559 transifex-client = super.buildPythonPackage {
1469 name = "transifex-client-0.10";
1560 name = "transifex-client-0.10";
1470 buildInputs = with self; [];
1561 buildInputs = with self; [];
1471 doCheck = false;
1562 doCheck = false;
1472 propagatedBuildInputs = with self; [];
1563 propagatedBuildInputs = with self; [];
1473 src = fetchurl {
1564 src = fetchurl {
1474 url = "https://pypi.python.org/packages/f3/4e/7b925192aee656fb3e04fa6381c8b3dc40198047c3b4a356f6cfd642c809/transifex-client-0.10.tar.gz";
1565 url = "https://pypi.python.org/packages/f3/4e/7b925192aee656fb3e04fa6381c8b3dc40198047c3b4a356f6cfd642c809/transifex-client-0.10.tar.gz";
1475 md5 = "5549538d84b8eede6b254cd81ae024fa";
1566 md5 = "5549538d84b8eede6b254cd81ae024fa";
1476 };
1567 };
1477 meta = {
1568 meta = {
1478 license = [ pkgs.lib.licenses.gpl2 ];
1569 license = [ pkgs.lib.licenses.gpl2 ];
1479 };
1570 };
1480 };
1571 };
1481 translationstring = super.buildPythonPackage {
1572 translationstring = super.buildPythonPackage {
1482 name = "translationstring-1.3";
1573 name = "translationstring-1.3";
1483 buildInputs = with self; [];
1574 buildInputs = with self; [];
1484 doCheck = false;
1575 doCheck = false;
1485 propagatedBuildInputs = with self; [];
1576 propagatedBuildInputs = with self; [];
1486 src = fetchurl {
1577 src = fetchurl {
1487 url = "https://pypi.python.org/packages/5e/eb/bee578cc150b44c653b63f5ebe258b5d0d812ddac12497e5f80fcad5d0b4/translationstring-1.3.tar.gz";
1578 url = "https://pypi.python.org/packages/5e/eb/bee578cc150b44c653b63f5ebe258b5d0d812ddac12497e5f80fcad5d0b4/translationstring-1.3.tar.gz";
1488 md5 = "a4b62e0f3c189c783a1685b3027f7c90";
1579 md5 = "a4b62e0f3c189c783a1685b3027f7c90";
1489 };
1580 };
1490 meta = {
1581 meta = {
1491 license = [ { fullName = "BSD-like (http://repoze.org/license.html)"; } ];
1582 license = [ { fullName = "BSD-like (http://repoze.org/license.html)"; } ];
1492 };
1583 };
1493 };
1584 };
1494 trollius = super.buildPythonPackage {
1585 trollius = super.buildPythonPackage {
1495 name = "trollius-1.0.4";
1586 name = "trollius-1.0.4";
1496 buildInputs = with self; [];
1587 buildInputs = with self; [];
1497 doCheck = false;
1588 doCheck = false;
1498 propagatedBuildInputs = with self; [futures];
1589 propagatedBuildInputs = with self; [futures];
1499 src = fetchurl {
1590 src = fetchurl {
1500 url = "https://pypi.python.org/packages/aa/e6/4141db437f55e6ee7a3fb69663239e3fde7841a811b4bef293145ad6c836/trollius-1.0.4.tar.gz";
1591 url = "https://pypi.python.org/packages/aa/e6/4141db437f55e6ee7a3fb69663239e3fde7841a811b4bef293145ad6c836/trollius-1.0.4.tar.gz";
1501 md5 = "3631a464d49d0cbfd30ab2918ef2b783";
1592 md5 = "3631a464d49d0cbfd30ab2918ef2b783";
1502 };
1593 };
1503 meta = {
1594 meta = {
1504 license = [ pkgs.lib.licenses.asl20 ];
1595 license = [ pkgs.lib.licenses.asl20 ];
1505 };
1596 };
1506 };
1597 };
1507 uWSGI = super.buildPythonPackage {
1598 uWSGI = super.buildPythonPackage {
1508 name = "uWSGI-2.0.11.2";
1599 name = "uWSGI-2.0.11.2";
1509 buildInputs = with self; [];
1600 buildInputs = with self; [];
1510 doCheck = false;
1601 doCheck = false;
1511 propagatedBuildInputs = with self; [];
1602 propagatedBuildInputs = with self; [];
1512 src = fetchurl {
1603 src = fetchurl {
1513 url = "https://pypi.python.org/packages/9b/78/918db0cfab0546afa580c1e565209c49aaf1476bbfe491314eadbe47c556/uwsgi-2.0.11.2.tar.gz";
1604 url = "https://pypi.python.org/packages/9b/78/918db0cfab0546afa580c1e565209c49aaf1476bbfe491314eadbe47c556/uwsgi-2.0.11.2.tar.gz";
1514 md5 = "1f02dcbee7f6f61de4b1fd68350cf16f";
1605 md5 = "1f02dcbee7f6f61de4b1fd68350cf16f";
1515 };
1606 };
1516 meta = {
1607 meta = {
1517 license = [ pkgs.lib.licenses.gpl2 ];
1608 license = [ pkgs.lib.licenses.gpl2 ];
1518 };
1609 };
1519 };
1610 };
1520 urllib3 = super.buildPythonPackage {
1611 urllib3 = super.buildPythonPackage {
1521 name = "urllib3-1.16";
1612 name = "urllib3-1.16";
1522 buildInputs = with self; [];
1613 buildInputs = with self; [];
1523 doCheck = false;
1614 doCheck = false;
1524 propagatedBuildInputs = with self; [];
1615 propagatedBuildInputs = with self; [];
1525 src = fetchurl {
1616 src = fetchurl {
1526 url = "https://pypi.python.org/packages/3b/f0/e763169124e3f5db0926bc3dbfcd580a105f9ca44cf5d8e6c7a803c9f6b5/urllib3-1.16.tar.gz";
1617 url = "https://pypi.python.org/packages/3b/f0/e763169124e3f5db0926bc3dbfcd580a105f9ca44cf5d8e6c7a803c9f6b5/urllib3-1.16.tar.gz";
1527 md5 = "fcaab1c5385c57deeb7053d3d7d81d59";
1618 md5 = "fcaab1c5385c57deeb7053d3d7d81d59";
1528 };
1619 };
1529 meta = {
1620 meta = {
1530 license = [ pkgs.lib.licenses.mit ];
1621 license = [ pkgs.lib.licenses.mit ];
1531 };
1622 };
1532 };
1623 };
1533 venusian = super.buildPythonPackage {
1624 venusian = super.buildPythonPackage {
1534 name = "venusian-1.0";
1625 name = "venusian-1.0";
1535 buildInputs = with self; [];
1626 buildInputs = with self; [];
1536 doCheck = false;
1627 doCheck = false;
1537 propagatedBuildInputs = with self; [];
1628 propagatedBuildInputs = with self; [];
1538 src = fetchurl {
1629 src = fetchurl {
1539 url = "https://pypi.python.org/packages/86/20/1948e0dfc4930ddde3da8c33612f6a5717c0b4bc28f591a5c5cf014dd390/venusian-1.0.tar.gz";
1630 url = "https://pypi.python.org/packages/86/20/1948e0dfc4930ddde3da8c33612f6a5717c0b4bc28f591a5c5cf014dd390/venusian-1.0.tar.gz";
1540 md5 = "dccf2eafb7113759d60c86faf5538756";
1631 md5 = "dccf2eafb7113759d60c86faf5538756";
1541 };
1632 };
1542 meta = {
1633 meta = {
1543 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1634 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1544 };
1635 };
1545 };
1636 };
1546 waitress = super.buildPythonPackage {
1637 waitress = super.buildPythonPackage {
1547 name = "waitress-0.8.9";
1638 name = "waitress-0.8.9";
1548 buildInputs = with self; [];
1639 buildInputs = with self; [];
1549 doCheck = false;
1640 doCheck = false;
1550 propagatedBuildInputs = with self; [setuptools];
1641 propagatedBuildInputs = with self; [setuptools];
1551 src = fetchurl {
1642 src = fetchurl {
1552 url = "https://pypi.python.org/packages/ee/65/fc9dee74a909a1187ca51e4f15ad9c4d35476e4ab5813f73421505c48053/waitress-0.8.9.tar.gz";
1643 url = "https://pypi.python.org/packages/ee/65/fc9dee74a909a1187ca51e4f15ad9c4d35476e4ab5813f73421505c48053/waitress-0.8.9.tar.gz";
1553 md5 = "da3f2e62b3676be5dd630703a68e2a04";
1644 md5 = "da3f2e62b3676be5dd630703a68e2a04";
1554 };
1645 };
1555 meta = {
1646 meta = {
1556 license = [ pkgs.lib.licenses.zpt21 ];
1647 license = [ pkgs.lib.licenses.zpt21 ];
1557 };
1648 };
1558 };
1649 };
1650 ws4py = super.buildPythonPackage {
1651 name = "ws4py-0.3.5";
1652 buildInputs = with self; [];
1653 doCheck = false;
1654 propagatedBuildInputs = with self; [];
1655 src = fetchurl {
1656 url = "https://pypi.python.org/packages/b6/4f/34af703be86939629479e74d6e650e39f3bd73b3b09212c34e5125764cbc/ws4py-0.3.5.zip";
1657 md5 = "a261b75c20b980e55ce7451a3576a867";
1658 };
1659 meta = {
1660 license = [ pkgs.lib.licenses.bsdOriginal ];
1661 };
1662 };
1559 wsgiref = super.buildPythonPackage {
1663 wsgiref = super.buildPythonPackage {
1560 name = "wsgiref-0.1.2";
1664 name = "wsgiref-0.1.2";
1561 buildInputs = with self; [];
1665 buildInputs = with self; [];
1562 doCheck = false;
1666 doCheck = false;
1563 propagatedBuildInputs = with self; [];
1667 propagatedBuildInputs = with self; [];
1564 src = fetchurl {
1668 src = fetchurl {
1565 url = "https://pypi.python.org/packages/41/9e/309259ce8dff8c596e8c26df86dbc4e848b9249fd36797fd60be456f03fc/wsgiref-0.1.2.zip";
1669 url = "https://pypi.python.org/packages/41/9e/309259ce8dff8c596e8c26df86dbc4e848b9249fd36797fd60be456f03fc/wsgiref-0.1.2.zip";
1566 md5 = "29b146e6ebd0f9fb119fe321f7bcf6cb";
1670 md5 = "29b146e6ebd0f9fb119fe321f7bcf6cb";
1567 };
1671 };
1568 meta = {
1672 meta = {
1569 license = [ { fullName = "PSF or ZPL"; } ];
1673 license = [ { fullName = "PSF or ZPL"; } ];
1570 };
1674 };
1571 };
1675 };
1572 zope.cachedescriptors = super.buildPythonPackage {
1676 zope.cachedescriptors = super.buildPythonPackage {
1573 name = "zope.cachedescriptors-4.0.0";
1677 name = "zope.cachedescriptors-4.0.0";
1574 buildInputs = with self; [];
1678 buildInputs = with self; [];
1575 doCheck = false;
1679 doCheck = false;
1576 propagatedBuildInputs = with self; [setuptools];
1680 propagatedBuildInputs = with self; [setuptools];
1577 src = fetchurl {
1681 src = fetchurl {
1578 url = "https://pypi.python.org/packages/40/33/694b6644c37f28553f4b9f20b3c3a20fb709a22574dff20b5bdffb09ecd5/zope.cachedescriptors-4.0.0.tar.gz";
1682 url = "https://pypi.python.org/packages/40/33/694b6644c37f28553f4b9f20b3c3a20fb709a22574dff20b5bdffb09ecd5/zope.cachedescriptors-4.0.0.tar.gz";
1579 md5 = "8d308de8c936792c8e758058fcb7d0f0";
1683 md5 = "8d308de8c936792c8e758058fcb7d0f0";
1580 };
1684 };
1581 meta = {
1685 meta = {
1582 license = [ pkgs.lib.licenses.zpt21 ];
1686 license = [ pkgs.lib.licenses.zpt21 ];
1583 };
1687 };
1584 };
1688 };
1585 zope.deprecation = super.buildPythonPackage {
1689 zope.deprecation = super.buildPythonPackage {
1586 name = "zope.deprecation-4.1.2";
1690 name = "zope.deprecation-4.1.2";
1587 buildInputs = with self; [];
1691 buildInputs = with self; [];
1588 doCheck = false;
1692 doCheck = false;
1589 propagatedBuildInputs = with self; [setuptools];
1693 propagatedBuildInputs = with self; [setuptools];
1590 src = fetchurl {
1694 src = fetchurl {
1591 url = "https://pypi.python.org/packages/c1/d3/3919492d5e57d8dd01b36f30b34fc8404a30577392b1eb817c303499ad20/zope.deprecation-4.1.2.tar.gz";
1695 url = "https://pypi.python.org/packages/c1/d3/3919492d5e57d8dd01b36f30b34fc8404a30577392b1eb817c303499ad20/zope.deprecation-4.1.2.tar.gz";
1592 md5 = "e9a663ded58f4f9f7881beb56cae2782";
1696 md5 = "e9a663ded58f4f9f7881beb56cae2782";
1593 };
1697 };
1594 meta = {
1698 meta = {
1595 license = [ pkgs.lib.licenses.zpt21 ];
1699 license = [ pkgs.lib.licenses.zpt21 ];
1596 };
1700 };
1597 };
1701 };
1598 zope.event = super.buildPythonPackage {
1702 zope.event = super.buildPythonPackage {
1599 name = "zope.event-4.0.3";
1703 name = "zope.event-4.0.3";
1600 buildInputs = with self; [];
1704 buildInputs = with self; [];
1601 doCheck = false;
1705 doCheck = false;
1602 propagatedBuildInputs = with self; [setuptools];
1706 propagatedBuildInputs = with self; [setuptools];
1603 src = fetchurl {
1707 src = fetchurl {
1604 url = "https://pypi.python.org/packages/c1/29/91ba884d7d6d96691df592e9e9c2bfa57a47040ec1ff47eff18c85137152/zope.event-4.0.3.tar.gz";
1708 url = "https://pypi.python.org/packages/c1/29/91ba884d7d6d96691df592e9e9c2bfa57a47040ec1ff47eff18c85137152/zope.event-4.0.3.tar.gz";
1605 md5 = "9a3780916332b18b8b85f522bcc3e249";
1709 md5 = "9a3780916332b18b8b85f522bcc3e249";
1606 };
1710 };
1607 meta = {
1711 meta = {
1608 license = [ pkgs.lib.licenses.zpt21 ];
1712 license = [ pkgs.lib.licenses.zpt21 ];
1609 };
1713 };
1610 };
1714 };
1611 zope.interface = super.buildPythonPackage {
1715 zope.interface = super.buildPythonPackage {
1612 name = "zope.interface-4.1.3";
1716 name = "zope.interface-4.1.3";
1613 buildInputs = with self; [];
1717 buildInputs = with self; [];
1614 doCheck = false;
1718 doCheck = false;
1615 propagatedBuildInputs = with self; [setuptools];
1719 propagatedBuildInputs = with self; [setuptools];
1616 src = fetchurl {
1720 src = fetchurl {
1617 url = "https://pypi.python.org/packages/9d/81/2509ca3c6f59080123c1a8a97125eb48414022618cec0e64eb1313727bfe/zope.interface-4.1.3.tar.gz";
1721 url = "https://pypi.python.org/packages/9d/81/2509ca3c6f59080123c1a8a97125eb48414022618cec0e64eb1313727bfe/zope.interface-4.1.3.tar.gz";
1618 md5 = "9ae3d24c0c7415deb249dd1a132f0f79";
1722 md5 = "9ae3d24c0c7415deb249dd1a132f0f79";
1619 };
1723 };
1620 meta = {
1724 meta = {
1621 license = [ pkgs.lib.licenses.zpt21 ];
1725 license = [ pkgs.lib.licenses.zpt21 ];
1622 };
1726 };
1623 };
1727 };
1624
1728
1625 ### Test requirements
1729 ### Test requirements
1626
1730
1627
1731
1628 }
1732 }
@@ -1,150 +1,151 b''
1 Babel==1.3
1 Babel==1.3
2 Beaker==1.7.0
2 Beaker==1.7.0
3 CProfileV==1.0.6
3 CProfileV==1.0.6
4 Fabric==1.10.0
4 Fabric==1.10.0
5 FormEncode==1.2.4
5 FormEncode==1.2.4
6 Jinja2==2.7.3
6 Jinja2==2.7.3
7 Mako==1.0.1
7 Mako==1.0.1
8 Markdown==2.6.2
8 Markdown==2.6.2
9 MarkupSafe==0.23
9 MarkupSafe==0.23
10 MySQL-python==1.2.5
10 MySQL-python==1.2.5
11 Paste==2.0.2
11 Paste==2.0.2
12 PasteDeploy==1.5.2
12 PasteDeploy==1.5.2
13 PasteScript==1.7.5
13 PasteScript==1.7.5
14 Pygments==2.0.2
14 Pygments==2.1.3
15
15
16 # TODO: This version is not available on PyPI
16 # TODO: This version is not available on PyPI
17 # Pylons==1.0.2.dev20160108
17 # Pylons==1.0.2.dev20160108
18 Pylons==1.0.1
18 Pylons==1.0.1
19
19
20 # TODO: This version is not available, but newer ones are
20 # TODO: This version is not available, but newer ones are
21 # Pyro4==4.35
21 # Pyro4==4.35
22 Pyro4==4.41
22 Pyro4==4.41
23
23
24 # TODO: This should probably not be in here
24 # TODO: This should probably not be in here
25 # -e hg+https://johbo@code.rhodecode.com/johbo/rhodecode-fork@3a454bd1f17c0b2b2a951cf2b111e0320d7942a9#egg=RhodeCodeEnterprise-dev
25 # -e hg+https://johbo@code.rhodecode.com/johbo/rhodecode-fork@3a454bd1f17c0b2b2a951cf2b111e0320d7942a9#egg=RhodeCodeEnterprise-dev
26
26
27 # TODO: This is not really a dependency, we should add it only
28 # into the development environment, since there it is useful.
29 # RhodeCodeVCSServer==3.9.0
30
31 Routes==1.13
27 Routes==1.13
32 SQLAlchemy==0.9.9
28 SQLAlchemy==0.9.9
33 Sphinx==1.2.2
29 Sphinx==1.2.2
34 Tempita==0.5.2
30 Tempita==0.5.2
35 URLObject==2.4.0
31 URLObject==2.4.0
36 WebError==0.10.3
32 WebError==0.10.3
37
33
38 # TODO: This is modified by us, needs a better integration. For now
34 # TODO: This is modified by us, needs a better integration. For now
39 # using the latest version before.
35 # using the latest version before.
40 # WebHelpers==1.3.dev20150807
36 # WebHelpers==1.3.dev20150807
41 WebHelpers==1.3
37 WebHelpers==1.3
42
38
43 WebHelpers2==2.0
39 WebHelpers2==2.0
44 WebOb==1.3.1
40 WebOb==1.3.1
45 WebTest==1.4.3
41 WebTest==1.4.3
46 Whoosh==2.7.0
42 Whoosh==2.7.0
47 alembic==0.8.4
43 alembic==0.8.4
48 amqplib==1.0.2
44 amqplib==1.0.2
49 anyjson==0.3.3
45 anyjson==0.3.3
50 appenlight-client==0.6.14
46 appenlight-client==0.6.14
51 authomatic==0.1.0.post1;
47 authomatic==0.1.0.post1;
52 backport-ipaddress==0.1
48 backport-ipaddress==0.1
53 bottle==0.12.8
49 bottle==0.12.8
54 bumpversion==0.5.3
50 bumpversion==0.5.3
55 celery==2.2.10
51 celery==2.2.10
52 channelstream==0.5.2
56 click==5.1
53 click==5.1
57 colander==1.2
54 colander==1.2
58 configobj==5.0.6
55 configobj==5.0.6
59 cov-core==1.15.0
56 cov-core==1.15.0
60 coverage==3.7.1
57 coverage==3.7.1
61 cssselect==0.9.1
58 cssselect==0.9.1
62 decorator==3.4.2
59 decorator==3.4.2
60 deform==2.0a2
63 docutils==0.12
61 docutils==0.12
64 dogpile.cache==0.5.7
62 dogpile.cache==0.6.1
65 dogpile.core==0.4.1
63 dogpile.core==0.4.1
66 dulwich==0.12.0
64 dulwich==0.12.0
67 ecdsa==0.11
65 ecdsa==0.11
68 flake8==2.4.1
66 flake8==2.4.1
69 future==0.14.3
67 future==0.14.3
70 futures==3.0.2
68 futures==3.0.2
69 gevent==1.1.1
71 gprof2dot==2015.12.1
70 gprof2dot==2015.12.1
71 greenlet==0.4.9
72 gunicorn==19.6.0
72 gunicorn==19.6.0
73
73
74 # TODO: Needs subvertpy and blows up without Subversion headers,
74 # TODO: Needs subvertpy and blows up without Subversion headers,
75 # actually we should not need this for Enterprise at all.
75 # actually we should not need this for Enterprise at all.
76 # hgsubversion==1.8.2
76 # hgsubversion==1.8.2
77
77
78 gnureadline==6.3.3
78 gnureadline==6.3.3
79 infrae.cache==1.0.1
79 infrae.cache==1.0.1
80 invoke==0.13.0
80 invoke==0.13.0
81 ipdb==0.8
81 ipdb==0.8
82 ipython==3.1.0
82 ipython==3.1.0
83 iso8601==0.1.11
83 iso8601==0.1.11
84 itsdangerous==0.24
84 itsdangerous==0.24
85 kombu==1.5.1
85 kombu==1.5.1
86 lxml==3.4.4
86 lxml==3.4.4
87 mccabe==0.3
87 mccabe==0.3
88 meld3==1.0.2
88 meld3==1.0.2
89 mock==1.0.1
89 mock==1.0.1
90 msgpack-python==0.4.6
90 msgpack-python==0.4.6
91 nose==1.3.6
91 nose==1.3.6
92 objgraph==2.0.0
92 objgraph==2.0.0
93 packaging==15.2
93 packaging==15.2
94 paramiko==1.15.1
94 paramiko==1.15.1
95 pep8==1.5.7
95 pep8==1.5.7
96 psutil==2.2.1
96 psutil==2.2.1
97 psycopg2==2.6
97 psycopg2==2.6.1
98 py==1.4.29
98 py==1.4.29
99 py-bcrypt==0.4
99 py-bcrypt==0.4
100 py-gfm==0.1.3
100 pycrypto==2.6.1
101 pycrypto==2.6.1
101 pycurl==7.19.5
102 pycurl==7.19.5
102 pyflakes==0.8.1
103 pyflakes==0.8.1
103 pyparsing==1.5.7
104 pyparsing==1.5.7
104 pyramid==1.6.1
105 pyramid==1.6.1
105 pyramid-beaker==0.8
106 pyramid-beaker==0.8
106 pyramid-debugtoolbar==2.4.2
107 pyramid-debugtoolbar==2.4.2
107 pyramid-jinja2==2.5
108 pyramid-jinja2==2.5
108 pyramid-mako==1.0.2
109 pyramid-mako==1.0.2
109 pysqlite==2.6.3
110 pysqlite==2.6.3
110 pytest==2.8.5
111 pytest==2.8.5
111 pytest-runner==2.7.1
112 pytest-runner==2.7.1
112 pytest-catchlog==1.2.2
113 pytest-catchlog==1.2.2
113 pytest-cov==1.8.1
114 pytest-cov==1.8.1
114 pytest-profiling==1.0.1
115 pytest-profiling==1.0.1
115 pytest-timeout==0.4
116 pytest-timeout==0.4
116 python-dateutil==1.5
117 python-dateutil==1.5
117 python-ldap==2.4.19
118 python-ldap==2.4.19
118 python-memcached==1.57
119 python-memcached==1.57
119 python-pam==1.8.2
120 python-pam==1.8.2
120 pytz==2015.4
121 pytz==2015.4
121 pyzmq==14.6.0
122 pyzmq==14.6.0
122
123
123 # TODO: This is not available in public
124 # TODO: This is not available in public
124 # rc-testdata==0.2.0
125 # rc-testdata==0.2.0
125
126
126 https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.8.3.zip#md5=9acdfd71b8ddf4056057065f37ab9ccb
127 https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.10.0.zip#md5=4762391473ded761bead3aa58c748044
127
128
128
129
129 recaptcha-client==1.0.6
130 recaptcha-client==1.0.6
130 repoze.lru==0.6
131 repoze.lru==0.6
131 requests==2.9.1
132 requests==2.9.1
132 serpent==1.12
133 serpent==1.12
133 setproctitle==1.1.8
134 setproctitle==1.1.8
134 setuptools==20.8.1
135 setuptools==20.8.1
135 setuptools-scm==1.11.0
136 setuptools-scm==1.11.0
136 simplejson==3.7.2
137 simplejson==3.7.2
137 six==1.9.0
138 six==1.9.0
138 subprocess32==3.2.6
139 subprocess32==3.2.6
139 supervisor==3.1.3
140 supervisor==3.3.0
140 transifex-client==0.10
141 transifex-client==0.10
141 translationstring==1.3
142 translationstring==1.3
142 trollius==1.0.4
143 trollius==1.0.4
143 uWSGI==2.0.11.2
144 uWSGI==2.0.11.2
144 venusian==1.0
145 venusian==1.0
145 waitress==0.8.9
146 waitress==0.8.9
146 wsgiref==0.1.2
147 wsgiref==0.1.2
147 zope.cachedescriptors==4.0.0
148 zope.cachedescriptors==4.0.0
148 zope.deprecation==4.1.2
149 zope.deprecation==4.1.2
149 zope.event==4.0.3
150 zope.event==4.0.3
150 zope.interface==4.1.3
151 zope.interface==4.1.3
@@ -1,1 +1,1 b''
1 4.2.1 No newline at end of file
1 4.3.0 No newline at end of file
@@ -1,58 +1,62 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2016 RhodeCode GmbH
3 # Copyright (C) 2010-2016 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 """
21 """
22
22
23 RhodeCode, a web based repository management software
23 RhodeCode, a web based repository management software
24 versioning implementation: http://www.python.org/dev/peps/pep-0386/
24 versioning implementation: http://www.python.org/dev/peps/pep-0386/
25 """
25 """
26
26
27 import os
27 import os
28 import sys
28 import sys
29 import platform
29 import platform
30
30
31 VERSION = tuple(open(os.path.join(
31 VERSION = tuple(open(os.path.join(
32 os.path.dirname(__file__), 'VERSION')).read().split('.'))
32 os.path.dirname(__file__), 'VERSION')).read().split('.'))
33
33
34 BACKENDS = {
34 BACKENDS = {
35 'hg': 'Mercurial repository',
35 'hg': 'Mercurial repository',
36 'git': 'Git repository',
36 'git': 'Git repository',
37 'svn': 'Subversion repository',
37 'svn': 'Subversion repository',
38 }
38 }
39
39
40 CELERY_ENABLED = False
40 CELERY_ENABLED = False
41 CELERY_EAGER = False
41 CELERY_EAGER = False
42
42
43 # link to config for pylons
43 # link to config for pylons
44 CONFIG = {}
44 CONFIG = {}
45
45
46 # Populated with the settings dictionary from application init in
47 # rhodecode.conf.environment.load_pyramid_environment
48 PYRAMID_SETTINGS = {}
49
46 # Linked module for extensions
50 # Linked module for extensions
47 EXTENSIONS = {}
51 EXTENSIONS = {}
48
52
49 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
53 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
50 __dbversion__ = 54 # defines current db version for migrations
54 __dbversion__ = 55 # defines current db version for migrations
51 __platform__ = platform.system()
55 __platform__ = platform.system()
52 __license__ = 'AGPLv3, and Commercial License'
56 __license__ = 'AGPLv3, and Commercial License'
53 __author__ = 'RhodeCode GmbH'
57 __author__ = 'RhodeCode GmbH'
54 __url__ = 'http://rhodecode.com'
58 __url__ = 'http://rhodecode.com'
55
59
56 is_windows = __platform__ in ['Windows']
60 is_windows = __platform__ in ['Windows']
57 is_unix = not is_windows
61 is_unix = not is_windows
58 is_test = False
62 is_test = False
@@ -1,124 +1,126 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2016 RhodeCode GmbH
3 # Copyright (C) 2016-2016 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21
21
22 import logging
22 import logging
23 import collections
23 import collections
24
24
25 from pylons import url
25 from pylons import url
26 from zope.interface import implementer
26 from zope.interface import implementer
27
27
28 from rhodecode.admin.interfaces import IAdminNavigationRegistry
28 from rhodecode.admin.interfaces import IAdminNavigationRegistry
29 from rhodecode.lib.utils import get_registry
29 from rhodecode.lib.utils import get_registry
30 from rhodecode.translation import _
30 from rhodecode.translation import _
31
31
32
32
33 log = logging.getLogger(__name__)
33 log = logging.getLogger(__name__)
34
34
35 NavListEntry = collections.namedtuple('NavListEntry', ['key', 'name', 'url'])
35 NavListEntry = collections.namedtuple('NavListEntry', ['key', 'name', 'url'])
36
36
37
37
38 class NavEntry(object):
38 class NavEntry(object):
39 """
39 """
40 Represents an entry in the admin navigation.
40 Represents an entry in the admin navigation.
41
41
42 :param key: Unique identifier used to store reference in an OrderedDict.
42 :param key: Unique identifier used to store reference in an OrderedDict.
43 :param name: Display name, usually a translation string.
43 :param name: Display name, usually a translation string.
44 :param view_name: Name of the view, used generate the URL.
44 :param view_name: Name of the view, used generate the URL.
45 :param pyramid: Indicator to use pyramid for URL generation. This should
45 :param pyramid: Indicator to use pyramid for URL generation. This should
46 be removed as soon as we are fully migrated to pyramid.
46 be removed as soon as we are fully migrated to pyramid.
47 """
47 """
48
48
49 def __init__(self, key, name, view_name, pyramid=False):
49 def __init__(self, key, name, view_name, pyramid=False):
50 self.key = key
50 self.key = key
51 self.name = name
51 self.name = name
52 self.view_name = view_name
52 self.view_name = view_name
53 self.pyramid = pyramid
53 self.pyramid = pyramid
54
54
55 def generate_url(self, request):
55 def generate_url(self, request):
56 if self.pyramid:
56 if self.pyramid:
57 if hasattr(request, 'route_path'):
57 if hasattr(request, 'route_path'):
58 return request.route_path(self.view_name)
58 return request.route_path(self.view_name)
59 else:
59 else:
60 # TODO: johbo: Remove this after migrating to pyramid.
60 # TODO: johbo: Remove this after migrating to pyramid.
61 # We need the pyramid request here to generate URLs to pyramid
61 # We need the pyramid request here to generate URLs to pyramid
62 # views from within pylons views.
62 # views from within pylons views.
63 from pyramid.threadlocal import get_current_request
63 from pyramid.threadlocal import get_current_request
64 pyramid_request = get_current_request()
64 pyramid_request = get_current_request()
65 return pyramid_request.route_path(self.view_name)
65 return pyramid_request.route_path(self.view_name)
66 else:
66 else:
67 return url(self.view_name)
67 return url(self.view_name)
68
68
69
69
70 @implementer(IAdminNavigationRegistry)
70 @implementer(IAdminNavigationRegistry)
71 class NavigationRegistry(object):
71 class NavigationRegistry(object):
72
72
73 _base_entries = [
73 _base_entries = [
74 NavEntry('global', _('Global'), 'admin_settings_global'),
74 NavEntry('global', _('Global'), 'admin_settings_global'),
75 NavEntry('vcs', _('VCS'), 'admin_settings_vcs'),
75 NavEntry('vcs', _('VCS'), 'admin_settings_vcs'),
76 NavEntry('visual', _('Visual'), 'admin_settings_visual'),
76 NavEntry('visual', _('Visual'), 'admin_settings_visual'),
77 NavEntry('mapping', _('Remap and Rescan'), 'admin_settings_mapping'),
77 NavEntry('mapping', _('Remap and Rescan'), 'admin_settings_mapping'),
78 NavEntry('issuetracker', _('Issue Tracker'),
78 NavEntry('issuetracker', _('Issue Tracker'),
79 'admin_settings_issuetracker'),
79 'admin_settings_issuetracker'),
80 NavEntry('email', _('Email'), 'admin_settings_email'),
80 NavEntry('email', _('Email'), 'admin_settings_email'),
81 NavEntry('hooks', _('Hooks'), 'admin_settings_hooks'),
81 NavEntry('hooks', _('Hooks'), 'admin_settings_hooks'),
82 NavEntry('search', _('Full Text Search'), 'admin_settings_search'),
82 NavEntry('search', _('Full Text Search'), 'admin_settings_search'),
83 NavEntry('integrations', _('Integrations'),
84 'global_integrations_home', pyramid=True),
83 NavEntry('system', _('System Info'), 'admin_settings_system'),
85 NavEntry('system', _('System Info'), 'admin_settings_system'),
84 NavEntry('open_source', _('Open Source Licenses'),
86 NavEntry('open_source', _('Open Source Licenses'),
85 'admin_settings_open_source', pyramid=True),
87 'admin_settings_open_source', pyramid=True),
86 # TODO: marcink: we disable supervisor now until the supervisor stats
88 # TODO: marcink: we disable supervisor now until the supervisor stats
87 # page is fixed in the nix configuration
89 # page is fixed in the nix configuration
88 # NavEntry('supervisor', _('Supervisor'), 'admin_settings_supervisor'),
90 # NavEntry('supervisor', _('Supervisor'), 'admin_settings_supervisor'),
89 ]
91 ]
90
92
91 _labs_entry = NavEntry('labs', _('Labs'),
93 _labs_entry = NavEntry('labs', _('Labs'),
92 'admin_settings_labs')
94 'admin_settings_labs')
93
95
94 def __init__(self, labs_active=False):
96 def __init__(self, labs_active=False):
95 self._registered_entries = collections.OrderedDict([
97 self._registered_entries = collections.OrderedDict([
96 (item.key, item) for item in self.__class__._base_entries
98 (item.key, item) for item in self.__class__._base_entries
97 ])
99 ])
98
100
99 if labs_active:
101 if labs_active:
100 self.add_entry(self._labs_entry)
102 self.add_entry(self._labs_entry)
101
103
102 def add_entry(self, entry):
104 def add_entry(self, entry):
103 self._registered_entries[entry.key] = entry
105 self._registered_entries[entry.key] = entry
104
106
105 def get_navlist(self, request):
107 def get_navlist(self, request):
106 navlist = [NavListEntry(i.key, i.name, i.generate_url(request))
108 navlist = [NavListEntry(i.key, i.name, i.generate_url(request))
107 for i in self._registered_entries.values()]
109 for i in self._registered_entries.values()]
108 return navlist
110 return navlist
109
111
110
112
111 def navigation_registry(request):
113 def navigation_registry(request):
112 """
114 """
113 Helper that returns the admin navigation registry.
115 Helper that returns the admin navigation registry.
114 """
116 """
115 pyramid_registry = get_registry(request)
117 pyramid_registry = get_registry(request)
116 nav_registry = pyramid_registry.queryUtility(IAdminNavigationRegistry)
118 nav_registry = pyramid_registry.queryUtility(IAdminNavigationRegistry)
117 return nav_registry
119 return nav_registry
118
120
119
121
120 def navigation_list(request):
122 def navigation_list(request):
121 """
123 """
122 Helper that returns the admin navigation as list of NavListEntry objects.
124 Helper that returns the admin navigation as list of NavListEntry objects.
123 """
125 """
124 return navigation_registry(request).get_navlist(request)
126 return navigation_registry(request).get_navlist(request)
@@ -1,497 +1,505 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2016 RhodeCode GmbH
3 # Copyright (C) 2011-2016 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 import inspect
21 import inspect
22 import itertools
22 import itertools
23 import logging
23 import logging
24 import types
24 import types
25
25
26 import decorator
26 import decorator
27 import venusian
27 import venusian
28 from collections import OrderedDict
29
28 from pyramid.exceptions import ConfigurationError
30 from pyramid.exceptions import ConfigurationError
29 from pyramid.renderers import render
31 from pyramid.renderers import render
30 from pyramid.response import Response
32 from pyramid.response import Response
31 from pyramid.httpexceptions import HTTPNotFound
33 from pyramid.httpexceptions import HTTPNotFound
32
34
33 from rhodecode.api.exc import JSONRPCBaseError, JSONRPCError, JSONRPCForbidden
35 from rhodecode.api.exc import (
36 JSONRPCBaseError, JSONRPCError, JSONRPCForbidden, JSONRPCValidationError)
34 from rhodecode.lib.auth import AuthUser
37 from rhodecode.lib.auth import AuthUser
35 from rhodecode.lib.base import get_ip_addr
38 from rhodecode.lib.base import get_ip_addr
36 from rhodecode.lib.ext_json import json
39 from rhodecode.lib.ext_json import json
37 from rhodecode.lib.utils2 import safe_str
40 from rhodecode.lib.utils2 import safe_str
38 from rhodecode.lib.plugins.utils import get_plugin_settings
41 from rhodecode.lib.plugins.utils import get_plugin_settings
39 from rhodecode.model.db import User, UserApiKeys
42 from rhodecode.model.db import User, UserApiKeys
40
43
41 log = logging.getLogger(__name__)
44 log = logging.getLogger(__name__)
42
45
43 DEFAULT_RENDERER = 'jsonrpc_renderer'
46 DEFAULT_RENDERER = 'jsonrpc_renderer'
44 DEFAULT_URL = '/_admin/apiv2'
47 DEFAULT_URL = '/_admin/apiv2'
45
48
46
49
47 class ExtJsonRenderer(object):
50 class ExtJsonRenderer(object):
48 """
51 """
49 Custom renderer that mkaes use of our ext_json lib
52 Custom renderer that mkaes use of our ext_json lib
50
53
51 """
54 """
52
55
53 def __init__(self, serializer=json.dumps, **kw):
56 def __init__(self, serializer=json.dumps, **kw):
54 """ Any keyword arguments will be passed to the ``serializer``
57 """ Any keyword arguments will be passed to the ``serializer``
55 function."""
58 function."""
56 self.serializer = serializer
59 self.serializer = serializer
57 self.kw = kw
60 self.kw = kw
58
61
59 def __call__(self, info):
62 def __call__(self, info):
60 """ Returns a plain JSON-encoded string with content-type
63 """ Returns a plain JSON-encoded string with content-type
61 ``application/json``. The content-type may be overridden by
64 ``application/json``. The content-type may be overridden by
62 setting ``request.response.content_type``."""
65 setting ``request.response.content_type``."""
63
66
64 def _render(value, system):
67 def _render(value, system):
65 request = system.get('request')
68 request = system.get('request')
66 if request is not None:
69 if request is not None:
67 response = request.response
70 response = request.response
68 ct = response.content_type
71 ct = response.content_type
69 if ct == response.default_content_type:
72 if ct == response.default_content_type:
70 response.content_type = 'application/json'
73 response.content_type = 'application/json'
71
74
72 return self.serializer(value, **self.kw)
75 return self.serializer(value, **self.kw)
73
76
74 return _render
77 return _render
75
78
76
79
77 def jsonrpc_response(request, result):
80 def jsonrpc_response(request, result):
78 rpc_id = getattr(request, 'rpc_id', None)
81 rpc_id = getattr(request, 'rpc_id', None)
79 response = request.response
82 response = request.response
80
83
81 # store content_type before render is called
84 # store content_type before render is called
82 ct = response.content_type
85 ct = response.content_type
83
86
84 ret_value = ''
87 ret_value = ''
85 if rpc_id:
88 if rpc_id:
86 ret_value = {
89 ret_value = {
87 'id': rpc_id,
90 'id': rpc_id,
88 'result': result,
91 'result': result,
89 'error': None,
92 'error': None,
90 }
93 }
91
94
92 # fetch deprecation warnings, and store it inside results
95 # fetch deprecation warnings, and store it inside results
93 deprecation = getattr(request, 'rpc_deprecation', None)
96 deprecation = getattr(request, 'rpc_deprecation', None)
94 if deprecation:
97 if deprecation:
95 ret_value['DEPRECATION_WARNING'] = deprecation
98 ret_value['DEPRECATION_WARNING'] = deprecation
96
99
97 raw_body = render(DEFAULT_RENDERER, ret_value, request=request)
100 raw_body = render(DEFAULT_RENDERER, ret_value, request=request)
98 response.body = safe_str(raw_body, response.charset)
101 response.body = safe_str(raw_body, response.charset)
99
102
100 if ct == response.default_content_type:
103 if ct == response.default_content_type:
101 response.content_type = 'application/json'
104 response.content_type = 'application/json'
102
105
103 return response
106 return response
104
107
105
108
106 def jsonrpc_error(request, message, retid=None, code=None):
109 def jsonrpc_error(request, message, retid=None, code=None):
107 """
110 """
108 Generate a Response object with a JSON-RPC error body
111 Generate a Response object with a JSON-RPC error body
109
112
110 :param code:
113 :param code:
111 :param retid:
114 :param retid:
112 :param message:
115 :param message:
113 """
116 """
114 err_dict = {'id': retid, 'result': None, 'error': message}
117 err_dict = {'id': retid, 'result': None, 'error': message}
115 body = render(DEFAULT_RENDERER, err_dict, request=request).encode('utf-8')
118 body = render(DEFAULT_RENDERER, err_dict, request=request).encode('utf-8')
116 return Response(
119 return Response(
117 body=body,
120 body=body,
118 status=code,
121 status=code,
119 content_type='application/json'
122 content_type='application/json'
120 )
123 )
121
124
122
125
123 def exception_view(exc, request):
126 def exception_view(exc, request):
124 rpc_id = getattr(request, 'rpc_id', None)
127 rpc_id = getattr(request, 'rpc_id', None)
125
128
126 fault_message = 'undefined error'
129 fault_message = 'undefined error'
127 if isinstance(exc, JSONRPCError):
130 if isinstance(exc, JSONRPCError):
128 fault_message = exc.message
131 fault_message = exc.message
129 log.debug('json-rpc error rpc_id:%s "%s"', rpc_id, fault_message)
132 log.debug('json-rpc error rpc_id:%s "%s"', rpc_id, fault_message)
133 elif isinstance(exc, JSONRPCValidationError):
134 colander_exc = exc.colander_exception
135 #TODO: think maybe of nicer way to serialize errors ?
136 fault_message = colander_exc.asdict()
137 log.debug('json-rpc error rpc_id:%s "%s"', rpc_id, fault_message)
130 elif isinstance(exc, JSONRPCForbidden):
138 elif isinstance(exc, JSONRPCForbidden):
131 fault_message = 'Access was denied to this resource.'
139 fault_message = 'Access was denied to this resource.'
132 log.warning('json-rpc forbidden call rpc_id:%s "%s"', rpc_id, fault_message)
140 log.warning('json-rpc forbidden call rpc_id:%s "%s"', rpc_id, fault_message)
133 elif isinstance(exc, HTTPNotFound):
141 elif isinstance(exc, HTTPNotFound):
134 method = request.rpc_method
142 method = request.rpc_method
135 log.debug('json-rpc method `%s` not found in list of '
143 log.debug('json-rpc method `%s` not found in list of '
136 'api calls: %s, rpc_id:%s',
144 'api calls: %s, rpc_id:%s',
137 method, request.registry.jsonrpc_methods.keys(), rpc_id)
145 method, request.registry.jsonrpc_methods.keys(), rpc_id)
138 fault_message = "No such method: {}".format(method)
146 fault_message = "No such method: {}".format(method)
139
147
140 return jsonrpc_error(request, fault_message, rpc_id)
148 return jsonrpc_error(request, fault_message, rpc_id)
141
149
142
150
143 def request_view(request):
151 def request_view(request):
144 """
152 """
145 Main request handling method. It handles all logic to call a specific
153 Main request handling method. It handles all logic to call a specific
146 exposed method
154 exposed method
147 """
155 """
148
156
149 # check if we can find this session using api_key, get_by_auth_token
157 # check if we can find this session using api_key, get_by_auth_token
150 # search not expired tokens only
158 # search not expired tokens only
151
159
152 try:
160 try:
153 u = User.get_by_auth_token(request.rpc_api_key)
161 u = User.get_by_auth_token(request.rpc_api_key)
154
162
155 if u is None:
163 if u is None:
156 return jsonrpc_error(
164 return jsonrpc_error(
157 request, retid=request.rpc_id, message='Invalid API KEY')
165 request, retid=request.rpc_id, message='Invalid API KEY')
158
166
159 if not u.active:
167 if not u.active:
160 return jsonrpc_error(
168 return jsonrpc_error(
161 request, retid=request.rpc_id,
169 request, retid=request.rpc_id,
162 message='Request from this user not allowed')
170 message='Request from this user not allowed')
163
171
164 # check if we are allowed to use this IP
172 # check if we are allowed to use this IP
165 auth_u = AuthUser(
173 auth_u = AuthUser(
166 u.user_id, request.rpc_api_key, ip_addr=request.rpc_ip_addr)
174 u.user_id, request.rpc_api_key, ip_addr=request.rpc_ip_addr)
167 if not auth_u.ip_allowed:
175 if not auth_u.ip_allowed:
168 return jsonrpc_error(
176 return jsonrpc_error(
169 request, retid=request.rpc_id,
177 request, retid=request.rpc_id,
170 message='Request from IP:%s not allowed' % (
178 message='Request from IP:%s not allowed' % (
171 request.rpc_ip_addr,))
179 request.rpc_ip_addr,))
172 else:
180 else:
173 log.info('Access for IP:%s allowed' % (request.rpc_ip_addr,))
181 log.info('Access for IP:%s allowed' % (request.rpc_ip_addr,))
174
182
175 # now check if token is valid for API
183 # now check if token is valid for API
176 role = UserApiKeys.ROLE_API
184 role = UserApiKeys.ROLE_API
177 extra_auth_tokens = [
185 extra_auth_tokens = [
178 x.api_key for x in User.extra_valid_auth_tokens(u, role=role)]
186 x.api_key for x in User.extra_valid_auth_tokens(u, role=role)]
179 active_tokens = [u.api_key] + extra_auth_tokens
187 active_tokens = [u.api_key] + extra_auth_tokens
180
188
181 log.debug('Checking if API key has proper role')
189 log.debug('Checking if API key has proper role')
182 if request.rpc_api_key not in active_tokens:
190 if request.rpc_api_key not in active_tokens:
183 return jsonrpc_error(
191 return jsonrpc_error(
184 request, retid=request.rpc_id,
192 request, retid=request.rpc_id,
185 message='API KEY has bad role for an API call')
193 message='API KEY has bad role for an API call')
186
194
187 except Exception as e:
195 except Exception as e:
188 log.exception('Error on API AUTH')
196 log.exception('Error on API AUTH')
189 return jsonrpc_error(
197 return jsonrpc_error(
190 request, retid=request.rpc_id, message='Invalid API KEY')
198 request, retid=request.rpc_id, message='Invalid API KEY')
191
199
192 method = request.rpc_method
200 method = request.rpc_method
193 func = request.registry.jsonrpc_methods[method]
201 func = request.registry.jsonrpc_methods[method]
194
202
195 # now that we have a method, add request._req_params to
203 # now that we have a method, add request._req_params to
196 # self.kargs and dispatch control to WGIController
204 # self.kargs and dispatch control to WGIController
197 argspec = inspect.getargspec(func)
205 argspec = inspect.getargspec(func)
198 arglist = argspec[0]
206 arglist = argspec[0]
199 defaults = map(type, argspec[3] or [])
207 defaults = map(type, argspec[3] or [])
200 default_empty = types.NotImplementedType
208 default_empty = types.NotImplementedType
201
209
202 # kw arguments required by this method
210 # kw arguments required by this method
203 func_kwargs = dict(itertools.izip_longest(
211 func_kwargs = dict(itertools.izip_longest(
204 reversed(arglist), reversed(defaults), fillvalue=default_empty))
212 reversed(arglist), reversed(defaults), fillvalue=default_empty))
205
213
206 # This attribute will need to be first param of a method that uses
214 # This attribute will need to be first param of a method that uses
207 # api_key, which is translated to instance of user at that name
215 # api_key, which is translated to instance of user at that name
208 user_var = 'apiuser'
216 user_var = 'apiuser'
209 request_var = 'request'
217 request_var = 'request'
210
218
211 for arg in [user_var, request_var]:
219 for arg in [user_var, request_var]:
212 if arg not in arglist:
220 if arg not in arglist:
213 return jsonrpc_error(
221 return jsonrpc_error(
214 request,
222 request,
215 retid=request.rpc_id,
223 retid=request.rpc_id,
216 message='This method [%s] does not support '
224 message='This method [%s] does not support '
217 'required parameter `%s`' % (func.__name__, arg))
225 'required parameter `%s`' % (func.__name__, arg))
218
226
219 # get our arglist and check if we provided them as args
227 # get our arglist and check if we provided them as args
220 for arg, default in func_kwargs.items():
228 for arg, default in func_kwargs.items():
221 if arg in [user_var, request_var]:
229 if arg in [user_var, request_var]:
222 # user_var and request_var are pre-hardcoded parameters and we
230 # user_var and request_var are pre-hardcoded parameters and we
223 # don't need to do any translation
231 # don't need to do any translation
224 continue
232 continue
225
233
226 # skip the required param check if it's default value is
234 # skip the required param check if it's default value is
227 # NotImplementedType (default_empty)
235 # NotImplementedType (default_empty)
228 if default == default_empty and arg not in request.rpc_params:
236 if default == default_empty and arg not in request.rpc_params:
229 return jsonrpc_error(
237 return jsonrpc_error(
230 request,
238 request,
231 retid=request.rpc_id,
239 retid=request.rpc_id,
232 message=('Missing non optional `%s` arg in JSON DATA' % arg)
240 message=('Missing non optional `%s` arg in JSON DATA' % arg)
233 )
241 )
234
242
235 # sanitze extra passed arguments
243 # sanitze extra passed arguments
236 for k in request.rpc_params.keys()[:]:
244 for k in request.rpc_params.keys()[:]:
237 if k not in func_kwargs:
245 if k not in func_kwargs:
238 del request.rpc_params[k]
246 del request.rpc_params[k]
239
247
240 call_params = request.rpc_params
248 call_params = request.rpc_params
241 call_params.update({
249 call_params.update({
242 'request': request,
250 'request': request,
243 'apiuser': auth_u
251 'apiuser': auth_u
244 })
252 })
245 try:
253 try:
246 ret_value = func(**call_params)
254 ret_value = func(**call_params)
247 return jsonrpc_response(request, ret_value)
255 return jsonrpc_response(request, ret_value)
248 except JSONRPCBaseError:
256 except JSONRPCBaseError:
249 raise
257 raise
250 except Exception:
258 except Exception:
251 log.exception('Unhandled exception occured on api call: %s', func)
259 log.exception('Unhandled exception occured on api call: %s', func)
252 return jsonrpc_error(request, retid=request.rpc_id,
260 return jsonrpc_error(request, retid=request.rpc_id,
253 message='Internal server error')
261 message='Internal server error')
254
262
255
263
256 def setup_request(request):
264 def setup_request(request):
257 """
265 """
258 Parse a JSON-RPC request body. It's used inside the predicates method
266 Parse a JSON-RPC request body. It's used inside the predicates method
259 to validate and bootstrap requests for usage in rpc calls.
267 to validate and bootstrap requests for usage in rpc calls.
260
268
261 We need to raise JSONRPCError here if we want to return some errors back to
269 We need to raise JSONRPCError here if we want to return some errors back to
262 user.
270 user.
263 """
271 """
264 log.debug('Executing setup request: %r', request)
272 log.debug('Executing setup request: %r', request)
265 request.rpc_ip_addr = get_ip_addr(request.environ)
273 request.rpc_ip_addr = get_ip_addr(request.environ)
266 # TODO: marcink, deprecate GET at some point
274 # TODO: marcink, deprecate GET at some point
267 if request.method not in ['POST', 'GET']:
275 if request.method not in ['POST', 'GET']:
268 log.debug('unsupported request method "%s"', request.method)
276 log.debug('unsupported request method "%s"', request.method)
269 raise JSONRPCError(
277 raise JSONRPCError(
270 'unsupported request method "%s". Please use POST' % request.method)
278 'unsupported request method "%s". Please use POST' % request.method)
271
279
272 if 'CONTENT_LENGTH' not in request.environ:
280 if 'CONTENT_LENGTH' not in request.environ:
273 log.debug("No Content-Length")
281 log.debug("No Content-Length")
274 raise JSONRPCError("Empty body, No Content-Length in request")
282 raise JSONRPCError("Empty body, No Content-Length in request")
275
283
276 else:
284 else:
277 length = request.environ['CONTENT_LENGTH']
285 length = request.environ['CONTENT_LENGTH']
278 log.debug('Content-Length: %s', length)
286 log.debug('Content-Length: %s', length)
279
287
280 if length == 0:
288 if length == 0:
281 log.debug("Content-Length is 0")
289 log.debug("Content-Length is 0")
282 raise JSONRPCError("Content-Length is 0")
290 raise JSONRPCError("Content-Length is 0")
283
291
284 raw_body = request.body
292 raw_body = request.body
285 try:
293 try:
286 json_body = json.loads(raw_body)
294 json_body = json.loads(raw_body)
287 except ValueError as e:
295 except ValueError as e:
288 # catch JSON errors Here
296 # catch JSON errors Here
289 raise JSONRPCError("JSON parse error ERR:%s RAW:%r" % (e, raw_body))
297 raise JSONRPCError("JSON parse error ERR:%s RAW:%r" % (e, raw_body))
290
298
291 request.rpc_id = json_body.get('id')
299 request.rpc_id = json_body.get('id')
292 request.rpc_method = json_body.get('method')
300 request.rpc_method = json_body.get('method')
293
301
294 # check required base parameters
302 # check required base parameters
295 try:
303 try:
296 api_key = json_body.get('api_key')
304 api_key = json_body.get('api_key')
297 if not api_key:
305 if not api_key:
298 api_key = json_body.get('auth_token')
306 api_key = json_body.get('auth_token')
299
307
300 if not api_key:
308 if not api_key:
301 raise KeyError('api_key or auth_token')
309 raise KeyError('api_key or auth_token')
302
310
303 request.rpc_api_key = api_key
311 request.rpc_api_key = api_key
304 request.rpc_id = json_body['id']
312 request.rpc_id = json_body['id']
305 request.rpc_method = json_body['method']
313 request.rpc_method = json_body['method']
306 request.rpc_params = json_body['args'] \
314 request.rpc_params = json_body['args'] \
307 if isinstance(json_body['args'], dict) else {}
315 if isinstance(json_body['args'], dict) else {}
308
316
309 log.debug(
317 log.debug(
310 'method: %s, params: %s' % (request.rpc_method, request.rpc_params))
318 'method: %s, params: %s' % (request.rpc_method, request.rpc_params))
311 except KeyError as e:
319 except KeyError as e:
312 raise JSONRPCError('Incorrect JSON data. Missing %s' % e)
320 raise JSONRPCError('Incorrect JSON data. Missing %s' % e)
313
321
314 log.debug('setup complete, now handling method:%s rpcid:%s',
322 log.debug('setup complete, now handling method:%s rpcid:%s',
315 request.rpc_method, request.rpc_id, )
323 request.rpc_method, request.rpc_id, )
316
324
317
325
318 class RoutePredicate(object):
326 class RoutePredicate(object):
319 def __init__(self, val, config):
327 def __init__(self, val, config):
320 self.val = val
328 self.val = val
321
329
322 def text(self):
330 def text(self):
323 return 'jsonrpc route = %s' % self.val
331 return 'jsonrpc route = %s' % self.val
324
332
325 phash = text
333 phash = text
326
334
327 def __call__(self, info, request):
335 def __call__(self, info, request):
328 if self.val:
336 if self.val:
329 # potentially setup and bootstrap our call
337 # potentially setup and bootstrap our call
330 setup_request(request)
338 setup_request(request)
331
339
332 # Always return True so that even if it isn't a valid RPC it
340 # Always return True so that even if it isn't a valid RPC it
333 # will fall through to the underlaying handlers like notfound_view
341 # will fall through to the underlaying handlers like notfound_view
334 return True
342 return True
335
343
336
344
337 class NotFoundPredicate(object):
345 class NotFoundPredicate(object):
338 def __init__(self, val, config):
346 def __init__(self, val, config):
339 self.val = val
347 self.val = val
340
348
341 def text(self):
349 def text(self):
342 return 'jsonrpc method not found = %s' % self.val
350 return 'jsonrpc method not found = %s' % self.val
343
351
344 phash = text
352 phash = text
345
353
346 def __call__(self, info, request):
354 def __call__(self, info, request):
347 return hasattr(request, 'rpc_method')
355 return hasattr(request, 'rpc_method')
348
356
349
357
350 class MethodPredicate(object):
358 class MethodPredicate(object):
351 def __init__(self, val, config):
359 def __init__(self, val, config):
352 self.method = val
360 self.method = val
353
361
354 def text(self):
362 def text(self):
355 return 'jsonrpc method = %s' % self.method
363 return 'jsonrpc method = %s' % self.method
356
364
357 phash = text
365 phash = text
358
366
359 def __call__(self, context, request):
367 def __call__(self, context, request):
360 # we need to explicitly return False here, so pyramid doesn't try to
368 # we need to explicitly return False here, so pyramid doesn't try to
361 # execute our view directly. We need our main handler to execute things
369 # execute our view directly. We need our main handler to execute things
362 return getattr(request, 'rpc_method') == self.method
370 return getattr(request, 'rpc_method') == self.method
363
371
364
372
365 def add_jsonrpc_method(config, view, **kwargs):
373 def add_jsonrpc_method(config, view, **kwargs):
366 # pop the method name
374 # pop the method name
367 method = kwargs.pop('method', None)
375 method = kwargs.pop('method', None)
368
376
369 if method is None:
377 if method is None:
370 raise ConfigurationError(
378 raise ConfigurationError(
371 'Cannot register a JSON-RPC method without specifying the '
379 'Cannot register a JSON-RPC method without specifying the '
372 '"method"')
380 '"method"')
373
381
374 # we define custom predicate, to enable to detect conflicting methods,
382 # we define custom predicate, to enable to detect conflicting methods,
375 # those predicates are kind of "translation" from the decorator variables
383 # those predicates are kind of "translation" from the decorator variables
376 # to internal predicates names
384 # to internal predicates names
377
385
378 kwargs['jsonrpc_method'] = method
386 kwargs['jsonrpc_method'] = method
379
387
380 # register our view into global view store for validation
388 # register our view into global view store for validation
381 config.registry.jsonrpc_methods[method] = view
389 config.registry.jsonrpc_methods[method] = view
382
390
383 # we're using our main request_view handler, here, so each method
391 # we're using our main request_view handler, here, so each method
384 # has a unified handler for itself
392 # has a unified handler for itself
385 config.add_view(request_view, route_name='apiv2', **kwargs)
393 config.add_view(request_view, route_name='apiv2', **kwargs)
386
394
387
395
388 class jsonrpc_method(object):
396 class jsonrpc_method(object):
389 """
397 """
390 decorator that works similar to @add_view_config decorator,
398 decorator that works similar to @add_view_config decorator,
391 but tailored for our JSON RPC
399 but tailored for our JSON RPC
392 """
400 """
393
401
394 venusian = venusian # for testing injection
402 venusian = venusian # for testing injection
395
403
396 def __init__(self, method=None, **kwargs):
404 def __init__(self, method=None, **kwargs):
397 self.method = method
405 self.method = method
398 self.kwargs = kwargs
406 self.kwargs = kwargs
399
407
400 def __call__(self, wrapped):
408 def __call__(self, wrapped):
401 kwargs = self.kwargs.copy()
409 kwargs = self.kwargs.copy()
402 kwargs['method'] = self.method or wrapped.__name__
410 kwargs['method'] = self.method or wrapped.__name__
403 depth = kwargs.pop('_depth', 0)
411 depth = kwargs.pop('_depth', 0)
404
412
405 def callback(context, name, ob):
413 def callback(context, name, ob):
406 config = context.config.with_package(info.module)
414 config = context.config.with_package(info.module)
407 config.add_jsonrpc_method(view=ob, **kwargs)
415 config.add_jsonrpc_method(view=ob, **kwargs)
408
416
409 info = venusian.attach(wrapped, callback, category='pyramid',
417 info = venusian.attach(wrapped, callback, category='pyramid',
410 depth=depth + 1)
418 depth=depth + 1)
411 if info.scope == 'class':
419 if info.scope == 'class':
412 # ensure that attr is set if decorating a class method
420 # ensure that attr is set if decorating a class method
413 kwargs.setdefault('attr', wrapped.__name__)
421 kwargs.setdefault('attr', wrapped.__name__)
414
422
415 kwargs['_info'] = info.codeinfo # fbo action_method
423 kwargs['_info'] = info.codeinfo # fbo action_method
416 return wrapped
424 return wrapped
417
425
418
426
419 class jsonrpc_deprecated_method(object):
427 class jsonrpc_deprecated_method(object):
420 """
428 """
421 Marks method as deprecated, adds log.warning, and inject special key to
429 Marks method as deprecated, adds log.warning, and inject special key to
422 the request variable to mark method as deprecated.
430 the request variable to mark method as deprecated.
423 Also injects special docstring that extract_docs will catch to mark
431 Also injects special docstring that extract_docs will catch to mark
424 method as deprecated.
432 method as deprecated.
425
433
426 :param use_method: specify which method should be used instead of
434 :param use_method: specify which method should be used instead of
427 the decorated one
435 the decorated one
428
436
429 Use like::
437 Use like::
430
438
431 @jsonrpc_method()
439 @jsonrpc_method()
432 @jsonrpc_deprecated_method(use_method='new_func', deprecated_at_version='3.0.0')
440 @jsonrpc_deprecated_method(use_method='new_func', deprecated_at_version='3.0.0')
433 def old_func(request, apiuser, arg1, arg2):
441 def old_func(request, apiuser, arg1, arg2):
434 ...
442 ...
435 """
443 """
436
444
437 def __init__(self, use_method, deprecated_at_version):
445 def __init__(self, use_method, deprecated_at_version):
438 self.use_method = use_method
446 self.use_method = use_method
439 self.deprecated_at_version = deprecated_at_version
447 self.deprecated_at_version = deprecated_at_version
440 self.deprecated_msg = ''
448 self.deprecated_msg = ''
441
449
442 def __call__(self, func):
450 def __call__(self, func):
443 self.deprecated_msg = 'Please use method `{method}` instead.'.format(
451 self.deprecated_msg = 'Please use method `{method}` instead.'.format(
444 method=self.use_method)
452 method=self.use_method)
445
453
446 docstring = """\n
454 docstring = """\n
447 .. deprecated:: {version}
455 .. deprecated:: {version}
448
456
449 {deprecation_message}
457 {deprecation_message}
450
458
451 {original_docstring}
459 {original_docstring}
452 """
460 """
453 func.__doc__ = docstring.format(
461 func.__doc__ = docstring.format(
454 version=self.deprecated_at_version,
462 version=self.deprecated_at_version,
455 deprecation_message=self.deprecated_msg,
463 deprecation_message=self.deprecated_msg,
456 original_docstring=func.__doc__)
464 original_docstring=func.__doc__)
457 return decorator.decorator(self.__wrapper, func)
465 return decorator.decorator(self.__wrapper, func)
458
466
459 def __wrapper(self, func, *fargs, **fkwargs):
467 def __wrapper(self, func, *fargs, **fkwargs):
460 log.warning('DEPRECATED API CALL on function %s, please '
468 log.warning('DEPRECATED API CALL on function %s, please '
461 'use `%s` instead', func, self.use_method)
469 'use `%s` instead', func, self.use_method)
462 # alter function docstring to mark as deprecated, this is picked up
470 # alter function docstring to mark as deprecated, this is picked up
463 # via fabric file that generates API DOC.
471 # via fabric file that generates API DOC.
464 result = func(*fargs, **fkwargs)
472 result = func(*fargs, **fkwargs)
465
473
466 request = fargs[0]
474 request = fargs[0]
467 request.rpc_deprecation = 'DEPRECATED METHOD ' + self.deprecated_msg
475 request.rpc_deprecation = 'DEPRECATED METHOD ' + self.deprecated_msg
468 return result
476 return result
469
477
470
478
471 def includeme(config):
479 def includeme(config):
472 plugin_module = 'rhodecode.api'
480 plugin_module = 'rhodecode.api'
473 plugin_settings = get_plugin_settings(
481 plugin_settings = get_plugin_settings(
474 plugin_module, config.registry.settings)
482 plugin_module, config.registry.settings)
475
483
476 if not hasattr(config.registry, 'jsonrpc_methods'):
484 if not hasattr(config.registry, 'jsonrpc_methods'):
477 config.registry.jsonrpc_methods = {}
485 config.registry.jsonrpc_methods = OrderedDict()
478
486
479 # match filter by given method only
487 # match filter by given method only
480 config.add_view_predicate(
488 config.add_view_predicate(
481 'jsonrpc_method', MethodPredicate)
489 'jsonrpc_method', MethodPredicate)
482
490
483 config.add_renderer(DEFAULT_RENDERER, ExtJsonRenderer(
491 config.add_renderer(DEFAULT_RENDERER, ExtJsonRenderer(
484 serializer=json.dumps, indent=4))
492 serializer=json.dumps, indent=4))
485 config.add_directive('add_jsonrpc_method', add_jsonrpc_method)
493 config.add_directive('add_jsonrpc_method', add_jsonrpc_method)
486
494
487 config.add_route_predicate(
495 config.add_route_predicate(
488 'jsonrpc_call', RoutePredicate)
496 'jsonrpc_call', RoutePredicate)
489
497
490 config.add_route(
498 config.add_route(
491 'apiv2', plugin_settings.get('url', DEFAULT_URL), jsonrpc_call=True)
499 'apiv2', plugin_settings.get('url', DEFAULT_URL), jsonrpc_call=True)
492
500
493 config.scan(plugin_module, ignore='rhodecode.api.tests')
501 config.scan(plugin_module, ignore='rhodecode.api.tests')
494 # register some exception handling view
502 # register some exception handling view
495 config.add_view(exception_view, context=JSONRPCBaseError)
503 config.add_view(exception_view, context=JSONRPCBaseError)
496 config.add_view_predicate('jsonrpc_method_not_found', NotFoundPredicate)
504 config.add_view_predicate('jsonrpc_method_not_found', NotFoundPredicate)
497 config.add_notfound_view(exception_view, jsonrpc_method_not_found=True)
505 config.add_notfound_view(exception_view, jsonrpc_method_not_found=True)
@@ -1,31 +1,39 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2016 RhodeCode GmbH
3 # Copyright (C) 2011-2016 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21
21
22 class JSONRPCBaseError(Exception):
22 class JSONRPCBaseError(Exception):
23 pass
23 pass
24
24
25
25
26 class JSONRPCError(JSONRPCBaseError):
26 class JSONRPCError(JSONRPCBaseError):
27 pass
27 pass
28
28
29
29
30 class JSONRPCValidationError(JSONRPCBaseError):
31
32 def __init__(self, *args, **kwargs):
33 self.colander_exception = kwargs.pop('colander_exc')
34 super(JSONRPCValidationError, self).__init__(*args, **kwargs)
35
36
30 class JSONRPCForbidden(JSONRPCBaseError):
37 class JSONRPCForbidden(JSONRPCBaseError):
31 pass
38 pass
39
@@ -1,76 +1,102 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2016 RhodeCode GmbH
3 # Copyright (C) 2010-2016 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 import mock
21 import mock
22 import pytest
22 import pytest
23
23
24 from rhodecode.model.db import Gist
24 from rhodecode.model.db import Gist
25 from rhodecode.model.gist import GistModel
25 from rhodecode.model.gist import GistModel
26 from rhodecode.api.tests.utils import (
26 from rhodecode.api.tests.utils import (
27 build_data, api_call, assert_error, assert_ok, crash)
27 build_data, api_call, assert_error, assert_ok, crash)
28 from rhodecode.tests.fixture import Fixture
28 from rhodecode.tests.fixture import Fixture
29
29
30
30
31 @pytest.mark.usefixtures("testuser_api", "app")
31 @pytest.mark.usefixtures("testuser_api", "app")
32 class TestApiCreateGist(object):
32 class TestApiCreateGist(object):
33 @pytest.mark.parametrize("lifetime, gist_type, gist_acl_level", [
33 @pytest.mark.parametrize("lifetime, gist_type, gist_acl_level", [
34 (10, Gist.GIST_PUBLIC, Gist.ACL_LEVEL_PUBLIC),
34 (10, Gist.GIST_PUBLIC, Gist.ACL_LEVEL_PUBLIC),
35 (20, Gist.GIST_PUBLIC, Gist.ACL_LEVEL_PRIVATE),
35 (20, Gist.GIST_PUBLIC, Gist.ACL_LEVEL_PRIVATE),
36 (40, Gist.GIST_PRIVATE, Gist.ACL_LEVEL_PUBLIC),
36 (40, Gist.GIST_PRIVATE, Gist.ACL_LEVEL_PUBLIC),
37 (80, Gist.GIST_PRIVATE, Gist.ACL_LEVEL_PRIVATE),
37 (80, Gist.GIST_PRIVATE, Gist.ACL_LEVEL_PRIVATE),
38 ])
38 ])
39 def test_api_create_gist(self, lifetime, gist_type, gist_acl_level):
39 def test_api_create_gist(self, lifetime, gist_type, gist_acl_level):
40 id_, params = build_data(
40 id_, params = build_data(
41 self.apikey_regular, 'create_gist',
41 self.apikey_regular, 'create_gist',
42 lifetime=lifetime,
42 lifetime=lifetime,
43 description='foobar-gist',
43 description='foobar-gist',
44 gist_type=gist_type,
44 gist_type=gist_type,
45 acl_level=gist_acl_level,
45 acl_level=gist_acl_level,
46 files={'foobar': {'content': 'foo'}})
46 files={'foobar_ąć': {'content': 'foo'}})
47 response = api_call(self.app, params)
47 response = api_call(self.app, params)
48 response_json = response.json
48 response_json = response.json
49 gist = response_json['result']['gist']
49 gist = response_json['result']['gist']
50 expected = {
50 expected = {
51 'gist': {
51 'gist': {
52 'access_id': gist['access_id'],
52 'access_id': gist['access_id'],
53 'created_on': gist['created_on'],
53 'created_on': gist['created_on'],
54 'modified_at': gist['modified_at'],
54 'modified_at': gist['modified_at'],
55 'description': 'foobar-gist',
55 'description': 'foobar-gist',
56 'expires': gist['expires'],
56 'expires': gist['expires'],
57 'gist_id': gist['gist_id'],
57 'gist_id': gist['gist_id'],
58 'type': gist_type,
58 'type': gist_type,
59 'url': gist['url'],
59 'url': gist['url'],
60 # content is empty since we don't show it here
60 # content is empty since we don't show it here
61 'content': None,
61 'content': None,
62 'acl_level': gist_acl_level,
62 'acl_level': gist_acl_level,
63 },
63 },
64 'msg': 'created new gist'
64 'msg': 'created new gist'
65 }
65 }
66 try:
66 try:
67 assert_ok(id_, expected, given=response.body)
67 assert_ok(id_, expected, given=response.body)
68 finally:
68 finally:
69 Fixture().destroy_gists()
69 Fixture().destroy_gists()
70
70
71 @pytest.mark.parametrize("expected, lifetime, gist_type, gist_acl_level, files", [
72 ({'gist_type': '"ups" is not one of private, public'},
73 10, 'ups', Gist.ACL_LEVEL_PUBLIC, {'f': {'content': 'f'}}),
74
75 ({'lifetime': '-120 is less than minimum value -1'},
76 -120, Gist.GIST_PUBLIC, Gist.ACL_LEVEL_PUBLIC, {'f': {'content': 'f'}}),
77
78 ({'0.content': 'Required'},
79 10, Gist.GIST_PUBLIC, Gist.ACL_LEVEL_PUBLIC, {'f': {'x': 'f'}}),
80 ])
81 def test_api_try_create_gist(
82 self, expected, lifetime, gist_type, gist_acl_level, files):
83 id_, params = build_data(
84 self.apikey_regular, 'create_gist',
85 lifetime=lifetime,
86 description='foobar-gist',
87 gist_type=gist_type,
88 acl_level=gist_acl_level,
89 files=files)
90 response = api_call(self.app, params)
91
92 try:
93 assert_error(id_, expected, given=response.body)
94 finally:
95 Fixture().destroy_gists()
96
71 @mock.patch.object(GistModel, 'create', crash)
97 @mock.patch.object(GistModel, 'create', crash)
72 def test_api_create_gist_exception_occurred(self):
98 def test_api_create_gist_exception_occurred(self):
73 id_, params = build_data(self.apikey_regular, 'create_gist', files={})
99 id_, params = build_data(self.apikey_regular, 'create_gist', files={})
74 response = api_call(self.app, params)
100 response = api_call(self.app, params)
75 expected = 'failed to create gist'
101 expected = 'failed to create gist'
76 assert_error(id_, expected, given=response.body)
102 assert_error(id_, expected, given=response.body)
@@ -1,79 +1,79 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2016 RhodeCode GmbH
3 # Copyright (C) 2010-2016 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21
21
22 import pytest
22 import pytest
23
23
24 from rhodecode.api.views import depracated_api
24 from rhodecode.api.views import deprecated_api
25 from rhodecode.lib.ext_json import json
25 from rhodecode.lib.ext_json import json
26 from rhodecode.api.tests.utils import (
26 from rhodecode.api.tests.utils import (
27 build_data, api_call)
27 build_data, api_call)
28
28
29
29
30 @pytest.mark.usefixtures("testuser_api", "app")
30 @pytest.mark.usefixtures("testuser_api", "app")
31 class TestCommitComment(object):
31 class TestCommitComment(object):
32 def test_deprecated_message_in_docstring(self):
32 def test_deprecated_message_in_docstring(self):
33 docstring = depracated_api.changeset_comment.__doc__
33 docstring = deprecated_api.changeset_comment.__doc__
34 assert '.. deprecated:: 3.4.0' in docstring
34 assert '.. deprecated:: 3.4.0' in docstring
35 assert 'Please use method `comment_commit` instead.' in docstring
35 assert 'Please use method `comment_commit` instead.' in docstring
36
36
37 def test_deprecated_message_in_retvalue(self):
37 def test_deprecated_message_in_retvalue(self):
38
38
39 id_, params = build_data(
39 id_, params = build_data(
40 self.apikey, 'show_ip')
40 self.apikey, 'show_ip')
41 response = api_call(self.app, params)
41 response = api_call(self.app, params)
42
42
43 expected = {
43 expected = {
44 'id': id_,
44 'id': id_,
45 'error': None,
45 'error': None,
46 'result': json.loads(response.body)['result'],
46 'result': json.loads(response.body)['result'],
47 'DEPRECATION_WARNING':
47 'DEPRECATION_WARNING':
48 'DEPRECATED METHOD Please use method `get_ip` instead.'
48 'DEPRECATED METHOD Please use method `get_ip` instead.'
49 }
49 }
50 assert expected == json.loads(response.body)
50 assert expected == json.loads(response.body)
51
51
52 # def test_calls_comment_commit(self, backend, no_notifications):
52 # def test_calls_comment_commit(self, backend, no_notifications):
53 # data = {
53 # data = {
54 # 'repoid': backend.repo_name,
54 # 'repoid': backend.repo_name,
55 # 'status': ChangesetStatus.STATUS_APPROVED,
55 # 'status': ChangesetStatus.STATUS_APPROVED,
56 # 'message': 'Approved',
56 # 'message': 'Approved',
57 # 'revision': 'tip'
57 # 'revision': 'tip'
58 # }
58 # }
59 # with patch.object(repo_api, 'changeset_commit') as comment_mock:
59 # with patch.object(repo_api, 'changeset_commit') as comment_mock:
60 # id_, params = build_data(self.apikey, 'comment_commit', **data)
60 # id_, params = build_data(self.apikey, 'comment_commit', **data)
61 # api_call(self.app, params)
61 # api_call(self.app, params)
62 #
62 #
63 # _, call_args = comment_mock.call_args
63 # _, call_args = comment_mock.call_args
64 # data['commit_id'] = data.pop('revision')
64 # data['commit_id'] = data.pop('revision')
65 # for key in data:
65 # for key in data:
66 # assert call_args[key] == data[key]
66 # assert call_args[key] == data[key]
67
67
68 # def test_warning_log_contains_deprecation_message(self):
68 # def test_warning_log_contains_deprecation_message(self):
69 # api = self.SampleApi()
69 # api = self.SampleApi()
70 # with patch.object(utils, 'log') as log_mock:
70 # with patch.object(utils, 'log') as log_mock:
71 # api.api_method()
71 # api.api_method()
72 #
72 #
73 # assert log_mock.warning.call_count == 1
73 # assert log_mock.warning.call_count == 1
74 # call_args = log_mock.warning.call_args[0]
74 # call_args = log_mock.warning.call_args[0]
75 # assert (
75 # assert (
76 # call_args[0] ==
76 # call_args[0] ==
77 # 'DEPRECATED API CALL on function %s, please use `%s` instead')
77 # 'DEPRECATED API CALL on function %s, please use `%s` instead')
78 # assert call_args[1].__name__ == 'api_method'
78 # assert call_args[1].__name__ == 'api_method'
79 # assert call_args[2] == 'new_method' No newline at end of file
79 # assert call_args[2] == 'new_method'
@@ -1,119 +1,142 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2016 RhodeCode GmbH
3 # Copyright (C) 2010-2016 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21
21
22 import pytest
22 import pytest
23
23
24 from rhodecode.model.meta import Session
24 from rhodecode.model.meta import Session
25 from rhodecode.model.repo import RepoModel
25 from rhodecode.model.repo import RepoModel
26 from rhodecode.api.tests.utils import (
26 from rhodecode.api.tests.utils import (
27 build_data, api_call, assert_error, assert_ok)
27 build_data, api_call, assert_error, assert_ok)
28
28
29
29
30 @pytest.mark.usefixtures("testuser_api", "app")
30 @pytest.mark.usefixtures("testuser_api", "app")
31 class TestGetRepoNodes(object):
31 class TestGetRepoNodes(object):
32 @pytest.mark.parametrize("name, ret_type", [
32 @pytest.mark.parametrize("name, ret_type", [
33 ('all', 'all'),
33 ('all', 'all'),
34 ('dirs', 'dirs'),
34 ('dirs', 'dirs'),
35 ('files', 'files'),
35 ('files', 'files'),
36 ])
36 ])
37 def test_api_get_repo_nodes(self, name, ret_type, backend):
37 def test_api_get_repo_nodes(self, name, ret_type, backend):
38 commit_id = 'tip'
38 commit_id = 'tip'
39 path = '/'
39 path = '/'
40 id_, params = build_data(
40 id_, params = build_data(
41 self.apikey, 'get_repo_nodes',
41 self.apikey, 'get_repo_nodes',
42 repoid=backend.repo_name, revision=commit_id,
42 repoid=backend.repo_name, revision=commit_id,
43 root_path=path,
43 root_path=path,
44 ret_type=ret_type)
44 ret_type=ret_type)
45 response = api_call(self.app, params)
45 response = api_call(self.app, params)
46
46
47 # we don't the actual return types here since it's tested somewhere
47 # we don't the actual return types here since it's tested somewhere
48 # else
48 # else
49 expected = response.json['result']
49 expected = response.json['result']
50 assert_ok(id_, expected, given=response.body)
50 assert_ok(id_, expected, given=response.body)
51
51
52 def test_api_get_repo_nodes_bad_commits(self, backend):
52 def test_api_get_repo_nodes_bad_commits(self, backend):
53 commit_id = 'i-dont-exist'
53 commit_id = 'i-dont-exist'
54 path = '/'
54 path = '/'
55 id_, params = build_data(
55 id_, params = build_data(
56 self.apikey, 'get_repo_nodes',
56 self.apikey, 'get_repo_nodes',
57 repoid=backend.repo_name, revision=commit_id,
57 repoid=backend.repo_name, revision=commit_id,
58 root_path=path, )
58 root_path=path, )
59 response = api_call(self.app, params)
59 response = api_call(self.app, params)
60
60
61 expected = 'failed to get repo: `%s` nodes' % (backend.repo_name,)
61 expected = 'failed to get repo: `%s` nodes' % (backend.repo_name,)
62 assert_error(id_, expected, given=response.body)
62 assert_error(id_, expected, given=response.body)
63
63
64 def test_api_get_repo_nodes_bad_path(self, backend):
64 def test_api_get_repo_nodes_bad_path(self, backend):
65 commit_id = 'tip'
65 commit_id = 'tip'
66 path = '/idontexits'
66 path = '/idontexits'
67 id_, params = build_data(
67 id_, params = build_data(
68 self.apikey, 'get_repo_nodes',
68 self.apikey, 'get_repo_nodes',
69 repoid=backend.repo_name, revision=commit_id,
69 repoid=backend.repo_name, revision=commit_id,
70 root_path=path, )
70 root_path=path, )
71 response = api_call(self.app, params)
71 response = api_call(self.app, params)
72
72
73 expected = 'failed to get repo: `%s` nodes' % (backend.repo_name,)
73 expected = 'failed to get repo: `%s` nodes' % (backend.repo_name,)
74 assert_error(id_, expected, given=response.body)
74 assert_error(id_, expected, given=response.body)
75
75
76 def test_api_get_repo_nodes_max_file_bytes(self, backend):
77 commit_id = 'tip'
78 path = '/'
79 max_file_bytes = 500
80
81 id_, params = build_data(
82 self.apikey, 'get_repo_nodes',
83 repoid=backend.repo_name, revision=commit_id, details='full',
84 root_path=path)
85 response = api_call(self.app, params)
86 assert any(file['content'] and len(file['content']) > max_file_bytes
87 for file in response.json['result'])
88
89 id_, params = build_data(
90 self.apikey, 'get_repo_nodes',
91 repoid=backend.repo_name, revision=commit_id,
92 root_path=path, details='full',
93 max_file_bytes=max_file_bytes)
94 response = api_call(self.app, params)
95 assert all(
96 file['content'] is None if file['size'] > max_file_bytes else True
97 for file in response.json['result'])
98
76 def test_api_get_repo_nodes_bad_ret_type(self, backend):
99 def test_api_get_repo_nodes_bad_ret_type(self, backend):
77 commit_id = 'tip'
100 commit_id = 'tip'
78 path = '/'
101 path = '/'
79 ret_type = 'error'
102 ret_type = 'error'
80 id_, params = build_data(
103 id_, params = build_data(
81 self.apikey, 'get_repo_nodes',
104 self.apikey, 'get_repo_nodes',
82 repoid=backend.repo_name, revision=commit_id,
105 repoid=backend.repo_name, revision=commit_id,
83 root_path=path,
106 root_path=path,
84 ret_type=ret_type)
107 ret_type=ret_type)
85 response = api_call(self.app, params)
108 response = api_call(self.app, params)
86
109
87 expected = ('ret_type must be one of %s'
110 expected = ('ret_type must be one of %s'
88 % (','.join(['all', 'dirs', 'files'])))
111 % (','.join(['all', 'dirs', 'files'])))
89 assert_error(id_, expected, given=response.body)
112 assert_error(id_, expected, given=response.body)
90
113
91 @pytest.mark.parametrize("name, ret_type, grant_perm", [
114 @pytest.mark.parametrize("name, ret_type, grant_perm", [
92 ('all', 'all', 'repository.write'),
115 ('all', 'all', 'repository.write'),
93 ('dirs', 'dirs', 'repository.admin'),
116 ('dirs', 'dirs', 'repository.admin'),
94 ('files', 'files', 'repository.read'),
117 ('files', 'files', 'repository.read'),
95 ])
118 ])
96 def test_api_get_repo_nodes_by_regular_user(
119 def test_api_get_repo_nodes_by_regular_user(
97 self, name, ret_type, grant_perm, backend):
120 self, name, ret_type, grant_perm, backend):
98 RepoModel().grant_user_permission(repo=backend.repo_name,
121 RepoModel().grant_user_permission(repo=backend.repo_name,
99 user=self.TEST_USER_LOGIN,
122 user=self.TEST_USER_LOGIN,
100 perm=grant_perm)
123 perm=grant_perm)
101 Session().commit()
124 Session().commit()
102
125
103 commit_id = 'tip'
126 commit_id = 'tip'
104 path = '/'
127 path = '/'
105 id_, params = build_data(
128 id_, params = build_data(
106 self.apikey_regular, 'get_repo_nodes',
129 self.apikey_regular, 'get_repo_nodes',
107 repoid=backend.repo_name, revision=commit_id,
130 repoid=backend.repo_name, revision=commit_id,
108 root_path=path,
131 root_path=path,
109 ret_type=ret_type)
132 ret_type=ret_type)
110 response = api_call(self.app, params)
133 response = api_call(self.app, params)
111
134
112 # we don't the actual return types here since it's tested somewhere
135 # we don't the actual return types here since it's tested somewhere
113 # else
136 # else
114 expected = response.json['result']
137 expected = response.json['result']
115 try:
138 try:
116 assert_ok(id_, expected, given=response.body)
139 assert_ok(id_, expected, given=response.body)
117 finally:
140 finally:
118 RepoModel().revoke_user_permission(
141 RepoModel().revoke_user_permission(
119 backend.repo_name, self.TEST_USER_LOGIN)
142 backend.repo_name, self.TEST_USER_LOGIN)
@@ -1,158 +1,163 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2016 RhodeCode GmbH
3 # Copyright (C) 2010-2016 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 import mock
21 import mock
22 import pytest
22 import pytest
23
23
24 from rhodecode.model.repo import RepoModel
24 from rhodecode.model.repo import RepoModel
25 from rhodecode.tests import TEST_USER_ADMIN_LOGIN, TEST_USER_REGULAR_LOGIN
25 from rhodecode.tests import TEST_USER_ADMIN_LOGIN, TEST_USER_REGULAR_LOGIN
26 from rhodecode.api.tests.utils import (
26 from rhodecode.api.tests.utils import (
27 build_data, api_call, assert_error, assert_ok, crash, jsonify)
27 build_data, api_call, assert_error, assert_ok, crash, jsonify)
28 from rhodecode.tests.fixture import Fixture
28 from rhodecode.tests.fixture import Fixture
29
29
30
30
31 fixture = Fixture()
31 fixture = Fixture()
32
32
33 UPDATE_REPO_NAME = 'api_update_me'
33 UPDATE_REPO_NAME = 'api_update_me'
34
34
35 class SAME_AS_UPDATES(object): """ Constant used for tests below """
35 class SAME_AS_UPDATES(object): """ Constant used for tests below """
36
36
37 @pytest.mark.usefixtures("testuser_api", "app")
37 @pytest.mark.usefixtures("testuser_api", "app")
38 class TestApiUpdateRepo(object):
38 class TestApiUpdateRepo(object):
39
39
40 @pytest.mark.parametrize("updates, expected", [
40 @pytest.mark.parametrize("updates, expected", [
41 ({'owner': TEST_USER_REGULAR_LOGIN}, SAME_AS_UPDATES),
41 ({'owner': TEST_USER_REGULAR_LOGIN}, SAME_AS_UPDATES),
42 ({'description': 'new description'}, SAME_AS_UPDATES),
42 ({'description': 'new description'}, SAME_AS_UPDATES),
43 ({'clone_uri': 'http://foo.com/repo'}, SAME_AS_UPDATES),
43 ({'clone_uri': 'http://foo.com/repo'}, SAME_AS_UPDATES),
44 ({'clone_uri': None}, {'clone_uri': ''}),
44 ({'clone_uri': None}, {'clone_uri': ''}),
45 ({'clone_uri': ''}, {'clone_uri': ''}),
45 ({'clone_uri': ''}, {'clone_uri': ''}),
46 ({'landing_rev': 'branch:master'}, {'landing_rev': ['branch','master']}),
46 ({'landing_rev': 'branch:master'}, {'landing_rev': ['branch','master']}),
47 ({'enable_statistics': True}, SAME_AS_UPDATES),
47 ({'enable_statistics': True}, SAME_AS_UPDATES),
48 ({'enable_locking': True}, SAME_AS_UPDATES),
48 ({'enable_locking': True}, SAME_AS_UPDATES),
49 ({'enable_downloads': True}, SAME_AS_UPDATES),
49 ({'enable_downloads': True}, SAME_AS_UPDATES),
50 ({'name': 'new_repo_name'}, {'repo_name': 'new_repo_name'}),
50 ({'name': 'new_repo_name'}, {
51 ({'group': 'test_group_for_update'},
51 'repo_name': 'new_repo_name',
52 {'repo_name': 'test_group_for_update/%s' % UPDATE_REPO_NAME}),
52 'url': 'http://test.example.com:80/new_repo_name',
53 }),
54 ({'group': 'test_group_for_update'}, {
55 'repo_name': 'test_group_for_update/%s' % UPDATE_REPO_NAME,
56 'url': 'http://test.example.com:80/test_group_for_update/%s' % UPDATE_REPO_NAME
57 }),
53 ])
58 ])
54 def test_api_update_repo(self, updates, expected, backend):
59 def test_api_update_repo(self, updates, expected, backend):
55 repo_name = UPDATE_REPO_NAME
60 repo_name = UPDATE_REPO_NAME
56 repo = fixture.create_repo(repo_name, repo_type=backend.alias)
61 repo = fixture.create_repo(repo_name, repo_type=backend.alias)
57 if updates.get('group'):
62 if updates.get('group'):
58 fixture.create_repo_group(updates['group'])
63 fixture.create_repo_group(updates['group'])
59
64
60 expected_api_data = repo.get_api_data(include_secrets=True)
65 expected_api_data = repo.get_api_data(include_secrets=True)
61 if expected is SAME_AS_UPDATES:
66 if expected is SAME_AS_UPDATES:
62 expected_api_data.update(updates)
67 expected_api_data.update(updates)
63 else:
68 else:
64 expected_api_data.update(expected)
69 expected_api_data.update(expected)
65
70
66
71
67 id_, params = build_data(
72 id_, params = build_data(
68 self.apikey, 'update_repo', repoid=repo_name, **updates)
73 self.apikey, 'update_repo', repoid=repo_name, **updates)
69 response = api_call(self.app, params)
74 response = api_call(self.app, params)
70
75
71 if updates.get('name'):
76 if updates.get('name'):
72 repo_name = updates['name']
77 repo_name = updates['name']
73 if updates.get('group'):
78 if updates.get('group'):
74 repo_name = '/'.join([updates['group'], repo_name])
79 repo_name = '/'.join([updates['group'], repo_name])
75
80
76 try:
81 try:
77 expected = {
82 expected = {
78 'msg': 'updated repo ID:%s %s' % (repo.repo_id, repo_name),
83 'msg': 'updated repo ID:%s %s' % (repo.repo_id, repo_name),
79 'repository': jsonify(expected_api_data)
84 'repository': jsonify(expected_api_data)
80 }
85 }
81 assert_ok(id_, expected, given=response.body)
86 assert_ok(id_, expected, given=response.body)
82 finally:
87 finally:
83 fixture.destroy_repo(repo_name)
88 fixture.destroy_repo(repo_name)
84 if updates.get('group'):
89 if updates.get('group'):
85 fixture.destroy_repo_group(updates['group'])
90 fixture.destroy_repo_group(updates['group'])
86
91
87 def test_api_update_repo_fork_of_field(self, backend):
92 def test_api_update_repo_fork_of_field(self, backend):
88 master_repo = backend.create_repo()
93 master_repo = backend.create_repo()
89 repo = backend.create_repo()
94 repo = backend.create_repo()
90 updates = {
95 updates = {
91 'fork_of': master_repo.repo_name
96 'fork_of': master_repo.repo_name
92 }
97 }
93 expected_api_data = repo.get_api_data(include_secrets=True)
98 expected_api_data = repo.get_api_data(include_secrets=True)
94 expected_api_data.update(updates)
99 expected_api_data.update(updates)
95
100
96 id_, params = build_data(
101 id_, params = build_data(
97 self.apikey, 'update_repo', repoid=repo.repo_name, **updates)
102 self.apikey, 'update_repo', repoid=repo.repo_name, **updates)
98 response = api_call(self.app, params)
103 response = api_call(self.app, params)
99 expected = {
104 expected = {
100 'msg': 'updated repo ID:%s %s' % (repo.repo_id, repo.repo_name),
105 'msg': 'updated repo ID:%s %s' % (repo.repo_id, repo.repo_name),
101 'repository': jsonify(expected_api_data)
106 'repository': jsonify(expected_api_data)
102 }
107 }
103 assert_ok(id_, expected, given=response.body)
108 assert_ok(id_, expected, given=response.body)
104 result = response.json['result']['repository']
109 result = response.json['result']['repository']
105 assert result['fork_of'] == master_repo.repo_name
110 assert result['fork_of'] == master_repo.repo_name
106
111
107 def test_api_update_repo_fork_of_not_found(self, backend):
112 def test_api_update_repo_fork_of_not_found(self, backend):
108 master_repo_name = 'fake-parent-repo'
113 master_repo_name = 'fake-parent-repo'
109 repo = backend.create_repo()
114 repo = backend.create_repo()
110 updates = {
115 updates = {
111 'fork_of': master_repo_name
116 'fork_of': master_repo_name
112 }
117 }
113 id_, params = build_data(
118 id_, params = build_data(
114 self.apikey, 'update_repo', repoid=repo.repo_name, **updates)
119 self.apikey, 'update_repo', repoid=repo.repo_name, **updates)
115 response = api_call(self.app, params)
120 response = api_call(self.app, params)
116 expected = 'repository `{}` does not exist'.format(master_repo_name)
121 expected = 'repository `{}` does not exist'.format(master_repo_name)
117 assert_error(id_, expected, given=response.body)
122 assert_error(id_, expected, given=response.body)
118
123
119 def test_api_update_repo_with_repo_group_not_existing(self):
124 def test_api_update_repo_with_repo_group_not_existing(self):
120 repo_name = 'admin_owned'
125 repo_name = 'admin_owned'
121 fixture.create_repo(repo_name)
126 fixture.create_repo(repo_name)
122 updates = {'group': 'test_group_for_update'}
127 updates = {'group': 'test_group_for_update'}
123 id_, params = build_data(
128 id_, params = build_data(
124 self.apikey, 'update_repo', repoid=repo_name, **updates)
129 self.apikey, 'update_repo', repoid=repo_name, **updates)
125 response = api_call(self.app, params)
130 response = api_call(self.app, params)
126 try:
131 try:
127 expected = 'repository group `%s` does not exist' % (
132 expected = 'repository group `%s` does not exist' % (
128 updates['group'],)
133 updates['group'],)
129 assert_error(id_, expected, given=response.body)
134 assert_error(id_, expected, given=response.body)
130 finally:
135 finally:
131 fixture.destroy_repo(repo_name)
136 fixture.destroy_repo(repo_name)
132
137
133 def test_api_update_repo_regular_user_not_allowed(self):
138 def test_api_update_repo_regular_user_not_allowed(self):
134 repo_name = 'admin_owned'
139 repo_name = 'admin_owned'
135 fixture.create_repo(repo_name)
140 fixture.create_repo(repo_name)
136 updates = {'active': False}
141 updates = {'active': False}
137 id_, params = build_data(
142 id_, params = build_data(
138 self.apikey_regular, 'update_repo', repoid=repo_name, **updates)
143 self.apikey_regular, 'update_repo', repoid=repo_name, **updates)
139 response = api_call(self.app, params)
144 response = api_call(self.app, params)
140 try:
145 try:
141 expected = 'repository `%s` does not exist' % (repo_name,)
146 expected = 'repository `%s` does not exist' % (repo_name,)
142 assert_error(id_, expected, given=response.body)
147 assert_error(id_, expected, given=response.body)
143 finally:
148 finally:
144 fixture.destroy_repo(repo_name)
149 fixture.destroy_repo(repo_name)
145
150
146 @mock.patch.object(RepoModel, 'update', crash)
151 @mock.patch.object(RepoModel, 'update', crash)
147 def test_api_update_repo_exception_occurred(self, backend):
152 def test_api_update_repo_exception_occurred(self, backend):
148 repo_name = UPDATE_REPO_NAME
153 repo_name = UPDATE_REPO_NAME
149 fixture.create_repo(repo_name, repo_type=backend.alias)
154 fixture.create_repo(repo_name, repo_type=backend.alias)
150 id_, params = build_data(
155 id_, params = build_data(
151 self.apikey, 'update_repo', repoid=repo_name,
156 self.apikey, 'update_repo', repoid=repo_name,
152 owner=TEST_USER_ADMIN_LOGIN,)
157 owner=TEST_USER_ADMIN_LOGIN,)
153 response = api_call(self.app, params)
158 response = api_call(self.app, params)
154 try:
159 try:
155 expected = 'failed to update repo `%s`' % (repo_name,)
160 expected = 'failed to update repo `%s`' % (repo_name,)
156 assert_error(id_, expected, given=response.body)
161 assert_error(id_, expected, given=response.body)
157 finally:
162 finally:
158 fixture.destroy_repo(repo_name)
163 fixture.destroy_repo(repo_name)
@@ -1,378 +1,376 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2014-2016 RhodeCode GmbH
3 # Copyright (C) 2014-2016 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 """
21 """
22 JSON RPC utils
22 JSON RPC utils
23 """
23 """
24
24
25 import collections
25 import collections
26 import logging
26 import logging
27
27
28 from rhodecode.api.exc import JSONRPCError
28 from rhodecode.api.exc import JSONRPCError
29 from rhodecode.lib.auth import HasPermissionAnyApi, HasRepoPermissionAnyApi
29 from rhodecode.lib.auth import HasPermissionAnyApi, HasRepoPermissionAnyApi
30 from rhodecode.lib.utils import safe_unicode
30 from rhodecode.lib.utils import safe_unicode
31 from rhodecode.controllers.utils import get_commit_from_ref_name
31 from rhodecode.controllers.utils import get_commit_from_ref_name
32 from rhodecode.lib.vcs.exceptions import RepositoryError
32 from rhodecode.lib.vcs.exceptions import RepositoryError
33
33
34 log = logging.getLogger(__name__)
34 log = logging.getLogger(__name__)
35
35
36
36
37
38
39 class OAttr(object):
37 class OAttr(object):
40 """
38 """
41 Special Option that defines other attribute, and can default to them
39 Special Option that defines other attribute, and can default to them
42
40
43 Example::
41 Example::
44
42
45 def test(apiuser, userid=Optional(OAttr('apiuser')):
43 def test(apiuser, userid=Optional(OAttr('apiuser')):
46 user = Optional.extract(userid, evaluate_locals=local())
44 user = Optional.extract(userid, evaluate_locals=local())
47 #if we pass in userid, we get it, else it will default to apiuser
45 #if we pass in userid, we get it, else it will default to apiuser
48 #attribute
46 #attribute
49 """
47 """
50
48
51 def __init__(self, attr_name):
49 def __init__(self, attr_name):
52 self.attr_name = attr_name
50 self.attr_name = attr_name
53
51
54 def __repr__(self):
52 def __repr__(self):
55 return '<OptionalAttr:%s>' % self.attr_name
53 return '<OptionalAttr:%s>' % self.attr_name
56
54
57 def __call__(self):
55 def __call__(self):
58 return self
56 return self
59
57
60
58
61 class Optional(object):
59 class Optional(object):
62 """
60 """
63 Defines an optional parameter::
61 Defines an optional parameter::
64
62
65 param = param.getval() if isinstance(param, Optional) else param
63 param = param.getval() if isinstance(param, Optional) else param
66 param = param() if isinstance(param, Optional) else param
64 param = param() if isinstance(param, Optional) else param
67
65
68 is equivalent of::
66 is equivalent of::
69
67
70 param = Optional.extract(param)
68 param = Optional.extract(param)
71
69
72 """
70 """
73
71
74 def __init__(self, type_):
72 def __init__(self, type_):
75 self.type_ = type_
73 self.type_ = type_
76
74
77 def __repr__(self):
75 def __repr__(self):
78 return '<Optional:%s>' % self.type_.__repr__()
76 return '<Optional:%s>' % self.type_.__repr__()
79
77
80 def __call__(self):
78 def __call__(self):
81 return self.getval()
79 return self.getval()
82
80
83 def getval(self, evaluate_locals=None):
81 def getval(self, evaluate_locals=None):
84 """
82 """
85 returns value from this Optional instance
83 returns value from this Optional instance
86 """
84 """
87 if isinstance(self.type_, OAttr):
85 if isinstance(self.type_, OAttr):
88 param_name = self.type_.attr_name
86 param_name = self.type_.attr_name
89 if evaluate_locals:
87 if evaluate_locals:
90 return evaluate_locals[param_name]
88 return evaluate_locals[param_name]
91 # use params name
89 # use params name
92 return param_name
90 return param_name
93 return self.type_
91 return self.type_
94
92
95 @classmethod
93 @classmethod
96 def extract(cls, val, evaluate_locals=None):
94 def extract(cls, val, evaluate_locals=None):
97 """
95 """
98 Extracts value from Optional() instance
96 Extracts value from Optional() instance
99
97
100 :param val:
98 :param val:
101 :return: original value if it's not Optional instance else
99 :return: original value if it's not Optional instance else
102 value of instance
100 value of instance
103 """
101 """
104 if isinstance(val, cls):
102 if isinstance(val, cls):
105 return val.getval(evaluate_locals)
103 return val.getval(evaluate_locals)
106 return val
104 return val
107
105
108
106
109 def parse_args(cli_args, key_prefix=''):
107 def parse_args(cli_args, key_prefix=''):
110 from rhodecode.lib.utils2 import (escape_split)
108 from rhodecode.lib.utils2 import (escape_split)
111 kwargs = collections.defaultdict(dict)
109 kwargs = collections.defaultdict(dict)
112 for el in escape_split(cli_args, ','):
110 for el in escape_split(cli_args, ','):
113 kv = escape_split(el, '=', 1)
111 kv = escape_split(el, '=', 1)
114 if len(kv) == 2:
112 if len(kv) == 2:
115 k, v = kv
113 k, v = kv
116 kwargs[key_prefix + k] = v
114 kwargs[key_prefix + k] = v
117 return kwargs
115 return kwargs
118
116
119
117
120 def get_origin(obj):
118 def get_origin(obj):
121 """
119 """
122 Get origin of permission from object.
120 Get origin of permission from object.
123
121
124 :param obj:
122 :param obj:
125 """
123 """
126 origin = 'permission'
124 origin = 'permission'
127
125
128 if getattr(obj, 'owner_row', '') and getattr(obj, 'admin_row', ''):
126 if getattr(obj, 'owner_row', '') and getattr(obj, 'admin_row', ''):
129 # admin and owner case, maybe we should use dual string ?
127 # admin and owner case, maybe we should use dual string ?
130 origin = 'owner'
128 origin = 'owner'
131 elif getattr(obj, 'owner_row', ''):
129 elif getattr(obj, 'owner_row', ''):
132 origin = 'owner'
130 origin = 'owner'
133 elif getattr(obj, 'admin_row', ''):
131 elif getattr(obj, 'admin_row', ''):
134 origin = 'super-admin'
132 origin = 'super-admin'
135 return origin
133 return origin
136
134
137
135
138 def store_update(updates, attr, name):
136 def store_update(updates, attr, name):
139 """
137 """
140 Stores param in updates dict if it's not instance of Optional
138 Stores param in updates dict if it's not instance of Optional
141 allows easy updates of passed in params
139 allows easy updates of passed in params
142 """
140 """
143 if not isinstance(attr, Optional):
141 if not isinstance(attr, Optional):
144 updates[name] = attr
142 updates[name] = attr
145
143
146
144
147 def has_superadmin_permission(apiuser):
145 def has_superadmin_permission(apiuser):
148 """
146 """
149 Return True if apiuser is admin or return False
147 Return True if apiuser is admin or return False
150
148
151 :param apiuser:
149 :param apiuser:
152 """
150 """
153 if HasPermissionAnyApi('hg.admin')(user=apiuser):
151 if HasPermissionAnyApi('hg.admin')(user=apiuser):
154 return True
152 return True
155 return False
153 return False
156
154
157
155
158 def has_repo_permissions(apiuser, repoid, repo, perms):
156 def has_repo_permissions(apiuser, repoid, repo, perms):
159 """
157 """
160 Raise JsonRPCError if apiuser is not authorized or return True
158 Raise JsonRPCError if apiuser is not authorized or return True
161
159
162 :param apiuser:
160 :param apiuser:
163 :param repoid:
161 :param repoid:
164 :param repo:
162 :param repo:
165 :param perms:
163 :param perms:
166 """
164 """
167 if not HasRepoPermissionAnyApi(*perms)(
165 if not HasRepoPermissionAnyApi(*perms)(
168 user=apiuser, repo_name=repo.repo_name):
166 user=apiuser, repo_name=repo.repo_name):
169 raise JSONRPCError(
167 raise JSONRPCError(
170 'repository `%s` does not exist' % repoid)
168 'repository `%s` does not exist' % repoid)
171
169
172 return True
170 return True
173
171
174
172
175 def get_user_or_error(userid):
173 def get_user_or_error(userid):
176 """
174 """
177 Get user by id or name or return JsonRPCError if not found
175 Get user by id or name or return JsonRPCError if not found
178
176
179 :param userid:
177 :param userid:
180 """
178 """
181 from rhodecode.model.user import UserModel
179 from rhodecode.model.user import UserModel
182
180
183 user_model = UserModel()
181 user_model = UserModel()
184 try:
182 try:
185 user = user_model.get_user(int(userid))
183 user = user_model.get_user(int(userid))
186 except ValueError:
184 except ValueError:
187 user = user_model.get_by_username(userid)
185 user = user_model.get_by_username(userid)
188
186
189 if user is None:
187 if user is None:
190 raise JSONRPCError("user `%s` does not exist" % (userid,))
188 raise JSONRPCError("user `%s` does not exist" % (userid,))
191 return user
189 return user
192
190
193
191
194 def get_repo_or_error(repoid):
192 def get_repo_or_error(repoid):
195 """
193 """
196 Get repo by id or name or return JsonRPCError if not found
194 Get repo by id or name or return JsonRPCError if not found
197
195
198 :param repoid:
196 :param repoid:
199 """
197 """
200 from rhodecode.model.repo import RepoModel
198 from rhodecode.model.repo import RepoModel
201
199
202 repo = RepoModel().get_repo(repoid)
200 repo = RepoModel().get_repo(repoid)
203 if repo is None:
201 if repo is None:
204 raise JSONRPCError('repository `%s` does not exist' % (repoid,))
202 raise JSONRPCError('repository `%s` does not exist' % (repoid,))
205 return repo
203 return repo
206
204
207
205
208 def get_repo_group_or_error(repogroupid):
206 def get_repo_group_or_error(repogroupid):
209 """
207 """
210 Get repo group by id or name or return JsonRPCError if not found
208 Get repo group by id or name or return JsonRPCError if not found
211
209
212 :param repogroupid:
210 :param repogroupid:
213 """
211 """
214 from rhodecode.model.repo_group import RepoGroupModel
212 from rhodecode.model.repo_group import RepoGroupModel
215
213
216 repo_group = RepoGroupModel()._get_repo_group(repogroupid)
214 repo_group = RepoGroupModel()._get_repo_group(repogroupid)
217 if repo_group is None:
215 if repo_group is None:
218 raise JSONRPCError(
216 raise JSONRPCError(
219 'repository group `%s` does not exist' % (repogroupid,))
217 'repository group `%s` does not exist' % (repogroupid,))
220 return repo_group
218 return repo_group
221
219
222
220
223 def get_user_group_or_error(usergroupid):
221 def get_user_group_or_error(usergroupid):
224 """
222 """
225 Get user group by id or name or return JsonRPCError if not found
223 Get user group by id or name or return JsonRPCError if not found
226
224
227 :param usergroupid:
225 :param usergroupid:
228 """
226 """
229 from rhodecode.model.user_group import UserGroupModel
227 from rhodecode.model.user_group import UserGroupModel
230
228
231 user_group = UserGroupModel().get_group(usergroupid)
229 user_group = UserGroupModel().get_group(usergroupid)
232 if user_group is None:
230 if user_group is None:
233 raise JSONRPCError('user group `%s` does not exist' % (usergroupid,))
231 raise JSONRPCError('user group `%s` does not exist' % (usergroupid,))
234 return user_group
232 return user_group
235
233
236
234
237 def get_perm_or_error(permid, prefix=None):
235 def get_perm_or_error(permid, prefix=None):
238 """
236 """
239 Get permission by id or name or return JsonRPCError if not found
237 Get permission by id or name or return JsonRPCError if not found
240
238
241 :param permid:
239 :param permid:
242 """
240 """
243 from rhodecode.model.permission import PermissionModel
241 from rhodecode.model.permission import PermissionModel
244
242
245 perm = PermissionModel.cls.get_by_key(permid)
243 perm = PermissionModel.cls.get_by_key(permid)
246 if perm is None:
244 if perm is None:
247 raise JSONRPCError('permission `%s` does not exist' % (permid,))
245 raise JSONRPCError('permission `%s` does not exist' % (permid,))
248 if prefix:
246 if prefix:
249 if not perm.permission_name.startswith(prefix):
247 if not perm.permission_name.startswith(prefix):
250 raise JSONRPCError('permission `%s` is invalid, '
248 raise JSONRPCError('permission `%s` is invalid, '
251 'should start with %s' % (permid, prefix))
249 'should start with %s' % (permid, prefix))
252 return perm
250 return perm
253
251
254
252
255 def get_gist_or_error(gistid):
253 def get_gist_or_error(gistid):
256 """
254 """
257 Get gist by id or gist_access_id or return JsonRPCError if not found
255 Get gist by id or gist_access_id or return JsonRPCError if not found
258
256
259 :param gistid:
257 :param gistid:
260 """
258 """
261 from rhodecode.model.gist import GistModel
259 from rhodecode.model.gist import GistModel
262
260
263 gist = GistModel.cls.get_by_access_id(gistid)
261 gist = GistModel.cls.get_by_access_id(gistid)
264 if gist is None:
262 if gist is None:
265 raise JSONRPCError('gist `%s` does not exist' % (gistid,))
263 raise JSONRPCError('gist `%s` does not exist' % (gistid,))
266 return gist
264 return gist
267
265
268
266
269 def get_pull_request_or_error(pullrequestid):
267 def get_pull_request_or_error(pullrequestid):
270 """
268 """
271 Get pull request by id or return JsonRPCError if not found
269 Get pull request by id or return JsonRPCError if not found
272
270
273 :param pullrequestid:
271 :param pullrequestid:
274 """
272 """
275 from rhodecode.model.pull_request import PullRequestModel
273 from rhodecode.model.pull_request import PullRequestModel
276
274
277 try:
275 try:
278 pull_request = PullRequestModel().get(int(pullrequestid))
276 pull_request = PullRequestModel().get(int(pullrequestid))
279 except ValueError:
277 except ValueError:
280 raise JSONRPCError('pullrequestid must be an integer')
278 raise JSONRPCError('pullrequestid must be an integer')
281 if not pull_request:
279 if not pull_request:
282 raise JSONRPCError('pull request `%s` does not exist' % (
280 raise JSONRPCError('pull request `%s` does not exist' % (
283 pullrequestid,))
281 pullrequestid,))
284 return pull_request
282 return pull_request
285
283
286
284
287 def build_commit_data(commit, detail_level):
285 def build_commit_data(commit, detail_level):
288 parsed_diff = []
286 parsed_diff = []
289 if detail_level == 'extended':
287 if detail_level == 'extended':
290 for f in commit.added:
288 for f in commit.added:
291 parsed_diff.append(_get_commit_dict(filename=f.path, op='A'))
289 parsed_diff.append(_get_commit_dict(filename=f.path, op='A'))
292 for f in commit.changed:
290 for f in commit.changed:
293 parsed_diff.append(_get_commit_dict(filename=f.path, op='M'))
291 parsed_diff.append(_get_commit_dict(filename=f.path, op='M'))
294 for f in commit.removed:
292 for f in commit.removed:
295 parsed_diff.append(_get_commit_dict(filename=f.path, op='D'))
293 parsed_diff.append(_get_commit_dict(filename=f.path, op='D'))
296
294
297 elif detail_level == 'full':
295 elif detail_level == 'full':
298 from rhodecode.lib.diffs import DiffProcessor
296 from rhodecode.lib.diffs import DiffProcessor
299 diff_processor = DiffProcessor(commit.diff())
297 diff_processor = DiffProcessor(commit.diff())
300 for dp in diff_processor.prepare():
298 for dp in diff_processor.prepare():
301 del dp['stats']['ops']
299 del dp['stats']['ops']
302 _stats = dp['stats']
300 _stats = dp['stats']
303 parsed_diff.append(_get_commit_dict(
301 parsed_diff.append(_get_commit_dict(
304 filename=dp['filename'], op=dp['operation'],
302 filename=dp['filename'], op=dp['operation'],
305 new_revision=dp['new_revision'],
303 new_revision=dp['new_revision'],
306 old_revision=dp['old_revision'],
304 old_revision=dp['old_revision'],
307 raw_diff=dp['raw_diff'], stats=_stats))
305 raw_diff=dp['raw_diff'], stats=_stats))
308
306
309 return parsed_diff
307 return parsed_diff
310
308
311
309
312 def get_commit_or_error(ref, repo):
310 def get_commit_or_error(ref, repo):
313 try:
311 try:
314 ref_type, _, ref_hash = ref.split(':')
312 ref_type, _, ref_hash = ref.split(':')
315 except ValueError:
313 except ValueError:
316 raise JSONRPCError(
314 raise JSONRPCError(
317 'Ref `{ref}` given in a wrong format. Please check the API'
315 'Ref `{ref}` given in a wrong format. Please check the API'
318 ' documentation for more details'.format(ref=ref))
316 ' documentation for more details'.format(ref=ref))
319 try:
317 try:
320 # TODO: dan: refactor this to use repo.scm_instance().get_commit()
318 # TODO: dan: refactor this to use repo.scm_instance().get_commit()
321 # once get_commit supports ref_types
319 # once get_commit supports ref_types
322 return get_commit_from_ref_name(repo, ref_hash)
320 return get_commit_from_ref_name(repo, ref_hash)
323 except RepositoryError:
321 except RepositoryError:
324 raise JSONRPCError('Ref `{ref}` does not exist'.format(ref=ref))
322 raise JSONRPCError('Ref `{ref}` does not exist'.format(ref=ref))
325
323
326
324
327 def resolve_ref_or_error(ref, repo):
325 def resolve_ref_or_error(ref, repo):
328 def _parse_ref(type_, name, hash_=None):
326 def _parse_ref(type_, name, hash_=None):
329 return type_, name, hash_
327 return type_, name, hash_
330
328
331 try:
329 try:
332 ref_type, ref_name, ref_hash = _parse_ref(*ref.split(':'))
330 ref_type, ref_name, ref_hash = _parse_ref(*ref.split(':'))
333 except TypeError:
331 except TypeError:
334 raise JSONRPCError(
332 raise JSONRPCError(
335 'Ref `{ref}` given in a wrong format. Please check the API'
333 'Ref `{ref}` given in a wrong format. Please check the API'
336 ' documentation for more details'.format(ref=ref))
334 ' documentation for more details'.format(ref=ref))
337
335
338 try:
336 try:
339 ref_hash = ref_hash or _get_ref_hash(repo, ref_type, ref_name)
337 ref_hash = ref_hash or _get_ref_hash(repo, ref_type, ref_name)
340 except (KeyError, ValueError):
338 except (KeyError, ValueError):
341 raise JSONRPCError(
339 raise JSONRPCError(
342 'The specified {type} `{name}` does not exist'.format(
340 'The specified {type} `{name}` does not exist'.format(
343 type=ref_type, name=ref_name))
341 type=ref_type, name=ref_name))
344
342
345 return ':'.join([ref_type, ref_name, ref_hash])
343 return ':'.join([ref_type, ref_name, ref_hash])
346
344
347
345
348 def _get_commit_dict(
346 def _get_commit_dict(
349 filename, op, new_revision=None, old_revision=None,
347 filename, op, new_revision=None, old_revision=None,
350 raw_diff=None, stats=None):
348 raw_diff=None, stats=None):
351 if stats is None:
349 if stats is None:
352 stats = {
350 stats = {
353 "added": None,
351 "added": None,
354 "binary": None,
352 "binary": None,
355 "deleted": None
353 "deleted": None
356 }
354 }
357 return {
355 return {
358 "filename": safe_unicode(filename),
356 "filename": safe_unicode(filename),
359 "op": op,
357 "op": op,
360
358
361 # extra details
359 # extra details
362 "new_revision": new_revision,
360 "new_revision": new_revision,
363 "old_revision": old_revision,
361 "old_revision": old_revision,
364
362
365 "raw_diff": raw_diff,
363 "raw_diff": raw_diff,
366 "stats": stats
364 "stats": stats
367 }
365 }
368
366
369
367
370 # TODO: mikhail: Think about moving this function to some library
368 # TODO: mikhail: Think about moving this function to some library
371 def _get_ref_hash(repo, type_, name):
369 def _get_ref_hash(repo, type_, name):
372 vcs_repo = repo.scm_instance()
370 vcs_repo = repo.scm_instance()
373 if type_ == 'branch' and vcs_repo.alias in ('hg', 'git'):
371 if type_ == 'branch' and vcs_repo.alias in ('hg', 'git'):
374 return vcs_repo.branches[name]
372 return vcs_repo.branches[name]
375 elif type_ == 'bookmark' and vcs_repo.alias == 'hg':
373 elif type_ == 'bookmark' and vcs_repo.alias == 'hg':
376 return vcs_repo.bookmarks[name]
374 return vcs_repo.bookmarks[name]
377 else:
375 else:
378 raise ValueError()
376 raise ValueError()
1 NO CONTENT: file renamed from rhodecode/api/views/depracated_api.py to rhodecode/api/views/deprecated_api.py
NO CONTENT: file renamed from rhodecode/api/views/depracated_api.py to rhodecode/api/views/deprecated_api.py
@@ -1,226 +1,255 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2016 RhodeCode GmbH
3 # Copyright (C) 2011-2016 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21
21
22 import logging
22 import logging
23 import time
23 import time
24
24
25 from rhodecode.api import jsonrpc_method, JSONRPCError
25 from rhodecode.api import jsonrpc_method, JSONRPCError
26 from rhodecode.api.exc import JSONRPCValidationError
26 from rhodecode.api.utils import (
27 from rhodecode.api.utils import (
27 Optional, OAttr, get_gist_or_error, get_user_or_error,
28 Optional, OAttr, get_gist_or_error, get_user_or_error,
28 has_superadmin_permission)
29 has_superadmin_permission)
29 from rhodecode.model.db import Session, or_
30 from rhodecode.model.db import Session, or_
30 from rhodecode.model.gist import Gist, GistModel
31 from rhodecode.model.gist import Gist, GistModel
31
32
32 log = logging.getLogger(__name__)
33 log = logging.getLogger(__name__)
33
34
34
35
35 @jsonrpc_method()
36 @jsonrpc_method()
36 def get_gist(request, apiuser, gistid, content=Optional(False)):
37 def get_gist(request, apiuser, gistid, content=Optional(False)):
37 """
38 """
38 Get the specified gist, based on the gist ID.
39 Get the specified gist, based on the gist ID.
39
40
40 :param apiuser: This is filled automatically from the |authtoken|.
41 :param apiuser: This is filled automatically from the |authtoken|.
41 :type apiuser: AuthUser
42 :type apiuser: AuthUser
42 :param gistid: Set the id of the private or public gist
43 :param gistid: Set the id of the private or public gist
43 :type gistid: str
44 :type gistid: str
44 :param content: Return the gist content. Default is false.
45 :param content: Return the gist content. Default is false.
45 :type content: Optional(bool)
46 :type content: Optional(bool)
46 """
47 """
47
48
48 gist = get_gist_or_error(gistid)
49 gist = get_gist_or_error(gistid)
49 content = Optional.extract(content)
50 content = Optional.extract(content)
50 if not has_superadmin_permission(apiuser):
51 if not has_superadmin_permission(apiuser):
51 if gist.gist_owner != apiuser.user_id:
52 if gist.gist_owner != apiuser.user_id:
52 raise JSONRPCError('gist `%s` does not exist' % (gistid,))
53 raise JSONRPCError('gist `%s` does not exist' % (gistid,))
53 data = gist.get_api_data()
54 data = gist.get_api_data()
54 if content:
55 if content:
55 from rhodecode.model.gist import GistModel
56 from rhodecode.model.gist import GistModel
56 rev, gist_files = GistModel().get_gist_files(gistid)
57 rev, gist_files = GistModel().get_gist_files(gistid)
57 data['content'] = dict([(x.path, x.content) for x in gist_files])
58 data['content'] = dict([(x.path, x.content) for x in gist_files])
58 return data
59 return data
59
60
60
61
61 @jsonrpc_method()
62 @jsonrpc_method()
62 def get_gists(request, apiuser, userid=Optional(OAttr('apiuser'))):
63 def get_gists(request, apiuser, userid=Optional(OAttr('apiuser'))):
63 """
64 """
64 Get all gists for given user. If userid is empty returned gists
65 Get all gists for given user. If userid is empty returned gists
65 are for user who called the api
66 are for user who called the api
66
67
67 :param apiuser: This is filled automatically from the |authtoken|.
68 :param apiuser: This is filled automatically from the |authtoken|.
68 :type apiuser: AuthUser
69 :type apiuser: AuthUser
69 :param userid: user to get gists for
70 :param userid: user to get gists for
70 :type userid: Optional(str or int)
71 :type userid: Optional(str or int)
71 """
72 """
72
73
73 if not has_superadmin_permission(apiuser):
74 if not has_superadmin_permission(apiuser):
74 # make sure normal user does not pass someone else userid,
75 # make sure normal user does not pass someone else userid,
75 # he is not allowed to do that
76 # he is not allowed to do that
76 if not isinstance(userid, Optional) and userid != apiuser.user_id:
77 if not isinstance(userid, Optional) and userid != apiuser.user_id:
77 raise JSONRPCError(
78 raise JSONRPCError(
78 'userid is not the same as your user'
79 'userid is not the same as your user'
79 )
80 )
80
81
81 if isinstance(userid, Optional):
82 if isinstance(userid, Optional):
82 user_id = apiuser.user_id
83 user_id = apiuser.user_id
83 else:
84 else:
84 user_id = get_user_or_error(userid).user_id
85 user_id = get_user_or_error(userid).user_id
85
86
86 gists = []
87 gists = []
87 _gists = Gist().query() \
88 _gists = Gist().query() \
88 .filter(or_(
89 .filter(or_(
89 Gist.gist_expires == -1, Gist.gist_expires >= time.time())) \
90 Gist.gist_expires == -1, Gist.gist_expires >= time.time())) \
90 .filter(Gist.gist_owner == user_id) \
91 .filter(Gist.gist_owner == user_id) \
91 .order_by(Gist.created_on.desc())
92 .order_by(Gist.created_on.desc())
92 for gist in _gists:
93 for gist in _gists:
93 gists.append(gist.get_api_data())
94 gists.append(gist.get_api_data())
94 return gists
95 return gists
95
96
96
97
97 @jsonrpc_method()
98 @jsonrpc_method()
98 def create_gist(
99 def create_gist(
99 request, apiuser, files, owner=Optional(OAttr('apiuser')),
100 request, apiuser, files, gistid=Optional(None),
101 owner=Optional(OAttr('apiuser')),
100 gist_type=Optional(Gist.GIST_PUBLIC), lifetime=Optional(-1),
102 gist_type=Optional(Gist.GIST_PUBLIC), lifetime=Optional(-1),
101 acl_level=Optional(Gist.ACL_LEVEL_PUBLIC),
103 acl_level=Optional(Gist.ACL_LEVEL_PUBLIC),
102 description=Optional('')):
104 description=Optional('')):
103 """
105 """
104 Creates a new Gist.
106 Creates a new Gist.
105
107
106 :param apiuser: This is filled automatically from the |authtoken|.
108 :param apiuser: This is filled automatically from the |authtoken|.
107 :type apiuser: AuthUser
109 :type apiuser: AuthUser
108 :param files: files to be added to the gist. The data structure has
110 :param files: files to be added to the gist. The data structure has
109 to match the following example::
111 to match the following example::
110
112
111 {'filename': {'content':'...', 'lexer': null},
113 {'filename1': {'content':'...'}, 'filename2': {'content':'...'}}
112 'filename2': {'content':'...', 'lexer': null}}
113
114
114 :type files: dict
115 :type files: dict
116 :param gistid: Set a custom id for the gist
117 :type gistid: Optional(str)
115 :param owner: Set the gist owner, defaults to api method caller
118 :param owner: Set the gist owner, defaults to api method caller
116 :type owner: Optional(str or int)
119 :type owner: Optional(str or int)
117 :param gist_type: type of gist ``public`` or ``private``
120 :param gist_type: type of gist ``public`` or ``private``
118 :type gist_type: Optional(str)
121 :type gist_type: Optional(str)
119 :param lifetime: time in minutes of gist lifetime
122 :param lifetime: time in minutes of gist lifetime
120 :type lifetime: Optional(int)
123 :type lifetime: Optional(int)
121 :param acl_level: acl level for this gist, can be
124 :param acl_level: acl level for this gist, can be
122 ``acl_public`` or ``acl_private`` If the value is set to
125 ``acl_public`` or ``acl_private`` If the value is set to
123 ``acl_private`` only logged in users are able to access this gist.
126 ``acl_private`` only logged in users are able to access this gist.
124 If not set it defaults to ``acl_public``.
127 If not set it defaults to ``acl_public``.
125 :type acl_level: Optional(str)
128 :type acl_level: Optional(str)
126 :param description: gist description
129 :param description: gist description
127 :type description: Optional(str)
130 :type description: Optional(str)
128
131
129 Example output:
132 Example output:
130
133
131 .. code-block:: bash
134 .. code-block:: bash
132
135
133 id : <id_given_in_input>
136 id : <id_given_in_input>
134 result : {
137 result : {
135 "msg": "created new gist",
138 "msg": "created new gist",
136 "gist": {}
139 "gist": {}
137 }
140 }
138 error : null
141 error : null
139
142
140 Example error output:
143 Example error output:
141
144
142 .. code-block:: bash
145 .. code-block:: bash
143
146
144 id : <id_given_in_input>
147 id : <id_given_in_input>
145 result : null
148 result : null
146 error : {
149 error : {
147 "failed to create gist"
150 "failed to create gist"
148 }
151 }
149
152
150 """
153 """
154 from rhodecode.model import validation_schema
155 from rhodecode.model.validation_schema.schemas import gist_schema
156
157 if isinstance(owner, Optional):
158 owner = apiuser.user_id
159
160 owner = get_user_or_error(owner)
161
162 lifetime = Optional.extract(lifetime)
163 schema = gist_schema.GistSchema().bind(
164 # bind the given values if it's allowed, however the deferred
165 # validator will still validate it according to other rules
166 lifetime_options=[lifetime])
151
167
152 try:
168 try:
153 if isinstance(owner, Optional):
169 nodes = gist_schema.nodes_to_sequence(
154 owner = apiuser.user_id
170 files, colander_node=schema.get('nodes'))
171
172 schema_data = schema.deserialize(dict(
173 gistid=Optional.extract(gistid),
174 description=Optional.extract(description),
175 gist_type=Optional.extract(gist_type),
176 lifetime=lifetime,
177 gist_acl_level=Optional.extract(acl_level),
178 nodes=nodes
179 ))
155
180
156 owner = get_user_or_error(owner)
181 # convert to safer format with just KEYs so we sure no duplicates
157 description = Optional.extract(description)
182 schema_data['nodes'] = gist_schema.sequence_to_nodes(
158 gist_type = Optional.extract(gist_type)
183 schema_data['nodes'], colander_node=schema.get('nodes'))
159 lifetime = Optional.extract(lifetime)
184
160 acl_level = Optional.extract(acl_level)
185 except validation_schema.Invalid as err:
186 raise JSONRPCValidationError(colander_exc=err)
161
187
162 gist = GistModel().create(description=description,
188 try:
163 owner=owner,
189 gist = GistModel().create(
164 gist_mapping=files,
190 owner=owner,
165 gist_type=gist_type,
191 gist_id=schema_data['gistid'],
166 lifetime=lifetime,
192 description=schema_data['description'],
167 gist_acl_level=acl_level)
193 gist_mapping=schema_data['nodes'],
194 gist_type=schema_data['gist_type'],
195 lifetime=schema_data['lifetime'],
196 gist_acl_level=schema_data['gist_acl_level'])
168 Session().commit()
197 Session().commit()
169 return {
198 return {
170 'msg': 'created new gist',
199 'msg': 'created new gist',
171 'gist': gist.get_api_data()
200 'gist': gist.get_api_data()
172 }
201 }
173 except Exception:
202 except Exception:
174 log.exception('Error occurred during creation of gist')
203 log.exception('Error occurred during creation of gist')
175 raise JSONRPCError('failed to create gist')
204 raise JSONRPCError('failed to create gist')
176
205
177
206
178 @jsonrpc_method()
207 @jsonrpc_method()
179 def delete_gist(request, apiuser, gistid):
208 def delete_gist(request, apiuser, gistid):
180 """
209 """
181 Deletes existing gist
210 Deletes existing gist
182
211
183 :param apiuser: filled automatically from apikey
212 :param apiuser: filled automatically from apikey
184 :type apiuser: AuthUser
213 :type apiuser: AuthUser
185 :param gistid: id of gist to delete
214 :param gistid: id of gist to delete
186 :type gistid: str
215 :type gistid: str
187
216
188 Example output:
217 Example output:
189
218
190 .. code-block:: bash
219 .. code-block:: bash
191
220
192 id : <id_given_in_input>
221 id : <id_given_in_input>
193 result : {
222 result : {
194 "deleted gist ID: <gist_id>",
223 "deleted gist ID: <gist_id>",
195 "gist": null
224 "gist": null
196 }
225 }
197 error : null
226 error : null
198
227
199 Example error output:
228 Example error output:
200
229
201 .. code-block:: bash
230 .. code-block:: bash
202
231
203 id : <id_given_in_input>
232 id : <id_given_in_input>
204 result : null
233 result : null
205 error : {
234 error : {
206 "failed to delete gist ID:<gist_id>"
235 "failed to delete gist ID:<gist_id>"
207 }
236 }
208
237
209 """
238 """
210
239
211 gist = get_gist_or_error(gistid)
240 gist = get_gist_or_error(gistid)
212 if not has_superadmin_permission(apiuser):
241 if not has_superadmin_permission(apiuser):
213 if gist.gist_owner != apiuser.user_id:
242 if gist.gist_owner != apiuser.user_id:
214 raise JSONRPCError('gist `%s` does not exist' % (gistid,))
243 raise JSONRPCError('gist `%s` does not exist' % (gistid,))
215
244
216 try:
245 try:
217 GistModel().delete(gist)
246 GistModel().delete(gist)
218 Session().commit()
247 Session().commit()
219 return {
248 return {
220 'msg': 'deleted gist ID:%s' % (gist.gist_access_id,),
249 'msg': 'deleted gist ID:%s' % (gist.gist_access_id,),
221 'gist': None
250 'gist': None
222 }
251 }
223 except Exception:
252 except Exception:
224 log.exception('Error occured during gist deletion')
253 log.exception('Error occured during gist deletion')
225 raise JSONRPCError('failed to delete gist ID:%s'
254 raise JSONRPCError('failed to delete gist ID:%s'
226 % (gist.gist_access_id,)) No newline at end of file
255 % (gist.gist_access_id,))
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/interfaces.py to rhodecode/events/interfaces.py
NO CONTENT: file renamed from rhodecode/interfaces.py to rhodecode/events/interfaces.py
1 NO CONTENT: file renamed from rhodecode/events.py to rhodecode/events/user.py
NO CONTENT: file renamed from rhodecode/events.py to rhodecode/events/user.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file copied from rhodecode/templates/admin/my_account/my_account_emails.html to rhodecode/templates/admin/my_account/my_account_notifications.html
NO CONTENT: file copied from rhodecode/templates/admin/my_account/my_account_emails.html to rhodecode/templates/admin/my_account/my_account_notifications.html
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/tests/functional/test_changeset_comments.py to rhodecode/tests/functional/test_commit_comments.py
NO CONTENT: file renamed from rhodecode/tests/functional/test_changeset_comments.py to rhodecode/tests/functional/test_commit_comments.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/tests/models/test_validation_schema.py to rhodecode/tests/models/schemas/test_schema_types.py
NO CONTENT: file renamed from rhodecode/tests/models/test_validation_schema.py to rhodecode/tests/models/schemas/test_schema_types.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now