##// 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.
@@ -0,0 +1,79 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2016 RhodeCode GmbH
4 #
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
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
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/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import os
22
23 from pyramid.settings import asbool
24
25 from rhodecode.config.routing import ADMIN_PREFIX
26 from rhodecode.lib.ext_json import json
27
28
29 def url_gen(request):
30 urls = {
31 'connect': request.route_url('channelstream_connect'),
32 'subscribe': request.route_url('channelstream_subscribe')
33 }
34 return json.dumps(urls)
35
36
37 PLUGIN_DEFINITION = {
38 'name': 'channelstream',
39 'config': {
40 'javascript': [],
41 'css': [],
42 'template_hooks': {
43 'plugin_init_template': 'rhodecode:templates/channelstream/plugin_init.html'
44 },
45 'url_gen': url_gen,
46 'static': None,
47 'enabled': False,
48 'server': '',
49 'secret': ''
50 }
51 }
52
53
54 def includeme(config):
55 settings = config.registry.settings
56 PLUGIN_DEFINITION['config']['enabled'] = asbool(
57 settings.get('channelstream.enabled'))
58 PLUGIN_DEFINITION['config']['server'] = settings.get(
59 'channelstream.server', '')
60 PLUGIN_DEFINITION['config']['secret'] = settings.get(
61 'channelstream.secret', '')
62 PLUGIN_DEFINITION['config']['history.location'] = settings.get(
63 'channelstream.history.location', '')
64 config.register_rhodecode_plugin(
65 PLUGIN_DEFINITION['name'],
66 PLUGIN_DEFINITION['config']
67 )
68 # create plugin history location
69 history_dir = PLUGIN_DEFINITION['config']['history.location']
70 if history_dir and not os.path.exists(history_dir):
71 os.makedirs(history_dir, 0750)
72
73 config.add_route(
74 name='channelstream_connect',
75 pattern=ADMIN_PREFIX + '/channelstream/connect')
76 config.add_route(
77 name='channelstream_subscribe',
78 pattern=ADMIN_PREFIX + '/channelstream/subscribe')
79 config.scan('rhodecode.channelstream')
@@ -0,0 +1,177 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2016 RhodeCode GmbH
4 #
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
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
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/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 """
22 Channel Stream controller for rhodecode
23
24 :created_on: Oct 10, 2015
25 :author: marcinl
26 :copyright: (c) 2013-2015 RhodeCode GmbH.
27 :license: Commercial License, see LICENSE for more details.
28 """
29
30 import logging
31 import uuid
32
33 from pylons import tmpl_context as c
34 from pyramid.settings import asbool
35 from pyramid.view import view_config
36 from webob.exc import HTTPBadRequest, HTTPForbidden, HTTPBadGateway
37
38 from rhodecode.lib.channelstream import (
39 channelstream_request,
40 ChannelstreamConnectionException,
41 ChannelstreamPermissionException,
42 check_channel_permissions,
43 get_connection_validators,
44 get_user_data,
45 parse_channels_info,
46 update_history_from_logs,
47 STATE_PUBLIC_KEYS)
48 from rhodecode.lib.auth import NotAnonymous
49 from rhodecode.lib.utils2 import str2bool
50
51 log = logging.getLogger(__name__)
52
53
54 class ChannelstreamView(object):
55 def __init__(self, context, request):
56 self.context = context
57 self.request = request
58
59 # Some of the decorators rely on this attribute to be present
60 # on the class of the decorated method.
61 self._rhodecode_user = request.user
62 registry = request.registry
63 self.channelstream_config = registry.rhodecode_plugins['channelstream']
64 if not self.channelstream_config.get('enabled'):
65 log.exception('Channelstream plugin is disabled')
66 raise HTTPBadRequest()
67
68 @NotAnonymous()
69 @view_config(route_name='channelstream_connect', renderer='json')
70 def connect(self):
71 """ handle authorization of users trying to connect """
72 try:
73 json_body = self.request.json_body
74 except Exception:
75 log.exception('Failed to decode json from request')
76 raise HTTPBadRequest()
77 try:
78 channels = check_channel_permissions(
79 json_body.get('channels'),
80 get_connection_validators(self.request.registry))
81 except ChannelstreamPermissionException:
82 log.error('Incorrect permissions for requested channels')
83 raise HTTPForbidden()
84
85 user = c.rhodecode_user
86 if user.user_id:
87 user_data = get_user_data(user.user_id)
88 else:
89 user_data = {
90 'id': None,
91 'username': None,
92 'first_name': None,
93 'last_name': None,
94 'icon_link': None,
95 'display_name': None,
96 'display_link': None,
97 }
98 payload = {
99 'username': user.username,
100 'user_state': user_data,
101 'conn_id': str(uuid.uuid4()),
102 'channels': channels,
103 'channel_configs': {},
104 'state_public_keys': STATE_PUBLIC_KEYS,
105 'info': {
106 'exclude_channels': ['broadcast']
107 }
108 }
109 filtered_channels = [channel for channel in channels
110 if channel != 'broadcast']
111 for channel in filtered_channels:
112 payload['channel_configs'][channel] = {
113 'notify_presence': True,
114 'history_size': 100,
115 'store_history': True,
116 'broadcast_presence_with_user_lists': True
117 }
118 # connect user to server
119 try:
120 connect_result = channelstream_request(self.channelstream_config,
121 payload, '/connect')
122 except ChannelstreamConnectionException:
123 log.exception('Channelstream service is down')
124 return HTTPBadGateway()
125
126 connect_result['channels'] = channels
127 connect_result['channels_info'] = parse_channels_info(
128 connect_result['channels_info'],
129 include_channel_info=filtered_channels)
130 update_history_from_logs(self.channelstream_config,
131 filtered_channels, connect_result)
132 return connect_result
133
134 @NotAnonymous()
135 @view_config(route_name='channelstream_subscribe', renderer='json')
136 def subscribe(self):
137 """ can be used to subscribe specific connection to other channels """
138 try:
139 json_body = self.request.json_body
140 except Exception:
141 log.exception('Failed to decode json from request')
142 raise HTTPBadRequest()
143 try:
144 channels = check_channel_permissions(
145 json_body.get('channels'),
146 get_connection_validators(self.request.registry))
147 except ChannelstreamPermissionException:
148 log.error('Incorrect permissions for requested channels')
149 raise HTTPForbidden()
150 payload = {'conn_id': json_body.get('conn_id', ''),
151 'channels': channels,
152 'channel_configs': {},
153 'info': {
154 'exclude_channels': ['broadcast']}
155 }
156 filtered_channels = [chan for chan in channels if chan != 'broadcast']
157 for channel in filtered_channels:
158 payload['channel_configs'][channel] = {
159 'notify_presence': True,
160 'history_size': 100,
161 'store_history': True,
162 'broadcast_presence_with_user_lists': True
163 }
164 try:
165 connect_result = channelstream_request(
166 self.channelstream_config, payload, '/subscribe')
167 except ChannelstreamConnectionException:
168 log.exception('Channelstream service is down')
169 return HTTPBadGateway()
170 # include_channel_info will limit history only to new channel
171 # to not overwrite histories on other channels in client
172 connect_result['channels_info'] = parse_channels_info(
173 connect_result['channels_info'],
174 include_channel_info=filtered_channels)
175 update_history_from_logs(self.channelstream_config,
176 filtered_channels, connect_result)
177 return connect_result
@@ -0,0 +1,78 b''
1 # Copyright (C) 2016-2016 RhodeCode GmbH
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
5 # (only), as published by the Free Software Foundation.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU Affero General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 #
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
19 import logging
20 from pyramid.threadlocal import get_current_registry
21
22 log = logging.getLogger(__name__)
23
24
25 def trigger(event, registry=None):
26 """
27 Helper method to send an event. This wraps the pyramid logic to send an
28 event.
29 """
30 # For the first step we are using pyramids thread locals here. If the
31 # event mechanism works out as a good solution we should think about
32 # passing the registry as an argument to get rid of it.
33 registry = registry or get_current_registry()
34 registry.notify(event)
35 log.debug('event %s triggered', event)
36
37 # Until we can work around the problem that VCS operations do not have a
38 # pyramid context to work with, we send the events to integrations directly
39
40 # Later it will be possible to use regular pyramid subscribers ie:
41 # config.add_subscriber(integrations_event_handler, RhodecodeEvent)
42 from rhodecode.integrations import integrations_event_handler
43 if isinstance(event, RhodecodeEvent):
44 integrations_event_handler(event)
45
46
47 from rhodecode.events.base import RhodecodeEvent
48
49 from rhodecode.events.user import ( # noqa
50 UserPreCreate,
51 UserPreUpdate,
52 UserRegistered
53 )
54
55 from rhodecode.events.repo import ( # noqa
56 RepoEvent,
57 RepoPreCreateEvent, RepoCreateEvent,
58 RepoPreDeleteEvent, RepoDeleteEvent,
59 RepoPrePushEvent, RepoPushEvent,
60 RepoPrePullEvent, RepoPullEvent,
61 )
62
63 from rhodecode.events.repo_group import ( # noqa
64 RepoGroupEvent,
65 RepoGroupCreateEvent,
66 RepoGroupUpdateEvent,
67 RepoGroupDeleteEvent,
68 )
69
70 from rhodecode.events.pullrequest import ( # noqa
71 PullRequestEvent,
72 PullRequestCreateEvent,
73 PullRequestUpdateEvent,
74 PullRequestCommentEvent,
75 PullRequestReviewEvent,
76 PullRequestMergeEvent,
77 PullRequestCloseEvent,
78 )
@@ -0,0 +1,69 b''
1 # Copyright (C) 2016-2016 RhodeCode GmbH
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
5 # (only), as published by the Free Software Foundation.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU Affero General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 #
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
19 from datetime import datetime
20 from pyramid.threadlocal import get_current_request
21 from rhodecode.lib.utils2 import AttributeDict
22
23
24 # this is a user object to be used for events caused by the system (eg. shell)
25 SYSTEM_USER = AttributeDict(dict(
26 username='__SYSTEM__'
27 ))
28
29
30 class RhodecodeEvent(object):
31 """
32 Base event class for all Rhodecode events
33 """
34 name = "RhodeCodeEvent"
35
36 def __init__(self):
37 self.request = get_current_request()
38 self.utc_timestamp = datetime.utcnow()
39
40 @property
41 def actor(self):
42 if self.request:
43 return self.request.user.get_instance()
44 return SYSTEM_USER
45
46 @property
47 def actor_ip(self):
48 if self.request:
49 return self.request.user.ip_addr
50 return '<no ip available>'
51
52 @property
53 def server_url(self):
54 if self.request:
55 from rhodecode.lib import helpers as h
56 return h.url('home', qualified=True)
57 return '<no server_url available>'
58
59 def as_dict(self):
60 data = {
61 'name': self.name,
62 'utc_timestamp': self.utc_timestamp,
63 'actor_ip': self.actor_ip,
64 'actor': {
65 'username': self.actor.username
66 },
67 'server_url': self.server_url
68 }
69 return data
@@ -0,0 +1,131 b''
1 # Copyright (C) 2016-2016 RhodeCode GmbH
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
5 # (only), as published by the Free Software Foundation.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU Affero General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 #
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
19
20 from rhodecode.translation import lazy_ugettext
21 from rhodecode.events.repo import (
22 RepoEvent, _commits_as_dict, _issues_as_dict)
23
24
25 class PullRequestEvent(RepoEvent):
26 """
27 Base class for pull request events.
28
29 :param pullrequest: a :class:`PullRequest` instance
30 """
31
32 def __init__(self, pullrequest):
33 super(PullRequestEvent, self).__init__(pullrequest.target_repo)
34 self.pullrequest = pullrequest
35
36 def as_dict(self):
37 from rhodecode.model.pull_request import PullRequestModel
38 data = super(PullRequestEvent, self).as_dict()
39
40 commits = _commits_as_dict(
41 commit_ids=self.pullrequest.revisions,
42 repos=[self.pullrequest.source_repo]
43 )
44 issues = _issues_as_dict(commits)
45
46 data.update({
47 'pullrequest': {
48 'title': self.pullrequest.title,
49 'issues': issues,
50 'pull_request_id': self.pullrequest.pull_request_id,
51 'url': PullRequestModel().get_url(self.pullrequest),
52 'status': self.pullrequest.calculated_review_status(),
53 'commits': commits,
54 }
55 })
56 return data
57
58
59 class PullRequestCreateEvent(PullRequestEvent):
60 """
61 An instance of this class is emitted as an :term:`event` after a pull
62 request is created.
63 """
64 name = 'pullrequest-create'
65 display_name = lazy_ugettext('pullrequest created')
66
67
68 class PullRequestCloseEvent(PullRequestEvent):
69 """
70 An instance of this class is emitted as an :term:`event` after a pull
71 request is closed.
72 """
73 name = 'pullrequest-close'
74 display_name = lazy_ugettext('pullrequest closed')
75
76
77 class PullRequestUpdateEvent(PullRequestEvent):
78 """
79 An instance of this class is emitted as an :term:`event` after a pull
80 request's commits have been updated.
81 """
82 name = 'pullrequest-update'
83 display_name = lazy_ugettext('pullrequest commits updated')
84
85
86 class PullRequestReviewEvent(PullRequestEvent):
87 """
88 An instance of this class is emitted as an :term:`event` after a pull
89 request review has changed.
90 """
91 name = 'pullrequest-review'
92 display_name = lazy_ugettext('pullrequest review changed')
93
94
95 class PullRequestMergeEvent(PullRequestEvent):
96 """
97 An instance of this class is emitted as an :term:`event` after a pull
98 request is merged.
99 """
100 name = 'pullrequest-merge'
101 display_name = lazy_ugettext('pullrequest merged')
102
103
104 class PullRequestCommentEvent(PullRequestEvent):
105 """
106 An instance of this class is emitted as an :term:`event` after a pull
107 request comment is created.
108 """
109 name = 'pullrequest-comment'
110 display_name = lazy_ugettext('pullrequest commented')
111
112 def __init__(self, pullrequest, comment):
113 super(PullRequestCommentEvent, self).__init__(pullrequest)
114 self.comment = comment
115
116 def as_dict(self):
117 from rhodecode.model.comment import ChangesetCommentsModel
118 data = super(PullRequestCommentEvent, self).as_dict()
119
120 status = None
121 if self.comment.status_change:
122 status = self.comment.status_change[0].status
123
124 data.update({
125 'comment': {
126 'status': status,
127 'text': self.comment.text,
128 'url': ChangesetCommentsModel().get_url(self.comment)
129 }
130 })
131 return data
@@ -0,0 +1,257 b''
1 # Copyright (C) 2016-2016 RhodeCode GmbH
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
5 # (only), as published by the Free Software Foundation.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU Affero General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 #
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
19 import logging
20
21 from rhodecode.translation import lazy_ugettext
22 from rhodecode.model.db import User, Repository, Session
23 from rhodecode.events.base import RhodecodeEvent
24 from rhodecode.lib.vcs.exceptions import CommitDoesNotExistError
25
26 log = logging.getLogger(__name__)
27
28 def _commits_as_dict(commit_ids, repos):
29 """
30 Helper function to serialize commit_ids
31
32 :param commit_ids: commits to get
33 :param repos: list of repos to check
34 """
35 from rhodecode.lib.utils2 import extract_mentioned_users
36 from rhodecode.model.db import Repository
37 from rhodecode.lib import helpers as h
38 from rhodecode.lib.helpers import process_patterns
39 from rhodecode.lib.helpers import urlify_commit_message
40
41 if not repos:
42 raise Exception('no repo defined')
43
44 if not isinstance(repos, (tuple, list)):
45 repos = [repos]
46
47 if not commit_ids:
48 return []
49
50 needed_commits = set(commit_ids)
51
52 commits = []
53 reviewers = []
54 for repo in repos:
55 if not needed_commits:
56 return commits # return early if we have the commits we need
57
58 vcs_repo = repo.scm_instance(cache=False)
59 try:
60 for commit_id in list(needed_commits):
61 try:
62 cs = vcs_repo.get_changeset(commit_id)
63 except CommitDoesNotExistError:
64 continue # maybe its in next repo
65
66 cs_data = cs.__json__()
67 cs_data['mentions'] = extract_mentioned_users(cs_data['message'])
68 cs_data['reviewers'] = reviewers
69 cs_data['url'] = h.url('changeset_home',
70 repo_name=repo.repo_name,
71 revision=cs_data['raw_id'],
72 qualified=True
73 )
74 urlified_message, issues_data = process_patterns(
75 cs_data['message'], repo.repo_name)
76 cs_data['issues'] = issues_data
77 cs_data['message_html'] = urlify_commit_message(cs_data['message'],
78 repo.repo_name)
79 commits.append(cs_data)
80
81 needed_commits.discard(commit_id)
82
83 except Exception as e:
84 log.exception(e)
85 # we don't send any commits when crash happens, only full list matters
86 # we short circuit then.
87 return []
88
89 missing_commits = set(commit_ids) - set(c['raw_id'] for c in commits)
90 if missing_commits:
91 log.error('missing commits: %s' % ', '.join(missing_commits))
92
93 return commits
94
95
96 def _issues_as_dict(commits):
97 """ Helper function to serialize issues from commits """
98 issues = {}
99 for commit in commits:
100 for issue in commit['issues']:
101 issues[issue['id']] = issue
102 return issues
103
104 class RepoEvent(RhodecodeEvent):
105 """
106 Base class for events acting on a repository.
107
108 :param repo: a :class:`Repository` instance
109 """
110
111 def __init__(self, repo):
112 super(RepoEvent, self).__init__()
113 self.repo = repo
114
115 def as_dict(self):
116 from rhodecode.model.repo import RepoModel
117 data = super(RepoEvent, self).as_dict()
118 data.update({
119 'repo': {
120 'repo_id': self.repo.repo_id,
121 'repo_name': self.repo.repo_name,
122 'repo_type': self.repo.repo_type,
123 'url': RepoModel().get_url(self.repo)
124 }
125 })
126 return data
127
128
129 class RepoPreCreateEvent(RepoEvent):
130 """
131 An instance of this class is emitted as an :term:`event` before a repo is
132 created.
133 """
134 name = 'repo-pre-create'
135 display_name = lazy_ugettext('repository pre create')
136
137
138 class RepoCreateEvent(RepoEvent):
139 """
140 An instance of this class is emitted as an :term:`event` whenever a repo is
141 created.
142 """
143 name = 'repo-create'
144 display_name = lazy_ugettext('repository created')
145
146
147 class RepoPreDeleteEvent(RepoEvent):
148 """
149 An instance of this class is emitted as an :term:`event` whenever a repo is
150 created.
151 """
152 name = 'repo-pre-delete'
153 display_name = lazy_ugettext('repository pre delete')
154
155
156 class RepoDeleteEvent(RepoEvent):
157 """
158 An instance of this class is emitted as an :term:`event` whenever a repo is
159 created.
160 """
161 name = 'repo-delete'
162 display_name = lazy_ugettext('repository deleted')
163
164
165 class RepoVCSEvent(RepoEvent):
166 """
167 Base class for events triggered by the VCS
168 """
169 def __init__(self, repo_name, extras):
170 self.repo = Repository.get_by_repo_name(repo_name)
171 if not self.repo:
172 raise Exception('repo by this name %s does not exist' % repo_name)
173 self.extras = extras
174 super(RepoVCSEvent, self).__init__(self.repo)
175
176 @property
177 def actor(self):
178 if self.extras.get('username'):
179 return User.get_by_username(self.extras['username'])
180
181 @property
182 def actor_ip(self):
183 if self.extras.get('ip'):
184 return self.extras['ip']
185
186 @property
187 def server_url(self):
188 if self.extras.get('server_url'):
189 return self.extras['server_url']
190
191
192 class RepoPrePullEvent(RepoVCSEvent):
193 """
194 An instance of this class is emitted as an :term:`event` before commits
195 are pulled from a repo.
196 """
197 name = 'repo-pre-pull'
198 display_name = lazy_ugettext('repository pre pull')
199
200
201 class RepoPullEvent(RepoVCSEvent):
202 """
203 An instance of this class is emitted as an :term:`event` after commits
204 are pulled from a repo.
205 """
206 name = 'repo-pull'
207 display_name = lazy_ugettext('repository pull')
208
209
210 class RepoPrePushEvent(RepoVCSEvent):
211 """
212 An instance of this class is emitted as an :term:`event` before commits
213 are pushed to a repo.
214 """
215 name = 'repo-pre-push'
216 display_name = lazy_ugettext('repository pre push')
217
218
219 class RepoPushEvent(RepoVCSEvent):
220 """
221 An instance of this class is emitted as an :term:`event` after commits
222 are pushed to a repo.
223
224 :param extras: (optional) dict of data from proxied VCS actions
225 """
226 name = 'repo-push'
227 display_name = lazy_ugettext('repository push')
228
229 def __init__(self, repo_name, pushed_commit_ids, extras):
230 super(RepoPushEvent, self).__init__(repo_name, extras)
231 self.pushed_commit_ids = pushed_commit_ids
232
233 def as_dict(self):
234 data = super(RepoPushEvent, self).as_dict()
235 branch_url = repo_url = data['repo']['url']
236
237 commits = _commits_as_dict(
238 commit_ids=self.pushed_commit_ids, repos=[self.repo])
239 issues = _issues_as_dict(commits)
240
241 branches = set(
242 commit['branch'] for commit in commits if commit['branch'])
243 branches = [
244 {
245 'name': branch,
246 'url': '{}/changelog?branch={}'.format(
247 data['repo']['url'], branch)
248 }
249 for branch in branches
250 ]
251
252 data['push'] = {
253 'commits': commits,
254 'issues': issues,
255 'branches': branches,
256 }
257 return data
@@ -0,0 +1,80 b''
1 # Copyright (C) 2016-2016 RhodeCode GmbH
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
5 # (only), as published by the Free Software Foundation.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU Affero General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 #
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
19 import logging
20
21 from rhodecode.translation import lazy_ugettext
22 from rhodecode.events.base import RhodecodeEvent
23
24
25 log = logging.getLogger(__name__)
26
27
28 class RepoGroupEvent(RhodecodeEvent):
29 """
30 Base class for events acting on a repository group.
31
32 :param repo: a :class:`RepositoryGroup` instance
33 """
34
35 def __init__(self, repo_group):
36 super(RepoGroupEvent, self).__init__()
37 self.repo_group = repo_group
38
39 def as_dict(self):
40 data = super(RepoGroupEvent, self).as_dict()
41 data.update({
42 'repo_group': {
43 'group_id': self.repo_group.group_id,
44 'group_name': self.repo_group.group_name,
45 'group_parent_id': self.repo_group.group_parent_id,
46 'group_description': self.repo_group.group_description,
47 'user_id': self.repo_group.user_id,
48 'created_by': self.repo_group.user.username,
49 'created_on': self.repo_group.created_on,
50 'enable_locking': self.repo_group.enable_locking,
51 }
52 })
53 return data
54
55
56 class RepoGroupCreateEvent(RepoGroupEvent):
57 """
58 An instance of this class is emitted as an :term:`event` whenever a
59 repository group is created.
60 """
61 name = 'repo-group-create'
62 display_name = lazy_ugettext('repository group created')
63
64
65 class RepoGroupDeleteEvent(RepoGroupEvent):
66 """
67 An instance of this class is emitted as an :term:`event` whenever a
68 repository group is deleted.
69 """
70 name = 'repo-group-delete'
71 display_name = lazy_ugettext('repository group deleted')
72
73
74 class RepoGroupUpdateEvent(RepoGroupEvent):
75 """
76 An instance of this class is emitted as an :term:`event` whenever a
77 repository group is updated.
78 """
79 name = 'repo-group-update'
80 display_name = lazy_ugettext('repository group update')
@@ -0,0 +1,62 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2012-2016 RhodeCode GmbH
4 #
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
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
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/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import logging
22
23 from rhodecode.integrations.registry import IntegrationTypeRegistry
24 from rhodecode.integrations.types import webhook, slack, hipchat, email
25
26 log = logging.getLogger(__name__)
27
28
29 # TODO: dan: This is currently global until we figure out what to do about
30 # VCS's not having a pyramid context - move it to pyramid app configuration
31 # includeme level later to allow per instance integration setup
32 integration_type_registry = IntegrationTypeRegistry()
33
34 integration_type_registry.register_integration_type(
35 webhook.WebhookIntegrationType)
36 integration_type_registry.register_integration_type(
37 slack.SlackIntegrationType)
38 integration_type_registry.register_integration_type(
39 hipchat.HipchatIntegrationType)
40 integration_type_registry.register_integration_type(
41 email.EmailIntegrationType)
42
43
44 def integrations_event_handler(event):
45 """
46 Takes an event and passes it to all enabled integrations
47 """
48 from rhodecode.model.integration import IntegrationModel
49
50 integration_model = IntegrationModel()
51 integrations = integration_model.get_for_event(event)
52 for integration in integrations:
53 try:
54 integration_model.send_event(integration, event)
55 except Exception:
56 log.exception(
57 'failure occured when sending event %s to integration %s' % (
58 event, integration))
59
60
61 def includeme(config):
62 config.include('rhodecode.integrations.routes')
@@ -0,0 +1,37 b''
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2012-2016 RhodeCode GmbH
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
6 # (only), as published by the Free Software Foundation.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU Affero General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 #
16 # This program is dual-licensed. If you wish to learn more about the
17 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # and proprietary license terms, please see https://rhodecode.com/licenses/
19
20 import logging
21
22 log = logging.getLogger(__name__)
23
24
25 class IntegrationTypeRegistry(dict):
26 """
27 Registry Class to hold IntegrationTypes
28 """
29 def register_integration_type(self, IntegrationType):
30 key = IntegrationType.key
31 if key in self:
32 log.warning(
33 'Overriding existing integration type %s (%s) with %s' % (
34 self[key], key, IntegrationType))
35
36 self[key] = IntegrationType
37
@@ -0,0 +1,133 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2012-2016 RhodeCode GmbH
4 #
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
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
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/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import logging
22
23 from rhodecode.model.db import Repository, Integration
24 from rhodecode.config.routing import (
25 ADMIN_PREFIX, add_route_requirements, URL_NAME_REQUIREMENTS)
26 from rhodecode.integrations import integration_type_registry
27
28 log = logging.getLogger(__name__)
29
30
31 def includeme(config):
32 config.add_route('global_integrations_home',
33 ADMIN_PREFIX + '/integrations')
34 config.add_route('global_integrations_list',
35 ADMIN_PREFIX + '/integrations/{integration}')
36 for route_name in ['global_integrations_home', 'global_integrations_list']:
37 config.add_view('rhodecode.integrations.views.GlobalIntegrationsView',
38 attr='index',
39 renderer='rhodecode:templates/admin/integrations/list.html',
40 request_method='GET',
41 route_name=route_name)
42
43 config.add_route('global_integrations_create',
44 ADMIN_PREFIX + '/integrations/{integration}/new',
45 custom_predicates=(valid_integration,))
46 config.add_route('global_integrations_edit',
47 ADMIN_PREFIX + '/integrations/{integration}/{integration_id}',
48 custom_predicates=(valid_integration,))
49 for route_name in ['global_integrations_create', 'global_integrations_edit']:
50 config.add_view('rhodecode.integrations.views.GlobalIntegrationsView',
51 attr='settings_get',
52 renderer='rhodecode:templates/admin/integrations/edit.html',
53 request_method='GET',
54 route_name=route_name)
55 config.add_view('rhodecode.integrations.views.GlobalIntegrationsView',
56 attr='settings_post',
57 renderer='rhodecode:templates/admin/integrations/edit.html',
58 request_method='POST',
59 route_name=route_name)
60
61 config.add_route('repo_integrations_home',
62 add_route_requirements(
63 '{repo_name}/settings/integrations',
64 URL_NAME_REQUIREMENTS
65 ),
66 custom_predicates=(valid_repo,))
67 config.add_route('repo_integrations_list',
68 add_route_requirements(
69 '{repo_name}/settings/integrations/{integration}',
70 URL_NAME_REQUIREMENTS
71 ),
72 custom_predicates=(valid_repo, valid_integration))
73 for route_name in ['repo_integrations_home', 'repo_integrations_list']:
74 config.add_view('rhodecode.integrations.views.RepoIntegrationsView',
75 attr='index',
76 request_method='GET',
77 route_name=route_name)
78
79 config.add_route('repo_integrations_create',
80 add_route_requirements(
81 '{repo_name}/settings/integrations/{integration}/new',
82 URL_NAME_REQUIREMENTS
83 ),
84 custom_predicates=(valid_repo, valid_integration))
85 config.add_route('repo_integrations_edit',
86 add_route_requirements(
87 '{repo_name}/settings/integrations/{integration}/{integration_id}',
88 URL_NAME_REQUIREMENTS
89 ),
90 custom_predicates=(valid_repo, valid_integration))
91 for route_name in ['repo_integrations_edit', 'repo_integrations_create']:
92 config.add_view('rhodecode.integrations.views.RepoIntegrationsView',
93 attr='settings_get',
94 renderer='rhodecode:templates/admin/integrations/edit.html',
95 request_method='GET',
96 route_name=route_name)
97 config.add_view('rhodecode.integrations.views.RepoIntegrationsView',
98 attr='settings_post',
99 renderer='rhodecode:templates/admin/integrations/edit.html',
100 request_method='POST',
101 route_name=route_name)
102
103
104 def valid_repo(info, request):
105 repo = Repository.get_by_repo_name(info['match']['repo_name'])
106 if repo:
107 return True
108
109
110 def valid_integration(info, request):
111 integration_type = info['match']['integration']
112 integration_id = info['match'].get('integration_id')
113 repo_name = info['match'].get('repo_name')
114
115 if integration_type not in integration_type_registry:
116 return False
117
118 repo = None
119 if repo_name:
120 repo = Repository.get_by_repo_name(info['match']['repo_name'])
121 if not repo:
122 return False
123
124 if integration_id:
125 integration = Integration.get(integration_id)
126 if not integration:
127 return False
128 if integration.integration_type != integration_type:
129 return False
130 if repo and repo.repo_id != integration.repo_id:
131 return False
132
133 return True
@@ -0,0 +1,45 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2012-2016 RhodeCode GmbH
4 #
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
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
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/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import colander
22
23 from rhodecode.translation import lazy_ugettext
24
25
26 class IntegrationSettingsSchemaBase(colander.MappingSchema):
27 """
28 This base schema is intended for use in integrations.
29 It adds a few default settings (e.g., "enabled"), so that integration
30 authors don't have to maintain a bunch of boilerplate.
31 """
32 enabled = colander.SchemaNode(
33 colander.Bool(),
34 default=True,
35 description=lazy_ugettext('Enable or disable this integration.'),
36 missing=False,
37 title=lazy_ugettext('Enabled'),
38 )
39
40 name = colander.SchemaNode(
41 colander.String(),
42 description=lazy_ugettext('Short name for this integration.'),
43 missing=colander.required,
44 title=lazy_ugettext('Integration name'),
45 )
@@ -0,0 +1,19 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2012-2016 RhodeCode GmbH
4 #
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
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
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/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
@@ -0,0 +1,42 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2012-2016 RhodeCode GmbH
4 #
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
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
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/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 from rhodecode.integrations.schema import IntegrationSettingsSchemaBase
22
23
24 class IntegrationTypeBase(object):
25 """ Base class for IntegrationType plugins """
26
27 def __init__(self, settings):
28 """
29 :param settings: dict of settings to be used for the integration
30 """
31 self.settings = settings
32
33
34 def settings_schema(self):
35 """
36 A colander schema of settings for the integration type
37
38 Subclasses can return their own schema but should always
39 inherit from IntegrationSettingsSchemaBase
40 """
41 return IntegrationSettingsSchemaBase()
42
@@ -0,0 +1,222 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2012-2016 RhodeCode GmbH
4 #
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
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
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/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 from __future__ import unicode_literals
22 import deform
23 import logging
24 import colander
25
26 from mako.template import Template
27
28 from rhodecode import events
29 from rhodecode.translation import _, lazy_ugettext
30 from rhodecode.lib.celerylib import run_task
31 from rhodecode.lib.celerylib import tasks
32 from rhodecode.integrations.types.base import IntegrationTypeBase
33 from rhodecode.integrations.schema import IntegrationSettingsSchemaBase
34
35
36 log = logging.getLogger(__name__)
37
38 repo_push_template_plaintext = Template('''
39 Commits:
40
41 % for commit in data['push']['commits']:
42 ${commit['url']} by ${commit['author']} at ${commit['date']}
43 ${commit['message']}
44 ----
45
46 % endfor
47 ''')
48
49 ## TODO (marcink): think about putting this into a file, or use base.mako email template
50
51 repo_push_template_html = Template('''
52 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
53 <html xmlns="http://www.w3.org/1999/xhtml">
54 <head>
55 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
56 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
57 <title>${subject}</title>
58 <style type="text/css">
59 /* Based on The MailChimp Reset INLINE: Yes. */
60 #outlook a {padding:0;} /* Force Outlook to provide a "view in browser" menu link. */
61 body{width:100% !important; -webkit-text-size-adjust:100%; -ms-text-size-adjust:100%; margin:0; padding:0;}
62 /* Prevent Webkit and Windows Mobile platforms from changing default font sizes.*/
63 .ExternalClass {width:100%;} /* Force Hotmail to display emails at full width */
64 .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div {line-height: 100%;}
65 /* Forces Hotmail to display normal line spacing. More on that: http://www.emailonacid.com/forum/viewthread/43/ */
66 #backgroundTable {margin:0; padding:0; line-height: 100% !important;}
67 /* End reset */
68
69 /* defaults for images*/
70 img {outline:none; text-decoration:none; -ms-interpolation-mode: bicubic;}
71 a img {border:none;}
72 .image_fix {display:block;}
73
74 body {line-height:1.2em;}
75 p {margin: 0 0 20px;}
76 h1, h2, h3, h4, h5, h6 {color:#323232!important;}
77 a {color:#427cc9;text-decoration:none;outline:none;cursor:pointer;}
78 a:focus {outline:none;}
79 a:hover {color: #305b91;}
80 h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {color:#427cc9!important;text-decoration:none!important;}
81 h1 a:active, h2 a:active, h3 a:active, h4 a:active, h5 a:active, h6 a:active {color: #305b91!important;}
82 h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited {color: #305b91!important;}
83 table {font-size:13px;border-collapse:collapse;mso-table-lspace:0pt;mso-table-rspace:0pt;}
84 table td {padding:.65em 1em .65em 0;border-collapse:collapse;vertical-align:top;text-align:left;}
85 input {display:inline;border-radius:2px;border-style:solid;border: 1px solid #dbd9da;padding:.5em;}
86 input:focus {outline: 1px solid #979797}
87 @media only screen and (-webkit-min-device-pixel-ratio: 2) {
88 /* Put your iPhone 4g styles in here */
89 }
90
91 /* Android targeting */
92 @media only screen and (-webkit-device-pixel-ratio:.75){
93 /* Put CSS for low density (ldpi) Android layouts in here */
94 }
95 @media only screen and (-webkit-device-pixel-ratio:1){
96 /* Put CSS for medium density (mdpi) Android layouts in here */
97 }
98 @media only screen and (-webkit-device-pixel-ratio:1.5){
99 /* Put CSS for high density (hdpi) Android layouts in here */
100 }
101 /* end Android targeting */
102
103 </style>
104
105 <!-- Targeting Windows Mobile -->
106 <!--[if IEMobile 7]>
107 <style type="text/css">
108
109 </style>
110 <![endif]-->
111
112 <!--[if gte mso 9]>
113 <style>
114 /* Target Outlook 2007 and 2010 */
115 </style>
116 <![endif]-->
117 </head>
118 <body>
119 <!-- Wrapper/Container Table: Use a wrapper table to control the width and the background color consistently of your email. Use this approach instead of setting attributes on the body tag. -->
120 <table cellpadding="0" cellspacing="0" border="0" id="backgroundTable" align="left" style="margin:1%;width:97%;padding:0;font-family:sans-serif;font-weight:100;border:1px solid #dbd9da">
121 <tr>
122 <td valign="top" style="padding:0;">
123 <table cellpadding="0" cellspacing="0" border="0" align="left" width="100%">
124 <tr><td style="width:100%;padding:7px;background-color:#202020" valign="top">
125 <a style="color:#eeeeee;text-decoration:none;" href="${instance_url}">
126 ${'RhodeCode'}
127 </a>
128 </td></tr>
129 <tr>
130 <td style="padding:15px;" valign="top">
131 % for commit in data['push']['commits']:
132 <a href="${commit['url']}">${commit['short_id']}</a> by ${commit['author']} at ${commit['date']} <br/>
133 ${commit['message_html']} <br/>
134 <br/>
135 % endfor
136 </td>
137 </tr>
138 </table>
139 </td>
140 </tr>
141 </table>
142 <!-- End of wrapper table -->
143 <p><a style="margin-top:15px;margin-left:1%;font-family:sans-serif;font-weight:100;font-size:11px;color:#666666;text-decoration:none;" href="${instance_url}">
144 ${'This is a notification from RhodeCode. %(instance_url)s' % {'instance_url': instance_url}}
145 </a></p>
146 </body>
147 </html>
148 ''')
149
150
151 class EmailSettingsSchema(IntegrationSettingsSchemaBase):
152 @colander.instantiate(validator=colander.Length(min=1))
153 class recipients(colander.SequenceSchema):
154 title = lazy_ugettext('Recipients')
155 description = lazy_ugettext('Email addresses to send push events to')
156 widget = deform.widget.SequenceWidget(min_len=1)
157
158 recipient = colander.SchemaNode(
159 colander.String(),
160 title=lazy_ugettext('Email address'),
161 description=lazy_ugettext('Email address'),
162 default='',
163 validator=colander.Email(),
164 widget=deform.widget.TextInputWidget(
165 placeholder='user@domain.com',
166 ),
167 )
168
169
170 class EmailIntegrationType(IntegrationTypeBase):
171 key = 'email'
172 display_name = lazy_ugettext('Email')
173 SettingsSchema = EmailSettingsSchema
174
175 def settings_schema(self):
176 schema = EmailSettingsSchema()
177 return schema
178
179 def send_event(self, event):
180 data = event.as_dict()
181 log.debug('got event: %r', event)
182
183 if isinstance(event, events.RepoPushEvent):
184 repo_push_handler(data, self.settings)
185 else:
186 log.debug('ignoring event: %r', event)
187
188
189 def repo_push_handler(data, settings):
190 commit_num = len(data['push']['commits'])
191 server_url = data['server_url']
192
193 if commit_num == 0:
194 subject = '[{repo_name}] {author} pushed {commit_num} commit on branches: {branches}'.format(
195 author=data['actor']['username'],
196 repo_name=data['repo']['repo_name'],
197 commit_num=commit_num,
198 branches=', '.join(
199 branch['name'] for branch in data['push']['branches'])
200 )
201 else:
202 subject = '[{repo_name}] {author} pushed {commit_num} commits on branches: {branches}'.format(
203 author=data['actor']['username'],
204 repo_name=data['repo']['repo_name'],
205 commit_num=commit_num,
206 branches=', '.join(
207 branch['name'] for branch in data['push']['branches']))
208
209 email_body_plaintext = repo_push_template_plaintext.render(
210 data=data,
211 subject=subject,
212 instance_url=server_url)
213
214 email_body_html = repo_push_template_html.render(
215 data=data,
216 subject=subject,
217 instance_url=server_url)
218
219 for email_address in settings['recipients']:
220 run_task(
221 tasks.send_email, email_address, subject,
222 email_body_plaintext, email_body_html)
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
1 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
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,5 +1,5 b''
1 1 [bumpversion]
2 current_version = 4.2.1
2 current_version = 4.3.0
3 3 message = release: Bump version {current_version} to {new_version}
4 4
5 5 [bumpversion:file:rhodecode/VERSION]
@@ -25,6 +25,7 b' syntax: regexp'
25 25 ^build/
26 26 ^coverage\.xml$
27 27 ^data$
28 ^\.eggs/
28 29 ^configs/data$
29 30 ^dev.ini$
30 31 ^acceptance_tests/dev.*\.ini$
@@ -4,26 +4,21 b' done = false'
4 4 [task:bump_version]
5 5 done = true
6 6
7 [task:rc_tools_pinned]
8 done = true
9
10 7 [task:fixes_on_stable]
11 done = true
12 8
13 9 [task:pip2nix_generated]
14 done = true
15 10
16 11 [task:changelog_updated]
17 done = true
18 12
19 13 [task:generate_api_docs]
20 done = true
14
15 [task:updated_translation]
21 16
22 17 [release]
23 state = prepared
24 version = 4.2.1
18 state = in_progress
19 version = 4.3.0
25 20
26 [task:updated_translation]
21 [task:rc_tools_pinned]
27 22
28 23 [task:generate_js_routes]
29 24
@@ -20,6 +20,7 b' module.exports = function(grunt) {'
20 20 '<%= dirs.js.src %>/moment.js',
21 21 '<%= dirs.js.src %>/appenlight-client-0.4.1.min.js',
22 22 '<%= dirs.js.src %>/i18n_utils.js',
23 '<%= dirs.js.src %>/deform.js',
23 24
24 25 // Plugins
25 26 '<%= dirs.js.src %>/plugins/jquery.pjax.js',
@@ -31,6 +32,7 b' module.exports = function(grunt) {'
31 32 '<%= dirs.js.src %>/plugins/jquery.mark.js',
32 33 '<%= dirs.js.src %>/plugins/jquery.timeago.js',
33 34 '<%= dirs.js.src %>/plugins/jquery.timeago-extension.js',
35 '<%= dirs.js.src %>/plugins/toastr.js',
34 36
35 37 // Select2
36 38 '<%= dirs.js.src %>/select2/select2.js',
@@ -56,12 +58,14 b' module.exports = function(grunt) {'
56 58 '<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js',
57 59 '<%= dirs.js.src %>/rhodecode/utils/ie.js',
58 60 '<%= dirs.js.src %>/rhodecode/utils/os.js',
61 '<%= dirs.js.src %>/rhodecode/utils/topics.js',
59 62
60 63 // Rhodecode widgets
61 64 '<%= dirs.js.src %>/rhodecode/widgets/multiselect.js',
62 65
63 66 // Rhodecode components
64 67 '<%= dirs.js.src %>/rhodecode/init.js',
68 '<%= dirs.js.src %>/rhodecode/connection_controller.js',
65 69 '<%= dirs.js.src %>/rhodecode/codemirror.js',
66 70 '<%= dirs.js.src %>/rhodecode/comments.js',
67 71 '<%= dirs.js.src %>/rhodecode/constants.js',
@@ -76,6 +80,7 b' module.exports = function(grunt) {'
76 80 '<%= dirs.js.src %>/rhodecode/select2_widgets.js',
77 81 '<%= dirs.js.src %>/rhodecode/tooltips.js',
78 82 '<%= dirs.js.src %>/rhodecode/users.js',
83 '<%= dirs.js.src %>/rhodecode/utils/notifications.js',
79 84 '<%= dirs.js.src %>/rhodecode/appenlight.js',
80 85
81 86 // Rhodecode main module
@@ -10,8 +10,10 b' permission notice:'
10 10 file:
11 11 Copyright (c) 2008-2011 - msgpack-python
12 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 17 you may not use this file except in compliance with the License.
16 18 You may obtain a copy of the License at
17 19
@@ -2,20 +2,20 b''
2 2 include test.ini
3 3 include MANIFEST.in
4 4 include README.rst
5 include CHANGES.rst
6 include LICENSE.txt
7
5 8 include rhodecode/VERSION
6 9
7 10 # docs
8 11 recursive-include docs *
9 12
10 # init.d
11 recursive-include init.d *
13 # all config files
14 recursive-include configs *
12 15
13 16 # translations
14 17 recursive-include rhodecode/i18n *
15 18
16 # bin stuff
17 recursive-include rhodecode/bin *
18
19 19 # hook templates
20 20 recursive-include rhodecode/config/hook_templates *
21 21
@@ -20,7 +20,7 b' ci-docs: docs;'
20 20 clean: test-clean
21 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 25 test-clean:
26 26 rm -rf coverage.xml htmlcov junit.xml pylint.log result
@@ -1,23 +1,36 b''
1 ################################################################################
1
2
2 3 ################################################################################
3 # RhodeCode Enterprise - configuration file #
4 # Built-in functions and variables #
4 ## RHODECODE ENTERPRISE CONFIGURATION ##
5 5 # The %(here)s variable will be replaced with the parent directory of this file#
6 # #
7 6 ################################################################################
8 7
9 8 [DEFAULT]
10 9 debug = true
10
11 11 ################################################################################
12 ## EMAIL CONFIGURATION ##
12 13 ## Uncomment and replace with the email address which should receive ##
13 14 ## any error reports after an application crash ##
14 15 ## Additionally these settings will be used by the RhodeCode mailing system ##
15 16 ################################################################################
16 #email_to = admin@localhost
17 #error_email_from = paste_error@localhost
17
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 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 32 #error_message =
20 #email_prefix = [RhodeCode]
33
21 34
22 35 #smtp_server = mail.server.com
23 36 #smtp_username =
@@ -37,6 +50,7 b' port = 5000'
37 50 ## WAITRESS WSGI SERVER ##
38 51 ## Recommended for Development ##
39 52 ##################################
53
40 54 use = egg:waitress#main
41 55 ## number of worker threads
42 56 threads = 5
@@ -51,6 +65,7 b' asyncore_use_poll = true'
51 65 ## GUNICORN WSGI SERVER ##
52 66 ##########################
53 67 ## run with gunicorn --log-config <inifile.ini> --paste <inifile.ini>
68
54 69 #use = egg:gunicorn#main
55 70 ## Sets the number of process workers. You must set `instance_id = *`
56 71 ## when this option is set to more than one worker, recommended
@@ -77,15 +92,18 b' asyncore_use_poll = true'
77 92
78 93
79 94 ## prefix middleware for RhodeCode, disables force_https flag.
95 ## recommended when using proxy setup.
80 96 ## allows to set RhodeCode under a prefix in server.
81 97 ## eg https://server.com/<prefix>. Enable `filter-with =` option below as well.
82 #[filter:proxy-prefix]
83 #use = egg:PasteDeploy#prefix
84 #prefix = /<your-prefix>
98 ## optionally set prefix like: `prefix = /<your-prefix>`
99 [filter:proxy-prefix]
100 use = egg:PasteDeploy#prefix
101 prefix = /
85 102
86 103 [app:main]
87 104 use = egg:rhodecode-enterprise-ce
88 ## enable proxy prefix middleware, defined below
105
106 ## enable proxy prefix middleware, defined above
89 107 #filter-with = proxy-prefix
90 108
91 109 # During development the we want to have the debug toolbar enabled
@@ -123,12 +141,10 b' rhodecode.api.url = /_admin/api'
123 141 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
124 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
129 static_files = true
130
131 # autogenerate javascript routes file on startup
147 ## autogenerate javascript routes file on startup
132 148 generate_js_files = false
133 149
134 150 ## Optional Languages
@@ -317,8 +333,8 b' beaker.cache.sql_cache_short.type = memo'
317 333 beaker.cache.sql_cache_short.expire = 10
318 334 beaker.cache.sql_cache_short.key_length = 256
319 335
320 # default is memory cache, configure only if required
321 # using multi-node or multi-worker setup
336 ## default is memory cache, configure only if required
337 ## using multi-node or multi-worker setup
322 338 #beaker.cache.auth_plugins.type = ext:database
323 339 #beaker.cache.auth_plugins.lock_dir = %(here)s/data/cache/auth_plugin_lock
324 340 #beaker.cache.auth_plugins.url = postgresql://postgres:secret@localhost/rhodecode
@@ -331,8 +347,8 b' beaker.cache.repo_cache_long.type = memo'
331 347 beaker.cache.repo_cache_long.max_items = 4096
332 348 beaker.cache.repo_cache_long.expire = 2592000
333 349
334 # default is memorylru_base cache, configure only if required
335 # using multi-node or multi-worker setup
350 ## default is memorylru_base cache, configure only if required
351 ## using multi-node or multi-worker setup
336 352 #beaker.cache.repo_cache_long.type = ext:memcached
337 353 #beaker.cache.repo_cache_long.url = localhost:11211
338 354 #beaker.cache.repo_cache_long.expire = 1209600
@@ -347,7 +363,7 b' beaker.cache.repo_cache_long.expire = 25'
347 363 beaker.session.type = file
348 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 367 #beaker.session.type = ext:database
352 368 #beaker.session.table_name = db_session
353 369 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
@@ -368,6 +384,7 b' beaker.session.lock_dir = %(here)s/data/'
368 384 ## accessed for given amount of time in seconds
369 385 beaker.session.timeout = 2592000
370 386 beaker.session.httponly = true
387 ## Path to use for the cookie.
371 388 #beaker.session.cookie_path = /<your-prefix>
372 389
373 390 ## uncomment for https secure cookie
@@ -391,6 +408,23 b' beaker.session.auto = false'
391 408 search.module = rhodecode.lib.index.whoosh
392 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 429 ## APPENLIGHT CONFIG ##
396 430 ###################################
@@ -466,9 +500,10 b' debug_style = true'
466 500 #########################################################
467 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 504 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
471 505 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
506 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
472 507
473 508 # see sqlalchemy docs for other advanced settings
474 509
@@ -498,28 +533,53 b' vcs.server = localhost:9900'
498 533 ## Available protocols are:
499 534 ## `pyro4` - using pyro4 server
500 535 ## `http` - using http-rpc backend
501 #vcs.server.protocol = http
536 vcs.server.protocol = http
502 537
503 538 ## Push/Pull operations protocol, available options are:
504 539 ## `pyro4` - using pyro4 server
505 540 ## `rhodecode.lib.middleware.utils.scm_app_http` - Http based, recommended
506 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 544 ## Push/Pull operations hooks protocol, available options are:
510 545 ## `pyro4` - using pyro4 server
511 546 ## `http` - using http-rpc backend
512 #vcs.hooks.protocol = http
547 vcs.hooks.protocol = http
513 548
514 549 vcs.server.log_level = debug
515 550 ## Start VCSServer with this instance as a subprocess, usefull for development
516 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 557 vcs.backends = hg, git, svn
558
518 559 vcs.connection_timeout = 3600
519 560 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
520 561 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible
521 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 584 ### LOGGING CONFIGURATION ####
525 585 ################################
@@ -1,23 +1,36 b''
1 ################################################################################
1
2
2 3 ################################################################################
3 # RhodeCode Enterprise - configuration file #
4 # Built-in functions and variables #
4 ## RHODECODE ENTERPRISE CONFIGURATION ##
5 5 # The %(here)s variable will be replaced with the parent directory of this file#
6 # #
7 6 ################################################################################
8 7
9 8 [DEFAULT]
10 9 debug = true
10
11 11 ################################################################################
12 ## EMAIL CONFIGURATION ##
12 13 ## Uncomment and replace with the email address which should receive ##
13 14 ## any error reports after an application crash ##
14 15 ## Additionally these settings will be used by the RhodeCode mailing system ##
15 16 ################################################################################
16 #email_to = admin@localhost
17 #error_email_from = paste_error@localhost
17
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 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 32 #error_message =
20 #email_prefix = [RhodeCode]
33
21 34
22 35 #smtp_server = mail.server.com
23 36 #smtp_username =
@@ -37,6 +50,7 b' port = 5000'
37 50 ## WAITRESS WSGI SERVER ##
38 51 ## Recommended for Development ##
39 52 ##################################
53
40 54 #use = egg:waitress#main
41 55 ## number of worker threads
42 56 #threads = 5
@@ -51,6 +65,7 b' port = 5000'
51 65 ## GUNICORN WSGI SERVER ##
52 66 ##########################
53 67 ## run with gunicorn --log-config <inifile.ini> --paste <inifile.ini>
68
54 69 use = egg:gunicorn#main
55 70 ## Sets the number of process workers. You must set `instance_id = *`
56 71 ## when this option is set to more than one worker, recommended
@@ -77,15 +92,18 b' timeout = 21600'
77 92
78 93
79 94 ## prefix middleware for RhodeCode, disables force_https flag.
95 ## recommended when using proxy setup.
80 96 ## allows to set RhodeCode under a prefix in server.
81 97 ## eg https://server.com/<prefix>. Enable `filter-with =` option below as well.
82 #[filter:proxy-prefix]
83 #use = egg:PasteDeploy#prefix
84 #prefix = /<your-prefix>
98 ## optionally set prefix like: `prefix = /<your-prefix>`
99 [filter:proxy-prefix]
100 use = egg:PasteDeploy#prefix
101 prefix = /
85 102
86 103 [app:main]
87 104 use = egg:rhodecode-enterprise-ce
88 ## enable proxy prefix middleware, defined below
105
106 ## enable proxy prefix middleware, defined above
89 107 #filter-with = proxy-prefix
90 108
91 109 ## encryption key used to encrypt social plugin tokens,
@@ -97,12 +115,10 b' use = egg:rhodecode-enterprise-ce'
97 115 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
98 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
103 static_files = true
104
105 # autogenerate javascript routes file on startup
121 ## autogenerate javascript routes file on startup
106 122 generate_js_files = false
107 123
108 124 ## Optional Languages
@@ -291,8 +307,8 b' beaker.cache.sql_cache_short.type = memo'
291 307 beaker.cache.sql_cache_short.expire = 10
292 308 beaker.cache.sql_cache_short.key_length = 256
293 309
294 # default is memory cache, configure only if required
295 # using multi-node or multi-worker setup
310 ## default is memory cache, configure only if required
311 ## using multi-node or multi-worker setup
296 312 #beaker.cache.auth_plugins.type = ext:database
297 313 #beaker.cache.auth_plugins.lock_dir = %(here)s/data/cache/auth_plugin_lock
298 314 #beaker.cache.auth_plugins.url = postgresql://postgres:secret@localhost/rhodecode
@@ -305,8 +321,8 b' beaker.cache.repo_cache_long.type = memo'
305 321 beaker.cache.repo_cache_long.max_items = 4096
306 322 beaker.cache.repo_cache_long.expire = 2592000
307 323
308 # default is memorylru_base cache, configure only if required
309 # using multi-node or multi-worker setup
324 ## default is memorylru_base cache, configure only if required
325 ## using multi-node or multi-worker setup
310 326 #beaker.cache.repo_cache_long.type = ext:memcached
311 327 #beaker.cache.repo_cache_long.url = localhost:11211
312 328 #beaker.cache.repo_cache_long.expire = 1209600
@@ -321,7 +337,7 b' beaker.cache.repo_cache_long.expire = 25'
321 337 beaker.session.type = file
322 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 341 #beaker.session.type = ext:database
326 342 #beaker.session.table_name = db_session
327 343 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
@@ -342,6 +358,7 b' beaker.session.lock_dir = %(here)s/data/'
342 358 ## accessed for given amount of time in seconds
343 359 beaker.session.timeout = 2592000
344 360 beaker.session.httponly = true
361 ## Path to use for the cookie.
345 362 #beaker.session.cookie_path = /<your-prefix>
346 363
347 364 ## uncomment for https secure cookie
@@ -365,6 +382,23 b' beaker.session.auto = false'
365 382 search.module = rhodecode.lib.index.whoosh
366 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 403 ## APPENLIGHT CONFIG ##
370 404 ###################################
@@ -436,8 +470,9 b' set debug = false'
436 470 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
437 471 #########################################################
438 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 475 sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
440 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
441 476
442 477 # see sqlalchemy docs for other advanced settings
443 478
@@ -483,12 +518,37 b' vcs.server = localhost:9900'
483 518 vcs.server.log_level = info
484 519 ## Start VCSServer with this instance as a subprocess, usefull for development
485 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 526 vcs.backends = hg, git, svn
527
487 528 vcs.connection_timeout = 3600
488 529 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
489 530 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible
490 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 553 ### LOGGING CONFIGURATION ####
494 554 ################################
@@ -123,8 +123,9 b' let'
123 123 # pkgs/default.nix?
124 124 passthru = {
125 125 inherit
126 pythonLocalOverrides
127 myPythonPackagesUnfix;
126 linkNodeModules
127 myPythonPackagesUnfix
128 pythonLocalOverrides;
128 129 pythonPackages = self;
129 130 };
130 131
@@ -165,6 +166,7 b' let'
165 166 ln -s ${self.supervisor}/bin/supervisor* $out/bin/
166 167 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
167 168 ln -s ${self.PasteScript}/bin/paster $out/bin/
169 ln -s ${self.channelstream}/bin/channelstream $out/bin/
168 170 ln -s ${self.pyramid}/bin/* $out/bin/ #*/
169 171
170 172 # rhodecode-tools
@@ -9,9 +9,9 b' Here is a sample configuration file for '
9 9 ServerName hg.myserver.com
10 10 ServerAlias hg.myserver.com
11 11
12 ## uncomment root directive if you want to serve static files by
13 ## Apache requires static_files = false in .ini file
14 #DocumentRoot /path/to/rhodecode/installation/public
12 ## uncomment to serve static files by Apache
13 ## ProxyPass /_static/rhodecode !
14 ## Alias /_static/rhodecode /path/to/.rccontrol/enterprise-1/static
15 15
16 16 <Proxy *>
17 17 Order allow,deny
@@ -16,17 +16,18 b' Use the following example to configure A'
16 16 In addition to the regular Apache setup you will need to add the following
17 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 28 * In the the ``[app:main]`` section of your ``rhodecode.ini`` file add the
20 29 following line.
21 30
22 31 .. code-block:: ini
23 32
24 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
@@ -121,7 +121,7 b' then work on restoring any specific setu'
121 121 :ref:`indexing-ref` section for details.
122 122 * To reconfigure any extensions, copy the backed up extensions into the
123 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 125 details.
126 126
127 127 .. _Schrödinger's Backup: http://novabackup.novastor.com/blog/schrodingers-backup-good-bad-backup/
@@ -5,6 +5,11 b' Use the following example to configure N'
5 5
6 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 13 upstream rc {
9 14
10 15 server 127.0.0.1:10002;
@@ -14,12 +19,12 b' Use the following example to configure N'
14 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 24 server {
20 25 listen 443;
21 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 28 error_log /var/log/nginx/gist.error.log;
24 29
25 30 ssl on;
@@ -28,23 +33,36 b' Use the following example to configure N'
28 33
29 34 ssl_session_timeout 5m;
30 35
31 ssl_protocols SSLv3 TLSv1;
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;
36 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
33 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 40 add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
35 41
36 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 45 rewrite ^/(.+)$ https://rhodecode.myserver.com/_admin/gists/$1;
40 46 rewrite (.*) https://rhodecode.myserver.com/_admin/gists;
41 47 }
42 48
49 ## HTTP to HTTPS rewrite
43 50 server {
44 listen 443;
51 listen 80;
45 52 server_name rhodecode.myserver.com;
46 access_log /var/log/nginx/rhodecode.access.log;
47 error_log /var/log/nginx/rhodecode.error.log;
53
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 67 ssl on;
50 68 ssl_certificate rhodecode.myserver.com.crt;
@@ -52,21 +70,51 b' Use the following example to configure N'
52 70
53 71 ssl_session_timeout 5m;
54 72
55 ssl_protocols SSLv3 TLSv1;
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;
73 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
57 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
60 ## requires static_files = false in .ini file
61 # root /path/to/rhodecode/installation/public;
87 ## channel stream live components
88 location /_channelstream {
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 107 location / {
66 108 try_files $uri @rhode;
67 109 }
68 110
69 location @rhode {
70 proxy_pass http://rc;
71 }
72 }
111 location @rhode {
112 proxy_pass http://rc;
113 }
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
@@ -15,7 +15,16 b' Use the following example to configure N'
15 15 }
16 16
17 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 29 * In the the ``[app:main]`` section of your ``rhodecode.ini`` file add the
21 30 following line.
@@ -24,10 +33,4 b' lines into the ``rhodecode.ini`` file.'
24 33
25 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
@@ -32,7 +32,7 b' Example Usage'
32 32 -------------
33 33
34 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 37 .. code-block:: python
38 38
@@ -30,7 +30,7 b' account permissions.'
30 30 # Use this example to change user permissions
31 31 In [1]: adminuser = User.get_by_username('username')
32 32 In [2]: adminuser.admin = True
33 In [3]: Session.add(adminuser);Session().commit()
33 In [3]: Session().add(adminuser);Session().commit()
34 34 In [4]: exit()
35 35
36 36 Set to read global ``.hgrc`` file
@@ -76,7 +76,7 b' following examples. For more |svn| infor'
76 76 .. code-block:: bash
77 77
78 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 81 # svn commit
82 82 svn commit
This diff has been collapsed as it changes many lines, (2637 lines changed) Show them Hide them
@@ -194,2631 +194,14 b' are not required in args.'
194 194 ApiController.
195 195
196 196 .. --- API DEFS MARKER ---
197
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>>)
197 .. toctree::
1510 198
1511 Comment on the pull request specified with the `pullrequestid`,
1512 in the |repo| specified by the `repoid`, and optionally change the
1513 review status.
1514
1515 :param apiuser: This is filled automatically from the |authtoken|.
1516 :type apiuser: AuthUser
1517 :param repoid: The repository name or repository ID.
1518 :type repoid: str or int
1519 :param pullrequestid: The pull request ID.
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
199 methods/license-methods
200 methods/deprecated-methods
201 methods/gist-methods
202 methods/pull-request-methods
203 methods/repo-methods
204 methods/repo-group-methods
205 methods/server-methods
206 methods/user-methods
207 methods/user-group-methods
@@ -14,7 +14,7 b' code review matters, see these posts on '
14 14
15 15 You can also use the |RCE| API set up continuous integration servers to leave
16 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 19 .. toctree::
20 20
@@ -6,6 +6,8 b" rst_epilog = '''"
6 6 .. |AE| replace:: Appenlight
7 7 .. |authtoken| replace:: Authentication Token
8 8 .. |authtokens| replace:: **Auth Tokens**
9 .. |RCCEshort| replace:: Community
10 .. |RCEEshort| replace:: Enterprise
9 11 .. |git| replace:: Git
10 12 .. |hg| replace:: Mercurial
11 13 .. |svn| replace:: Subversion
@@ -78,7 +78,7 b' following command from inside the cloned'
78 78
79 79 On the first run, this will take a while to download and optionally compile
80 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
@@ -91,9 +91,9 b' use the following steps:'
91 91 1. Create a copy of `~/rhodecode-enterprise-ce/configs/development.ini`
92 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 99 Setup the Development Database
@@ -108,32 +108,37 b' time operation::'
108 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 124 Start the Development Server
112 125 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
113 126
114 When starting the development server, you should start the vcsserver as a
115 separate process. To do this, use one of the following examples:
127 From the rhodecode-vcsserver directory, start the development server in another
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::
130
131 rcserver --with-vcsserver dev.ini
138 .. note::
132 139
133 3. Start the development server in a different terminal using the following
134 example::
135
136 vcsserver
140 To automatically refresh - and recompile the frontend assets - when changes
141 are made in the source code, you can use the option `--reload`.
137 142
138 143
139 144 Run the Environment Tests
@@ -141,4 +146,12 b' Run the Environment Tests'
141 146
142 147 Please make sure that the tests are passing to verify that your environment is
143 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
@@ -86,14 +86,11 b' Sign the Contributor License Agreement'
86 86 ======================================
87 87
88 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
90 it on our website here: https://rhodecode.com/static/pdf/RhodeCode-CLA.pdf
89 agreement in order for it to be merged into the project's codebase.
91 90
92 To sign, go to code.rhodecode.com
93 and clone the CLA repository. Add your name and make a pull request to add it to
94 the contributor agreement; this serves as your virtual signature. Once your
95 signature is merged, add a link to the relevant commit to your contribution
96 pull request.
91 You can read it on our website at https://rhodecode.com/rhodecode-cla
92
93 To sign electronically, go to https://rhodecode.com/sign-cla
97 94
98 95
99 96
@@ -28,10 +28,11 b' let'
28 28 };
29 29
30 30 Pygments = buildPythonPackage rec {
31 name = "Pygments-2.0.2";
31 name = "Pygments-2.1.3";
32 doCheck = false;
32 33 src = fetchurl {
33 url = "https://pypi.python.org/packages/source/P/Pygments/${name}.tar.gz";
34 md5 = "238587a1370d62405edabd0794b3ec4a";
34 url = "https://pypi.python.org/packages/b8/67/ab177979be1c81bc99c8d0592ef22d547e70bb4c6815c383286ed5dec504/Pygments-2.1.3.tar.gz";
35 md5 = "ed3fba2467c8afcda4d317e4ef2c6150";
35 36 };
36 37 };
37 38
@@ -78,11 +79,19 b' let'
78 79 ];
79 80 };
80 81
81 Sphinx = buildPythonPackage (rec {
82 name = "Sphinx-1.3.1";
82 imagesize = buildPythonPackage rec {
83 name = "imagesize-0.7.1";
83 84 src = fetchurl {
84 url = "http://pypi.python.org/packages/source/S/Sphinx/${name}.tar.gz";
85 md5 = "8786a194acf9673464c5455b11fd4332";
85 url = "https://pypi.python.org/packages/53/72/6c6f1e787d9cab2cc733cf042f125abec07209a58308831c9f292504e826/${name}.tar.gz";
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 96 propagatedBuildInputs = [
88 97 docutils
@@ -93,6 +102,7 b' let'
93 102 snowballstemmer
94 103 pytz
95 104 babel
105 imagesize
96 106
97 107 # TODO: johbo: Had to include it here so that can be imported
98 108 sphinx_rtd_theme
1 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
1 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
1 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
1 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
@@ -58,6 +58,7 b' and commit files and |repos| while manag'
58 58 collaboration/review-notifications
59 59 collaboration/pull-requests
60 60 code-review/code-review
61 integrations/integrations
61 62
62 63 .. toctree::
63 64 :maxdepth: 1
@@ -65,7 +66,7 b' and commit files and |repos| while manag'
65 66
66 67 api/api
67 68 tools/rhodecode-tools
68 integrations/integrations
69 extensions/extensions-hooks
69 70 contributing/contributing
70 71
71 72 .. toctree::
@@ -1,7 +1,7 b''
1 1 .. _quick-start:
2 2
3 Quick Start Guide
4 =================
3 Quick Start Installation Guide
4 ==============================
5 5
6 6 .. important::
7 7
@@ -1,25 +1,52 b''
1 .. _integrations-ref:
1 .. _integrations:
2
3 Integrations
4 ------------
2 5
3 Integrations and Extensions
4 ===========================
6 Rhodecode supports integrations with external services for various events,
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,
7 so to clarify what is meant each time, read the following definitions:
11 Supported integrations
12 ^^^^^^^^^^^^^^^^^^^^^^
8 13
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.
14 ============================ ============ =====================================
15 Type/Name |RC| Edition Description
16 ============================ ============ =====================================
17 :ref:`integrations-slack` |RCCEshort| https://slack.com/
18 :ref:`integrations-hipchat` |RCCEshort| https://www.hipchat.com/
19 :ref:`integrations-webhook` |RCCEshort| POST events as `json` to a custom url
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 46 .. toctree::
18 47
19 rcx
20 install-ext
21 config-ext
22 extensions
23 hooks
24 full-blown-example
25 int-slack
48 slack
49 hipchat
50 redmine
51 jira
52 webhook
@@ -5,12 +5,12 b' Issue Tracker Integration'
5 5
6 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.
9 * At |repo| level you can configure an integration with a different issue
8 * At the instance level, you can set a default issue tracker.
9 * At the |repo| level, you can configure an integration with a different issue
10 10 tracker.
11 11
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
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
14 14 it with a URL. This enables |RCE| to generate a link matching each issue to the
15 15 target |repo|.
16 16
@@ -33,9 +33,8 b' 3. Select **Add** so save the rule to yo'
33 33 Repository Issue Tracker Configuration
34 34 --------------------------------------
35 35
36 You can configure specific |repos| to use a different issue tracker if
37 you need to connect to a non-default one. See the instructions in
38 :ref:`repo-it`
36 You can configure specific |repos| to use a different issue tracker than the
37 default one. See the instructions in :ref:`repo-it`
39 38
40 39 .. _issue-tr-eg-ref:
41 40
@@ -9,6 +9,6 b' Release Date'
9 9 Fixes
10 10 ^^^^^
11 11
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.
14 - celery: make sure to run tasks in sync mode if connection to celery is lost.
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.
14 - Celery: make sure to run tasks in sync mode if connection to celery is lost.
@@ -9,6 +9,7 b' Release Notes'
9 9 .. toctree::
10 10 :maxdepth: 1
11 11
12 release-notes-4.3.0.rst
12 13 release-notes-4.2.1.rst
13 14 release-notes-4.2.0.rst
14 15 release-notes-4.1.2.rst
@@ -301,7 +301,7 b' used to send signals to build-bots such '
301 301
302 302 \ - -plugins
303 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 306 \ - -version
307 307 Display your |RCT| version.
@@ -1,12 +1,12 b''
1 1 diff --git a/requirements.txt b/requirements.txt
2 2 --- a/requirements.txt
3 3 +++ b/requirements.txt
4 @@ -3,7 +3,7 @@future==0.14.3
4 @@ -3,7 +3,7 @@ future==0.14.3
5 5 six==1.9.0
6 6 mako==1.0.1
7 7 markupsafe==0.23
8 8 -requests==2.5.1
9 9 +requests
10 #responses
11 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
@@ -95,6 +95,14 b' self: super: {'
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 106 pycurl = super.pycurl.override (attrs: {
99 107 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
100 108 pkgs.curl
@@ -38,6 +38,19 b''
38 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 54 Fabric = super.buildPythonPackage {
42 55 name = "Fabric-1.10.0";
43 56 buildInputs = with self; [];
@@ -169,13 +182,13 b''
169 182 };
170 183 };
171 184 Pygments = super.buildPythonPackage {
172 name = "Pygments-2.0.2";
185 name = "Pygments-2.1.3";
173 186 buildInputs = with self; [];
174 187 doCheck = false;
175 188 propagatedBuildInputs = with self; [];
176 189 src = fetchurl {
177 url = "https://pypi.python.org/packages/f4/c6/bdbc5a8a112256b2b6136af304dbae93d8b1ef8738ff2d12a51018800e46/Pygments-2.0.2.tar.gz";
178 md5 = "238587a1370d62405edabd0794b3ec4a";
190 url = "https://pypi.python.org/packages/b8/67/ab177979be1c81bc99c8d0592ef22d547e70bb4c6815c383286ed5dec504/Pygments-2.1.3.tar.gz";
191 md5 = "ed3fba2467c8afcda4d317e4ef2c6150";
179 192 };
180 193 meta = {
181 194 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -467,6 +480,19 b''
467 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 496 click = super.buildPythonPackage {
471 497 name = "click-5.1";
472 498 buildInputs = with self; [];
@@ -558,6 +584,19 b''
558 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 600 docutils = super.buildPythonPackage {
562 601 name = "docutils-0.12";
563 602 buildInputs = with self; [];
@@ -572,13 +611,13 b''
572 611 };
573 612 };
574 613 dogpile.cache = super.buildPythonPackage {
575 name = "dogpile.cache-0.5.7";
614 name = "dogpile.cache-0.6.1";
576 615 buildInputs = with self; [];
577 616 doCheck = false;
578 propagatedBuildInputs = with self; [dogpile.core];
617 propagatedBuildInputs = with self; [];
579 618 src = fetchurl {
580 url = "https://pypi.python.org/packages/07/74/2a83bedf758156d9c95d112691bbad870d3b77ccbcfb781b4ef836ea7d96/dogpile.cache-0.5.7.tar.gz";
581 md5 = "3e58ce41af574aab41d78e9c4190f194";
619 url = "https://pypi.python.org/packages/f6/a0/6f2142c58c6588d17c734265b103ae1cd0741e1681dd9483a63f22033375/dogpile.cache-0.6.1.tar.gz";
620 md5 = "35d7fb30f22bbd0685763d894dd079a9";
582 621 };
583 622 meta = {
584 623 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -688,6 +727,19 b''
688 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 743 gnureadline = super.buildPythonPackage {
692 744 name = "gnureadline-6.3.3";
693 745 buildInputs = with self; [];
@@ -702,7 +754,7 b''
702 754 };
703 755 };
704 756 gprof2dot = super.buildPythonPackage {
705 name = "gprof2dot-2015.12.1";
757 name = "gprof2dot-2015.12.01";
706 758 buildInputs = with self; [];
707 759 doCheck = false;
708 760 propagatedBuildInputs = with self; [];
@@ -714,6 +766,19 b''
714 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 782 gunicorn = super.buildPythonPackage {
718 783 name = "gunicorn-19.6.0";
719 784 buildInputs = with self; [];
@@ -948,6 +1013,19 b''
948 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 1029 psutil = super.buildPythonPackage {
952 1030 name = "psutil-2.2.1";
953 1031 buildInputs = with self; [];
@@ -962,13 +1040,13 b''
962 1040 };
963 1041 };
964 1042 psycopg2 = super.buildPythonPackage {
965 name = "psycopg2-2.6";
1043 name = "psycopg2-2.6.1";
966 1044 buildInputs = with self; [];
967 1045 doCheck = false;
968 1046 propagatedBuildInputs = with self; [];
969 1047 src = fetchurl {
970 url = "https://pypi.python.org/packages/dd/c7/9016ff8ff69da269b1848276eebfb264af5badf6b38caad805426771f04d/psycopg2-2.6.tar.gz";
971 md5 = "fbbb039a8765d561a1c04969bbae7c74";
1048 url = "https://pypi.python.org/packages/86/fd/cc8315be63a41fe000cce20482a917e874cdc1151e62cb0141f5e55f711e/psycopg2-2.6.1.tar.gz";
1049 md5 = "842b44f8c95517ed5b792081a2370da1";
972 1050 };
973 1051 meta = {
974 1052 license = [ pkgs.lib.licenses.zpt21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ];
@@ -1000,6 +1078,19 b''
1000 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 1094 pycrypto = super.buildPythonPackage {
1004 1095 name = "pycrypto-2.6.1";
1005 1096 buildInputs = with self; [];
@@ -1339,23 +1430,23 b''
1339 1430 };
1340 1431 };
1341 1432 rhodecode-enterprise-ce = super.buildPythonPackage {
1342 name = "rhodecode-enterprise-ce-4.2.1";
1433 name = "rhodecode-enterprise-ce-4.3.0";
1343 1434 buildInputs = with self; [WebTest configobj cssselect flake8 lxml mock pytest pytest-cov pytest-runner];
1344 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 1437 src = ./.;
1347 1438 meta = {
1348 1439 license = [ { fullName = "AGPLv3, and Commercial License"; } ];
1349 1440 };
1350 1441 };
1351 1442 rhodecode-tools = super.buildPythonPackage {
1352 name = "rhodecode-tools-0.8.3";
1443 name = "rhodecode-tools-0.10.0";
1353 1444 buildInputs = with self; [];
1354 1445 doCheck = false;
1355 1446 propagatedBuildInputs = with self; [click future six Mako MarkupSafe requests Whoosh elasticsearch elasticsearch-dsl];
1356 1447 src = fetchurl {
1357 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.8.3.zip";
1358 md5 = "9acdfd71b8ddf4056057065f37ab9ccb";
1448 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.10.0.zip";
1449 md5 = "4762391473ded761bead3aa58c748044";
1359 1450 };
1360 1451 meta = {
1361 1452 license = [ { fullName = "AGPLv3 and Proprietary"; } ];
@@ -1453,13 +1544,13 b''
1453 1544 };
1454 1545 };
1455 1546 supervisor = super.buildPythonPackage {
1456 name = "supervisor-3.1.3";
1547 name = "supervisor-3.3.0";
1457 1548 buildInputs = with self; [];
1458 1549 doCheck = false;
1459 1550 propagatedBuildInputs = with self; [meld3];
1460 1551 src = fetchurl {
1461 url = "https://pypi.python.org/packages/a6/41/65ad5bd66230b173eb4d0b8810230f3a9c59ef52ae066e540b6b99895db7/supervisor-3.1.3.tar.gz";
1462 md5 = "aad263c4fbc070de63dd354864d5e552";
1552 url = "https://pypi.python.org/packages/44/80/d28047d120bfcc8158b4e41127706731ee6a3419c661e0a858fb0e7c4b2d/supervisor-3.3.0.tar.gz";
1553 md5 = "46bac00378d1eddb616752b990c67416";
1463 1554 };
1464 1555 meta = {
1465 1556 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
@@ -1556,6 +1647,19 b''
1556 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 1663 wsgiref = super.buildPythonPackage {
1560 1664 name = "wsgiref-0.1.2";
1561 1665 buildInputs = with self; [];
@@ -11,7 +11,7 b' MySQL-python==1.2.5'
11 11 Paste==2.0.2
12 12 PasteDeploy==1.5.2
13 13 PasteScript==1.7.5
14 Pygments==2.0.2
14 Pygments==2.1.3
15 15
16 16 # TODO: This version is not available on PyPI
17 17 # Pylons==1.0.2.dev20160108
@@ -24,10 +24,6 b' Pyro4==4.41'
24 24 # TODO: This should probably not be in here
25 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 27 Routes==1.13
32 28 SQLAlchemy==0.9.9
33 29 Sphinx==1.2.2
@@ -53,6 +49,7 b' backport-ipaddress==0.1'
53 49 bottle==0.12.8
54 50 bumpversion==0.5.3
55 51 celery==2.2.10
52 channelstream==0.5.2
56 53 click==5.1
57 54 colander==1.2
58 55 configobj==5.0.6
@@ -60,15 +57,18 b' cov-core==1.15.0'
60 57 coverage==3.7.1
61 58 cssselect==0.9.1
62 59 decorator==3.4.2
60 deform==2.0a2
63 61 docutils==0.12
64 dogpile.cache==0.5.7
62 dogpile.cache==0.6.1
65 63 dogpile.core==0.4.1
66 64 dulwich==0.12.0
67 65 ecdsa==0.11
68 66 flake8==2.4.1
69 67 future==0.14.3
70 68 futures==3.0.2
69 gevent==1.1.1
71 70 gprof2dot==2015.12.1
71 greenlet==0.4.9
72 72 gunicorn==19.6.0
73 73
74 74 # TODO: Needs subvertpy and blows up without Subversion headers,
@@ -94,9 +94,10 b' packaging==15.2'
94 94 paramiko==1.15.1
95 95 pep8==1.5.7
96 96 psutil==2.2.1
97 psycopg2==2.6
97 psycopg2==2.6.1
98 98 py==1.4.29
99 99 py-bcrypt==0.4
100 py-gfm==0.1.3
100 101 pycrypto==2.6.1
101 102 pycurl==7.19.5
102 103 pyflakes==0.8.1
@@ -123,7 +124,7 b' pyzmq==14.6.0'
123 124 # TODO: This is not available in public
124 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 130 recaptcha-client==1.0.6
@@ -136,7 +137,7 b' setuptools-scm==1.11.0'
136 137 simplejson==3.7.2
137 138 six==1.9.0
138 139 subprocess32==3.2.6
139 supervisor==3.1.3
140 supervisor==3.3.0
140 141 transifex-client==0.10
141 142 translationstring==1.3
142 143 trollius==1.0.4
@@ -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
@@ -43,11 +43,15 b' CELERY_EAGER = False'
43 43 # link to config for pylons
44 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 50 # Linked module for extensions
47 51 EXTENSIONS = {}
48 52
49 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 55 __platform__ = platform.system()
52 56 __license__ = 'AGPLv3, and Commercial License'
53 57 __author__ = 'RhodeCode GmbH'
@@ -80,6 +80,8 b' class NavigationRegistry(object):'
80 80 NavEntry('email', _('Email'), 'admin_settings_email'),
81 81 NavEntry('hooks', _('Hooks'), 'admin_settings_hooks'),
82 82 NavEntry('search', _('Full Text Search'), 'admin_settings_search'),
83 NavEntry('integrations', _('Integrations'),
84 'global_integrations_home', pyramid=True),
83 85 NavEntry('system', _('System Info'), 'admin_settings_system'),
84 86 NavEntry('open_source', _('Open Source Licenses'),
85 87 'admin_settings_open_source', pyramid=True),
@@ -25,12 +25,15 b' import types'
25 25
26 26 import decorator
27 27 import venusian
28 from collections import OrderedDict
29
28 30 from pyramid.exceptions import ConfigurationError
29 31 from pyramid.renderers import render
30 32 from pyramid.response import Response
31 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 37 from rhodecode.lib.auth import AuthUser
35 38 from rhodecode.lib.base import get_ip_addr
36 39 from rhodecode.lib.ext_json import json
@@ -127,6 +130,11 b' def exception_view(exc, request):'
127 130 if isinstance(exc, JSONRPCError):
128 131 fault_message = exc.message
129 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 138 elif isinstance(exc, JSONRPCForbidden):
131 139 fault_message = 'Access was denied to this resource.'
132 140 log.warning('json-rpc forbidden call rpc_id:%s "%s"', rpc_id, fault_message)
@@ -474,7 +482,7 b' def includeme(config):'
474 482 plugin_module, config.registry.settings)
475 483
476 484 if not hasattr(config.registry, 'jsonrpc_methods'):
477 config.registry.jsonrpc_methods = {}
485 config.registry.jsonrpc_methods = OrderedDict()
478 486
479 487 # match filter by given method only
480 488 config.add_view_predicate(
@@ -27,5 +27,13 b' class JSONRPCError(JSONRPCBaseError):'
27 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 37 class JSONRPCForbidden(JSONRPCBaseError):
31 38 pass
39
@@ -43,7 +43,7 b' class TestApiCreateGist(object):'
43 43 description='foobar-gist',
44 44 gist_type=gist_type,
45 45 acl_level=gist_acl_level,
46 files={'foobar': {'content': 'foo'}})
46 files={'foobar_ąć': {'content': 'foo'}})
47 47 response = api_call(self.app, params)
48 48 response_json = response.json
49 49 gist = response_json['result']['gist']
@@ -68,6 +68,32 b' class TestApiCreateGist(object):'
68 68 finally:
69 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 97 @mock.patch.object(GistModel, 'create', crash)
72 98 def test_api_create_gist_exception_occurred(self):
73 99 id_, params = build_data(self.apikey_regular, 'create_gist', files={})
@@ -21,7 +21,7 b''
21 21
22 22 import pytest
23 23
24 from rhodecode.api.views import depracated_api
24 from rhodecode.api.views import deprecated_api
25 25 from rhodecode.lib.ext_json import json
26 26 from rhodecode.api.tests.utils import (
27 27 build_data, api_call)
@@ -30,7 +30,7 b' from rhodecode.api.tests.utils import ('
30 30 @pytest.mark.usefixtures("testuser_api", "app")
31 31 class TestCommitComment(object):
32 32 def test_deprecated_message_in_docstring(self):
33 docstring = depracated_api.changeset_comment.__doc__
33 docstring = deprecated_api.changeset_comment.__doc__
34 34 assert '.. deprecated:: 3.4.0' in docstring
35 35 assert 'Please use method `comment_commit` instead.' in docstring
36 36
@@ -73,6 +73,29 b' class TestGetRepoNodes(object):'
73 73 expected = 'failed to get repo: `%s` nodes' % (backend.repo_name,)
74 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 99 def test_api_get_repo_nodes_bad_ret_type(self, backend):
77 100 commit_id = 'tip'
78 101 path = '/'
@@ -47,9 +47,14 b' class TestApiUpdateRepo(object):'
47 47 ({'enable_statistics': True}, SAME_AS_UPDATES),
48 48 ({'enable_locking': True}, SAME_AS_UPDATES),
49 49 ({'enable_downloads': True}, SAME_AS_UPDATES),
50 ({'name': 'new_repo_name'}, {'repo_name': 'new_repo_name'}),
51 ({'group': 'test_group_for_update'},
52 {'repo_name': 'test_group_for_update/%s' % UPDATE_REPO_NAME}),
50 ({'name': 'new_repo_name'}, {
51 'repo_name': 'new_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 59 def test_api_update_repo(self, updates, expected, backend):
55 60 repo_name = UPDATE_REPO_NAME
@@ -34,8 +34,6 b' from rhodecode.lib.vcs.exceptions import'
34 34 log = logging.getLogger(__name__)
35 35
36 36
37
38
39 37 class OAttr(object):
40 38 """
41 39 Special Option that defines other attribute, and can default to them
1 NO CONTENT: file renamed from rhodecode/api/views/depracated_api.py to rhodecode/api/views/deprecated_api.py
@@ -23,6 +23,7 b' import logging'
23 23 import time
24 24
25 25 from rhodecode.api import jsonrpc_method, JSONRPCError
26 from rhodecode.api.exc import JSONRPCValidationError
26 27 from rhodecode.api.utils import (
27 28 Optional, OAttr, get_gist_or_error, get_user_or_error,
28 29 has_superadmin_permission)
@@ -96,7 +97,8 b' def get_gists(request, apiuser, userid=O'
96 97
97 98 @jsonrpc_method()
98 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 102 gist_type=Optional(Gist.GIST_PUBLIC), lifetime=Optional(-1),
101 103 acl_level=Optional(Gist.ACL_LEVEL_PUBLIC),
102 104 description=Optional('')):
@@ -108,10 +110,11 b' def create_gist('
108 110 :param files: files to be added to the gist. The data structure has
109 111 to match the following example::
110 112
111 {'filename': {'content':'...', 'lexer': null},
112 'filename2': {'content':'...', 'lexer': null}}
113 {'filename1': {'content':'...'}, 'filename2': {'content':'...'}}
113 114
114 115 :type files: dict
116 :param gistid: Set a custom id for the gist
117 :type gistid: Optional(str)
115 118 :param owner: Set the gist owner, defaults to api method caller
116 119 :type owner: Optional(str or int)
117 120 :param gist_type: type of gist ``public`` or ``private``
@@ -148,23 +151,49 b' def 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 168 try:
153 if isinstance(owner, Optional):
154 owner = apiuser.user_id
169 nodes = gist_schema.nodes_to_sequence(
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)
157 description = Optional.extract(description)
158 gist_type = Optional.extract(gist_type)
159 lifetime = Optional.extract(lifetime)
160 acl_level = Optional.extract(acl_level)
181 # convert to safer format with just KEYs so we sure no duplicates
182 schema_data['nodes'] = gist_schema.sequence_to_nodes(
183 schema_data['nodes'], colander_node=schema.get('nodes'))
184
185 except validation_schema.Invalid as err:
186 raise JSONRPCValidationError(colander_exc=err)
161 187
162 gist = GistModel().create(description=description,
163 owner=owner,
164 gist_mapping=files,
165 gist_type=gist_type,
166 lifetime=lifetime,
167 gist_acl_level=acl_level)
188 try:
189 gist = GistModel().create(
190 owner=owner,
191 gist_id=schema_data['gistid'],
192 description=schema_data['description'],
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 197 Session().commit()
169 198 return {
170 199 'msg': 'created new gist',
@@ -265,7 +265,7 b' def merge_pull_request(request, apiuser,'
265 265 PullRequestModel().close_pull_request(
266 266 pull_request.pull_request_id, apiuser)
267 267
268 Session.commit()
268 Session().commit()
269 269 return data
270 270
271 271
@@ -319,7 +319,7 b' def close_pull_request(request, apiuser,'
319 319
320 320 PullRequestModel().close_pull_request(
321 321 pull_request.pull_request_id, apiuser)
322 Session.commit()
322 Session().commit()
323 323 data = {
324 324 'pull_request_id': pull_request.pull_request_id,
325 325 'closed': True,
@@ -408,6 +408,8 b' def comment_pull_request(request, apiuse'
408 408 line_no=None,
409 409 status_change=(ChangesetStatus.get_status_lbl(status)
410 410 if status and allowed_to_change_status else None),
411 status_change_type=(status
412 if status and allowed_to_change_status else None),
411 413 closing_pr=False,
412 414 renderer=renderer
413 415 )
@@ -43,8 +43,8 b' from rhodecode.model.db import ('
43 43 from rhodecode.model.repo import RepoModel
44 44 from rhodecode.model.repo_group import RepoGroupModel
45 45 from rhodecode.model.scm import ScmModel, RepoList
46 from rhodecode.model.settings import SettingsModel
47 from rhodecode.model.validation_schema import RepoSchema
46 from rhodecode.model.settings import SettingsModel, VcsSettingsModel
47 from rhodecode.model.validation_schema.schemas import repo_schema
48 48
49 49 log = logging.getLogger(__name__)
50 50
@@ -400,7 +400,8 b' def get_repo_changesets(request, apiuser'
400 400
401 401 @jsonrpc_method()
402 402 def get_repo_nodes(request, apiuser, repoid, revision, root_path,
403 ret_type=Optional('all'), details=Optional('basic')):
403 ret_type=Optional('all'), details=Optional('basic'),
404 max_file_bytes=Optional(None)):
404 405 """
405 406 Returns a list of nodes and children in a flat list for a given
406 407 path at given revision.
@@ -425,6 +426,8 b' def get_repo_nodes(request, apiuser, rep'
425 426 md5, binary, and or content. The valid options are ``basic`` and
426 427 ``full``.
427 428 :type details: Optional(str)
429 :param max_file_bytes: Only return file content under this file size bytes
430 :type details: Optional(int)
428 431
429 432 Example output:
430 433
@@ -472,7 +475,8 b' def get_repo_nodes(request, apiuser, rep'
472 475
473 476 _d, _f = ScmModel().get_nodes(
474 477 repo, revision, root_path, flat=False,
475 extended_info=extended_info, content=content)
478 extended_info=extended_info, content=content,
479 max_file_bytes=max_file_bytes)
476 480 _map = {
477 481 'all': _d + _f,
478 482 'files': _f,
@@ -606,7 +610,7 b' def create_repo(request, apiuser, repo_n'
606 610 }
607 611
608 612 """
609 schema = RepoSchema()
613 schema = repo_schema.RepoSchema()
610 614 try:
611 615 data = schema.deserialize({
612 616 'repo_name': repo_name
@@ -1310,8 +1314,6 b' def comment_commit('
1310 1314 userid=Optional(OAttr('apiuser')), status=Optional(None)):
1311 1315 """
1312 1316 Set a commit comment, and optionally change the status of the commit.
1313 This command can be executed only using api_key belonging to user
1314 with admin rights, or repository administrator.
1315 1317
1316 1318 :param apiuser: This is filled automatically from the |authtoken|.
1317 1319 :type apiuser: AuthUser
@@ -1344,7 +1346,7 b' def comment_commit('
1344 1346 """
1345 1347 repo = get_repo_or_error(repoid)
1346 1348 if not has_superadmin_permission(apiuser):
1347 _perms = ('repository.admin',)
1349 _perms = ('repository.read', 'repository.write', 'repository.admin')
1348 1350 has_repo_permissions(apiuser, repoid, repo, _perms)
1349 1351
1350 1352 if isinstance(userid, Optional):
@@ -1361,9 +1363,11 b' def comment_commit('
1361 1363 try:
1362 1364 rc_config = SettingsModel().get_all_settings()
1363 1365 renderer = rc_config.get('rhodecode_markup_renderer', 'rst')
1364
1366 status_change_label = ChangesetStatus.get_status_lbl(status)
1365 1367 comm = ChangesetCommentsModel().create(
1366 message, repo, user, revision=commit_id, status_change=status,
1368 message, repo, user, revision=commit_id,
1369 status_change=status_change_label,
1370 status_change_type=status,
1367 1371 renderer=renderer)
1368 1372 if status:
1369 1373 # also do a status change
@@ -1775,3 +1779,110 b' def strip(request, apiuser, repoid, revi'
1775 1779 'Unable to strip commit %s from repo `%s`' % (
1776 1780 revision, repo.repo_name)
1777 1781 )
1782
1783
1784 @jsonrpc_method()
1785 def get_repo_settings(request, apiuser, repoid, key=Optional(None)):
1786 """
1787 Returns all settings for a repository. If key is given it only returns the
1788 setting identified by the key or null.
1789
1790 :param apiuser: This is filled automatically from the |authtoken|.
1791 :type apiuser: AuthUser
1792 :param repoid: The repository name or repository id.
1793 :type repoid: str or int
1794 :param key: Key of the setting to return.
1795 :type: key: Optional(str)
1796
1797 Example output:
1798
1799 .. code-block:: bash
1800
1801 {
1802 "error": null,
1803 "id": 237,
1804 "result": {
1805 "extensions_largefiles": true,
1806 "hooks_changegroup_push_logger": true,
1807 "hooks_changegroup_repo_size": false,
1808 "hooks_outgoing_pull_logger": true,
1809 "phases_publish": "True",
1810 "rhodecode_hg_use_rebase_for_merging": true,
1811 "rhodecode_pr_merge_enabled": true,
1812 "rhodecode_use_outdated_comments": true
1813 }
1814 }
1815 """
1816
1817 # Restrict access to this api method to admins only.
1818 if not has_superadmin_permission(apiuser):
1819 raise JSONRPCForbidden()
1820
1821 try:
1822 repo = get_repo_or_error(repoid)
1823 settings_model = VcsSettingsModel(repo=repo)
1824 settings = settings_model.get_global_settings()
1825 settings.update(settings_model.get_repo_settings())
1826
1827 # If only a single setting is requested fetch it from all settings.
1828 key = Optional.extract(key)
1829 if key is not None:
1830 settings = settings.get(key, None)
1831 except Exception:
1832 msg = 'Failed to fetch settings for repository `{}`'.format(repoid)
1833 log.exception(msg)
1834 raise JSONRPCError(msg)
1835
1836 return settings
1837
1838
1839 @jsonrpc_method()
1840 def set_repo_settings(request, apiuser, repoid, settings):
1841 """
1842 Update repository settings. Returns true on success.
1843
1844 :param apiuser: This is filled automatically from the |authtoken|.
1845 :type apiuser: AuthUser
1846 :param repoid: The repository name or repository id.
1847 :type repoid: str or int
1848 :param settings: The new settings for the repository.
1849 :type: settings: dict
1850
1851 Example output:
1852
1853 .. code-block:: bash
1854
1855 {
1856 "error": null,
1857 "id": 237,
1858 "result": true
1859 }
1860 """
1861 # Restrict access to this api method to admins only.
1862 if not has_superadmin_permission(apiuser):
1863 raise JSONRPCForbidden()
1864
1865 if type(settings) is not dict:
1866 raise JSONRPCError('Settings have to be a JSON Object.')
1867
1868 try:
1869 settings_model = VcsSettingsModel(repo=repoid)
1870
1871 # Merge global, repo and incoming settings.
1872 new_settings = settings_model.get_global_settings()
1873 new_settings.update(settings_model.get_repo_settings())
1874 new_settings.update(settings)
1875
1876 # Update the settings.
1877 inherit_global_settings = new_settings.get(
1878 'inherit_global_settings', False)
1879 settings_model.create_or_update_repo_settings(
1880 new_settings, inherit_global_settings=inherit_global_settings)
1881 Session().commit()
1882 except Exception:
1883 msg = 'Failed to update settings for repository `{}`'.format(repoid)
1884 log.exception(msg)
1885 raise JSONRPCError(msg)
1886
1887 # Indicate success.
1888 return True
@@ -34,7 +34,7 b' from rhodecode.lib.auth import ('
34 34 from rhodecode.model.db import Session, RepoGroup
35 35 from rhodecode.model.repo_group import RepoGroupModel
36 36 from rhodecode.model.scm import RepoGroupList
37 from rhodecode.model.validation_schema import RepoGroupSchema
37 from rhodecode.model.validation_schema.schemas import repo_group_schema
38 38
39 39
40 40 log = logging.getLogger(__name__)
@@ -193,7 +193,7 b' def create_repo_group(request, apiuser, '
193 193
194 194 """
195 195
196 schema = RepoGroupSchema()
196 schema = repo_group_schema.RepoGroupSchema()
197 197 try:
198 198 data = schema.deserialize({
199 199 'group_name': group_name
@@ -490,20 +490,26 b' def loadplugin(plugin_id):'
490 490 or None on failure.
491 491 """
492 492 # TODO: Disusing pyramids thread locals to retrieve the registry.
493 authn_registry = get_current_registry().getUtility(IAuthnPluginRegistry)
493 authn_registry = get_authn_registry()
494 494 plugin = authn_registry.get_plugin(plugin_id)
495 495 if plugin is None:
496 496 log.error('Authentication plugin not found: "%s"', plugin_id)
497 497 return plugin
498 498
499 499
500 def get_authn_registry(registry=None):
501 registry = registry or get_current_registry()
502 authn_registry = registry.getUtility(IAuthnPluginRegistry)
503 return authn_registry
504
505
500 506 def get_auth_cache_manager(custom_ttl=None):
501 507 return caches.get_cache_manager(
502 508 'auth_plugins', 'rhodecode.authentication', custom_ttl)
503 509
504 510
505 511 def authenticate(username, password, environ=None, auth_type=None,
506 skip_missing=False):
512 skip_missing=False, registry=None):
507 513 """
508 514 Authentication function used for access control,
509 515 It tries to authenticate based on enabled authentication modules.
@@ -520,7 +526,7 b' def authenticate(username, password, env'
520 526 % auth_type)
521 527 headers_only = environ and not (username and password)
522 528
523 authn_registry = get_current_registry().getUtility(IAuthnPluginRegistry)
529 authn_registry = get_authn_registry(registry)
524 530 for plugin in authn_registry.get_plugins_for_authentication():
525 531 plugin.set_auth_type(auth_type)
526 532 user = plugin.get_user(username)
@@ -559,16 +565,16 b' def authenticate(username, password, env'
559 565 if isinstance(plugin.AUTH_CACHE_TTL, (int, long)):
560 566 # plugin cache set inside is more important than the settings value
561 567 _cache_ttl = plugin.AUTH_CACHE_TTL
562 elif plugin_settings.get('auth_cache_ttl'):
563 _cache_ttl = safe_int(plugin_settings.get('auth_cache_ttl'), 0)
568 elif plugin_settings.get('cache_ttl'):
569 _cache_ttl = safe_int(plugin_settings.get('cache_ttl'), 0)
564 570
565 571 plugin_cache_active = bool(_cache_ttl and _cache_ttl > 0)
566 572
567 573 # get instance of cache manager configured for a namespace
568 574 cache_manager = get_auth_cache_manager(custom_ttl=_cache_ttl)
569 575
570 log.debug('Cache for plugin `%s` active: %s', plugin.get_id(),
571 plugin_cache_active)
576 log.debug('AUTH_CACHE_TTL for plugin `%s` active: %s (TTL: %s)',
577 plugin.get_id(), plugin_cache_active, _cache_ttl)
572 578
573 579 # for environ based password can be empty, but then the validation is
574 580 # on the server that fills in the env data needed for authentication
@@ -581,8 +587,7 b' def authenticate(username, password, env'
581 587 # to RhodeCode database. If this function returns data
582 588 # then auth is correct.
583 589 start = time.time()
584 log.debug('Running plugin `%s` _authenticate method',
585 plugin.get_id())
590 log.debug('Running plugin `%s` _authenticate method', plugin.get_id())
586 591
587 592 def auth_func():
588 593 """
@@ -141,9 +141,9 b' class LdapSettingsSchema(AuthnPluginSett'
141 141 colander.String(),
142 142 default='',
143 143 description=_('LDAP Attribute to map to user name'),
144 missing_msg=_('The LDAP Login attribute of the CN must be specified'),
145 144 preparer=strip_whitespace,
146 145 title=_('Login Attribute'),
146 missing_msg=_('The LDAP Login attribute of the CN must be specified'),
147 147 widget='string')
148 148 attr_firstname = colander.SchemaNode(
149 149 colander.String(),
@@ -186,6 +186,7 b' class AuthLdap(object):'
186 186 if ldap == Missing:
187 187 raise LdapImportError("Missing or incompatible ldap library")
188 188
189 self.debug = False
189 190 self.ldap_version = ldap_version
190 191 self.ldap_server_type = 'ldap'
191 192
@@ -213,6 +214,8 b' class AuthLdap(object):'
213 214 self.LDAP_FILTER = safe_str(ldap_filter)
214 215
215 216 def _get_ldap_server(self):
217 if self.debug:
218 ldap.set_option(ldap.OPT_DEBUG_LEVEL, 255)
216 219 if hasattr(ldap, 'OPT_X_TLS_CACERTDIR'):
217 220 ldap.set_option(ldap.OPT_X_TLS_CACERTDIR,
218 221 '/etc/openldap/cacerts')
@@ -137,5 +137,7 b' class RhodeCodeAuthPlugin(RhodeCodeAuthP'
137 137 "authenticating on this plugin", userobj)
138 138 return None
139 139 else:
140 log.warning('user %s tried auth but is disabled', userobj)
140 log.warning(
141 'user `%s` failed to authenticate via %s, reason: account not '
142 'active.', username, self.name)
141 143 return None
@@ -83,13 +83,17 b' class RhodeCodeAuthPlugin(RhodeCodeAuthP'
83 83 allowed_auth_plugins=None, allowed_auth_sources=None):
84 84 """
85 85 Custom method for this auth that doesn't accept empty users. And also
86 allows rhodecode and authtoken extern_type to auth with this. But only
87 via vcs mode
86 allows users from all other active plugins to use it and also
87 authenticate against it. But only via vcs mode
88 88 """
89 # only this and rhodecode plugins can use this type
90 from rhodecode.authentication.plugins import auth_rhodecode
91 allowed_auth_plugins = [
92 self.name, auth_rhodecode.RhodeCodeAuthPlugin.name]
89 from rhodecode.authentication.base import get_authn_registry
90 authn_registry = get_authn_registry()
91
92 active_plugins = set(
93 [x.name for x in authn_registry.get_plugins_for_authentication()])
94 active_plugins.discard(self.name)
95
96 allowed_auth_plugins = [self.name] + list(active_plugins)
93 97 # only for vcs operations
94 98 allowed_auth_sources = [VCS_TYPE]
95 99
@@ -26,8 +26,8 b' from pyramid.httpexceptions import HTTPF'
26 26 from pyramid.renderers import render
27 27 from pyramid.response import Response
28 28
29 from rhodecode.authentication.base import get_auth_cache_manager
30 from rhodecode.authentication.interface import IAuthnPluginRegistry
29 from rhodecode.authentication.base import (
30 get_auth_cache_manager, get_authn_registry)
31 31 from rhodecode.lib import auth
32 32 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
33 33 from rhodecode.model.forms import AuthSettingsForm
@@ -96,7 +96,7 b' class AuthnPluginViewBase(object):'
96 96 # Store validated data.
97 97 for name, value in valid_data.items():
98 98 self.plugin.create_or_update_setting(name, value)
99 Session.commit()
99 Session().commit()
100 100
101 101 # Display success message and redirect.
102 102 self.request.session.flash(
@@ -125,7 +125,7 b' class AuthSettingsView(object):'
125 125 @HasPermissionAllDecorator('hg.admin')
126 126 def index(self, defaults=None, errors=None, prefix_error=False):
127 127 defaults = defaults or {}
128 authn_registry = self.request.registry.getUtility(IAuthnPluginRegistry)
128 authn_registry = get_authn_registry(self.request.registry)
129 129 enabled_plugins = SettingsModel().get_auth_plugins()
130 130
131 131 # Create template context and render it.
@@ -30,36 +30,6 b' from rhodecode.lib.utils2 import __get_l'
30 30 # extensions will index it's content
31 31 LANGUAGES_EXTENSIONS_MAP = __get_lem()
32 32
33 # list of readme files to search in file tree and display in summary
34 # attached weights defines the search order lower is first
35 ALL_READMES = [
36 ('readme', 0), ('README', 0), ('Readme', 0),
37 ('doc/readme', 1), ('doc/README', 1), ('doc/Readme', 1),
38 ('Docs/readme', 2), ('Docs/README', 2), ('Docs/Readme', 2),
39 ('DOCS/readme', 2), ('DOCS/README', 2), ('DOCS/Readme', 2),
40 ('docs/readme', 2), ('docs/README', 2), ('docs/Readme', 2),
41 ]
42
43 # extension together with weights to search lower is first
44 RST_EXTS = [
45 ('', 0), ('.rst', 1), ('.rest', 1),
46 ('.RST', 2), ('.REST', 2)
47 ]
48
49 MARKDOWN_EXTS = [
50 ('.md', 1), ('.MD', 1),
51 ('.mkdn', 2), ('.MKDN', 2),
52 ('.mdown', 3), ('.MDOWN', 3),
53 ('.markdown', 4), ('.MARKDOWN', 4)
54 ]
55
56 PLAIN_EXTS = [
57 ('.text', 2), ('.TEXT', 2),
58 ('.txt', 3), ('.TXT', 3)
59 ]
60
61 ALL_EXTS = MARKDOWN_EXTS + RST_EXTS + PLAIN_EXTS
62
63 33 DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
64 34
65 35 DATE_FORMAT = "%Y-%m-%d"
@@ -34,11 +34,16 b' from pylons.configuration import PylonsC'
34 34 from pylons.error import handle_mako_error
35 35 from pyramid.settings import asbool
36 36
37 # don't remove this import it does magic for celery
38 from rhodecode.lib import celerypylons # noqa
37 # ------------------------------------------------------------------------------
38 # CELERY magic until refactor - issue #4163 - import order matters here:
39 from rhodecode.lib import celerypylons # this must be first, celerypylons
40 # sets config settings upon import
39 41
40 import rhodecode.lib.app_globals as app_globals
42 import rhodecode.integrations # any modules using celery task
43 # decorators should be added afterwards:
44 # ------------------------------------------------------------------------------
41 45
46 from rhodecode.lib import app_globals
42 47 from rhodecode.config import utils
43 48 from rhodecode.config.routing import make_map
44 49 from rhodecode.config.jsroutes import generate_jsroutes_content
@@ -112,25 +117,12 b' def load_environment(global_conf, app_co'
112 117 # sets the c attribute access when don't existing attribute are accessed
113 118 config['pylons.strict_tmpl_context'] = True
114 119
115 # Limit backends to "vcs.backends" from configuration
116 backends = config['vcs.backends'] = aslist(
117 config.get('vcs.backends', 'hg,git'), sep=',')
118 for alias in rhodecode.BACKENDS.keys():
119 if alias not in backends:
120 del rhodecode.BACKENDS[alias]
121 log.info("Enabled backends: %s", backends)
122
123 # initialize vcs client and optionally run the server if enabled
124 vcs_server_uri = config.get('vcs.server', '')
125 vcs_server_enabled = str2bool(config.get('vcs.server.enable', 'true'))
126 start_server = (
127 str2bool(config.get('vcs.start_server', 'false')) and
128 not int(os.environ.get('RC_VCSSERVER_TEST_DISABLE', '0')))
129 if vcs_server_enabled and start_server:
130 log.info("Starting vcsserver")
131 start_vcs_server(server_and_port=vcs_server_uri,
132 protocol=utils.get_vcs_server_protocol(config),
133 log_level=config['vcs.server.log_level'])
120 # configure channelstream
121 config['channelstream_config'] = {
122 'enabled': asbool(config.get('channelstream.enabled', False)),
123 'server': config.get('channelstream.server'),
124 'secret': config.get('channelstream.secret')
125 }
134 126
135 127 set_available_permissions(config)
136 128 db_cfg = make_db_config(clear_session=True)
@@ -138,9 +130,6 b' def load_environment(global_conf, app_co'
138 130 repos_path = list(db_cfg.items('paths'))[0][1]
139 131 config['base_path'] = repos_path
140 132
141 config['vcs.hooks.direct_calls'] = _use_direct_hook_calls(config)
142 config['vcs.hooks.protocol'] = _get_vcs_hooks_protocol(config)
143
144 133 # store db config also in main global CONFIG
145 134 set_rhodecode_config(config)
146 135
@@ -153,34 +142,17 b' def load_environment(global_conf, app_co'
153 142 # store config reference into our module to skip import magic of pylons
154 143 rhodecode.CONFIG.update(config)
155 144
156 utils.configure_pyro4(config)
157 utils.configure_vcs(config)
158 if vcs_server_enabled:
159 connect_vcs(vcs_server_uri, utils.get_vcs_server_protocol(config))
160
161 import_on_startup = str2bool(config.get('startup.import_repos', False))
162 if vcs_server_enabled and import_on_startup:
163 repo2db_mapper(ScmModel().repo_scan(repos_path), remove_obsolete=False)
164 145 return config
165 146
166 147
167 def _use_direct_hook_calls(config):
168 default_direct_hook_calls = 'false'
169 direct_hook_calls = str2bool(
170 config.get('vcs.hooks.direct_calls', default_direct_hook_calls))
171 return direct_hook_calls
172
173
174 def _get_vcs_hooks_protocol(config):
175 protocol = config.get('vcs.hooks.protocol', 'pyro4').lower()
176 return protocol
177
178
179 148 def load_pyramid_environment(global_config, settings):
180 149 # Some parts of the code expect a merge of global and app settings.
181 150 settings_merged = global_config.copy()
182 151 settings_merged.update(settings)
183 152
153 # Store the settings to make them available to other modules.
154 rhodecode.PYRAMID_SETTINGS = settings_merged
155
184 156 # If this is a test run we prepare the test environment like
185 157 # creating a test database, test search index and test repositories.
186 158 # This has to be done before the database connection is initialized.
@@ -190,3 +162,27 b' def load_pyramid_environment(global_conf'
190 162
191 163 # Initialize the database connection.
192 164 utils.initialize_database(settings_merged)
165
166 # Limit backends to `vcs.backends` from configuration
167 for alias in rhodecode.BACKENDS.keys():
168 if alias not in settings['vcs.backends']:
169 del rhodecode.BACKENDS[alias]
170 log.info('Enabled VCS backends: %s', rhodecode.BACKENDS.keys())
171
172 # initialize vcs client and optionally run the server if enabled
173 vcs_server_uri = settings['vcs.server']
174 vcs_server_enabled = settings['vcs.server.enable']
175 start_server = (
176 settings['vcs.start_server'] and
177 not int(os.environ.get('RC_VCSSERVER_TEST_DISABLE', '0')))
178
179 if vcs_server_enabled and start_server:
180 log.info("Starting vcsserver")
181 start_vcs_server(server_and_port=vcs_server_uri,
182 protocol=utils.get_vcs_server_protocol(settings),
183 log_level=settings['vcs.server.log_level'])
184
185 utils.configure_pyro4(settings)
186 utils.configure_vcs(settings)
187 if vcs_server_enabled:
188 connect_vcs(vcs_server_uri, utils.get_vcs_server_protocol(settings))
@@ -22,23 +22,25 b''
22 22 Pylons middleware initialization
23 23 """
24 24 import logging
25 from collections import OrderedDict
25 26
26 27 from paste.registry import RegistryManager
27 28 from paste.gzipper import make_gzip_middleware
28 29 from pylons.wsgiapp import PylonsApp
29 30 from pyramid.authorization import ACLAuthorizationPolicy
30 31 from pyramid.config import Configurator
31 from pyramid.static import static_view
32 32 from pyramid.settings import asbool, aslist
33 33 from pyramid.wsgi import wsgiapp
34 from pyramid.httpexceptions import HTTPError, HTTPInternalServerError
34 from pyramid.httpexceptions import HTTPError, HTTPInternalServerError, HTTPFound
35 from pyramid.events import ApplicationCreated
35 36 import pyramid.httpexceptions as httpexceptions
36 from pyramid.renderers import render_to_response, render
37 from pyramid.renderers import render_to_response
37 38 from routes.middleware import RoutesMiddleware
38 39 import routes.util
39 40
40 41 import rhodecode
41 42 from rhodecode.config import patches
43 from rhodecode.config.routing import STATIC_FILE_PREFIX
42 44 from rhodecode.config.environment import (
43 45 load_environment, load_pyramid_environment)
44 46 from rhodecode.lib.middleware import csrf
@@ -47,24 +49,45 b' from rhodecode.lib.middleware.disable_vc'
47 49 from rhodecode.lib.middleware.https_fixup import HttpsFixup
48 50 from rhodecode.lib.middleware.vcs import VCSMiddleware
49 51 from rhodecode.lib.plugins.utils import register_rhodecode_plugin
52 from rhodecode.lib.utils2 import aslist as rhodecode_aslist
53 from rhodecode.subscribers import scan_repositories_if_enabled
50 54
51 55
52 56 log = logging.getLogger(__name__)
53 57
54 58
55 def make_app(global_conf, full_stack=True, static_files=True, **app_conf):
59 # this is used to avoid avoid the route lookup overhead in routesmiddleware
60 # for certain routes which won't go to pylons to - eg. static files, debugger
61 # it is only needed for the pylons migration and can be removed once complete
62 class SkippableRoutesMiddleware(RoutesMiddleware):
63 """ Routes middleware that allows you to skip prefixes """
64
65 def __init__(self, *args, **kw):
66 self.skip_prefixes = kw.pop('skip_prefixes', [])
67 super(SkippableRoutesMiddleware, self).__init__(*args, **kw)
68
69 def __call__(self, environ, start_response):
70 for prefix in self.skip_prefixes:
71 if environ['PATH_INFO'].startswith(prefix):
72 # added to avoid the case when a missing /_static route falls
73 # through to pylons and causes an exception as pylons is
74 # expecting wsgiorg.routingargs to be set in the environ
75 # by RoutesMiddleware.
76 if 'wsgiorg.routing_args' not in environ:
77 environ['wsgiorg.routing_args'] = (None, {})
78 return self.app(environ, start_response)
79
80 return super(SkippableRoutesMiddleware, self).__call__(
81 environ, start_response)
82
83
84 def make_app(global_conf, static_files=True, **app_conf):
56 85 """Create a Pylons WSGI application and return it
57 86
58 87 ``global_conf``
59 88 The inherited configuration for this application. Normally from
60 89 the [DEFAULT] section of the Paste ini file.
61 90
62 ``full_stack``
63 Whether or not this application provides a full WSGI stack (by
64 default, meaning it handles its own exceptions and errors).
65 Disable full_stack when this application is "managed" by
66 another WSGI middleware.
67
68 91 ``app_conf``
69 92 The application's local configuration. Normally specified in
70 93 the [app:<name>] section of the Paste ini file (where <name>
@@ -89,16 +112,6 b' def make_app(global_conf, full_stack=Tru'
89 112 app = csrf.OriginChecker(app, expected_origin,
90 113 skip_urls=[routes.util.url_for('api')])
91 114
92
93 if asbool(full_stack):
94
95 # Appenlight monitoring and error handler
96 app, appenlight_client = wrap_in_appenlight_if_enabled(app, config)
97
98 # we want our low level middleware to get to the request ASAP. We don't
99 # need any pylons stack middleware in them
100 app = VCSMiddleware(app, config, appenlight_client)
101
102 115 # Establish the Registry for this application
103 116 app = RegistryManager(app)
104 117
@@ -140,13 +153,78 b' def make_pyramid_app(global_config, **se'
140 153
141 154 load_pyramid_environment(global_config, settings)
142 155
156 includeme_first(config)
143 157 includeme(config)
144 includeme_last(config)
145 158 pyramid_app = config.make_wsgi_app()
146 159 pyramid_app = wrap_app_in_wsgi_middlewares(pyramid_app, config)
160 pyramid_app.config = config
147 161 return pyramid_app
148 162
149 163
164 def make_not_found_view(config):
165 """
166 This creates the view which should be registered as not-found-view to
167 pyramid. Basically it contains of the old pylons app, converted to a view.
168 Additionally it is wrapped by some other middlewares.
169 """
170 settings = config.registry.settings
171 vcs_server_enabled = settings['vcs.server.enable']
172
173 # Make pylons app from unprepared settings.
174 pylons_app = make_app(
175 config.registry._pylons_compat_global_config,
176 **config.registry._pylons_compat_settings)
177 config.registry._pylons_compat_config = pylons_app.config
178
179 # Appenlight monitoring.
180 pylons_app, appenlight_client = wrap_in_appenlight_if_enabled(
181 pylons_app, settings)
182
183 # The VCSMiddleware shall operate like a fallback if pyramid doesn't find
184 # a view to handle the request. Therefore we wrap it around the pylons app.
185 if vcs_server_enabled:
186 pylons_app = VCSMiddleware(
187 pylons_app, settings, appenlight_client, registry=config.registry)
188
189 pylons_app_as_view = wsgiapp(pylons_app)
190
191 # Protect from VCS Server error related pages when server is not available
192 if not vcs_server_enabled:
193 pylons_app_as_view = DisableVCSPagesWrapper(pylons_app_as_view)
194
195 def pylons_app_with_error_handler(context, request):
196 """
197 Handle exceptions from rc pylons app:
198
199 - old webob type exceptions get converted to pyramid exceptions
200 - pyramid exceptions are passed to the error handler view
201 """
202 def is_vcs_response(response):
203 return 'X-RhodeCode-Backend' in response.headers
204
205 def is_http_error(response):
206 # webob type error responses
207 return (400 <= response.status_int <= 599)
208
209 def is_error_handling_needed(response):
210 return is_http_error(response) and not is_vcs_response(response)
211
212 try:
213 response = pylons_app_as_view(context, request)
214 if is_error_handling_needed(response):
215 response = webob_to_pyramid_http_response(response)
216 return error_handler(response, request)
217 except HTTPError as e: # pyramid type exceptions
218 return error_handler(e, request)
219 except Exception:
220 if settings.get('debugtoolbar.enabled', False):
221 raise
222 return error_handler(HTTPInternalServerError(), request)
223 return response
224
225 return pylons_app_with_error_handler
226
227
150 228 def add_pylons_compat_data(registry, global_config, settings):
151 229 """
152 230 Attach data to the registry to support the Pylons integration.
@@ -205,20 +283,32 b' def error_handler(exception, request):'
205 283 def includeme(config):
206 284 settings = config.registry.settings
207 285
286 # plugin information
287 config.registry.rhodecode_plugins = OrderedDict()
288
289 config.add_directive(
290 'register_rhodecode_plugin', register_rhodecode_plugin)
291
208 292 if asbool(settings.get('appenlight', 'false')):
209 293 config.include('appenlight_client.ext.pyramid_tween')
210 294
211 295 # Includes which are required. The application would fail without them.
212 296 config.include('pyramid_mako')
213 297 config.include('pyramid_beaker')
298 config.include('rhodecode.channelstream')
214 299 config.include('rhodecode.admin')
215 300 config.include('rhodecode.authentication')
301 config.include('rhodecode.integrations')
216 302 config.include('rhodecode.login')
217 303 config.include('rhodecode.tweens')
218 304 config.include('rhodecode.api')
305 config.include('rhodecode.svn_support')
219 306 config.add_route(
220 307 'rhodecode_support', 'https://rhodecode.com/help/', static=True)
221 308
309 # Add subscribers.
310 config.add_subscriber(scan_repositories_if_enabled, ApplicationCreated)
311
222 312 # Set the authorization policy.
223 313 authz_policy = ACLAuthorizationPolicy()
224 314 config.set_authorization_policy(authz_policy)
@@ -226,86 +316,37 b' def includeme(config):'
226 316 # Set the default renderer for HTML templates to mako.
227 317 config.add_mako_renderer('.html')
228 318
229 # plugin information
230 config.registry.rhodecode_plugins = {}
231
232 config.add_directive(
233 'register_rhodecode_plugin', register_rhodecode_plugin)
234 319 # include RhodeCode plugins
235 320 includes = aslist(settings.get('rhodecode.includes', []))
236 321 for inc in includes:
237 322 config.include(inc)
238 323
239 pylons_app = make_app(
240 config.registry._pylons_compat_global_config,
241 **config.registry._pylons_compat_settings)
242 config.registry._pylons_compat_config = pylons_app.config
243
244 pylons_app_as_view = wsgiapp(pylons_app)
245
246 # Protect from VCS Server error related pages when server is not available
247 vcs_server_enabled = asbool(settings.get('vcs.server.enable', 'true'))
248 if not vcs_server_enabled:
249 pylons_app_as_view = DisableVCSPagesWrapper(pylons_app_as_view)
250
251
252 def pylons_app_with_error_handler(context, request):
253 """
254 Handle exceptions from rc pylons app:
255
256 - old webob type exceptions get converted to pyramid exceptions
257 - pyramid exceptions are passed to the error handler view
258 """
259 try:
260 response = pylons_app_as_view(context, request)
261 if 400 <= response.status_int <= 599: # webob type error responses
262 return error_handler(
263 webob_to_pyramid_http_response(response), request)
264 except HTTPError as e: # pyramid type exceptions
265 return error_handler(e, request)
266 except Exception:
267 if settings.get('debugtoolbar.enabled', False):
268 raise
269 return error_handler(HTTPInternalServerError(), request)
270 return response
271
272 324 # This is the glue which allows us to migrate in chunks. By registering the
273 325 # pylons based application as the "Not Found" view in Pyramid, we will
274 326 # fallback to the old application each time the new one does not yet know
275 327 # how to handle a request.
276 config.add_notfound_view(pylons_app_with_error_handler)
328 config.add_notfound_view(make_not_found_view(config))
277 329
278 if settings.get('debugtoolbar.enabled', False):
279 # if toolbar, then only http type exceptions get caught and rendered
280 ExcClass = HTTPError
281 else:
330 if not settings.get('debugtoolbar.enabled', False):
282 331 # if no toolbar, then any exception gets caught and rendered
283 ExcClass = Exception
284 config.add_view(error_handler, context=ExcClass)
332 config.add_view(error_handler, context=Exception)
333
334 config.add_view(error_handler, context=HTTPError)
285 335
286 336
287 def includeme_last(config):
288 """
289 The static file catchall needs to be last in the view configuration.
290 """
291 settings = config.registry.settings
337 def includeme_first(config):
338 # redirect automatic browser favicon.ico requests to correct place
339 def favicon_redirect(context, request):
340 return HTTPFound(
341 request.static_path('rhodecode:public/images/favicon.ico'))
292 342
293 # Note: johbo: I would prefer to register a prefix for static files at some
294 # point, e.g. move them under '_static/'. This would fully avoid that we
295 # can have name clashes with a repository name. Imaging someone calling his
296 # repo "css" ;-) Also having an external web server to serve out the static
297 # files seems to be easier to set up if they have a common prefix.
298 #
299 # Example: config.add_static_view('_static', path='rhodecode:public')
300 #
301 # It might be an option to register both paths for a while and then migrate
302 # over to the new location.
343 config.add_view(favicon_redirect, route_name='favicon')
344 config.add_route('favicon', '/favicon.ico')
303 345
304 # Serving static files with a catchall.
305 if settings['static_files']:
306 config.add_route('catchall_static', '/*subpath')
307 config.add_view(
308 static_view('rhodecode:public'), route_name='catchall_static')
346 config.add_static_view(
347 '_static/deform', 'deform:static')
348 config.add_static_view(
349 '_static/rhodecode', path='rhodecode:public', cache_max_age=3600 * 24)
309 350
310 351
311 352 def wrap_app_in_wsgi_middlewares(pyramid_app, config):
@@ -322,19 +363,14 b' def wrap_app_in_wsgi_middlewares(pyramid'
322 363 pyramid_app = HttpsFixup(pyramid_app, settings)
323 364
324 365 # Add RoutesMiddleware to support the pylons compatibility tween during
325
326 366 # migration to pyramid.
327 pyramid_app = RoutesMiddleware(
328 pyramid_app, config.registry._pylons_compat_config['routes.map'])
367 pyramid_app = SkippableRoutesMiddleware(
368 pyramid_app, config.registry._pylons_compat_config['routes.map'],
369 skip_prefixes=(STATIC_FILE_PREFIX, '/_debug_toolbar'))
329 370
330 if asbool(settings.get('appenlight', 'false')):
331 pyramid_app, _ = wrap_in_appenlight_if_enabled(
332 pyramid_app, config.registry._pylons_compat_config)
371 pyramid_app, _ = wrap_in_appenlight_if_enabled(pyramid_app, settings)
333 372
334 # TODO: johbo: Don't really see why we enable the gzip middleware when
335 # serving static files, might be something that should have its own setting
336 # as well?
337 if settings['static_files']:
373 if settings['gzip_responses']:
338 374 pyramid_app = make_gzip_middleware(
339 375 pyramid_app, settings, compress_level=1)
340 376
@@ -376,12 +412,63 b' def sanitize_settings_and_apply_defaults'
376 412 # should allow to pass in a prefix.
377 413 settings.setdefault('rhodecode.api.url', '/_admin/api')
378 414
379 _bool_setting(settings, 'vcs.server.enable', 'true')
380 _bool_setting(settings, 'static_files', 'true')
415 # Sanitize generic settings.
416 _list_setting(settings, 'default_encoding', 'UTF-8')
381 417 _bool_setting(settings, 'is_test', 'false')
418 _bool_setting(settings, 'gzip_responses', 'false')
419
420 # Call split out functions that sanitize settings for each topic.
421 _sanitize_appenlight_settings(settings)
422 _sanitize_vcs_settings(settings)
382 423
383 424 return settings
384 425
385 426
427 def _sanitize_appenlight_settings(settings):
428 _bool_setting(settings, 'appenlight', 'false')
429
430
431 def _sanitize_vcs_settings(settings):
432 """
433 Applies settings defaults and does type conversion for all VCS related
434 settings.
435 """
436 _string_setting(settings, 'vcs.svn.compatible_version', '')
437 _string_setting(settings, 'git_rev_filter', '--all')
438 _string_setting(settings, 'vcs.hooks.protocol', 'pyro4')
439 _string_setting(settings, 'vcs.server', '')
440 _string_setting(settings, 'vcs.server.log_level', 'debug')
441 _string_setting(settings, 'vcs.server.protocol', 'pyro4')
442 _bool_setting(settings, 'startup.import_repos', 'false')
443 _bool_setting(settings, 'vcs.hooks.direct_calls', 'false')
444 _bool_setting(settings, 'vcs.server.enable', 'true')
445 _bool_setting(settings, 'vcs.start_server', 'false')
446 _list_setting(settings, 'vcs.backends', 'hg, git, svn')
447 _int_setting(settings, 'vcs.connection_timeout', 3600)
448
449
450 def _int_setting(settings, name, default):
451 settings[name] = int(settings.get(name, default))
452
453
386 454 def _bool_setting(settings, name, default):
387 settings[name] = asbool(settings.get(name, default))
455 input = settings.get(name, default)
456 if isinstance(input, unicode):
457 input = input.encode('utf8')
458 settings[name] = asbool(input)
459
460
461 def _list_setting(settings, name, default):
462 raw_value = settings.get(name, default)
463
464 old_separator = ','
465 if old_separator in raw_value:
466 # If we get a comma separated list, pass it to our own function.
467 settings[name] = rhodecode_aslist(raw_value, sep=old_separator)
468 else:
469 # Otherwise we assume it uses pyramids space/newline separation.
470 settings[name] = aslist(raw_value)
471
472
473 def _string_setting(settings, name, default):
474 settings[name] = settings.get(name, default).lower()
@@ -36,6 +36,7 b' from rhodecode.config import routing_lin'
36 36
37 37 # prefix for non repository related links needs to be prefixed with `/`
38 38 ADMIN_PREFIX = '/_admin'
39 STATIC_FILE_PREFIX = '/_static'
39 40
40 41 # Default requirements for URL parts
41 42 URL_NAME_REQUIREMENTS = {
@@ -51,6 +52,19 b' URL_NAME_REQUIREMENTS = {'
51 52 }
52 53
53 54
55 def add_route_requirements(route_path, requirements):
56 """
57 Adds regex requirements to pyramid routes using a mapping dict
58
59 >>> add_route_requirements('/{action}/{id}', {'id': r'\d+'})
60 '/{action}/{id:\d+}'
61
62 """
63 for key, regex in requirements.items():
64 route_path = route_path.replace('{%s}' % key, '{%s:%s}' % (key, regex))
65 return route_path
66
67
54 68 class JSRoutesMapper(Mapper):
55 69 """
56 70 Wrapper for routes.Mapper to make pyroutes compatible url definitions
@@ -546,6 +560,13 b' def make_map(config):'
546 560 action='my_account_auth_tokens_add', conditions={'method': ['POST']})
547 561 m.connect('my_account_auth_tokens', '/my_account/auth_tokens',
548 562 action='my_account_auth_tokens_delete', conditions={'method': ['DELETE']})
563 m.connect('my_account_notifications', '/my_account/notifications',
564 action='my_notifications',
565 conditions={'method': ['GET']})
566 m.connect('my_account_notifications_toggle_visibility',
567 '/my_account/toggle_visibility',
568 action='my_notifications_toggle_visibility',
569 conditions={'method': ['POST']})
549 570
550 571 # NOTIFICATION REST ROUTES
551 572 with rmap.submapper(path_prefix=ADMIN_PREFIX,
@@ -554,7 +575,6 b' def make_map(config):'
554 575 action='index', conditions={'method': ['GET']})
555 576 m.connect('notifications_mark_all_read', '/notifications/mark_all_read',
556 577 action='mark_all_read', conditions={'method': ['POST']})
557
558 578 m.connect('/notifications/{notification_id}',
559 579 action='update', conditions={'method': ['PUT']})
560 580 m.connect('/notifications/{notification_id}',
@@ -850,7 +870,7 b' def make_map(config):'
850 870 conditions={'function': check_repo, 'method': ['DELETE']},
851 871 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
852 872
853 rmap.connect('changeset_info', '/changeset_info/{repo_name}/{revision}',
873 rmap.connect('changeset_info', '/{repo_name}/changeset_info/{revision}',
854 874 controller='changeset', action='changeset_info',
855 875 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
856 876
@@ -1090,9 +1110,9 b' def make_map(config):'
1090 1110 conditions={'function': check_repo},
1091 1111 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
1092 1112
1093 rmap.connect('files_metadata_list_home',
1094 '/{repo_name}/metadata_list/{revision}/{f_path}',
1095 controller='files', action='metadata_list',
1113 rmap.connect('files_nodetree_full',
1114 '/{repo_name}/nodetree_full/{commit_id}/{f_path}',
1115 controller='files', action='nodetree_full',
1096 1116 conditions={'function': check_repo},
1097 1117 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
1098 1118
@@ -49,22 +49,18 b' def configure_vcs(config):'
49 49 Patch VCS config with some RhodeCode specific stuff
50 50 """
51 51 from rhodecode.lib.vcs import conf
52 from rhodecode.lib.utils2 import aslist
53 52 conf.settings.BACKENDS = {
54 53 'hg': 'rhodecode.lib.vcs.backends.hg.MercurialRepository',
55 54 'git': 'rhodecode.lib.vcs.backends.git.GitRepository',
56 55 'svn': 'rhodecode.lib.vcs.backends.svn.SubversionRepository',
57 56 }
58 57
59 conf.settings.HG_USE_REBASE_FOR_MERGING = config.get(
60 'rhodecode_hg_use_rebase_for_merging', False)
61 conf.settings.GIT_REV_FILTER = shlex.split(
62 config.get('git_rev_filter', '--all').strip())
63 conf.settings.DEFAULT_ENCODINGS = aslist(config.get('default_encoding',
64 'UTF-8'), sep=',')
65 conf.settings.ALIASES[:] = config.get('vcs.backends')
66 conf.settings.SVN_COMPATIBLE_VERSION = config.get(
67 'vcs.svn.compatible_version')
58 conf.settings.HOOKS_PROTOCOL = config['vcs.hooks.protocol']
59 conf.settings.HOOKS_DIRECT_CALLS = config['vcs.hooks.direct_calls']
60 conf.settings.GIT_REV_FILTER = shlex.split(config['git_rev_filter'])
61 conf.settings.DEFAULT_ENCODINGS = config['default_encoding']
62 conf.settings.ALIASES[:] = config['vcs.backends']
63 conf.settings.SVN_COMPATIBLE_VERSION = config['vcs.svn.compatible_version']
68 64
69 65
70 66 def initialize_database(config):
@@ -90,8 +86,7 b' def initialize_test_environment(settings'
90 86
91 87
92 88 def get_vcs_server_protocol(config):
93 protocol = config.get('vcs.server.protocol', 'pyro4')
94 return protocol
89 return config['vcs.server.protocol']
95 90
96 91
97 92 def set_instance_id(config):
@@ -25,15 +25,18 b' gist controller for RhodeCode'
25 25
26 26 import time
27 27 import logging
28 import traceback
28
29 29 import formencode
30 import peppercorn
30 31 from formencode import htmlfill
31 32
32 33 from pylons import request, response, tmpl_context as c, url
33 34 from pylons.controllers.util import abort, redirect
34 35 from pylons.i18n.translation import _
36 from webob.exc import HTTPNotFound, HTTPForbidden
37 from sqlalchemy.sql.expression import or_
35 38
36 from rhodecode.model.forms import GistForm
39
37 40 from rhodecode.model.gist import GistModel
38 41 from rhodecode.model.meta import Session
39 42 from rhodecode.model.db import Gist, User
@@ -44,9 +47,10 b' from rhodecode.lib.auth import LoginRequ'
44 47 from rhodecode.lib.utils import jsonify
45 48 from rhodecode.lib.utils2 import safe_str, safe_int, time_to_datetime
46 49 from rhodecode.lib.ext_json import json
47 from webob.exc import HTTPNotFound, HTTPForbidden
48 from sqlalchemy.sql.expression import or_
49 50 from rhodecode.lib.vcs.exceptions import VCSError, NodeNotChangedError
51 from rhodecode.model import validation_schema
52 from rhodecode.model.validation_schema.schemas import gist_schema
53
50 54
51 55 log = logging.getLogger(__name__)
52 56
@@ -56,11 +60,11 b' class GistsController(BaseController):'
56 60
57 61 def __load_defaults(self, extra_values=None):
58 62 c.lifetime_values = [
59 (str(-1), _('forever')),
60 (str(5), _('5 minutes')),
61 (str(60), _('1 hour')),
62 (str(60 * 24), _('1 day')),
63 (str(60 * 24 * 30), _('1 month')),
63 (-1, _('forever')),
64 (5, _('5 minutes')),
65 (60, _('1 hour')),
66 (60 * 24, _('1 day')),
67 (60 * 24 * 30, _('1 month')),
64 68 ]
65 69 if extra_values:
66 70 c.lifetime_values.append(extra_values)
@@ -136,40 +140,56 b' class GistsController(BaseController):'
136 140 """POST /admin/gists: Create a new item"""
137 141 # url('gists')
138 142 self.__load_defaults()
139 gist_form = GistForm([x[0] for x in c.lifetime_values],
140 [x[0] for x in c.acl_options])()
143
144 data = dict(request.POST)
145 data['filename'] = data.get('filename') or Gist.DEFAULT_FILENAME
146 data['nodes'] = [{
147 'filename': data['filename'],
148 'content': data.get('content'),
149 'mimetype': data.get('mimetype') # None is autodetect
150 }]
151
152 data['gist_type'] = (
153 Gist.GIST_PUBLIC if data.get('public') else Gist.GIST_PRIVATE)
154 data['gist_acl_level'] = (
155 data.get('gist_acl_level') or Gist.ACL_LEVEL_PRIVATE)
156
157 schema = gist_schema.GistSchema().bind(
158 lifetime_options=[x[0] for x in c.lifetime_values])
159
141 160 try:
142 form_result = gist_form.to_python(dict(request.POST))
143 # TODO: multiple files support, from the form
144 filename = form_result['filename'] or Gist.DEFAULT_FILENAME
145 nodes = {
146 filename: {
147 'content': form_result['content'],
148 'lexer': form_result['mimetype'] # None is autodetect
149 }
150 }
151 _public = form_result['public']
152 gist_type = Gist.GIST_PUBLIC if _public else Gist.GIST_PRIVATE
153 gist_acl_level = form_result.get(
154 'acl_level', Gist.ACL_LEVEL_PRIVATE)
161
162 schema_data = schema.deserialize(data)
163 # convert to safer format with just KEYs so we sure no duplicates
164 schema_data['nodes'] = gist_schema.sequence_to_nodes(
165 schema_data['nodes'])
166
155 167 gist = GistModel().create(
156 description=form_result['description'],
168 gist_id=schema_data['gistid'], # custom access id not real ID
169 description=schema_data['description'],
157 170 owner=c.rhodecode_user.user_id,
158 gist_mapping=nodes,
159 gist_type=gist_type,
160 lifetime=form_result['lifetime'],
161 gist_id=form_result['gistid'],
162 gist_acl_level=gist_acl_level
171 gist_mapping=schema_data['nodes'],
172 gist_type=schema_data['gist_type'],
173 lifetime=schema_data['lifetime'],
174 gist_acl_level=schema_data['gist_acl_level']
163 175 )
164 176 Session().commit()
165 177 new_gist_id = gist.gist_access_id
166 except formencode.Invalid as errors:
167 defaults = errors.value
178 except validation_schema.Invalid as errors:
179 defaults = data
180 errors = errors.asdict()
181
182 if 'nodes.0.content' in errors:
183 errors['content'] = errors['nodes.0.content']
184 del errors['nodes.0.content']
185 if 'nodes.0.filename' in errors:
186 errors['filename'] = errors['nodes.0.filename']
187 del errors['nodes.0.filename']
168 188
169 189 return formencode.htmlfill.render(
170 190 render('admin/gists/new.html'),
171 191 defaults=defaults,
172 errors=errors.error_dict or {},
192 errors=errors,
173 193 prefix_error=False,
174 194 encoding="UTF-8",
175 195 force_defaults=False
@@ -243,7 +263,8 b' class GistsController(BaseController):'
243 263 log.exception("Exception in gist show")
244 264 raise HTTPNotFound()
245 265 if format == 'raw':
246 content = '\n\n'.join([f.content for f in c.files if (f_path is None or f.path == f_path)])
266 content = '\n\n'.join([f.content for f in c.files
267 if (f_path is None or f.path == f_path)])
247 268 response.content_type = 'text/plain'
248 269 return content
249 270 return render('admin/gists/show.html')
@@ -252,32 +273,35 b' class GistsController(BaseController):'
252 273 @NotAnonymous()
253 274 @auth.CSRFRequired()
254 275 def edit(self, gist_id):
276 self.__load_defaults()
255 277 self._add_gist_to_context(gist_id)
256 278
257 279 owner = c.gist.gist_owner == c.rhodecode_user.user_id
258 280 if not (h.HasPermissionAny('hg.admin')() or owner):
259 281 raise HTTPForbidden()
260 282
261 rpost = request.POST
262 nodes = {}
263 _file_data = zip(rpost.getall('org_files'), rpost.getall('files'),
264 rpost.getall('mimetypes'), rpost.getall('contents'))
265 for org_filename, filename, mimetype, content in _file_data:
266 nodes[org_filename] = {
267 'org_filename': org_filename,
268 'filename': filename,
269 'content': content,
270 'lexer': mimetype,
271 }
283 data = peppercorn.parse(request.POST.items())
284
285 schema = gist_schema.GistSchema()
286 schema = schema.bind(
287 # '0' is special value to leave lifetime untouched
288 lifetime_options=[x[0] for x in c.lifetime_values] + [0],
289 )
290
272 291 try:
292 schema_data = schema.deserialize(data)
293 # convert to safer format with just KEYs so we sure no duplicates
294 schema_data['nodes'] = gist_schema.sequence_to_nodes(
295 schema_data['nodes'])
296
273 297 GistModel().update(
274 298 gist=c.gist,
275 description=rpost['description'],
299 description=schema_data['description'],
276 300 owner=c.gist.owner,
277 gist_mapping=nodes,
278 gist_type=c.gist.gist_type,
279 lifetime=rpost['lifetime'],
280 gist_acl_level=rpost['acl_level']
301 gist_mapping=schema_data['nodes'],
302 gist_type=schema_data['gist_type'],
303 lifetime=schema_data['lifetime'],
304 gist_acl_level=schema_data['gist_acl_level']
281 305 )
282 306
283 307 Session().commit()
@@ -287,6 +311,10 b' class GistsController(BaseController):'
287 311 # store only DB stuff for gist
288 312 Session().commit()
289 313 h.flash(_('Successfully updated gist data'), category='success')
314 except validation_schema.Invalid as errors:
315 errors = errors.asdict()
316 h.flash(_('Error occurred during update of gist {}: {}').format(
317 gist_id, errors), category='error')
290 318 except Exception:
291 319 log.exception("Exception in gist edit")
292 320 h.flash(_('Error occurred during update of gist %s') % gist_id,
@@ -317,7 +345,7 b' class GistsController(BaseController):'
317 345 # this cannot use timeago, since it's used in select2 as a value
318 346 expiry = h.age(h.time_to_datetime(c.gist.gist_expires))
319 347 self.__load_defaults(
320 extra_values=('0', _('%(expiry)s - current value') % {'expiry': expiry}))
348 extra_values=(0, _('%(expiry)s - current value') % {'expiry': expiry}))
321 349 return render('admin/gists/edit.html')
322 350
323 351 @LoginRequired()
@@ -346,3 +346,17 b' class MyAccountController(BaseController'
346 346 h.flash(_("Auth token successfully deleted"), category='success')
347 347
348 348 return redirect(url('my_account_auth_tokens'))
349
350 def my_notifications(self):
351 c.active = 'notifications'
352 return render('admin/my_account/my_account.html')
353
354 @auth.CSRFRequired()
355 def my_notifications_toggle_visibility(self):
356 user = c.rhodecode_user.get_instance()
357 user_data = user.user_data
358 status = user_data.get('notification_status', False)
359 user_data['notification_status'] = not status
360 user.user_data = user_data
361 Session().commit()
362 return redirect(url('my_account_notifications'))
@@ -86,6 +86,7 b' class NotificationsController(BaseContro'
86 86
87 87 return render('admin/notifications/notifications.html')
88 88
89
89 90 @auth.CSRFRequired()
90 91 def mark_all_read(self):
91 92 if request.is_xhr:
@@ -33,6 +33,7 b' from pylons.controllers.util import redi'
33 33 from pylons.i18n.translation import _
34 34 from webob.exc import HTTPForbidden, HTTPNotFound, HTTPBadRequest
35 35
36 import rhodecode
36 37 from rhodecode.lib import auth, helpers as h
37 38 from rhodecode.lib.auth import (
38 39 LoginRequired, HasPermissionAllDecorator,
@@ -42,7 +43,7 b' from rhodecode.lib.base import BaseRepoC'
42 43 from rhodecode.lib.ext_json import json
43 44 from rhodecode.lib.exceptions import AttachedForksError
44 45 from rhodecode.lib.utils import action_logger, repo_name_slug, jsonify
45 from rhodecode.lib.utils2 import safe_int
46 from rhodecode.lib.utils2 import safe_int, str2bool
46 47 from rhodecode.lib.vcs import RepositoryError
47 48 from rhodecode.model.db import (
48 49 User, Repository, UserFollowing, RepoGroup, RepositoryField)
@@ -779,6 +780,8 b' class ReposController(BaseRepoController'
779 780 c.repo_info = self._load_repo(repo_name)
780 781 defaults = self._vcs_form_defaults(repo_name)
781 782 c.inherit_global_settings = defaults['inherit_global_settings']
783 c.labs_active = str2bool(
784 rhodecode.CONFIG.get('labs_settings_active', 'true'))
782 785
783 786 return htmlfill.render(
784 787 render('admin/repos/repo_edit.html'),
@@ -79,7 +79,7 b' class SettingsController(BaseController)'
79 79 def __before__(self):
80 80 super(SettingsController, self).__before__()
81 81 c.labs_active = str2bool(
82 rhodecode.CONFIG.get('labs_settings_active', 'false'))
82 rhodecode.CONFIG.get('labs_settings_active', 'true'))
83 83 c.navlist = navigation_list(request)
84 84
85 85 def _get_hg_ui_settings(self):
@@ -790,13 +790,6 b' LabSetting = collections.namedtuple('
790 790 # rhodecode.model.forms.LabsSettingsForm.
791 791 _LAB_SETTINGS = [
792 792 LabSetting(
793 key='rhodecode_hg_use_rebase_for_merging',
794 type='bool',
795 group=lazy_ugettext('Mercurial server-side merge'),
796 label=lazy_ugettext('Use rebase instead of creating a merge commit when merging via web interface'),
797 help='' # Do not translate the empty string!
798 ),
799 LabSetting(
800 793 key='rhodecode_proxy_subversion_http_requests',
801 794 type='bool',
802 795 group=lazy_ugettext('Subversion HTTP Support'),
@@ -83,9 +83,6 b' class UsersController(BaseController):'
83 83 from rhodecode.lib.utils import PartialRenderer
84 84 _render = PartialRenderer('data_table/_dt_elements.html')
85 85
86 def grav_tmpl(user_email, size):
87 return _render("user_gravatar", user_email, size)
88
89 86 def username(user_id, username):
90 87 return _render("user_name", user_id, username)
91 88
@@ -100,9 +97,7 b' class UsersController(BaseController):'
100 97 users_data = []
101 98 for user in c.users_list:
102 99 users_data.append({
103 "gravatar": grav_tmpl(user.email, 20),
104 "username": h.link_to(
105 user.username, h.url('user_profile', username=user.username)),
100 "username": h.gravatar_with_user(user.username),
106 101 "username_raw": user.username,
107 102 "email": user.email,
108 103 "first_name": h.escape(user.name),
@@ -351,7 +351,8 b' class ChangesetController(BaseRepoContro'
351 351 f_path=request.POST.get('f_path'),
352 352 line_no=request.POST.get('line'),
353 353 status_change=(ChangesetStatus.get_status_lbl(status)
354 if status else None)
354 if status else None),
355 status_change_type=status
355 356 )
356 357 # get status if set !
357 358 if status:
@@ -136,11 +136,13 b' class FilesController(BaseRepoController'
136 136 _namespace = caches.get_repo_namespace_key(namespace_type, repo_name)
137 137 return caches.get_cache_manager('repo_cache_long', _namespace)
138 138
139 def _get_tree_at_commit(self, repo_name, commit_id, f_path):
139 def _get_tree_at_commit(self, repo_name, commit_id, f_path,
140 full_load=False, force=False):
140 141 def _cached_tree():
141 142 log.debug('Generating cached file tree for %s, %s, %s',
142 143 repo_name, commit_id, f_path)
143 return render('files/files_browser.html')
144 c.full_load = full_load
145 return render('files/files_browser_tree.html')
144 146
145 147 cache_manager = self.__get_tree_cache_manager(
146 148 repo_name, caches.FILE_TREE)
@@ -148,6 +150,10 b' class FilesController(BaseRepoController'
148 150 cache_key = caches.compute_key_from_params(
149 151 repo_name, commit_id, f_path)
150 152
153 if force:
154 # we want to force recompute of caches
155 cache_manager.remove_value(cache_key)
156
151 157 return cache_manager.get(cache_key, createfunc=_cached_tree)
152 158
153 159 def _get_nodelist_at_commit(self, repo_name, commit_id, f_path):
@@ -165,22 +171,6 b' class FilesController(BaseRepoController'
165 171 repo_name, commit_id, f_path)
166 172 return cache_manager.get(cache_key, createfunc=_cached_nodes)
167 173
168 def _get_metadata_at_commit(self, repo_name, commit, dir_node):
169 def _cached_metadata():
170 log.debug('Generating cached metadata for %s, %s, %s',
171 repo_name, commit.raw_id, safe_str(dir_node.path))
172
173 data = ScmModel().get_dirnode_metadata(commit, dir_node)
174 return data
175
176 cache_manager = self.__get_tree_cache_manager(
177 repo_name, caches.FILE_TREE_META)
178
179 cache_key = caches.compute_key_from_params(
180 repo_name, commit.raw_id, safe_str(dir_node.path))
181
182 return cache_manager.get(cache_key, createfunc=_cached_metadata)
183
184 174 @LoginRequired()
185 175 @HasRepoPermissionAnyDecorator(
186 176 'repository.read', 'repository.write', 'repository.admin')
@@ -246,6 +236,7 b' class FilesController(BaseRepoController'
246 236 c.authors = []
247 237 c.file_tree = self._get_tree_at_commit(
248 238 repo_name, c.commit.raw_id, f_path)
239
249 240 except RepositoryError as e:
250 241 h.flash(safe_str(e), category='error')
251 242 raise HTTPNotFound()
@@ -1092,23 +1083,32 b' class FilesController(BaseRepoController'
1092 1083 @XHRRequired()
1093 1084 @HasRepoPermissionAnyDecorator(
1094 1085 'repository.read', 'repository.write', 'repository.admin')
1095 @jsonify
1096 def metadata_list(self, repo_name, revision, f_path):
1086 def nodetree_full(self, repo_name, commit_id, f_path):
1097 1087 """
1098 Returns a json dict that contains commit date, author, revision
1099 and id for the specified repo, revision and file path
1088 Returns rendered html of file tree that contains commit date,
1089 author, revision for the specified combination of
1090 repo, commit_id and file path
1100 1091
1101 1092 :param repo_name: name of the repository
1102 :param revision: revision of files
1093 :param commit_id: commit_id of file tree
1103 1094 :param f_path: file path of the requested directory
1104 1095 """
1105 1096
1106 commit = self.__get_commit_or_redirect(revision, repo_name)
1097 commit = self.__get_commit_or_redirect(commit_id, repo_name)
1107 1098 try:
1108 file_node = commit.get_node(f_path)
1099 dir_node = commit.get_node(f_path)
1109 1100 except RepositoryError as e:
1110 return {'error': safe_str(e)}
1101 return 'error {}'.format(safe_str(e))
1102
1103 if dir_node.is_file():
1104 return ''
1111 1105
1112 metadata = self._get_metadata_at_commit(
1113 repo_name, commit, file_node)
1114 return {'metadata': metadata}
1106 c.file = dir_node
1107 c.commit = commit
1108
1109 # using force=True here, make a little trick. We flush the cache and
1110 # compute it using the same key as without full_load, so the fully
1111 # loaded cached tree is now returned instead of partial
1112 return self._get_tree_at_commit(
1113 repo_name, commit.raw_id, dir_node.path, full_load=True,
1114 force=True)
@@ -244,7 +244,7 b' class JournalController(BaseController):'
244 244 try:
245 245 self.scm_model.toggle_following_user(
246 246 user_id, c.rhodecode_user.user_id)
247 Session.commit()
247 Session().commit()
248 248 return 'ok'
249 249 except Exception:
250 250 raise HTTPBadRequest()
@@ -254,7 +254,7 b' class JournalController(BaseController):'
254 254 try:
255 255 self.scm_model.toggle_following_repo(
256 256 repo_id, c.rhodecode_user.user_id)
257 Session.commit()
257 Session().commit()
258 258 return 'ok'
259 259 except Exception:
260 260 raise HTTPBadRequest()
@@ -32,6 +32,7 b' from pylons.i18n.translation import _'
32 32 from sqlalchemy.sql import func
33 33 from sqlalchemy.sql.expression import or_
34 34
35 from rhodecode import events
35 36 from rhodecode.lib import auth, diffs, helpers as h
36 37 from rhodecode.lib.ext_json import json
37 38 from rhodecode.lib.base import (
@@ -640,6 +641,9 b' class PullrequestsController(BaseRepoCon'
640 641 pull_request_id = safe_int(pull_request_id)
641 642 c.pull_request = PullRequest.get_or_404(pull_request_id)
642 643
644 c.template_context['pull_request_data']['pull_request_id'] = \
645 pull_request_id
646
643 647 # pull_requests repo_name we opened it against
644 648 # ie. target_repo must match
645 649 if repo_name != c.pull_request.target_repo.repo_name:
@@ -758,9 +762,13 b' class PullrequestsController(BaseRepoCon'
758 762 line_no=request.POST.get('line'),
759 763 status_change=(ChangesetStatus.get_status_lbl(status)
760 764 if status and allowed_to_change_status else None),
765 status_change_type=(status
766 if status and allowed_to_change_status else None),
761 767 closing_pr=close_pr
762 768 )
763 769
770
771
764 772 if allowed_to_change_status:
765 773 old_calculated_status = pull_request.calculated_review_status()
766 774 # get status if set !
@@ -774,6 +782,7 b' class PullrequestsController(BaseRepoCon'
774 782 )
775 783
776 784 Session().flush()
785 events.trigger(events.PullRequestCommentEvent(pull_request, comm))
777 786 # we now calculate the status of pull request, and based on that
778 787 # calculation we set the commits status
779 788 calculated_status = pull_request.calculated_review_status()
@@ -35,6 +35,7 b' from rhodecode.lib.helpers import Page'
35 35 from rhodecode.lib.utils2 import safe_str, safe_int
36 36 from rhodecode.lib.index import searcher_from_config
37 37 from rhodecode.model import validation_schema
38 from rhodecode.model.validation_schema.schemas import search_schema
38 39
39 40 log = logging.getLogger(__name__)
40 41
@@ -48,7 +49,7 b' class SearchController(BaseRepoControlle'
48 49 formatted_results = []
49 50 execution_time = ''
50 51
51 schema = validation_schema.SearchParamsSchema()
52 schema = search_schema.SearchParamsSchema()
52 53
53 54 search_params = {}
54 55 errors = []
@@ -75,7 +76,6 b' class SearchController(BaseRepoControlle'
75 76 page_limit = search_params['page_limit']
76 77 requested_page = search_params['requested_page']
77 78
78
79 79 c.perm_user = AuthUser(user_id=c.rhodecode_user.user_id,
80 80 ip_addr=self.ip_addr)
81 81
@@ -24,14 +24,12 b' Summary controller for RhodeCode Enterpr'
24 24
25 25 import logging
26 26 from string import lower
27 from itertools import product
28 27
29 28 from pylons import tmpl_context as c, request
30 29 from pylons.i18n.translation import _
31 30 from beaker.cache import cache_region, region_invalidate
32 31
33 from rhodecode.config.conf import (
34 ALL_READMES, ALL_EXTS, LANGUAGES_EXTENSIONS_MAP)
32 from rhodecode.config.conf import (LANGUAGES_EXTENSIONS_MAP)
35 33 from rhodecode.controllers import utils
36 34 from rhodecode.controllers.changelog import _load_changelog_summary
37 35 from rhodecode.lib import caches, helpers as h
@@ -49,10 +47,6 b' from rhodecode.model.db import Statistic'
49 47
50 48 log = logging.getLogger(__name__)
51 49
52 README_FILES = [''.join([x[0][0], x[1][0]])
53 for x in sorted(list(product(ALL_READMES, ALL_EXTS)),
54 key=lambda y:y[0][1] + y[1][1])]
55
56 50
57 51 class SummaryController(BaseRepoController):
58 52
@@ -62,6 +56,7 b' class SummaryController(BaseRepoControll'
62 56 def __get_readme_data(self, db_repo):
63 57 repo_name = db_repo.repo_name
64 58 log.debug('Looking for README file')
59 default_renderer = c.visual.default_renderer
65 60
66 61 @cache_region('long_term')
67 62 def _generate_readme(cache_key):
@@ -73,7 +68,7 b' class SummaryController(BaseRepoControll'
73 68 if isinstance(commit, EmptyCommit):
74 69 raise EmptyRepositoryError()
75 70 renderer = MarkupRenderer()
76 for f in README_FILES:
71 for f in renderer.pick_readme_order(default_renderer):
77 72 try:
78 73 node = commit.get_node(f)
79 74 except NodeDoesNotExistError:
@@ -241,7 +236,7 b' class SummaryController(BaseRepoControll'
241 236 (_("Tag"), repo.tags, 'tag'),
242 237 (_("Bookmark"), repo.bookmarks, 'book'),
243 238 ]
244 res = self._create_reference_data(repo, refs_to_create)
239 res = self._create_reference_data(repo, repo_name, refs_to_create)
245 240 data = {
246 241 'more': False,
247 242 'results': res
@@ -258,14 +253,14 b' class SummaryController(BaseRepoControll'
258 253 # TODO: enable when vcs can handle bookmarks filters
259 254 # (_("Bookmarks"), repo.bookmarks, "book"),
260 255 ]
261 res = self._create_reference_data(repo, refs_to_create)
256 res = self._create_reference_data(repo, repo_name, refs_to_create)
262 257 data = {
263 258 'more': False,
264 259 'results': res
265 260 }
266 261 return data
267 262
268 def _create_reference_data(self, repo, refs_to_create):
263 def _create_reference_data(self, repo, full_repo_name, refs_to_create):
269 264 format_ref_id = utils.get_format_ref_id(repo)
270 265
271 266 result = []
@@ -274,28 +269,32 b' class SummaryController(BaseRepoControll'
274 269 result.append({
275 270 'text': title,
276 271 'children': self._create_reference_items(
277 repo, refs, ref_type, format_ref_id),
272 repo, full_repo_name, refs, ref_type, format_ref_id),
278 273 })
279 274 return result
280 275
281 def _create_reference_items(self, repo, refs, ref_type, format_ref_id):
276 def _create_reference_items(self, repo, full_repo_name, refs, ref_type,
277 format_ref_id):
282 278 result = []
283 279 is_svn = h.is_svn(repo)
284 for name, raw_id in refs.iteritems():
280 for ref_name, raw_id in refs.iteritems():
281 files_url = self._create_files_url(
282 repo, full_repo_name, ref_name, raw_id, is_svn)
285 283 result.append({
286 'text': name,
287 'id': format_ref_id(name, raw_id),
284 'text': ref_name,
285 'id': format_ref_id(ref_name, raw_id),
288 286 'raw_id': raw_id,
289 287 'type': ref_type,
290 'files_url': self._create_files_url(repo, name, raw_id, is_svn)
288 'files_url': files_url,
291 289 })
292 290 return result
293 291
294 def _create_files_url(self, repo, name, raw_id, is_svn):
295 use_commit_id = '/' in name or is_svn
292 def _create_files_url(self, repo, full_repo_name, ref_name, raw_id,
293 is_svn):
294 use_commit_id = '/' in ref_name or is_svn
296 295 return h.url(
297 296 'files_home',
298 repo_name=repo.name,
299 f_path=name if is_svn else '',
300 revision=raw_id if use_commit_id else name,
301 at=name)
297 repo_name=full_repo_name,
298 f_path=ref_name if is_svn else '',
299 revision=raw_id if use_commit_id else ref_name,
300 at=ref_name)
1 NO CONTENT: file renamed from rhodecode/interfaces.py to rhodecode/events/interfaces.py
@@ -17,37 +17,49 b''
17 17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18 18
19 19 from zope.interface import implementer
20 from rhodecode.interfaces import (
20
21 from rhodecode.translation import lazy_ugettext
22 from rhodecode.events.base import RhodecodeEvent
23 from rhodecode.events.interfaces import (
21 24 IUserRegistered, IUserPreCreate, IUserPreUpdate)
22 25
23 26
24 27 @implementer(IUserRegistered)
25 class UserRegistered(object):
28 class UserRegistered(RhodecodeEvent):
26 29 """
27 30 An instance of this class is emitted as an :term:`event` whenever a user
28 31 account is registered.
29 32 """
33 name = 'user-register'
34 display_name = lazy_ugettext('user registered')
35
30 36 def __init__(self, user, session):
31 37 self.user = user
32 38 self.session = session
33 39
34 40
35 41 @implementer(IUserPreCreate)
36 class UserPreCreate(object):
42 class UserPreCreate(RhodecodeEvent):
37 43 """
38 44 An instance of this class is emitted as an :term:`event` before a new user
39 45 object is created.
40 46 """
47 name = 'user-pre-create'
48 display_name = lazy_ugettext('user pre create')
49
41 50 def __init__(self, user_data):
42 51 self.user_data = user_data
43 52
44 53
45 54 @implementer(IUserPreUpdate)
46 class UserPreUpdate(object):
55 class UserPreUpdate(RhodecodeEvent):
47 56 """
48 57 An instance of this class is emitted as an :term:`event` before a user
49 58 object is updated.
50 59 """
60 name = 'user-pre-update'
61 display_name = lazy_ugettext('user pre update')
62
51 63 def __init__(self, user, user_data):
52 64 self.user = user
53 65 self.user_data = user_data
This diff has been collapsed as it changes many lines, (1901 lines changed) Show them Hide them
@@ -6,9 +6,9 b''
6 6 #, fuzzy
7 7 msgid ""
8 8 msgstr ""
9 "Project-Id-Version: rhodecode-enterprise-ce 4.2.0\n"
9 "Project-Id-Version: rhodecode-enterprise-ce 4.3.0\n"
10 10 "Report-Msgid-Bugs-To: marcin@rhodecode.com\n"
11 "POT-Creation-Date: 2016-06-30 17:18+0000\n"
11 "POT-Creation-Date: 2016-08-02 20:55+0000\n"
12 12 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13 13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14 14 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,12 +18,13 b' msgstr ""'
18 18 "Generated-By: Babel 1.3\n"
19 19
20 20 #: rhodecode/admin/navigation.py:74 rhodecode/authentication/routes.py:60
21 #: rhodecode/integrations/views.py:126
21 22 #: rhodecode/templates/admin/permissions/permissions.html:36
22 23 msgid "Global"
23 24 msgstr ""
24 25
25 26 #: rhodecode/admin/navigation.py:75
26 #: rhodecode/templates/admin/repos/repo_edit.html:48
27 #: rhodecode/templates/admin/repos/repo_edit.html:52
27 28 msgid "VCS"
28 29 msgstr ""
29 30
@@ -36,7 +37,7 b' msgid "Remap and Rescan"'
36 37 msgstr ""
37 38
38 39 #: rhodecode/admin/navigation.py:78
39 #: rhodecode/templates/admin/repos/repo_edit.html:54
40 #: rhodecode/templates/admin/repos/repo_edit.html:58
40 41 msgid "Issue Tracker"
41 42 msgstr ""
42 43
@@ -45,7 +46,8 b' msgstr ""'
45 46 #: rhodecode/templates/admin/my_account/my_account_profile_edit.html:94
46 47 #: rhodecode/templates/admin/users/user_add.html:86
47 48 #: rhodecode/templates/admin/users/user_edit_profile.html:65
48 #: rhodecode/templates/admin/users/users.html:91
49 #: rhodecode/templates/admin/users/users.html:90
50 #: rhodecode/templates/email_templates/user_registration.mako:25
49 51 #: rhodecode/templates/users/user_profile.html:51
50 52 msgid "Email"
51 53 msgstr ""
@@ -59,15 +61,27 b' msgid "Full Text Search"'
59 61 msgstr ""
60 62
61 63 #: rhodecode/admin/navigation.py:83
64 #: rhodecode/templates/admin/integrations/base.html:21
65 #: rhodecode/templates/admin/integrations/edit.html:8
66 #: rhodecode/templates/admin/integrations/edit.html:19
67 #: rhodecode/templates/admin/integrations/list.html:15
68 #: rhodecode/templates/admin/integrations/list.html:19
69 #: rhodecode/templates/admin/integrations/list.html:26
70 #: rhodecode/templates/admin/repos/repo_edit.html:72
71 #: rhodecode/templates/base/base.html:84
72 msgid "Integrations"
73 msgstr ""
74
75 #: rhodecode/admin/navigation.py:85
62 76 #: rhodecode/templates/admin/settings/settings_system.html:47
63 77 msgid "System Info"
64 78 msgstr ""
65 79
66 #: rhodecode/admin/navigation.py:84
80 #: rhodecode/admin/navigation.py:86
67 81 msgid "Open Source Licenses"
68 82 msgstr ""
69 83
70 #: rhodecode/admin/navigation.py:91
84 #: rhodecode/admin/navigation.py:93
71 85 msgid "Labs"
72 86 msgstr ""
73 87
@@ -75,7 +89,9 b' msgstr ""'
75 89 msgid "Enable or disable this authentication plugin."
76 90 msgstr ""
77 91
78 #: rhodecode/authentication/schema.py:37
92 #: rhodecode/authentication/schema.py:37 rhodecode/integrations/schema.py:37
93 #: rhodecode/templates/admin/integrations/list.html:62
94 #: rhodecode/templates/admin/my_account/my_account_notifications.html:14
79 95 msgid "Enabled"
80 96 msgstr ""
81 97
@@ -217,7 +233,7 b' msgstr ""'
217 233 #: rhodecode/templates/login.html:50 rhodecode/templates/register.html:48
218 234 #: rhodecode/templates/admin/my_account/my_account.html:30
219 235 #: rhodecode/templates/admin/users/user_add.html:44
220 #: rhodecode/templates/base/base.html:314
236 #: rhodecode/templates/base/base.html:315
221 237 #: rhodecode/templates/debug_style/login.html:45
222 238 msgid "Password"
223 239 msgstr ""
@@ -266,12 +282,12 b' msgstr ""'
266 282 msgid "LDAP Attribute to map to user name"
267 283 msgstr ""
268 284
269 #: rhodecode/authentication/plugins/auth_ldap.py:144
270 msgid "The LDAP Login attribute of the CN must be specified"
285 #: rhodecode/authentication/plugins/auth_ldap.py:145
286 msgid "Login Attribute"
271 287 msgstr ""
272 288
273 289 #: rhodecode/authentication/plugins/auth_ldap.py:146
274 msgid "Login Attribute"
290 msgid "The LDAP Login attribute of the CN must be specified"
275 291 msgstr ""
276 292
277 293 #: rhodecode/authentication/plugins/auth_ldap.py:151
@@ -298,7 +314,7 b' msgstr ""'
298 314 msgid "Email Attribute"
299 315 msgstr ""
300 316
301 #: rhodecode/authentication/plugins/auth_ldap.py:348
317 #: rhodecode/authentication/plugins/auth_ldap.py:351
302 318 msgid "LDAP"
303 319 msgstr ""
304 320
@@ -331,7 +347,7 b' msgid "Rhodecode Token Auth"'
331 347 msgstr ""
332 348
333 349 #: rhodecode/controllers/changelog.py:90 rhodecode/controllers/compare.py:63
334 #: rhodecode/controllers/pullrequests.py:279
350 #: rhodecode/controllers/pullrequests.py:280
335 351 msgid "There are no commits yet"
336 352 msgstr ""
337 353
@@ -367,8 +383,8 b' msgid "No such commit exists for this re'
367 383 msgstr ""
368 384
369 385 #: rhodecode/controllers/changeset.py:335
370 #: rhodecode/controllers/pullrequests.py:746
371 #: rhodecode/model/pull_request.py:836
386 #: rhodecode/controllers/pullrequests.py:750
387 #: rhodecode/model/pull_request.py:843
372 388 #, python-format
373 389 msgid "Status change %(transition_icon)s %(status)s"
374 390 msgstr ""
@@ -423,100 +439,100 b' msgstr ""'
423 439 msgid "There are no files yet. %s"
424 440 msgstr ""
425 441
426 #: rhodecode/controllers/files.py:390 rhodecode/controllers/files.py:443
427 #: rhodecode/controllers/files.py:474 rhodecode/controllers/files.py:549
428 #: rhodecode/controllers/files.py:594 rhodecode/controllers/files.py:685
442 #: rhodecode/controllers/files.py:381 rhodecode/controllers/files.py:434
443 #: rhodecode/controllers/files.py:465 rhodecode/controllers/files.py:540
444 #: rhodecode/controllers/files.py:585 rhodecode/controllers/files.py:676
429 445 #, python-format
430 446 msgid "This repository has been locked by %s on %s"
431 447 msgstr ""
432 448
449 #: rhodecode/controllers/files.py:389 rhodecode/controllers/files.py:442
450 msgid "You can only delete files with revision being a valid branch "
451 msgstr ""
452
433 453 #: rhodecode/controllers/files.py:398 rhodecode/controllers/files.py:451
434 msgid "You can only delete files with revision being a valid branch "
435 msgstr ""
436
437 #: rhodecode/controllers/files.py:407 rhodecode/controllers/files.py:460
438 454 #, python-format
439 455 msgid "Deleted file %s via RhodeCode Enterprise"
440 456 msgstr ""
441 457
442 #: rhodecode/controllers/files.py:427
458 #: rhodecode/controllers/files.py:418
443 459 #, python-format
444 460 msgid "Successfully deleted file %s"
445 461 msgstr ""
446 462
447 #: rhodecode/controllers/files.py:430 rhodecode/controllers/files.py:536
448 #: rhodecode/controllers/files.py:673
463 #: rhodecode/controllers/files.py:421 rhodecode/controllers/files.py:527
464 #: rhodecode/controllers/files.py:664
449 465 msgid "Error occurred during commit"
450 466 msgstr ""
451 467
452 #: rhodecode/controllers/files.py:482 rhodecode/controllers/files.py:557
468 #: rhodecode/controllers/files.py:473 rhodecode/controllers/files.py:548
453 469 msgid "You can only edit files with revision being a valid branch "
454 470 msgstr ""
455 471
456 #: rhodecode/controllers/files.py:494 rhodecode/controllers/files.py:569
472 #: rhodecode/controllers/files.py:485 rhodecode/controllers/files.py:560
457 473 #, python-format
458 474 msgid "Edited file %s via RhodeCode Enterprise"
459 475 msgstr ""
460 476
461 #: rhodecode/controllers/files.py:511
477 #: rhodecode/controllers/files.py:502
462 478 msgid "No changes"
463 479 msgstr ""
464 480
465 #: rhodecode/controllers/files.py:533 rhodecode/controllers/files.py:662
481 #: rhodecode/controllers/files.py:524 rhodecode/controllers/files.py:653
466 482 #, python-format
467 483 msgid "Successfully committed to %s"
468 484 msgstr ""
469 485
470 #: rhodecode/controllers/files.py:607 rhodecode/controllers/files.py:696
486 #: rhodecode/controllers/files.py:598 rhodecode/controllers/files.py:687
471 487 msgid "Added file via RhodeCode Enterprise"
472 488 msgstr ""
473 489
474 #: rhodecode/controllers/files.py:632
490 #: rhodecode/controllers/files.py:623
475 491 msgid "No filename"
476 492 msgstr ""
477 493
478 #: rhodecode/controllers/files.py:665
494 #: rhodecode/controllers/files.py:656
479 495 msgid "The location specified must be a relative path and must not contain .. in the path"
480 496 msgstr ""
481 497
482 #: rhodecode/controllers/files.py:719
498 #: rhodecode/controllers/files.py:710
483 499 msgid "Downloads disabled"
484 500 msgstr ""
485 501
486 #: rhodecode/controllers/files.py:725
502 #: rhodecode/controllers/files.py:716
487 503 #, python-format
488 504 msgid "Unknown revision %s"
489 505 msgstr ""
490 506
491 #: rhodecode/controllers/files.py:727
507 #: rhodecode/controllers/files.py:718
492 508 msgid "Empty repository"
493 509 msgstr ""
494 510
495 #: rhodecode/controllers/files.py:729 rhodecode/controllers/files.py:763
511 #: rhodecode/controllers/files.py:720 rhodecode/controllers/files.py:754
496 512 msgid "Unknown archive type"
497 513 msgstr ""
498 514
499 #: rhodecode/controllers/files.py:930
515 #: rhodecode/controllers/files.py:921
500 516 #, python-format
501 517 msgid "Commit %(commit)s does not exist."
502 518 msgstr ""
503 519
504 #: rhodecode/controllers/files.py:947
520 #: rhodecode/controllers/files.py:938
505 521 #, python-format
506 522 msgid "%(file_path)s has not changed between %(commit_1)s and %(commit_2)s."
507 523 msgstr ""
508 524
509 #: rhodecode/controllers/files.py:1014
525 #: rhodecode/controllers/files.py:1005
510 526 msgid "Changesets"
511 527 msgstr ""
512 528
513 #: rhodecode/controllers/files.py:1035 rhodecode/controllers/summary.py:256
514 #: rhodecode/model/pull_request.py:1051 rhodecode/model/scm.py:783
529 #: rhodecode/controllers/files.py:1026 rhodecode/controllers/summary.py:251
530 #: rhodecode/model/pull_request.py:1059 rhodecode/model/scm.py:780
515 531 #: rhodecode/templates/base/vcs_settings.html:138
516 532 msgid "Branches"
517 533 msgstr ""
518 534
519 #: rhodecode/controllers/files.py:1039 rhodecode/model/scm.py:798
535 #: rhodecode/controllers/files.py:1030 rhodecode/model/scm.py:795
520 536 #: rhodecode/templates/base/vcs_settings.html:163
521 537 msgid "Tags"
522 538 msgstr ""
@@ -531,13 +547,13 b' msgid "Groups"'
531 547 msgstr ""
532 548
533 549 #: rhodecode/controllers/home.py:212 rhodecode/controllers/home.py:247
534 #: rhodecode/controllers/pullrequests.py:382
550 #: rhodecode/controllers/pullrequests.py:383
535 551 #: rhodecode/templates/admin/repo_groups/repo_group_edit_perms.html:128
536 552 #: rhodecode/templates/admin/repos/repo_add.html:15
537 553 #: rhodecode/templates/admin/repos/repo_add.html:19
538 554 #: rhodecode/templates/admin/users/user_edit_advanced.html:11
539 #: rhodecode/templates/base/base.html:79 rhodecode/templates/base/base.html:149
540 #: rhodecode/templates/base/base.html:626
555 #: rhodecode/templates/base/base.html:78 rhodecode/templates/base/base.html:150
556 #: rhodecode/templates/base/base.html:627
541 557 msgid "Repositories"
542 558 msgstr ""
543 559
@@ -554,93 +570,93 b' msgstr ""'
554 570 msgid "journal"
555 571 msgstr ""
556 572
557 #: rhodecode/controllers/pullrequests.py:293
573 #: rhodecode/controllers/pullrequests.py:294
558 574 msgid "Commit does not exist"
559 575 msgstr ""
560 576
561 #: rhodecode/controllers/pullrequests.py:405
577 #: rhodecode/controllers/pullrequests.py:406
562 578 msgid "Pull request requires a title with min. 3 chars"
563 579 msgstr ""
564 580
565 #: rhodecode/controllers/pullrequests.py:407
581 #: rhodecode/controllers/pullrequests.py:408
566 582 msgid "Error creating pull request: {}"
567 583 msgstr ""
568 584
569 #: rhodecode/controllers/pullrequests.py:454
585 #: rhodecode/controllers/pullrequests.py:455
570 586 msgid "Successfully opened new pull request"
571 587 msgstr ""
572 588
573 #: rhodecode/controllers/pullrequests.py:457
589 #: rhodecode/controllers/pullrequests.py:458
574 590 msgid "Error occurred during sending pull request"
575 591 msgstr ""
576 592
577 #: rhodecode/controllers/pullrequests.py:497
593 #: rhodecode/controllers/pullrequests.py:498
578 594 msgid "Cannot update closed pull requests."
579 595 msgstr ""
580 596
581 #: rhodecode/controllers/pullrequests.py:503
597 #: rhodecode/controllers/pullrequests.py:504
582 598 msgid "Pull request title & description updated."
583 599 msgstr ""
584 600
585 #: rhodecode/controllers/pullrequests.py:513
601 #: rhodecode/controllers/pullrequests.py:514
586 602 msgid "Pull request updated to \"{source_commit_id}\" with {count_added} added, {count_removed} removed commits."
587 603 msgstr ""
588 604
589 #: rhodecode/controllers/pullrequests.py:523
605 #: rhodecode/controllers/pullrequests.py:524
590 606 msgid "Nothing changed in pull request."
591 607 msgstr ""
592 608
593 #: rhodecode/controllers/pullrequests.py:526
609 #: rhodecode/controllers/pullrequests.py:527
594 610 msgid "Skipping update of pull request due to reference type: {reference_type}"
595 611 msgstr ""
596 612
597 #: rhodecode/controllers/pullrequests.py:533
613 #: rhodecode/controllers/pullrequests.py:534
598 614 msgid "Update failed due to missing commits."
599 615 msgstr ""
600 616
601 #: rhodecode/controllers/pullrequests.py:579
617 #: rhodecode/controllers/pullrequests.py:580
602 618 msgid "Pull request reviewer approval is pending."
603 619 msgstr ""
604 620
605 #: rhodecode/controllers/pullrequests.py:593
621 #: rhodecode/controllers/pullrequests.py:594
606 622 msgid "Pull request was successfully merged and closed."
607 623 msgstr ""
608 624
609 #: rhodecode/controllers/pullrequests.py:631
625 #: rhodecode/controllers/pullrequests.py:632
610 626 msgid "Successfully deleted pull request"
611 627 msgstr ""
612 628
613 #: rhodecode/controllers/pullrequests.py:664
629 #: rhodecode/controllers/pullrequests.py:668
614 630 msgid "Reviewer approval is pending."
615 631 msgstr ""
616 632
617 #: rhodecode/controllers/pullrequests.py:706
633 #: rhodecode/controllers/pullrequests.py:710
618 634 msgid "Close Pull Request"
619 635 msgstr ""
620 636
621 #: rhodecode/controllers/pullrequests.py:750
622 #: rhodecode/model/pull_request.py:840
637 #: rhodecode/controllers/pullrequests.py:754
638 #: rhodecode/model/pull_request.py:847
623 639 msgid "Closing with"
624 640 msgstr ""
625 641
626 #: rhodecode/controllers/pullrequests.py:795
642 #: rhodecode/controllers/pullrequests.py:802
627 643 #, python-format
628 644 msgid "Closing pull request on other statuses than rejected or approved is forbidden. Calculated status from all reviewers is currently: %s"
629 645 msgstr ""
630 646
631 #: rhodecode/controllers/summary.py:240
647 #: rhodecode/controllers/summary.py:235
632 648 msgid "Branch"
633 649 msgstr ""
634 650
635 #: rhodecode/controllers/summary.py:241
651 #: rhodecode/controllers/summary.py:236
636 652 msgid "Tag"
637 653 msgstr ""
638 654
639 #: rhodecode/controllers/summary.py:242
655 #: rhodecode/controllers/summary.py:237
640 656 msgid "Bookmark"
641 657 msgstr ""
642 658
643 #: rhodecode/controllers/summary.py:257
659 #: rhodecode/controllers/summary.py:252
644 660 msgid "Closed branches"
645 661 msgstr ""
646 662
@@ -652,83 +668,87 b' msgstr ""'
652 668 msgid "Error occurred during update of default values"
653 669 msgstr ""
654 670
655 #: rhodecode/controllers/admin/gists.py:59
671 #: rhodecode/controllers/admin/gists.py:63
656 672 #: rhodecode/controllers/admin/my_account.py:307
657 #: rhodecode/controllers/admin/users.py:436
673 #: rhodecode/controllers/admin/users.py:431
658 674 msgid "forever"
659 675 msgstr ""
660 676
661 #: rhodecode/controllers/admin/gists.py:60
677 #: rhodecode/controllers/admin/gists.py:64
662 678 #: rhodecode/controllers/admin/my_account.py:308
663 #: rhodecode/controllers/admin/users.py:437
679 #: rhodecode/controllers/admin/users.py:432
664 680 msgid "5 minutes"
665 681 msgstr ""
666 682
667 #: rhodecode/controllers/admin/gists.py:61
683 #: rhodecode/controllers/admin/gists.py:65
668 684 #: rhodecode/controllers/admin/my_account.py:309
669 #: rhodecode/controllers/admin/users.py:438
685 #: rhodecode/controllers/admin/users.py:433
670 686 msgid "1 hour"
671 687 msgstr ""
672 688
673 #: rhodecode/controllers/admin/gists.py:62
689 #: rhodecode/controllers/admin/gists.py:66
674 690 #: rhodecode/controllers/admin/my_account.py:310
675 #: rhodecode/controllers/admin/users.py:439
691 #: rhodecode/controllers/admin/users.py:434
676 692 msgid "1 day"
677 693 msgstr ""
678 694
679 #: rhodecode/controllers/admin/gists.py:63
680 #: rhodecode/controllers/admin/my_account.py:311
681 #: rhodecode/controllers/admin/users.py:440
682 msgid "1 month"
683 msgstr ""
684
685 695 #: rhodecode/controllers/admin/gists.py:67
696 #: rhodecode/controllers/admin/my_account.py:311
697 #: rhodecode/controllers/admin/users.py:435
698 msgid "1 month"
699 msgstr ""
700
701 #: rhodecode/controllers/admin/gists.py:71
686 702 #: rhodecode/controllers/admin/my_account.py:313
687 #: rhodecode/controllers/admin/users.py:442
703 #: rhodecode/controllers/admin/users.py:437
688 704 msgid "Lifetime"
689 705 msgstr ""
690 706
691 #: rhodecode/controllers/admin/gists.py:69
707 #: rhodecode/controllers/admin/gists.py:73
692 708 msgid "Requires registered account"
693 709 msgstr ""
694 710
695 #: rhodecode/controllers/admin/gists.py:70
711 #: rhodecode/controllers/admin/gists.py:74
696 712 msgid "Can be accessed by anonymous users"
697 713 msgstr ""
698 714
699 #: rhodecode/controllers/admin/gists.py:180
715 #: rhodecode/controllers/admin/gists.py:200
700 716 msgid "Error occurred during gist creation"
701 717 msgstr ""
702 718
703 #: rhodecode/controllers/admin/gists.py:211
719 #: rhodecode/controllers/admin/gists.py:231
704 720 #, python-format
705 721 msgid "Deleted gist %s"
706 722 msgstr ""
707 723
708 #: rhodecode/controllers/admin/gists.py:284
724 #: rhodecode/controllers/admin/gists.py:308
709 725 msgid "Successfully updated gist content"
710 726 msgstr ""
711 727
712 #: rhodecode/controllers/admin/gists.py:289
728 #: rhodecode/controllers/admin/gists.py:313
713 729 msgid "Successfully updated gist data"
714 730 msgstr ""
715 731
716 #: rhodecode/controllers/admin/gists.py:292
732 #: rhodecode/controllers/admin/gists.py:316
733 msgid "Error occurred during update of gist {}: {}"
734 msgstr ""
735
736 #: rhodecode/controllers/admin/gists.py:320
717 737 #, python-format
718 738 msgid "Error occurred during update of gist %s"
719 739 msgstr ""
720 740
721 #: rhodecode/controllers/admin/gists.py:315
741 #: rhodecode/controllers/admin/gists.py:343
722 742 #: rhodecode/templates/admin/gists/show.html:67
723 743 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:19
724 744 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:42
725 745 #: rhodecode/templates/admin/users/user_edit_auth_tokens.html:16
726 746 #: rhodecode/templates/admin/users/user_edit_auth_tokens.html:38
727 #: rhodecode/templates/data_table/_dt_elements.html:253
747 #: rhodecode/templates/data_table/_dt_elements.html:255
728 748 msgid "never"
729 749 msgstr ""
730 750
731 #: rhodecode/controllers/admin/gists.py:320
751 #: rhodecode/controllers/admin/gists.py:348
732 752 #, python-format
733 753 msgid "%(expiry)s - current value"
734 754 msgstr ""
@@ -742,7 +762,7 b' msgid "Your account was updated successf'
742 762 msgstr ""
743 763
744 764 #: rhodecode/controllers/admin/my_account.py:143
745 #: rhodecode/controllers/admin/users.py:223
765 #: rhodecode/controllers/admin/users.py:218
746 766 #, python-format
747 767 msgid "Error occurred during update of user %s"
748 768 msgstr ""
@@ -756,38 +776,38 b' msgid "Error occurred during update of u'
756 776 msgstr ""
757 777
758 778 #: rhodecode/controllers/admin/my_account.py:261
759 #: rhodecode/controllers/admin/users.py:616
779 #: rhodecode/controllers/admin/users.py:611
760 780 #, python-format
761 781 msgid "Added new email address `%s` for user account"
762 782 msgstr ""
763 783
764 784 #: rhodecode/controllers/admin/my_account.py:268
765 #: rhodecode/controllers/admin/users.py:623
785 #: rhodecode/controllers/admin/users.py:618
766 786 msgid "An error occurred during email saving"
767 787 msgstr ""
768 788
769 789 #: rhodecode/controllers/admin/my_account.py:278
770 #: rhodecode/controllers/admin/users.py:638
790 #: rhodecode/controllers/admin/users.py:633
771 791 msgid "Removed email address from user account"
772 792 msgstr ""
773 793
774 794 #: rhodecode/controllers/admin/my_account.py:316
775 #: rhodecode/controllers/admin/users.py:445
795 #: rhodecode/controllers/admin/users.py:440
776 796 msgid "Role"
777 797 msgstr ""
778 798
779 799 #: rhodecode/controllers/admin/my_account.py:329
780 #: rhodecode/controllers/admin/users.py:469
800 #: rhodecode/controllers/admin/users.py:464
781 801 msgid "Auth token successfully created"
782 802 msgstr ""
783 803
784 804 #: rhodecode/controllers/admin/my_account.py:342
785 #: rhodecode/controllers/admin/users.py:488
805 #: rhodecode/controllers/admin/users.py:483
786 806 msgid "Auth token successfully reset"
787 807 msgstr ""
788 808
789 809 #: rhodecode/controllers/admin/my_account.py:346
790 #: rhodecode/controllers/admin/users.py:492
810 #: rhodecode/controllers/admin/users.py:487
791 811 msgid "Auth token successfully deleted"
792 812 msgstr ""
793 813
@@ -862,170 +882,170 b' msgstr ""'
862 882 msgid "Repository Group permissions updated"
863 883 msgstr ""
864 884
865 #: rhodecode/controllers/admin/repos.py:128
885 #: rhodecode/controllers/admin/repos.py:129
866 886 #, python-format
867 887 msgid "Error creating repository %s: invalid certificate"
868 888 msgstr ""
869 889
870 #: rhodecode/controllers/admin/repos.py:132
890 #: rhodecode/controllers/admin/repos.py:133
871 891 #, python-format
872 892 msgid "Error creating repository %s"
873 893 msgstr ""
874 894
875 #: rhodecode/controllers/admin/repos.py:264
895 #: rhodecode/controllers/admin/repos.py:265
876 896 #, python-format
877 897 msgid "Created repository %s from %s"
878 898 msgstr ""
879 899
880 #: rhodecode/controllers/admin/repos.py:273
900 #: rhodecode/controllers/admin/repos.py:274
881 901 #, python-format
882 902 msgid "Forked repository %s as %s"
883 903 msgstr ""
884 904
885 #: rhodecode/controllers/admin/repos.py:276
905 #: rhodecode/controllers/admin/repos.py:277
886 906 #, python-format
887 907 msgid "Created repository %s"
888 908 msgstr ""
889 909
890 #: rhodecode/controllers/admin/repos.py:318
910 #: rhodecode/controllers/admin/repos.py:319
891 911 #, python-format
892 912 msgid "Repository %s updated successfully"
893 913 msgstr ""
894 914
895 #: rhodecode/controllers/admin/repos.py:337
915 #: rhodecode/controllers/admin/repos.py:338
896 916 #, python-format
897 917 msgid "Error occurred during update of repository %s"
898 918 msgstr ""
899 919
900 #: rhodecode/controllers/admin/repos.py:365
920 #: rhodecode/controllers/admin/repos.py:366
901 921 #, python-format
902 922 msgid "Detached %s forks"
903 923 msgstr ""
904 924
905 #: rhodecode/controllers/admin/repos.py:368
925 #: rhodecode/controllers/admin/repos.py:369
906 926 #, python-format
907 927 msgid "Deleted %s forks"
908 928 msgstr ""
909 929
910 #: rhodecode/controllers/admin/repos.py:373
930 #: rhodecode/controllers/admin/repos.py:374
911 931 #, python-format
912 932 msgid "Deleted repository %s"
913 933 msgstr ""
914 934
915 #: rhodecode/controllers/admin/repos.py:376
935 #: rhodecode/controllers/admin/repos.py:377
916 936 #, python-format
917 937 msgid "Cannot delete %s it still contains attached forks"
918 938 msgstr ""
919 939
920 #: rhodecode/controllers/admin/repos.py:381
940 #: rhodecode/controllers/admin/repos.py:382
921 941 #, python-format
922 942 msgid "An error occurred during deletion of %s"
923 943 msgstr ""
924 944
925 #: rhodecode/controllers/admin/repos.py:435
945 #: rhodecode/controllers/admin/repos.py:436
926 946 msgid "Repository permissions updated"
927 947 msgstr ""
928 948
929 #: rhodecode/controllers/admin/repos.py:466
949 #: rhodecode/controllers/admin/repos.py:467
930 950 msgid "An error occurred during creation of field"
931 951 msgstr ""
932 952
933 #: rhodecode/controllers/admin/repos.py:481
953 #: rhodecode/controllers/admin/repos.py:482
934 954 msgid "An error occurred during removal of field"
935 955 msgstr ""
936 956
937 #: rhodecode/controllers/admin/repos.py:520
957 #: rhodecode/controllers/admin/repos.py:521
938 958 msgid "Updated repository visibility in public journal"
939 959 msgstr ""
940 960
941 #: rhodecode/controllers/admin/repos.py:524
961 #: rhodecode/controllers/admin/repos.py:525
942 962 msgid "An error occurred during setting this repository in public journal"
943 963 msgstr ""
944 964
945 #: rhodecode/controllers/admin/repos.py:548
965 #: rhodecode/controllers/admin/repos.py:549
946 966 msgid "Nothing"
947 967 msgstr ""
948 968
949 #: rhodecode/controllers/admin/repos.py:550
969 #: rhodecode/controllers/admin/repos.py:551
950 970 #, python-format
951 971 msgid "Marked repo %s as fork of %s"
952 972 msgstr ""
953 973
954 #: rhodecode/controllers/admin/repos.py:557
974 #: rhodecode/controllers/admin/repos.py:558
955 975 msgid "An error occurred during this operation"
956 976 msgstr ""
957 977
958 #: rhodecode/controllers/admin/repos.py:575
978 #: rhodecode/controllers/admin/repos.py:576
959 979 msgid "Locked repository"
960 980 msgstr ""
961 981
962 #: rhodecode/controllers/admin/repos.py:578
982 #: rhodecode/controllers/admin/repos.py:579
963 983 msgid "Unlocked repository"
964 984 msgstr ""
965 985
966 #: rhodecode/controllers/admin/repos.py:581
967 #: rhodecode/controllers/admin/repos.py:610
986 #: rhodecode/controllers/admin/repos.py:582
987 #: rhodecode/controllers/admin/repos.py:611
968 988 msgid "An error occurred during unlocking"
969 989 msgstr ""
970 990
971 #: rhodecode/controllers/admin/repos.py:600
991 #: rhodecode/controllers/admin/repos.py:601
972 992 msgid "Unlocked"
973 993 msgstr ""
974 994
975 #: rhodecode/controllers/admin/repos.py:604
995 #: rhodecode/controllers/admin/repos.py:605
976 996 msgid "Locked"
977 997 msgstr ""
978 998
979 #: rhodecode/controllers/admin/repos.py:606
999 #: rhodecode/controllers/admin/repos.py:607
980 1000 #, python-format
981 1001 msgid "Repository has been %s"
982 1002 msgstr ""
983 1003
984 #: rhodecode/controllers/admin/repos.py:621
1004 #: rhodecode/controllers/admin/repos.py:622
985 1005 msgid "Cache invalidation successful"
986 1006 msgstr ""
987 1007
988 #: rhodecode/controllers/admin/repos.py:625
1008 #: rhodecode/controllers/admin/repos.py:626
989 1009 msgid "An error occurred during cache invalidation"
990 1010 msgstr ""
991 1011
992 #: rhodecode/controllers/admin/repos.py:645
1012 #: rhodecode/controllers/admin/repos.py:646
993 1013 msgid "Pulled from remote location"
994 1014 msgstr ""
995 1015
996 #: rhodecode/controllers/admin/repos.py:648
1016 #: rhodecode/controllers/admin/repos.py:649
997 1017 msgid "An error occurred during pull from remote location"
998 1018 msgstr ""
999 1019
1000 #: rhodecode/controllers/admin/repos.py:670
1020 #: rhodecode/controllers/admin/repos.py:671
1001 1021 msgid "An error occurred during deletion of repository stats"
1002 1022 msgstr ""
1003 1023
1004 #: rhodecode/controllers/admin/repos.py:717
1024 #: rhodecode/controllers/admin/repos.py:718
1005 1025 msgid "Error occurred during deleting issue tracker entry"
1006 1026 msgstr ""
1007 1027
1008 #: rhodecode/controllers/admin/repos.py:720
1028 #: rhodecode/controllers/admin/repos.py:721
1009 1029 #: rhodecode/controllers/admin/settings.py:363
1010 1030 msgid "Removed issue tracker entry"
1011 1031 msgstr ""
1012 1032
1013 #: rhodecode/controllers/admin/repos.py:750
1033 #: rhodecode/controllers/admin/repos.py:751
1014 1034 #: rhodecode/controllers/admin/settings.py:409
1015 1035 msgid "Updated issue tracker entries"
1016 1036 msgstr ""
1017 1037
1018 #: rhodecode/controllers/admin/repos.py:809
1038 #: rhodecode/controllers/admin/repos.py:812
1019 1039 #: rhodecode/controllers/admin/settings.py:142
1020 1040 #: rhodecode/controllers/admin/settings.py:719
1021 1041 msgid "Some form inputs contain invalid data."
1022 1042 msgstr ""
1023 1043
1024 #: rhodecode/controllers/admin/repos.py:827
1044 #: rhodecode/controllers/admin/repos.py:830
1025 1045 msgid "Error occurred during updating repository VCS settings"
1026 1046 msgstr ""
1027 1047
1028 #: rhodecode/controllers/admin/repos.py:831
1048 #: rhodecode/controllers/admin/repos.py:834
1029 1049 #: rhodecode/controllers/admin/settings.py:168
1030 1050 msgid "Updated VCS settings"
1031 1051 msgstr ""
@@ -1091,26 +1111,18 b' msgid "Updated Labs settings"'
1091 1111 msgstr ""
1092 1112
1093 1113 #: rhodecode/controllers/admin/settings.py:795
1094 msgid "Mercurial server-side merge"
1114 msgid "Subversion HTTP Support"
1095 1115 msgstr ""
1096 1116
1097 1117 #: rhodecode/controllers/admin/settings.py:796
1098 msgid "Use rebase instead of creating a merge commit when merging via web interface"
1118 msgid "Proxy subversion HTTP requests"
1099 1119 msgstr ""
1100 1120
1101 1121 #: rhodecode/controllers/admin/settings.py:802
1102 msgid "Subversion HTTP Support"
1103 msgstr ""
1104
1105 #: rhodecode/controllers/admin/settings.py:803
1106 msgid "Proxy subversion HTTP requests"
1107 msgstr ""
1108
1109 #: rhodecode/controllers/admin/settings.py:809
1110 1122 msgid "Subversion HTTP Server URL"
1111 1123 msgstr ""
1112 1124
1113 #: rhodecode/controllers/admin/settings.py:811
1125 #: rhodecode/controllers/admin/settings.py:804
1114 1126 msgid "e.g. http://localhost:8080/"
1115 1127 msgstr ""
1116 1128
@@ -1155,121 +1167,281 b' msgid "User Group global permissions upd'
1155 1167 msgstr ""
1156 1168
1157 1169 #: rhodecode/controllers/admin/user_groups.py:440
1158 #: rhodecode/controllers/admin/users.py:566
1170 #: rhodecode/controllers/admin/users.py:561
1159 1171 msgid "An error occurred during permissions saving"
1160 1172 msgstr ""
1161 1173
1162 #: rhodecode/controllers/admin/users.py:147
1174 #: rhodecode/controllers/admin/users.py:142
1163 1175 #, python-format
1164 1176 msgid "Created user %(user_link)s"
1165 1177 msgstr ""
1166 1178
1167 #: rhodecode/controllers/admin/users.py:162
1179 #: rhodecode/controllers/admin/users.py:157
1168 1180 #, python-format
1169 1181 msgid "Error occurred during creation of user %s"
1170 1182 msgstr ""
1171 1183
1172 #: rhodecode/controllers/admin/users.py:206
1184 #: rhodecode/controllers/admin/users.py:201
1173 1185 msgid "User updated successfully"
1174 1186 msgstr ""
1175 1187
1188 #: rhodecode/controllers/admin/users.py:252
1189 #, python-format
1190 msgid "Detached %s repositories"
1191 msgstr ""
1192
1176 1193 #: rhodecode/controllers/admin/users.py:257
1177 1194 #, python-format
1178 msgid "Detached %s repositories"
1179 msgstr ""
1180
1181 #: rhodecode/controllers/admin/users.py:262
1182 #, python-format
1183 1195 msgid "Deleted %s repositories"
1184 1196 msgstr ""
1185 1197
1198 #: rhodecode/controllers/admin/users.py:265
1199 #, python-format
1200 msgid "Detached %s repository groups"
1201 msgstr ""
1202
1186 1203 #: rhodecode/controllers/admin/users.py:270
1187 1204 #, python-format
1188 msgid "Detached %s repository groups"
1189 msgstr ""
1190
1191 #: rhodecode/controllers/admin/users.py:275
1192 #, python-format
1193 1205 msgid "Deleted %s repository groups"
1194 1206 msgstr ""
1195 1207
1208 #: rhodecode/controllers/admin/users.py:278
1209 #, python-format
1210 msgid "Detached %s user groups"
1211 msgstr ""
1212
1196 1213 #: rhodecode/controllers/admin/users.py:283
1197 1214 #, python-format
1198 msgid "Detached %s user groups"
1199 msgstr ""
1200
1201 #: rhodecode/controllers/admin/users.py:288
1202 #, python-format
1203 1215 msgid "Deleted %s user groups"
1204 1216 msgstr ""
1205 1217
1206 #: rhodecode/controllers/admin/users.py:299
1218 #: rhodecode/controllers/admin/users.py:294
1207 1219 msgid "Successfully deleted user"
1208 1220 msgstr ""
1209 1221
1210 #: rhodecode/controllers/admin/users.py:305
1222 #: rhodecode/controllers/admin/users.py:300
1211 1223 msgid "An error occurred during deletion of user"
1212 1224 msgstr ""
1213 1225
1214 #: rhodecode/controllers/admin/users.py:324
1226 #: rhodecode/controllers/admin/users.py:319
1215 1227 msgid "Force password change disabled for user"
1216 1228 msgstr ""
1217 1229
1218 #: rhodecode/controllers/admin/users.py:326
1230 #: rhodecode/controllers/admin/users.py:321
1219 1231 msgid "Force password change enabled for user"
1220 1232 msgstr ""
1221 1233
1222 #: rhodecode/controllers/admin/users.py:330
1234 #: rhodecode/controllers/admin/users.py:325
1223 1235 msgid "An error occurred during password reset for user"
1224 1236 msgstr ""
1225 1237
1226 #: rhodecode/controllers/admin/users.py:356
1238 #: rhodecode/controllers/admin/users.py:351
1227 1239 #, python-format
1228 1240 msgid "Created repository group `%s`"
1229 1241 msgstr ""
1230 1242
1231 #: rhodecode/controllers/admin/users.py:360
1243 #: rhodecode/controllers/admin/users.py:355
1232 1244 msgid "An error occurred during repository group creation for user"
1233 1245 msgstr ""
1234 1246
1235 #: rhodecode/controllers/admin/users.py:379
1236 #: rhodecode/controllers/admin/users.py:400
1237 #: rhodecode/controllers/admin/users.py:430
1238 #: rhodecode/controllers/admin/users.py:461
1239 #: rhodecode/controllers/admin/users.py:478
1240 #: rhodecode/controllers/admin/users.py:501
1241 #: rhodecode/controllers/admin/users.py:575
1242 #: rhodecode/controllers/admin/users.py:588
1243 #: rhodecode/controllers/admin/users.py:646
1247 #: rhodecode/controllers/admin/users.py:374
1248 #: rhodecode/controllers/admin/users.py:395
1249 #: rhodecode/controllers/admin/users.py:425
1250 #: rhodecode/controllers/admin/users.py:456
1251 #: rhodecode/controllers/admin/users.py:473
1252 #: rhodecode/controllers/admin/users.py:496
1253 #: rhodecode/controllers/admin/users.py:570
1254 #: rhodecode/controllers/admin/users.py:583
1255 #: rhodecode/controllers/admin/users.py:641
1244 1256 msgid "You can't edit this user"
1245 1257 msgstr ""
1246 1258
1247 #: rhodecode/controllers/admin/users.py:414
1259 #: rhodecode/controllers/admin/users.py:409
1248 1260 msgid "The user participates as reviewer in pull requests and cannot be deleted. You can set the user to \"inactive\" instead of deleting it."
1249 1261 msgstr ""
1250 1262
1251 #: rhodecode/controllers/admin/users.py:550
1263 #: rhodecode/controllers/admin/users.py:545
1252 1264 msgid "User global permissions updated successfully"
1253 1265 msgstr ""
1254 1266
1255 #: rhodecode/controllers/admin/users.py:678
1267 #: rhodecode/controllers/admin/users.py:673
1256 1268 #, python-format
1257 1269 msgid "An error occurred during ip saving:%s"
1258 1270 msgstr ""
1259 1271
1260 #: rhodecode/controllers/admin/users.py:693
1272 #: rhodecode/controllers/admin/users.py:688
1261 1273 msgid "An error occurred during ip saving"
1262 1274 msgstr ""
1263 1275
1264 #: rhodecode/controllers/admin/users.py:697
1276 #: rhodecode/controllers/admin/users.py:692
1265 1277 #, python-format
1266 1278 msgid "Added ips %s to user whitelist"
1267 1279 msgstr ""
1268 1280
1269 #: rhodecode/controllers/admin/users.py:715
1281 #: rhodecode/controllers/admin/users.py:710
1270 1282 msgid "Removed ip address from user whitelist"
1271 1283 msgstr ""
1272 1284
1285 #: rhodecode/events/pullrequest.py:65
1286 msgid "pullrequest created"
1287 msgstr ""
1288
1289 #: rhodecode/events/pullrequest.py:74
1290 msgid "pullrequest closed"
1291 msgstr ""
1292
1293 #: rhodecode/events/pullrequest.py:83
1294 msgid "pullrequest commits updated"
1295 msgstr ""
1296
1297 #: rhodecode/events/pullrequest.py:92
1298 msgid "pullrequest review changed"
1299 msgstr ""
1300
1301 #: rhodecode/events/pullrequest.py:101
1302 msgid "pullrequest merged"
1303 msgstr ""
1304
1305 #: rhodecode/events/pullrequest.py:110
1306 msgid "pullrequest commented"
1307 msgstr ""
1308
1309 #: rhodecode/events/repo.py:135
1310 msgid "repository pre create"
1311 msgstr ""
1312
1313 #: rhodecode/events/repo.py:144
1314 msgid "repository created"
1315 msgstr ""
1316
1317 #: rhodecode/events/repo.py:153
1318 msgid "repository pre delete"
1319 msgstr ""
1320
1321 #: rhodecode/events/repo.py:162
1322 msgid "repository deleted"
1323 msgstr ""
1324
1325 #: rhodecode/events/repo.py:193
1326 msgid "repository pre pull"
1327 msgstr ""
1328
1329 #: rhodecode/events/repo.py:202
1330 msgid "repository pull"
1331 msgstr ""
1332
1333 #: rhodecode/events/repo.py:211
1334 msgid "repository pre push"
1335 msgstr ""
1336
1337 #: rhodecode/events/repo.py:222
1338 msgid "repository push"
1339 msgstr ""
1340
1341 #: rhodecode/events/user.py:34
1342 msgid "user registered"
1343 msgstr ""
1344
1345 #: rhodecode/events/user.py:48
1346 msgid "user pre create"
1347 msgstr ""
1348
1349 #: rhodecode/events/user.py:61
1350 msgid "user pre update"
1351 msgstr ""
1352
1353 #: rhodecode/integrations/schema.py:35
1354 msgid "Enable or disable this integration."
1355 msgstr ""
1356
1357 #: rhodecode/integrations/schema.py:42
1358 msgid "Short name for this integration."
1359 msgstr ""
1360
1361 #: rhodecode/integrations/schema.py:44
1362 msgid "Integration name"
1363 msgstr ""
1364
1365 #: rhodecode/integrations/views.py:172
1366 msgid "Integration {integration_name} deleted successfully."
1367 msgstr ""
1368
1369 #: rhodecode/integrations/views.py:200
1370 msgid "Errors exist when saving integration settings. Please check the form inputs."
1371 msgstr ""
1372
1373 #: rhodecode/integrations/views.py:220
1374 msgid "Integration {integration_name} updated successfully."
1375 msgstr ""
1376
1377 #: rhodecode/integrations/types/slack.py:45
1378 msgid "Slack service URL"
1379 msgstr ""
1380
1381 #: rhodecode/integrations/types/slack.py:46
1382 msgid "This can be setup at the <a href=\"https://my.slack.com/services/new/incoming-webhook/\">slack app manager</a>"
1383 msgstr ""
1384
1385 #: rhodecode/integrations/types/slack.py:59 rhodecode/templates/login.html:43
1386 #: rhodecode/templates/register.html:41
1387 #: rhodecode/templates/admin/admin_log.html:7
1388 #: rhodecode/templates/admin/my_account/my_account_profile.html:24
1389 #: rhodecode/templates/admin/my_account/my_account_profile_edit.html:21
1390 #: rhodecode/templates/admin/my_account/my_account_profile_edit.html:66
1391 #: rhodecode/templates/admin/users/user_add.html:35
1392 #: rhodecode/templates/admin/users/user_edit_profile.html:39
1393 #: rhodecode/templates/admin/users/users.html:88
1394 #: rhodecode/templates/base/base.html:306
1395 #: rhodecode/templates/debug_style/login.html:36
1396 #: rhodecode/templates/email_templates/user_registration.mako:23
1397 #: rhodecode/templates/users/user_profile.html:27
1398 msgid "Username"
1399 msgstr ""
1400
1401 #: rhodecode/integrations/types/slack.py:60
1402 msgid "Username to show notifications coming from."
1403 msgstr ""
1404
1405 #: rhodecode/integrations/types/slack.py:69
1406 msgid "Channel"
1407 msgstr ""
1408
1409 #: rhodecode/integrations/types/slack.py:70
1410 msgid "Channel to send notifications to."
1411 msgstr ""
1412
1413 #: rhodecode/integrations/types/slack.py:79
1414 msgid "Emoji"
1415 msgstr ""
1416
1417 #: rhodecode/integrations/types/slack.py:80
1418 msgid "Emoji to use eg. :studio_microphone:"
1419 msgstr ""
1420
1421 #: rhodecode/integrations/types/slack.py:107
1422 msgid "Slack"
1423 msgstr ""
1424
1425 #: rhodecode/integrations/types/webhook.py:41
1426 msgid "Webhook URL"
1427 msgstr ""
1428
1429 #: rhodecode/integrations/types/webhook.py:42
1430 msgid "URL of the webhook to receive POST event."
1431 msgstr ""
1432
1433 #: rhodecode/integrations/types/webhook.py:51
1434 msgid "Secret Token"
1435 msgstr ""
1436
1437 #: rhodecode/integrations/types/webhook.py:52
1438 msgid "String used to validate received payloads."
1439 msgstr ""
1440
1441 #: rhodecode/integrations/types/webhook.py:62
1442 msgid "Webhook"
1443 msgstr ""
1444
1273 1445 #: rhodecode/lib/action_parser.py:89
1274 1446 msgid "[deleted] repository"
1275 1447 msgstr ""
@@ -1411,11 +1583,15 b' msgstr ""'
1411 1583 msgid "You need to be signed in to view this page"
1412 1584 msgstr ""
1413 1585
1414 #: rhodecode/lib/base.py:511
1586 #: rhodecode/lib/base.py:545
1415 1587 #, python-format
1416 1588 msgid "The repository at %(repo_name)s cannot be located."
1417 1589 msgstr ""
1418 1590
1591 #: rhodecode/lib/diffs.py:56
1592 msgid "Click to comment"
1593 msgstr ""
1594
1419 1595 #: rhodecode/lib/diffs.py:71
1420 1596 msgid "Binary file"
1421 1597 msgstr ""
@@ -1428,36 +1604,40 b' msgstr ""'
1428 1604 msgid "No changes detected"
1429 1605 msgstr ""
1430 1606
1431 #: rhodecode/lib/helpers.py:1434
1607 #: rhodecode/lib/diffs.py:631
1608 msgid "Click to select line"
1609 msgstr ""
1610
1611 #: rhodecode/lib/helpers.py:1481
1432 1612 #, python-format
1433 1613 msgid " and %s more"
1434 1614 msgstr ""
1435 1615
1436 #: rhodecode/lib/helpers.py:1438
1616 #: rhodecode/lib/helpers.py:1485
1437 1617 msgid "No Files"
1438 1618 msgstr ""
1439 1619
1440 #: rhodecode/lib/helpers.py:1511
1620 #: rhodecode/lib/helpers.py:1558
1441 1621 msgid "new file"
1442 1622 msgstr ""
1443 1623
1444 #: rhodecode/lib/helpers.py:1514
1624 #: rhodecode/lib/helpers.py:1561
1445 1625 msgid "mod"
1446 1626 msgstr ""
1447 1627
1448 #: rhodecode/lib/helpers.py:1517
1628 #: rhodecode/lib/helpers.py:1564
1449 1629 msgid "del"
1450 1630 msgstr ""
1451 1631
1452 #: rhodecode/lib/helpers.py:1520
1632 #: rhodecode/lib/helpers.py:1567
1453 1633 msgid "rename"
1454 1634 msgstr ""
1455 1635
1456 #: rhodecode/lib/helpers.py:1525
1636 #: rhodecode/lib/helpers.py:1572
1457 1637 msgid "chmod"
1458 1638 msgstr ""
1459 1639
1460 #: rhodecode/lib/helpers.py:1767
1640 #: rhodecode/lib/helpers.py:1819
1461 1641 msgid ""
1462 1642 "Example filter terms:\n"
1463 1643 " repository:vcs\n"
@@ -1476,89 +1656,91 b' msgid ""'
1476 1656 " \"username:test AND repository:test*\"\n"
1477 1657 msgstr ""
1478 1658
1479 #: rhodecode/lib/helpers.py:1787
1659 #: rhodecode/lib/helpers.py:1839
1480 1660 #, python-format
1481 1661 msgid "%s repository is not mapped to db perhaps it was created or renamed from the filesystem please run the application again in order to rescan repositories"
1482 1662 msgstr ""
1483 1663
1484 #: rhodecode/lib/utils2.py:453
1664 #: rhodecode/lib/utils2.py:454
1485 1665 #, python-format
1486 1666 msgid "%d year"
1487 1667 msgid_plural "%d years"
1488 1668 msgstr[0] ""
1489 1669 msgstr[1] ""
1490 1670
1491 #: rhodecode/lib/utils2.py:454
1671 #: rhodecode/lib/utils2.py:455
1492 1672 #, python-format
1493 1673 msgid "%d month"
1494 1674 msgid_plural "%d months"
1495 1675 msgstr[0] ""
1496 1676 msgstr[1] ""
1497 1677
1498 #: rhodecode/lib/utils2.py:455
1678 #: rhodecode/lib/utils2.py:456
1499 1679 #, python-format
1500 1680 msgid "%d day"
1501 1681 msgid_plural "%d days"
1502 1682 msgstr[0] ""
1503 1683 msgstr[1] ""
1504 1684
1505 #: rhodecode/lib/utils2.py:456
1685 #: rhodecode/lib/utils2.py:457
1506 1686 #, python-format
1507 1687 msgid "%d hour"
1508 1688 msgid_plural "%d hours"
1509 1689 msgstr[0] ""
1510 1690 msgstr[1] ""
1511 1691
1512 #: rhodecode/lib/utils2.py:457
1692 #: rhodecode/lib/utils2.py:458
1513 1693 #, python-format
1514 1694 msgid "%d minute"
1515 1695 msgid_plural "%d minutes"
1516 1696 msgstr[0] ""
1517 1697 msgstr[1] ""
1518 1698
1519 #: rhodecode/lib/utils2.py:458
1699 #: rhodecode/lib/utils2.py:459
1520 1700 #, python-format
1521 1701 msgid "%d second"
1522 1702 msgid_plural "%d seconds"
1523 1703 msgstr[0] ""
1524 1704 msgstr[1] ""
1525 1705
1526 #: rhodecode/lib/utils2.py:476
1706 #: rhodecode/lib/utils2.py:477
1527 1707 #, python-format
1528 1708 msgid "in %s"
1529 1709 msgstr ""
1530 1710
1531 #: rhodecode/lib/utils2.py:482
1711 #: rhodecode/lib/utils2.py:483
1532 1712 #, python-format
1533 1713 msgid "%s ago"
1534 1714 msgstr ""
1535 1715
1536 #: rhodecode/lib/utils2.py:492
1716 #: rhodecode/lib/utils2.py:493
1537 1717 #, python-format
1538 1718 msgid "%s, %s ago"
1539 1719 msgstr ""
1540 1720
1541 #: rhodecode/lib/utils2.py:494
1721 #: rhodecode/lib/utils2.py:495
1542 1722 #, python-format
1543 1723 msgid "in %s, %s"
1544 1724 msgstr ""
1545 1725
1546 #: rhodecode/lib/utils2.py:496
1726 #: rhodecode/lib/utils2.py:497
1547 1727 #, python-format
1548 1728 msgid "%s and %s"
1549 1729 msgstr ""
1550 1730
1551 #: rhodecode/lib/utils2.py:498
1731 #: rhodecode/lib/utils2.py:499
1552 1732 #, python-format
1553 1733 msgid "%s and %s ago"
1554 1734 msgstr ""
1555 1735
1556 #: rhodecode/lib/utils2.py:500
1736 #: rhodecode/lib/utils2.py:501
1557 1737 #, python-format
1558 1738 msgid "in %s and %s"
1559 1739 msgstr ""
1560 1740
1561 #: rhodecode/lib/utils2.py:504
1741 #: rhodecode/lib/utils2.py:505 rhodecode/public/js/scripts.js:25035
1742 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:49
1743 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:174
1562 1744 msgid "just now"
1563 1745 msgstr ""
1564 1746
@@ -1584,7 +1766,8 b' msgstr ""'
1584 1766 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:818
1585 1767 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:824
1586 1768 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:946
1587 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:971 rhodecode/model/db.py:2291
1769 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:971
1770 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2293 rhodecode/model/db.py:2285
1588 1771 msgid "Repository no access"
1589 1772 msgstr ""
1590 1773
@@ -1610,7 +1793,8 b' msgstr ""'
1610 1793 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:819
1611 1794 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:825
1612 1795 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:947
1613 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:972 rhodecode/model/db.py:2292
1796 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:972
1797 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2294 rhodecode/model/db.py:2286
1614 1798 msgid "Repository read access"
1615 1799 msgstr ""
1616 1800
@@ -1636,7 +1820,8 b' msgstr ""'
1636 1820 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:820
1637 1821 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:826
1638 1822 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:948
1639 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:973 rhodecode/model/db.py:2293
1823 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:973
1824 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2295 rhodecode/model/db.py:2287
1640 1825 msgid "Repository write access"
1641 1826 msgstr ""
1642 1827
@@ -1662,7 +1847,8 b' msgstr ""'
1662 1847 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:821
1663 1848 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:827
1664 1849 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:949
1665 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:974 rhodecode/model/db.py:2294
1850 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:974
1851 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2296 rhodecode/model/db.py:2288
1666 1852 msgid "Repository admin access"
1667 1853 msgstr ""
1668 1854
@@ -1728,7 +1914,8 b' msgstr ""'
1728 1914 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:839
1729 1915 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:845
1730 1916 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:967
1731 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:992 rhodecode/model/db.py:2312
1917 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:992
1918 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2314 rhodecode/model/db.py:2306
1732 1919 msgid "Repository creation disabled"
1733 1920 msgstr ""
1734 1921
@@ -1754,7 +1941,8 b' msgstr ""'
1754 1941 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:840
1755 1942 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:846
1756 1943 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:968
1757 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:993 rhodecode/model/db.py:2313
1944 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:993
1945 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2315 rhodecode/model/db.py:2307
1758 1946 msgid "Repository creation enabled"
1759 1947 msgstr ""
1760 1948
@@ -1780,7 +1968,8 b' msgstr ""'
1780 1968 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:844
1781 1969 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:850
1782 1970 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:972
1783 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:997 rhodecode/model/db.py:2317
1971 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:997
1972 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2319 rhodecode/model/db.py:2311
1784 1973 msgid "Repository forking disabled"
1785 1974 msgstr ""
1786 1975
@@ -1806,7 +1995,8 b' msgstr ""'
1806 1995 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:845
1807 1996 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:851
1808 1997 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:973
1809 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:998 rhodecode/model/db.py:2318
1998 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:998
1999 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2320 rhodecode/model/db.py:2312
1810 2000 msgid "Repository forking enabled"
1811 2001 msgstr ""
1812 2002
@@ -1853,7 +2043,8 b' msgstr ""'
1853 2043 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:1186
1854 2044 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:1196
1855 2045 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:1318
1856 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1343 rhodecode/model/db.py:2950
2046 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1343
2047 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2952 rhodecode/model/db.py:2944
1857 2048 msgid "Not Reviewed"
1858 2049 msgstr ""
1859 2050
@@ -1879,7 +2070,8 b' msgstr ""'
1879 2070 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:1187
1880 2071 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:1197
1881 2072 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:1319
1882 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1344 rhodecode/model/db.py:2951
2073 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1344
2074 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2953 rhodecode/model/db.py:2945
1883 2075 msgid "Approved"
1884 2076 msgstr ""
1885 2077
@@ -1905,7 +2097,8 b' msgstr ""'
1905 2097 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:1188
1906 2098 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:1198
1907 2099 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:1320
1908 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1345 rhodecode/model/db.py:2952
2100 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1345
2101 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2954 rhodecode/model/db.py:2946
1909 2102 msgid "Rejected"
1910 2103 msgstr ""
1911 2104
@@ -1931,7 +2124,8 b' msgstr ""'
1931 2124 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:1189
1932 2125 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:1199
1933 2126 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:1321
1934 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1346 rhodecode/model/db.py:2953
2127 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1346
2128 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2955 rhodecode/model/db.py:2947
1935 2129 msgid "Under Review"
1936 2130 msgstr ""
1937 2131
@@ -1954,7 +2148,8 b' msgstr ""'
1954 2148 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:823
1955 2149 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:829
1956 2150 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:951
1957 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:976 rhodecode/model/db.py:2296
2151 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:976
2152 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2298 rhodecode/model/db.py:2290
1958 2153 msgid "Repository group no access"
1959 2154 msgstr ""
1960 2155
@@ -1977,7 +2172,8 b' msgstr ""'
1977 2172 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:824
1978 2173 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:830
1979 2174 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:952
1980 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:977 rhodecode/model/db.py:2297
2175 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:977
2176 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2299 rhodecode/model/db.py:2291
1981 2177 msgid "Repository group read access"
1982 2178 msgstr ""
1983 2179
@@ -2000,7 +2196,8 b' msgstr ""'
2000 2196 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:825
2001 2197 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:831
2002 2198 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:953
2003 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:978 rhodecode/model/db.py:2298
2199 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:978
2200 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2300 rhodecode/model/db.py:2292
2004 2201 msgid "Repository group write access"
2005 2202 msgstr ""
2006 2203
@@ -2023,7 +2220,8 b' msgstr ""'
2023 2220 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:826
2024 2221 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:832
2025 2222 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:954
2026 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:979 rhodecode/model/db.py:2299
2223 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:979
2224 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2301 rhodecode/model/db.py:2293
2027 2225 msgid "Repository group admin access"
2028 2226 msgstr ""
2029 2227
@@ -2045,7 +2243,8 b' msgstr ""'
2045 2243 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:828
2046 2244 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:834
2047 2245 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:956
2048 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:981 rhodecode/model/db.py:2301
2246 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:981
2247 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2303 rhodecode/model/db.py:2295
2049 2248 msgid "User group no access"
2050 2249 msgstr ""
2051 2250
@@ -2067,7 +2266,8 b' msgstr ""'
2067 2266 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:829
2068 2267 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:835
2069 2268 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:957
2070 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:982 rhodecode/model/db.py:2302
2269 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:982
2270 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2304 rhodecode/model/db.py:2296
2071 2271 msgid "User group read access"
2072 2272 msgstr ""
2073 2273
@@ -2089,7 +2289,8 b' msgstr ""'
2089 2289 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:830
2090 2290 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:836
2091 2291 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:958
2092 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:983 rhodecode/model/db.py:2303
2292 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:983
2293 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2305 rhodecode/model/db.py:2297
2093 2294 msgid "User group write access"
2094 2295 msgstr ""
2095 2296
@@ -2111,7 +2312,8 b' msgstr ""'
2111 2312 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:831
2112 2313 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:837
2113 2314 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:959
2114 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:984 rhodecode/model/db.py:2304
2315 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:984
2316 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2306 rhodecode/model/db.py:2298
2115 2317 msgid "User group admin access"
2116 2318 msgstr ""
2117 2319
@@ -2133,7 +2335,8 b' msgstr ""'
2133 2335 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:833
2134 2336 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:839
2135 2337 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:961
2136 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:986 rhodecode/model/db.py:2306
2338 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:986
2339 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2308 rhodecode/model/db.py:2300
2137 2340 msgid "Repository Group creation disabled"
2138 2341 msgstr ""
2139 2342
@@ -2155,7 +2358,8 b' msgstr ""'
2155 2358 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:834
2156 2359 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:840
2157 2360 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:962
2158 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:987 rhodecode/model/db.py:2307
2361 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:987
2362 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2309 rhodecode/model/db.py:2301
2159 2363 msgid "Repository Group creation enabled"
2160 2364 msgstr ""
2161 2365
@@ -2177,7 +2381,8 b' msgstr ""'
2177 2381 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:836
2178 2382 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:842
2179 2383 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:964
2180 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:989 rhodecode/model/db.py:2309
2384 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:989
2385 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2311 rhodecode/model/db.py:2303
2181 2386 msgid "User Group creation disabled"
2182 2387 msgstr ""
2183 2388
@@ -2199,7 +2404,8 b' msgstr ""'
2199 2404 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:837
2200 2405 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:843
2201 2406 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:965
2202 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:990 rhodecode/model/db.py:2310
2407 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:990
2408 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2312 rhodecode/model/db.py:2304
2203 2409 msgid "User Group creation enabled"
2204 2410 msgstr ""
2205 2411
@@ -2221,7 +2427,8 b' msgstr ""'
2221 2427 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:847
2222 2428 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:853
2223 2429 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:975
2224 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1000 rhodecode/model/db.py:2320
2430 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1000
2431 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2322 rhodecode/model/db.py:2314
2225 2432 msgid "Registration disabled"
2226 2433 msgstr ""
2227 2434
@@ -2243,7 +2450,8 b' msgstr ""'
2243 2450 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:848
2244 2451 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:854
2245 2452 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:976
2246 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1001 rhodecode/model/db.py:2321
2453 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1001
2454 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2323 rhodecode/model/db.py:2315
2247 2455 msgid "User Registration with manual account activation"
2248 2456 msgstr ""
2249 2457
@@ -2265,7 +2473,8 b' msgstr ""'
2265 2473 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:849
2266 2474 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:855
2267 2475 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:977
2268 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1002 rhodecode/model/db.py:2322
2476 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1002
2477 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2324 rhodecode/model/db.py:2316
2269 2478 msgid "User Registration with automatic account activation"
2270 2479 msgstr ""
2271 2480
@@ -2287,7 +2496,8 b' msgstr ""'
2287 2496 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:851
2288 2497 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:857
2289 2498 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:979
2290 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1004 rhodecode/model/db.py:2324
2499 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1004
2500 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2326 rhodecode/model/db.py:2318
2291 2501 msgid "Manual activation of external account"
2292 2502 msgstr ""
2293 2503
@@ -2309,7 +2519,8 b' msgstr ""'
2309 2519 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:852
2310 2520 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:858
2311 2521 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:980
2312 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1005 rhodecode/model/db.py:2325
2522 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1005
2523 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2327 rhodecode/model/db.py:2319
2313 2524 msgid "Automatic activation of external account"
2314 2525 msgstr ""
2315 2526
@@ -2325,7 +2536,8 b' msgstr ""'
2325 2536 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:841
2326 2537 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:847
2327 2538 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:969
2328 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:994 rhodecode/model/db.py:2314
2539 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:994
2540 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2316 rhodecode/model/db.py:2308
2329 2541 msgid "Repository creation enabled with write permission to a repository group"
2330 2542 msgstr ""
2331 2543
@@ -2341,7 +2553,8 b' msgstr ""'
2341 2553 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:842
2342 2554 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:848
2343 2555 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:970
2344 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:995 rhodecode/model/db.py:2315
2556 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:995
2557 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2317 rhodecode/model/db.py:2309
2345 2558 msgid "Repository creation disabled with write permission to a repository group"
2346 2559 msgstr ""
2347 2560
@@ -2354,7 +2567,8 b' msgstr ""'
2354 2567 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:816
2355 2568 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:822
2356 2569 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:944
2357 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:969 rhodecode/model/db.py:2289
2570 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:969
2571 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2291 rhodecode/model/db.py:2283
2358 2572 msgid "RhodeCode Super Administrator"
2359 2573 msgstr ""
2360 2574
@@ -2365,7 +2579,8 b' msgstr ""'
2365 2579 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:854
2366 2580 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:860
2367 2581 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:982
2368 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1007 rhodecode/model/db.py:2327
2582 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1007
2583 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2329 rhodecode/model/db.py:2321
2369 2584 msgid "Inherit object permissions from default user disabled"
2370 2585 msgstr ""
2371 2586
@@ -2376,10 +2591,35 b' msgstr ""'
2376 2591 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:855
2377 2592 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:861
2378 2593 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:983
2379 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1008 rhodecode/model/db.py:2328
2594 #: rhodecode/lib/dbmigrate/schema/db_3_7_0_0.py:1008
2595 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2330 rhodecode/model/db.py:2322
2380 2596 msgid "Inherit object permissions from default user enabled"
2381 2597 msgstr ""
2382 2598
2599 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:909 rhodecode/model/db.py:910
2600 msgid "all"
2601 msgstr ""
2602
2603 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:910 rhodecode/model/db.py:911
2604 msgid "http/web interface"
2605 msgstr ""
2606
2607 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:911 rhodecode/model/db.py:912
2608 msgid "vcs (git/hg/svn protocol)"
2609 msgstr ""
2610
2611 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:912 rhodecode/model/db.py:913
2612 msgid "api calls"
2613 msgstr ""
2614
2615 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:913 rhodecode/model/db.py:914
2616 msgid "feed access"
2617 msgstr ""
2618
2619 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2069 rhodecode/model/db.py:2061
2620 msgid "No parent"
2621 msgstr ""
2622
2383 2623 #: rhodecode/lib/index/whoosh.py:148
2384 2624 msgid "Invalid search query. Try quoting it."
2385 2625 msgstr ""
@@ -2424,48 +2664,32 b' msgstr ""'
2424 2664 msgid "Your password reset link was sent"
2425 2665 msgstr ""
2426 2666
2427 #: rhodecode/login/views.py:333
2667 #: rhodecode/login/views.py:336
2428 2668 msgid "Your password reset was successful, a new password has been sent to your email"
2429 2669 msgstr ""
2430 2670
2431 #: rhodecode/model/db.py:909
2432 msgid "all"
2433 msgstr ""
2434
2435 #: rhodecode/model/db.py:910
2436 msgid "http/web interface"
2437 msgstr ""
2438
2439 #: rhodecode/model/db.py:911
2440 msgid "vcs (git/hg protocol)"
2441 msgstr ""
2442
2443 #: rhodecode/model/db.py:912
2444 msgid "api calls"
2445 msgstr ""
2446
2447 #: rhodecode/model/db.py:913
2448 msgid "feed access"
2449 msgstr ""
2450
2451 #: rhodecode/model/db.py:2067
2452 msgid "No parent"
2453 msgstr ""
2454
2455 #: rhodecode/model/forms.py:66
2671 #: rhodecode/model/comment.py:263
2672 msgid "made a comment"
2673 msgstr ""
2674
2675 #: rhodecode/model/comment.py:264
2676 msgid "Refresh page"
2677 msgstr ""
2678
2679 #: rhodecode/model/forms.py:85
2456 2680 msgid "Please enter a login"
2457 2681 msgstr ""
2458 2682
2459 #: rhodecode/model/forms.py:67
2683 #: rhodecode/model/forms.py:86
2460 2684 #, python-format
2461 2685 msgid "Enter a value %(min)i characters long or more"
2462 2686 msgstr ""
2463 2687
2464 #: rhodecode/model/forms.py:76
2688 #: rhodecode/model/forms.py:95
2465 2689 msgid "Please enter a password"
2466 2690 msgstr ""
2467 2691
2468 #: rhodecode/model/forms.py:77
2692 #: rhodecode/model/forms.py:96
2469 2693 #, python-format
2470 2694 msgid "Enter %(min)i characters or more"
2471 2695 msgstr ""
@@ -2574,43 +2798,43 b' msgid ""'
2574 2798 " %(pr_title)s"
2575 2799 msgstr ""
2576 2800
2577 #: rhodecode/model/pull_request.py:448
2801 #: rhodecode/model/pull_request.py:449
2578 2802 msgid "Pull request merged and closed"
2579 2803 msgstr ""
2580 2804
2581 #: rhodecode/model/pull_request.py:867
2805 #: rhodecode/model/pull_request.py:874
2582 2806 msgid "Server-side pull request merging is disabled."
2583 2807 msgstr ""
2584 2808
2585 #: rhodecode/model/pull_request.py:869
2809 #: rhodecode/model/pull_request.py:876
2586 2810 msgid "This pull request is closed."
2587 2811 msgstr ""
2588 2812
2589 #: rhodecode/model/pull_request.py:880
2813 #: rhodecode/model/pull_request.py:887
2590 2814 msgid "Pull request merging is not supported."
2591 2815 msgstr ""
2592 2816
2593 #: rhodecode/model/pull_request.py:898
2817 #: rhodecode/model/pull_request.py:905
2594 2818 msgid "Target repository large files support is disabled."
2595 2819 msgstr ""
2596 2820
2597 #: rhodecode/model/pull_request.py:901
2821 #: rhodecode/model/pull_request.py:908
2598 2822 msgid "Source repository large files support is disabled."
2599 2823 msgstr ""
2600 2824
2601 #: rhodecode/model/pull_request.py:1050 rhodecode/model/scm.py:791
2825 #: rhodecode/model/pull_request.py:1058 rhodecode/model/scm.py:788
2602 2826 msgid "Bookmarks"
2603 2827 msgstr ""
2604 2828
2605 #: rhodecode/model/pull_request.py:1055
2829 #: rhodecode/model/pull_request.py:1063
2606 2830 msgid "Commit IDs"
2607 2831 msgstr ""
2608 2832
2609 #: rhodecode/model/pull_request.py:1058
2833 #: rhodecode/model/pull_request.py:1066
2610 2834 msgid "Closed Branches"
2611 2835 msgstr ""
2612 2836
2613 #: rhodecode/model/scm.py:773
2837 #: rhodecode/model/scm.py:770
2614 2838 msgid "latest tip"
2615 2839 msgstr ""
2616 2840
@@ -2811,6 +3035,7 b' msgid "Revisions %(revs)s are already pa'
2811 3035 msgstr ""
2812 3036
2813 3037 #: rhodecode/model/validators.py:933
3038 #: rhodecode/model/validation_schema/validators.py:14
2814 3039 msgid "Please enter a valid IPv4 or IpV6 address"
2815 3040 msgstr ""
2816 3041
@@ -2824,31 +3049,389 b' msgid "Key name can only consist of lett'
2824 3049 msgstr ""
2825 3050
2826 3051 #: rhodecode/model/validators.py:976
2827 msgid "Filename cannot be inside a directory"
2828 msgstr ""
2829
2830 #: rhodecode/model/validators.py:992
2831 3052 #, python-format
2832 3053 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
2833 3054 msgstr ""
2834 3055
2835 #: rhodecode/model/validators.py:995
3056 #: rhodecode/model/validators.py:979
2836 3057 #, python-format
2837 3058 msgid "The plugin \"%(plugin_id)s\" is missing an includeme function."
2838 3059 msgstr ""
2839 3060
2840 #: rhodecode/model/validators.py:998
3061 #: rhodecode/model/validators.py:982
2841 3062 #, python-format
2842 3063 msgid "Can not load plugin \"%(plugin_id)s\""
2843 3064 msgstr ""
2844 3065
2845 #: rhodecode/model/validators.py:1000
3066 #: rhodecode/model/validators.py:984
2846 3067 #, python-format
2847 3068 msgid "No plugin available with ID \"%(plugin_id)s\""
2848 3069 msgstr ""
2849 3070
2850 #: rhodecode/model/validators.py:1067
2851 msgid "This gistid is already in use"
3071 #: rhodecode/model/validation_schema/schemas/gist_schema.py:89
3072 msgid "Gist with name {} already exists"
3073 msgstr ""
3074
3075 #: rhodecode/model/validation_schema/schemas/gist_schema.py:95
3076 msgid "Filename {} cannot be inside a directory"
3077 msgstr ""
3078
3079 #: rhodecode/model/validation_schema/schemas/gist_schema.py:132
3080 msgid "Duplicated value for filename found: `{}`"
3081 msgstr ""
3082
3083 #: rhodecode/public/js/scripts.js:23039
3084 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:16
3085 #: rhodecode/public/js/src/plugins/jquery.autocomplete.js:87
3086 msgid "No results"
3087 msgstr ""
3088
3089 #: rhodecode/public/js/scripts.js:24970
3090 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:66
3091 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:109
3092 msgid "{0} year"
3093 msgstr ""
3094
3095 #: rhodecode/public/js/scripts.js:24971
3096 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:62
3097 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:110
3098 msgid "{0} month"
3099 msgstr ""
3100
3101 #: rhodecode/public/js/scripts.js:24972
3102 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:57
3103 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:111
3104 msgid "{0} day"
3105 msgstr ""
3106
3107 #: rhodecode/public/js/scripts.js:24973
3108 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:59
3109 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:112
3110 msgid "{0} hour"
3111 msgstr ""
3112
3113 #: rhodecode/public/js/scripts.js:24974
3114 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:61
3115 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:113
3116 msgid "{0} min"
3117 msgstr ""
3118
3119 #: rhodecode/public/js/scripts.js:24975
3120 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:65
3121 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:114
3122 msgid "{0} sec"
3123 msgstr ""
3124
3125 #: rhodecode/public/js/scripts.js:24995
3126 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:46
3127 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:134
3128 msgid "in {0}"
3129 msgstr ""
3130
3131 #: rhodecode/public/js/scripts.js:25003
3132 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:54
3133 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:142
3134 msgid "{0} ago"
3135 msgstr ""
3136
3137 #: rhodecode/public/js/scripts.js:25015
3138 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:68
3139 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:154
3140 msgid "{0}, {1} ago"
3141 msgstr ""
3142
3143 #: rhodecode/public/js/scripts.js:25017
3144 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:48
3145 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:156
3146 msgid "in {0}, {1}"
3147 msgstr ""
3148
3149 #: rhodecode/public/js/scripts.js:25021
3150 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:55
3151 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:160
3152 msgid "{0} and {1}"
3153 msgstr ""
3154
3155 #: rhodecode/public/js/scripts.js:25023
3156 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:56
3157 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:162
3158 msgid "{0} and {1} ago"
3159 msgstr ""
3160
3161 #: rhodecode/public/js/scripts.js:25025
3162 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:47
3163 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:164
3164 msgid "in {0} and {1}"
3165 msgstr ""
3166
3167 #: rhodecode/public/js/scripts.js:39304
3168 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:7
3169 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:4
3170 msgid "Loading more results..."
3171 msgstr ""
3172
3173 #: rhodecode/public/js/scripts.js:39307
3174 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:27
3175 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:7
3176 msgid "Searching..."
3177 msgstr ""
3178
3179 #: rhodecode/public/js/scripts.js:39310
3180 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:11
3181 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:10
3182 msgid "No matches found"
3183 msgstr ""
3184
3185 #: rhodecode/public/js/scripts.js:39313
3186 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:6
3187 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:13
3188 msgid "Loading failed"
3189 msgstr ""
3190
3191 #: rhodecode/public/js/scripts.js:39317
3192 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:20
3193 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:17
3194 msgid "One result is available, press enter to select it."
3195 msgstr ""
3196
3197 #: rhodecode/public/js/scripts.js:39319
3198 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:64
3199 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:19
3200 msgid "{0} results are available, use up and down arrow keys to navigate."
3201 msgstr ""
3202
3203 #: rhodecode/public/js/scripts.js:39324
3204 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:25
3205 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:24
3206 msgid "Please enter {0} or more character"
3207 msgstr ""
3208
3209 #: rhodecode/public/js/scripts.js:39326
3210 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:26
3211 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:26
3212 msgid "Please enter {0} or more characters"
3213 msgstr ""
3214
3215 #: rhodecode/public/js/scripts.js:39331
3216 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:23
3217 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:31
3218 msgid "Please delete {0} character"
3219 msgstr ""
3220
3221 #: rhodecode/public/js/scripts.js:39333
3222 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:24
3223 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:33
3224 msgid "Please delete {0} characters"
3225 msgstr ""
3226
3227 #: rhodecode/public/js/scripts.js:39337
3228 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:40
3229 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:37
3230 msgid "You can only select {0} item"
3231 msgstr ""
3232
3233 #: rhodecode/public/js/scripts.js:39339
3234 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:41
3235 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:39
3236 msgid "You can only select {0} items"
3237 msgstr ""
3238
3239 #: rhodecode/public/js/scripts.js:40911
3240 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:29
3241 #: rhodecode/public/js/src/rhodecode/codemirror.js:369
3242 msgid "Set status to Approved"
3243 msgstr ""
3244
3245 #: rhodecode/public/js/scripts.js:40929
3246 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:30
3247 #: rhodecode/public/js/src/rhodecode/codemirror.js:387
3248 msgid "Set status to Rejected"
3249 msgstr ""
3250
3251 #: rhodecode/public/js/scripts.js:41308
3252 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:2
3253 #: rhodecode/public/js/src/rhodecode/comments.js:235
3254 msgid "Add another comment"
3255 msgstr ""
3256
3257 #: rhodecode/public/js/scripts.js:41526
3258 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:35
3259 #: rhodecode/public/js/src/rhodecode/comments.js:453
3260 msgid "Status Review"
3261 msgstr ""
3262
3263 #: rhodecode/public/js/scripts.js:41540
3264 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:3
3265 #: rhodecode/public/js/src/rhodecode/comments.js:467
3266 msgid "Comment text will be set automatically based on currently selected status ({0}) ..."
3267 msgstr ""
3268
3269 #: rhodecode/public/js/scripts.js:41653
3270 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:37
3271 #: rhodecode/public/js/src/rhodecode/comments.js:580
3272 msgid "Submitting..."
3273 msgstr ""
3274
3275 #: rhodecode/public/js/scripts.js:41703
3276 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:5
3277 #: rhodecode/public/js/src/rhodecode/comments.js:630
3278 #: rhodecode/templates/files/files_browser_tree.html:47
3279 msgid "Loading ..."
3280 msgstr ""
3281
3282 #: rhodecode/public/js/scripts.js:41903
3283 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:51
3284 #: rhodecode/public/js/src/rhodecode/files.js:150
3285 msgid "truncated result"
3286 msgstr ""
3287
3288 #: rhodecode/public/js/scripts.js:41905
3289 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:52
3290 #: rhodecode/public/js/src/rhodecode/files.js:152
3291 msgid "truncated results"
3292 msgstr ""
3293
3294 #: rhodecode/public/js/scripts.js:41914
3295 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:12
3296 #: rhodecode/public/js/src/rhodecode/files.js:161
3297 msgid "No matching files"
3298 msgstr ""
3299
3300 #: rhodecode/public/js/scripts.js:42049
3301 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:28
3302 #: rhodecode/public/js/src/rhodecode/files.js:296
3303 msgid "Selection link"
3304 msgstr ""
3305
3306 #: rhodecode/public/js/scripts.js:42089
3307 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:36
3308 #: rhodecode/public/js/src/rhodecode/followers.js:26
3309 msgid "Stop following this repository"
3310 msgstr ""
3311
3312 #: rhodecode/public/js/scripts.js:42090
3313 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:38
3314 #: rhodecode/public/js/src/rhodecode/followers.js:27
3315 msgid "Unfollow"
3316 msgstr ""
3317
3318 #: rhodecode/public/js/scripts.js:42099
3319 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:34
3320 #: rhodecode/public/js/src/rhodecode/followers.js:36
3321 msgid "Start following this repository"
3322 msgstr ""
3323
3324 #: rhodecode/public/js/scripts.js:42100
3325 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:4
3326 #: rhodecode/public/js/src/rhodecode/followers.js:37
3327 msgid "Follow"
3328 msgstr ""
3329
3330 #: rhodecode/public/js/scripts.js:43049
3331 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:44
3332 #: rhodecode/public/js/src/rhodecode.js:142
3333 msgid "file"
3334 msgstr ""
3335
3336 #: rhodecode/public/js/scripts.js:43069
3337 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:31
3338 #: rhodecode/public/js/src/rhodecode.js:162
3339 msgid "Show more"
3340 msgstr ""
3341
3342 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:8
3343 msgid "No bookmarks available yet."
3344 msgstr ""
3345
3346 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:9
3347 msgid "No branches available yet."
3348 msgstr ""
3349
3350 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:10
3351 msgid "No gists available yet."
3352 msgstr ""
3353
3354 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:13
3355 msgid "No pull requests available yet."
3356 msgstr ""
3357
3358 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:14
3359 msgid "No repositories available yet."
3360 msgstr ""
3361
3362 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:15
3363 msgid "No repository groups available yet."
3364 msgstr ""
3365
3366 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:17
3367 msgid "No tags available yet."
3368 msgstr ""
3369
3370 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:18
3371 msgid "No user groups available yet."
3372 msgstr ""
3373
3374 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:19
3375 msgid "No users available yet."
3376 msgstr ""
3377
3378 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:21
3379 #: rhodecode/templates/changelog/changelog.html:62
3380 msgid "Open new pull request"
3381 msgstr ""
3382
3383 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:22
3384 msgid "Open new pull request for selected commit"
3385 msgstr ""
3386
3387 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:32
3388 msgid "Show selected commit __S"
3389 msgstr ""
3390
3391 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:33
3392 msgid "Show selected commits __S ... __E"
3393 msgstr ""
3394
3395 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:39
3396 msgid "Updating..."
3397 msgstr ""
3398
3399 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:42
3400 #: rhodecode/templates/admin/auth/auth_settings.html:71
3401 msgid "disabled"
3402 msgstr ""
3403
3404 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:43
3405 #: rhodecode/templates/admin/auth/auth_settings.html:71
3406 msgid "enabled"
3407 msgstr ""
3408
3409 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:45
3410 msgid "files"
3411 msgstr ""
3412
3413 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:50
3414 msgid "specify commit"
3415 msgstr ""
3416
3417 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:53
3418 msgid "{0} active out of {1} users"
3419 msgstr ""
3420
3421 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:58
3422 msgid "{0} days"
3423 msgstr ""
3424
3425 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:60
3426 msgid "{0} hours"
3427 msgstr ""
3428
3429 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:63
3430 msgid "{0} months"
3431 msgstr ""
3432
3433 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:67
3434 msgid "{0} years"
2852 3435 msgstr ""
2853 3436
2854 3437 #: rhodecode/templates/index.html:5
@@ -2909,7 +3492,7 b' msgstr ""'
2909 3492 #: rhodecode/templates/base/perms_summary.html:102
2910 3493 #: rhodecode/templates/bookmarks/bookmarks.html:59
2911 3494 #: rhodecode/templates/branches/branches.html:58
2912 #: rhodecode/templates/files/files_browser.html:49
3495 #: rhodecode/templates/files/files_browser_tree.html:5
2913 3496 #: rhodecode/templates/pullrequests/pullrequests.html:100
2914 3497 #: rhodecode/templates/tags/tags.html:59
2915 3498 msgid "Name"
@@ -2918,6 +3501,7 b' msgstr ""'
2918 3501 #: rhodecode/templates/index_base.html:100
2919 3502 #: rhodecode/templates/index_base.html:125
2920 3503 #: rhodecode/templates/admin/gists/index.html:114
3504 #: rhodecode/templates/admin/integrations/list.html:63
2921 3505 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:77
2922 3506 #: rhodecode/templates/admin/repo_groups/repo_group_add.html:45
2923 3507 #: rhodecode/templates/admin/repo_groups/repo_group_edit_settings.html:42
@@ -2933,8 +3517,9 b' msgstr ""'
2933 3517 #: rhodecode/templates/base/issue_tracker_settings.html:10
2934 3518 #: rhodecode/templates/changeset/changeset.html:53
2935 3519 #: rhodecode/templates/compare/compare_commits.html:24
3520 #: rhodecode/templates/email_templates/commit_comment.mako:82
2936 3521 #: rhodecode/templates/email_templates/pull_request_review.mako:30
2937 #: rhodecode/templates/email_templates/pull_request_review.mako:67
3522 #: rhodecode/templates/email_templates/pull_request_review.mako:51
2938 3523 #: rhodecode/templates/files/file_tree_detail.html:5
2939 3524 #: rhodecode/templates/files/file_tree_detail.html:12
2940 3525 #: rhodecode/templates/forks/fork.html:48
@@ -2972,12 +3557,12 b' msgstr ""'
2972 3557 #: rhodecode/templates/admin/repos/repos.html:63
2973 3558 #: rhodecode/templates/bookmarks/bookmarks.html:66
2974 3559 #: rhodecode/templates/branches/branches.html:65
2975 #: rhodecode/templates/changelog/changelog.html:106
2976 #: rhodecode/templates/changelog/changelog_summary_data.html:6
3560 #: rhodecode/templates/changelog/changelog.html:104
3561 #: rhodecode/templates/changelog/changelog_summary_data.html:8
2977 3562 #: rhodecode/templates/changeset/changeset.html:36
2978 3563 #: rhodecode/templates/compare/compare_commits.html:22
2979 #: rhodecode/templates/email_templates/commit_comment.mako:16
2980 3564 #: rhodecode/templates/email_templates/commit_comment.mako:45
3565 #: rhodecode/templates/email_templates/commit_comment.mako:81
2981 3566 #: rhodecode/templates/search/search_commit.html:6
2982 3567 #: rhodecode/templates/tags/tags.html:66
2983 3568 msgid "Commit"
@@ -2993,7 +3578,7 b' msgid "Home"'
2993 3578 msgstr ""
2994 3579
2995 3580 #: rhodecode/templates/login.html:5 rhodecode/templates/login.html:35
2996 #: rhodecode/templates/login.html:64 rhodecode/templates/base/base.html:328
3581 #: rhodecode/templates/login.html:64 rhodecode/templates/base/base.html:329
2997 3582 #: rhodecode/templates/debug_style/login.html:60
2998 3583 msgid "Sign In"
2999 3584 msgstr ""
@@ -3002,20 +3587,6 b' msgstr ""'
3002 3587 msgid "Go to the registration page to create a new account."
3003 3588 msgstr ""
3004 3589
3005 #: rhodecode/templates/login.html:43 rhodecode/templates/register.html:41
3006 #: rhodecode/templates/admin/admin_log.html:5
3007 #: rhodecode/templates/admin/my_account/my_account_profile.html:24
3008 #: rhodecode/templates/admin/my_account/my_account_profile_edit.html:21
3009 #: rhodecode/templates/admin/my_account/my_account_profile_edit.html:66
3010 #: rhodecode/templates/admin/users/user_add.html:35
3011 #: rhodecode/templates/admin/users/user_edit_profile.html:39
3012 #: rhodecode/templates/admin/users/users.html:89
3013 #: rhodecode/templates/base/base.html:305
3014 #: rhodecode/templates/debug_style/login.html:36
3015 #: rhodecode/templates/users/user_profile.html:27
3016 msgid "Username"
3017 msgstr ""
3018
3019 3590 #: rhodecode/templates/login.html:58
3020 3591 msgid "Remember me"
3021 3592 msgstr ""
@@ -3051,7 +3622,7 b' msgid "Send password reset email"'
3051 3622 msgstr ""
3052 3623
3053 3624 #: rhodecode/templates/password_reset.html:60
3054 msgid "Password reset link will be send to matching email address"
3625 msgid "Password reset link will be sent to matching email address"
3055 3626 msgstr ""
3056 3627
3057 3628 #: rhodecode/templates/register.html:35
@@ -3072,7 +3643,7 b' msgstr ""'
3072 3643 #: rhodecode/templates/admin/my_account/my_account_profile_edit.html:76
3073 3644 #: rhodecode/templates/admin/users/user_add.html:68
3074 3645 #: rhodecode/templates/admin/users/user_edit_profile.html:47
3075 #: rhodecode/templates/admin/users/users.html:93
3646 #: rhodecode/templates/admin/users/users.html:92
3076 3647 msgid "First Name"
3077 3648 msgstr ""
3078 3649
@@ -3082,7 +3653,7 b' msgstr ""'
3082 3653 #: rhodecode/templates/admin/my_account/my_account_profile_edit.html:85
3083 3654 #: rhodecode/templates/admin/users/user_add.html:77
3084 3655 #: rhodecode/templates/admin/users/user_edit_profile.html:56
3085 #: rhodecode/templates/admin/users/users.html:95
3656 #: rhodecode/templates/admin/users/users.html:94
3086 3657 msgid "Last Name"
3087 3658 msgstr ""
3088 3659
@@ -3096,7 +3667,7 b' msgstr ""'
3096 3667
3097 3668 #: rhodecode/templates/admin/admin.html:5
3098 3669 #: rhodecode/templates/admin/admin.html:15
3099 #: rhodecode/templates/base/base.html:78
3670 #: rhodecode/templates/base/base.html:77
3100 3671 msgid "Admin journal"
3101 3672 msgstr ""
3102 3673
@@ -3121,17 +3692,17 b' msgstr[1] ""'
3121 3692 msgid "Example Queries"
3122 3693 msgstr ""
3123 3694
3124 #: rhodecode/templates/admin/admin_log.html:6
3695 #: rhodecode/templates/admin/admin_log.html:8
3125 3696 #: rhodecode/templates/admin/my_account/my_account_repos.html:37
3126 3697 #: rhodecode/templates/admin/repo_groups/repo_groups.html:62
3127 3698 #: rhodecode/templates/admin/repos/repo_edit_fields.html:13
3128 3699 #: rhodecode/templates/admin/repos/repos.html:69
3129 3700 #: rhodecode/templates/admin/user_groups/user_groups.html:66
3130 #: rhodecode/templates/admin/users/users.html:106
3701 #: rhodecode/templates/admin/users/users.html:105
3131 3702 msgid "Action"
3132 3703 msgstr ""
3133 3704
3134 #: rhodecode/templates/admin/admin_log.html:7
3705 #: rhodecode/templates/admin/admin_log.html:9
3135 3706 #: rhodecode/templates/admin/defaults/defaults.html:31
3136 3707 #: rhodecode/templates/admin/permissions/permissions_objects.html:13
3137 3708 #: rhodecode/templates/search/search_commit.html:5
@@ -3139,18 +3710,18 b' msgstr ""'
3139 3710 msgid "Repository"
3140 3711 msgstr ""
3141 3712
3142 #: rhodecode/templates/admin/admin_log.html:8
3713 #: rhodecode/templates/admin/admin_log.html:10
3143 3714 #: rhodecode/templates/bookmarks/bookmarks.html:61
3144 3715 #: rhodecode/templates/branches/branches.html:60
3145 3716 #: rhodecode/templates/tags/tags.html:61
3146 3717 msgid "Date"
3147 3718 msgstr ""
3148 3719
3149 #: rhodecode/templates/admin/admin_log.html:9
3720 #: rhodecode/templates/admin/admin_log.html:11
3150 3721 msgid "From IP"
3151 3722 msgstr ""
3152 3723
3153 #: rhodecode/templates/admin/admin_log.html:44
3724 #: rhodecode/templates/admin/admin_log.html:46
3154 3725 msgid "No actions yet"
3155 3726 msgstr ""
3156 3727
@@ -3162,6 +3733,9 b' msgstr ""'
3162 3733 #: rhodecode/templates/admin/auth/auth_settings.html:12
3163 3734 #: rhodecode/templates/admin/auth/plugin_settings.html:12
3164 3735 #: rhodecode/templates/admin/defaults/defaults.html:12
3736 #: rhodecode/templates/admin/integrations/base.html:19
3737 #: rhodecode/templates/admin/integrations/edit.html:15
3738 #: rhodecode/templates/admin/integrations/list.html:8
3165 3739 #: rhodecode/templates/admin/permissions/permissions.html:12
3166 3740 #: rhodecode/templates/admin/repo_groups/repo_group_add.html:12
3167 3741 #: rhodecode/templates/admin/repo_groups/repo_group_edit.html:12
@@ -3179,9 +3753,9 b' msgstr ""'
3179 3753 #: rhodecode/templates/admin/users/user_add.html:11
3180 3754 #: rhodecode/templates/admin/users/user_edit.html:12
3181 3755 #: rhodecode/templates/admin/users/users.html:13
3182 #: rhodecode/templates/admin/users/users.html:102
3183 #: rhodecode/templates/base/base.html:405
3184 #: rhodecode/templates/base/base.html:412
3756 #: rhodecode/templates/admin/users/users.html:101
3757 #: rhodecode/templates/base/base.html:406
3758 #: rhodecode/templates/base/base.html:413
3185 3759 msgid "Admin"
3186 3760 msgstr ""
3187 3761
@@ -3206,14 +3780,6 b' msgstr ""'
3206 3780 msgid "Available Built-in Plugins"
3207 3781 msgstr ""
3208 3782
3209 #: rhodecode/templates/admin/auth/auth_settings.html:71
3210 msgid "enabled"
3211 msgstr ""
3212
3213 #: rhodecode/templates/admin/auth/auth_settings.html:71
3214 msgid "disabled"
3215 msgstr ""
3216
3217 3783 #: rhodecode/templates/admin/auth/auth_settings.html:81
3218 3784 #: rhodecode/templates/admin/auth/plugin_settings.html:87
3219 3785 #: rhodecode/templates/admin/defaults/defaults_repositories.html:63
@@ -3254,6 +3820,7 b' msgstr ""'
3254 3820
3255 3821 #: rhodecode/templates/admin/defaults/defaults_repositories.html:14
3256 3822 #: rhodecode/templates/admin/gists/index.html:110
3823 #: rhodecode/templates/admin/integrations/list.html:64
3257 3824 #: rhodecode/templates/admin/repos/repo_add_base.html:62
3258 3825 #: rhodecode/templates/admin/repos/repo_edit_fields.html:12
3259 3826 msgid "Type"
@@ -3320,18 +3887,18 b' msgstr ""'
3320 3887 msgid "Gist access level"
3321 3888 msgstr ""
3322 3889
3323 #: rhodecode/templates/admin/gists/edit.html:59
3890 #: rhodecode/templates/admin/gists/edit.html:62
3324 3891 #: rhodecode/templates/admin/gists/new.html:50
3325 3892 #: rhodecode/templates/files/files_add.html:74
3326 3893 #: rhodecode/templates/files/files_edit.html:78
3327 3894 msgid "plain"
3328 3895 msgstr ""
3329 3896
3330 #: rhodecode/templates/admin/gists/edit.html:103
3897 #: rhodecode/templates/admin/gists/edit.html:107
3331 3898 msgid "Update Gist"
3332 3899 msgstr ""
3333 3900
3334 #: rhodecode/templates/admin/gists/edit.html:104
3901 #: rhodecode/templates/admin/gists/edit.html:108
3335 3902 #: rhodecode/templates/base/issue_tracker_settings.html:74
3336 3903 #: rhodecode/templates/changeset/changeset_file_comment.html:139
3337 3904 #: rhodecode/templates/files/files_add.html:102
@@ -3392,14 +3959,14 b' msgstr ""'
3392 3959
3393 3960 #: rhodecode/templates/admin/gists/index.html:108
3394 3961 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:24
3395 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:87
3962 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:89
3396 3963 #: rhodecode/templates/bookmarks/bookmarks.html:63
3397 3964 #: rhodecode/templates/branches/branches.html:62
3398 #: rhodecode/templates/changelog/changelog.html:102
3399 #: rhodecode/templates/changelog/changelog_summary_data.html:10
3965 #: rhodecode/templates/changelog/changelog.html:110
3966 #: rhodecode/templates/changelog/changelog_summary_data.html:11
3400 3967 #: rhodecode/templates/changeset/changeset.html:164
3401 3968 #: rhodecode/templates/compare/compare_commits.html:21
3402 #: rhodecode/templates/files/files_browser.html:53
3969 #: rhodecode/templates/files/files_browser_tree.html:9
3403 3970 #: rhodecode/templates/pullrequests/pullrequest_show.html:169
3404 3971 #: rhodecode/templates/pullrequests/pullrequests.html:102
3405 3972 #: rhodecode/templates/search/search_commit.html:16
@@ -3482,9 +4049,10 b' msgid "Gist"'
3482 4049 msgstr ""
3483 4050
3484 4051 #: rhodecode/templates/admin/gists/show.html:49
4052 #: rhodecode/templates/admin/integrations/list.html:110
3485 4053 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:56
3486 4054 #: rhodecode/templates/admin/my_account/my_account_emails.html:32
3487 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:61
4055 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:63
3488 4056 #: rhodecode/templates/admin/permissions/permissions_ips.html:26
3489 4057 #: rhodecode/templates/admin/repos/repo_edit_fields.html:25
3490 4058 #: rhodecode/templates/admin/settings/settings_hooks.html:46
@@ -3496,10 +4064,10 b' msgstr ""'
3496 4064 #: rhodecode/templates/base/vcs_settings.html:172
3497 4065 #: rhodecode/templates/changeset/changeset_file_comment.html:49
3498 4066 #: rhodecode/templates/changeset/changeset_file_comment.html:99
3499 #: rhodecode/templates/data_table/_dt_elements.html:117
3500 #: rhodecode/templates/data_table/_dt_elements.html:174
3501 #: rhodecode/templates/data_table/_dt_elements.html:188
3502 #: rhodecode/templates/data_table/_dt_elements.html:200
4067 #: rhodecode/templates/data_table/_dt_elements.html:119
4068 #: rhodecode/templates/data_table/_dt_elements.html:176
4069 #: rhodecode/templates/data_table/_dt_elements.html:190
4070 #: rhodecode/templates/data_table/_dt_elements.html:202
3503 4071 #: rhodecode/templates/debug_style/buttons.html:132
3504 4072 #: rhodecode/templates/files/files_source.html:33
3505 4073 #: rhodecode/templates/files/files_source.html:37
@@ -3512,14 +4080,15 b' msgid "Confirm to delete this Gist"'
3512 4080 msgstr ""
3513 4081
3514 4082 #: rhodecode/templates/admin/gists/show.html:56
4083 #: rhodecode/templates/admin/integrations/list.html:103
3515 4084 #: rhodecode/templates/admin/my_account/my_account_profile.html:5
3516 4085 #: rhodecode/templates/base/issue_tracker_settings.html:61
3517 4086 #: rhodecode/templates/changeset/changeset_file_comment.html:145
3518 4087 #: rhodecode/templates/changeset/changeset_file_comment.html:292
3519 #: rhodecode/templates/data_table/_dt_elements.html:112
3520 #: rhodecode/templates/data_table/_dt_elements.html:170
3521 #: rhodecode/templates/data_table/_dt_elements.html:183
3522 #: rhodecode/templates/data_table/_dt_elements.html:196
4088 #: rhodecode/templates/data_table/_dt_elements.html:114
4089 #: rhodecode/templates/data_table/_dt_elements.html:172
4090 #: rhodecode/templates/data_table/_dt_elements.html:185
4091 #: rhodecode/templates/data_table/_dt_elements.html:198
3523 4092 #: rhodecode/templates/debug_style/buttons.html:128
3524 4093 #: rhodecode/templates/files/files_add.html:204
3525 4094 #: rhodecode/templates/files/files_edit.html:165
@@ -3549,8 +4118,44 b' msgstr ""'
3549 4118 msgid "Show as raw"
3550 4119 msgstr ""
3551 4120
4121 #: rhodecode/templates/admin/integrations/base.html:12
4122 msgid "Integrations settings"
4123 msgstr ""
4124
4125 #: rhodecode/templates/admin/integrations/edit.html:17
4126 #: rhodecode/templates/admin/integrations/list.html:10
4127 #: rhodecode/templates/admin/repo_groups/repo_group_edit.html:44
4128 #: rhodecode/templates/admin/repos/repo_edit.html:15
4129 #: rhodecode/templates/admin/repos/repo_edit.html:43
4130 #: rhodecode/templates/admin/settings/settings.html:14
4131 #: rhodecode/templates/admin/user_groups/user_group_edit.html:33
4132 #: rhodecode/templates/base/base.html:86 rhodecode/templates/base/base.html:251
4133 msgid "Settings"
4134 msgstr ""
4135
4136 #: rhodecode/templates/admin/integrations/edit.html:36
4137 #, python-format
4138 msgid "Create new %(integration_type)s integration"
4139 msgstr ""
4140
4141 #: rhodecode/templates/admin/integrations/list.html:31
4142 msgid "Create new integration"
4143 msgstr ""
4144
4145 #: rhodecode/templates/admin/integrations/list.html:56
4146 msgid "Current integrations"
4147 msgstr ""
4148
4149 #: rhodecode/templates/admin/integrations/list.html:65
4150 msgid "Actions"
4151 msgstr ""
4152
4153 #: rhodecode/templates/admin/integrations/list.html:89
4154 msgid "unknown integration"
4155 msgstr ""
4156
3552 4157 #: rhodecode/templates/admin/my_account/my_account.html:5
3553 #: rhodecode/templates/base/base.html:342
4158 #: rhodecode/templates/base/base.html:343
3554 4159 msgid "My account"
3555 4160 msgstr ""
3556 4161
@@ -3586,7 +4191,7 b' msgstr ""'
3586 4191
3587 4192 #: rhodecode/templates/admin/my_account/my_account.html:40
3588 4193 #: rhodecode/templates/admin/notifications/notifications.html:33
3589 #: rhodecode/templates/base/base.html:242
4194 #: rhodecode/templates/base/base.html:243
3590 4195 msgid "Pull Requests"
3591 4196 msgstr ""
3592 4197
@@ -3594,6 +4199,10 b' msgstr ""'
3594 4199 msgid "My Permissions"
3595 4200 msgstr ""
3596 4201
4202 #: rhodecode/templates/admin/my_account/my_account.html:42
4203 msgid "My Live Notifications"
4204 msgstr ""
4205
3597 4206 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:3
3598 4207 msgid "Authentication Tokens"
3599 4208 msgstr ""
@@ -3603,7 +4212,7 b' msgid "Built-in tokens can be used to au'
3603 4212 msgstr ""
3604 4213
3605 4214 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:8
3606 msgid "Each token can have a role. VCS tokens can be used together with the authtoken auth plugin for git/hg operations."
4215 msgid "Each token can have a role. VCS tokens can be used together with the authtoken auth plugin for git/hg/svn operations."
3607 4216 msgstr ""
3608 4217
3609 4218 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:14
@@ -3680,6 +4289,19 b' msgstr ""'
3680 4289 msgid "New email address"
3681 4290 msgstr ""
3682 4291
4292 #: rhodecode/templates/admin/my_account/my_account_notifications.html:3
4293 msgid "Your live notification settings"
4294 msgstr ""
4295
4296 #: rhodecode/templates/admin/my_account/my_account_notifications.html:14
4297 #: rhodecode/templates/admin/notifications/show_notification.html:12
4298 msgid "Notifications"
4299 msgstr ""
4300
4301 #: rhodecode/templates/admin/my_account/my_account_notifications.html:14
4302 msgid "Disabled"
4303 msgstr ""
4304
3683 4305 #: rhodecode/templates/admin/my_account/my_account_password.html:3
3684 4306 msgid "Change Your Account Password"
3685 4307 msgstr ""
@@ -3734,35 +4356,35 b' msgid "Pull Requests You Opened"'
3734 4356 msgstr ""
3735 4357
3736 4358 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:23
3737 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:86
4359 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:88
3738 4360 msgid "Target Repo"
3739 4361 msgstr ""
3740 4362
3741 4363 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:26
3742 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:89
4364 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:91
3743 4365 #: rhodecode/templates/admin/settings/settings_global.html:9
3744 4366 #: rhodecode/templates/email_templates/pull_request_review.mako:28
3745 #: rhodecode/templates/email_templates/pull_request_review.mako:65
4367 #: rhodecode/templates/email_templates/pull_request_review.mako:48
3746 4368 #: rhodecode/templates/pullrequests/pullrequest.html:38
3747 4369 #: rhodecode/templates/pullrequests/pullrequests.html:104
3748 4370 msgid "Title"
3749 4371 msgstr ""
3750 4372
3751 4373 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:27
3752 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:90
4374 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:92
3753 4375 msgid "Opened On"
3754 4376 msgstr ""
3755 4377
3756 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:41
3757 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:103
3758 #: rhodecode/templates/changelog/changelog.html:141
4378 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:43
4379 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:107
4380 #: rhodecode/templates/changelog/changelog.html:153
3759 4381 #: rhodecode/templates/compare/compare_commits.html:49
3760 4382 #: rhodecode/templates/search/search_commit.html:36
3761 4383 msgid "Expand commit message"
3762 4384 msgstr ""
3763 4385
3764 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:50
3765 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:112
4386 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:52
4387 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:116
3766 4388 #: rhodecode/templates/changeset/changeset_file_comment.html:284
3767 4389 #: rhodecode/templates/pullrequests/pullrequest_show.html:14
3768 4390 #: rhodecode/templates/pullrequests/pullrequest_show.html:112
@@ -3770,19 +4392,19 b' msgstr ""'
3770 4392 msgid "Closed"
3771 4393 msgstr ""
3772 4394
3773 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:62
4395 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:64
3774 4396 msgid "Confirm to delete this pull request"
3775 4397 msgstr ""
3776 4398
3777 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:69
4399 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:71
3778 4400 msgid "You currently have no open pull requests."
3779 4401 msgstr ""
3780 4402
3781 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:77
4403 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:79
3782 4404 msgid "Pull Requests You Participate In"
3783 4405 msgstr ""
3784 4406
3785 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:125
4407 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:129
3786 4408 msgid "There are currently no open pull requests requiring your participation."
3787 4409 msgstr ""
3788 4410
@@ -3822,19 +4444,15 b' msgstr ""'
3822 4444 msgid "Show notification"
3823 4445 msgstr ""
3824 4446
3825 #: rhodecode/templates/admin/notifications/show_notification.html:12
3826 msgid "Notifications"
3827 msgstr ""
3828
3829 4447 #: rhodecode/templates/admin/permissions/permissions.html:5
3830 4448 msgid "Permissions Administration"
3831 4449 msgstr ""
3832 4450
3833 4451 #: rhodecode/templates/admin/permissions/permissions.html:14
3834 4452 #: rhodecode/templates/admin/repo_groups/repo_group_edit.html:45
3835 #: rhodecode/templates/admin/repos/repo_edit.html:42
4453 #: rhodecode/templates/admin/repos/repo_edit.html:46
3836 4454 #: rhodecode/templates/admin/user_groups/user_group_edit.html:34
3837 #: rhodecode/templates/base/base.html:83
4455 #: rhodecode/templates/base/base.html:82
3838 4456 msgid "Permissions"
3839 4457 msgstr ""
3840 4458
@@ -3963,7 +4581,7 b' msgstr ""'
3963 4581
3964 4582 #: rhodecode/templates/admin/repo_groups/repo_group_add.html:14
3965 4583 #: rhodecode/templates/admin/users/user_edit_advanced.html:12
3966 #: rhodecode/templates/base/base.html:80 rhodecode/templates/base/base.html:152
4584 #: rhodecode/templates/base/base.html:79 rhodecode/templates/base/base.html:153
3967 4585 msgid "Repository groups"
3968 4586 msgstr ""
3969 4587
@@ -3994,17 +4612,8 b' msgstr ""'
3994 4612 msgid "Add Child Group"
3995 4613 msgstr ""
3996 4614
3997 #: rhodecode/templates/admin/repo_groups/repo_group_edit.html:44
3998 #: rhodecode/templates/admin/repos/repo_edit.html:15
3999 #: rhodecode/templates/admin/repos/repo_edit.html:39
4000 #: rhodecode/templates/admin/settings/settings.html:14
4001 #: rhodecode/templates/admin/user_groups/user_group_edit.html:33
4002 #: rhodecode/templates/base/base.html:86 rhodecode/templates/base/base.html:250
4003 msgid "Settings"
4004 msgstr ""
4005
4006 4615 #: rhodecode/templates/admin/repo_groups/repo_group_edit.html:46
4007 #: rhodecode/templates/admin/repos/repo_edit.html:45
4616 #: rhodecode/templates/admin/repos/repo_edit.html:49
4008 4617 #: rhodecode/templates/admin/user_groups/user_group_edit.html:35
4009 4618 #: rhodecode/templates/admin/users/user_edit.html:35
4010 4619 msgid "Advanced"
@@ -4177,7 +4786,7 b' msgid "Import Existing Repository ?"'
4177 4786 msgstr ""
4178 4787
4179 4788 #: rhodecode/templates/admin/repos/repo_add_base.html:23
4180 #: rhodecode/templates/base/base.html:197
4789 #: rhodecode/templates/base/base.html:198
4181 4790 msgid "Clone from"
4182 4791 msgstr ""
4183 4792
@@ -4244,19 +4853,19 b' msgstr ""'
4244 4853 msgid "%s repository settings"
4245 4854 msgstr ""
4246 4855
4247 #: rhodecode/templates/admin/repos/repo_edit.html:51
4856 #: rhodecode/templates/admin/repos/repo_edit.html:55
4248 4857 msgid "Extra Fields"
4249 4858 msgstr ""
4250 4859
4251 #: rhodecode/templates/admin/repos/repo_edit.html:57
4252 msgid "Caches"
4253 msgstr ""
4254
4255 4860 #: rhodecode/templates/admin/repos/repo_edit.html:61
4256 msgid "Remote"
4861 msgid "Caches"
4257 4862 msgstr ""
4258 4863
4259 4864 #: rhodecode/templates/admin/repos/repo_edit.html:65
4865 msgid "Remote"
4866 msgstr ""
4867
4868 #: rhodecode/templates/admin/repos/repo_edit.html:69
4260 4869 #: rhodecode/templates/summary/components.html:135
4261 4870 msgid "Statistics"
4262 4871 msgstr ""
@@ -4358,7 +4967,7 b' msgid "Delete forks"'
4358 4967 msgstr ""
4359 4968
4360 4969 #: rhodecode/templates/admin/repos/repo_edit_advanced.html:139
4361 #: rhodecode/templates/data_table/_dt_elements.html:118
4970 #: rhodecode/templates/data_table/_dt_elements.html:120
4362 4971 #, python-format
4363 4972 msgid "Confirm to delete this repository: %s"
4364 4973 msgstr ""
@@ -4419,7 +5028,7 b' msgstr ""'
4419 5028 #: rhodecode/templates/admin/user_groups/user_groups.html:62
4420 5029 #: rhodecode/templates/admin/users/user_add.html:97
4421 5030 #: rhodecode/templates/admin/users/user_edit_profile.html:90
4422 #: rhodecode/templates/admin/users/users.html:100
5031 #: rhodecode/templates/admin/users/users.html:99
4423 5032 msgid "Active"
4424 5033 msgstr ""
4425 5034
@@ -4575,7 +5184,7 b' msgid "http[s] url where from repository'
4575 5184 msgstr ""
4576 5185
4577 5186 #: rhodecode/templates/admin/repos/repo_edit_settings.html:56
4578 #: rhodecode/templates/data_table/_dt_elements.html:158
5187 #: rhodecode/templates/data_table/_dt_elements.html:160
4579 5188 #: rhodecode/templates/forks/fork.html:58
4580 5189 msgid "Repository group"
4581 5190 msgstr ""
@@ -4823,12 +5432,11 b' msgid "Server Announcement"'
4823 5432 msgstr ""
4824 5433
4825 5434 #: rhodecode/templates/admin/settings/settings_global.html:80
4826 msgid "Custom js/css code added at the end of the <header> tag."
5435 msgid "Custom js/css code added at the end of the <header/> tag."
4827 5436 msgstr ""
4828 5437
4829 5438 #: rhodecode/templates/admin/settings/settings_global.html:81
4830 #: rhodecode/templates/admin/settings/settings_global.html:103
4831 msgid "Use <script> or <css> tags to define custom styling or scripting"
5439 msgid "Use <script/> or <css/> tags to define custom styling or scripting"
4832 5440 msgstr ""
4833 5441
4834 5442 #: rhodecode/templates/admin/settings/settings_global.html:88
@@ -4839,6 +5447,10 b' msgstr ""'
4839 5447 msgid "Custom js/css code added at the end of the <body> tag."
4840 5448 msgstr ""
4841 5449
5450 #: rhodecode/templates/admin/settings/settings_global.html:103
5451 msgid "Use <script> or <css> tags to define custom styling or scripting"
5452 msgstr ""
5453
4842 5454 #: rhodecode/templates/admin/settings/settings_hooks.html:3
4843 5455 msgid "Built in Mercurial hooks - read only"
4844 5456 msgstr ""
@@ -5209,7 +5821,7 b' msgstr ""'
5209 5821
5210 5822 #: rhodecode/templates/admin/user_groups/user_group_add.html:13
5211 5823 #: rhodecode/templates/admin/users/user_edit_advanced.html:13
5212 #: rhodecode/templates/base/base.html:82 rhodecode/templates/base/base.html:155
5824 #: rhodecode/templates/base/base.html:81 rhodecode/templates/base/base.html:156
5213 5825 msgid "User groups"
5214 5826 msgstr ""
5215 5827
@@ -5300,8 +5912,8 b' msgid "Change owner of this user group."'
5300 5912 msgstr ""
5301 5913
5302 5914 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.html:59
5303 #: rhodecode/templates/base/base.html:257
5304 #: rhodecode/templates/base/base.html:399
5915 #: rhodecode/templates/base/base.html:258
5916 #: rhodecode/templates/base/base.html:400
5305 5917 #: rhodecode/templates/search/search.html:64
5306 5918 msgid "Search"
5307 5919 msgstr ""
@@ -5345,7 +5957,7 b' msgstr ""'
5345 5957
5346 5958 #: rhodecode/templates/admin/users/user_add.html:13
5347 5959 #: rhodecode/templates/admin/users/user_edit.html:14
5348 #: rhodecode/templates/base/base.html:81
5960 #: rhodecode/templates/base/base.html:80
5349 5961 msgid "Users"
5350 5962 msgstr ""
5351 5963
@@ -5408,7 +6020,7 b' msgid "Source of Record"'
5408 6020 msgstr ""
5409 6021
5410 6022 #: rhodecode/templates/admin/users/user_edit_advanced.html:8
5411 #: rhodecode/templates/admin/users/users.html:98
6023 #: rhodecode/templates/admin/users/users.html:97
5412 6024 msgid "Last login"
5413 6025 msgstr ""
5414 6026
@@ -5505,7 +6117,7 b' msgid "Detach user groups"'
5505 6117 msgstr ""
5506 6118
5507 6119 #: rhodecode/templates/admin/users/user_edit_advanced.html:135
5508 #: rhodecode/templates/data_table/_dt_elements.html:189
6120 #: rhodecode/templates/data_table/_dt_elements.html:191
5509 6121 #, python-format
5510 6122 msgid "Confirm to delete this user: %s"
5511 6123 msgstr ""
@@ -5585,21 +6197,21 b' msgstr ""'
5585 6197 msgid "Users administration"
5586 6198 msgstr ""
5587 6199
5588 #: rhodecode/templates/admin/users/users.html:104
6200 #: rhodecode/templates/admin/users/users.html:103
5589 6201 msgid "Authentication type"
5590 6202 msgstr ""
5591 6203
5592 #: rhodecode/templates/base/base.html:45
6204 #: rhodecode/templates/base/base.html:44
5593 6205 #: rhodecode/templates/errors/error_document.html:51
5594 6206 msgid "Support"
5595 6207 msgstr ""
5596 6208
5597 #: rhodecode/templates/base/base.html:52
6209 #: rhodecode/templates/base/base.html:51
5598 6210 #, python-format
5599 6211 msgid "RhodeCode instance id: %s"
5600 6212 msgstr ""
5601 6213
5602 #: rhodecode/templates/base/base.html:84
6214 #: rhodecode/templates/base/base.html:83
5603 6215 msgid "Authentication"
5604 6216 msgstr ""
5605 6217
@@ -5613,40 +6225,40 b' msgstr ""'
5613 6225 msgid "Show More"
5614 6226 msgstr ""
5615 6227
5616 #: rhodecode/templates/base/base.html:189
6228 #: rhodecode/templates/base/base.html:190
5617 6229 msgid "Fork of"
5618 6230 msgstr ""
5619 6231
5620 #: rhodecode/templates/base/base.html:206
6232 #: rhodecode/templates/base/base.html:207
5621 6233 #, python-format
5622 6234 msgid "Repository locked by %(user)s"
5623 6235 msgstr ""
5624 6236
5625 #: rhodecode/templates/base/base.html:211
6237 #: rhodecode/templates/base/base.html:212
5626 6238 msgid "Repository not locked. Pull repository to lock it."
5627 6239 msgstr ""
5628 6240
5629 #: rhodecode/templates/base/base.html:229
5630 #: rhodecode/templates/data_table/_dt_elements.html:12
5631 #: rhodecode/templates/data_table/_dt_elements.html:13
5632 #: rhodecode/templates/data_table/_dt_elements.html:147
5633 msgid "Summary"
5634 msgstr ""
5635
5636 6241 #: rhodecode/templates/base/base.html:230
6242 #: rhodecode/templates/data_table/_dt_elements.html:12
6243 #: rhodecode/templates/data_table/_dt_elements.html:13
6244 #: rhodecode/templates/data_table/_dt_elements.html:149
6245 msgid "Summary"
6246 msgstr ""
6247
6248 #: rhodecode/templates/base/base.html:231
5637 6249 #: rhodecode/templates/data_table/_dt_elements.html:17
5638 6250 #: rhodecode/templates/data_table/_dt_elements.html:18
5639 6251 msgid "Changelog"
5640 6252 msgstr ""
5641 6253
5642 #: rhodecode/templates/base/base.html:231
6254 #: rhodecode/templates/base/base.html:232
5643 6255 #: rhodecode/templates/data_table/_dt_elements.html:22
5644 6256 #: rhodecode/templates/data_table/_dt_elements.html:23
5645 6257 #: rhodecode/templates/files/files.html:15
5646 6258 msgid "Files"
5647 6259 msgstr ""
5648 6260
5649 #: rhodecode/templates/base/base.html:233
6261 #: rhodecode/templates/base/base.html:234
5650 6262 #: rhodecode/templates/bookmarks/bookmarks.html:68
5651 6263 #: rhodecode/templates/branches/branches.html:67
5652 6264 #: rhodecode/templates/files/file_diff.html:11
@@ -5655,29 +6267,29 b' msgstr ""'
5655 6267 msgid "Compare"
5656 6268 msgstr ""
5657 6269
5658 #: rhodecode/templates/base/base.html:238
6270 #: rhodecode/templates/base/base.html:239
5659 6271 #, python-format
5660 6272 msgid "Show Pull Requests for %s"
5661 6273 msgstr ""
5662 6274
5663 #: rhodecode/templates/base/base.html:247
6275 #: rhodecode/templates/base/base.html:248
5664 6276 msgid "Options"
5665 6277 msgstr ""
5666 6278
5667 #: rhodecode/templates/base/base.html:254
6279 #: rhodecode/templates/base/base.html:255
5668 6280 #: rhodecode/templates/forks/forks_data.html:30
5669 6281 msgid "Compare fork"
5670 6282 msgstr ""
5671 6283
5672 #: rhodecode/templates/base/base.html:261
6284 #: rhodecode/templates/base/base.html:262
5673 6285 msgid "Unlock"
5674 6286 msgstr ""
5675 6287
5676 #: rhodecode/templates/base/base.html:263
6288 #: rhodecode/templates/base/base.html:264
5677 6289 msgid "Lock"
5678 6290 msgstr ""
5679 6291
5680 #: rhodecode/templates/base/base.html:268
6292 #: rhodecode/templates/base/base.html:269
5681 6293 #: rhodecode/templates/data_table/_dt_elements.html:27
5682 6294 #: rhodecode/templates/data_table/_dt_elements.html:28
5683 6295 #: rhodecode/templates/forks/forks_data.html:8
@@ -5687,73 +6299,73 b' msgid_plural "Forks"'
5687 6299 msgstr[0] ""
5688 6300 msgstr[1] ""
5689 6301
5690 #: rhodecode/templates/base/base.html:269
6302 #: rhodecode/templates/base/base.html:270
5691 6303 msgid "Create Pull Request"
5692 6304 msgstr ""
5693 6305
5694 #: rhodecode/templates/base/base.html:291
6306 #: rhodecode/templates/base/base.html:292
5695 6307 msgid "Sign in"
5696 6308 msgstr ""
5697 6309
5698 #: rhodecode/templates/base/base.html:299
6310 #: rhodecode/templates/base/base.html:300
5699 6311 #: rhodecode/templates/debug_style/login.html:28
5700 6312 msgid "Sign in to your account"
5701 6313 msgstr ""
5702 6314
5703 #: rhodecode/templates/base/base.html:315
6315 #: rhodecode/templates/base/base.html:316
5704 6316 #: rhodecode/templates/debug_style/login.html:46
5705 6317 msgid "(Forgot password?)"
5706 6318 msgstr ""
5707 6319
5708 #: rhodecode/templates/base/base.html:324
6320 #: rhodecode/templates/base/base.html:325
5709 6321 #: rhodecode/templates/debug_style/login.html:56
5710 6322 msgid "Don't have an account ?"
5711 6323 msgstr ""
5712 6324
5713 #: rhodecode/templates/base/base.html:345
6325 #: rhodecode/templates/base/base.html:346
5714 6326 msgid "Sign Out"
5715 6327 msgstr ""
5716 6328
5717 #: rhodecode/templates/base/base.html:381
5718 msgid "Show activity journal"
5719 msgstr ""
5720
5721 6329 #: rhodecode/templates/base/base.html:382
6330 msgid "Show activity journal"
6331 msgstr ""
6332
6333 #: rhodecode/templates/base/base.html:383
5722 6334 #: rhodecode/templates/journal/journal.html:4
5723 6335 #: rhodecode/templates/journal/journal.html:14
5724 6336 msgid "Journal"
5725 6337 msgstr ""
5726 6338
5727 #: rhodecode/templates/base/base.html:387
6339 #: rhodecode/templates/base/base.html:388
5728 6340 msgid "Show Public activity journal"
5729 6341 msgstr ""
5730 6342
5731 #: rhodecode/templates/base/base.html:388
6343 #: rhodecode/templates/base/base.html:389
5732 6344 msgid "Public journal"
5733 6345 msgstr ""
5734 6346
5735 #: rhodecode/templates/base/base.html:393
5736 msgid "Show Gists"
5737 msgstr ""
5738
5739 6347 #: rhodecode/templates/base/base.html:394
6348 msgid "Show Gists"
6349 msgstr ""
6350
6351 #: rhodecode/templates/base/base.html:395
5740 6352 msgid "Gists"
5741 6353 msgstr ""
5742 6354
5743 #: rhodecode/templates/base/base.html:398
6355 #: rhodecode/templates/base/base.html:399
5744 6356 msgid "Search in repositories you have access to"
5745 6357 msgstr ""
5746 6358
5747 #: rhodecode/templates/base/base.html:404
6359 #: rhodecode/templates/base/base.html:405
5748 6360 msgid "Admin settings"
5749 6361 msgstr ""
5750 6362
5751 #: rhodecode/templates/base/base.html:411
6363 #: rhodecode/templates/base/base.html:412
5752 6364 msgid "Delegated Admin settings"
5753 6365 msgstr ""
5754 6366
5755 #: rhodecode/templates/base/base.html:421
5756 6367 #: rhodecode/templates/base/base.html:422
6368 #: rhodecode/templates/base/base.html:423
5757 6369 #: rhodecode/templates/debug_style/buttons.html:5
5758 6370 #: rhodecode/templates/debug_style/code-block.html:6
5759 6371 #: rhodecode/templates/debug_style/collapsable-content.html:5
@@ -5774,15 +6386,15 b' msgstr ""'
5774 6386 msgid "Style"
5775 6387 msgstr ""
5776 6388
5777 #: rhodecode/templates/base/base.html:479
6389 #: rhodecode/templates/base/base.html:480
5778 6390 msgid "Go to"
5779 6391 msgstr ""
5780 6392
5781 #: rhodecode/templates/base/base.html:590
6393 #: rhodecode/templates/base/base.html:591
5782 6394 msgid "Keyboard shortcuts"
5783 6395 msgstr ""
5784 6396
5785 #: rhodecode/templates/base/base.html:598
6397 #: rhodecode/templates/base/base.html:599
5786 6398 msgid "Site-wide shortcuts"
5787 6399 msgstr ""
5788 6400
@@ -5957,7 +6569,7 b' msgstr ""'
5957 6569 msgid "No permission defined"
5958 6570 msgstr ""
5959 6571
5960 #: rhodecode/templates/base/root.html:151
6572 #: rhodecode/templates/base/root.html:120
5961 6573 msgid "Please enable JavaScript to use RhodeCode Enterprise"
5962 6574 msgstr ""
5963 6575
@@ -6077,6 +6689,22 b' msgstr ""'
6077 6689 msgid "During the update of a pull request, the position of inline comments will be updated and outdated inline comments will be hidden."
6078 6690 msgstr ""
6079 6691
6692 #: rhodecode/templates/base/vcs_settings.html:222
6693 msgid "Labs settings"
6694 msgstr ""
6695
6696 #: rhodecode/templates/base/vcs_settings.html:222
6697 msgid "These features are considered experimental and may not work as expected."
6698 msgstr ""
6699
6700 #: rhodecode/templates/base/vcs_settings.html:229
6701 msgid "Mercurial server-side merge"
6702 msgstr ""
6703
6704 #: rhodecode/templates/base/vcs_settings.html:234
6705 msgid "Use rebase instead of creating a merge commit when merging via web interface"
6706 msgstr ""
6707
6080 6708 #: rhodecode/templates/bookmarks/bookmarks.html:5
6081 6709 #, python-format
6082 6710 msgid "%s Bookmarks"
@@ -6091,8 +6719,8 b' msgid "Compare Selected Bookmarks"'
6091 6719 msgstr ""
6092 6720
6093 6721 #: rhodecode/templates/bookmarks/bookmarks_data.html:13
6094 #: rhodecode/templates/changelog/changelog.html:180
6095 #: rhodecode/templates/changelog/changelog_summary_data.html:53
6722 #: rhodecode/templates/changelog/changelog.html:183
6723 #: rhodecode/templates/changelog/changelog_summary_data.html:62
6096 6724 #: rhodecode/templates/changeset/changeset.html:92
6097 6725 #: rhodecode/templates/files/base.html:10
6098 6726 #, python-format
@@ -6113,8 +6741,8 b' msgid "Compare Selected Branches"'
6113 6741 msgstr ""
6114 6742
6115 6743 #: rhodecode/templates/branches/branches_data.html:12
6116 #: rhodecode/templates/changelog/changelog.html:172
6117 #: rhodecode/templates/changelog/changelog_summary_data.html:67
6744 #: rhodecode/templates/changelog/changelog.html:175
6745 #: rhodecode/templates/changelog/changelog_summary_data.html:76
6118 6746 #: rhodecode/templates/changeset/changeset.html:105
6119 6747 #: rhodecode/templates/files/base.html:23
6120 6748 #, python-format
@@ -6144,10 +6772,6 b' msgstr ""'
6144 6772 msgid "Compare fork with Parent (%s)"
6145 6773 msgstr ""
6146 6774
6147 #: rhodecode/templates/changelog/changelog.html:62
6148 msgid "Open new pull request"
6149 msgstr ""
6150
6151 6775 #: rhodecode/templates/changelog/changelog.html:68
6152 6776 #: rhodecode/templates/changelog/changelog.html:69
6153 6777 msgid "Clear selection"
@@ -6157,43 +6781,49 b' msgstr ""'
6157 6781 msgid "Clear filter"
6158 6782 msgstr ""
6159 6783
6160 #: rhodecode/templates/changelog/changelog.html:103
6161 #: rhodecode/templates/changelog/changelog_summary_data.html:9
6162 msgid "Age"
6163 msgstr ""
6164
6165 #: rhodecode/templates/changelog/changelog.html:105
6784 #: rhodecode/templates/changelog/changelog.html:107
6166 6785 #: rhodecode/templates/files/files_add.html:93
6167 6786 #: rhodecode/templates/files/files_delete.html:60
6168 6787 #: rhodecode/templates/files/files_edit.html:96
6169 6788 msgid "Commit Message"
6170 6789 msgstr ""
6171 6790
6172 #: rhodecode/templates/changelog/changelog.html:108
6173 #: rhodecode/templates/changelog/changelog_summary_data.html:11
6791 #: rhodecode/templates/changelog/changelog.html:109
6792 #: rhodecode/templates/changelog/changelog_summary_data.html:10
6793 msgid "Age"
6794 msgstr ""
6795
6796 #: rhodecode/templates/changelog/changelog.html:112
6797 #: rhodecode/templates/changelog/changelog_summary_data.html:12
6174 6798 msgid "Refs"
6175 6799 msgstr ""
6176 6800
6177 #: rhodecode/templates/changelog/changelog.html:122
6178 #: rhodecode/templates/changelog/changelog_summary_data.html:22
6801 #: rhodecode/templates/changelog/changelog.html:126
6802 #: rhodecode/templates/changelog/changelog_summary_data.html:21
6179 6803 #, python-format
6180 6804 msgid ""
6181 6805 "Commit status: %s\n"
6182 6806 "Click to open associated pull request #%s"
6183 6807 msgstr ""
6184 6808
6185 #: rhodecode/templates/changelog/changelog.html:126
6809 #: rhodecode/templates/changelog/changelog.html:130
6810 #: rhodecode/templates/changelog/changelog_summary_data.html:25
6186 6811 #, python-format
6187 6812 msgid "Commit status: %s"
6188 6813 msgstr ""
6189 6814
6190 #: rhodecode/templates/changelog/changelog.html:162
6191 #: rhodecode/templates/changelog/changelog_summary_data.html:33
6815 #: rhodecode/templates/changelog/changelog.html:136
6816 #: rhodecode/templates/changelog/changelog_summary_data.html:31
6817 msgid "Commit status: Not Reviewed"
6818 msgstr ""
6819
6820 #: rhodecode/templates/changelog/changelog.html:141
6821 #: rhodecode/templates/changelog/changelog_summary_data.html:36
6192 6822 msgid "Commit has comments"
6193 6823 msgstr ""
6194 6824
6195 #: rhodecode/templates/changelog/changelog.html:188
6196 #: rhodecode/templates/changelog/changelog_summary_data.html:60
6825 #: rhodecode/templates/changelog/changelog.html:191
6826 #: rhodecode/templates/changelog/changelog_summary_data.html:69
6197 6827 #: rhodecode/templates/changeset/changeset.html:99
6198 6828 #: rhodecode/templates/files/base.html:17
6199 6829 #: rhodecode/templates/tags/tags_data.html:12
@@ -6201,16 +6831,16 b' msgstr ""'
6201 6831 msgid "Tag %s"
6202 6832 msgstr ""
6203 6833
6204 #: rhodecode/templates/changelog/changelog.html:338
6834 #: rhodecode/templates/changelog/changelog.html:341
6205 6835 msgid "Filter changelog"
6206 6836 msgstr ""
6207 6837
6208 #: rhodecode/templates/changelog/changelog.html:411
6838 #: rhodecode/templates/changelog/changelog.html:414
6209 6839 msgid "There are no changes yet"
6210 6840 msgstr ""
6211 6841
6212 6842 #: rhodecode/templates/changelog/changelog_details.html:4
6213 #: rhodecode/templates/pullrequests/pullrequest_show.html:358
6843 #: rhodecode/templates/pullrequests/pullrequest_show.html:362
6214 6844 msgid "Removed"
6215 6845 msgstr ""
6216 6846
@@ -6241,25 +6871,25 b' msgstr ""'
6241 6871 msgid "Show File"
6242 6872 msgstr ""
6243 6873
6244 #: rhodecode/templates/changelog/changelog_summary_data.html:8
6874 #: rhodecode/templates/changelog/changelog_summary_data.html:9
6245 6875 #: rhodecode/templates/search/search_commit.html:8
6246 6876 msgid "Commit message"
6247 6877 msgstr ""
6248 6878
6249 #: rhodecode/templates/changelog/changelog_summary_data.html:91
6879 #: rhodecode/templates/changelog/changelog_summary_data.html:100
6250 6880 msgid "Add or upload files directly via RhodeCode:"
6251 6881 msgstr ""
6252 6882
6253 #: rhodecode/templates/changelog/changelog_summary_data.html:94
6883 #: rhodecode/templates/changelog/changelog_summary_data.html:103
6254 6884 #: rhodecode/templates/files/files_browser.html:25
6255 6885 msgid "Add New File"
6256 6886 msgstr ""
6257 6887
6258 #: rhodecode/templates/changelog/changelog_summary_data.html:102
6888 #: rhodecode/templates/changelog/changelog_summary_data.html:111
6259 6889 msgid "Push new repo:"
6260 6890 msgstr ""
6261 6891
6262 #: rhodecode/templates/changelog/changelog_summary_data.html:113
6892 #: rhodecode/templates/changelog/changelog_summary_data.html:122
6263 6893 msgid "Existing repository?"
6264 6894 msgstr ""
6265 6895
@@ -6335,7 +6965,7 b' msgstr ""'
6335 6965
6336 6966 #: rhodecode/templates/changeset/changeset.html:145
6337 6967 #: rhodecode/templates/changeset/changeset.html:147
6338 #: rhodecode/tests/functional/test_changeset_comments.py:217
6968 #: rhodecode/tests/functional/test_commit_comments.py:263
6339 6969 #, python-format
6340 6970 msgid "%d Commit comment"
6341 6971 msgid_plural "%d Commit comments"
@@ -6346,22 +6976,22 b' msgstr[1] ""'
6346 6976 #: rhodecode/templates/changeset/changeset.html:153
6347 6977 #: rhodecode/templates/pullrequests/pullrequest_show.html:145
6348 6978 #: rhodecode/templates/pullrequests/pullrequest_show.html:147
6349 #: rhodecode/tests/functional/test_changeset_comments.py:224
6979 #: rhodecode/tests/functional/test_commit_comments.py:270
6350 6980 #, python-format
6351 6981 msgid "%d Inline Comment"
6352 6982 msgid_plural "%d Inline Comments"
6353 6983 msgstr[0] ""
6354 6984 msgstr[1] ""
6355 6985
6356 #: rhodecode/templates/changeset/changeset.html:177
6986 #: rhodecode/templates/changeset/changeset.html:175
6357 6987 msgid "Browse files at current commit"
6358 6988 msgstr ""
6359 6989
6990 #: rhodecode/templates/changeset/changeset.html:175
6991 msgid "Browse files"
6992 msgstr ""
6993
6360 6994 #: rhodecode/templates/changeset/changeset.html:177
6361 msgid "Browse files"
6362 msgstr ""
6363
6364 #: rhodecode/templates/changeset/changeset.html:179
6365 6995 #: rhodecode/templates/changeset/changeset_range.html:59
6366 6996 #: rhodecode/templates/compare/compare_diff.html:255
6367 6997 #: rhodecode/templates/files/file_diff.html:77
@@ -6369,7 +6999,7 b' msgstr ""'
6369 6999 msgid "Expand All"
6370 7000 msgstr ""
6371 7001
6372 #: rhodecode/templates/changeset/changeset.html:179
7002 #: rhodecode/templates/changeset/changeset.html:177
6373 7003 #: rhodecode/templates/changeset/changeset_range.html:59
6374 7004 #: rhodecode/templates/compare/compare_diff.html:255
6375 7005 #: rhodecode/templates/files/file_diff.html:77
@@ -6377,30 +7007,32 b' msgstr ""'
6377 7007 msgid "Collapse All"
6378 7008 msgstr ""
6379 7009
6380 #: rhodecode/templates/changeset/changeset.html:190
7010 #: rhodecode/templates/changeset/changeset.html:188
6381 7011 #: rhodecode/templates/compare/compare_diff.html:263
6382 7012 #: rhodecode/templates/pullrequests/pullrequest_show.html:274
6383 7013 msgid "No files"
6384 7014 msgstr ""
6385 7015
6386 #: rhodecode/templates/changeset/changeset.html:227
7016 #: rhodecode/templates/changeset/changeset.html:225
6387 7017 #: rhodecode/templates/files/file_diff.html:128
7018 #: rhodecode/templates/pullrequests/pullrequest_show.html:315
6388 7019 msgid "Show comments"
6389 7020 msgstr ""
6390 7021
6391 #: rhodecode/templates/changeset/changeset.html:228
7022 #: rhodecode/templates/changeset/changeset.html:226
6392 7023 #: rhodecode/templates/files/file_diff.html:129
7024 #: rhodecode/templates/pullrequests/pullrequest_show.html:316
6393 7025 msgid "Hide comments"
6394 7026 msgstr ""
6395 7027
6396 #: rhodecode/templates/changeset/changeset.html:245
7028 #: rhodecode/templates/changeset/changeset.html:243
6397 7029 #: rhodecode/templates/changeset/diff_block.html:25
6398 7030 #: rhodecode/templates/changeset/diff_block.html:46
6399 7031 #: rhodecode/templates/files/file_diff.html:146
6400 7032 msgid "Diff was truncated. File content available only in full diff."
6401 7033 msgstr ""
6402 7034
6403 #: rhodecode/templates/changeset/changeset.html:245
7035 #: rhodecode/templates/changeset/changeset.html:243
6404 7036 #: rhodecode/templates/changeset/diff_block.html:7
6405 7037 #: rhodecode/templates/changeset/diff_block.html:10
6406 7038 #: rhodecode/templates/changeset/diff_block.html:25
@@ -6410,22 +7042,22 b' msgstr ""'
6410 7042 msgid "Showing a big diff might take some time and resources, continue?"
6411 7043 msgstr ""
6412 7044
6413 #: rhodecode/templates/changeset/changeset.html:245
7045 #: rhodecode/templates/changeset/changeset.html:243
6414 7046 #: rhodecode/templates/changeset/diff_block.html:7
6415 7047 #: rhodecode/templates/changeset/diff_block.html:10
6416 7048 #: rhodecode/templates/changeset/diff_block.html:25
6417 7049 #: rhodecode/templates/changeset/diff_block.html:46
6418 7050 #: rhodecode/templates/files/file_diff.html:146
6419 #: rhodecode/templates/pullrequests/pullrequest_show.html:386
6420 #: rhodecode/templates/pullrequests/pullrequest_show.html:392
7051 #: rhodecode/templates/pullrequests/pullrequest_show.html:390
7052 #: rhodecode/templates/pullrequests/pullrequest_show.html:396
6421 7053 msgid "Show full diff"
6422 7054 msgstr ""
6423 7055
6424 #: rhodecode/templates/changeset/changeset.html:314
7056 #: rhodecode/templates/changeset/changeset.html:312
6425 7057 msgid "No Child Commits"
6426 7058 msgstr ""
6427 7059
6428 #: rhodecode/templates/changeset/changeset.html:350
7060 #: rhodecode/templates/changeset/changeset.html:348
6429 7061 msgid "No Parent Commits"
6430 7062 msgstr ""
6431 7063
@@ -6478,6 +7110,8 b' msgstr ""'
6478 7110 #: rhodecode/templates/changeset/changeset_file_comment.html:146
6479 7111 #: rhodecode/templates/changeset/changeset_file_comment.html:293
6480 7112 #: rhodecode/templates/compare/compare_diff.html:57
7113 #: rhodecode/templates/email_templates/commit_comment.mako:87
7114 #: rhodecode/templates/email_templates/pull_request_comment.mako:93
6481 7115 msgid "Comment"
6482 7116 msgstr ""
6483 7117
@@ -6624,12 +7258,15 b' msgid "Compare Commits"'
6624 7258 msgstr ""
6625 7259
6626 7260 #: rhodecode/templates/compare/compare_diff.html:46
7261 #: rhodecode/templates/email_templates/pull_request_review.mako:50
6627 7262 #: rhodecode/templates/files/file_diff.html:56
6628 7263 #: rhodecode/templates/pullrequests/pullrequest_show.html:85
6629 7264 msgid "Target"
6630 7265 msgstr ""
6631 7266
6632 7267 #: rhodecode/templates/compare/compare_diff.html:47
7268 #: rhodecode/templates/email_templates/pull_request_comment.mako:92
7269 #: rhodecode/templates/email_templates/pull_request_review.mako:49
6633 7270 #: rhodecode/templates/files/file_diff.html:62
6634 7271 #: rhodecode/templates/files/files_source.html:18
6635 7272 msgid "Source"
@@ -6679,36 +7316,36 b' msgstr ""'
6679 7316 msgid "Subscribe to %s atom feed"
6680 7317 msgstr ""
6681 7318
6682 #: rhodecode/templates/data_table/_dt_elements.html:127
7319 #: rhodecode/templates/data_table/_dt_elements.html:129
6683 7320 msgid "Creating"
6684 7321 msgstr ""
6685 7322
6686 #: rhodecode/templates/data_table/_dt_elements.html:129
7323 #: rhodecode/templates/data_table/_dt_elements.html:131
6687 7324 msgid "Created"
6688 7325 msgstr ""
6689 7326
6690 #: rhodecode/templates/data_table/_dt_elements.html:175
7327 #: rhodecode/templates/data_table/_dt_elements.html:177
6691 7328 #, python-format
6692 7329 msgid "Confirm to delete this group: %s with %s repository"
6693 7330 msgid_plural "Confirm to delete this group: %s with %s repositories"
6694 7331 msgstr[0] ""
6695 7332 msgstr[1] ""
6696 7333
6697 #: rhodecode/templates/data_table/_dt_elements.html:201
7334 #: rhodecode/templates/data_table/_dt_elements.html:203
6698 7335 #, python-format
6699 7336 msgid "Confirm to delete this user group: %s"
6700 7337 msgstr ""
6701 7338
6702 #: rhodecode/templates/data_table/_dt_elements.html:218
7339 #: rhodecode/templates/data_table/_dt_elements.html:220
6703 7340 msgid "User group"
6704 7341 msgstr ""
6705 7342
6706 #: rhodecode/templates/data_table/_dt_elements.html:262
7343 #: rhodecode/templates/data_table/_dt_elements.html:264
6707 7344 #: rhodecode/templates/forks/fork.html:81
6708 7345 msgid "Private"
6709 7346 msgstr ""
6710 7347
6711 #: rhodecode/templates/data_table/_dt_elements.html:287
7348 #: rhodecode/templates/data_table/_dt_elements.html:289
6712 7349 #, python-format
6713 7350 msgid "Pull request #%(pr_number)s"
6714 7351 msgstr ""
@@ -6812,85 +7449,130 b' msgstr ""'
6812 7449 msgid "Form vertical"
6813 7450 msgstr ""
6814 7451
6815 #: rhodecode/templates/email_templates/base.mako:16
7452 #: rhodecode/templates/email_templates/base.mako:7
6816 7453 #, python-format
6817 7454 msgid "This is a notification from RhodeCode. %(instance_url)s"
6818 7455 msgstr ""
6819 7456
6820 #: rhodecode/templates/email_templates/commit_comment.mako:5
6821 #: rhodecode/templates/email_templates/pull_request_comment.mako:5
7457 #: rhodecode/templates/email_templates/base.mako:90
7458 msgid "RhodeCode"
7459 msgstr ""
7460
7461 #: rhodecode/templates/email_templates/commit_comment.mako:16
7462 #: rhodecode/templates/email_templates/pull_request_comment.mako:17
6822 7463 msgid "[mention]"
6823 7464 msgstr ""
6824 7465
6825 #: rhodecode/templates/email_templates/commit_comment.mako:5
6826 #, python-format
6827 msgid "%(user)s commented on commit of %(repo_name)s"
6828 msgstr ""
6829
6830 #: rhodecode/templates/email_templates/commit_comment.mako:14
6831 #: rhodecode/templates/email_templates/commit_comment.mako:41
6832 #: rhodecode/templates/email_templates/pull_request_comment.mako:15
6833 #: rhodecode/templates/email_templates/pull_request_comment.mako:51
6834 msgid "Comment link"
7466 #: rhodecode/templates/email_templates/commit_comment.mako:19
7467 #, python-format
7468 msgid "%(user)s commented on commit `%(commit_id)s` (file: `%(comment_file)s`)"
6835 7469 msgstr ""
6836 7470
6837 7471 #: rhodecode/templates/email_templates/commit_comment.mako:19
7472 #: rhodecode/templates/email_templates/commit_comment.mako:22
7473 #: rhodecode/templates/email_templates/commit_comment.mako:24
7474 #, python-format
7475 msgid "in the %(repo_name)s repository"
7476 msgstr ""
7477
7478 #: rhodecode/templates/email_templates/commit_comment.mako:22
7479 #, python-format
7480 msgid "%(user)s commented on commit `%(commit_id)s` (status: %(status)s)"
7481 msgstr ""
7482
7483 #: rhodecode/templates/email_templates/commit_comment.mako:24
7484 #: rhodecode/templates/email_templates/commit_comment.mako:78
7485 #, python-format
7486 msgid "%(user)s commented on commit `%(commit_id)s`"
7487 msgstr ""
7488
6838 7489 #: rhodecode/templates/email_templates/commit_comment.mako:43
6839 #: rhodecode/templates/email_templates/pull_request_comment.mako:20
6840 #: rhodecode/templates/email_templates/pull_request_comment.mako:54
7490 #: rhodecode/templates/email_templates/pull_request_comment.mako:43
7491 msgid "Comment link"
7492 msgstr ""
7493
7494 #: rhodecode/templates/email_templates/commit_comment.mako:48
7495 #: rhodecode/templates/email_templates/pull_request_comment.mako:48
6841 7496 #, python-format
6842 7497 msgid "File: %(comment_file)s on line %(comment_line)s"
6843 7498 msgstr ""
6844 7499
6845 #: rhodecode/templates/email_templates/commit_comment.mako:28
6846 #: rhodecode/templates/email_templates/commit_comment.mako:56
7500 #: rhodecode/templates/email_templates/commit_comment.mako:54
6847 7501 msgid "Commit status was changed to"
6848 7502 msgstr ""
6849 7503
6850 #: rhodecode/templates/email_templates/commit_comment.mako:35
6851 #, python-format
6852 msgid "%(user)s commented on a file in commit of %(repo_url)s."
6853 msgstr ""
6854
6855 #: rhodecode/templates/email_templates/commit_comment.mako:37
6856 #, python-format
6857 msgid "%(user)s commented on a commit of %(repo_url)s."
6858 msgstr ""
6859
6860 #: rhodecode/templates/email_templates/commit_comment.mako:47
6861 #: rhodecode/templates/files/files_detail.html:5
6862 #: rhodecode/templates/files/files_detail.html:12
6863 msgid "Commit Description"
6864 msgstr ""
6865
6866 #: rhodecode/templates/email_templates/pull_request_comment.mako:5
6867 #, python-format
6868 msgid "%(user)s commented on pull request #%(pr_id)s: \"%(pr_title)s\""
6869 msgstr ""
6870
6871 #: rhodecode/templates/email_templates/pull_request_comment.mako:17
6872 #: rhodecode/templates/email_templates/pull_request_comment.mako:52
7504 #: rhodecode/templates/email_templates/commit_comment.mako:76
7505 #, python-format
7506 msgid "%(user)s commented on commit `%(commit_id)s` (file:`%(comment_file)s`)"
7507 msgstr ""
7508
7509 #: rhodecode/templates/email_templates/commit_comment.mako:76
7510 #: rhodecode/templates/email_templates/commit_comment.mako:78
7511 #, python-format
7512 msgid "in the %(repo)s repository"
7513 msgstr ""
7514
7515 #: rhodecode/templates/email_templates/commit_comment.mako:85
7516 msgid "Status"
7517 msgstr ""
7518
7519 #: rhodecode/templates/email_templates/commit_comment.mako:85
7520 msgid "The commit status was changed to"
7521 msgstr ""
7522
7523 #: rhodecode/templates/email_templates/commit_comment.mako:87
7524 #: rhodecode/templates/email_templates/pull_request_comment.mako:93
7525 #, python-format
7526 msgid "Comment on line: %(comment_line)s"
7527 msgstr ""
7528
7529 #: rhodecode/templates/email_templates/password_reset.mako:30
7530 msgid "Generate new password here"
7531 msgstr ""
7532
7533 #: rhodecode/templates/email_templates/pull_request_comment.mako:20
7534 #, python-format
7535 msgid "%(user)s commented on pull request #%(pr_id)s \"%(pr_title)s\" (file: `%(comment_file)s`)"
7536 msgstr ""
7537
7538 #: rhodecode/templates/email_templates/pull_request_comment.mako:23
7539 #, python-format
7540 msgid "%(user)s commented on pull request #%(pr_id)s \"%(pr_title)s\" (status: %(status)s)"
7541 msgstr ""
7542
7543 #: rhodecode/templates/email_templates/pull_request_comment.mako:25
7544 #: rhodecode/templates/email_templates/pull_request_comment.mako:82
7545 #, python-format
7546 msgid "%(user)s commented on pull request #%(pr_id)s \"%(pr_title)s\""
7547 msgstr ""
7548
7549 #: rhodecode/templates/email_templates/pull_request_comment.mako:45
6873 7550 msgid "Source repository"
6874 7551 msgstr ""
6875 7552
6876 #: rhodecode/templates/email_templates/pull_request_comment.mako:29
6877 #: rhodecode/templates/email_templates/pull_request_comment.mako:63
6878 msgid "Pull request status was changed to"
6879 msgstr ""
6880
6881 #: rhodecode/templates/email_templates/pull_request_comment.mako:31
6882 #: rhodecode/templates/email_templates/pull_request_comment.mako:65
6883 msgid "Pull request was closed with status"
6884 msgstr ""
6885
6886 #: rhodecode/templates/email_templates/pull_request_comment.mako:37
6887 #, python-format
6888 msgid "%(user)s commented on a file on pull request #%(pr_id)s: \"%(pr_title)s\"."
6889 msgstr ""
6890
6891 #: rhodecode/templates/email_templates/pull_request_comment.mako:43
6892 #, python-format
6893 msgid "%(user)s commented on a pull request #%(pr_id)s \"%(pr_title)s\"."
7553 #: rhodecode/templates/email_templates/pull_request_comment.mako:54
7554 #, python-format
7555 msgid "%(user)s submitted pull request #%(pr_id)s status: *%(status)s*"
7556 msgstr ""
7557
7558 #: rhodecode/templates/email_templates/pull_request_comment.mako:56
7559 #, python-format
7560 msgid "%(user)s submitted pull request #%(pr_id)s status: *%(status)s and closed*"
7561 msgstr ""
7562
7563 #: rhodecode/templates/email_templates/pull_request_comment.mako:80
7564 #, python-format
7565 msgid "%(user)s commented on pull request #%(pr_id)s \"%(pr_title)s\" (file:`%(comment_file)s`)"
7566 msgstr ""
7567
7568 #: rhodecode/templates/email_templates/pull_request_comment.mako:86
7569 #, python-format
7570 msgid "submitted pull request status: %(status)s"
7571 msgstr ""
7572
7573 #: rhodecode/templates/email_templates/pull_request_comment.mako:88
7574 #, python-format
7575 msgid "submitted pull request status: %(status)s and closed"
6894 7576 msgstr ""
6895 7577
6896 7578 #: rhodecode/templates/email_templates/pull_request_review.mako:5
@@ -6899,18 +7581,15 b' msgid "%(user)s wants you to review pull'
6899 7581 msgstr ""
6900 7582
6901 7583 #: rhodecode/templates/email_templates/pull_request_review.mako:17
6902 #: rhodecode/templates/email_templates/pull_request_review.mako:54
6903 7584 #, python-format
6904 7585 msgid "Pull request from %(source_ref_type)s:%(source_ref_name)s of %(repo_url)s into %(target_ref_type)s:%(target_ref_name)s"
6905 7586 msgstr ""
6906 7587
6907 7588 #: rhodecode/templates/email_templates/pull_request_review.mako:26
6908 #: rhodecode/templates/email_templates/pull_request_review.mako:63
6909 7589 msgid "Link"
6910 7590 msgstr ""
6911 7591
6912 7592 #: rhodecode/templates/email_templates/pull_request_review.mako:35
6913 #: rhodecode/templates/email_templates/pull_request_review.mako:72
6914 7593 #, python-format
6915 7594 msgid "Commit (%(num)s)"
6916 7595 msgid_plural "Commits (%(num)s)"
@@ -6922,6 +7601,25 b' msgstr[1] ""'
6922 7601 msgid "%(user)s wants you to review pull request #%(pr_id)s: \"%(pr_title)s\"."
6923 7602 msgstr ""
6924 7603
7604 #: rhodecode/templates/email_templates/pull_request_review.mako:49
7605 #, python-format
7606 msgid "%(source_ref_type)s of %(source_repo_url)s"
7607 msgstr ""
7608
7609 #: rhodecode/templates/email_templates/pull_request_review.mako:50
7610 #, python-format
7611 msgid "%(target_ref_type)s of %(target_repo_url)s"
7612 msgstr ""
7613
7614 #: rhodecode/templates/email_templates/pull_request_review.mako:52
7615 #: rhodecode/templates/summary/components.html:95
7616 #: rhodecode/templates/summary/components.html:98
7617 #, python-format
7618 msgid "%(num)s Commit"
7619 msgid_plural "%(num)s Commits"
7620 msgstr[0] ""
7621 msgstr[1] ""
7622
6925 7623 #: rhodecode/templates/email_templates/test.mako:5
6926 7624 msgid "hello \"world\""
6927 7625 msgstr ""
@@ -6930,6 +7628,21 b' msgstr ""'
6930 7628 msgid "Translation"
6931 7629 msgstr ""
6932 7630
7631 #: rhodecode/templates/email_templates/user_registration.mako:22
7632 #, python-format
7633 msgid "New user %(user)s has registered on %(date)s"
7634 msgstr ""
7635
7636 #: rhodecode/templates/email_templates/user_registration.mako:24
7637 msgid "Full Name"
7638 msgstr ""
7639
7640 #: rhodecode/templates/email_templates/user_registration.mako:26
7641 #: rhodecode/templates/users/user.html:29
7642 #: rhodecode/templates/users/user_profile.html:5
7643 msgid "Profile"
7644 msgstr ""
7645
6933 7646 #: rhodecode/templates/errors/error_document.html:39
6934 7647 #, python-format
6935 7648 msgid "You will be redirected to %s in %s seconds"
@@ -6941,8 +7654,8 b' msgid "%(user)s commited on %(date)s UTC'
6941 7654 msgstr ""
6942 7655
6943 7656 #: rhodecode/templates/feed/atom_feed_entry.mako:26
6944 #: rhodecode/templates/pullrequests/pullrequest_show.html:386
6945 #: rhodecode/templates/pullrequests/pullrequest_show.html:392
7657 #: rhodecode/templates/pullrequests/pullrequest_show.html:390
7658 #: rhodecode/templates/pullrequests/pullrequest_show.html:396
6946 7659 msgid "Commit was too big and was cut off..."
6947 7660 msgstr ""
6948 7661
@@ -6986,7 +7699,7 b' msgstr[1] ""'
6986 7699 msgid "Show All"
6987 7700 msgstr ""
6988 7701
6989 #: rhodecode/templates/files/file_authors_box.html:26
7702 #: rhodecode/templates/files/file_authors_box.html:25
6990 7703 msgid "last author"
6991 7704 msgstr ""
6992 7705
@@ -7021,7 +7734,7 b' msgstr ""'
7021 7734 msgid "%s Files"
7022 7735 msgstr ""
7023 7736
7024 #: rhodecode/templates/files/files.html:143
7737 #: rhodecode/templates/files/files.html:131
7025 7738 msgid "Switch To Commit"
7026 7739 msgstr ""
7027 7740
@@ -7117,22 +7830,18 b' msgstr ""'
7117 7830 msgid "Loading file list..."
7118 7831 msgstr ""
7119 7832
7120 #: rhodecode/templates/files/files_browser.html:50
7833 #: rhodecode/templates/files/files_browser_tree.html:6
7121 7834 msgid "Size"
7122 7835 msgstr ""
7123 7836
7124 #: rhodecode/templates/files/files_browser.html:51
7837 #: rhodecode/templates/files/files_browser_tree.html:7
7125 7838 msgid "Modified"
7126 7839 msgstr ""
7127 7840
7128 #: rhodecode/templates/files/files_browser.html:52
7841 #: rhodecode/templates/files/files_browser_tree.html:8
7129 7842 msgid "Last Commit"
7130 7843 msgstr ""
7131 7844
7132 #: rhodecode/templates/files/files_browser.html:89
7133 msgid "Loading..."
7134 msgstr ""
7135
7136 7845 #: rhodecode/templates/files/files_delete.html:4
7137 7846 #, python-format
7138 7847 msgid "%s Files Delete"
@@ -7157,6 +7866,11 b' msgstr ""'
7157 7866 msgid "Delete File"
7158 7867 msgstr ""
7159 7868
7869 #: rhodecode/templates/files/files_detail.html:5
7870 #: rhodecode/templates/files/files_detail.html:12
7871 msgid "Commit Description"
7872 msgstr ""
7873
7160 7874 #: rhodecode/templates/files/files_detail.html:35
7161 7875 msgid "File last commit"
7162 7876 msgstr ""
@@ -7315,7 +8029,7 b' msgstr ""'
7315 8029 msgid "Forked"
7316 8030 msgstr ""
7317 8031
7318 #: rhodecode/templates/forks/forks_data.html:48
8032 #: rhodecode/templates/forks/forks_data.html:46
7319 8033 msgid "There are no forks yet"
7320 8034 msgstr ""
7321 8035
@@ -7331,7 +8045,7 b' msgstr ""'
7331 8045 msgid "RSS journal feed"
7332 8046 msgstr ""
7333 8047
7334 #: rhodecode/templates/journal/journal_data.html:53
8048 #: rhodecode/templates/journal/journal_data.html:51
7335 8049 msgid "No entries yet"
7336 8050 msgstr ""
7337 8051
@@ -7503,13 +8217,13 b' msgid_plural "Compare View: %s commits"'
7503 8217 msgstr[0] ""
7504 8218 msgstr[1] ""
7505 8219
7506 #: rhodecode/templates/pullrequests/pullrequest_show.html:330
7507 #: rhodecode/templates/pullrequests/pullrequest_show.html:365
8220 #: rhodecode/templates/pullrequests/pullrequest_show.html:334
8221 #: rhodecode/templates/pullrequests/pullrequest_show.html:369
7508 8222 msgid "Outdated Inline Comments"
7509 8223 msgstr ""
7510 8224
7511 #: rhodecode/templates/pullrequests/pullrequest_show.html:386
7512 #: rhodecode/templates/pullrequests/pullrequest_show.html:392
8225 #: rhodecode/templates/pullrequests/pullrequest_show.html:390
8226 #: rhodecode/templates/pullrequests/pullrequest_show.html:396
7513 8227 msgid "Showing a huge diff might take some time and resources"
7514 8228 msgstr ""
7515 8229
@@ -7688,14 +8402,6 b' msgstr ""'
7688 8402 msgid "Information"
7689 8403 msgstr ""
7690 8404
7691 #: rhodecode/templates/summary/components.html:95
7692 #: rhodecode/templates/summary/components.html:98
7693 #, python-format
7694 msgid "%(num)s Commit"
7695 msgid_plural "%(num)s Commits"
7696 msgstr[0] ""
7697 msgstr[1] ""
7698
7699 8405 #: rhodecode/templates/summary/components.html:102
7700 8406 msgid "Number of Repository Forks"
7701 8407 msgstr ""
@@ -7759,11 +8465,6 b' msgstr ""'
7759 8465 msgid "Compare Selected Tags"
7760 8466 msgstr ""
7761 8467
7762 #: rhodecode/templates/users/user.html:29
7763 #: rhodecode/templates/users/user_profile.html:5
7764 msgid "Profile"
7765 msgstr ""
7766
7767 8468 #: rhodecode/templates/users/user_profile.html:35
7768 8469 msgid "First name"
7769 8470 msgstr ""
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 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
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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