##// 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
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,5 +1,5 b''
1 [bumpversion]
1 [bumpversion]
2 current_version = 4.2.1
2 current_version = 4.3.0
3 message = release: Bump version {current_version} to {new_version}
3 message = release: Bump version {current_version} to {new_version}
4
4
5 [bumpversion:file:rhodecode/VERSION]
5 [bumpversion:file:rhodecode/VERSION]
@@ -25,6 +25,7 b' syntax: regexp'
25 ^build/
25 ^build/
26 ^coverage\.xml$
26 ^coverage\.xml$
27 ^data$
27 ^data$
28 ^\.eggs/
28 ^configs/data$
29 ^configs/data$
29 ^dev.ini$
30 ^dev.ini$
30 ^acceptance_tests/dev.*\.ini$
31 ^acceptance_tests/dev.*\.ini$
@@ -4,26 +4,21 b' done = false'
4 [task:bump_version]
4 [task:bump_version]
5 done = true
5 done = true
6
6
7 [task:rc_tools_pinned]
8 done = true
9
10 [task:fixes_on_stable]
7 [task:fixes_on_stable]
11 done = true
12
8
13 [task:pip2nix_generated]
9 [task:pip2nix_generated]
14 done = true
15
10
16 [task:changelog_updated]
11 [task:changelog_updated]
17 done = true
18
12
19 [task:generate_api_docs]
13 [task:generate_api_docs]
20 done = true
14
15 [task:updated_translation]
21
16
22 [release]
17 [release]
23 state = prepared
18 state = in_progress
24 version = 4.2.1
19 version = 4.3.0
25
20
26 [task:updated_translation]
21 [task:rc_tools_pinned]
27
22
28 [task:generate_js_routes]
23 [task:generate_js_routes]
29
24
@@ -20,6 +20,7 b' module.exports = function(grunt) {'
20 '<%= dirs.js.src %>/moment.js',
20 '<%= dirs.js.src %>/moment.js',
21 '<%= dirs.js.src %>/appenlight-client-0.4.1.min.js',
21 '<%= dirs.js.src %>/appenlight-client-0.4.1.min.js',
22 '<%= dirs.js.src %>/i18n_utils.js',
22 '<%= dirs.js.src %>/i18n_utils.js',
23 '<%= dirs.js.src %>/deform.js',
23
24
24 // Plugins
25 // Plugins
25 '<%= dirs.js.src %>/plugins/jquery.pjax.js',
26 '<%= dirs.js.src %>/plugins/jquery.pjax.js',
@@ -31,6 +32,7 b' module.exports = function(grunt) {'
31 '<%= dirs.js.src %>/plugins/jquery.mark.js',
32 '<%= dirs.js.src %>/plugins/jquery.mark.js',
32 '<%= dirs.js.src %>/plugins/jquery.timeago.js',
33 '<%= dirs.js.src %>/plugins/jquery.timeago.js',
33 '<%= dirs.js.src %>/plugins/jquery.timeago-extension.js',
34 '<%= dirs.js.src %>/plugins/jquery.timeago-extension.js',
35 '<%= dirs.js.src %>/plugins/toastr.js',
34
36
35 // Select2
37 // Select2
36 '<%= dirs.js.src %>/select2/select2.js',
38 '<%= dirs.js.src %>/select2/select2.js',
@@ -56,12 +58,14 b' module.exports = function(grunt) {'
56 '<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js',
58 '<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js',
57 '<%= dirs.js.src %>/rhodecode/utils/ie.js',
59 '<%= dirs.js.src %>/rhodecode/utils/ie.js',
58 '<%= dirs.js.src %>/rhodecode/utils/os.js',
60 '<%= dirs.js.src %>/rhodecode/utils/os.js',
61 '<%= dirs.js.src %>/rhodecode/utils/topics.js',
59
62
60 // Rhodecode widgets
63 // Rhodecode widgets
61 '<%= dirs.js.src %>/rhodecode/widgets/multiselect.js',
64 '<%= dirs.js.src %>/rhodecode/widgets/multiselect.js',
62
65
63 // Rhodecode components
66 // Rhodecode components
64 '<%= dirs.js.src %>/rhodecode/init.js',
67 '<%= dirs.js.src %>/rhodecode/init.js',
68 '<%= dirs.js.src %>/rhodecode/connection_controller.js',
65 '<%= dirs.js.src %>/rhodecode/codemirror.js',
69 '<%= dirs.js.src %>/rhodecode/codemirror.js',
66 '<%= dirs.js.src %>/rhodecode/comments.js',
70 '<%= dirs.js.src %>/rhodecode/comments.js',
67 '<%= dirs.js.src %>/rhodecode/constants.js',
71 '<%= dirs.js.src %>/rhodecode/constants.js',
@@ -76,6 +80,7 b' module.exports = function(grunt) {'
76 '<%= dirs.js.src %>/rhodecode/select2_widgets.js',
80 '<%= dirs.js.src %>/rhodecode/select2_widgets.js',
77 '<%= dirs.js.src %>/rhodecode/tooltips.js',
81 '<%= dirs.js.src %>/rhodecode/tooltips.js',
78 '<%= dirs.js.src %>/rhodecode/users.js',
82 '<%= dirs.js.src %>/rhodecode/users.js',
83 '<%= dirs.js.src %>/rhodecode/utils/notifications.js',
79 '<%= dirs.js.src %>/rhodecode/appenlight.js',
84 '<%= dirs.js.src %>/rhodecode/appenlight.js',
80
85
81 // Rhodecode main module
86 // Rhodecode main module
@@ -10,8 +10,10 b' permission notice:'
10 file:
10 file:
11 Copyright (c) 2008-2011 - msgpack-python
11 Copyright (c) 2008-2011 - msgpack-python
12 file:licenses/msgpack_license.txt
12 file:licenses/msgpack_license.txt
13 Copyright (c) 2009 - tornado
14 file:licenses/tornado_license.txt
13
15
14 Both licensed under the Apache License, Version 2.0 (the "License");
16 All licensed under the Apache License, Version 2.0 (the "License");
15 you may not use this file except in compliance with the License.
17 you may not use this file except in compliance with the License.
16 You may obtain a copy of the License at
18 You may obtain a copy of the License at
17
19
@@ -2,20 +2,20 b''
2 include test.ini
2 include test.ini
3 include MANIFEST.in
3 include MANIFEST.in
4 include README.rst
4 include README.rst
5 include CHANGES.rst
6 include LICENSE.txt
7
5 include rhodecode/VERSION
8 include rhodecode/VERSION
6
9
7 # docs
10 # docs
8 recursive-include docs *
11 recursive-include docs *
9
12
10 # init.d
13 # all config files
11 recursive-include init.d *
14 recursive-include configs *
12
15
13 # translations
16 # translations
14 recursive-include rhodecode/i18n *
17 recursive-include rhodecode/i18n *
15
18
16 # bin stuff
17 recursive-include rhodecode/bin *
18
19 # hook templates
19 # hook templates
20 recursive-include rhodecode/config/hook_templates *
20 recursive-include rhodecode/config/hook_templates *
21
21
@@ -20,7 +20,7 b' ci-docs: docs;'
20 clean: test-clean
20 clean: test-clean
21 find . -type f \( -iname '*.c' -o -iname '*.pyc' -o -iname '*.so' \) -exec rm '{}' ';'
21 find . -type f \( -iname '*.c' -o -iname '*.pyc' -o -iname '*.so' \) -exec rm '{}' ';'
22
22
23 test: test-clean test-lint test-only
23 test: test-clean test-only
24
24
25 test-clean:
25 test-clean:
26 rm -rf coverage.xml htmlcov junit.xml pylint.log result
26 rm -rf coverage.xml htmlcov junit.xml pylint.log result
@@ -1,23 +1,36 b''
1 ################################################################################
1
2
2 ################################################################################
3 ################################################################################
3 # RhodeCode Enterprise - configuration file #
4 ## RHODECODE ENTERPRISE CONFIGURATION ##
4 # Built-in functions and variables #
5 # The %(here)s variable will be replaced with the parent directory of this file#
5 # The %(here)s variable will be replaced with the parent directory of this file#
6 # #
7 ################################################################################
6 ################################################################################
8
7
9 [DEFAULT]
8 [DEFAULT]
10 debug = true
9 debug = true
10
11 ################################################################################
11 ################################################################################
12 ## EMAIL CONFIGURATION ##
12 ## Uncomment and replace with the email address which should receive ##
13 ## Uncomment and replace with the email address which should receive ##
13 ## any error reports after an application crash ##
14 ## any error reports after an application crash ##
14 ## Additionally these settings will be used by the RhodeCode mailing system ##
15 ## Additionally these settings will be used by the RhodeCode mailing system ##
15 ################################################################################
16 ################################################################################
16 #email_to = admin@localhost
17
17 #error_email_from = paste_error@localhost
18 ## prefix all emails subjects with given prefix, helps filtering out emails
19 #email_prefix = [RhodeCode]
20
21 ## email FROM address all mails will be sent
18 #app_email_from = rhodecode-noreply@localhost
22 #app_email_from = rhodecode-noreply@localhost
23
24 ## Uncomment and replace with the address which should receive any error report
25 ## note: using appenlight for error handling doesn't need this to be uncommented
26 #email_to = admin@localhost
27
28 ## in case of Application errors, sent an error email form
29 #error_email_from = rhodecode_error@localhost
30
31 ## additional error message to be send in case of server crash
19 #error_message =
32 #error_message =
20 #email_prefix = [RhodeCode]
33
21
34
22 #smtp_server = mail.server.com
35 #smtp_server = mail.server.com
23 #smtp_username =
36 #smtp_username =
@@ -37,6 +50,7 b' port = 5000'
37 ## WAITRESS WSGI SERVER ##
50 ## WAITRESS WSGI SERVER ##
38 ## Recommended for Development ##
51 ## Recommended for Development ##
39 ##################################
52 ##################################
53
40 use = egg:waitress#main
54 use = egg:waitress#main
41 ## number of worker threads
55 ## number of worker threads
42 threads = 5
56 threads = 5
@@ -51,6 +65,7 b' asyncore_use_poll = true'
51 ## GUNICORN WSGI SERVER ##
65 ## GUNICORN WSGI SERVER ##
52 ##########################
66 ##########################
53 ## run with gunicorn --log-config <inifile.ini> --paste <inifile.ini>
67 ## run with gunicorn --log-config <inifile.ini> --paste <inifile.ini>
68
54 #use = egg:gunicorn#main
69 #use = egg:gunicorn#main
55 ## Sets the number of process workers. You must set `instance_id = *`
70 ## Sets the number of process workers. You must set `instance_id = *`
56 ## when this option is set to more than one worker, recommended
71 ## when this option is set to more than one worker, recommended
@@ -77,15 +92,18 b' asyncore_use_poll = true'
77
92
78
93
79 ## prefix middleware for RhodeCode, disables force_https flag.
94 ## prefix middleware for RhodeCode, disables force_https flag.
95 ## recommended when using proxy setup.
80 ## allows to set RhodeCode under a prefix in server.
96 ## allows to set RhodeCode under a prefix in server.
81 ## eg https://server.com/<prefix>. Enable `filter-with =` option below as well.
97 ## eg https://server.com/<prefix>. Enable `filter-with =` option below as well.
82 #[filter:proxy-prefix]
98 ## optionally set prefix like: `prefix = /<your-prefix>`
83 #use = egg:PasteDeploy#prefix
99 [filter:proxy-prefix]
84 #prefix = /<your-prefix>
100 use = egg:PasteDeploy#prefix
101 prefix = /
85
102
86 [app:main]
103 [app:main]
87 use = egg:rhodecode-enterprise-ce
104 use = egg:rhodecode-enterprise-ce
88 ## enable proxy prefix middleware, defined below
105
106 ## enable proxy prefix middleware, defined above
89 #filter-with = proxy-prefix
107 #filter-with = proxy-prefix
90
108
91 # During development the we want to have the debug toolbar enabled
109 # During development the we want to have the debug toolbar enabled
@@ -123,12 +141,10 b' rhodecode.api.url = /_admin/api'
123 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
141 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
124 #rhodecode.encrypted_values.strict = false
142 #rhodecode.encrypted_values.strict = false
125
143
126 full_stack = true
144 ## return gzipped responses from Rhodecode (static files/application)
145 gzip_responses = false
127
146
128 ## Serve static files via RhodeCode, disable to serve them via HTTP server
147 ## autogenerate javascript routes file on startup
129 static_files = true
130
131 # autogenerate javascript routes file on startup
132 generate_js_files = false
148 generate_js_files = false
133
149
134 ## Optional Languages
150 ## Optional Languages
@@ -317,8 +333,8 b' beaker.cache.sql_cache_short.type = memo'
317 beaker.cache.sql_cache_short.expire = 10
333 beaker.cache.sql_cache_short.expire = 10
318 beaker.cache.sql_cache_short.key_length = 256
334 beaker.cache.sql_cache_short.key_length = 256
319
335
320 # default is memory cache, configure only if required
336 ## default is memory cache, configure only if required
321 # using multi-node or multi-worker setup
337 ## using multi-node or multi-worker setup
322 #beaker.cache.auth_plugins.type = ext:database
338 #beaker.cache.auth_plugins.type = ext:database
323 #beaker.cache.auth_plugins.lock_dir = %(here)s/data/cache/auth_plugin_lock
339 #beaker.cache.auth_plugins.lock_dir = %(here)s/data/cache/auth_plugin_lock
324 #beaker.cache.auth_plugins.url = postgresql://postgres:secret@localhost/rhodecode
340 #beaker.cache.auth_plugins.url = postgresql://postgres:secret@localhost/rhodecode
@@ -331,8 +347,8 b' beaker.cache.repo_cache_long.type = memo'
331 beaker.cache.repo_cache_long.max_items = 4096
347 beaker.cache.repo_cache_long.max_items = 4096
332 beaker.cache.repo_cache_long.expire = 2592000
348 beaker.cache.repo_cache_long.expire = 2592000
333
349
334 # default is memorylru_base cache, configure only if required
350 ## default is memorylru_base cache, configure only if required
335 # using multi-node or multi-worker setup
351 ## using multi-node or multi-worker setup
336 #beaker.cache.repo_cache_long.type = ext:memcached
352 #beaker.cache.repo_cache_long.type = ext:memcached
337 #beaker.cache.repo_cache_long.url = localhost:11211
353 #beaker.cache.repo_cache_long.url = localhost:11211
338 #beaker.cache.repo_cache_long.expire = 1209600
354 #beaker.cache.repo_cache_long.expire = 1209600
@@ -347,7 +363,7 b' beaker.cache.repo_cache_long.expire = 25'
347 beaker.session.type = file
363 beaker.session.type = file
348 beaker.session.data_dir = %(here)s/data/sessions/data
364 beaker.session.data_dir = %(here)s/data/sessions/data
349
365
350 ## db based session, fast, and allows easy management over logged in users ##
366 ## db based session, fast, and allows easy management over logged in users
351 #beaker.session.type = ext:database
367 #beaker.session.type = ext:database
352 #beaker.session.table_name = db_session
368 #beaker.session.table_name = db_session
353 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
369 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
@@ -368,6 +384,7 b' beaker.session.lock_dir = %(here)s/data/'
368 ## accessed for given amount of time in seconds
384 ## accessed for given amount of time in seconds
369 beaker.session.timeout = 2592000
385 beaker.session.timeout = 2592000
370 beaker.session.httponly = true
386 beaker.session.httponly = true
387 ## Path to use for the cookie.
371 #beaker.session.cookie_path = /<your-prefix>
388 #beaker.session.cookie_path = /<your-prefix>
372
389
373 ## uncomment for https secure cookie
390 ## uncomment for https secure cookie
@@ -391,6 +408,23 b' beaker.session.auto = false'
391 search.module = rhodecode.lib.index.whoosh
408 search.module = rhodecode.lib.index.whoosh
392 search.location = %(here)s/data/index
409 search.location = %(here)s/data/index
393
410
411 ########################################
412 ### CHANNELSTREAM CONFIG ####
413 ########################################
414 ## channelstream enables persistent connections and live notification
415 ## in the system. It's also used by the chat system
416
417 channelstream.enabled = true
418 ## location of channelstream server on the backend
419 channelstream.server = 127.0.0.1:9800
420 ## location of the channelstream server from outside world
421 ## most likely this would be an http server special backend URL, that handles
422 ## websocket connections see nginx example for config
423 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
424 channelstream.secret = secret
425 channelstream.history.location = %(here)s/channelstream_history
426
427
394 ###################################
428 ###################################
395 ## APPENLIGHT CONFIG ##
429 ## APPENLIGHT CONFIG ##
396 ###################################
430 ###################################
@@ -466,9 +500,10 b' debug_style = true'
466 #########################################################
500 #########################################################
467 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
501 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
468 #########################################################
502 #########################################################
469 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
503 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
470 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
504 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
471 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
505 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
506 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
472
507
473 # see sqlalchemy docs for other advanced settings
508 # see sqlalchemy docs for other advanced settings
474
509
@@ -498,28 +533,53 b' vcs.server = localhost:9900'
498 ## Available protocols are:
533 ## Available protocols are:
499 ## `pyro4` - using pyro4 server
534 ## `pyro4` - using pyro4 server
500 ## `http` - using http-rpc backend
535 ## `http` - using http-rpc backend
501 #vcs.server.protocol = http
536 vcs.server.protocol = http
502
537
503 ## Push/Pull operations protocol, available options are:
538 ## Push/Pull operations protocol, available options are:
504 ## `pyro4` - using pyro4 server
539 ## `pyro4` - using pyro4 server
505 ## `rhodecode.lib.middleware.utils.scm_app_http` - Http based, recommended
540 ## `rhodecode.lib.middleware.utils.scm_app_http` - Http based, recommended
506 ## `vcsserver.scm_app` - internal app (EE only)
541 ## `vcsserver.scm_app` - internal app (EE only)
507 #vcs.scm_app_implementation = rhodecode.lib.middleware.utils.scm_app_http
542 vcs.scm_app_implementation = rhodecode.lib.middleware.utils.scm_app_http
508
543
509 ## Push/Pull operations hooks protocol, available options are:
544 ## Push/Pull operations hooks protocol, available options are:
510 ## `pyro4` - using pyro4 server
545 ## `pyro4` - using pyro4 server
511 ## `http` - using http-rpc backend
546 ## `http` - using http-rpc backend
512 #vcs.hooks.protocol = http
547 vcs.hooks.protocol = http
513
548
514 vcs.server.log_level = debug
549 vcs.server.log_level = debug
515 ## Start VCSServer with this instance as a subprocess, usefull for development
550 ## Start VCSServer with this instance as a subprocess, usefull for development
516 vcs.start_server = true
551 vcs.start_server = true
552
553 ## List of enabled VCS backends, available options are:
554 ## `hg` - mercurial
555 ## `git` - git
556 ## `svn` - subversion
517 vcs.backends = hg, git, svn
557 vcs.backends = hg, git, svn
558
518 vcs.connection_timeout = 3600
559 vcs.connection_timeout = 3600
519 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
560 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
520 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible
561 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible
521 #vcs.svn.compatible_version = pre-1.8-compatible
562 #vcs.svn.compatible_version = pre-1.8-compatible
522
563
564
565 ############################################################
566 ### Subversion proxy support (mod_dav_svn) ###
567 ### Maps RhodeCode repo groups into SVN paths for Apache ###
568 ############################################################
569 ## Enable or disable the config file generation.
570 svn.proxy.generate_config = false
571 ## Generate config file with `SVNListParentPath` set to `On`.
572 svn.proxy.list_parent_path = true
573 ## Set location and file name of generated config file.
574 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
575 ## File system path to the directory containing the repositories served by
576 ## RhodeCode.
577 svn.proxy.parent_path_root = /path/to/repo_store
578 ## Used as a prefix to the <Location> block in the generated config file. In
579 ## most cases it should be set to `/`.
580 svn.proxy.location_root = /
581
582
523 ################################
583 ################################
524 ### LOGGING CONFIGURATION ####
584 ### LOGGING CONFIGURATION ####
525 ################################
585 ################################
@@ -1,23 +1,36 b''
1 ################################################################################
1
2
2 ################################################################################
3 ################################################################################
3 # RhodeCode Enterprise - configuration file #
4 ## RHODECODE ENTERPRISE CONFIGURATION ##
4 # Built-in functions and variables #
5 # The %(here)s variable will be replaced with the parent directory of this file#
5 # The %(here)s variable will be replaced with the parent directory of this file#
6 # #
7 ################################################################################
6 ################################################################################
8
7
9 [DEFAULT]
8 [DEFAULT]
10 debug = true
9 debug = true
10
11 ################################################################################
11 ################################################################################
12 ## EMAIL CONFIGURATION ##
12 ## Uncomment and replace with the email address which should receive ##
13 ## Uncomment and replace with the email address which should receive ##
13 ## any error reports after an application crash ##
14 ## any error reports after an application crash ##
14 ## Additionally these settings will be used by the RhodeCode mailing system ##
15 ## Additionally these settings will be used by the RhodeCode mailing system ##
15 ################################################################################
16 ################################################################################
16 #email_to = admin@localhost
17
17 #error_email_from = paste_error@localhost
18 ## prefix all emails subjects with given prefix, helps filtering out emails
19 #email_prefix = [RhodeCode]
20
21 ## email FROM address all mails will be sent
18 #app_email_from = rhodecode-noreply@localhost
22 #app_email_from = rhodecode-noreply@localhost
23
24 ## Uncomment and replace with the address which should receive any error report
25 ## note: using appenlight for error handling doesn't need this to be uncommented
26 #email_to = admin@localhost
27
28 ## in case of Application errors, sent an error email form
29 #error_email_from = rhodecode_error@localhost
30
31 ## additional error message to be send in case of server crash
19 #error_message =
32 #error_message =
20 #email_prefix = [RhodeCode]
33
21
34
22 #smtp_server = mail.server.com
35 #smtp_server = mail.server.com
23 #smtp_username =
36 #smtp_username =
@@ -37,6 +50,7 b' port = 5000'
37 ## WAITRESS WSGI SERVER ##
50 ## WAITRESS WSGI SERVER ##
38 ## Recommended for Development ##
51 ## Recommended for Development ##
39 ##################################
52 ##################################
53
40 #use = egg:waitress#main
54 #use = egg:waitress#main
41 ## number of worker threads
55 ## number of worker threads
42 #threads = 5
56 #threads = 5
@@ -51,6 +65,7 b' port = 5000'
51 ## GUNICORN WSGI SERVER ##
65 ## GUNICORN WSGI SERVER ##
52 ##########################
66 ##########################
53 ## run with gunicorn --log-config <inifile.ini> --paste <inifile.ini>
67 ## run with gunicorn --log-config <inifile.ini> --paste <inifile.ini>
68
54 use = egg:gunicorn#main
69 use = egg:gunicorn#main
55 ## Sets the number of process workers. You must set `instance_id = *`
70 ## Sets the number of process workers. You must set `instance_id = *`
56 ## when this option is set to more than one worker, recommended
71 ## when this option is set to more than one worker, recommended
@@ -77,15 +92,18 b' timeout = 21600'
77
92
78
93
79 ## prefix middleware for RhodeCode, disables force_https flag.
94 ## prefix middleware for RhodeCode, disables force_https flag.
95 ## recommended when using proxy setup.
80 ## allows to set RhodeCode under a prefix in server.
96 ## allows to set RhodeCode under a prefix in server.
81 ## eg https://server.com/<prefix>. Enable `filter-with =` option below as well.
97 ## eg https://server.com/<prefix>. Enable `filter-with =` option below as well.
82 #[filter:proxy-prefix]
98 ## optionally set prefix like: `prefix = /<your-prefix>`
83 #use = egg:PasteDeploy#prefix
99 [filter:proxy-prefix]
84 #prefix = /<your-prefix>
100 use = egg:PasteDeploy#prefix
101 prefix = /
85
102
86 [app:main]
103 [app:main]
87 use = egg:rhodecode-enterprise-ce
104 use = egg:rhodecode-enterprise-ce
88 ## enable proxy prefix middleware, defined below
105
106 ## enable proxy prefix middleware, defined above
89 #filter-with = proxy-prefix
107 #filter-with = proxy-prefix
90
108
91 ## encryption key used to encrypt social plugin tokens,
109 ## encryption key used to encrypt social plugin tokens,
@@ -97,12 +115,10 b' use = egg:rhodecode-enterprise-ce'
97 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
115 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
98 #rhodecode.encrypted_values.strict = false
116 #rhodecode.encrypted_values.strict = false
99
117
100 full_stack = true
118 ## return gzipped responses from Rhodecode (static files/application)
119 gzip_responses = false
101
120
102 ## Serve static files via RhodeCode, disable to serve them via HTTP server
121 ## autogenerate javascript routes file on startup
103 static_files = true
104
105 # autogenerate javascript routes file on startup
106 generate_js_files = false
122 generate_js_files = false
107
123
108 ## Optional Languages
124 ## Optional Languages
@@ -291,8 +307,8 b' beaker.cache.sql_cache_short.type = memo'
291 beaker.cache.sql_cache_short.expire = 10
307 beaker.cache.sql_cache_short.expire = 10
292 beaker.cache.sql_cache_short.key_length = 256
308 beaker.cache.sql_cache_short.key_length = 256
293
309
294 # default is memory cache, configure only if required
310 ## default is memory cache, configure only if required
295 # using multi-node or multi-worker setup
311 ## using multi-node or multi-worker setup
296 #beaker.cache.auth_plugins.type = ext:database
312 #beaker.cache.auth_plugins.type = ext:database
297 #beaker.cache.auth_plugins.lock_dir = %(here)s/data/cache/auth_plugin_lock
313 #beaker.cache.auth_plugins.lock_dir = %(here)s/data/cache/auth_plugin_lock
298 #beaker.cache.auth_plugins.url = postgresql://postgres:secret@localhost/rhodecode
314 #beaker.cache.auth_plugins.url = postgresql://postgres:secret@localhost/rhodecode
@@ -305,8 +321,8 b' beaker.cache.repo_cache_long.type = memo'
305 beaker.cache.repo_cache_long.max_items = 4096
321 beaker.cache.repo_cache_long.max_items = 4096
306 beaker.cache.repo_cache_long.expire = 2592000
322 beaker.cache.repo_cache_long.expire = 2592000
307
323
308 # default is memorylru_base cache, configure only if required
324 ## default is memorylru_base cache, configure only if required
309 # using multi-node or multi-worker setup
325 ## using multi-node or multi-worker setup
310 #beaker.cache.repo_cache_long.type = ext:memcached
326 #beaker.cache.repo_cache_long.type = ext:memcached
311 #beaker.cache.repo_cache_long.url = localhost:11211
327 #beaker.cache.repo_cache_long.url = localhost:11211
312 #beaker.cache.repo_cache_long.expire = 1209600
328 #beaker.cache.repo_cache_long.expire = 1209600
@@ -321,7 +337,7 b' beaker.cache.repo_cache_long.expire = 25'
321 beaker.session.type = file
337 beaker.session.type = file
322 beaker.session.data_dir = %(here)s/data/sessions/data
338 beaker.session.data_dir = %(here)s/data/sessions/data
323
339
324 ## db based session, fast, and allows easy management over logged in users ##
340 ## db based session, fast, and allows easy management over logged in users
325 #beaker.session.type = ext:database
341 #beaker.session.type = ext:database
326 #beaker.session.table_name = db_session
342 #beaker.session.table_name = db_session
327 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
343 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
@@ -342,6 +358,7 b' beaker.session.lock_dir = %(here)s/data/'
342 ## accessed for given amount of time in seconds
358 ## accessed for given amount of time in seconds
343 beaker.session.timeout = 2592000
359 beaker.session.timeout = 2592000
344 beaker.session.httponly = true
360 beaker.session.httponly = true
361 ## Path to use for the cookie.
345 #beaker.session.cookie_path = /<your-prefix>
362 #beaker.session.cookie_path = /<your-prefix>
346
363
347 ## uncomment for https secure cookie
364 ## uncomment for https secure cookie
@@ -365,6 +382,23 b' beaker.session.auto = false'
365 search.module = rhodecode.lib.index.whoosh
382 search.module = rhodecode.lib.index.whoosh
366 search.location = %(here)s/data/index
383 search.location = %(here)s/data/index
367
384
385 ########################################
386 ### CHANNELSTREAM CONFIG ####
387 ########################################
388 ## channelstream enables persistent connections and live notification
389 ## in the system. It's also used by the chat system
390
391 channelstream.enabled = true
392 ## location of channelstream server on the backend
393 channelstream.server = 127.0.0.1:9800
394 ## location of the channelstream server from outside world
395 ## most likely this would be an http server special backend URL, that handles
396 ## websocket connections see nginx example for config
397 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
398 channelstream.secret = secret
399 channelstream.history.location = %(here)s/channelstream_history
400
401
368 ###################################
402 ###################################
369 ## APPENLIGHT CONFIG ##
403 ## APPENLIGHT CONFIG ##
370 ###################################
404 ###################################
@@ -436,8 +470,9 b' set debug = false'
436 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
470 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
437 #########################################################
471 #########################################################
438 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
472 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
473 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
474 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
439 sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
475 sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
440 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
441
476
442 # see sqlalchemy docs for other advanced settings
477 # see sqlalchemy docs for other advanced settings
443
478
@@ -483,12 +518,37 b' vcs.server = localhost:9900'
483 vcs.server.log_level = info
518 vcs.server.log_level = info
484 ## Start VCSServer with this instance as a subprocess, usefull for development
519 ## Start VCSServer with this instance as a subprocess, usefull for development
485 vcs.start_server = false
520 vcs.start_server = false
521
522 ## List of enabled VCS backends, available options are:
523 ## `hg` - mercurial
524 ## `git` - git
525 ## `svn` - subversion
486 vcs.backends = hg, git, svn
526 vcs.backends = hg, git, svn
527
487 vcs.connection_timeout = 3600
528 vcs.connection_timeout = 3600
488 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
529 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
489 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible
530 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible
490 #vcs.svn.compatible_version = pre-1.8-compatible
531 #vcs.svn.compatible_version = pre-1.8-compatible
491
532
533
534 ############################################################
535 ### Subversion proxy support (mod_dav_svn) ###
536 ### Maps RhodeCode repo groups into SVN paths for Apache ###
537 ############################################################
538 ## Enable or disable the config file generation.
539 svn.proxy.generate_config = false
540 ## Generate config file with `SVNListParentPath` set to `On`.
541 svn.proxy.list_parent_path = true
542 ## Set location and file name of generated config file.
543 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
544 ## File system path to the directory containing the repositories served by
545 ## RhodeCode.
546 svn.proxy.parent_path_root = /path/to/repo_store
547 ## Used as a prefix to the <Location> block in the generated config file. In
548 ## most cases it should be set to `/`.
549 svn.proxy.location_root = /
550
551
492 ################################
552 ################################
493 ### LOGGING CONFIGURATION ####
553 ### LOGGING CONFIGURATION ####
494 ################################
554 ################################
@@ -123,8 +123,9 b' let'
123 # pkgs/default.nix?
123 # pkgs/default.nix?
124 passthru = {
124 passthru = {
125 inherit
125 inherit
126 pythonLocalOverrides
126 linkNodeModules
127 myPythonPackagesUnfix;
127 myPythonPackagesUnfix
128 pythonLocalOverrides;
128 pythonPackages = self;
129 pythonPackages = self;
129 };
130 };
130
131
@@ -165,6 +166,7 b' let'
165 ln -s ${self.supervisor}/bin/supervisor* $out/bin/
166 ln -s ${self.supervisor}/bin/supervisor* $out/bin/
166 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
167 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
167 ln -s ${self.PasteScript}/bin/paster $out/bin/
168 ln -s ${self.PasteScript}/bin/paster $out/bin/
169 ln -s ${self.channelstream}/bin/channelstream $out/bin/
168 ln -s ${self.pyramid}/bin/* $out/bin/ #*/
170 ln -s ${self.pyramid}/bin/* $out/bin/ #*/
169
171
170 # rhodecode-tools
172 # rhodecode-tools
@@ -9,9 +9,9 b' Here is a sample configuration file for '
9 ServerName hg.myserver.com
9 ServerName hg.myserver.com
10 ServerAlias hg.myserver.com
10 ServerAlias hg.myserver.com
11
11
12 ## uncomment root directive if you want to serve static files by
12 ## uncomment to serve static files by Apache
13 ## Apache requires static_files = false in .ini file
13 ## ProxyPass /_static/rhodecode !
14 #DocumentRoot /path/to/rhodecode/installation/public
14 ## Alias /_static/rhodecode /path/to/.rccontrol/enterprise-1/static
15
15
16 <Proxy *>
16 <Proxy *>
17 Order allow,deny
17 Order allow,deny
@@ -16,17 +16,18 b' Use the following example to configure A'
16 In addition to the regular Apache setup you will need to add the following
16 In addition to the regular Apache setup you will need to add the following
17 lines into the ``rhodecode.ini`` file.
17 lines into the ``rhodecode.ini`` file.
18
18
19 * Above ``[app:main]`` section of the ``rhodecode.ini`` file add the
20 following section if it doesn't exist yet.
21
22 .. code-block:: ini
23
24 [filter:proxy-prefix]
25 use = egg:PasteDeploy#prefix
26 prefix = /<someprefix> # Change <someprefix> into your chosen prefix
27
19 * In the the ``[app:main]`` section of your ``rhodecode.ini`` file add the
28 * In the the ``[app:main]`` section of your ``rhodecode.ini`` file add the
20 following line.
29 following line.
21
30
22 .. code-block:: ini
31 .. code-block:: ini
23
32
24 filter-with = proxy-prefix
33 filter-with = proxy-prefix
25
26 * At the end of the ``rhodecode.ini`` file add the following section.
27
28 .. code-block:: ini
29
30 [filter:proxy-prefix]
31 use = egg:PasteDeploy#prefix
32 prefix = /<someprefix> # Change <someprefix> into your chosen prefix
@@ -121,7 +121,7 b' then work on restoring any specific setu'
121 :ref:`indexing-ref` section for details.
121 :ref:`indexing-ref` section for details.
122 * To reconfigure any extensions, copy the backed up extensions into the
122 * To reconfigure any extensions, copy the backed up extensions into the
123 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions` and also specify
123 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions` and also specify
124 any custom hooks if necessary. See the :ref:`integrations-ref` section for
124 any custom hooks if necessary. See the :ref:`extensions-hooks-ref` section for
125 details.
125 details.
126
126
127 .. _Schrödinger's Backup: http://novabackup.novastor.com/blog/schrodingers-backup-good-bad-backup/
127 .. _Schrödinger's Backup: http://novabackup.novastor.com/blog/schrodingers-backup-good-bad-backup/
@@ -5,6 +5,11 b' Use the following example to configure N'
5
5
6 .. code-block:: nginx
6 .. code-block:: nginx
7
7
8 log_format log_custom '$remote_addr - $remote_user [$time_local] '
9 '"$request" $status $body_bytes_sent '
10 '"$http_referer" "$http_user_agent" '
11 '$request_time $upstream_response_time $pipe';
12
8 upstream rc {
13 upstream rc {
9
14
10 server 127.0.0.1:10002;
15 server 127.0.0.1:10002;
@@ -14,12 +19,12 b' Use the following example to configure N'
14 # server 127.0.0.1:10004;
19 # server 127.0.0.1:10004;
15 }
20 }
16
21
17 ## gist alias
22 ## gist alias server, for serving nicer GIST urls
18
23
19 server {
24 server {
20 listen 443;
25 listen 443;
21 server_name gist.myserver.com;
26 server_name gist.myserver.com;
22 access_log /var/log/nginx/gist.access.log;
27 access_log /var/log/nginx/gist.access.log log_custom;
23 error_log /var/log/nginx/gist.error.log;
28 error_log /var/log/nginx/gist.error.log;
24
29
25 ssl on;
30 ssl on;
@@ -28,23 +33,36 b' Use the following example to configure N'
28
33
29 ssl_session_timeout 5m;
34 ssl_session_timeout 5m;
30
35
31 ssl_protocols SSLv3 TLSv1;
36 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
32 ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;
33 ssl_prefer_server_ciphers on;
37 ssl_prefer_server_ciphers on;
38 ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
39
34 add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
40 add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
35
41
36 # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
42 # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
37 ssl_dhparam /etc/nginx/ssl/dhparam.pem;
43 #ssl_dhparam /etc/nginx/ssl/dhparam.pem;
38
44
39 rewrite ^/(.+)$ https://rhodecode.myserver.com/_admin/gists/$1;
45 rewrite ^/(.+)$ https://rhodecode.myserver.com/_admin/gists/$1;
40 rewrite (.*) https://rhodecode.myserver.com/_admin/gists;
46 rewrite (.*) https://rhodecode.myserver.com/_admin/gists;
41 }
47 }
42
48
49 ## HTTP to HTTPS rewrite
43 server {
50 server {
44 listen 443;
51 listen 80;
45 server_name rhodecode.myserver.com;
52 server_name rhodecode.myserver.com;
46 access_log /var/log/nginx/rhodecode.access.log;
53
47 error_log /var/log/nginx/rhodecode.error.log;
54 if ($http_host = rhodecode.myserver.com) {
55 rewrite (.*) https://rhodecode.myserver.com$1 permanent;
56 }
57 }
58
59 ## MAIN SSL enabled server
60 server {
61 listen 443 ssl;
62 server_name rhodecode.myserver.com;
63
64 access_log /var/log/nginx/rhodecode.access.log log_custom;
65 error_log /var/log/nginx/rhodecode.error.log;
48
66
49 ssl on;
67 ssl on;
50 ssl_certificate rhodecode.myserver.com.crt;
68 ssl_certificate rhodecode.myserver.com.crt;
@@ -52,21 +70,51 b' Use the following example to configure N'
52
70
53 ssl_session_timeout 5m;
71 ssl_session_timeout 5m;
54
72
55 ssl_protocols SSLv3 TLSv1;
73 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
56 ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;
57 ssl_prefer_server_ciphers on;
74 ssl_prefer_server_ciphers on;
75 ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
76
77 # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
78 #ssl_dhparam /etc/nginx/ssl/dhparam.pem;
79
80 include /etc/nginx/proxy.conf;
81
82 ## serve static files by nginx, recommended
83 # location /_static/rhodecode {
84 # alias /path/to/.rccontrol/enterprise-1/static;
85 # }
58
86
59 ## uncomment root directive if you want to serve static files by nginx
87 ## channel stream live components
60 ## requires static_files = false in .ini file
88 location /_channelstream {
61 # root /path/to/rhodecode/installation/public;
89 rewrite /_channelstream/(.*) /$1 break;
90 proxy_pass http://127.0.0.1:9800;
62
91
63 include /etc/nginx/proxy.conf;
92 proxy_connect_timeout 10;
93 proxy_send_timeout 10m;
94 proxy_read_timeout 10m;
95 tcp_nodelay off;
96 proxy_set_header Host $host;
97 proxy_set_header X-Real-IP $remote_addr;
98 proxy_set_header X-Url-Scheme $scheme;
99 proxy_set_header X-Forwarded-Proto $scheme;
100 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
101 gzip off;
102 proxy_http_version 1.1;
103 proxy_set_header Upgrade $http_upgrade;
104 proxy_set_header Connection "upgrade";
105 }
64
106
65 location / {
107 location / {
66 try_files $uri @rhode;
108 try_files $uri @rhode;
67 }
109 }
68
110
69 location @rhode {
111 location @rhode {
70 proxy_pass http://rc;
112 proxy_pass http://rc;
71 }
113 }
72 }
114
115 ## custom 502 error page
116 error_page 502 /502.html;
117 location = /502.html {
118 root /path/to/.rccontrol/enterprise-1/static;
119 }
120 } No newline at end of file
@@ -15,7 +15,16 b' Use the following example to configure N'
15 }
15 }
16
16
17 In addition to the Nginx configuration you will need to add the following
17 In addition to the Nginx configuration you will need to add the following
18 lines into the ``rhodecode.ini`` file.
18 lines (if they not exist) into the ``rhodecode.ini`` file.
19
20 * Above ``[app:main]`` section of the ``rhodecode.ini`` file add the
21 following section if it doesn't exist yet.
22
23 .. code-block:: ini
24
25 [filter:proxy-prefix]
26 use = egg:PasteDeploy#prefix
27 prefix = /<someprefix> # Change <someprefix> into your chosen prefix
19
28
20 * In the the ``[app:main]`` section of your ``rhodecode.ini`` file add the
29 * In the the ``[app:main]`` section of your ``rhodecode.ini`` file add the
21 following line.
30 following line.
@@ -24,10 +33,4 b' lines into the ``rhodecode.ini`` file.'
24
33
25 filter-with = proxy-prefix
34 filter-with = proxy-prefix
26
35
27 * At the end of the ``rhodecode.ini`` file add the following section.
28
36
29 .. code-block:: ini
30
31 [filter:proxy-prefix]
32 use = egg:PasteDeploy#prefix
33 prefix = /<someprefix> # Change <someprefix> into your chosen prefix
@@ -32,7 +32,7 b' Example Usage'
32 -------------
32 -------------
33
33
34 To use the extra fields in an extension, see the example below. For more
34 To use the extra fields in an extension, see the example below. For more
35 information and examples, see the :ref:`integrations-ref` section.
35 information and examples, see the :ref:`extensions-hooks-ref` section.
36
36
37 .. code-block:: python
37 .. code-block:: python
38
38
@@ -30,7 +30,7 b' account permissions.'
30 # Use this example to change user permissions
30 # Use this example to change user permissions
31 In [1]: adminuser = User.get_by_username('username')
31 In [1]: adminuser = User.get_by_username('username')
32 In [2]: adminuser.admin = True
32 In [2]: adminuser.admin = True
33 In [3]: Session.add(adminuser);Session().commit()
33 In [3]: Session().add(adminuser);Session().commit()
34 In [4]: exit()
34 In [4]: exit()
35
35
36 Set to read global ``.hgrc`` file
36 Set to read global ``.hgrc`` file
@@ -76,7 +76,7 b' following examples. For more |svn| infor'
76 .. code-block:: bash
76 .. code-block:: bash
77
77
78 # To clone a repository
78 # To clone a repository
79 svn clone http://my-svn-server.example.com/my-svn-repo
79 svn checkout http://my-svn-server.example.com/my-svn-repo
80
80
81 # svn commit
81 # svn commit
82 svn commit
82 svn commit
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 ApiController.
194 ApiController.
195
195
196 .. --- API DEFS MARKER ---
196 .. --- API DEFS MARKER ---
197
197 .. toctree::
198 pull
199 ----
200
201 .. py:function:: pull(apiuser, repoid)
202
203 Triggers a pull on the given repository from a remote location. You
204 can use this to keep remote repositories up-to-date.
205
206 This command can only be run using an |authtoken| with admin
207 rights to the specified repository. For more information,
208 see :ref:`config-token-ref`.
209
210 This command takes the following options:
211
212 :param apiuser: This is filled automatically from the |authtoken|.
213 :type apiuser: AuthUser
214 :param repoid: The repository name or repository ID.
215 :type repoid: str or int
216
217 Example output:
218
219 .. code-block:: bash
220
221 id : <id_given_in_input>
222 result : {
223 "msg": "Pulled from `<repository name>`"
224 "repository": "<repository name>"
225 }
226 error : null
227
228 Example error output:
229
230 .. code-block:: bash
231
232 id : <id_given_in_input>
233 result : null
234 error : {
235 "Unable to pull changes from `<reponame>`"
236 }
237
238
239 strip
240 -----
241
242 .. py:function:: strip(apiuser, repoid, revision, branch)
243
244 Strips the given revision from the specified repository.
245
246 * This will remove the revision and all of its decendants.
247
248 This command can only be run using an |authtoken| with admin rights to
249 the specified repository.
250
251 This command takes the following options:
252
253 :param apiuser: This is filled automatically from the |authtoken|.
254 :type apiuser: AuthUser
255 :param repoid: The repository name or repository ID.
256 :type repoid: str or int
257 :param revision: The revision you wish to strip.
258 :type revision: str
259 :param branch: The branch from which to strip the revision.
260 :type branch: str
261
262 Example output:
263
264 .. code-block:: bash
265
266 id : <id_given_in_input>
267 result : {
268 "msg": "'Stripped commit <commit_hash> from repo `<repository name>`'"
269 "repository": "<repository name>"
270 }
271 error : null
272
273 Example error output:
274
275 .. code-block:: bash
276
277 id : <id_given_in_input>
278 result : null
279 error : {
280 "Unable to strip commit <commit_hash> from repo `<repository name>`"
281 }
282
283
284 rescan_repos
285 ------------
286
287 .. py:function:: rescan_repos(apiuser, remove_obsolete=<Optional:False>)
288
289 Triggers a rescan of the specified repositories.
290
291 * If the ``remove_obsolete`` option is set, it also deletes repositories
292 that are found in the database but not on the file system, so called
293 "clean zombies".
294
295 This command can only be run using an |authtoken| with admin rights to
296 the specified repository.
297
298 This command takes the following options:
299
300 :param apiuser: This is filled automatically from the |authtoken|.
301 :type apiuser: AuthUser
302 :param remove_obsolete: Deletes repositories from the database that
303 are not found on the filesystem.
304 :type remove_obsolete: Optional(``True`` | ``False``)
305
306 Example output:
307
308 .. code-block:: bash
309
310 id : <id_given_in_input>
311 result : {
312 'added': [<added repository name>,...]
313 'removed': [<removed repository name>,...]
314 }
315 error : null
316
317 Example error output:
318
319 .. code-block:: bash
320
321 id : <id_given_in_input>
322 result : null
323 error : {
324 'Error occurred during rescan repositories action'
325 }
326
327
328 invalidate_cache
329 ----------------
330
331 .. py:function:: invalidate_cache(apiuser, repoid, delete_keys=<Optional:False>)
332
333 Invalidates the cache for the specified repository.
334
335 This command can only be run using an |authtoken| with admin rights to
336 the specified repository.
337
338 This command takes the following options:
339
340 :param apiuser: This is filled automatically from |authtoken|.
341 :type apiuser: AuthUser
342 :param repoid: Sets the repository name or repository ID.
343 :type repoid: str or int
344 :param delete_keys: This deletes the invalidated keys instead of
345 just flagging them.
346 :type delete_keys: Optional(``True`` | ``False``)
347
348 Example output:
349
350 .. code-block:: bash
351
352 id : <id_given_in_input>
353 result : {
354 'msg': Cache for repository `<repository name>` was invalidated,
355 'repository': <repository name>
356 }
357 error : null
358
359 Example error output:
360
361 .. code-block:: bash
362
363 id : <id_given_in_input>
364 result : null
365 error : {
366 'Error occurred during cache invalidation action'
367 }
368
369
370 lock
371 ----
372
373 .. py:function:: lock(apiuser, repoid, locked=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
374
375 Sets the lock state of the specified |repo| by the given user.
376 From more information, see :ref:`repo-locking`.
377
378 * If the ``userid`` option is not set, the repository is locked to the
379 user who called the method.
380 * If the ``locked`` parameter is not set, the current lock state of the
381 repository is displayed.
382
383 This command can only be run using an |authtoken| with admin rights to
384 the specified repository.
385
386 This command takes the following options:
387
388 :param apiuser: This is filled automatically from the |authtoken|.
389 :type apiuser: AuthUser
390 :param repoid: Sets the repository name or repository ID.
391 :type repoid: str or int
392 :param locked: Sets the lock state.
393 :type locked: Optional(``True`` | ``False``)
394 :param userid: Set the repository lock to this user.
395 :type userid: Optional(str or int)
396
397 Example error output:
398
399 .. code-block:: bash
400
401 id : <id_given_in_input>
402 result : {
403 'repo': '<reponame>',
404 'locked': <bool: lock state>,
405 'locked_since': <int: lock timestamp>,
406 'locked_by': <username of person who made the lock>,
407 'lock_reason': <str: reason for locking>,
408 'lock_state_changed': <bool: True if lock state has been changed in this request>,
409 'msg': 'Repo `<reponame>` locked by `<username>` on <timestamp>.'
410 or
411 'msg': 'Repo `<repository name>` not locked.'
412 or
413 'msg': 'User `<user name>` set lock state for repo `<repository name>` to `<new lock state>`'
414 }
415 error : null
416
417 Example error output:
418
419 .. code-block:: bash
420
421 id : <id_given_in_input>
422 result : null
423 error : {
424 'Error occurred locking repository `<reponame>`
425 }
426
427
428 get_locks
429 ---------
430
431 .. py:function:: get_locks(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
432
433 Displays all repositories locked by the specified user.
434
435 * If this command is run by a non-admin user, it returns
436 a list of |repos| locked by that user.
437
438 This command takes the following options:
439
440 :param apiuser: This is filled automatically from the |authtoken|.
441 :type apiuser: AuthUser
442 :param userid: Sets the userid whose list of locked |repos| will be
443 displayed.
444 :type userid: Optional(str or int)
445
446 Example output:
447
448 .. code-block:: bash
449
450 id : <id_given_in_input>
451 result : {
452 [repo_object, repo_object,...]
453 }
454 error : null
455
456
457 get_ip
458 ------
459
460 .. py:function:: get_ip(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
461
462 Displays the IP Address as seen from the |RCE| server.
463
464 * This command displays the IP Address, as well as all the defined IP
465 addresses for the specified user. If the ``userid`` is not set, the
466 data returned is for the user calling the method.
467
468 This command can only be run using an |authtoken| with admin rights to
469 the specified repository.
470
471 This command takes the following options:
472
473 :param apiuser: This is filled automatically from |authtoken|.
474 :type apiuser: AuthUser
475 :param userid: Sets the userid for which associated IP Address data
476 is returned.
477 :type userid: Optional(str or int)
478
479 Example output:
480
481 .. code-block:: bash
482
483 id : <id_given_in_input>
484 result : {
485 "server_ip_addr": "<ip_from_clien>",
486 "user_ips": [
487 {
488 "ip_addr": "<ip_with_mask>",
489 "ip_range": ["<start_ip>", "<end_ip>"],
490 },
491 ...
492 ]
493 }
494
495
496 show_ip
497 -------
498
499 .. py:function:: show_ip(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
500
501 Displays the IP Address as seen from the |RCE| server.
502
503 * This command displays the IP Address, as well as all the defined IP
504 addresses for the specified user. If the ``userid`` is not set, the
505 data returned is for the user calling the method.
506
507 This command can only be run using an |authtoken| with admin rights to
508 the specified repository.
509
510 This command takes the following options:
511
512 :param apiuser: This is filled automatically from |authtoken|.
513 :type apiuser: AuthUser
514 :param userid: Sets the userid for which associated IP Address data
515 is returned.
516 :type userid: Optional(str or int)
517
518 Example output:
519
520 .. code-block:: bash
521
522 id : <id_given_in_input>
523 result : {
524 "server_ip_addr": "<ip_from_clien>",
525 "user_ips": [
526 {
527 "ip_addr": "<ip_with_mask>",
528 "ip_range": ["<start_ip>", "<end_ip>"],
529 },
530 ...
531 ]
532 }
533
534
535 get_license_info
536 ----------------
537
538 .. py:function:: get_license_info(apiuser)
539
540 Returns the |RCE| license information.
541
542 :param apiuser: This is filled automatically from the |authtoken|.
543 :type apiuser: AuthUser
544
545 Example output:
546
547 .. code-block:: bash
548
549 id : <id_given_in_input>
550 result : {
551 'rhodecode_version': <rhodecode version>,
552 'token': <license token>,
553 'issued_to': <license owner>,
554 'issued_on': <license issue date>,
555 'expires_on': <license expiration date>,
556 'type': <license type>,
557 'users_limit': <license users limit>,
558 'key': <license key>
559 }
560 error : null
561
562
563 set_license_key
564 ---------------
565
566 .. py:function:: set_license_key(apiuser, key)
567
568 Sets the |RCE| license key.
569
570 :param apiuser: This is filled automatically from the |authtoken|.
571 :type apiuser: AuthUser
572 :param key: This is the license key to be set.
573 :type key: str
574
575 Example output:
576
577 .. code-block:: bash
578
579 id : <id_given_in_input>
580 result: {
581 "msg" : "updated license information",
582 "key": <key>
583 }
584 error: null
585
586 Example error output:
587
588 .. code-block:: bash
589
590 id : <id_given_in_input>
591 result : null
592 error : {
593 "license key is not valid"
594 or
595 "trial licenses cannot be uploaded"
596 or
597 "error occurred while updating license"
598 }
599
600
601 get_server_info
602 ---------------
603
604 .. py:function:: get_server_info(apiuser)
605
606 Returns the |RCE| server information.
607
608 This includes the running version of |RCE| and all installed
609 packages. This command takes the following options:
610
611 :param apiuser: This is filled automatically from the |authtoken|.
612 :type apiuser: AuthUser
613
614 Example output:
615
616 .. code-block:: bash
617
618 id : <id_given_in_input>
619 result : {
620 'modules': [<module name>,...]
621 'py_version': <python version>,
622 'platform': <platform type>,
623 'rhodecode_version': <rhodecode version>
624 }
625 error : null
626
627
628 get_user
629 --------
630
631 .. py:function:: get_user(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
632
633 Returns the information associated with a username or userid.
634
635 * If the ``userid`` is not set, this command returns the information
636 for the ``userid`` calling the method.
637
638 .. note::
639
640 Normal users may only run this command against their ``userid``. For
641 full privileges you must run this command using an |authtoken| with
642 admin rights.
643
644 This command takes the following options:
645
646 :param apiuser: This is filled automatically from the |authtoken|.
647 :type apiuser: AuthUser
648 :param userid: Sets the userid for which data will be returned.
649 :type userid: Optional(str or int)
650
651 Example output:
652
653 .. code-block:: bash
654
655 {
656 "error": null,
657 "id": <id>,
658 "result": {
659 "active": true,
660 "admin": false,
661 "api_key": "api-key",
662 "api_keys": [ list of keys ],
663 "email": "user@example.com",
664 "emails": [
665 "user@example.com"
666 ],
667 "extern_name": "rhodecode",
668 "extern_type": "rhodecode",
669 "firstname": "username",
670 "ip_addresses": [],
671 "language": null,
672 "last_login": "Timestamp",
673 "lastname": "surnae",
674 "permissions": {
675 "global": [
676 "hg.inherit_default_perms.true",
677 "usergroup.read",
678 "hg.repogroup.create.false",
679 "hg.create.none",
680 "hg.extern_activate.manual",
681 "hg.create.write_on_repogroup.false",
682 "hg.usergroup.create.false",
683 "group.none",
684 "repository.none",
685 "hg.register.none",
686 "hg.fork.repository"
687 ],
688 "repositories": { "username/example": "repository.write"},
689 "repositories_groups": { "user-group/repo": "group.none" },
690 "user_groups": { "user_group_name": "usergroup.read" }
691 },
692 "user_id": 32,
693 "username": "username"
694 }
695 }
696
697
698 get_users
699 ---------
700
701 .. py:function:: get_users(apiuser)
702
703 Lists all users in the |RCE| user database.
704
705 This command can only be run using an |authtoken| with admin rights to
706 the specified repository.
707
708 This command takes the following options:
709
710 :param apiuser: This is filled automatically from the |authtoken|.
711 :type apiuser: AuthUser
712
713 Example output:
714
715 .. code-block:: bash
716
717 id : <id_given_in_input>
718 result: [<user_object>, ...]
719 error: null
720
721
722 create_user
723 -----------
724
725 .. py:function:: create_user(apiuser, username, email, password=<Optional:''>, firstname=<Optional:''>, lastname=<Optional:''>, active=<Optional:True>, admin=<Optional:False>, extern_name=<Optional:'rhodecode'>, extern_type=<Optional:'rhodecode'>, force_password_change=<Optional:False>)
726
727 Creates a new user and returns the new user object.
728
729 This command can only be run using an |authtoken| with admin rights to
730 the specified repository.
731
732 This command takes the following options:
733
734 :param apiuser: This is filled automatically from the |authtoken|.
735 :type apiuser: AuthUser
736 :param username: Set the new username.
737 :type username: str or int
738 :param email: Set the user email address.
739 :type email: str
740 :param password: Set the new user password.
741 :type password: Optional(str)
742 :param firstname: Set the new user firstname.
743 :type firstname: Optional(str)
744 :param lastname: Set the new user surname.
745 :type lastname: Optional(str)
746 :param active: Set the user as active.
747 :type active: Optional(``True`` | ``False``)
748 :param admin: Give the new user admin rights.
749 :type admin: Optional(``True`` | ``False``)
750 :param extern_name: Set the authentication plugin name.
751 Using LDAP this is filled with LDAP UID.
752 :type extern_name: Optional(str)
753 :param extern_type: Set the new user authentication plugin.
754 :type extern_type: Optional(str)
755 :param force_password_change: Force the new user to change password
756 on next login.
757 :type force_password_change: Optional(``True`` | ``False``)
758
759 Example output:
760
761 .. code-block:: bash
762
763 id : <id_given_in_input>
764 result: {
765 "msg" : "created new user `<username>`",
766 "user": <user_obj>
767 }
768 error: null
769
770 Example error output:
771
772 .. code-block:: bash
773
774 id : <id_given_in_input>
775 result : null
776 error : {
777 "user `<username>` already exist"
778 or
779 "email `<email>` already exist"
780 or
781 "failed to create user `<username>`"
782 }
783
784
785 update_user
786 -----------
787
788 .. py:function:: update_user(apiuser, userid, username=<Optional:None>, email=<Optional:None>, password=<Optional:None>, firstname=<Optional:None>, lastname=<Optional:None>, active=<Optional:None>, admin=<Optional:None>, extern_type=<Optional:None>, extern_name=<Optional:None>)
789
790 Updates the details for the specified user, if that user exists.
791
792 This command can only be run using an |authtoken| with admin rights to
793 the specified repository.
794
795 This command takes the following options:
796
797 :param apiuser: This is filled automatically from |authtoken|.
798 :type apiuser: AuthUser
799 :param userid: Set the ``userid`` to update.
800 :type userid: str or int
801 :param username: Set the new username.
802 :type username: str or int
803 :param email: Set the new email.
804 :type email: str
805 :param password: Set the new password.
806 :type password: Optional(str)
807 :param firstname: Set the new first name.
808 :type firstname: Optional(str)
809 :param lastname: Set the new surname.
810 :type lastname: Optional(str)
811 :param active: Set the new user as active.
812 :type active: Optional(``True`` | ``False``)
813 :param admin: Give the user admin rights.
814 :type admin: Optional(``True`` | ``False``)
815 :param extern_name: Set the authentication plugin user name.
816 Using LDAP this is filled with LDAP UID.
817 :type extern_name: Optional(str)
818 :param extern_type: Set the authentication plugin type.
819 :type extern_type: Optional(str)
820
821
822 Example output:
823
824 .. code-block:: bash
825
826 id : <id_given_in_input>
827 result: {
828 "msg" : "updated user ID:<userid> <username>",
829 "user": <user_object>,
830 }
831 error: null
832
833 Example error output:
834
835 .. code-block:: bash
836
837 id : <id_given_in_input>
838 result : null
839 error : {
840 "failed to update user `<username>`"
841 }
842
843
844 delete_user
845 -----------
846
847 .. py:function:: delete_user(apiuser, userid)
848
849 Deletes the specified user from the |RCE| user database.
850
851 This command can only be run using an |authtoken| with admin rights to
852 the specified repository.
853
854 .. important::
855
856 Ensure all open pull requests and open code review
857 requests to this user are close.
858
859 Also ensure all repositories, or repository groups owned by this
860 user are reassigned before deletion.
861
862 This command takes the following options:
863
864 :param apiuser: This is filled automatically from the |authtoken|.
865 :type apiuser: AuthUser
866 :param userid: Set the user to delete.
867 :type userid: str or int
868
869 Example output:
870
871 .. code-block:: bash
872
873 id : <id_given_in_input>
874 result: {
875 "msg" : "deleted user ID:<userid> <username>",
876 "user": null
877 }
878 error: null
879
880 Example error output:
881
882 .. code-block:: bash
883
884 id : <id_given_in_input>
885 result : null
886 error : {
887 "failed to delete user ID:<userid> <username>"
888 }
889
890
891 get_user_group
892 --------------
893
894 .. py:function:: get_user_group(apiuser, usergroupid)
895
896 Returns the data of an existing user group.
897
898 This command can only be run using an |authtoken| with admin rights to
899 the specified repository.
900
901 :param apiuser: This is filled automatically from the |authtoken|.
902 :type apiuser: AuthUser
903 :param usergroupid: Set the user group from which to return data.
904 :type usergroupid: str or int
905
906 Example error output:
907
908 .. code-block:: bash
909
910 {
911 "error": null,
912 "id": <id>,
913 "result": {
914 "active": true,
915 "group_description": "group description",
916 "group_name": "group name",
917 "members": [
918 {
919 "name": "owner-name",
920 "origin": "owner",
921 "permission": "usergroup.admin",
922 "type": "user"
923 },
924 {
925 {
926 "name": "user name",
927 "origin": "permission",
928 "permission": "usergroup.admin",
929 "type": "user"
930 },
931 {
932 "name": "user group name",
933 "origin": "permission",
934 "permission": "usergroup.write",
935 "type": "user_group"
936 }
937 ],
938 "owner": "owner name",
939 "users": [],
940 "users_group_id": 2
941 }
942 }
943
944
945 get_user_groups
946 ---------------
947
948 .. py:function:: get_user_groups(apiuser)
949
950 Lists all the existing user groups within RhodeCode.
951
952 This command can only be run using an |authtoken| with admin rights to
953 the specified repository.
954
955 This command takes the following options:
956
957 :param apiuser: This is filled automatically from the |authtoken|.
958 :type apiuser: AuthUser
959
960 Example error output:
961
962 .. code-block:: bash
963
964 id : <id_given_in_input>
965 result : [<user_group_obj>,...]
966 error : null
967
968
969 create_user_group
970 -----------------
971
972 .. py:function:: create_user_group(apiuser, group_name, description=<Optional:''>, owner=<Optional:<OptionalAttr:apiuser>>, active=<Optional:True>)
973
974 Creates a new user group.
975
976 This command can only be run using an |authtoken| with admin rights to
977 the specified repository.
978
979 This command takes the following options:
980
981 :param apiuser: This is filled automatically from the |authtoken|.
982 :type apiuser: AuthUser
983 :param group_name: Set the name of the new user group.
984 :type group_name: str
985 :param description: Give a description of the new user group.
986 :type description: str
987 :param owner: Set the owner of the new user group.
988 If not set, the owner is the |authtoken| user.
989 :type owner: Optional(str or int)
990 :param active: Set this group as active.
991 :type active: Optional(``True`` | ``False``)
992
993 Example output:
994
995 .. code-block:: bash
996
997 id : <id_given_in_input>
998 result: {
999 "msg": "created new user group `<groupname>`",
1000 "user_group": <user_group_object>
1001 }
1002 error: null
1003
1004 Example error output:
1005
1006 .. code-block:: bash
1007
1008 id : <id_given_in_input>
1009 result : null
1010 error : {
1011 "user group `<group name>` already exist"
1012 or
1013 "failed to create group `<group name>`"
1014 }
1015
1016
1017 update_user_group
1018 -----------------
1019
1020 .. py:function:: update_user_group(apiuser, usergroupid, group_name=<Optional:''>, description=<Optional:''>, owner=<Optional:None>, active=<Optional:True>)
1021
1022 Updates the specified `user group` with the details provided.
1023
1024 This command can only be run using an |authtoken| with admin rights to
1025 the specified repository.
1026
1027 :param apiuser: This is filled automatically from the |authtoken|.
1028 :type apiuser: AuthUser
1029 :param usergroupid: Set the id of the `user group` to update.
1030 :type usergroupid: str or int
1031 :param group_name: Set the new name the `user group`
1032 :type group_name: str
1033 :param description: Give a description for the `user group`
1034 :type description: str
1035 :param owner: Set the owner of the `user group`.
1036 :type owner: Optional(str or int)
1037 :param active: Set the group as active.
1038 :type active: Optional(``True`` | ``False``)
1039
1040 Example output:
1041
1042 .. code-block:: bash
1043
1044 id : <id_given_in_input>
1045 result : {
1046 "msg": 'updated user group ID:<user group id> <user group name>',
1047 "user_group": <user_group_object>
1048 }
1049 error : null
1050
1051 Example error output:
1052
1053 .. code-block:: bash
1054
1055 id : <id_given_in_input>
1056 result : null
1057 error : {
1058 "failed to update user group `<user group name>`"
1059 }
1060
1061
1062 delete_user_group
1063 -----------------
1064
1065 .. py:function:: delete_user_group(apiuser, usergroupid)
1066
1067 Deletes the specified `user group`.
1068
1069 This command can only be run using an |authtoken| with admin rights to
1070 the specified repository.
1071
1072 This command takes the following options:
1073
1074 :param apiuser: filled automatically from apikey
1075 :type apiuser: AuthUser
1076 :param usergroupid:
1077 :type usergroupid: int
1078
1079 Example output:
1080
1081 .. code-block:: bash
1082
1083 id : <id_given_in_input>
1084 result : {
1085 "msg": "deleted user group ID:<user_group_id> <user_group_name>"
1086 }
1087 error : null
1088
1089 Example error output:
1090
1091 .. code-block:: bash
1092
1093 id : <id_given_in_input>
1094 result : null
1095 error : {
1096 "failed to delete user group ID:<user_group_id> <user_group_name>"
1097 or
1098 "RepoGroup assigned to <repo_groups_list>"
1099 }
1100
1101
1102 add_user_to_user_group
1103 ----------------------
1104
1105 .. py:function:: add_user_to_user_group(apiuser, usergroupid, userid)
1106
1107 Adds a user to a `user group`. If the user already exists in the group
1108 this command will return false.
1109
1110 This command can only be run using an |authtoken| with admin rights to
1111 the specified user group.
1112
1113 This command takes the following options:
1114
1115 :param apiuser: This is filled automatically from the |authtoken|.
1116 :type apiuser: AuthUser
1117 :param usergroupid: Set the name of the `user group` to which a
1118 user will be added.
1119 :type usergroupid: int
1120 :param userid: Set the `user_id` of the user to add to the group.
1121 :type userid: int
1122
1123 Example output:
1124
1125 .. code-block:: bash
1126
1127 id : <id_given_in_input>
1128 result : {
1129 "success": True|False # depends on if member is in group
1130 "msg": "added member `<username>` to user group `<groupname>` |
1131 User is already in that group"
1132
1133 }
1134 error : null
1135
1136 Example error output:
1137
1138 .. code-block:: bash
1139
1140 id : <id_given_in_input>
1141 result : null
1142 error : {
1143 "failed to add member to user group `<user_group_name>`"
1144 }
1145
1146
1147 remove_user_from_user_group
1148 ---------------------------
1149
1150 .. py:function:: remove_user_from_user_group(apiuser, usergroupid, userid)
1151
1152 Removes a user from a user group.
1153
1154 * If the specified user is not in the group, this command will return
1155 `false`.
1156
1157 This command can only be run using an |authtoken| with admin rights to
1158 the specified user group.
1159
1160 :param apiuser: This is filled automatically from the |authtoken|.
1161 :type apiuser: AuthUser
1162 :param usergroupid: Sets the user group name.
1163 :type usergroupid: str or int
1164 :param userid: The user you wish to remove from |RCE|.
1165 :type userid: str or int
1166
1167 Example output:
1168
1169 .. code-block:: bash
1170
1171 id : <id_given_in_input>
1172 result: {
1173 "success": True|False, # depends on if member is in group
1174 "msg": "removed member <username> from user group <groupname> |
1175 User wasn't in group"
1176 }
1177 error: null
1178
1179
1180 grant_user_permission_to_user_group
1181 -----------------------------------
1182
1183 .. py:function:: grant_user_permission_to_user_group(apiuser, usergroupid, userid, perm)
1184
1185 Set permissions for a user in a user group.
1186
1187 :param apiuser: This is filled automatically from the |authtoken|.
1188 :type apiuser: AuthUser
1189 :param usergroupid: Set the user group to edit permissions on.
1190 :type usergroupid: str or int
1191 :param userid: Set the user from whom you wish to set permissions.
1192 :type userid: str
1193 :param perm: (usergroup.(none|read|write|admin))
1194 :type perm: str
1195
1196 Example output:
1197
1198 .. code-block:: bash
1199
1200 id : <id_given_in_input>
1201 result : {
1202 "msg": "Granted perm: `<perm_name>` for user: `<username>` in user group: `<user_group_name>`",
1203 "success": true
1204 }
1205 error : null
1206
1207
1208 revoke_user_permission_from_user_group
1209 --------------------------------------
1210
1211 .. py:function:: revoke_user_permission_from_user_group(apiuser, usergroupid, userid)
1212
1213 Revoke a users permissions in a user group.
1214
1215 :param apiuser: This is filled automatically from the |authtoken|.
1216 :type apiuser: AuthUser
1217 :param usergroupid: Set the user group from which to revoke the user
1218 permissions.
1219 :type: usergroupid: str or int
1220 :param userid: Set the userid of the user whose permissions will be
1221 revoked.
1222 :type userid: str
1223
1224 Example output:
1225
1226 .. code-block:: bash
1227
1228 id : <id_given_in_input>
1229 result : {
1230 "msg": "Revoked perm for user: `<username>` in user group: `<user_group_name>`",
1231 "success": true
1232 }
1233 error : null
1234
1235
1236 grant_user_group_permission_to_user_group
1237 -----------------------------------------
1238
1239 .. py:function:: grant_user_group_permission_to_user_group(apiuser, usergroupid, sourceusergroupid, perm)
1240
1241 Give one user group permissions to another user group.
1242
1243 :param apiuser: This is filled automatically from the |authtoken|.
1244 :type apiuser: AuthUser
1245 :param usergroupid: Set the user group on which to edit permissions.
1246 :type usergroupid: str or int
1247 :param sourceusergroupid: Set the source user group to which
1248 access/permissions will be granted.
1249 :type sourceusergroupid: str or int
1250 :param perm: (usergroup.(none|read|write|admin))
1251 :type perm: str
1252
1253 Example output:
1254
1255 .. code-block:: bash
1256
1257 id : <id_given_in_input>
1258 result : {
1259 "msg": "Granted perm: `<perm_name>` for user group: `<source_user_group_name>` in user group: `<user_group_name>`",
1260 "success": true
1261 }
1262 error : null
1263
1264
1265 revoke_user_group_permission_from_user_group
1266 --------------------------------------------
1267
1268 .. py:function:: revoke_user_group_permission_from_user_group(apiuser, usergroupid, sourceusergroupid)
1269
1270 Revoke the permissions that one user group has to another.
1271
1272 :param apiuser: This is filled automatically from the |authtoken|.
1273 :type apiuser: AuthUser
1274 :param usergroupid: Set the user group on which to edit permissions.
1275 :type usergroupid: str or int
1276 :param sourceusergroupid: Set the user group from which permissions
1277 are revoked.
1278 :type sourceusergroupid: str or int
1279
1280 Example output:
1281
1282 .. code-block:: bash
1283
1284 id : <id_given_in_input>
1285 result : {
1286 "msg": "Revoked perm for user group: `<user_group_name>` in user group: `<target_user_group_name>`",
1287 "success": true
1288 }
1289 error : null
1290
1291
1292 get_pull_request
1293 ----------------
1294
1295 .. py:function:: get_pull_request(apiuser, repoid, pullrequestid)
1296
1297 Get a pull request based on the given ID.
1298
1299 :param apiuser: This is filled automatically from the |authtoken|.
1300 :type apiuser: AuthUser
1301 :param repoid: Repository name or repository ID from where the pull
1302 request was opened.
1303 :type repoid: str or int
1304 :param pullrequestid: ID of the requested pull request.
1305 :type pullrequestid: int
1306
1307 Example output:
1308
1309 .. code-block:: bash
1310
1311 "id": <id_given_in_input>,
1312 "result":
1313 {
1314 "pull_request_id": "<pull_request_id>",
1315 "url": "<url>",
1316 "title": "<title>",
1317 "description": "<description>",
1318 "status" : "<status>",
1319 "created_on": "<date_time_created>",
1320 "updated_on": "<date_time_updated>",
1321 "commit_ids": [
1322 ...
1323 "<commit_id>",
1324 "<commit_id>",
1325 ...
1326 ],
1327 "review_status": "<review_status>",
1328 "mergeable": {
1329 "status": "<bool>",
1330 "message": "<message>",
1331 },
1332 "source": {
1333 "clone_url": "<clone_url>",
1334 "repository": "<repository_name>",
1335 "reference":
1336 {
1337 "name": "<name>",
1338 "type": "<type>",
1339 "commit_id": "<commit_id>",
1340 }
1341 },
1342 "target": {
1343 "clone_url": "<clone_url>",
1344 "repository": "<repository_name>",
1345 "reference":
1346 {
1347 "name": "<name>",
1348 "type": "<type>",
1349 "commit_id": "<commit_id>",
1350 }
1351 },
1352 "author": <user_obj>,
1353 "reviewers": [
1354 ...
1355 {
1356 "user": "<user_obj>",
1357 "review_status": "<review_status>",
1358 }
1359 ...
1360 ]
1361 },
1362 "error": null
1363
1364
1365 get_pull_requests
1366 -----------------
1367
1368 .. py:function:: get_pull_requests(apiuser, repoid, status=<Optional:'new'>)
1369
1370 Get all pull requests from the repository specified in `repoid`.
1371
1372 :param apiuser: This is filled automatically from the |authtoken|.
1373 :type apiuser: AuthUser
1374 :param repoid: Repository name or repository ID.
1375 :type repoid: str or int
1376 :param status: Only return pull requests with the specified status.
1377 Valid options are.
1378 * ``new`` (default)
1379 * ``open``
1380 * ``closed``
1381 :type status: str
1382
1383 Example output:
1384
1385 .. code-block:: bash
1386
1387 "id": <id_given_in_input>,
1388 "result":
1389 [
1390 ...
1391 {
1392 "pull_request_id": "<pull_request_id>",
1393 "url": "<url>",
1394 "title" : "<title>",
1395 "description": "<description>",
1396 "status": "<status>",
1397 "created_on": "<date_time_created>",
1398 "updated_on": "<date_time_updated>",
1399 "commit_ids": [
1400 ...
1401 "<commit_id>",
1402 "<commit_id>",
1403 ...
1404 ],
1405 "review_status": "<review_status>",
1406 "mergeable": {
1407 "status": "<bool>",
1408 "message: "<message>",
1409 },
1410 "source": {
1411 "clone_url": "<clone_url>",
1412 "reference":
1413 {
1414 "name": "<name>",
1415 "type": "<type>",
1416 "commit_id": "<commit_id>",
1417 }
1418 },
1419 "target": {
1420 "clone_url": "<clone_url>",
1421 "reference":
1422 {
1423 "name": "<name>",
1424 "type": "<type>",
1425 "commit_id": "<commit_id>",
1426 }
1427 },
1428 "author": <user_obj>,
1429 "reviewers": [
1430 ...
1431 {
1432 "user": "<user_obj>",
1433 "review_status": "<review_status>",
1434 }
1435 ...
1436 ]
1437 }
1438 ...
1439 ],
1440 "error": null
1441
1442
1443 merge_pull_request
1444 ------------------
1445
1446 .. py:function:: merge_pull_request(apiuser, repoid, pullrequestid, userid=<Optional:<OptionalAttr:apiuser>>)
1447
1448 Merge the pull request specified by `pullrequestid` into its target
1449 repository.
1450
1451 :param apiuser: This is filled automatically from the |authtoken|.
1452 :type apiuser: AuthUser
1453 :param repoid: The Repository name or repository ID of the
1454 target repository to which the |pr| is to be merged.
1455 :type repoid: str or int
1456 :param pullrequestid: ID of the pull request which shall be merged.
1457 :type pullrequestid: int
1458 :param userid: Merge the pull request as this user.
1459 :type userid: Optional(str or int)
1460
1461 Example output:
1462
1463 .. code-block:: bash
1464
1465 "id": <id_given_in_input>,
1466 "result":
1467 {
1468 "executed": "<bool>",
1469 "failure_reason": "<int>",
1470 "merge_commit_id": "<merge_commit_id>",
1471 "possible": "<bool>"
1472 },
1473 "error": null
1474
1475
1476 close_pull_request
1477 ------------------
1478
1479 .. py:function:: close_pull_request(apiuser, repoid, pullrequestid, userid=<Optional:<OptionalAttr:apiuser>>)
1480
1481 Close the pull request specified by `pullrequestid`.
1482
1483 :param apiuser: This is filled automatically from the |authtoken|.
1484 :type apiuser: AuthUser
1485 :param repoid: Repository name or repository ID to which the pull
1486 request belongs.
1487 :type repoid: str or int
1488 :param pullrequestid: ID of the pull request to be closed.
1489 :type pullrequestid: int
1490 :param userid: Close the pull request as this user.
1491 :type userid: Optional(str or int)
1492
1493 Example output:
1494
1495 .. code-block:: bash
1496
1497 "id": <id_given_in_input>,
1498 "result":
1499 {
1500 "pull_request_id": "<int>",
1501 "closed": "<bool>"
1502 },
1503 "error": null
1504
1505
1506 comment_pull_request
1507 --------------------
1508
1509 .. py:function:: comment_pull_request(apiuser, repoid, pullrequestid, message=<Optional:None>, status=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
1510
198
1511 Comment on the pull request specified with the `pullrequestid`,
199 methods/license-methods
1512 in the |repo| specified by the `repoid`, and optionally change the
200 methods/deprecated-methods
1513 review status.
201 methods/gist-methods
1514
202 methods/pull-request-methods
1515 :param apiuser: This is filled automatically from the |authtoken|.
203 methods/repo-methods
1516 :type apiuser: AuthUser
204 methods/repo-group-methods
1517 :param repoid: The repository name or repository ID.
205 methods/server-methods
1518 :type repoid: str or int
206 methods/user-methods
1519 :param pullrequestid: The pull request ID.
207 methods/user-group-methods
1520 :type pullrequestid: int
1521 :param message: The text content of the comment.
1522 :type message: str
1523 :param status: (**Optional**) Set the approval status of the pull
1524 request. Valid options are:
1525 * not_reviewed
1526 * approved
1527 * rejected
1528 * under_review
1529 :type status: str
1530 :param userid: Comment on the pull request as this user
1531 :type userid: Optional(str or int)
1532
1533 Example output:
1534
1535 .. code-block:: bash
1536
1537 id : <id_given_in_input>
1538 result :
1539 {
1540 "pull_request_id": "<Integer>",
1541 "comment_id": "<Integer>"
1542 }
1543 error : null
1544
1545
1546 create_pull_request
1547 -------------------
1548
1549 .. py:function:: create_pull_request(apiuser, source_repo, target_repo, source_ref, target_ref, title, description=<Optional:''>, reviewers=<Optional:None>)
1550
1551 Creates a new pull request.
1552
1553 Accepts refs in the following formats:
1554
1555 * branch:<branch_name>:<sha>
1556 * branch:<branch_name>
1557 * bookmark:<bookmark_name>:<sha> (Mercurial only)
1558 * bookmark:<bookmark_name> (Mercurial only)
1559
1560 :param apiuser: This is filled automatically from the |authtoken|.
1561 :type apiuser: AuthUser
1562 :param source_repo: Set the source repository name.
1563 :type source_repo: str
1564 :param target_repo: Set the target repository name.
1565 :type target_repo: str
1566 :param source_ref: Set the source ref name.
1567 :type source_ref: str
1568 :param target_ref: Set the target ref name.
1569 :type target_ref: str
1570 :param title: Set the pull request title.
1571 :type title: str
1572 :param description: Set the pull request description.
1573 :type description: Optional(str)
1574 :param reviewers: Set the new pull request reviewers list.
1575 :type reviewers: Optional(list)
1576
1577
1578 update_pull_request
1579 -------------------
1580
1581 .. py:function:: update_pull_request(apiuser, repoid, pullrequestid, title=<Optional:''>, description=<Optional:''>, reviewers=<Optional:None>, update_commits=<Optional:None>, close_pull_request=<Optional:None>)
1582
1583 Updates a pull request.
1584
1585 :param apiuser: This is filled automatically from the |authtoken|.
1586 :type apiuser: AuthUser
1587 :param repoid: The repository name or repository ID.
1588 :type repoid: str or int
1589 :param pullrequestid: The pull request ID.
1590 :type pullrequestid: int
1591 :param title: Set the pull request title.
1592 :type title: str
1593 :param description: Update pull request description.
1594 :type description: Optional(str)
1595 :param reviewers: Update pull request reviewers list with new value.
1596 :type reviewers: Optional(list)
1597 :param update_commits: Trigger update of commits for this pull request
1598 :type: update_commits: Optional(bool)
1599 :param close_pull_request: Close this pull request with rejected state
1600 :type: close_pull_request: Optional(bool)
1601
1602 Example output:
1603
1604 .. code-block:: bash
1605
1606 id : <id_given_in_input>
1607 result :
1608 {
1609 "msg": "Updated pull request `63`",
1610 "pull_request": <pull_request_object>,
1611 "updated_reviewers": {
1612 "added": [
1613 "username"
1614 ],
1615 "removed": []
1616 },
1617 "updated_commits": {
1618 "added": [
1619 "<sha1_hash>"
1620 ],
1621 "common": [
1622 "<sha1_hash>",
1623 "<sha1_hash>",
1624 ],
1625 "removed": []
1626 }
1627 }
1628 error : null
1629
1630
1631 get_repo
1632 --------
1633
1634 .. py:function:: get_repo(apiuser, repoid, cache=<Optional:True>)
1635
1636 Gets an existing repository by its name or repository_id.
1637
1638 The members section so the output returns users groups or users
1639 associated with that repository.
1640
1641 This command can only be run using an |authtoken| with admin rights,
1642 or users with at least read rights to the |repo|.
1643
1644 :param apiuser: This is filled automatically from the |authtoken|.
1645 :type apiuser: AuthUser
1646 :param repoid: The repository name or repository id.
1647 :type repoid: str or int
1648 :param cache: use the cached value for last changeset
1649 :type: cache: Optional(bool)
1650
1651 Example output:
1652
1653 .. code-block:: bash
1654
1655 {
1656 "error": null,
1657 "id": <repo_id>,
1658 "result": {
1659 "clone_uri": null,
1660 "created_on": "timestamp",
1661 "description": "repo description",
1662 "enable_downloads": false,
1663 "enable_locking": false,
1664 "enable_statistics": false,
1665 "followers": [
1666 {
1667 "active": true,
1668 "admin": false,
1669 "api_key": "****************************************",
1670 "api_keys": [
1671 "****************************************"
1672 ],
1673 "email": "user@example.com",
1674 "emails": [
1675 "user@example.com"
1676 ],
1677 "extern_name": "rhodecode",
1678 "extern_type": "rhodecode",
1679 "firstname": "username",
1680 "ip_addresses": [],
1681 "language": null,
1682 "last_login": "2015-09-16T17:16:35.854",
1683 "lastname": "surname",
1684 "user_id": <user_id>,
1685 "username": "name"
1686 }
1687 ],
1688 "fork_of": "parent-repo",
1689 "landing_rev": [
1690 "rev",
1691 "tip"
1692 ],
1693 "last_changeset": {
1694 "author": "User <user@example.com>",
1695 "branch": "default",
1696 "date": "timestamp",
1697 "message": "last commit message",
1698 "parents": [
1699 {
1700 "raw_id": "commit-id"
1701 }
1702 ],
1703 "raw_id": "commit-id",
1704 "revision": <revision number>,
1705 "short_id": "short id"
1706 },
1707 "lock_reason": null,
1708 "locked_by": null,
1709 "locked_date": null,
1710 "members": [
1711 {
1712 "name": "super-admin-name",
1713 "origin": "super-admin",
1714 "permission": "repository.admin",
1715 "type": "user"
1716 },
1717 {
1718 "name": "owner-name",
1719 "origin": "owner",
1720 "permission": "repository.admin",
1721 "type": "user"
1722 },
1723 {
1724 "name": "user-group-name",
1725 "origin": "permission",
1726 "permission": "repository.write",
1727 "type": "user_group"
1728 }
1729 ],
1730 "owner": "owner-name",
1731 "permissions": [
1732 {
1733 "name": "super-admin-name",
1734 "origin": "super-admin",
1735 "permission": "repository.admin",
1736 "type": "user"
1737 },
1738 {
1739 "name": "owner-name",
1740 "origin": "owner",
1741 "permission": "repository.admin",
1742 "type": "user"
1743 },
1744 {
1745 "name": "user-group-name",
1746 "origin": "permission",
1747 "permission": "repository.write",
1748 "type": "user_group"
1749 }
1750 ],
1751 "private": true,
1752 "repo_id": 676,
1753 "repo_name": "user-group/repo-name",
1754 "repo_type": "hg"
1755 }
1756 }
1757
1758
1759 get_repos
1760 ---------
1761
1762 .. py:function:: get_repos(apiuser)
1763
1764 Lists all existing repositories.
1765
1766 This command can only be run using an |authtoken| with admin rights,
1767 or users with at least read rights to |repos|.
1768
1769 :param apiuser: This is filled automatically from the |authtoken|.
1770 :type apiuser: AuthUser
1771
1772 Example output:
1773
1774 .. code-block:: bash
1775
1776 id : <id_given_in_input>
1777 result: [
1778 {
1779 "repo_id" : "<repo_id>",
1780 "repo_name" : "<reponame>"
1781 "repo_type" : "<repo_type>",
1782 "clone_uri" : "<clone_uri>",
1783 "private": : "<bool>",
1784 "created_on" : "<datetimecreated>",
1785 "description" : "<description>",
1786 "landing_rev": "<landing_rev>",
1787 "owner": "<repo_owner>",
1788 "fork_of": "<name_of_fork_parent>",
1789 "enable_downloads": "<bool>",
1790 "enable_locking": "<bool>",
1791 "enable_statistics": "<bool>",
1792 },
1793 ...
1794 ]
1795 error: null
1796
1797
1798 get_repo_changeset
1799 ------------------
1800
1801 .. py:function:: get_repo_changeset(apiuser, repoid, revision, details=<Optional:'basic'>)
1802
1803 Returns information about a changeset.
1804
1805 Additionally parameters define the amount of details returned by
1806 this function.
1807
1808 This command can only be run using an |authtoken| with admin rights,
1809 or users with at least read rights to the |repo|.
1810
1811 :param apiuser: This is filled automatically from the |authtoken|.
1812 :type apiuser: AuthUser
1813 :param repoid: The repository name or repository id
1814 :type repoid: str or int
1815 :param revision: revision for which listing should be done
1816 :type revision: str
1817 :param details: details can be 'basic|extended|full' full gives diff
1818 info details like the diff itself, and number of changed files etc.
1819 :type details: Optional(str)
1820
1821
1822 get_repo_changesets
1823 -------------------
1824
1825 .. py:function:: get_repo_changesets(apiuser, repoid, start_rev, limit, details=<Optional:'basic'>)
1826
1827 Returns a set of changesets limited by the number of commits starting
1828 from the `start_rev` option.
1829
1830 Additional parameters define the amount of details returned by this
1831 function.
1832
1833 This command can only be run using an |authtoken| with admin rights,
1834 or users with at least read rights to |repos|.
1835
1836 :param apiuser: This is filled automatically from the |authtoken|.
1837 :type apiuser: AuthUser
1838 :param repoid: The repository name or repository ID.
1839 :type repoid: str or int
1840 :param start_rev: The starting revision from where to get changesets.
1841 :type start_rev: str
1842 :param limit: Limit the number of changesets to this amount
1843 :type limit: str or int
1844 :param details: Set the level of detail returned. Valid option are:
1845 ``basic``, ``extended`` and ``full``.
1846 :type details: Optional(str)
1847
1848 .. note::
1849
1850 Setting the parameter `details` to the value ``full`` is extensive
1851 and returns details like the diff itself, and the number
1852 of changed files.
1853
1854
1855 get_repo_nodes
1856 --------------
1857
1858 .. py:function:: get_repo_nodes(apiuser, repoid, revision, root_path, ret_type=<Optional:'all'>, details=<Optional:'basic'>)
1859
1860 Returns a list of nodes and children in a flat list for a given
1861 path at given revision.
1862
1863 It's possible to specify ret_type to show only `files` or `dirs`.
1864
1865 This command can only be run using an |authtoken| with admin rights,
1866 or users with at least read rights to |repos|.
1867
1868 :param apiuser: This is filled automatically from the |authtoken|.
1869 :type apiuser: AuthUser
1870 :param repoid: The repository name or repository ID.
1871 :type repoid: str or int
1872 :param revision: The revision for which listing should be done.
1873 :type revision: str
1874 :param root_path: The path from which to start displaying.
1875 :type root_path: str
1876 :param ret_type: Set the return type. Valid options are
1877 ``all`` (default), ``files`` and ``dirs``.
1878 :type ret_type: Optional(str)
1879 :param details: Returns extended information about nodes, such as
1880 md5, binary, and or content. The valid options are ``basic`` and
1881 ``full``.
1882 :type details: Optional(str)
1883
1884 Example output:
1885
1886 .. code-block:: bash
1887
1888 id : <id_given_in_input>
1889 result: [
1890 {
1891 "name" : "<name>"
1892 "type" : "<type>",
1893 "binary": "<true|false>" (only in extended mode)
1894 "md5" : "<md5 of file content>" (only in extended mode)
1895 },
1896 ...
1897 ]
1898 error: null
1899
1900
1901 create_repo
1902 -----------
1903
1904 .. py:function:: create_repo(apiuser, repo_name, repo_type, owner=<Optional:<OptionalAttr:apiuser>>, description=<Optional:''>, private=<Optional:False>, clone_uri=<Optional:None>, landing_rev=<Optional:'rev:tip'>, enable_statistics=<Optional:False>, enable_locking=<Optional:False>, enable_downloads=<Optional:False>, copy_permissions=<Optional:False>)
1905
1906 Creates a repository.
1907
1908 * If the repository name contains "/", all the required repository
1909 groups will be created.
1910
1911 For example "foo/bar/baz" will create |repo| groups "foo" and "bar"
1912 (with "foo" as parent). It will also create the "baz" repository
1913 with "bar" as |repo| group.
1914
1915 This command can only be run using an |authtoken| with at least
1916 write permissions to the |repo|.
1917
1918 :param apiuser: This is filled automatically from the |authtoken|.
1919 :type apiuser: AuthUser
1920 :param repo_name: Set the repository name.
1921 :type repo_name: str
1922 :param repo_type: Set the repository type; 'hg','git', or 'svn'.
1923 :type repo_type: str
1924 :param owner: user_id or username
1925 :type owner: Optional(str)
1926 :param description: Set the repository description.
1927 :type description: Optional(str)
1928 :param private:
1929 :type private: bool
1930 :param clone_uri:
1931 :type clone_uri: str
1932 :param landing_rev: <rev_type>:<rev>
1933 :type landing_rev: str
1934 :param enable_locking:
1935 :type enable_locking: bool
1936 :param enable_downloads:
1937 :type enable_downloads: bool
1938 :param enable_statistics:
1939 :type enable_statistics: bool
1940 :param copy_permissions: Copy permission from group in which the
1941 repository is being created.
1942 :type copy_permissions: bool
1943
1944
1945 Example output:
1946
1947 .. code-block:: bash
1948
1949 id : <id_given_in_input>
1950 result: {
1951 "msg": "Created new repository `<reponame>`",
1952 "success": true,
1953 "task": "<celery task id or None if done sync>"
1954 }
1955 error: null
1956
1957
1958 Example error output:
1959
1960 .. code-block:: bash
1961
1962 id : <id_given_in_input>
1963 result : null
1964 error : {
1965 'failed to create repository `<repo_name>`
1966 }
1967
1968
1969 add_field_to_repo
1970 -----------------
1971
1972 .. py:function:: add_field_to_repo(apiuser, repoid, key, label=<Optional:''>, description=<Optional:''>)
1973
1974 Adds an extra field to a repository.
1975
1976 This command can only be run using an |authtoken| with at least
1977 write permissions to the |repo|.
1978
1979 :param apiuser: This is filled automatically from the |authtoken|.
1980 :type apiuser: AuthUser
1981 :param repoid: Set the repository name or repository id.
1982 :type repoid: str or int
1983 :param key: Create a unique field key for this repository.
1984 :type key: str
1985 :param label:
1986 :type label: Optional(str)
1987 :param description:
1988 :type description: Optional(str)
1989
1990
1991 remove_field_from_repo
1992 ----------------------
1993
1994 .. py:function:: remove_field_from_repo(apiuser, repoid, key)
1995
1996 Removes an extra field from a repository.
1997
1998 This command can only be run using an |authtoken| with at least
1999 write permissions to the |repo|.
2000
2001 :param apiuser: This is filled automatically from the |authtoken|.
2002 :type apiuser: AuthUser
2003 :param repoid: Set the repository name or repository ID.
2004 :type repoid: str or int
2005 :param key: Set the unique field key for this repository.
2006 :type key: str
2007
2008
2009 update_repo
2010 -----------
2011
2012 .. py:function:: update_repo(apiuser, repoid, name=<Optional:None>, owner=<Optional:<OptionalAttr:apiuser>>, group=<Optional:None>, fork_of=<Optional:None>, description=<Optional:''>, private=<Optional:False>, clone_uri=<Optional:None>, landing_rev=<Optional:'rev:tip'>, enable_statistics=<Optional:False>, enable_locking=<Optional:False>, enable_downloads=<Optional:False>, fields=<Optional:''>)
2013
2014 Updates a repository with the given information.
2015
2016 This command can only be run using an |authtoken| with at least
2017 write permissions to the |repo|.
2018
2019 :param apiuser: This is filled automatically from the |authtoken|.
2020 :type apiuser: AuthUser
2021 :param repoid: repository name or repository ID.
2022 :type repoid: str or int
2023 :param name: Update the |repo| name.
2024 :type name: str
2025 :param owner: Set the |repo| owner.
2026 :type owner: str
2027 :param group: Set the |repo| group the |repo| belongs to.
2028 :type group: str
2029 :param fork_of: Set the master |repo| name.
2030 :type fork_of: str
2031 :param description: Update the |repo| description.
2032 :type description: str
2033 :param private: Set the |repo| as private. (True | False)
2034 :type private: bool
2035 :param clone_uri: Update the |repo| clone URI.
2036 :type clone_uri: str
2037 :param landing_rev: Set the |repo| landing revision. Default is
2038 ``tip``.
2039 :type landing_rev: str
2040 :param enable_statistics: Enable statistics on the |repo|,
2041 (True | False).
2042 :type enable_statistics: bool
2043 :param enable_locking: Enable |repo| locking.
2044 :type enable_locking: bool
2045 :param enable_downloads: Enable downloads from the |repo|,
2046 (True | False).
2047 :type enable_downloads: bool
2048 :param fields: Add extra fields to the |repo|. Use the following
2049 example format: ``field_key=field_val,field_key2=fieldval2``.
2050 Escape ', ' with \,
2051 :type fields: str
2052
2053
2054 fork_repo
2055 ---------
2056
2057 .. py:function:: fork_repo(apiuser, repoid, fork_name, owner=<Optional:<OptionalAttr:apiuser>>, description=<Optional:''>, copy_permissions=<Optional:False>, private=<Optional:False>, landing_rev=<Optional:'rev:tip'>)
2058
2059 Creates a fork of the specified |repo|.
2060
2061 * If using |RCE| with Celery this will immediately return a success
2062 message, even though the fork will be created asynchronously.
2063
2064 This command can only be run using an |authtoken| with fork
2065 permissions on the |repo|.
2066
2067 :param apiuser: This is filled automatically from the |authtoken|.
2068 :type apiuser: AuthUser
2069 :param repoid: Set repository name or repository ID.
2070 :type repoid: str or int
2071 :param fork_name: Set the fork name.
2072 :type fork_name: str
2073 :param owner: Set the fork owner.
2074 :type owner: str
2075 :param description: Set the fork descripton.
2076 :type description: str
2077 :param copy_permissions: Copy permissions from parent |repo|. The
2078 default is False.
2079 :type copy_permissions: bool
2080 :param private: Make the fork private. The default is False.
2081 :type private: bool
2082 :param landing_rev: Set the landing revision. The default is tip.
2083
2084 Example output:
2085
2086 .. code-block:: bash
2087
2088 id : <id_for_response>
2089 api_key : "<api_key>"
2090 args: {
2091 "repoid" : "<reponame or repo_id>",
2092 "fork_name": "<forkname>",
2093 "owner": "<username or user_id = Optional(=apiuser)>",
2094 "description": "<description>",
2095 "copy_permissions": "<bool>",
2096 "private": "<bool>",
2097 "landing_rev": "<landing_rev>"
2098 }
2099
2100 Example error output:
2101
2102 .. code-block:: bash
2103
2104 id : <id_given_in_input>
2105 result: {
2106 "msg": "Created fork of `<reponame>` as `<forkname>`",
2107 "success": true,
2108 "task": "<celery task id or None if done sync>"
2109 }
2110 error: null
2111
2112
2113 delete_repo
2114 -----------
2115
2116 .. py:function:: delete_repo(apiuser, repoid, forks=<Optional:''>)
2117
2118 Deletes a repository.
2119
2120 * When the `forks` parameter is set it's possible to detach or delete
2121 forks of deleted repository.
2122
2123 This command can only be run using an |authtoken| with admin
2124 permissions on the |repo|.
2125
2126 :param apiuser: This is filled automatically from the |authtoken|.
2127 :type apiuser: AuthUser
2128 :param repoid: Set the repository name or repository ID.
2129 :type repoid: str or int
2130 :param forks: Set to `detach` or `delete` forks from the |repo|.
2131 :type forks: Optional(str)
2132
2133 Example error output:
2134
2135 .. code-block:: bash
2136
2137 id : <id_given_in_input>
2138 result: {
2139 "msg": "Deleted repository `<reponame>`",
2140 "success": true
2141 }
2142 error: null
2143
2144
2145 comment_commit
2146 --------------
2147
2148 .. py:function:: comment_commit(apiuser, repoid, commit_id, message, userid=<Optional:<OptionalAttr:apiuser>>, status=<Optional:None>)
2149
2150 Set a commit comment, and optionally change the status of the commit.
2151 This command can be executed only using api_key belonging to user
2152 with admin rights, or repository administrator.
2153
2154 :param apiuser: This is filled automatically from the |authtoken|.
2155 :type apiuser: AuthUser
2156 :param repoid: Set the repository name or repository ID.
2157 :type repoid: str or int
2158 :param commit_id: Specify the commit_id for which to set a comment.
2159 :type commit_id: str
2160 :param message: The comment text.
2161 :type message: str
2162 :param userid: Set the user name of the comment creator.
2163 :type userid: Optional(str or int)
2164 :param status: status, one of 'not_reviewed', 'approved', 'rejected',
2165 'under_review'
2166 :type status: str
2167
2168 Example error output:
2169
2170 .. code-block:: json
2171
2172 {
2173 "id" : <id_given_in_input>,
2174 "result" : {
2175 "msg": "Commented on commit `<commit_id>` for repository `<repoid>`",
2176 "status_change": null or <status>,
2177 "success": true
2178 },
2179 "error" : null
2180 }
2181
2182
2183 changeset_comment
2184 -----------------
2185
2186 .. py:function:: changeset_comment(apiuser, repoid, revision, message, userid=<Optional:<OptionalAttr:apiuser>>, status=<Optional:None>)
2187
2188 .. deprecated:: 3.4.0
2189
2190 Please use method `comment_commit` instead.
2191
2192
2193 Set a changeset comment, and optionally change the status of the
2194 changeset.
2195
2196 This command can only be run using an |authtoken| with admin
2197 permissions on the |repo|.
2198
2199 :param apiuser: This is filled automatically from the |authtoken|.
2200 :type apiuser: AuthUser
2201 :param repoid: Set the repository name or repository ID.
2202 :type repoid: str or int
2203 :param revision: Specify the revision for which to set a comment.
2204 :type revision: str
2205 :param message: The comment text.
2206 :type message: str
2207 :param userid: Set the user name of the comment creator.
2208 :type userid: Optional(str or int)
2209 :param status: Set the comment status. The following are valid options:
2210 * not_reviewed
2211 * approved
2212 * rejected
2213 * under_review
2214 :type status: str
2215
2216 Example error output:
2217
2218 .. code-block:: json
2219
2220 {
2221 "id" : <id_given_in_input>,
2222 "result" : {
2223 "msg": "Commented on commit `<revision>` for repository `<repoid>`",
2224 "status_change": null or <status>,
2225 "success": true
2226 },
2227 "error" : null
2228 }
2229
2230
2231 grant_user_permission
2232 ---------------------
2233
2234 .. py:function:: grant_user_permission(apiuser, repoid, userid, perm)
2235
2236 Grant permissions for the specified user on the given repository,
2237 or update existing permissions if found.
2238
2239 This command can only be run using an |authtoken| with admin
2240 permissions on the |repo|.
2241
2242 :param apiuser: This is filled automatically from the |authtoken|.
2243 :type apiuser: AuthUser
2244 :param repoid: Set the repository name or repository ID.
2245 :type repoid: str or int
2246 :param userid: Set the user name.
2247 :type userid: str
2248 :param perm: Set the user permissions, using the following format
2249 ``(repository.(none|read|write|admin))``
2250 :type perm: str
2251
2252 Example output:
2253
2254 .. code-block:: bash
2255
2256 id : <id_given_in_input>
2257 result: {
2258 "msg" : "Granted perm: `<perm>` for user: `<username>` in repo: `<reponame>`",
2259 "success": true
2260 }
2261 error: null
2262
2263
2264 revoke_user_permission
2265 ----------------------
2266
2267 .. py:function:: revoke_user_permission(apiuser, repoid, userid)
2268
2269 Revoke permission for a user on the specified repository.
2270
2271 This command can only be run using an |authtoken| with admin
2272 permissions on the |repo|.
2273
2274 :param apiuser: This is filled automatically from the |authtoken|.
2275 :type apiuser: AuthUser
2276 :param repoid: Set the repository name or repository ID.
2277 :type repoid: str or int
2278 :param userid: Set the user name of revoked user.
2279 :type userid: str or int
2280
2281 Example error output:
2282
2283 .. code-block:: bash
2284
2285 id : <id_given_in_input>
2286 result: {
2287 "msg" : "Revoked perm for user: `<username>` in repo: `<reponame>`",
2288 "success": true
2289 }
2290 error: null
2291
2292
2293 grant_user_group_permission
2294 ---------------------------
2295
2296 .. py:function:: grant_user_group_permission(apiuser, repoid, usergroupid, perm)
2297
2298 Grant permission for a user group on the specified repository,
2299 or update existing permissions.
2300
2301 This command can only be run using an |authtoken| with admin
2302 permissions on the |repo|.
2303
2304 :param apiuser: This is filled automatically from the |authtoken|.
2305 :type apiuser: AuthUser
2306 :param repoid: Set the repository name or repository ID.
2307 :type repoid: str or int
2308 :param usergroupid: Specify the ID of the user group.
2309 :type usergroupid: str or int
2310 :param perm: Set the user group permissions using the following
2311 format: (repository.(none|read|write|admin))
2312 :type perm: str
2313
2314 Example output:
2315
2316 .. code-block:: bash
2317
2318 id : <id_given_in_input>
2319 result : {
2320 "msg" : "Granted perm: `<perm>` for group: `<usersgroupname>` in repo: `<reponame>`",
2321 "success": true
2322
2323 }
2324 error : null
2325
2326 Example error output:
2327
2328 .. code-block:: bash
2329
2330 id : <id_given_in_input>
2331 result : null
2332 error : {
2333 "failed to edit permission for user group: `<usergroup>` in repo `<repo>`'
2334 }
2335
2336
2337 revoke_user_group_permission
2338 ----------------------------
2339
2340 .. py:function:: revoke_user_group_permission(apiuser, repoid, usergroupid)
2341
2342 Revoke the permissions of a user group on a given repository.
2343
2344 This command can only be run using an |authtoken| with admin
2345 permissions on the |repo|.
2346
2347 :param apiuser: This is filled automatically from the |authtoken|.
2348 :type apiuser: AuthUser
2349 :param repoid: Set the repository name or repository ID.
2350 :type repoid: str or int
2351 :param usergroupid: Specify the user group ID.
2352 :type usergroupid: str or int
2353
2354 Example output:
2355
2356 .. code-block:: bash
2357
2358 id : <id_given_in_input>
2359 result: {
2360 "msg" : "Revoked perm for group: `<usersgroupname>` in repo: `<reponame>`",
2361 "success": true
2362 }
2363 error: null
2364
2365
2366 get_repo_group
2367 --------------
2368
2369 .. py:function:: get_repo_group(apiuser, repogroupid)
2370
2371 Return the specified |repo| group, along with permissions,
2372 and repositories inside the group
2373
2374 :param apiuser: This is filled automatically from the |authtoken|.
2375 :type apiuser: AuthUser
2376 :param repogroupid: Specify the name of ID of the repository group.
2377 :type repogroupid: str or int
2378
2379
2380 Example output:
2381
2382 .. code-block:: bash
2383
2384 {
2385 "error": null,
2386 "id": repo-group-id,
2387 "result": {
2388 "group_description": "repo group description",
2389 "group_id": 14,
2390 "group_name": "group name",
2391 "members": [
2392 {
2393 "name": "super-admin-username",
2394 "origin": "super-admin",
2395 "permission": "group.admin",
2396 "type": "user"
2397 },
2398 {
2399 "name": "owner-name",
2400 "origin": "owner",
2401 "permission": "group.admin",
2402 "type": "user"
2403 },
2404 {
2405 "name": "user-group-name",
2406 "origin": "permission",
2407 "permission": "group.write",
2408 "type": "user_group"
2409 }
2410 ],
2411 "owner": "owner-name",
2412 "parent_group": null,
2413 "repositories": [ repo-list ]
2414 }
2415 }
2416
2417
2418 get_repo_groups
2419 ---------------
2420
2421 .. py:function:: get_repo_groups(apiuser)
2422
2423 Returns all repository groups.
2424
2425 :param apiuser: This is filled automatically from the |authtoken|.
2426 :type apiuser: AuthUser
2427
2428
2429 create_repo_group
2430 -----------------
2431
2432 .. py:function:: create_repo_group(apiuser, group_name, description=<Optional:''>, owner=<Optional:<OptionalAttr:apiuser>>, copy_permissions=<Optional:False>)
2433
2434 Creates a repository group.
2435
2436 * If the repository group name contains "/", all the required repository
2437 groups will be created.
2438
2439 For example "foo/bar/baz" will create |repo| groups "foo" and "bar"
2440 (with "foo" as parent). It will also create the "baz" repository
2441 with "bar" as |repo| group.
2442
2443 This command can only be run using an |authtoken| with admin
2444 permissions.
2445
2446 :param apiuser: This is filled automatically from the |authtoken|.
2447 :type apiuser: AuthUser
2448 :param group_name: Set the repository group name.
2449 :type group_name: str
2450 :param description: Set the |repo| group description.
2451 :type description: str
2452 :param owner: Set the |repo| group owner.
2453 :type owner: str
2454 :param copy_permissions:
2455 :type copy_permissions:
2456
2457 Example output:
2458
2459 .. code-block:: bash
2460
2461 id : <id_given_in_input>
2462 result : {
2463 "msg": "Created new repo group `<repo_group_name>`"
2464 "repo_group": <repogroup_object>
2465 }
2466 error : null
2467
2468
2469 Example error output:
2470
2471 .. code-block:: bash
2472
2473 id : <id_given_in_input>
2474 result : null
2475 error : {
2476 failed to create repo group `<repogroupid>`
2477 }
2478
2479
2480 update_repo_group
2481 -----------------
2482
2483 .. py:function:: update_repo_group(apiuser, repogroupid, group_name=<Optional:''>, description=<Optional:''>, owner=<Optional:<OptionalAttr:apiuser>>, parent=<Optional:None>, enable_locking=<Optional:False>)
2484
2485 Updates repository group with the details given.
2486
2487 This command can only be run using an |authtoken| with admin
2488 permissions.
2489
2490 :param apiuser: This is filled automatically from the |authtoken|.
2491 :type apiuser: AuthUser
2492 :param repogroupid: Set the ID of repository group.
2493 :type repogroupid: str or int
2494 :param group_name: Set the name of the |repo| group.
2495 :type group_name: str
2496 :param description: Set a description for the group.
2497 :type description: str
2498 :param owner: Set the |repo| group owner.
2499 :type owner: str
2500 :param parent: Set the |repo| group parent.
2501 :type parent: str or int
2502 :param enable_locking: Enable |repo| locking. The default is false.
2503 :type enable_locking: bool
2504
2505
2506 delete_repo_group
2507 -----------------
2508
2509 .. py:function:: delete_repo_group(apiuser, repogroupid)
2510
2511 Deletes a |repo| group.
2512
2513 :param apiuser: This is filled automatically from the |authtoken|.
2514 :type apiuser: AuthUser
2515 :param repogroupid: Set the name or ID of repository group to be
2516 deleted.
2517 :type repogroupid: str or int
2518
2519 Example output:
2520
2521 .. code-block:: bash
2522
2523 id : <id_given_in_input>
2524 result : {
2525 'msg': 'deleted repo group ID:<repogroupid> <repogroupname>
2526 'repo_group': null
2527 }
2528 error : null
2529
2530 Example error output:
2531
2532 .. code-block:: bash
2533
2534 id : <id_given_in_input>
2535 result : null
2536 error : {
2537 "failed to delete repo group ID:<repogroupid> <repogroupname>"
2538 }
2539
2540
2541 grant_user_permission_to_repo_group
2542 -----------------------------------
2543
2544 .. py:function:: grant_user_permission_to_repo_group(apiuser, repogroupid, userid, perm, apply_to_children=<Optional:'none'>)
2545
2546 Grant permission for a user on the given repository group, or update
2547 existing permissions if found.
2548
2549 This command can only be run using an |authtoken| with admin
2550 permissions.
2551
2552 :param apiuser: This is filled automatically from the |authtoken|.
2553 :type apiuser: AuthUser
2554 :param repogroupid: Set the name or ID of repository group.
2555 :type repogroupid: str or int
2556 :param userid: Set the user name.
2557 :type userid: str
2558 :param perm: (group.(none|read|write|admin))
2559 :type perm: str
2560 :param apply_to_children: 'none', 'repos', 'groups', 'all'
2561 :type apply_to_children: str
2562
2563 Example output:
2564
2565 .. code-block:: bash
2566
2567 id : <id_given_in_input>
2568 result: {
2569 "msg" : "Granted perm: `<perm>` (recursive:<apply_to_children>) for user: `<username>` in repo group: `<repo_group_name>`",
2570 "success": true
2571 }
2572 error: null
2573
2574 Example error output:
2575
2576 .. code-block:: bash
2577
2578 id : <id_given_in_input>
2579 result : null
2580 error : {
2581 "failed to edit permission for user: `<userid>` in repo group: `<repo_group_name>`"
2582 }
2583
2584
2585 revoke_user_permission_from_repo_group
2586 --------------------------------------
2587
2588 .. py:function:: revoke_user_permission_from_repo_group(apiuser, repogroupid, userid, apply_to_children=<Optional:'none'>)
2589
2590 Revoke permission for a user in a given repository group.
2591
2592 This command can only be run using an |authtoken| with admin
2593 permissions on the |repo| group.
2594
2595 :param apiuser: This is filled automatically from the |authtoken|.
2596 :type apiuser: AuthUser
2597 :param repogroupid: Set the name or ID of the repository group.
2598 :type repogroupid: str or int
2599 :param userid: Set the user name to revoke.
2600 :type userid: str
2601 :param apply_to_children: 'none', 'repos', 'groups', 'all'
2602 :type apply_to_children: str
2603
2604 Example output:
2605
2606 .. code-block:: bash
2607
2608 id : <id_given_in_input>
2609 result: {
2610 "msg" : "Revoked perm (recursive:<apply_to_children>) for user: `<username>` in repo group: `<repo_group_name>`",
2611 "success": true
2612 }
2613 error: null
2614
2615 Example error output:
2616
2617 .. code-block:: bash
2618
2619 id : <id_given_in_input>
2620 result : null
2621 error : {
2622 "failed to edit permission for user: `<userid>` in repo group: `<repo_group_name>`"
2623 }
2624
2625
2626 grant_user_group_permission_to_repo_group
2627 -----------------------------------------
2628
2629 .. py:function:: grant_user_group_permission_to_repo_group(apiuser, repogroupid, usergroupid, perm, apply_to_children=<Optional:'none'>)
2630
2631 Grant permission for a user group on given repository group, or update
2632 existing permissions if found.
2633
2634 This command can only be run using an |authtoken| with admin
2635 permissions on the |repo| group.
2636
2637 :param apiuser: This is filled automatically from the |authtoken|.
2638 :type apiuser: AuthUser
2639 :param repogroupid: Set the name or id of repository group
2640 :type repogroupid: str or int
2641 :param usergroupid: id of usergroup
2642 :type usergroupid: str or int
2643 :param perm: (group.(none|read|write|admin))
2644 :type perm: str
2645 :param apply_to_children: 'none', 'repos', 'groups', 'all'
2646 :type apply_to_children: str
2647
2648 Example output:
2649
2650 .. code-block:: bash
2651
2652 id : <id_given_in_input>
2653 result : {
2654 "msg" : "Granted perm: `<perm>` (recursive:<apply_to_children>) for user group: `<usersgroupname>` in repo group: `<repo_group_name>`",
2655 "success": true
2656
2657 }
2658 error : null
2659
2660 Example error output:
2661
2662 .. code-block:: bash
2663
2664 id : <id_given_in_input>
2665 result : null
2666 error : {
2667 "failed to edit permission for user group: `<usergroup>` in repo group: `<repo_group_name>`"
2668 }
2669
2670
2671 revoke_user_group_permission_from_repo_group
2672 --------------------------------------------
2673
2674 .. py:function:: revoke_user_group_permission_from_repo_group(apiuser, repogroupid, usergroupid, apply_to_children=<Optional:'none'>)
2675
2676 Revoke permission for user group on given repository.
2677
2678 This command can only be run using an |authtoken| with admin
2679 permissions on the |repo| group.
2680
2681 :param apiuser: This is filled automatically from the |authtoken|.
2682 :type apiuser: AuthUser
2683 :param repogroupid: name or id of repository group
2684 :type repogroupid: str or int
2685 :param usergroupid:
2686 :param apply_to_children: 'none', 'repos', 'groups', 'all'
2687 :type apply_to_children: str
2688
2689 Example output:
2690
2691 .. code-block:: bash
2692
2693 id : <id_given_in_input>
2694 result: {
2695 "msg" : "Revoked perm (recursive:<apply_to_children>) for user group: `<usersgroupname>` in repo group: `<repo_group_name>`",
2696 "success": true
2697 }
2698 error: null
2699
2700 Example error output:
2701
2702 .. code-block:: bash
2703
2704 id : <id_given_in_input>
2705 result : null
2706 error : {
2707 "failed to edit permission for user group: `<usergroup>` in repo group: `<repo_group_name>`"
2708 }
2709
2710
2711 get_gist
2712 --------
2713
2714 .. py:function:: get_gist(apiuser, gistid, content=<Optional:False>)
2715
2716 Get the specified gist, based on the gist ID.
2717
2718 :param apiuser: This is filled automatically from the |authtoken|.
2719 :type apiuser: AuthUser
2720 :param gistid: Set the id of the private or public gist
2721 :type gistid: str
2722 :param content: Return the gist content. Default is false.
2723 :type content: Optional(bool)
2724
2725
2726 get_gists
2727 ---------
2728
2729 .. py:function:: get_gists(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
2730
2731 Get all gists for given user. If userid is empty returned gists
2732 are for user who called the api
2733
2734 :param apiuser: This is filled automatically from the |authtoken|.
2735 :type apiuser: AuthUser
2736 :param userid: user to get gists for
2737 :type userid: Optional(str or int)
2738
2739
2740 create_gist
2741 -----------
2742
2743 .. py:function:: create_gist(apiuser, files, owner=<Optional:<OptionalAttr:apiuser>>, gist_type=<Optional:u'public'>, lifetime=<Optional:-1>, acl_level=<Optional:u'acl_public'>, description=<Optional:''>)
2744
2745 Creates a new Gist.
2746
2747 :param apiuser: This is filled automatically from the |authtoken|.
2748 :type apiuser: AuthUser
2749 :param files: files to be added to the gist. The data structure has
2750 to match the following example::
2751
2752 {'filename': {'content':'...', 'lexer': null},
2753 'filename2': {'content':'...', 'lexer': null}}
2754
2755 :type files: dict
2756 :param owner: Set the gist owner, defaults to api method caller
2757 :type owner: Optional(str or int)
2758 :param gist_type: type of gist ``public`` or ``private``
2759 :type gist_type: Optional(str)
2760 :param lifetime: time in minutes of gist lifetime
2761 :type lifetime: Optional(int)
2762 :param acl_level: acl level for this gist, can be
2763 ``acl_public`` or ``acl_private`` If the value is set to
2764 ``acl_private`` only logged in users are able to access this gist.
2765 If not set it defaults to ``acl_public``.
2766 :type acl_level: Optional(str)
2767 :param description: gist description
2768 :type description: Optional(str)
2769
2770 Example output:
2771
2772 .. code-block:: bash
2773
2774 id : <id_given_in_input>
2775 result : {
2776 "msg": "created new gist",
2777 "gist": {}
2778 }
2779 error : null
2780
2781 Example error output:
2782
2783 .. code-block:: bash
2784
2785 id : <id_given_in_input>
2786 result : null
2787 error : {
2788 "failed to create gist"
2789 }
2790
2791
2792 delete_gist
2793 -----------
2794
2795 .. py:function:: delete_gist(apiuser, gistid)
2796
2797 Deletes existing gist
2798
2799 :param apiuser: filled automatically from apikey
2800 :type apiuser: AuthUser
2801 :param gistid: id of gist to delete
2802 :type gistid: str
2803
2804 Example output:
2805
2806 .. code-block:: bash
2807
2808 id : <id_given_in_input>
2809 result : {
2810 "deleted gist ID: <gist_id>",
2811 "gist": null
2812 }
2813 error : null
2814
2815 Example error output:
2816
2817 .. code-block:: bash
2818
2819 id : <id_given_in_input>
2820 result : null
2821 error : {
2822 "failed to delete gist ID:<gist_id>"
2823 }
2824
@@ -14,7 +14,7 b' code review matters, see these posts on '
14
14
15 You can also use the |RCE| API set up continuous integration servers to leave
15 You can also use the |RCE| API set up continuous integration servers to leave
16 comments from a test suite. See the :ref:`api` and
16 comments from a test suite. See the :ref:`api` and
17 :ref:`integrations-ref` sections for examples on how to set this up.
17 :ref:`extensions-hooks-ref` sections for examples on how to set this up.
18
18
19 .. toctree::
19 .. toctree::
20
20
@@ -6,6 +6,8 b" rst_epilog = '''"
6 .. |AE| replace:: Appenlight
6 .. |AE| replace:: Appenlight
7 .. |authtoken| replace:: Authentication Token
7 .. |authtoken| replace:: Authentication Token
8 .. |authtokens| replace:: **Auth Tokens**
8 .. |authtokens| replace:: **Auth Tokens**
9 .. |RCCEshort| replace:: Community
10 .. |RCEEshort| replace:: Enterprise
9 .. |git| replace:: Git
11 .. |git| replace:: Git
10 .. |hg| replace:: Mercurial
12 .. |hg| replace:: Mercurial
11 .. |svn| replace:: Subversion
13 .. |svn| replace:: Subversion
@@ -78,7 +78,7 b' following command from inside the cloned'
78
78
79 On the first run, this will take a while to download and optionally compile
79 On the first run, this will take a while to download and optionally compile
80 a few things. The following runs will be faster. The development shell works
80 a few things. The following runs will be faster. The development shell works
81 fine on MacOS and Linux platforms.
81 fine on both MacOS and Linux platforms.
82
82
83
83
84
84
@@ -91,9 +91,9 b' use the following steps:'
91 1. Create a copy of `~/rhodecode-enterprise-ce/configs/development.ini`
91 1. Create a copy of `~/rhodecode-enterprise-ce/configs/development.ini`
92 2. Adjust the configuration settings to your needs
92 2. Adjust the configuration settings to your needs
93
93
94 .. note::
94 .. note::
95
95
96 It is recommended to use the name `dev.ini`.
96 It is recommended to use the name `dev.ini`.
97
97
98
98
99 Setup the Development Database
99 Setup the Development Database
@@ -108,32 +108,37 b' time operation::'
108 --repos=~/my_dev_repos
108 --repos=~/my_dev_repos
109
109
110
110
111 Compile CSS and JavaScript
112 ^^^^^^^^^^^^^^^^^^^^^^^^^^
113
114 To use the application's frontend, you will need to compile the CSS and
115 JavaScript with Grunt. This is easily done from within the nix-shell using the
116 following command::
117
118 make web-build
119
120 You will need to recompile following any changes made to the CSS or JavaScript
121 files.
122
123
111 Start the Development Server
124 Start the Development Server
112 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
125 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
113
126
114 When starting the development server, you should start the vcsserver as a
127 From the rhodecode-vcsserver directory, start the development server in another
115 separate process. To do this, use one of the following examples:
128 nix-shell, using the following command::
116
129
117 1. Set the `start.vcs_server` flag in the ``dev.ini`` file to true. For example:
130 pserve configs/development.ini http_port=9900
118
131
119 .. code-block:: python
132 In the adjacent nix-shell which you created for your development server, you may
133 now start CE with the following command::
120
134
121 ### VCS CONFIG ###
122 ##################
123 vcs.start_server = true
124 vcs.server = localhost:9900
125 vcs.server.log_level = debug
126
135
127 Then start the server using the following command: ``rcserver dev.ini``
136 rcserver dev.ini
128
137
129 2. Start the development server using the following example::
138 .. note::
130
131 rcserver --with-vcsserver dev.ini
132
139
133 3. Start the development server in a different terminal using the following
140 To automatically refresh - and recompile the frontend assets - when changes
134 example::
141 are made in the source code, you can use the option `--reload`.
135
136 vcsserver
137
142
138
143
139 Run the Environment Tests
144 Run the Environment Tests
@@ -141,4 +146,12 b' Run the Environment Tests'
141
146
142 Please make sure that the tests are passing to verify that your environment is
147 Please make sure that the tests are passing to verify that your environment is
143 set up correctly. RhodeCode uses py.test to run tests.
148 set up correctly. RhodeCode uses py.test to run tests.
144 Please simply run ``make test`` to run the basic test suite.
149 While your instance is running, start a new nix-shell and simply run
150 ``make test`` to run the basic test suite.
151
152
153 Need Help?
154 ^^^^^^^^^^
155
156 Join us on Slack via https://rhodecode.com/join or post questions in our
157 Community Portal at https://community.rhodecode.com
@@ -86,14 +86,11 b' Sign the Contributor License Agreement'
86 ======================================
86 ======================================
87
87
88 If your contribution is approved, you will need to virtually sign the license
88 If your contribution is approved, you will need to virtually sign the license
89 agreement in order for it to be merged into the project's codebase. You can read
89 agreement in order for it to be merged into the project's codebase.
90 it on our website here: https://rhodecode.com/static/pdf/RhodeCode-CLA.pdf
91
90
92 To sign, go to code.rhodecode.com
91 You can read it on our website at https://rhodecode.com/rhodecode-cla
93 and clone the CLA repository. Add your name and make a pull request to add it to
92
94 the contributor agreement; this serves as your virtual signature. Once your
93 To sign electronically, go to https://rhodecode.com/sign-cla
95 signature is merged, add a link to the relevant commit to your contribution
96 pull request.
97
94
98
95
99
96
@@ -28,10 +28,11 b' let'
28 };
28 };
29
29
30 Pygments = buildPythonPackage rec {
30 Pygments = buildPythonPackage rec {
31 name = "Pygments-2.0.2";
31 name = "Pygments-2.1.3";
32 doCheck = false;
32 src = fetchurl {
33 src = fetchurl {
33 url = "https://pypi.python.org/packages/source/P/Pygments/${name}.tar.gz";
34 url = "https://pypi.python.org/packages/b8/67/ab177979be1c81bc99c8d0592ef22d547e70bb4c6815c383286ed5dec504/Pygments-2.1.3.tar.gz";
34 md5 = "238587a1370d62405edabd0794b3ec4a";
35 md5 = "ed3fba2467c8afcda4d317e4ef2c6150";
35 };
36 };
36 };
37 };
37
38
@@ -78,11 +79,19 b' let'
78 ];
79 ];
79 };
80 };
80
81
81 Sphinx = buildPythonPackage (rec {
82 imagesize = buildPythonPackage rec {
82 name = "Sphinx-1.3.1";
83 name = "imagesize-0.7.1";
83 src = fetchurl {
84 src = fetchurl {
84 url = "http://pypi.python.org/packages/source/S/Sphinx/${name}.tar.gz";
85 url = "https://pypi.python.org/packages/53/72/6c6f1e787d9cab2cc733cf042f125abec07209a58308831c9f292504e826/${name}.tar.gz";
85 md5 = "8786a194acf9673464c5455b11fd4332";
86 md5 = "976148283286a6ba5f69b0f81aef8052";
87 };
88 };
89
90 Sphinx = buildPythonPackage (rec {
91 name = "Sphinx-1.4.4";
92 src = fetchurl {
93 url = "https://pypi.python.org/packages/20/a2/72f44c84f6c4115e3fef58d36d657ec311d80196eab9fd5ec7bcde76143b/${name}.tar.gz";
94 md5 = "64ce2ec08d37ed56313a98232cbe2aee";
86 };
95 };
87 propagatedBuildInputs = [
96 propagatedBuildInputs = [
88 docutils
97 docutils
@@ -93,6 +102,7 b' let'
93 snowballstemmer
102 snowballstemmer
94 pytz
103 pytz
95 babel
104 babel
105 imagesize
96
106
97 # TODO: johbo: Had to include it here so that can be imported
107 # TODO: johbo: Had to include it here so that can be imported
98 sphinx_rtd_theme
108 sphinx_rtd_theme
1 NO CONTENT: file renamed from docs/integrations/config-ext.rst to docs/extensions/config-ext.rst
NO CONTENT: file renamed from docs/integrations/config-ext.rst to docs/extensions/config-ext.rst
1 NO CONTENT: file renamed from docs/integrations/example-ext.py to docs/extensions/example-ext.py
NO CONTENT: file renamed from docs/integrations/example-ext.py to docs/extensions/example-ext.py
1 NO CONTENT: file renamed from docs/integrations/extensions.rst to docs/extensions/extensions.rst
NO CONTENT: file renamed from docs/integrations/extensions.rst to docs/extensions/extensions.rst
1 NO CONTENT: file renamed from docs/integrations/full-blown-example.rst to docs/extensions/full-blown-example.rst
NO CONTENT: file renamed from docs/integrations/full-blown-example.rst to docs/extensions/full-blown-example.rst
1 NO CONTENT: file renamed from docs/integrations/hooks.rst to docs/extensions/hooks.rst
NO CONTENT: file renamed from docs/integrations/hooks.rst to docs/extensions/hooks.rst
1 NO CONTENT: file renamed from docs/integrations/install-ext.rst to docs/extensions/install-ext.rst
NO CONTENT: file renamed from docs/integrations/install-ext.rst to docs/extensions/install-ext.rst
1 NO CONTENT: file renamed from docs/integrations/int-slack.rst to docs/extensions/int-slack.rst
NO CONTENT: file renamed from docs/integrations/int-slack.rst to docs/extensions/int-slack.rst
1 NO CONTENT: file renamed from docs/integrations/rcx.rst to docs/extensions/rcx.rst
NO CONTENT: file renamed from docs/integrations/rcx.rst to docs/extensions/rcx.rst
@@ -58,6 +58,7 b' and commit files and |repos| while manag'
58 collaboration/review-notifications
58 collaboration/review-notifications
59 collaboration/pull-requests
59 collaboration/pull-requests
60 code-review/code-review
60 code-review/code-review
61 integrations/integrations
61
62
62 .. toctree::
63 .. toctree::
63 :maxdepth: 1
64 :maxdepth: 1
@@ -65,7 +66,7 b' and commit files and |repos| while manag'
65
66
66 api/api
67 api/api
67 tools/rhodecode-tools
68 tools/rhodecode-tools
68 integrations/integrations
69 extensions/extensions-hooks
69 contributing/contributing
70 contributing/contributing
70
71
71 .. toctree::
72 .. toctree::
@@ -1,7 +1,7 b''
1 .. _quick-start:
1 .. _quick-start:
2
2
3 Quick Start Guide
3 Quick Start Installation Guide
4 =================
4 ==============================
5
5
6 .. important::
6 .. important::
7
7
@@ -1,25 +1,52 b''
1 .. _integrations-ref:
1 .. _integrations:
2
3 Integrations
4 ------------
2
5
3 Integrations and Extensions
6 Rhodecode supports integrations with external services for various events,
4 ===========================
7 such as commit pushes and pull requests. Multiple integrations of the same type
8 can be added at the same time; this is useful for posting different events to
9 different Slack channels, for example.
5
10
6 The integrations section references three concepts regularly,
11 Supported integrations
7 so to clarify what is meant each time, read the following definitions:
12 ^^^^^^^^^^^^^^^^^^^^^^
8
13
9 * **Plugin**: A Plugin is software that adds a specific feature to
14 ============================ ============ =====================================
10 an existing software application.
15 Type/Name |RC| Edition Description
11 * **Extension**: An extension extends the capabilities of,
16 ============================ ============ =====================================
12 or the data available to, an existing software application.
17 :ref:`integrations-slack` |RCCEshort| https://slack.com/
13 * **Hook**: A hook intercepts function calls, messages, or events passed
18 :ref:`integrations-hipchat` |RCCEshort| https://www.hipchat.com/
14 between software components and can be used to trigger plugins, or their
19 :ref:`integrations-webhook` |RCCEshort| POST events as `json` to a custom url
15 extensions.
20 :ref:`integrations-email` |RCEEshort| Send repo push commits by email
21 :ref:`integrations-redmine` |RCEEshort| Close/Resolve/Reference redmine issues
22 :ref:`integrations-jira` |RCEEshort| Close/Resolve/Reference JIRA issues
23 ============================ ============ =====================================
24
25 .. _creating-integrations:
26
27 Creating an Integration
28 ^^^^^^^^^^^^^^^^^^^^^^^
29
30 Integrations can be added globally via the admin UI:
31
32 :menuselection:`Admin --> Integrations`
33
34 or per repository in each repository's settings:
35
36 :menuselection:`Admin --> Repositories --> Edit --> Integrations`
37
38 To create an integration, select the type from the list in the *Create New
39 Integration* section.
40
41 The *Current Integrations* section shows existing integrations that have been
42 created along with their type (eg. Slack) and enabled status.
43
44 See pages specific to each type of integration for more instructions:
16
45
17 .. toctree::
46 .. toctree::
18
47
19 rcx
48 slack
20 install-ext
49 hipchat
21 config-ext
50 redmine
22 extensions
51 jira
23 hooks
52 webhook
24 full-blown-example
25 int-slack
@@ -5,12 +5,12 b' Issue Tracker Integration'
5
5
6 You can set an issue tracker connection in two ways with |RCE|.
6 You can set an issue tracker connection in two ways with |RCE|.
7
7
8 * At instance level you can set a default issue tracker.
8 * At the instance level, you can set a default issue tracker.
9 * At |repo| level you can configure an integration with a different issue
9 * At the |repo| level, you can configure an integration with a different issue
10 tracker.
10 tracker.
11
11
12 To integrate |RCM| with an issue tracker you need to define a regular
12 To integrate |RCM| with an issue tracker, you need to define a regular
13 expression that will fetch the issue ID stored in commit messages and replace
13 expression that will fetch the issue ID stored in commit messages, and replace
14 it with a URL. This enables |RCE| to generate a link matching each issue to the
14 it with a URL. This enables |RCE| to generate a link matching each issue to the
15 target |repo|.
15 target |repo|.
16
16
@@ -33,9 +33,8 b' 3. Select **Add** so save the rule to yo'
33 Repository Issue Tracker Configuration
33 Repository Issue Tracker Configuration
34 --------------------------------------
34 --------------------------------------
35
35
36 You can configure specific |repos| to use a different issue tracker if
36 You can configure specific |repos| to use a different issue tracker than the
37 you need to connect to a non-default one. See the instructions in
37 default one. See the instructions in :ref:`repo-it`
38 :ref:`repo-it`
39
38
40 .. _issue-tr-eg-ref:
39 .. _issue-tr-eg-ref:
41
40
@@ -9,6 +9,6 b' Release Date'
9 Fixes
9 Fixes
10 ^^^^^
10 ^^^^^
11
11
12 - ui: fixed empty labels caused by missing translation of JS components
12 - UI: fixed empty labels caused by missing translation of JS components.
13 - login: fixed bad routing URL in comments when user is not logged in.
13 - Login: fixed bad routing URL in comments when user is not logged in.
14 - celery: make sure to run tasks in sync mode if connection to celery is lost.
14 - Celery: make sure to run tasks in sync mode if connection to celery is lost.
@@ -9,6 +9,7 b' Release Notes'
9 .. toctree::
9 .. toctree::
10 :maxdepth: 1
10 :maxdepth: 1
11
11
12 release-notes-4.3.0.rst
12 release-notes-4.2.1.rst
13 release-notes-4.2.1.rst
13 release-notes-4.2.0.rst
14 release-notes-4.2.0.rst
14 release-notes-4.1.2.rst
15 release-notes-4.1.2.rst
@@ -301,7 +301,7 b' used to send signals to build-bots such '
301
301
302 \ - -plugins
302 \ - -plugins
303 Add plugins to your |RCE| installation. See the
303 Add plugins to your |RCE| installation. See the
304 :ref:`integrations-ref` section for more details.
304 :ref:`extensions-hooks-ref` section for more details.
305
305
306 \ - -version
306 \ - -version
307 Display your |RCT| version.
307 Display your |RCT| version.
@@ -1,12 +1,12 b''
1 diff --git a/requirements.txt b/requirements.txt
1 diff --git a/requirements.txt b/requirements.txt
2 --- a/requirements.txt
2 --- a/requirements.txt
3 +++ b/requirements.txt
3 +++ b/requirements.txt
4 @@ -3,7 +3,7 @@future==0.14.3
4 @@ -3,7 +3,7 @@ future==0.14.3
5 six==1.9.0
5 six==1.9.0
6 mako==1.0.1
6 mako==1.0.1
7 markupsafe==0.23
7 markupsafe==0.23
8 -requests==2.5.1
8 -requests==2.5.1
9 +requests
9 +requests
10 #responses
11 whoosh==2.7.0
10 whoosh==2.7.0
12 elasticsearch==2.3.0 No newline at end of file
11 elasticsearch==2.3.0
12 elasticsearch-dsl==2.0.0 No newline at end of file
@@ -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 pycurl = super.pycurl.override (attrs: {
106 pycurl = super.pycurl.override (attrs: {
99 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
107 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
100 pkgs.curl
108 pkgs.curl
@@ -38,6 +38,19 b''
38 license = [ pkgs.lib.licenses.mit ];
38 license = [ pkgs.lib.licenses.mit ];
39 };
39 };
40 };
40 };
41 Chameleon = super.buildPythonPackage {
42 name = "Chameleon-2.24";
43 buildInputs = with self; [];
44 doCheck = false;
45 propagatedBuildInputs = with self; [];
46 src = fetchurl {
47 url = "https://pypi.python.org/packages/5a/9e/637379ffa13c5172b5c0e704833ffea6bf51cec7567f93fd6e903d53ed74/Chameleon-2.24.tar.gz";
48 md5 = "1b01f1f6533a8a11d0d2f2366dec5342";
49 };
50 meta = {
51 license = [ { fullName = "BSD-like (http://repoze.org/license.html)"; } ];
52 };
53 };
41 Fabric = super.buildPythonPackage {
54 Fabric = super.buildPythonPackage {
42 name = "Fabric-1.10.0";
55 name = "Fabric-1.10.0";
43 buildInputs = with self; [];
56 buildInputs = with self; [];
@@ -169,13 +182,13 b''
169 };
182 };
170 };
183 };
171 Pygments = super.buildPythonPackage {
184 Pygments = super.buildPythonPackage {
172 name = "Pygments-2.0.2";
185 name = "Pygments-2.1.3";
173 buildInputs = with self; [];
186 buildInputs = with self; [];
174 doCheck = false;
187 doCheck = false;
175 propagatedBuildInputs = with self; [];
188 propagatedBuildInputs = with self; [];
176 src = fetchurl {
189 src = fetchurl {
177 url = "https://pypi.python.org/packages/f4/c6/bdbc5a8a112256b2b6136af304dbae93d8b1ef8738ff2d12a51018800e46/Pygments-2.0.2.tar.gz";
190 url = "https://pypi.python.org/packages/b8/67/ab177979be1c81bc99c8d0592ef22d547e70bb4c6815c383286ed5dec504/Pygments-2.1.3.tar.gz";
178 md5 = "238587a1370d62405edabd0794b3ec4a";
191 md5 = "ed3fba2467c8afcda4d317e4ef2c6150";
179 };
192 };
180 meta = {
193 meta = {
181 license = [ pkgs.lib.licenses.bsdOriginal ];
194 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -467,6 +480,19 b''
467 license = [ pkgs.lib.licenses.bsdOriginal ];
480 license = [ pkgs.lib.licenses.bsdOriginal ];
468 };
481 };
469 };
482 };
483 channelstream = super.buildPythonPackage {
484 name = "channelstream-0.5.2";
485 buildInputs = with self; [];
486 doCheck = false;
487 propagatedBuildInputs = with self; [gevent ws4py pyramid pyramid-jinja2 itsdangerous requests six];
488 src = fetchurl {
489 url = "https://pypi.python.org/packages/2b/31/29a8e085cf5bf97fa88e7b947adabfc581a18a3463adf77fb6dada34a65f/channelstream-0.5.2.tar.gz";
490 md5 = "1c5eb2a8a405be6f1073da94da6d81d3";
491 };
492 meta = {
493 license = [ pkgs.lib.licenses.bsdOriginal ];
494 };
495 };
470 click = super.buildPythonPackage {
496 click = super.buildPythonPackage {
471 name = "click-5.1";
497 name = "click-5.1";
472 buildInputs = with self; [];
498 buildInputs = with self; [];
@@ -558,6 +584,19 b''
558 license = [ pkgs.lib.licenses.bsdOriginal ];
584 license = [ pkgs.lib.licenses.bsdOriginal ];
559 };
585 };
560 };
586 };
587 deform = super.buildPythonPackage {
588 name = "deform-2.0a2";
589 buildInputs = with self; [];
590 doCheck = false;
591 propagatedBuildInputs = with self; [Chameleon colander peppercorn translationstring zope.deprecation];
592 src = fetchurl {
593 url = "https://pypi.python.org/packages/8d/b3/aab57e81da974a806dc9c5fa024a6404720f890a6dcf2e80885e3cb4609a/deform-2.0a2.tar.gz";
594 md5 = "7a90d41f7fbc18002ce74f39bd90a5e4";
595 };
596 meta = {
597 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
598 };
599 };
561 docutils = super.buildPythonPackage {
600 docutils = super.buildPythonPackage {
562 name = "docutils-0.12";
601 name = "docutils-0.12";
563 buildInputs = with self; [];
602 buildInputs = with self; [];
@@ -572,13 +611,13 b''
572 };
611 };
573 };
612 };
574 dogpile.cache = super.buildPythonPackage {
613 dogpile.cache = super.buildPythonPackage {
575 name = "dogpile.cache-0.5.7";
614 name = "dogpile.cache-0.6.1";
576 buildInputs = with self; [];
615 buildInputs = with self; [];
577 doCheck = false;
616 doCheck = false;
578 propagatedBuildInputs = with self; [dogpile.core];
617 propagatedBuildInputs = with self; [];
579 src = fetchurl {
618 src = fetchurl {
580 url = "https://pypi.python.org/packages/07/74/2a83bedf758156d9c95d112691bbad870d3b77ccbcfb781b4ef836ea7d96/dogpile.cache-0.5.7.tar.gz";
619 url = "https://pypi.python.org/packages/f6/a0/6f2142c58c6588d17c734265b103ae1cd0741e1681dd9483a63f22033375/dogpile.cache-0.6.1.tar.gz";
581 md5 = "3e58ce41af574aab41d78e9c4190f194";
620 md5 = "35d7fb30f22bbd0685763d894dd079a9";
582 };
621 };
583 meta = {
622 meta = {
584 license = [ pkgs.lib.licenses.bsdOriginal ];
623 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -688,6 +727,19 b''
688 license = [ pkgs.lib.licenses.bsdOriginal ];
727 license = [ pkgs.lib.licenses.bsdOriginal ];
689 };
728 };
690 };
729 };
730 gevent = super.buildPythonPackage {
731 name = "gevent-1.1.1";
732 buildInputs = with self; [];
733 doCheck = false;
734 propagatedBuildInputs = with self; [greenlet];
735 src = fetchurl {
736 url = "https://pypi.python.org/packages/12/dc/0b2e57823225de86f6e111a65d212c9e3b64847dddaa19691a6cb94b0b2e/gevent-1.1.1.tar.gz";
737 md5 = "1532f5396ab4d07a231f1935483be7c3";
738 };
739 meta = {
740 license = [ pkgs.lib.licenses.mit ];
741 };
742 };
691 gnureadline = super.buildPythonPackage {
743 gnureadline = super.buildPythonPackage {
692 name = "gnureadline-6.3.3";
744 name = "gnureadline-6.3.3";
693 buildInputs = with self; [];
745 buildInputs = with self; [];
@@ -702,7 +754,7 b''
702 };
754 };
703 };
755 };
704 gprof2dot = super.buildPythonPackage {
756 gprof2dot = super.buildPythonPackage {
705 name = "gprof2dot-2015.12.1";
757 name = "gprof2dot-2015.12.01";
706 buildInputs = with self; [];
758 buildInputs = with self; [];
707 doCheck = false;
759 doCheck = false;
708 propagatedBuildInputs = with self; [];
760 propagatedBuildInputs = with self; [];
@@ -714,6 +766,19 b''
714 license = [ { fullName = "LGPL"; } ];
766 license = [ { fullName = "LGPL"; } ];
715 };
767 };
716 };
768 };
769 greenlet = super.buildPythonPackage {
770 name = "greenlet-0.4.9";
771 buildInputs = with self; [];
772 doCheck = false;
773 propagatedBuildInputs = with self; [];
774 src = fetchurl {
775 url = "https://pypi.python.org/packages/4e/3d/9d421539b74e33608b245092870156b2e171fb49f2b51390aa4641eecb4a/greenlet-0.4.9.zip";
776 md5 = "c6659cdb2a5e591723e629d2eef22e82";
777 };
778 meta = {
779 license = [ pkgs.lib.licenses.mit ];
780 };
781 };
717 gunicorn = super.buildPythonPackage {
782 gunicorn = super.buildPythonPackage {
718 name = "gunicorn-19.6.0";
783 name = "gunicorn-19.6.0";
719 buildInputs = with self; [];
784 buildInputs = with self; [];
@@ -948,6 +1013,19 b''
948 license = [ { fullName = "Expat license"; } pkgs.lib.licenses.mit ];
1013 license = [ { fullName = "Expat license"; } pkgs.lib.licenses.mit ];
949 };
1014 };
950 };
1015 };
1016 peppercorn = super.buildPythonPackage {
1017 name = "peppercorn-0.5";
1018 buildInputs = with self; [];
1019 doCheck = false;
1020 propagatedBuildInputs = with self; [];
1021 src = fetchurl {
1022 url = "https://pypi.python.org/packages/45/ec/a62ec317d1324a01567c5221b420742f094f05ee48097e5157d32be3755c/peppercorn-0.5.tar.gz";
1023 md5 = "f08efbca5790019ab45d76b7244abd40";
1024 };
1025 meta = {
1026 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1027 };
1028 };
951 psutil = super.buildPythonPackage {
1029 psutil = super.buildPythonPackage {
952 name = "psutil-2.2.1";
1030 name = "psutil-2.2.1";
953 buildInputs = with self; [];
1031 buildInputs = with self; [];
@@ -962,13 +1040,13 b''
962 };
1040 };
963 };
1041 };
964 psycopg2 = super.buildPythonPackage {
1042 psycopg2 = super.buildPythonPackage {
965 name = "psycopg2-2.6";
1043 name = "psycopg2-2.6.1";
966 buildInputs = with self; [];
1044 buildInputs = with self; [];
967 doCheck = false;
1045 doCheck = false;
968 propagatedBuildInputs = with self; [];
1046 propagatedBuildInputs = with self; [];
969 src = fetchurl {
1047 src = fetchurl {
970 url = "https://pypi.python.org/packages/dd/c7/9016ff8ff69da269b1848276eebfb264af5badf6b38caad805426771f04d/psycopg2-2.6.tar.gz";
1048 url = "https://pypi.python.org/packages/86/fd/cc8315be63a41fe000cce20482a917e874cdc1151e62cb0141f5e55f711e/psycopg2-2.6.1.tar.gz";
971 md5 = "fbbb039a8765d561a1c04969bbae7c74";
1049 md5 = "842b44f8c95517ed5b792081a2370da1";
972 };
1050 };
973 meta = {
1051 meta = {
974 license = [ pkgs.lib.licenses.zpt21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ];
1052 license = [ pkgs.lib.licenses.zpt21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ];
@@ -1000,6 +1078,19 b''
1000 license = [ pkgs.lib.licenses.bsdOriginal ];
1078 license = [ pkgs.lib.licenses.bsdOriginal ];
1001 };
1079 };
1002 };
1080 };
1081 py-gfm = super.buildPythonPackage {
1082 name = "py-gfm-0.1.3";
1083 buildInputs = with self; [];
1084 doCheck = false;
1085 propagatedBuildInputs = with self; [setuptools Markdown];
1086 src = fetchurl {
1087 url = "https://pypi.python.org/packages/12/e4/6b3d8678da04f97d7490d8264d8de51c2dc9fb91209ccee9c515c95e14c5/py-gfm-0.1.3.tar.gz";
1088 md5 = "e588d9e69640a241b97e2c59c22527a6";
1089 };
1090 meta = {
1091 license = [ pkgs.lib.licenses.bsdOriginal ];
1092 };
1093 };
1003 pycrypto = super.buildPythonPackage {
1094 pycrypto = super.buildPythonPackage {
1004 name = "pycrypto-2.6.1";
1095 name = "pycrypto-2.6.1";
1005 buildInputs = with self; [];
1096 buildInputs = with self; [];
@@ -1339,23 +1430,23 b''
1339 };
1430 };
1340 };
1431 };
1341 rhodecode-enterprise-ce = super.buildPythonPackage {
1432 rhodecode-enterprise-ce = super.buildPythonPackage {
1342 name = "rhodecode-enterprise-ce-4.2.1";
1433 name = "rhodecode-enterprise-ce-4.3.0";
1343 buildInputs = with self; [WebTest configobj cssselect flake8 lxml mock pytest pytest-cov pytest-runner];
1434 buildInputs = with self; [WebTest configobj cssselect flake8 lxml mock pytest pytest-cov pytest-runner];
1344 doCheck = true;
1435 doCheck = true;
1345 propagatedBuildInputs = with self; [Babel Beaker FormEncode Mako Markdown MarkupSafe MySQL-python Paste PasteDeploy PasteScript Pygments Pylons Pyro4 Routes SQLAlchemy Tempita URLObject WebError WebHelpers WebHelpers2 WebOb WebTest Whoosh alembic amqplib anyjson appenlight-client authomatic backport-ipaddress celery colander decorator docutils gunicorn infrae.cache ipython iso8601 kombu msgpack-python packaging psycopg2 pycrypto pycurl pyparsing pyramid pyramid-debugtoolbar pyramid-mako pyramid-beaker pysqlite python-dateutil python-ldap python-memcached python-pam recaptcha-client repoze.lru requests simplejson waitress zope.cachedescriptors psutil py-bcrypt];
1436 propagatedBuildInputs = with self; [Babel Beaker FormEncode Mako Markdown MarkupSafe MySQL-python Paste PasteDeploy PasteScript Pygments Pylons Pyro4 Routes SQLAlchemy Tempita URLObject WebError WebHelpers WebHelpers2 WebOb WebTest Whoosh alembic amqplib anyjson appenlight-client authomatic backport-ipaddress celery channelstream colander decorator deform docutils gevent gunicorn infrae.cache ipython iso8601 kombu msgpack-python packaging psycopg2 py-gfm pycrypto pycurl pyparsing pyramid pyramid-debugtoolbar pyramid-mako pyramid-beaker pysqlite python-dateutil python-ldap python-memcached python-pam recaptcha-client repoze.lru requests simplejson waitress zope.cachedescriptors dogpile.cache dogpile.core psutil py-bcrypt];
1346 src = ./.;
1437 src = ./.;
1347 meta = {
1438 meta = {
1348 license = [ { fullName = "AGPLv3, and Commercial License"; } ];
1439 license = [ { fullName = "AGPLv3, and Commercial License"; } ];
1349 };
1440 };
1350 };
1441 };
1351 rhodecode-tools = super.buildPythonPackage {
1442 rhodecode-tools = super.buildPythonPackage {
1352 name = "rhodecode-tools-0.8.3";
1443 name = "rhodecode-tools-0.10.0";
1353 buildInputs = with self; [];
1444 buildInputs = with self; [];
1354 doCheck = false;
1445 doCheck = false;
1355 propagatedBuildInputs = with self; [click future six Mako MarkupSafe requests Whoosh elasticsearch elasticsearch-dsl];
1446 propagatedBuildInputs = with self; [click future six Mako MarkupSafe requests Whoosh elasticsearch elasticsearch-dsl];
1356 src = fetchurl {
1447 src = fetchurl {
1357 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.8.3.zip";
1448 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.10.0.zip";
1358 md5 = "9acdfd71b8ddf4056057065f37ab9ccb";
1449 md5 = "4762391473ded761bead3aa58c748044";
1359 };
1450 };
1360 meta = {
1451 meta = {
1361 license = [ { fullName = "AGPLv3 and Proprietary"; } ];
1452 license = [ { fullName = "AGPLv3 and Proprietary"; } ];
@@ -1453,13 +1544,13 b''
1453 };
1544 };
1454 };
1545 };
1455 supervisor = super.buildPythonPackage {
1546 supervisor = super.buildPythonPackage {
1456 name = "supervisor-3.1.3";
1547 name = "supervisor-3.3.0";
1457 buildInputs = with self; [];
1548 buildInputs = with self; [];
1458 doCheck = false;
1549 doCheck = false;
1459 propagatedBuildInputs = with self; [meld3];
1550 propagatedBuildInputs = with self; [meld3];
1460 src = fetchurl {
1551 src = fetchurl {
1461 url = "https://pypi.python.org/packages/a6/41/65ad5bd66230b173eb4d0b8810230f3a9c59ef52ae066e540b6b99895db7/supervisor-3.1.3.tar.gz";
1552 url = "https://pypi.python.org/packages/44/80/d28047d120bfcc8158b4e41127706731ee6a3419c661e0a858fb0e7c4b2d/supervisor-3.3.0.tar.gz";
1462 md5 = "aad263c4fbc070de63dd354864d5e552";
1553 md5 = "46bac00378d1eddb616752b990c67416";
1463 };
1554 };
1464 meta = {
1555 meta = {
1465 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1556 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
@@ -1556,6 +1647,19 b''
1556 license = [ pkgs.lib.licenses.zpt21 ];
1647 license = [ pkgs.lib.licenses.zpt21 ];
1557 };
1648 };
1558 };
1649 };
1650 ws4py = super.buildPythonPackage {
1651 name = "ws4py-0.3.5";
1652 buildInputs = with self; [];
1653 doCheck = false;
1654 propagatedBuildInputs = with self; [];
1655 src = fetchurl {
1656 url = "https://pypi.python.org/packages/b6/4f/34af703be86939629479e74d6e650e39f3bd73b3b09212c34e5125764cbc/ws4py-0.3.5.zip";
1657 md5 = "a261b75c20b980e55ce7451a3576a867";
1658 };
1659 meta = {
1660 license = [ pkgs.lib.licenses.bsdOriginal ];
1661 };
1662 };
1559 wsgiref = super.buildPythonPackage {
1663 wsgiref = super.buildPythonPackage {
1560 name = "wsgiref-0.1.2";
1664 name = "wsgiref-0.1.2";
1561 buildInputs = with self; [];
1665 buildInputs = with self; [];
@@ -11,7 +11,7 b' MySQL-python==1.2.5'
11 Paste==2.0.2
11 Paste==2.0.2
12 PasteDeploy==1.5.2
12 PasteDeploy==1.5.2
13 PasteScript==1.7.5
13 PasteScript==1.7.5
14 Pygments==2.0.2
14 Pygments==2.1.3
15
15
16 # TODO: This version is not available on PyPI
16 # TODO: This version is not available on PyPI
17 # Pylons==1.0.2.dev20160108
17 # Pylons==1.0.2.dev20160108
@@ -24,10 +24,6 b' Pyro4==4.41'
24 # TODO: This should probably not be in here
24 # TODO: This should probably not be in here
25 # -e hg+https://johbo@code.rhodecode.com/johbo/rhodecode-fork@3a454bd1f17c0b2b2a951cf2b111e0320d7942a9#egg=RhodeCodeEnterprise-dev
25 # -e hg+https://johbo@code.rhodecode.com/johbo/rhodecode-fork@3a454bd1f17c0b2b2a951cf2b111e0320d7942a9#egg=RhodeCodeEnterprise-dev
26
26
27 # TODO: This is not really a dependency, we should add it only
28 # into the development environment, since there it is useful.
29 # RhodeCodeVCSServer==3.9.0
30
31 Routes==1.13
27 Routes==1.13
32 SQLAlchemy==0.9.9
28 SQLAlchemy==0.9.9
33 Sphinx==1.2.2
29 Sphinx==1.2.2
@@ -53,6 +49,7 b' backport-ipaddress==0.1'
53 bottle==0.12.8
49 bottle==0.12.8
54 bumpversion==0.5.3
50 bumpversion==0.5.3
55 celery==2.2.10
51 celery==2.2.10
52 channelstream==0.5.2
56 click==5.1
53 click==5.1
57 colander==1.2
54 colander==1.2
58 configobj==5.0.6
55 configobj==5.0.6
@@ -60,15 +57,18 b' cov-core==1.15.0'
60 coverage==3.7.1
57 coverage==3.7.1
61 cssselect==0.9.1
58 cssselect==0.9.1
62 decorator==3.4.2
59 decorator==3.4.2
60 deform==2.0a2
63 docutils==0.12
61 docutils==0.12
64 dogpile.cache==0.5.7
62 dogpile.cache==0.6.1
65 dogpile.core==0.4.1
63 dogpile.core==0.4.1
66 dulwich==0.12.0
64 dulwich==0.12.0
67 ecdsa==0.11
65 ecdsa==0.11
68 flake8==2.4.1
66 flake8==2.4.1
69 future==0.14.3
67 future==0.14.3
70 futures==3.0.2
68 futures==3.0.2
69 gevent==1.1.1
71 gprof2dot==2015.12.1
70 gprof2dot==2015.12.1
71 greenlet==0.4.9
72 gunicorn==19.6.0
72 gunicorn==19.6.0
73
73
74 # TODO: Needs subvertpy and blows up without Subversion headers,
74 # TODO: Needs subvertpy and blows up without Subversion headers,
@@ -94,9 +94,10 b' packaging==15.2'
94 paramiko==1.15.1
94 paramiko==1.15.1
95 pep8==1.5.7
95 pep8==1.5.7
96 psutil==2.2.1
96 psutil==2.2.1
97 psycopg2==2.6
97 psycopg2==2.6.1
98 py==1.4.29
98 py==1.4.29
99 py-bcrypt==0.4
99 py-bcrypt==0.4
100 py-gfm==0.1.3
100 pycrypto==2.6.1
101 pycrypto==2.6.1
101 pycurl==7.19.5
102 pycurl==7.19.5
102 pyflakes==0.8.1
103 pyflakes==0.8.1
@@ -123,7 +124,7 b' pyzmq==14.6.0'
123 # TODO: This is not available in public
124 # TODO: This is not available in public
124 # rc-testdata==0.2.0
125 # rc-testdata==0.2.0
125
126
126 https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.8.3.zip#md5=9acdfd71b8ddf4056057065f37ab9ccb
127 https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.10.0.zip#md5=4762391473ded761bead3aa58c748044
127
128
128
129
129 recaptcha-client==1.0.6
130 recaptcha-client==1.0.6
@@ -136,7 +137,7 b' setuptools-scm==1.11.0'
136 simplejson==3.7.2
137 simplejson==3.7.2
137 six==1.9.0
138 six==1.9.0
138 subprocess32==3.2.6
139 subprocess32==3.2.6
139 supervisor==3.1.3
140 supervisor==3.3.0
140 transifex-client==0.10
141 transifex-client==0.10
141 translationstring==1.3
142 translationstring==1.3
142 trollius==1.0.4
143 trollius==1.0.4
@@ -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 # link to config for pylons
43 # link to config for pylons
44 CONFIG = {}
44 CONFIG = {}
45
45
46 # Populated with the settings dictionary from application init in
47 # rhodecode.conf.environment.load_pyramid_environment
48 PYRAMID_SETTINGS = {}
49
46 # Linked module for extensions
50 # Linked module for extensions
47 EXTENSIONS = {}
51 EXTENSIONS = {}
48
52
49 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
53 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
50 __dbversion__ = 54 # defines current db version for migrations
54 __dbversion__ = 55 # defines current db version for migrations
51 __platform__ = platform.system()
55 __platform__ = platform.system()
52 __license__ = 'AGPLv3, and Commercial License'
56 __license__ = 'AGPLv3, and Commercial License'
53 __author__ = 'RhodeCode GmbH'
57 __author__ = 'RhodeCode GmbH'
@@ -80,6 +80,8 b' class NavigationRegistry(object):'
80 NavEntry('email', _('Email'), 'admin_settings_email'),
80 NavEntry('email', _('Email'), 'admin_settings_email'),
81 NavEntry('hooks', _('Hooks'), 'admin_settings_hooks'),
81 NavEntry('hooks', _('Hooks'), 'admin_settings_hooks'),
82 NavEntry('search', _('Full Text Search'), 'admin_settings_search'),
82 NavEntry('search', _('Full Text Search'), 'admin_settings_search'),
83 NavEntry('integrations', _('Integrations'),
84 'global_integrations_home', pyramid=True),
83 NavEntry('system', _('System Info'), 'admin_settings_system'),
85 NavEntry('system', _('System Info'), 'admin_settings_system'),
84 NavEntry('open_source', _('Open Source Licenses'),
86 NavEntry('open_source', _('Open Source Licenses'),
85 'admin_settings_open_source', pyramid=True),
87 'admin_settings_open_source', pyramid=True),
@@ -25,12 +25,15 b' import types'
25
25
26 import decorator
26 import decorator
27 import venusian
27 import venusian
28 from collections import OrderedDict
29
28 from pyramid.exceptions import ConfigurationError
30 from pyramid.exceptions import ConfigurationError
29 from pyramid.renderers import render
31 from pyramid.renderers import render
30 from pyramid.response import Response
32 from pyramid.response import Response
31 from pyramid.httpexceptions import HTTPNotFound
33 from pyramid.httpexceptions import HTTPNotFound
32
34
33 from rhodecode.api.exc import JSONRPCBaseError, JSONRPCError, JSONRPCForbidden
35 from rhodecode.api.exc import (
36 JSONRPCBaseError, JSONRPCError, JSONRPCForbidden, JSONRPCValidationError)
34 from rhodecode.lib.auth import AuthUser
37 from rhodecode.lib.auth import AuthUser
35 from rhodecode.lib.base import get_ip_addr
38 from rhodecode.lib.base import get_ip_addr
36 from rhodecode.lib.ext_json import json
39 from rhodecode.lib.ext_json import json
@@ -127,6 +130,11 b' def exception_view(exc, request):'
127 if isinstance(exc, JSONRPCError):
130 if isinstance(exc, JSONRPCError):
128 fault_message = exc.message
131 fault_message = exc.message
129 log.debug('json-rpc error rpc_id:%s "%s"', rpc_id, fault_message)
132 log.debug('json-rpc error rpc_id:%s "%s"', rpc_id, fault_message)
133 elif isinstance(exc, JSONRPCValidationError):
134 colander_exc = exc.colander_exception
135 #TODO: think maybe of nicer way to serialize errors ?
136 fault_message = colander_exc.asdict()
137 log.debug('json-rpc error rpc_id:%s "%s"', rpc_id, fault_message)
130 elif isinstance(exc, JSONRPCForbidden):
138 elif isinstance(exc, JSONRPCForbidden):
131 fault_message = 'Access was denied to this resource.'
139 fault_message = 'Access was denied to this resource.'
132 log.warning('json-rpc forbidden call rpc_id:%s "%s"', rpc_id, fault_message)
140 log.warning('json-rpc forbidden call rpc_id:%s "%s"', rpc_id, fault_message)
@@ -474,7 +482,7 b' def includeme(config):'
474 plugin_module, config.registry.settings)
482 plugin_module, config.registry.settings)
475
483
476 if not hasattr(config.registry, 'jsonrpc_methods'):
484 if not hasattr(config.registry, 'jsonrpc_methods'):
477 config.registry.jsonrpc_methods = {}
485 config.registry.jsonrpc_methods = OrderedDict()
478
486
479 # match filter by given method only
487 # match filter by given method only
480 config.add_view_predicate(
488 config.add_view_predicate(
@@ -27,5 +27,13 b' class JSONRPCError(JSONRPCBaseError):'
27 pass
27 pass
28
28
29
29
30 class JSONRPCValidationError(JSONRPCBaseError):
31
32 def __init__(self, *args, **kwargs):
33 self.colander_exception = kwargs.pop('colander_exc')
34 super(JSONRPCValidationError, self).__init__(*args, **kwargs)
35
36
30 class JSONRPCForbidden(JSONRPCBaseError):
37 class JSONRPCForbidden(JSONRPCBaseError):
31 pass
38 pass
39
@@ -43,7 +43,7 b' class TestApiCreateGist(object):'
43 description='foobar-gist',
43 description='foobar-gist',
44 gist_type=gist_type,
44 gist_type=gist_type,
45 acl_level=gist_acl_level,
45 acl_level=gist_acl_level,
46 files={'foobar': {'content': 'foo'}})
46 files={'foobar_ąć': {'content': 'foo'}})
47 response = api_call(self.app, params)
47 response = api_call(self.app, params)
48 response_json = response.json
48 response_json = response.json
49 gist = response_json['result']['gist']
49 gist = response_json['result']['gist']
@@ -68,6 +68,32 b' class TestApiCreateGist(object):'
68 finally:
68 finally:
69 Fixture().destroy_gists()
69 Fixture().destroy_gists()
70
70
71 @pytest.mark.parametrize("expected, lifetime, gist_type, gist_acl_level, files", [
72 ({'gist_type': '"ups" is not one of private, public'},
73 10, 'ups', Gist.ACL_LEVEL_PUBLIC, {'f': {'content': 'f'}}),
74
75 ({'lifetime': '-120 is less than minimum value -1'},
76 -120, Gist.GIST_PUBLIC, Gist.ACL_LEVEL_PUBLIC, {'f': {'content': 'f'}}),
77
78 ({'0.content': 'Required'},
79 10, Gist.GIST_PUBLIC, Gist.ACL_LEVEL_PUBLIC, {'f': {'x': 'f'}}),
80 ])
81 def test_api_try_create_gist(
82 self, expected, lifetime, gist_type, gist_acl_level, files):
83 id_, params = build_data(
84 self.apikey_regular, 'create_gist',
85 lifetime=lifetime,
86 description='foobar-gist',
87 gist_type=gist_type,
88 acl_level=gist_acl_level,
89 files=files)
90 response = api_call(self.app, params)
91
92 try:
93 assert_error(id_, expected, given=response.body)
94 finally:
95 Fixture().destroy_gists()
96
71 @mock.patch.object(GistModel, 'create', crash)
97 @mock.patch.object(GistModel, 'create', crash)
72 def test_api_create_gist_exception_occurred(self):
98 def test_api_create_gist_exception_occurred(self):
73 id_, params = build_data(self.apikey_regular, 'create_gist', files={})
99 id_, params = build_data(self.apikey_regular, 'create_gist', files={})
@@ -21,7 +21,7 b''
21
21
22 import pytest
22 import pytest
23
23
24 from rhodecode.api.views import depracated_api
24 from rhodecode.api.views import deprecated_api
25 from rhodecode.lib.ext_json import json
25 from rhodecode.lib.ext_json import json
26 from rhodecode.api.tests.utils import (
26 from rhodecode.api.tests.utils import (
27 build_data, api_call)
27 build_data, api_call)
@@ -30,7 +30,7 b' from rhodecode.api.tests.utils import ('
30 @pytest.mark.usefixtures("testuser_api", "app")
30 @pytest.mark.usefixtures("testuser_api", "app")
31 class TestCommitComment(object):
31 class TestCommitComment(object):
32 def test_deprecated_message_in_docstring(self):
32 def test_deprecated_message_in_docstring(self):
33 docstring = depracated_api.changeset_comment.__doc__
33 docstring = deprecated_api.changeset_comment.__doc__
34 assert '.. deprecated:: 3.4.0' in docstring
34 assert '.. deprecated:: 3.4.0' in docstring
35 assert 'Please use method `comment_commit` instead.' in docstring
35 assert 'Please use method `comment_commit` instead.' in docstring
36
36
@@ -73,6 +73,29 b' class TestGetRepoNodes(object):'
73 expected = 'failed to get repo: `%s` nodes' % (backend.repo_name,)
73 expected = 'failed to get repo: `%s` nodes' % (backend.repo_name,)
74 assert_error(id_, expected, given=response.body)
74 assert_error(id_, expected, given=response.body)
75
75
76 def test_api_get_repo_nodes_max_file_bytes(self, backend):
77 commit_id = 'tip'
78 path = '/'
79 max_file_bytes = 500
80
81 id_, params = build_data(
82 self.apikey, 'get_repo_nodes',
83 repoid=backend.repo_name, revision=commit_id, details='full',
84 root_path=path)
85 response = api_call(self.app, params)
86 assert any(file['content'] and len(file['content']) > max_file_bytes
87 for file in response.json['result'])
88
89 id_, params = build_data(
90 self.apikey, 'get_repo_nodes',
91 repoid=backend.repo_name, revision=commit_id,
92 root_path=path, details='full',
93 max_file_bytes=max_file_bytes)
94 response = api_call(self.app, params)
95 assert all(
96 file['content'] is None if file['size'] > max_file_bytes else True
97 for file in response.json['result'])
98
76 def test_api_get_repo_nodes_bad_ret_type(self, backend):
99 def test_api_get_repo_nodes_bad_ret_type(self, backend):
77 commit_id = 'tip'
100 commit_id = 'tip'
78 path = '/'
101 path = '/'
@@ -47,9 +47,14 b' class TestApiUpdateRepo(object):'
47 ({'enable_statistics': True}, SAME_AS_UPDATES),
47 ({'enable_statistics': True}, SAME_AS_UPDATES),
48 ({'enable_locking': True}, SAME_AS_UPDATES),
48 ({'enable_locking': True}, SAME_AS_UPDATES),
49 ({'enable_downloads': True}, SAME_AS_UPDATES),
49 ({'enable_downloads': True}, SAME_AS_UPDATES),
50 ({'name': 'new_repo_name'}, {'repo_name': 'new_repo_name'}),
50 ({'name': 'new_repo_name'}, {
51 ({'group': 'test_group_for_update'},
51 'repo_name': 'new_repo_name',
52 {'repo_name': 'test_group_for_update/%s' % UPDATE_REPO_NAME}),
52 'url': 'http://test.example.com:80/new_repo_name',
53 }),
54 ({'group': 'test_group_for_update'}, {
55 'repo_name': 'test_group_for_update/%s' % UPDATE_REPO_NAME,
56 'url': 'http://test.example.com:80/test_group_for_update/%s' % UPDATE_REPO_NAME
57 }),
53 ])
58 ])
54 def test_api_update_repo(self, updates, expected, backend):
59 def test_api_update_repo(self, updates, expected, backend):
55 repo_name = UPDATE_REPO_NAME
60 repo_name = UPDATE_REPO_NAME
@@ -34,8 +34,6 b' from rhodecode.lib.vcs.exceptions import'
34 log = logging.getLogger(__name__)
34 log = logging.getLogger(__name__)
35
35
36
36
37
38
39 class OAttr(object):
37 class OAttr(object):
40 """
38 """
41 Special Option that defines other attribute, and can default to them
39 Special Option that defines other attribute, and can default to them
1 NO CONTENT: file renamed from rhodecode/api/views/depracated_api.py to rhodecode/api/views/deprecated_api.py
NO CONTENT: file renamed from rhodecode/api/views/depracated_api.py to rhodecode/api/views/deprecated_api.py
@@ -23,6 +23,7 b' import logging'
23 import time
23 import time
24
24
25 from rhodecode.api import jsonrpc_method, JSONRPCError
25 from rhodecode.api import jsonrpc_method, JSONRPCError
26 from rhodecode.api.exc import JSONRPCValidationError
26 from rhodecode.api.utils import (
27 from rhodecode.api.utils import (
27 Optional, OAttr, get_gist_or_error, get_user_or_error,
28 Optional, OAttr, get_gist_or_error, get_user_or_error,
28 has_superadmin_permission)
29 has_superadmin_permission)
@@ -96,7 +97,8 b' def get_gists(request, apiuser, userid=O'
96
97
97 @jsonrpc_method()
98 @jsonrpc_method()
98 def create_gist(
99 def create_gist(
99 request, apiuser, files, owner=Optional(OAttr('apiuser')),
100 request, apiuser, files, gistid=Optional(None),
101 owner=Optional(OAttr('apiuser')),
100 gist_type=Optional(Gist.GIST_PUBLIC), lifetime=Optional(-1),
102 gist_type=Optional(Gist.GIST_PUBLIC), lifetime=Optional(-1),
101 acl_level=Optional(Gist.ACL_LEVEL_PUBLIC),
103 acl_level=Optional(Gist.ACL_LEVEL_PUBLIC),
102 description=Optional('')):
104 description=Optional('')):
@@ -108,10 +110,11 b' def create_gist('
108 :param files: files to be added to the gist. The data structure has
110 :param files: files to be added to the gist. The data structure has
109 to match the following example::
111 to match the following example::
110
112
111 {'filename': {'content':'...', 'lexer': null},
113 {'filename1': {'content':'...'}, 'filename2': {'content':'...'}}
112 'filename2': {'content':'...', 'lexer': null}}
113
114
114 :type files: dict
115 :type files: dict
116 :param gistid: Set a custom id for the gist
117 :type gistid: Optional(str)
115 :param owner: Set the gist owner, defaults to api method caller
118 :param owner: Set the gist owner, defaults to api method caller
116 :type owner: Optional(str or int)
119 :type owner: Optional(str or int)
117 :param gist_type: type of gist ``public`` or ``private``
120 :param gist_type: type of gist ``public`` or ``private``
@@ -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 try:
168 try:
153 if isinstance(owner, Optional):
169 nodes = gist_schema.nodes_to_sequence(
154 owner = apiuser.user_id
170 files, colander_node=schema.get('nodes'))
171
172 schema_data = schema.deserialize(dict(
173 gistid=Optional.extract(gistid),
174 description=Optional.extract(description),
175 gist_type=Optional.extract(gist_type),
176 lifetime=lifetime,
177 gist_acl_level=Optional.extract(acl_level),
178 nodes=nodes
179 ))
155
180
156 owner = get_user_or_error(owner)
181 # convert to safer format with just KEYs so we sure no duplicates
157 description = Optional.extract(description)
182 schema_data['nodes'] = gist_schema.sequence_to_nodes(
158 gist_type = Optional.extract(gist_type)
183 schema_data['nodes'], colander_node=schema.get('nodes'))
159 lifetime = Optional.extract(lifetime)
184
160 acl_level = Optional.extract(acl_level)
185 except validation_schema.Invalid as err:
186 raise JSONRPCValidationError(colander_exc=err)
161
187
162 gist = GistModel().create(description=description,
188 try:
163 owner=owner,
189 gist = GistModel().create(
164 gist_mapping=files,
190 owner=owner,
165 gist_type=gist_type,
191 gist_id=schema_data['gistid'],
166 lifetime=lifetime,
192 description=schema_data['description'],
167 gist_acl_level=acl_level)
193 gist_mapping=schema_data['nodes'],
194 gist_type=schema_data['gist_type'],
195 lifetime=schema_data['lifetime'],
196 gist_acl_level=schema_data['gist_acl_level'])
168 Session().commit()
197 Session().commit()
169 return {
198 return {
170 'msg': 'created new gist',
199 'msg': 'created new gist',
@@ -265,7 +265,7 b' def merge_pull_request(request, apiuser,'
265 PullRequestModel().close_pull_request(
265 PullRequestModel().close_pull_request(
266 pull_request.pull_request_id, apiuser)
266 pull_request.pull_request_id, apiuser)
267
267
268 Session.commit()
268 Session().commit()
269 return data
269 return data
270
270
271
271
@@ -319,7 +319,7 b' def close_pull_request(request, apiuser,'
319
319
320 PullRequestModel().close_pull_request(
320 PullRequestModel().close_pull_request(
321 pull_request.pull_request_id, apiuser)
321 pull_request.pull_request_id, apiuser)
322 Session.commit()
322 Session().commit()
323 data = {
323 data = {
324 'pull_request_id': pull_request.pull_request_id,
324 'pull_request_id': pull_request.pull_request_id,
325 'closed': True,
325 'closed': True,
@@ -408,6 +408,8 b' def comment_pull_request(request, apiuse'
408 line_no=None,
408 line_no=None,
409 status_change=(ChangesetStatus.get_status_lbl(status)
409 status_change=(ChangesetStatus.get_status_lbl(status)
410 if status and allowed_to_change_status else None),
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 closing_pr=False,
413 closing_pr=False,
412 renderer=renderer
414 renderer=renderer
413 )
415 )
@@ -43,8 +43,8 b' from rhodecode.model.db import ('
43 from rhodecode.model.repo import RepoModel
43 from rhodecode.model.repo import RepoModel
44 from rhodecode.model.repo_group import RepoGroupModel
44 from rhodecode.model.repo_group import RepoGroupModel
45 from rhodecode.model.scm import ScmModel, RepoList
45 from rhodecode.model.scm import ScmModel, RepoList
46 from rhodecode.model.settings import SettingsModel
46 from rhodecode.model.settings import SettingsModel, VcsSettingsModel
47 from rhodecode.model.validation_schema import RepoSchema
47 from rhodecode.model.validation_schema.schemas import repo_schema
48
48
49 log = logging.getLogger(__name__)
49 log = logging.getLogger(__name__)
50
50
@@ -400,7 +400,8 b' def get_repo_changesets(request, apiuser'
400
400
401 @jsonrpc_method()
401 @jsonrpc_method()
402 def get_repo_nodes(request, apiuser, repoid, revision, root_path,
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 Returns a list of nodes and children in a flat list for a given
406 Returns a list of nodes and children in a flat list for a given
406 path at given revision.
407 path at given revision.
@@ -425,6 +426,8 b' def get_repo_nodes(request, apiuser, rep'
425 md5, binary, and or content. The valid options are ``basic`` and
426 md5, binary, and or content. The valid options are ``basic`` and
426 ``full``.
427 ``full``.
427 :type details: Optional(str)
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 Example output:
432 Example output:
430
433
@@ -472,7 +475,8 b' def get_repo_nodes(request, apiuser, rep'
472
475
473 _d, _f = ScmModel().get_nodes(
476 _d, _f = ScmModel().get_nodes(
474 repo, revision, root_path, flat=False,
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 _map = {
480 _map = {
477 'all': _d + _f,
481 'all': _d + _f,
478 'files': _f,
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 try:
614 try:
611 data = schema.deserialize({
615 data = schema.deserialize({
612 'repo_name': repo_name
616 'repo_name': repo_name
@@ -1310,8 +1314,6 b' def comment_commit('
1310 userid=Optional(OAttr('apiuser')), status=Optional(None)):
1314 userid=Optional(OAttr('apiuser')), status=Optional(None)):
1311 """
1315 """
1312 Set a commit comment, and optionally change the status of the commit.
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 :param apiuser: This is filled automatically from the |authtoken|.
1318 :param apiuser: This is filled automatically from the |authtoken|.
1317 :type apiuser: AuthUser
1319 :type apiuser: AuthUser
@@ -1344,7 +1346,7 b' def comment_commit('
1344 """
1346 """
1345 repo = get_repo_or_error(repoid)
1347 repo = get_repo_or_error(repoid)
1346 if not has_superadmin_permission(apiuser):
1348 if not has_superadmin_permission(apiuser):
1347 _perms = ('repository.admin',)
1349 _perms = ('repository.read', 'repository.write', 'repository.admin')
1348 has_repo_permissions(apiuser, repoid, repo, _perms)
1350 has_repo_permissions(apiuser, repoid, repo, _perms)
1349
1351
1350 if isinstance(userid, Optional):
1352 if isinstance(userid, Optional):
@@ -1361,9 +1363,11 b' def comment_commit('
1361 try:
1363 try:
1362 rc_config = SettingsModel().get_all_settings()
1364 rc_config = SettingsModel().get_all_settings()
1363 renderer = rc_config.get('rhodecode_markup_renderer', 'rst')
1365 renderer = rc_config.get('rhodecode_markup_renderer', 'rst')
1364
1366 status_change_label = ChangesetStatus.get_status_lbl(status)
1365 comm = ChangesetCommentsModel().create(
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 renderer=renderer)
1371 renderer=renderer)
1368 if status:
1372 if status:
1369 # also do a status change
1373 # also do a status change
@@ -1775,3 +1779,110 b' def strip(request, apiuser, repoid, revi'
1775 'Unable to strip commit %s from repo `%s`' % (
1779 'Unable to strip commit %s from repo `%s`' % (
1776 revision, repo.repo_name)
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 from rhodecode.model.db import Session, RepoGroup
34 from rhodecode.model.db import Session, RepoGroup
35 from rhodecode.model.repo_group import RepoGroupModel
35 from rhodecode.model.repo_group import RepoGroupModel
36 from rhodecode.model.scm import RepoGroupList
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 log = logging.getLogger(__name__)
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 try:
197 try:
198 data = schema.deserialize({
198 data = schema.deserialize({
199 'group_name': group_name
199 'group_name': group_name
@@ -490,20 +490,26 b' def loadplugin(plugin_id):'
490 or None on failure.
490 or None on failure.
491 """
491 """
492 # TODO: Disusing pyramids thread locals to retrieve the registry.
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 plugin = authn_registry.get_plugin(plugin_id)
494 plugin = authn_registry.get_plugin(plugin_id)
495 if plugin is None:
495 if plugin is None:
496 log.error('Authentication plugin not found: "%s"', plugin_id)
496 log.error('Authentication plugin not found: "%s"', plugin_id)
497 return plugin
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 def get_auth_cache_manager(custom_ttl=None):
506 def get_auth_cache_manager(custom_ttl=None):
501 return caches.get_cache_manager(
507 return caches.get_cache_manager(
502 'auth_plugins', 'rhodecode.authentication', custom_ttl)
508 'auth_plugins', 'rhodecode.authentication', custom_ttl)
503
509
504
510
505 def authenticate(username, password, environ=None, auth_type=None,
511 def authenticate(username, password, environ=None, auth_type=None,
506 skip_missing=False):
512 skip_missing=False, registry=None):
507 """
513 """
508 Authentication function used for access control,
514 Authentication function used for access control,
509 It tries to authenticate based on enabled authentication modules.
515 It tries to authenticate based on enabled authentication modules.
@@ -520,7 +526,7 b' def authenticate(username, password, env'
520 % auth_type)
526 % auth_type)
521 headers_only = environ and not (username and password)
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 for plugin in authn_registry.get_plugins_for_authentication():
530 for plugin in authn_registry.get_plugins_for_authentication():
525 plugin.set_auth_type(auth_type)
531 plugin.set_auth_type(auth_type)
526 user = plugin.get_user(username)
532 user = plugin.get_user(username)
@@ -559,16 +565,16 b' def authenticate(username, password, env'
559 if isinstance(plugin.AUTH_CACHE_TTL, (int, long)):
565 if isinstance(plugin.AUTH_CACHE_TTL, (int, long)):
560 # plugin cache set inside is more important than the settings value
566 # plugin cache set inside is more important than the settings value
561 _cache_ttl = plugin.AUTH_CACHE_TTL
567 _cache_ttl = plugin.AUTH_CACHE_TTL
562 elif plugin_settings.get('auth_cache_ttl'):
568 elif plugin_settings.get('cache_ttl'):
563 _cache_ttl = safe_int(plugin_settings.get('auth_cache_ttl'), 0)
569 _cache_ttl = safe_int(plugin_settings.get('cache_ttl'), 0)
564
570
565 plugin_cache_active = bool(_cache_ttl and _cache_ttl > 0)
571 plugin_cache_active = bool(_cache_ttl and _cache_ttl > 0)
566
572
567 # get instance of cache manager configured for a namespace
573 # get instance of cache manager configured for a namespace
568 cache_manager = get_auth_cache_manager(custom_ttl=_cache_ttl)
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(),
576 log.debug('AUTH_CACHE_TTL for plugin `%s` active: %s (TTL: %s)',
571 plugin_cache_active)
577 plugin.get_id(), plugin_cache_active, _cache_ttl)
572
578
573 # for environ based password can be empty, but then the validation is
579 # for environ based password can be empty, but then the validation is
574 # on the server that fills in the env data needed for authentication
580 # on the server that fills in the env data needed for authentication
@@ -581,8 +587,7 b' def authenticate(username, password, env'
581 # to RhodeCode database. If this function returns data
587 # to RhodeCode database. If this function returns data
582 # then auth is correct.
588 # then auth is correct.
583 start = time.time()
589 start = time.time()
584 log.debug('Running plugin `%s` _authenticate method',
590 log.debug('Running plugin `%s` _authenticate method', plugin.get_id())
585 plugin.get_id())
586
591
587 def auth_func():
592 def auth_func():
588 """
593 """
@@ -141,9 +141,9 b' class LdapSettingsSchema(AuthnPluginSett'
141 colander.String(),
141 colander.String(),
142 default='',
142 default='',
143 description=_('LDAP Attribute to map to user name'),
143 description=_('LDAP Attribute to map to user name'),
144 missing_msg=_('The LDAP Login attribute of the CN must be specified'),
145 preparer=strip_whitespace,
144 preparer=strip_whitespace,
146 title=_('Login Attribute'),
145 title=_('Login Attribute'),
146 missing_msg=_('The LDAP Login attribute of the CN must be specified'),
147 widget='string')
147 widget='string')
148 attr_firstname = colander.SchemaNode(
148 attr_firstname = colander.SchemaNode(
149 colander.String(),
149 colander.String(),
@@ -186,6 +186,7 b' class AuthLdap(object):'
186 if ldap == Missing:
186 if ldap == Missing:
187 raise LdapImportError("Missing or incompatible ldap library")
187 raise LdapImportError("Missing or incompatible ldap library")
188
188
189 self.debug = False
189 self.ldap_version = ldap_version
190 self.ldap_version = ldap_version
190 self.ldap_server_type = 'ldap'
191 self.ldap_server_type = 'ldap'
191
192
@@ -213,6 +214,8 b' class AuthLdap(object):'
213 self.LDAP_FILTER = safe_str(ldap_filter)
214 self.LDAP_FILTER = safe_str(ldap_filter)
214
215
215 def _get_ldap_server(self):
216 def _get_ldap_server(self):
217 if self.debug:
218 ldap.set_option(ldap.OPT_DEBUG_LEVEL, 255)
216 if hasattr(ldap, 'OPT_X_TLS_CACERTDIR'):
219 if hasattr(ldap, 'OPT_X_TLS_CACERTDIR'):
217 ldap.set_option(ldap.OPT_X_TLS_CACERTDIR,
220 ldap.set_option(ldap.OPT_X_TLS_CACERTDIR,
218 '/etc/openldap/cacerts')
221 '/etc/openldap/cacerts')
@@ -137,5 +137,7 b' class RhodeCodeAuthPlugin(RhodeCodeAuthP'
137 "authenticating on this plugin", userobj)
137 "authenticating on this plugin", userobj)
138 return None
138 return None
139 else:
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 return None
143 return None
@@ -83,13 +83,17 b' class RhodeCodeAuthPlugin(RhodeCodeAuthP'
83 allowed_auth_plugins=None, allowed_auth_sources=None):
83 allowed_auth_plugins=None, allowed_auth_sources=None):
84 """
84 """
85 Custom method for this auth that doesn't accept empty users. And also
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
86 allows users from all other active plugins to use it and also
87 via vcs mode
87 authenticate against it. But only via vcs mode
88 """
88 """
89 # only this and rhodecode plugins can use this type
89 from rhodecode.authentication.base import get_authn_registry
90 from rhodecode.authentication.plugins import auth_rhodecode
90 authn_registry = get_authn_registry()
91 allowed_auth_plugins = [
91
92 self.name, auth_rhodecode.RhodeCodeAuthPlugin.name]
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 # only for vcs operations
97 # only for vcs operations
94 allowed_auth_sources = [VCS_TYPE]
98 allowed_auth_sources = [VCS_TYPE]
95
99
@@ -26,8 +26,8 b' from pyramid.httpexceptions import HTTPF'
26 from pyramid.renderers import render
26 from pyramid.renderers import render
27 from pyramid.response import Response
27 from pyramid.response import Response
28
28
29 from rhodecode.authentication.base import get_auth_cache_manager
29 from rhodecode.authentication.base import (
30 from rhodecode.authentication.interface import IAuthnPluginRegistry
30 get_auth_cache_manager, get_authn_registry)
31 from rhodecode.lib import auth
31 from rhodecode.lib import auth
32 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
32 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
33 from rhodecode.model.forms import AuthSettingsForm
33 from rhodecode.model.forms import AuthSettingsForm
@@ -96,7 +96,7 b' class AuthnPluginViewBase(object):'
96 # Store validated data.
96 # Store validated data.
97 for name, value in valid_data.items():
97 for name, value in valid_data.items():
98 self.plugin.create_or_update_setting(name, value)
98 self.plugin.create_or_update_setting(name, value)
99 Session.commit()
99 Session().commit()
100
100
101 # Display success message and redirect.
101 # Display success message and redirect.
102 self.request.session.flash(
102 self.request.session.flash(
@@ -125,7 +125,7 b' class AuthSettingsView(object):'
125 @HasPermissionAllDecorator('hg.admin')
125 @HasPermissionAllDecorator('hg.admin')
126 def index(self, defaults=None, errors=None, prefix_error=False):
126 def index(self, defaults=None, errors=None, prefix_error=False):
127 defaults = defaults or {}
127 defaults = defaults or {}
128 authn_registry = self.request.registry.getUtility(IAuthnPluginRegistry)
128 authn_registry = get_authn_registry(self.request.registry)
129 enabled_plugins = SettingsModel().get_auth_plugins()
129 enabled_plugins = SettingsModel().get_auth_plugins()
130
130
131 # Create template context and render it.
131 # Create template context and render it.
@@ -30,36 +30,6 b' from rhodecode.lib.utils2 import __get_l'
30 # extensions will index it's content
30 # extensions will index it's content
31 LANGUAGES_EXTENSIONS_MAP = __get_lem()
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 DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
33 DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
64
34
65 DATE_FORMAT = "%Y-%m-%d"
35 DATE_FORMAT = "%Y-%m-%d"
@@ -34,11 +34,16 b' from pylons.configuration import PylonsC'
34 from pylons.error import handle_mako_error
34 from pylons.error import handle_mako_error
35 from pyramid.settings import asbool
35 from pyramid.settings import asbool
36
36
37 # don't remove this import it does magic for celery
37 # ------------------------------------------------------------------------------
38 from rhodecode.lib import celerypylons # noqa
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 from rhodecode.config import utils
47 from rhodecode.config import utils
43 from rhodecode.config.routing import make_map
48 from rhodecode.config.routing import make_map
44 from rhodecode.config.jsroutes import generate_jsroutes_content
49 from rhodecode.config.jsroutes import generate_jsroutes_content
@@ -112,25 +117,12 b' def load_environment(global_conf, app_co'
112 # sets the c attribute access when don't existing attribute are accessed
117 # sets the c attribute access when don't existing attribute are accessed
113 config['pylons.strict_tmpl_context'] = True
118 config['pylons.strict_tmpl_context'] = True
114
119
115 # Limit backends to "vcs.backends" from configuration
120 # configure channelstream
116 backends = config['vcs.backends'] = aslist(
121 config['channelstream_config'] = {
117 config.get('vcs.backends', 'hg,git'), sep=',')
122 'enabled': asbool(config.get('channelstream.enabled', False)),
118 for alias in rhodecode.BACKENDS.keys():
123 'server': config.get('channelstream.server'),
119 if alias not in backends:
124 'secret': config.get('channelstream.secret')
120 del rhodecode.BACKENDS[alias]
125 }
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'])
134
126
135 set_available_permissions(config)
127 set_available_permissions(config)
136 db_cfg = make_db_config(clear_session=True)
128 db_cfg = make_db_config(clear_session=True)
@@ -138,9 +130,6 b' def load_environment(global_conf, app_co'
138 repos_path = list(db_cfg.items('paths'))[0][1]
130 repos_path = list(db_cfg.items('paths'))[0][1]
139 config['base_path'] = repos_path
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 # store db config also in main global CONFIG
133 # store db config also in main global CONFIG
145 set_rhodecode_config(config)
134 set_rhodecode_config(config)
146
135
@@ -153,34 +142,17 b' def load_environment(global_conf, app_co'
153 # store config reference into our module to skip import magic of pylons
142 # store config reference into our module to skip import magic of pylons
154 rhodecode.CONFIG.update(config)
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 return config
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 def load_pyramid_environment(global_config, settings):
148 def load_pyramid_environment(global_config, settings):
180 # Some parts of the code expect a merge of global and app settings.
149 # Some parts of the code expect a merge of global and app settings.
181 settings_merged = global_config.copy()
150 settings_merged = global_config.copy()
182 settings_merged.update(settings)
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 # If this is a test run we prepare the test environment like
156 # If this is a test run we prepare the test environment like
185 # creating a test database, test search index and test repositories.
157 # creating a test database, test search index and test repositories.
186 # This has to be done before the database connection is initialized.
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 # Initialize the database connection.
163 # Initialize the database connection.
192 utils.initialize_database(settings_merged)
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 Pylons middleware initialization
22 Pylons middleware initialization
23 """
23 """
24 import logging
24 import logging
25 from collections import OrderedDict
25
26
26 from paste.registry import RegistryManager
27 from paste.registry import RegistryManager
27 from paste.gzipper import make_gzip_middleware
28 from paste.gzipper import make_gzip_middleware
28 from pylons.wsgiapp import PylonsApp
29 from pylons.wsgiapp import PylonsApp
29 from pyramid.authorization import ACLAuthorizationPolicy
30 from pyramid.authorization import ACLAuthorizationPolicy
30 from pyramid.config import Configurator
31 from pyramid.config import Configurator
31 from pyramid.static import static_view
32 from pyramid.settings import asbool, aslist
32 from pyramid.settings import asbool, aslist
33 from pyramid.wsgi import wsgiapp
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 import pyramid.httpexceptions as httpexceptions
36 import pyramid.httpexceptions as httpexceptions
36 from pyramid.renderers import render_to_response, render
37 from pyramid.renderers import render_to_response
37 from routes.middleware import RoutesMiddleware
38 from routes.middleware import RoutesMiddleware
38 import routes.util
39 import routes.util
39
40
40 import rhodecode
41 import rhodecode
41 from rhodecode.config import patches
42 from rhodecode.config import patches
43 from rhodecode.config.routing import STATIC_FILE_PREFIX
42 from rhodecode.config.environment import (
44 from rhodecode.config.environment import (
43 load_environment, load_pyramid_environment)
45 load_environment, load_pyramid_environment)
44 from rhodecode.lib.middleware import csrf
46 from rhodecode.lib.middleware import csrf
@@ -47,24 +49,45 b' from rhodecode.lib.middleware.disable_vc'
47 from rhodecode.lib.middleware.https_fixup import HttpsFixup
49 from rhodecode.lib.middleware.https_fixup import HttpsFixup
48 from rhodecode.lib.middleware.vcs import VCSMiddleware
50 from rhodecode.lib.middleware.vcs import VCSMiddleware
49 from rhodecode.lib.plugins.utils import register_rhodecode_plugin
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 log = logging.getLogger(__name__)
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 """Create a Pylons WSGI application and return it
85 """Create a Pylons WSGI application and return it
57
86
58 ``global_conf``
87 ``global_conf``
59 The inherited configuration for this application. Normally from
88 The inherited configuration for this application. Normally from
60 the [DEFAULT] section of the Paste ini file.
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 ``app_conf``
91 ``app_conf``
69 The application's local configuration. Normally specified in
92 The application's local configuration. Normally specified in
70 the [app:<name>] section of the Paste ini file (where <name>
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 app = csrf.OriginChecker(app, expected_origin,
112 app = csrf.OriginChecker(app, expected_origin,
90 skip_urls=[routes.util.url_for('api')])
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 # Establish the Registry for this application
115 # Establish the Registry for this application
103 app = RegistryManager(app)
116 app = RegistryManager(app)
104
117
@@ -140,13 +153,78 b' def make_pyramid_app(global_config, **se'
140
153
141 load_pyramid_environment(global_config, settings)
154 load_pyramid_environment(global_config, settings)
142
155
156 includeme_first(config)
143 includeme(config)
157 includeme(config)
144 includeme_last(config)
145 pyramid_app = config.make_wsgi_app()
158 pyramid_app = config.make_wsgi_app()
146 pyramid_app = wrap_app_in_wsgi_middlewares(pyramid_app, config)
159 pyramid_app = wrap_app_in_wsgi_middlewares(pyramid_app, config)
160 pyramid_app.config = config
147 return pyramid_app
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 def add_pylons_compat_data(registry, global_config, settings):
228 def add_pylons_compat_data(registry, global_config, settings):
151 """
229 """
152 Attach data to the registry to support the Pylons integration.
230 Attach data to the registry to support the Pylons integration.
@@ -205,20 +283,32 b' def error_handler(exception, request):'
205 def includeme(config):
283 def includeme(config):
206 settings = config.registry.settings
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 if asbool(settings.get('appenlight', 'false')):
292 if asbool(settings.get('appenlight', 'false')):
209 config.include('appenlight_client.ext.pyramid_tween')
293 config.include('appenlight_client.ext.pyramid_tween')
210
294
211 # Includes which are required. The application would fail without them.
295 # Includes which are required. The application would fail without them.
212 config.include('pyramid_mako')
296 config.include('pyramid_mako')
213 config.include('pyramid_beaker')
297 config.include('pyramid_beaker')
298 config.include('rhodecode.channelstream')
214 config.include('rhodecode.admin')
299 config.include('rhodecode.admin')
215 config.include('rhodecode.authentication')
300 config.include('rhodecode.authentication')
301 config.include('rhodecode.integrations')
216 config.include('rhodecode.login')
302 config.include('rhodecode.login')
217 config.include('rhodecode.tweens')
303 config.include('rhodecode.tweens')
218 config.include('rhodecode.api')
304 config.include('rhodecode.api')
305 config.include('rhodecode.svn_support')
219 config.add_route(
306 config.add_route(
220 'rhodecode_support', 'https://rhodecode.com/help/', static=True)
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 # Set the authorization policy.
312 # Set the authorization policy.
223 authz_policy = ACLAuthorizationPolicy()
313 authz_policy = ACLAuthorizationPolicy()
224 config.set_authorization_policy(authz_policy)
314 config.set_authorization_policy(authz_policy)
@@ -226,86 +316,37 b' def includeme(config):'
226 # Set the default renderer for HTML templates to mako.
316 # Set the default renderer for HTML templates to mako.
227 config.add_mako_renderer('.html')
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 # include RhodeCode plugins
319 # include RhodeCode plugins
235 includes = aslist(settings.get('rhodecode.includes', []))
320 includes = aslist(settings.get('rhodecode.includes', []))
236 for inc in includes:
321 for inc in includes:
237 config.include(inc)
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 # This is the glue which allows us to migrate in chunks. By registering the
324 # This is the glue which allows us to migrate in chunks. By registering the
273 # pylons based application as the "Not Found" view in Pyramid, we will
325 # pylons based application as the "Not Found" view in Pyramid, we will
274 # fallback to the old application each time the new one does not yet know
326 # fallback to the old application each time the new one does not yet know
275 # how to handle a request.
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):
330 if not settings.get('debugtoolbar.enabled', False):
279 # if toolbar, then only http type exceptions get caught and rendered
280 ExcClass = HTTPError
281 else:
282 # if no toolbar, then any exception gets caught and rendered
331 # if no toolbar, then any exception gets caught and rendered
283 ExcClass = Exception
332 config.add_view(error_handler, context=Exception)
284 config.add_view(error_handler, context=ExcClass)
333
334 config.add_view(error_handler, context=HTTPError)
285
335
286
336
287 def includeme_last(config):
337 def includeme_first(config):
288 """
338 # redirect automatic browser favicon.ico requests to correct place
289 The static file catchall needs to be last in the view configuration.
339 def favicon_redirect(context, request):
290 """
340 return HTTPFound(
291 settings = config.registry.settings
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
343 config.add_view(favicon_redirect, route_name='favicon')
294 # point, e.g. move them under '_static/'. This would fully avoid that we
344 config.add_route('favicon', '/favicon.ico')
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.
303
345
304 # Serving static files with a catchall.
346 config.add_static_view(
305 if settings['static_files']:
347 '_static/deform', 'deform:static')
306 config.add_route('catchall_static', '/*subpath')
348 config.add_static_view(
307 config.add_view(
349 '_static/rhodecode', path='rhodecode:public', cache_max_age=3600 * 24)
308 static_view('rhodecode:public'), route_name='catchall_static')
309
350
310
351
311 def wrap_app_in_wsgi_middlewares(pyramid_app, config):
352 def wrap_app_in_wsgi_middlewares(pyramid_app, config):
@@ -322,19 +363,14 b' def wrap_app_in_wsgi_middlewares(pyramid'
322 pyramid_app = HttpsFixup(pyramid_app, settings)
363 pyramid_app = HttpsFixup(pyramid_app, settings)
323
364
324 # Add RoutesMiddleware to support the pylons compatibility tween during
365 # Add RoutesMiddleware to support the pylons compatibility tween during
325
326 # migration to pyramid.
366 # migration to pyramid.
327 pyramid_app = RoutesMiddleware(
367 pyramid_app = SkippableRoutesMiddleware(
328 pyramid_app, config.registry._pylons_compat_config['routes.map'])
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')):
371 pyramid_app, _ = wrap_in_appenlight_if_enabled(pyramid_app, settings)
331 pyramid_app, _ = wrap_in_appenlight_if_enabled(
332 pyramid_app, config.registry._pylons_compat_config)
333
372
334 # TODO: johbo: Don't really see why we enable the gzip middleware when
373 if settings['gzip_responses']:
335 # serving static files, might be something that should have its own setting
336 # as well?
337 if settings['static_files']:
338 pyramid_app = make_gzip_middleware(
374 pyramid_app = make_gzip_middleware(
339 pyramid_app, settings, compress_level=1)
375 pyramid_app, settings, compress_level=1)
340
376
@@ -376,12 +412,63 b' def sanitize_settings_and_apply_defaults'
376 # should allow to pass in a prefix.
412 # should allow to pass in a prefix.
377 settings.setdefault('rhodecode.api.url', '/_admin/api')
413 settings.setdefault('rhodecode.api.url', '/_admin/api')
378
414
379 _bool_setting(settings, 'vcs.server.enable', 'true')
415 # Sanitize generic settings.
380 _bool_setting(settings, 'static_files', 'true')
416 _list_setting(settings, 'default_encoding', 'UTF-8')
381 _bool_setting(settings, 'is_test', 'false')
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 return settings
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 def _bool_setting(settings, name, default):
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 # prefix for non repository related links needs to be prefixed with `/`
37 # prefix for non repository related links needs to be prefixed with `/`
38 ADMIN_PREFIX = '/_admin'
38 ADMIN_PREFIX = '/_admin'
39 STATIC_FILE_PREFIX = '/_static'
39
40
40 # Default requirements for URL parts
41 # Default requirements for URL parts
41 URL_NAME_REQUIREMENTS = {
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 class JSRoutesMapper(Mapper):
68 class JSRoutesMapper(Mapper):
55 """
69 """
56 Wrapper for routes.Mapper to make pyroutes compatible url definitions
70 Wrapper for routes.Mapper to make pyroutes compatible url definitions
@@ -546,6 +560,13 b' def make_map(config):'
546 action='my_account_auth_tokens_add', conditions={'method': ['POST']})
560 action='my_account_auth_tokens_add', conditions={'method': ['POST']})
547 m.connect('my_account_auth_tokens', '/my_account/auth_tokens',
561 m.connect('my_account_auth_tokens', '/my_account/auth_tokens',
548 action='my_account_auth_tokens_delete', conditions={'method': ['DELETE']})
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 # NOTIFICATION REST ROUTES
571 # NOTIFICATION REST ROUTES
551 with rmap.submapper(path_prefix=ADMIN_PREFIX,
572 with rmap.submapper(path_prefix=ADMIN_PREFIX,
@@ -554,7 +575,6 b' def make_map(config):'
554 action='index', conditions={'method': ['GET']})
575 action='index', conditions={'method': ['GET']})
555 m.connect('notifications_mark_all_read', '/notifications/mark_all_read',
576 m.connect('notifications_mark_all_read', '/notifications/mark_all_read',
556 action='mark_all_read', conditions={'method': ['POST']})
577 action='mark_all_read', conditions={'method': ['POST']})
557
558 m.connect('/notifications/{notification_id}',
578 m.connect('/notifications/{notification_id}',
559 action='update', conditions={'method': ['PUT']})
579 action='update', conditions={'method': ['PUT']})
560 m.connect('/notifications/{notification_id}',
580 m.connect('/notifications/{notification_id}',
@@ -850,7 +870,7 b' def make_map(config):'
850 conditions={'function': check_repo, 'method': ['DELETE']},
870 conditions={'function': check_repo, 'method': ['DELETE']},
851 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
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 controller='changeset', action='changeset_info',
874 controller='changeset', action='changeset_info',
855 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
875 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
856
876
@@ -1090,9 +1110,9 b' def make_map(config):'
1090 conditions={'function': check_repo},
1110 conditions={'function': check_repo},
1091 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
1111 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
1092
1112
1093 rmap.connect('files_metadata_list_home',
1113 rmap.connect('files_nodetree_full',
1094 '/{repo_name}/metadata_list/{revision}/{f_path}',
1114 '/{repo_name}/nodetree_full/{commit_id}/{f_path}',
1095 controller='files', action='metadata_list',
1115 controller='files', action='nodetree_full',
1096 conditions={'function': check_repo},
1116 conditions={'function': check_repo},
1097 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
1117 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
1098
1118
@@ -49,22 +49,18 b' def configure_vcs(config):'
49 Patch VCS config with some RhodeCode specific stuff
49 Patch VCS config with some RhodeCode specific stuff
50 """
50 """
51 from rhodecode.lib.vcs import conf
51 from rhodecode.lib.vcs import conf
52 from rhodecode.lib.utils2 import aslist
53 conf.settings.BACKENDS = {
52 conf.settings.BACKENDS = {
54 'hg': 'rhodecode.lib.vcs.backends.hg.MercurialRepository',
53 'hg': 'rhodecode.lib.vcs.backends.hg.MercurialRepository',
55 'git': 'rhodecode.lib.vcs.backends.git.GitRepository',
54 'git': 'rhodecode.lib.vcs.backends.git.GitRepository',
56 'svn': 'rhodecode.lib.vcs.backends.svn.SubversionRepository',
55 'svn': 'rhodecode.lib.vcs.backends.svn.SubversionRepository',
57 }
56 }
58
57
59 conf.settings.HG_USE_REBASE_FOR_MERGING = config.get(
58 conf.settings.HOOKS_PROTOCOL = config['vcs.hooks.protocol']
60 'rhodecode_hg_use_rebase_for_merging', False)
59 conf.settings.HOOKS_DIRECT_CALLS = config['vcs.hooks.direct_calls']
61 conf.settings.GIT_REV_FILTER = shlex.split(
60 conf.settings.GIT_REV_FILTER = shlex.split(config['git_rev_filter'])
62 config.get('git_rev_filter', '--all').strip())
61 conf.settings.DEFAULT_ENCODINGS = config['default_encoding']
63 conf.settings.DEFAULT_ENCODINGS = aslist(config.get('default_encoding',
62 conf.settings.ALIASES[:] = config['vcs.backends']
64 'UTF-8'), sep=',')
63 conf.settings.SVN_COMPATIBLE_VERSION = config['vcs.svn.compatible_version']
65 conf.settings.ALIASES[:] = config.get('vcs.backends')
66 conf.settings.SVN_COMPATIBLE_VERSION = config.get(
67 'vcs.svn.compatible_version')
68
64
69
65
70 def initialize_database(config):
66 def initialize_database(config):
@@ -90,8 +86,7 b' def initialize_test_environment(settings'
90
86
91
87
92 def get_vcs_server_protocol(config):
88 def get_vcs_server_protocol(config):
93 protocol = config.get('vcs.server.protocol', 'pyro4')
89 return config['vcs.server.protocol']
94 return protocol
95
90
96
91
97 def set_instance_id(config):
92 def set_instance_id(config):
@@ -25,15 +25,18 b' gist controller for RhodeCode'
25
25
26 import time
26 import time
27 import logging
27 import logging
28 import traceback
28
29 import formencode
29 import formencode
30 import peppercorn
30 from formencode import htmlfill
31 from formencode import htmlfill
31
32
32 from pylons import request, response, tmpl_context as c, url
33 from pylons import request, response, tmpl_context as c, url
33 from pylons.controllers.util import abort, redirect
34 from pylons.controllers.util import abort, redirect
34 from pylons.i18n.translation import _
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 from rhodecode.model.gist import GistModel
40 from rhodecode.model.gist import GistModel
38 from rhodecode.model.meta import Session
41 from rhodecode.model.meta import Session
39 from rhodecode.model.db import Gist, User
42 from rhodecode.model.db import Gist, User
@@ -44,9 +47,10 b' from rhodecode.lib.auth import LoginRequ'
44 from rhodecode.lib.utils import jsonify
47 from rhodecode.lib.utils import jsonify
45 from rhodecode.lib.utils2 import safe_str, safe_int, time_to_datetime
48 from rhodecode.lib.utils2 import safe_str, safe_int, time_to_datetime
46 from rhodecode.lib.ext_json import json
49 from rhodecode.lib.ext_json import json
47 from webob.exc import HTTPNotFound, HTTPForbidden
48 from sqlalchemy.sql.expression import or_
49 from rhodecode.lib.vcs.exceptions import VCSError, NodeNotChangedError
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 log = logging.getLogger(__name__)
55 log = logging.getLogger(__name__)
52
56
@@ -56,11 +60,11 b' class GistsController(BaseController):'
56
60
57 def __load_defaults(self, extra_values=None):
61 def __load_defaults(self, extra_values=None):
58 c.lifetime_values = [
62 c.lifetime_values = [
59 (str(-1), _('forever')),
63 (-1, _('forever')),
60 (str(5), _('5 minutes')),
64 (5, _('5 minutes')),
61 (str(60), _('1 hour')),
65 (60, _('1 hour')),
62 (str(60 * 24), _('1 day')),
66 (60 * 24, _('1 day')),
63 (str(60 * 24 * 30), _('1 month')),
67 (60 * 24 * 30, _('1 month')),
64 ]
68 ]
65 if extra_values:
69 if extra_values:
66 c.lifetime_values.append(extra_values)
70 c.lifetime_values.append(extra_values)
@@ -136,40 +140,56 b' class GistsController(BaseController):'
136 """POST /admin/gists: Create a new item"""
140 """POST /admin/gists: Create a new item"""
137 # url('gists')
141 # url('gists')
138 self.__load_defaults()
142 self.__load_defaults()
139 gist_form = GistForm([x[0] for x in c.lifetime_values],
143
140 [x[0] for x in c.acl_options])()
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 try:
160 try:
142 form_result = gist_form.to_python(dict(request.POST))
161
143 # TODO: multiple files support, from the form
162 schema_data = schema.deserialize(data)
144 filename = form_result['filename'] or Gist.DEFAULT_FILENAME
163 # convert to safer format with just KEYs so we sure no duplicates
145 nodes = {
164 schema_data['nodes'] = gist_schema.sequence_to_nodes(
146 filename: {
165 schema_data['nodes'])
147 'content': form_result['content'],
166
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)
155 gist = GistModel().create(
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 owner=c.rhodecode_user.user_id,
170 owner=c.rhodecode_user.user_id,
158 gist_mapping=nodes,
171 gist_mapping=schema_data['nodes'],
159 gist_type=gist_type,
172 gist_type=schema_data['gist_type'],
160 lifetime=form_result['lifetime'],
173 lifetime=schema_data['lifetime'],
161 gist_id=form_result['gistid'],
174 gist_acl_level=schema_data['gist_acl_level']
162 gist_acl_level=gist_acl_level
163 )
175 )
164 Session().commit()
176 Session().commit()
165 new_gist_id = gist.gist_access_id
177 new_gist_id = gist.gist_access_id
166 except formencode.Invalid as errors:
178 except validation_schema.Invalid as errors:
167 defaults = errors.value
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 return formencode.htmlfill.render(
189 return formencode.htmlfill.render(
170 render('admin/gists/new.html'),
190 render('admin/gists/new.html'),
171 defaults=defaults,
191 defaults=defaults,
172 errors=errors.error_dict or {},
192 errors=errors,
173 prefix_error=False,
193 prefix_error=False,
174 encoding="UTF-8",
194 encoding="UTF-8",
175 force_defaults=False
195 force_defaults=False
@@ -243,7 +263,8 b' class GistsController(BaseController):'
243 log.exception("Exception in gist show")
263 log.exception("Exception in gist show")
244 raise HTTPNotFound()
264 raise HTTPNotFound()
245 if format == 'raw':
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 response.content_type = 'text/plain'
268 response.content_type = 'text/plain'
248 return content
269 return content
249 return render('admin/gists/show.html')
270 return render('admin/gists/show.html')
@@ -252,32 +273,35 b' class GistsController(BaseController):'
252 @NotAnonymous()
273 @NotAnonymous()
253 @auth.CSRFRequired()
274 @auth.CSRFRequired()
254 def edit(self, gist_id):
275 def edit(self, gist_id):
276 self.__load_defaults()
255 self._add_gist_to_context(gist_id)
277 self._add_gist_to_context(gist_id)
256
278
257 owner = c.gist.gist_owner == c.rhodecode_user.user_id
279 owner = c.gist.gist_owner == c.rhodecode_user.user_id
258 if not (h.HasPermissionAny('hg.admin')() or owner):
280 if not (h.HasPermissionAny('hg.admin')() or owner):
259 raise HTTPForbidden()
281 raise HTTPForbidden()
260
282
261 rpost = request.POST
283 data = peppercorn.parse(request.POST.items())
262 nodes = {}
284
263 _file_data = zip(rpost.getall('org_files'), rpost.getall('files'),
285 schema = gist_schema.GistSchema()
264 rpost.getall('mimetypes'), rpost.getall('contents'))
286 schema = schema.bind(
265 for org_filename, filename, mimetype, content in _file_data:
287 # '0' is special value to leave lifetime untouched
266 nodes[org_filename] = {
288 lifetime_options=[x[0] for x in c.lifetime_values] + [0],
267 'org_filename': org_filename,
289 )
268 'filename': filename,
290
269 'content': content,
270 'lexer': mimetype,
271 }
272 try:
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 GistModel().update(
297 GistModel().update(
274 gist=c.gist,
298 gist=c.gist,
275 description=rpost['description'],
299 description=schema_data['description'],
276 owner=c.gist.owner,
300 owner=c.gist.owner,
277 gist_mapping=nodes,
301 gist_mapping=schema_data['nodes'],
278 gist_type=c.gist.gist_type,
302 gist_type=schema_data['gist_type'],
279 lifetime=rpost['lifetime'],
303 lifetime=schema_data['lifetime'],
280 gist_acl_level=rpost['acl_level']
304 gist_acl_level=schema_data['gist_acl_level']
281 )
305 )
282
306
283 Session().commit()
307 Session().commit()
@@ -287,6 +311,10 b' class GistsController(BaseController):'
287 # store only DB stuff for gist
311 # store only DB stuff for gist
288 Session().commit()
312 Session().commit()
289 h.flash(_('Successfully updated gist data'), category='success')
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 except Exception:
318 except Exception:
291 log.exception("Exception in gist edit")
319 log.exception("Exception in gist edit")
292 h.flash(_('Error occurred during update of gist %s') % gist_id,
320 h.flash(_('Error occurred during update of gist %s') % gist_id,
@@ -317,7 +345,7 b' class GistsController(BaseController):'
317 # this cannot use timeago, since it's used in select2 as a value
345 # this cannot use timeago, since it's used in select2 as a value
318 expiry = h.age(h.time_to_datetime(c.gist.gist_expires))
346 expiry = h.age(h.time_to_datetime(c.gist.gist_expires))
319 self.__load_defaults(
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 return render('admin/gists/edit.html')
349 return render('admin/gists/edit.html')
322
350
323 @LoginRequired()
351 @LoginRequired()
@@ -346,3 +346,17 b' class MyAccountController(BaseController'
346 h.flash(_("Auth token successfully deleted"), category='success')
346 h.flash(_("Auth token successfully deleted"), category='success')
347
347
348 return redirect(url('my_account_auth_tokens'))
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 return render('admin/notifications/notifications.html')
87 return render('admin/notifications/notifications.html')
88
88
89
89 @auth.CSRFRequired()
90 @auth.CSRFRequired()
90 def mark_all_read(self):
91 def mark_all_read(self):
91 if request.is_xhr:
92 if request.is_xhr:
@@ -33,6 +33,7 b' from pylons.controllers.util import redi'
33 from pylons.i18n.translation import _
33 from pylons.i18n.translation import _
34 from webob.exc import HTTPForbidden, HTTPNotFound, HTTPBadRequest
34 from webob.exc import HTTPForbidden, HTTPNotFound, HTTPBadRequest
35
35
36 import rhodecode
36 from rhodecode.lib import auth, helpers as h
37 from rhodecode.lib import auth, helpers as h
37 from rhodecode.lib.auth import (
38 from rhodecode.lib.auth import (
38 LoginRequired, HasPermissionAllDecorator,
39 LoginRequired, HasPermissionAllDecorator,
@@ -42,7 +43,7 b' from rhodecode.lib.base import BaseRepoC'
42 from rhodecode.lib.ext_json import json
43 from rhodecode.lib.ext_json import json
43 from rhodecode.lib.exceptions import AttachedForksError
44 from rhodecode.lib.exceptions import AttachedForksError
44 from rhodecode.lib.utils import action_logger, repo_name_slug, jsonify
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 from rhodecode.lib.vcs import RepositoryError
47 from rhodecode.lib.vcs import RepositoryError
47 from rhodecode.model.db import (
48 from rhodecode.model.db import (
48 User, Repository, UserFollowing, RepoGroup, RepositoryField)
49 User, Repository, UserFollowing, RepoGroup, RepositoryField)
@@ -779,6 +780,8 b' class ReposController(BaseRepoController'
779 c.repo_info = self._load_repo(repo_name)
780 c.repo_info = self._load_repo(repo_name)
780 defaults = self._vcs_form_defaults(repo_name)
781 defaults = self._vcs_form_defaults(repo_name)
781 c.inherit_global_settings = defaults['inherit_global_settings']
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 return htmlfill.render(
786 return htmlfill.render(
784 render('admin/repos/repo_edit.html'),
787 render('admin/repos/repo_edit.html'),
@@ -79,7 +79,7 b' class SettingsController(BaseController)'
79 def __before__(self):
79 def __before__(self):
80 super(SettingsController, self).__before__()
80 super(SettingsController, self).__before__()
81 c.labs_active = str2bool(
81 c.labs_active = str2bool(
82 rhodecode.CONFIG.get('labs_settings_active', 'false'))
82 rhodecode.CONFIG.get('labs_settings_active', 'true'))
83 c.navlist = navigation_list(request)
83 c.navlist = navigation_list(request)
84
84
85 def _get_hg_ui_settings(self):
85 def _get_hg_ui_settings(self):
@@ -790,13 +790,6 b' LabSetting = collections.namedtuple('
790 # rhodecode.model.forms.LabsSettingsForm.
790 # rhodecode.model.forms.LabsSettingsForm.
791 _LAB_SETTINGS = [
791 _LAB_SETTINGS = [
792 LabSetting(
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 key='rhodecode_proxy_subversion_http_requests',
793 key='rhodecode_proxy_subversion_http_requests',
801 type='bool',
794 type='bool',
802 group=lazy_ugettext('Subversion HTTP Support'),
795 group=lazy_ugettext('Subversion HTTP Support'),
@@ -83,9 +83,6 b' class UsersController(BaseController):'
83 from rhodecode.lib.utils import PartialRenderer
83 from rhodecode.lib.utils import PartialRenderer
84 _render = PartialRenderer('data_table/_dt_elements.html')
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 def username(user_id, username):
86 def username(user_id, username):
90 return _render("user_name", user_id, username)
87 return _render("user_name", user_id, username)
91
88
@@ -100,9 +97,7 b' class UsersController(BaseController):'
100 users_data = []
97 users_data = []
101 for user in c.users_list:
98 for user in c.users_list:
102 users_data.append({
99 users_data.append({
103 "gravatar": grav_tmpl(user.email, 20),
100 "username": h.gravatar_with_user(user.username),
104 "username": h.link_to(
105 user.username, h.url('user_profile', username=user.username)),
106 "username_raw": user.username,
101 "username_raw": user.username,
107 "email": user.email,
102 "email": user.email,
108 "first_name": h.escape(user.name),
103 "first_name": h.escape(user.name),
@@ -351,7 +351,8 b' class ChangesetController(BaseRepoContro'
351 f_path=request.POST.get('f_path'),
351 f_path=request.POST.get('f_path'),
352 line_no=request.POST.get('line'),
352 line_no=request.POST.get('line'),
353 status_change=(ChangesetStatus.get_status_lbl(status)
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 # get status if set !
357 # get status if set !
357 if status:
358 if status:
@@ -136,11 +136,13 b' class FilesController(BaseRepoController'
136 _namespace = caches.get_repo_namespace_key(namespace_type, repo_name)
136 _namespace = caches.get_repo_namespace_key(namespace_type, repo_name)
137 return caches.get_cache_manager('repo_cache_long', _namespace)
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 def _cached_tree():
141 def _cached_tree():
141 log.debug('Generating cached file tree for %s, %s, %s',
142 log.debug('Generating cached file tree for %s, %s, %s',
142 repo_name, commit_id, f_path)
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 cache_manager = self.__get_tree_cache_manager(
147 cache_manager = self.__get_tree_cache_manager(
146 repo_name, caches.FILE_TREE)
148 repo_name, caches.FILE_TREE)
@@ -148,6 +150,10 b' class FilesController(BaseRepoController'
148 cache_key = caches.compute_key_from_params(
150 cache_key = caches.compute_key_from_params(
149 repo_name, commit_id, f_path)
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 return cache_manager.get(cache_key, createfunc=_cached_tree)
157 return cache_manager.get(cache_key, createfunc=_cached_tree)
152
158
153 def _get_nodelist_at_commit(self, repo_name, commit_id, f_path):
159 def _get_nodelist_at_commit(self, repo_name, commit_id, f_path):
@@ -165,22 +171,6 b' class FilesController(BaseRepoController'
165 repo_name, commit_id, f_path)
171 repo_name, commit_id, f_path)
166 return cache_manager.get(cache_key, createfunc=_cached_nodes)
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 @LoginRequired()
174 @LoginRequired()
185 @HasRepoPermissionAnyDecorator(
175 @HasRepoPermissionAnyDecorator(
186 'repository.read', 'repository.write', 'repository.admin')
176 'repository.read', 'repository.write', 'repository.admin')
@@ -246,6 +236,7 b' class FilesController(BaseRepoController'
246 c.authors = []
236 c.authors = []
247 c.file_tree = self._get_tree_at_commit(
237 c.file_tree = self._get_tree_at_commit(
248 repo_name, c.commit.raw_id, f_path)
238 repo_name, c.commit.raw_id, f_path)
239
249 except RepositoryError as e:
240 except RepositoryError as e:
250 h.flash(safe_str(e), category='error')
241 h.flash(safe_str(e), category='error')
251 raise HTTPNotFound()
242 raise HTTPNotFound()
@@ -1092,23 +1083,32 b' class FilesController(BaseRepoController'
1092 @XHRRequired()
1083 @XHRRequired()
1093 @HasRepoPermissionAnyDecorator(
1084 @HasRepoPermissionAnyDecorator(
1094 'repository.read', 'repository.write', 'repository.admin')
1085 'repository.read', 'repository.write', 'repository.admin')
1095 @jsonify
1086 def nodetree_full(self, repo_name, commit_id, f_path):
1096 def metadata_list(self, repo_name, revision, f_path):
1097 """
1087 """
1098 Returns a json dict that contains commit date, author, revision
1088 Returns rendered html of file tree that contains commit date,
1099 and id for the specified repo, revision and file path
1089 author, revision for the specified combination of
1090 repo, commit_id and file path
1100
1091
1101 :param repo_name: name of the repository
1092 :param repo_name: name of the repository
1102 :param revision: revision of files
1093 :param commit_id: commit_id of file tree
1103 :param f_path: file path of the requested directory
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 try:
1098 try:
1108 file_node = commit.get_node(f_path)
1099 dir_node = commit.get_node(f_path)
1109 except RepositoryError as e:
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(
1106 c.file = dir_node
1113 repo_name, commit, file_node)
1107 c.commit = commit
1114 return {'metadata': metadata}
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 try:
244 try:
245 self.scm_model.toggle_following_user(
245 self.scm_model.toggle_following_user(
246 user_id, c.rhodecode_user.user_id)
246 user_id, c.rhodecode_user.user_id)
247 Session.commit()
247 Session().commit()
248 return 'ok'
248 return 'ok'
249 except Exception:
249 except Exception:
250 raise HTTPBadRequest()
250 raise HTTPBadRequest()
@@ -254,7 +254,7 b' class JournalController(BaseController):'
254 try:
254 try:
255 self.scm_model.toggle_following_repo(
255 self.scm_model.toggle_following_repo(
256 repo_id, c.rhodecode_user.user_id)
256 repo_id, c.rhodecode_user.user_id)
257 Session.commit()
257 Session().commit()
258 return 'ok'
258 return 'ok'
259 except Exception:
259 except Exception:
260 raise HTTPBadRequest()
260 raise HTTPBadRequest()
@@ -32,6 +32,7 b' from pylons.i18n.translation import _'
32 from sqlalchemy.sql import func
32 from sqlalchemy.sql import func
33 from sqlalchemy.sql.expression import or_
33 from sqlalchemy.sql.expression import or_
34
34
35 from rhodecode import events
35 from rhodecode.lib import auth, diffs, helpers as h
36 from rhodecode.lib import auth, diffs, helpers as h
36 from rhodecode.lib.ext_json import json
37 from rhodecode.lib.ext_json import json
37 from rhodecode.lib.base import (
38 from rhodecode.lib.base import (
@@ -640,6 +641,9 b' class PullrequestsController(BaseRepoCon'
640 pull_request_id = safe_int(pull_request_id)
641 pull_request_id = safe_int(pull_request_id)
641 c.pull_request = PullRequest.get_or_404(pull_request_id)
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 # pull_requests repo_name we opened it against
647 # pull_requests repo_name we opened it against
644 # ie. target_repo must match
648 # ie. target_repo must match
645 if repo_name != c.pull_request.target_repo.repo_name:
649 if repo_name != c.pull_request.target_repo.repo_name:
@@ -758,9 +762,13 b' class PullrequestsController(BaseRepoCon'
758 line_no=request.POST.get('line'),
762 line_no=request.POST.get('line'),
759 status_change=(ChangesetStatus.get_status_lbl(status)
763 status_change=(ChangesetStatus.get_status_lbl(status)
760 if status and allowed_to_change_status else None),
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 closing_pr=close_pr
767 closing_pr=close_pr
762 )
768 )
763
769
770
771
764 if allowed_to_change_status:
772 if allowed_to_change_status:
765 old_calculated_status = pull_request.calculated_review_status()
773 old_calculated_status = pull_request.calculated_review_status()
766 # get status if set !
774 # get status if set !
@@ -774,6 +782,7 b' class PullrequestsController(BaseRepoCon'
774 )
782 )
775
783
776 Session().flush()
784 Session().flush()
785 events.trigger(events.PullRequestCommentEvent(pull_request, comm))
777 # we now calculate the status of pull request, and based on that
786 # we now calculate the status of pull request, and based on that
778 # calculation we set the commits status
787 # calculation we set the commits status
779 calculated_status = pull_request.calculated_review_status()
788 calculated_status = pull_request.calculated_review_status()
@@ -35,6 +35,7 b' from rhodecode.lib.helpers import Page'
35 from rhodecode.lib.utils2 import safe_str, safe_int
35 from rhodecode.lib.utils2 import safe_str, safe_int
36 from rhodecode.lib.index import searcher_from_config
36 from rhodecode.lib.index import searcher_from_config
37 from rhodecode.model import validation_schema
37 from rhodecode.model import validation_schema
38 from rhodecode.model.validation_schema.schemas import search_schema
38
39
39 log = logging.getLogger(__name__)
40 log = logging.getLogger(__name__)
40
41
@@ -48,7 +49,7 b' class SearchController(BaseRepoControlle'
48 formatted_results = []
49 formatted_results = []
49 execution_time = ''
50 execution_time = ''
50
51
51 schema = validation_schema.SearchParamsSchema()
52 schema = search_schema.SearchParamsSchema()
52
53
53 search_params = {}
54 search_params = {}
54 errors = []
55 errors = []
@@ -75,7 +76,6 b' class SearchController(BaseRepoControlle'
75 page_limit = search_params['page_limit']
76 page_limit = search_params['page_limit']
76 requested_page = search_params['requested_page']
77 requested_page = search_params['requested_page']
77
78
78
79 c.perm_user = AuthUser(user_id=c.rhodecode_user.user_id,
79 c.perm_user = AuthUser(user_id=c.rhodecode_user.user_id,
80 ip_addr=self.ip_addr)
80 ip_addr=self.ip_addr)
81
81
@@ -24,14 +24,12 b' Summary controller for RhodeCode Enterpr'
24
24
25 import logging
25 import logging
26 from string import lower
26 from string import lower
27 from itertools import product
28
27
29 from pylons import tmpl_context as c, request
28 from pylons import tmpl_context as c, request
30 from pylons.i18n.translation import _
29 from pylons.i18n.translation import _
31 from beaker.cache import cache_region, region_invalidate
30 from beaker.cache import cache_region, region_invalidate
32
31
33 from rhodecode.config.conf import (
32 from rhodecode.config.conf import (LANGUAGES_EXTENSIONS_MAP)
34 ALL_READMES, ALL_EXTS, LANGUAGES_EXTENSIONS_MAP)
35 from rhodecode.controllers import utils
33 from rhodecode.controllers import utils
36 from rhodecode.controllers.changelog import _load_changelog_summary
34 from rhodecode.controllers.changelog import _load_changelog_summary
37 from rhodecode.lib import caches, helpers as h
35 from rhodecode.lib import caches, helpers as h
@@ -49,10 +47,6 b' from rhodecode.model.db import Statistic'
49
47
50 log = logging.getLogger(__name__)
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 class SummaryController(BaseRepoController):
51 class SummaryController(BaseRepoController):
58
52
@@ -62,6 +56,7 b' class SummaryController(BaseRepoControll'
62 def __get_readme_data(self, db_repo):
56 def __get_readme_data(self, db_repo):
63 repo_name = db_repo.repo_name
57 repo_name = db_repo.repo_name
64 log.debug('Looking for README file')
58 log.debug('Looking for README file')
59 default_renderer = c.visual.default_renderer
65
60
66 @cache_region('long_term')
61 @cache_region('long_term')
67 def _generate_readme(cache_key):
62 def _generate_readme(cache_key):
@@ -73,7 +68,7 b' class SummaryController(BaseRepoControll'
73 if isinstance(commit, EmptyCommit):
68 if isinstance(commit, EmptyCommit):
74 raise EmptyRepositoryError()
69 raise EmptyRepositoryError()
75 renderer = MarkupRenderer()
70 renderer = MarkupRenderer()
76 for f in README_FILES:
71 for f in renderer.pick_readme_order(default_renderer):
77 try:
72 try:
78 node = commit.get_node(f)
73 node = commit.get_node(f)
79 except NodeDoesNotExistError:
74 except NodeDoesNotExistError:
@@ -241,7 +236,7 b' class SummaryController(BaseRepoControll'
241 (_("Tag"), repo.tags, 'tag'),
236 (_("Tag"), repo.tags, 'tag'),
242 (_("Bookmark"), repo.bookmarks, 'book'),
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 data = {
240 data = {
246 'more': False,
241 'more': False,
247 'results': res
242 'results': res
@@ -258,14 +253,14 b' class SummaryController(BaseRepoControll'
258 # TODO: enable when vcs can handle bookmarks filters
253 # TODO: enable when vcs can handle bookmarks filters
259 # (_("Bookmarks"), repo.bookmarks, "book"),
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 data = {
257 data = {
263 'more': False,
258 'more': False,
264 'results': res
259 'results': res
265 }
260 }
266 return data
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 format_ref_id = utils.get_format_ref_id(repo)
264 format_ref_id = utils.get_format_ref_id(repo)
270
265
271 result = []
266 result = []
@@ -274,28 +269,32 b' class SummaryController(BaseRepoControll'
274 result.append({
269 result.append({
275 'text': title,
270 'text': title,
276 'children': self._create_reference_items(
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 return result
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 result = []
278 result = []
283 is_svn = h.is_svn(repo)
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 result.append({
283 result.append({
286 'text': name,
284 'text': ref_name,
287 'id': format_ref_id(name, raw_id),
285 'id': format_ref_id(ref_name, raw_id),
288 'raw_id': raw_id,
286 'raw_id': raw_id,
289 'type': ref_type,
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 return result
290 return result
293
291
294 def _create_files_url(self, repo, name, raw_id, is_svn):
292 def _create_files_url(self, repo, full_repo_name, ref_name, raw_id,
295 use_commit_id = '/' in name or is_svn
293 is_svn):
294 use_commit_id = '/' in ref_name or is_svn
296 return h.url(
295 return h.url(
297 'files_home',
296 'files_home',
298 repo_name=repo.name,
297 repo_name=full_repo_name,
299 f_path=name if is_svn else '',
298 f_path=ref_name if is_svn else '',
300 revision=raw_id if use_commit_id else name,
299 revision=raw_id if use_commit_id else ref_name,
301 at=name)
300 at=ref_name)
1 NO CONTENT: file renamed from rhodecode/interfaces.py to rhodecode/events/interfaces.py
NO CONTENT: file renamed from rhodecode/interfaces.py to rhodecode/events/interfaces.py
@@ -17,37 +17,49 b''
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
18
19 from zope.interface import implementer
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 IUserRegistered, IUserPreCreate, IUserPreUpdate)
24 IUserRegistered, IUserPreCreate, IUserPreUpdate)
22
25
23
26
24 @implementer(IUserRegistered)
27 @implementer(IUserRegistered)
25 class UserRegistered(object):
28 class UserRegistered(RhodecodeEvent):
26 """
29 """
27 An instance of this class is emitted as an :term:`event` whenever a user
30 An instance of this class is emitted as an :term:`event` whenever a user
28 account is registered.
31 account is registered.
29 """
32 """
33 name = 'user-register'
34 display_name = lazy_ugettext('user registered')
35
30 def __init__(self, user, session):
36 def __init__(self, user, session):
31 self.user = user
37 self.user = user
32 self.session = session
38 self.session = session
33
39
34
40
35 @implementer(IUserPreCreate)
41 @implementer(IUserPreCreate)
36 class UserPreCreate(object):
42 class UserPreCreate(RhodecodeEvent):
37 """
43 """
38 An instance of this class is emitted as an :term:`event` before a new user
44 An instance of this class is emitted as an :term:`event` before a new user
39 object is created.
45 object is created.
40 """
46 """
47 name = 'user-pre-create'
48 display_name = lazy_ugettext('user pre create')
49
41 def __init__(self, user_data):
50 def __init__(self, user_data):
42 self.user_data = user_data
51 self.user_data = user_data
43
52
44
53
45 @implementer(IUserPreUpdate)
54 @implementer(IUserPreUpdate)
46 class UserPreUpdate(object):
55 class UserPreUpdate(RhodecodeEvent):
47 """
56 """
48 An instance of this class is emitted as an :term:`event` before a user
57 An instance of this class is emitted as an :term:`event` before a user
49 object is updated.
58 object is updated.
50 """
59 """
60 name = 'user-pre-update'
61 display_name = lazy_ugettext('user pre update')
62
51 def __init__(self, user, user_data):
63 def __init__(self, user, user_data):
52 self.user = user
64 self.user = user
53 self.user_data = user_data
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 #, fuzzy
6 #, fuzzy
7 msgid ""
7 msgid ""
8 msgstr ""
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 "Report-Msgid-Bugs-To: marcin@rhodecode.com\n"
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 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14 "Language-Team: LANGUAGE <LL@li.org>\n"
14 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,12 +18,13 b' msgstr ""'
18 "Generated-By: Babel 1.3\n"
18 "Generated-By: Babel 1.3\n"
19
19
20 #: rhodecode/admin/navigation.py:74 rhodecode/authentication/routes.py:60
20 #: rhodecode/admin/navigation.py:74 rhodecode/authentication/routes.py:60
21 #: rhodecode/integrations/views.py:126
21 #: rhodecode/templates/admin/permissions/permissions.html:36
22 #: rhodecode/templates/admin/permissions/permissions.html:36
22 msgid "Global"
23 msgid "Global"
23 msgstr ""
24 msgstr ""
24
25
25 #: rhodecode/admin/navigation.py:75
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 msgid "VCS"
28 msgid "VCS"
28 msgstr ""
29 msgstr ""
29
30
@@ -36,7 +37,7 b' msgid "Remap and Rescan"'
36 msgstr ""
37 msgstr ""
37
38
38 #: rhodecode/admin/navigation.py:78
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 msgid "Issue Tracker"
41 msgid "Issue Tracker"
41 msgstr ""
42 msgstr ""
42
43
@@ -45,7 +46,8 b' msgstr ""'
45 #: rhodecode/templates/admin/my_account/my_account_profile_edit.html:94
46 #: rhodecode/templates/admin/my_account/my_account_profile_edit.html:94
46 #: rhodecode/templates/admin/users/user_add.html:86
47 #: rhodecode/templates/admin/users/user_add.html:86
47 #: rhodecode/templates/admin/users/user_edit_profile.html:65
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 #: rhodecode/templates/users/user_profile.html:51
51 #: rhodecode/templates/users/user_profile.html:51
50 msgid "Email"
52 msgid "Email"
51 msgstr ""
53 msgstr ""
@@ -59,15 +61,27 b' msgid "Full Text Search"'
59 msgstr ""
61 msgstr ""
60
62
61 #: rhodecode/admin/navigation.py:83
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 #: rhodecode/templates/admin/settings/settings_system.html:47
76 #: rhodecode/templates/admin/settings/settings_system.html:47
63 msgid "System Info"
77 msgid "System Info"
64 msgstr ""
78 msgstr ""
65
79
66 #: rhodecode/admin/navigation.py:84
80 #: rhodecode/admin/navigation.py:86
67 msgid "Open Source Licenses"
81 msgid "Open Source Licenses"
68 msgstr ""
82 msgstr ""
69
83
70 #: rhodecode/admin/navigation.py:91
84 #: rhodecode/admin/navigation.py:93
71 msgid "Labs"
85 msgid "Labs"
72 msgstr ""
86 msgstr ""
73
87
@@ -75,7 +89,9 b' msgstr ""'
75 msgid "Enable or disable this authentication plugin."
89 msgid "Enable or disable this authentication plugin."
76 msgstr ""
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 msgid "Enabled"
95 msgid "Enabled"
80 msgstr ""
96 msgstr ""
81
97
@@ -217,7 +233,7 b' msgstr ""'
217 #: rhodecode/templates/login.html:50 rhodecode/templates/register.html:48
233 #: rhodecode/templates/login.html:50 rhodecode/templates/register.html:48
218 #: rhodecode/templates/admin/my_account/my_account.html:30
234 #: rhodecode/templates/admin/my_account/my_account.html:30
219 #: rhodecode/templates/admin/users/user_add.html:44
235 #: rhodecode/templates/admin/users/user_add.html:44
220 #: rhodecode/templates/base/base.html:314
236 #: rhodecode/templates/base/base.html:315
221 #: rhodecode/templates/debug_style/login.html:45
237 #: rhodecode/templates/debug_style/login.html:45
222 msgid "Password"
238 msgid "Password"
223 msgstr ""
239 msgstr ""
@@ -266,12 +282,12 b' msgstr ""'
266 msgid "LDAP Attribute to map to user name"
282 msgid "LDAP Attribute to map to user name"
267 msgstr ""
283 msgstr ""
268
284
269 #: rhodecode/authentication/plugins/auth_ldap.py:144
285 #: rhodecode/authentication/plugins/auth_ldap.py:145
270 msgid "The LDAP Login attribute of the CN must be specified"
286 msgid "Login Attribute"
271 msgstr ""
287 msgstr ""
272
288
273 #: rhodecode/authentication/plugins/auth_ldap.py:146
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 msgstr ""
291 msgstr ""
276
292
277 #: rhodecode/authentication/plugins/auth_ldap.py:151
293 #: rhodecode/authentication/plugins/auth_ldap.py:151
@@ -298,7 +314,7 b' msgstr ""'
298 msgid "Email Attribute"
314 msgid "Email Attribute"
299 msgstr ""
315 msgstr ""
300
316
301 #: rhodecode/authentication/plugins/auth_ldap.py:348
317 #: rhodecode/authentication/plugins/auth_ldap.py:351
302 msgid "LDAP"
318 msgid "LDAP"
303 msgstr ""
319 msgstr ""
304
320
@@ -331,7 +347,7 b' msgid "Rhodecode Token Auth"'
331 msgstr ""
347 msgstr ""
332
348
333 #: rhodecode/controllers/changelog.py:90 rhodecode/controllers/compare.py:63
349 #: rhodecode/controllers/changelog.py:90 rhodecode/controllers/compare.py:63
334 #: rhodecode/controllers/pullrequests.py:279
350 #: rhodecode/controllers/pullrequests.py:280
335 msgid "There are no commits yet"
351 msgid "There are no commits yet"
336 msgstr ""
352 msgstr ""
337
353
@@ -367,8 +383,8 b' msgid "No such commit exists for this re'
367 msgstr ""
383 msgstr ""
368
384
369 #: rhodecode/controllers/changeset.py:335
385 #: rhodecode/controllers/changeset.py:335
370 #: rhodecode/controllers/pullrequests.py:746
386 #: rhodecode/controllers/pullrequests.py:750
371 #: rhodecode/model/pull_request.py:836
387 #: rhodecode/model/pull_request.py:843
372 #, python-format
388 #, python-format
373 msgid "Status change %(transition_icon)s %(status)s"
389 msgid "Status change %(transition_icon)s %(status)s"
374 msgstr ""
390 msgstr ""
@@ -423,100 +439,100 b' msgstr ""'
423 msgid "There are no files yet. %s"
439 msgid "There are no files yet. %s"
424 msgstr ""
440 msgstr ""
425
441
426 #: rhodecode/controllers/files.py:390 rhodecode/controllers/files.py:443
442 #: rhodecode/controllers/files.py:381 rhodecode/controllers/files.py:434
427 #: rhodecode/controllers/files.py:474 rhodecode/controllers/files.py:549
443 #: rhodecode/controllers/files.py:465 rhodecode/controllers/files.py:540
428 #: rhodecode/controllers/files.py:594 rhodecode/controllers/files.py:685
444 #: rhodecode/controllers/files.py:585 rhodecode/controllers/files.py:676
429 #, python-format
445 #, python-format
430 msgid "This repository has been locked by %s on %s"
446 msgid "This repository has been locked by %s on %s"
431 msgstr ""
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 #: rhodecode/controllers/files.py:398 rhodecode/controllers/files.py:451
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 #, python-format
454 #, python-format
439 msgid "Deleted file %s via RhodeCode Enterprise"
455 msgid "Deleted file %s via RhodeCode Enterprise"
440 msgstr ""
456 msgstr ""
441
457
442 #: rhodecode/controllers/files.py:427
458 #: rhodecode/controllers/files.py:418
443 #, python-format
459 #, python-format
444 msgid "Successfully deleted file %s"
460 msgid "Successfully deleted file %s"
445 msgstr ""
461 msgstr ""
446
462
447 #: rhodecode/controllers/files.py:430 rhodecode/controllers/files.py:536
463 #: rhodecode/controllers/files.py:421 rhodecode/controllers/files.py:527
448 #: rhodecode/controllers/files.py:673
464 #: rhodecode/controllers/files.py:664
449 msgid "Error occurred during commit"
465 msgid "Error occurred during commit"
450 msgstr ""
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 msgid "You can only edit files with revision being a valid branch "
469 msgid "You can only edit files with revision being a valid branch "
454 msgstr ""
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 #, python-format
473 #, python-format
458 msgid "Edited file %s via RhodeCode Enterprise"
474 msgid "Edited file %s via RhodeCode Enterprise"
459 msgstr ""
475 msgstr ""
460
476
461 #: rhodecode/controllers/files.py:511
477 #: rhodecode/controllers/files.py:502
462 msgid "No changes"
478 msgid "No changes"
463 msgstr ""
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 #, python-format
482 #, python-format
467 msgid "Successfully committed to %s"
483 msgid "Successfully committed to %s"
468 msgstr ""
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 msgid "Added file via RhodeCode Enterprise"
487 msgid "Added file via RhodeCode Enterprise"
472 msgstr ""
488 msgstr ""
473
489
474 #: rhodecode/controllers/files.py:632
490 #: rhodecode/controllers/files.py:623
475 msgid "No filename"
491 msgid "No filename"
476 msgstr ""
492 msgstr ""
477
493
478 #: rhodecode/controllers/files.py:665
494 #: rhodecode/controllers/files.py:656
479 msgid "The location specified must be a relative path and must not contain .. in the path"
495 msgid "The location specified must be a relative path and must not contain .. in the path"
480 msgstr ""
496 msgstr ""
481
497
482 #: rhodecode/controllers/files.py:719
498 #: rhodecode/controllers/files.py:710
483 msgid "Downloads disabled"
499 msgid "Downloads disabled"
484 msgstr ""
500 msgstr ""
485
501
486 #: rhodecode/controllers/files.py:725
502 #: rhodecode/controllers/files.py:716
487 #, python-format
503 #, python-format
488 msgid "Unknown revision %s"
504 msgid "Unknown revision %s"
489 msgstr ""
505 msgstr ""
490
506
491 #: rhodecode/controllers/files.py:727
507 #: rhodecode/controllers/files.py:718
492 msgid "Empty repository"
508 msgid "Empty repository"
493 msgstr ""
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 msgid "Unknown archive type"
512 msgid "Unknown archive type"
497 msgstr ""
513 msgstr ""
498
514
499 #: rhodecode/controllers/files.py:930
515 #: rhodecode/controllers/files.py:921
500 #, python-format
516 #, python-format
501 msgid "Commit %(commit)s does not exist."
517 msgid "Commit %(commit)s does not exist."
502 msgstr ""
518 msgstr ""
503
519
504 #: rhodecode/controllers/files.py:947
520 #: rhodecode/controllers/files.py:938
505 #, python-format
521 #, python-format
506 msgid "%(file_path)s has not changed between %(commit_1)s and %(commit_2)s."
522 msgid "%(file_path)s has not changed between %(commit_1)s and %(commit_2)s."
507 msgstr ""
523 msgstr ""
508
524
509 #: rhodecode/controllers/files.py:1014
525 #: rhodecode/controllers/files.py:1005
510 msgid "Changesets"
526 msgid "Changesets"
511 msgstr ""
527 msgstr ""
512
528
513 #: rhodecode/controllers/files.py:1035 rhodecode/controllers/summary.py:256
529 #: rhodecode/controllers/files.py:1026 rhodecode/controllers/summary.py:251
514 #: rhodecode/model/pull_request.py:1051 rhodecode/model/scm.py:783
530 #: rhodecode/model/pull_request.py:1059 rhodecode/model/scm.py:780
515 #: rhodecode/templates/base/vcs_settings.html:138
531 #: rhodecode/templates/base/vcs_settings.html:138
516 msgid "Branches"
532 msgid "Branches"
517 msgstr ""
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 #: rhodecode/templates/base/vcs_settings.html:163
536 #: rhodecode/templates/base/vcs_settings.html:163
521 msgid "Tags"
537 msgid "Tags"
522 msgstr ""
538 msgstr ""
@@ -531,13 +547,13 b' msgid "Groups"'
531 msgstr ""
547 msgstr ""
532
548
533 #: rhodecode/controllers/home.py:212 rhodecode/controllers/home.py:247
549 #: rhodecode/controllers/home.py:212 rhodecode/controllers/home.py:247
534 #: rhodecode/controllers/pullrequests.py:382
550 #: rhodecode/controllers/pullrequests.py:383
535 #: rhodecode/templates/admin/repo_groups/repo_group_edit_perms.html:128
551 #: rhodecode/templates/admin/repo_groups/repo_group_edit_perms.html:128
536 #: rhodecode/templates/admin/repos/repo_add.html:15
552 #: rhodecode/templates/admin/repos/repo_add.html:15
537 #: rhodecode/templates/admin/repos/repo_add.html:19
553 #: rhodecode/templates/admin/repos/repo_add.html:19
538 #: rhodecode/templates/admin/users/user_edit_advanced.html:11
554 #: rhodecode/templates/admin/users/user_edit_advanced.html:11
539 #: rhodecode/templates/base/base.html:79 rhodecode/templates/base/base.html:149
555 #: rhodecode/templates/base/base.html:78 rhodecode/templates/base/base.html:150
540 #: rhodecode/templates/base/base.html:626
556 #: rhodecode/templates/base/base.html:627
541 msgid "Repositories"
557 msgid "Repositories"
542 msgstr ""
558 msgstr ""
543
559
@@ -554,93 +570,93 b' msgstr ""'
554 msgid "journal"
570 msgid "journal"
555 msgstr ""
571 msgstr ""
556
572
557 #: rhodecode/controllers/pullrequests.py:293
573 #: rhodecode/controllers/pullrequests.py:294
558 msgid "Commit does not exist"
574 msgid "Commit does not exist"
559 msgstr ""
575 msgstr ""
560
576
561 #: rhodecode/controllers/pullrequests.py:405
577 #: rhodecode/controllers/pullrequests.py:406
562 msgid "Pull request requires a title with min. 3 chars"
578 msgid "Pull request requires a title with min. 3 chars"
563 msgstr ""
579 msgstr ""
564
580
565 #: rhodecode/controllers/pullrequests.py:407
581 #: rhodecode/controllers/pullrequests.py:408
566 msgid "Error creating pull request: {}"
582 msgid "Error creating pull request: {}"
567 msgstr ""
583 msgstr ""
568
584
569 #: rhodecode/controllers/pullrequests.py:454
585 #: rhodecode/controllers/pullrequests.py:455
570 msgid "Successfully opened new pull request"
586 msgid "Successfully opened new pull request"
571 msgstr ""
587 msgstr ""
572
588
573 #: rhodecode/controllers/pullrequests.py:457
589 #: rhodecode/controllers/pullrequests.py:458
574 msgid "Error occurred during sending pull request"
590 msgid "Error occurred during sending pull request"
575 msgstr ""
591 msgstr ""
576
592
577 #: rhodecode/controllers/pullrequests.py:497
593 #: rhodecode/controllers/pullrequests.py:498
578 msgid "Cannot update closed pull requests."
594 msgid "Cannot update closed pull requests."
579 msgstr ""
595 msgstr ""
580
596
581 #: rhodecode/controllers/pullrequests.py:503
597 #: rhodecode/controllers/pullrequests.py:504
582 msgid "Pull request title & description updated."
598 msgid "Pull request title & description updated."
583 msgstr ""
599 msgstr ""
584
600
585 #: rhodecode/controllers/pullrequests.py:513
601 #: rhodecode/controllers/pullrequests.py:514
586 msgid "Pull request updated to \"{source_commit_id}\" with {count_added} added, {count_removed} removed commits."
602 msgid "Pull request updated to \"{source_commit_id}\" with {count_added} added, {count_removed} removed commits."
587 msgstr ""
603 msgstr ""
588
604
589 #: rhodecode/controllers/pullrequests.py:523
605 #: rhodecode/controllers/pullrequests.py:524
590 msgid "Nothing changed in pull request."
606 msgid "Nothing changed in pull request."
591 msgstr ""
607 msgstr ""
592
608
593 #: rhodecode/controllers/pullrequests.py:526
609 #: rhodecode/controllers/pullrequests.py:527
594 msgid "Skipping update of pull request due to reference type: {reference_type}"
610 msgid "Skipping update of pull request due to reference type: {reference_type}"
595 msgstr ""
611 msgstr ""
596
612
597 #: rhodecode/controllers/pullrequests.py:533
613 #: rhodecode/controllers/pullrequests.py:534
598 msgid "Update failed due to missing commits."
614 msgid "Update failed due to missing commits."
599 msgstr ""
615 msgstr ""
600
616
601 #: rhodecode/controllers/pullrequests.py:579
617 #: rhodecode/controllers/pullrequests.py:580
602 msgid "Pull request reviewer approval is pending."
618 msgid "Pull request reviewer approval is pending."
603 msgstr ""
619 msgstr ""
604
620
605 #: rhodecode/controllers/pullrequests.py:593
621 #: rhodecode/controllers/pullrequests.py:594
606 msgid "Pull request was successfully merged and closed."
622 msgid "Pull request was successfully merged and closed."
607 msgstr ""
623 msgstr ""
608
624
609 #: rhodecode/controllers/pullrequests.py:631
625 #: rhodecode/controllers/pullrequests.py:632
610 msgid "Successfully deleted pull request"
626 msgid "Successfully deleted pull request"
611 msgstr ""
627 msgstr ""
612
628
613 #: rhodecode/controllers/pullrequests.py:664
629 #: rhodecode/controllers/pullrequests.py:668
614 msgid "Reviewer approval is pending."
630 msgid "Reviewer approval is pending."
615 msgstr ""
631 msgstr ""
616
632
617 #: rhodecode/controllers/pullrequests.py:706
633 #: rhodecode/controllers/pullrequests.py:710
618 msgid "Close Pull Request"
634 msgid "Close Pull Request"
619 msgstr ""
635 msgstr ""
620
636
621 #: rhodecode/controllers/pullrequests.py:750
637 #: rhodecode/controllers/pullrequests.py:754
622 #: rhodecode/model/pull_request.py:840
638 #: rhodecode/model/pull_request.py:847
623 msgid "Closing with"
639 msgid "Closing with"
624 msgstr ""
640 msgstr ""
625
641
626 #: rhodecode/controllers/pullrequests.py:795
642 #: rhodecode/controllers/pullrequests.py:802
627 #, python-format
643 #, python-format
628 msgid "Closing pull request on other statuses than rejected or approved is forbidden. Calculated status from all reviewers is currently: %s"
644 msgid "Closing pull request on other statuses than rejected or approved is forbidden. Calculated status from all reviewers is currently: %s"
629 msgstr ""
645 msgstr ""
630
646
631 #: rhodecode/controllers/summary.py:240
647 #: rhodecode/controllers/summary.py:235
632 msgid "Branch"
648 msgid "Branch"
633 msgstr ""
649 msgstr ""
634
650
635 #: rhodecode/controllers/summary.py:241
651 #: rhodecode/controllers/summary.py:236
636 msgid "Tag"
652 msgid "Tag"
637 msgstr ""
653 msgstr ""
638
654
639 #: rhodecode/controllers/summary.py:242
655 #: rhodecode/controllers/summary.py:237
640 msgid "Bookmark"
656 msgid "Bookmark"
641 msgstr ""
657 msgstr ""
642
658
643 #: rhodecode/controllers/summary.py:257
659 #: rhodecode/controllers/summary.py:252
644 msgid "Closed branches"
660 msgid "Closed branches"
645 msgstr ""
661 msgstr ""
646
662
@@ -652,83 +668,87 b' msgstr ""'
652 msgid "Error occurred during update of default values"
668 msgid "Error occurred during update of default values"
653 msgstr ""
669 msgstr ""
654
670
655 #: rhodecode/controllers/admin/gists.py:59
671 #: rhodecode/controllers/admin/gists.py:63
656 #: rhodecode/controllers/admin/my_account.py:307
672 #: rhodecode/controllers/admin/my_account.py:307
657 #: rhodecode/controllers/admin/users.py:436
673 #: rhodecode/controllers/admin/users.py:431
658 msgid "forever"
674 msgid "forever"
659 msgstr ""
675 msgstr ""
660
676
661 #: rhodecode/controllers/admin/gists.py:60
677 #: rhodecode/controllers/admin/gists.py:64
662 #: rhodecode/controllers/admin/my_account.py:308
678 #: rhodecode/controllers/admin/my_account.py:308
663 #: rhodecode/controllers/admin/users.py:437
679 #: rhodecode/controllers/admin/users.py:432
664 msgid "5 minutes"
680 msgid "5 minutes"
665 msgstr ""
681 msgstr ""
666
682
667 #: rhodecode/controllers/admin/gists.py:61
683 #: rhodecode/controllers/admin/gists.py:65
668 #: rhodecode/controllers/admin/my_account.py:309
684 #: rhodecode/controllers/admin/my_account.py:309
669 #: rhodecode/controllers/admin/users.py:438
685 #: rhodecode/controllers/admin/users.py:433
670 msgid "1 hour"
686 msgid "1 hour"
671 msgstr ""
687 msgstr ""
672
688
673 #: rhodecode/controllers/admin/gists.py:62
689 #: rhodecode/controllers/admin/gists.py:66
674 #: rhodecode/controllers/admin/my_account.py:310
690 #: rhodecode/controllers/admin/my_account.py:310
675 #: rhodecode/controllers/admin/users.py:439
691 #: rhodecode/controllers/admin/users.py:434
676 msgid "1 day"
692 msgid "1 day"
677 msgstr ""
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 #: rhodecode/controllers/admin/gists.py:67
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 #: rhodecode/controllers/admin/my_account.py:313
702 #: rhodecode/controllers/admin/my_account.py:313
687 #: rhodecode/controllers/admin/users.py:442
703 #: rhodecode/controllers/admin/users.py:437
688 msgid "Lifetime"
704 msgid "Lifetime"
689 msgstr ""
705 msgstr ""
690
706
691 #: rhodecode/controllers/admin/gists.py:69
707 #: rhodecode/controllers/admin/gists.py:73
692 msgid "Requires registered account"
708 msgid "Requires registered account"
693 msgstr ""
709 msgstr ""
694
710
695 #: rhodecode/controllers/admin/gists.py:70
711 #: rhodecode/controllers/admin/gists.py:74
696 msgid "Can be accessed by anonymous users"
712 msgid "Can be accessed by anonymous users"
697 msgstr ""
713 msgstr ""
698
714
699 #: rhodecode/controllers/admin/gists.py:180
715 #: rhodecode/controllers/admin/gists.py:200
700 msgid "Error occurred during gist creation"
716 msgid "Error occurred during gist creation"
701 msgstr ""
717 msgstr ""
702
718
703 #: rhodecode/controllers/admin/gists.py:211
719 #: rhodecode/controllers/admin/gists.py:231
704 #, python-format
720 #, python-format
705 msgid "Deleted gist %s"
721 msgid "Deleted gist %s"
706 msgstr ""
722 msgstr ""
707
723
708 #: rhodecode/controllers/admin/gists.py:284
724 #: rhodecode/controllers/admin/gists.py:308
709 msgid "Successfully updated gist content"
725 msgid "Successfully updated gist content"
710 msgstr ""
726 msgstr ""
711
727
712 #: rhodecode/controllers/admin/gists.py:289
728 #: rhodecode/controllers/admin/gists.py:313
713 msgid "Successfully updated gist data"
729 msgid "Successfully updated gist data"
714 msgstr ""
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 #, python-format
737 #, python-format
718 msgid "Error occurred during update of gist %s"
738 msgid "Error occurred during update of gist %s"
719 msgstr ""
739 msgstr ""
720
740
721 #: rhodecode/controllers/admin/gists.py:315
741 #: rhodecode/controllers/admin/gists.py:343
722 #: rhodecode/templates/admin/gists/show.html:67
742 #: rhodecode/templates/admin/gists/show.html:67
723 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:19
743 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:19
724 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:42
744 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:42
725 #: rhodecode/templates/admin/users/user_edit_auth_tokens.html:16
745 #: rhodecode/templates/admin/users/user_edit_auth_tokens.html:16
726 #: rhodecode/templates/admin/users/user_edit_auth_tokens.html:38
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 msgid "never"
748 msgid "never"
729 msgstr ""
749 msgstr ""
730
750
731 #: rhodecode/controllers/admin/gists.py:320
751 #: rhodecode/controllers/admin/gists.py:348
732 #, python-format
752 #, python-format
733 msgid "%(expiry)s - current value"
753 msgid "%(expiry)s - current value"
734 msgstr ""
754 msgstr ""
@@ -742,7 +762,7 b' msgid "Your account was updated successf'
742 msgstr ""
762 msgstr ""
743
763
744 #: rhodecode/controllers/admin/my_account.py:143
764 #: rhodecode/controllers/admin/my_account.py:143
745 #: rhodecode/controllers/admin/users.py:223
765 #: rhodecode/controllers/admin/users.py:218
746 #, python-format
766 #, python-format
747 msgid "Error occurred during update of user %s"
767 msgid "Error occurred during update of user %s"
748 msgstr ""
768 msgstr ""
@@ -756,38 +776,38 b' msgid "Error occurred during update of u'
756 msgstr ""
776 msgstr ""
757
777
758 #: rhodecode/controllers/admin/my_account.py:261
778 #: rhodecode/controllers/admin/my_account.py:261
759 #: rhodecode/controllers/admin/users.py:616
779 #: rhodecode/controllers/admin/users.py:611
760 #, python-format
780 #, python-format
761 msgid "Added new email address `%s` for user account"
781 msgid "Added new email address `%s` for user account"
762 msgstr ""
782 msgstr ""
763
783
764 #: rhodecode/controllers/admin/my_account.py:268
784 #: rhodecode/controllers/admin/my_account.py:268
765 #: rhodecode/controllers/admin/users.py:623
785 #: rhodecode/controllers/admin/users.py:618
766 msgid "An error occurred during email saving"
786 msgid "An error occurred during email saving"
767 msgstr ""
787 msgstr ""
768
788
769 #: rhodecode/controllers/admin/my_account.py:278
789 #: rhodecode/controllers/admin/my_account.py:278
770 #: rhodecode/controllers/admin/users.py:638
790 #: rhodecode/controllers/admin/users.py:633
771 msgid "Removed email address from user account"
791 msgid "Removed email address from user account"
772 msgstr ""
792 msgstr ""
773
793
774 #: rhodecode/controllers/admin/my_account.py:316
794 #: rhodecode/controllers/admin/my_account.py:316
775 #: rhodecode/controllers/admin/users.py:445
795 #: rhodecode/controllers/admin/users.py:440
776 msgid "Role"
796 msgid "Role"
777 msgstr ""
797 msgstr ""
778
798
779 #: rhodecode/controllers/admin/my_account.py:329
799 #: rhodecode/controllers/admin/my_account.py:329
780 #: rhodecode/controllers/admin/users.py:469
800 #: rhodecode/controllers/admin/users.py:464
781 msgid "Auth token successfully created"
801 msgid "Auth token successfully created"
782 msgstr ""
802 msgstr ""
783
803
784 #: rhodecode/controllers/admin/my_account.py:342
804 #: rhodecode/controllers/admin/my_account.py:342
785 #: rhodecode/controllers/admin/users.py:488
805 #: rhodecode/controllers/admin/users.py:483
786 msgid "Auth token successfully reset"
806 msgid "Auth token successfully reset"
787 msgstr ""
807 msgstr ""
788
808
789 #: rhodecode/controllers/admin/my_account.py:346
809 #: rhodecode/controllers/admin/my_account.py:346
790 #: rhodecode/controllers/admin/users.py:492
810 #: rhodecode/controllers/admin/users.py:487
791 msgid "Auth token successfully deleted"
811 msgid "Auth token successfully deleted"
792 msgstr ""
812 msgstr ""
793
813
@@ -862,170 +882,170 b' msgstr ""'
862 msgid "Repository Group permissions updated"
882 msgid "Repository Group permissions updated"
863 msgstr ""
883 msgstr ""
864
884
865 #: rhodecode/controllers/admin/repos.py:128
885 #: rhodecode/controllers/admin/repos.py:129
866 #, python-format
886 #, python-format
867 msgid "Error creating repository %s: invalid certificate"
887 msgid "Error creating repository %s: invalid certificate"
868 msgstr ""
888 msgstr ""
869
889
870 #: rhodecode/controllers/admin/repos.py:132
890 #: rhodecode/controllers/admin/repos.py:133
871 #, python-format
891 #, python-format
872 msgid "Error creating repository %s"
892 msgid "Error creating repository %s"
873 msgstr ""
893 msgstr ""
874
894
875 #: rhodecode/controllers/admin/repos.py:264
895 #: rhodecode/controllers/admin/repos.py:265
876 #, python-format
896 #, python-format
877 msgid "Created repository %s from %s"
897 msgid "Created repository %s from %s"
878 msgstr ""
898 msgstr ""
879
899
880 #: rhodecode/controllers/admin/repos.py:273
900 #: rhodecode/controllers/admin/repos.py:274
881 #, python-format
901 #, python-format
882 msgid "Forked repository %s as %s"
902 msgid "Forked repository %s as %s"
883 msgstr ""
903 msgstr ""
884
904
885 #: rhodecode/controllers/admin/repos.py:276
905 #: rhodecode/controllers/admin/repos.py:277
886 #, python-format
906 #, python-format
887 msgid "Created repository %s"
907 msgid "Created repository %s"
888 msgstr ""
908 msgstr ""
889
909
890 #: rhodecode/controllers/admin/repos.py:318
910 #: rhodecode/controllers/admin/repos.py:319
891 #, python-format
911 #, python-format
892 msgid "Repository %s updated successfully"
912 msgid "Repository %s updated successfully"
893 msgstr ""
913 msgstr ""
894
914
895 #: rhodecode/controllers/admin/repos.py:337
915 #: rhodecode/controllers/admin/repos.py:338
896 #, python-format
916 #, python-format
897 msgid "Error occurred during update of repository %s"
917 msgid "Error occurred during update of repository %s"
898 msgstr ""
918 msgstr ""
899
919
900 #: rhodecode/controllers/admin/repos.py:365
920 #: rhodecode/controllers/admin/repos.py:366
901 #, python-format
921 #, python-format
902 msgid "Detached %s forks"
922 msgid "Detached %s forks"
903 msgstr ""
923 msgstr ""
904
924
905 #: rhodecode/controllers/admin/repos.py:368
925 #: rhodecode/controllers/admin/repos.py:369
906 #, python-format
926 #, python-format
907 msgid "Deleted %s forks"
927 msgid "Deleted %s forks"
908 msgstr ""
928 msgstr ""
909
929
910 #: rhodecode/controllers/admin/repos.py:373
930 #: rhodecode/controllers/admin/repos.py:374
911 #, python-format
931 #, python-format
912 msgid "Deleted repository %s"
932 msgid "Deleted repository %s"
913 msgstr ""
933 msgstr ""
914
934
915 #: rhodecode/controllers/admin/repos.py:376
935 #: rhodecode/controllers/admin/repos.py:377
916 #, python-format
936 #, python-format
917 msgid "Cannot delete %s it still contains attached forks"
937 msgid "Cannot delete %s it still contains attached forks"
918 msgstr ""
938 msgstr ""
919
939
920 #: rhodecode/controllers/admin/repos.py:381
940 #: rhodecode/controllers/admin/repos.py:382
921 #, python-format
941 #, python-format
922 msgid "An error occurred during deletion of %s"
942 msgid "An error occurred during deletion of %s"
923 msgstr ""
943 msgstr ""
924
944
925 #: rhodecode/controllers/admin/repos.py:435
945 #: rhodecode/controllers/admin/repos.py:436
926 msgid "Repository permissions updated"
946 msgid "Repository permissions updated"
927 msgstr ""
947 msgstr ""
928
948
929 #: rhodecode/controllers/admin/repos.py:466
949 #: rhodecode/controllers/admin/repos.py:467
930 msgid "An error occurred during creation of field"
950 msgid "An error occurred during creation of field"
931 msgstr ""
951 msgstr ""
932
952
933 #: rhodecode/controllers/admin/repos.py:481
953 #: rhodecode/controllers/admin/repos.py:482
934 msgid "An error occurred during removal of field"
954 msgid "An error occurred during removal of field"
935 msgstr ""
955 msgstr ""
936
956
937 #: rhodecode/controllers/admin/repos.py:520
957 #: rhodecode/controllers/admin/repos.py:521
938 msgid "Updated repository visibility in public journal"
958 msgid "Updated repository visibility in public journal"
939 msgstr ""
959 msgstr ""
940
960
941 #: rhodecode/controllers/admin/repos.py:524
961 #: rhodecode/controllers/admin/repos.py:525
942 msgid "An error occurred during setting this repository in public journal"
962 msgid "An error occurred during setting this repository in public journal"
943 msgstr ""
963 msgstr ""
944
964
945 #: rhodecode/controllers/admin/repos.py:548
965 #: rhodecode/controllers/admin/repos.py:549
946 msgid "Nothing"
966 msgid "Nothing"
947 msgstr ""
967 msgstr ""
948
968
949 #: rhodecode/controllers/admin/repos.py:550
969 #: rhodecode/controllers/admin/repos.py:551
950 #, python-format
970 #, python-format
951 msgid "Marked repo %s as fork of %s"
971 msgid "Marked repo %s as fork of %s"
952 msgstr ""
972 msgstr ""
953
973
954 #: rhodecode/controllers/admin/repos.py:557
974 #: rhodecode/controllers/admin/repos.py:558
955 msgid "An error occurred during this operation"
975 msgid "An error occurred during this operation"
956 msgstr ""
976 msgstr ""
957
977
958 #: rhodecode/controllers/admin/repos.py:575
978 #: rhodecode/controllers/admin/repos.py:576
959 msgid "Locked repository"
979 msgid "Locked repository"
960 msgstr ""
980 msgstr ""
961
981
962 #: rhodecode/controllers/admin/repos.py:578
982 #: rhodecode/controllers/admin/repos.py:579
963 msgid "Unlocked repository"
983 msgid "Unlocked repository"
964 msgstr ""
984 msgstr ""
965
985
966 #: rhodecode/controllers/admin/repos.py:581
986 #: rhodecode/controllers/admin/repos.py:582
967 #: rhodecode/controllers/admin/repos.py:610
987 #: rhodecode/controllers/admin/repos.py:611
968 msgid "An error occurred during unlocking"
988 msgid "An error occurred during unlocking"
969 msgstr ""
989 msgstr ""
970
990
971 #: rhodecode/controllers/admin/repos.py:600
991 #: rhodecode/controllers/admin/repos.py:601
972 msgid "Unlocked"
992 msgid "Unlocked"
973 msgstr ""
993 msgstr ""
974
994
975 #: rhodecode/controllers/admin/repos.py:604
995 #: rhodecode/controllers/admin/repos.py:605
976 msgid "Locked"
996 msgid "Locked"
977 msgstr ""
997 msgstr ""
978
998
979 #: rhodecode/controllers/admin/repos.py:606
999 #: rhodecode/controllers/admin/repos.py:607
980 #, python-format
1000 #, python-format
981 msgid "Repository has been %s"
1001 msgid "Repository has been %s"
982 msgstr ""
1002 msgstr ""
983
1003
984 #: rhodecode/controllers/admin/repos.py:621
1004 #: rhodecode/controllers/admin/repos.py:622
985 msgid "Cache invalidation successful"
1005 msgid "Cache invalidation successful"
986 msgstr ""
1006 msgstr ""
987
1007
988 #: rhodecode/controllers/admin/repos.py:625
1008 #: rhodecode/controllers/admin/repos.py:626
989 msgid "An error occurred during cache invalidation"
1009 msgid "An error occurred during cache invalidation"
990 msgstr ""
1010 msgstr ""
991
1011
992 #: rhodecode/controllers/admin/repos.py:645
1012 #: rhodecode/controllers/admin/repos.py:646
993 msgid "Pulled from remote location"
1013 msgid "Pulled from remote location"
994 msgstr ""
1014 msgstr ""
995
1015
996 #: rhodecode/controllers/admin/repos.py:648
1016 #: rhodecode/controllers/admin/repos.py:649
997 msgid "An error occurred during pull from remote location"
1017 msgid "An error occurred during pull from remote location"
998 msgstr ""
1018 msgstr ""
999
1019
1000 #: rhodecode/controllers/admin/repos.py:670
1020 #: rhodecode/controllers/admin/repos.py:671
1001 msgid "An error occurred during deletion of repository stats"
1021 msgid "An error occurred during deletion of repository stats"
1002 msgstr ""
1022 msgstr ""
1003
1023
1004 #: rhodecode/controllers/admin/repos.py:717
1024 #: rhodecode/controllers/admin/repos.py:718
1005 msgid "Error occurred during deleting issue tracker entry"
1025 msgid "Error occurred during deleting issue tracker entry"
1006 msgstr ""
1026 msgstr ""
1007
1027
1008 #: rhodecode/controllers/admin/repos.py:720
1028 #: rhodecode/controllers/admin/repos.py:721
1009 #: rhodecode/controllers/admin/settings.py:363
1029 #: rhodecode/controllers/admin/settings.py:363
1010 msgid "Removed issue tracker entry"
1030 msgid "Removed issue tracker entry"
1011 msgstr ""
1031 msgstr ""
1012
1032
1013 #: rhodecode/controllers/admin/repos.py:750
1033 #: rhodecode/controllers/admin/repos.py:751
1014 #: rhodecode/controllers/admin/settings.py:409
1034 #: rhodecode/controllers/admin/settings.py:409
1015 msgid "Updated issue tracker entries"
1035 msgid "Updated issue tracker entries"
1016 msgstr ""
1036 msgstr ""
1017
1037
1018 #: rhodecode/controllers/admin/repos.py:809
1038 #: rhodecode/controllers/admin/repos.py:812
1019 #: rhodecode/controllers/admin/settings.py:142
1039 #: rhodecode/controllers/admin/settings.py:142
1020 #: rhodecode/controllers/admin/settings.py:719
1040 #: rhodecode/controllers/admin/settings.py:719
1021 msgid "Some form inputs contain invalid data."
1041 msgid "Some form inputs contain invalid data."
1022 msgstr ""
1042 msgstr ""
1023
1043
1024 #: rhodecode/controllers/admin/repos.py:827
1044 #: rhodecode/controllers/admin/repos.py:830
1025 msgid "Error occurred during updating repository VCS settings"
1045 msgid "Error occurred during updating repository VCS settings"
1026 msgstr ""
1046 msgstr ""
1027
1047
1028 #: rhodecode/controllers/admin/repos.py:831
1048 #: rhodecode/controllers/admin/repos.py:834
1029 #: rhodecode/controllers/admin/settings.py:168
1049 #: rhodecode/controllers/admin/settings.py:168
1030 msgid "Updated VCS settings"
1050 msgid "Updated VCS settings"
1031 msgstr ""
1051 msgstr ""
@@ -1091,26 +1111,18 b' msgid "Updated Labs settings"'
1091 msgstr ""
1111 msgstr ""
1092
1112
1093 #: rhodecode/controllers/admin/settings.py:795
1113 #: rhodecode/controllers/admin/settings.py:795
1094 msgid "Mercurial server-side merge"
1114 msgid "Subversion HTTP Support"
1095 msgstr ""
1115 msgstr ""
1096
1116
1097 #: rhodecode/controllers/admin/settings.py:796
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 msgstr ""
1119 msgstr ""
1100
1120
1101 #: rhodecode/controllers/admin/settings.py:802
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 msgid "Subversion HTTP Server URL"
1122 msgid "Subversion HTTP Server URL"
1111 msgstr ""
1123 msgstr ""
1112
1124
1113 #: rhodecode/controllers/admin/settings.py:811
1125 #: rhodecode/controllers/admin/settings.py:804
1114 msgid "e.g. http://localhost:8080/"
1126 msgid "e.g. http://localhost:8080/"
1115 msgstr ""
1127 msgstr ""
1116
1128
@@ -1155,121 +1167,281 b' msgid "User Group global permissions upd'
1155 msgstr ""
1167 msgstr ""
1156
1168
1157 #: rhodecode/controllers/admin/user_groups.py:440
1169 #: rhodecode/controllers/admin/user_groups.py:440
1158 #: rhodecode/controllers/admin/users.py:566
1170 #: rhodecode/controllers/admin/users.py:561
1159 msgid "An error occurred during permissions saving"
1171 msgid "An error occurred during permissions saving"
1160 msgstr ""
1172 msgstr ""
1161
1173
1162 #: rhodecode/controllers/admin/users.py:147
1174 #: rhodecode/controllers/admin/users.py:142
1163 #, python-format
1175 #, python-format
1164 msgid "Created user %(user_link)s"
1176 msgid "Created user %(user_link)s"
1165 msgstr ""
1177 msgstr ""
1166
1178
1167 #: rhodecode/controllers/admin/users.py:162
1179 #: rhodecode/controllers/admin/users.py:157
1168 #, python-format
1180 #, python-format
1169 msgid "Error occurred during creation of user %s"
1181 msgid "Error occurred during creation of user %s"
1170 msgstr ""
1182 msgstr ""
1171
1183
1172 #: rhodecode/controllers/admin/users.py:206
1184 #: rhodecode/controllers/admin/users.py:201
1173 msgid "User updated successfully"
1185 msgid "User updated successfully"
1174 msgstr ""
1186 msgstr ""
1175
1187
1188 #: rhodecode/controllers/admin/users.py:252
1189 #, python-format
1190 msgid "Detached %s repositories"
1191 msgstr ""
1192
1176 #: rhodecode/controllers/admin/users.py:257
1193 #: rhodecode/controllers/admin/users.py:257
1177 #, python-format
1194 #, python-format
1178 msgid "Detached %s repositories"
1179 msgstr ""
1180
1181 #: rhodecode/controllers/admin/users.py:262
1182 #, python-format
1183 msgid "Deleted %s repositories"
1195 msgid "Deleted %s repositories"
1184 msgstr ""
1196 msgstr ""
1185
1197
1198 #: rhodecode/controllers/admin/users.py:265
1199 #, python-format
1200 msgid "Detached %s repository groups"
1201 msgstr ""
1202
1186 #: rhodecode/controllers/admin/users.py:270
1203 #: rhodecode/controllers/admin/users.py:270
1187 #, python-format
1204 #, python-format
1188 msgid "Detached %s repository groups"
1189 msgstr ""
1190
1191 #: rhodecode/controllers/admin/users.py:275
1192 #, python-format
1193 msgid "Deleted %s repository groups"
1205 msgid "Deleted %s repository groups"
1194 msgstr ""
1206 msgstr ""
1195
1207
1208 #: rhodecode/controllers/admin/users.py:278
1209 #, python-format
1210 msgid "Detached %s user groups"
1211 msgstr ""
1212
1196 #: rhodecode/controllers/admin/users.py:283
1213 #: rhodecode/controllers/admin/users.py:283
1197 #, python-format
1214 #, python-format
1198 msgid "Detached %s user groups"
1199 msgstr ""
1200
1201 #: rhodecode/controllers/admin/users.py:288
1202 #, python-format
1203 msgid "Deleted %s user groups"
1215 msgid "Deleted %s user groups"
1204 msgstr ""
1216 msgstr ""
1205
1217
1206 #: rhodecode/controllers/admin/users.py:299
1218 #: rhodecode/controllers/admin/users.py:294
1207 msgid "Successfully deleted user"
1219 msgid "Successfully deleted user"
1208 msgstr ""
1220 msgstr ""
1209
1221
1210 #: rhodecode/controllers/admin/users.py:305
1222 #: rhodecode/controllers/admin/users.py:300
1211 msgid "An error occurred during deletion of user"
1223 msgid "An error occurred during deletion of user"
1212 msgstr ""
1224 msgstr ""
1213
1225
1214 #: rhodecode/controllers/admin/users.py:324
1226 #: rhodecode/controllers/admin/users.py:319
1215 msgid "Force password change disabled for user"
1227 msgid "Force password change disabled for user"
1216 msgstr ""
1228 msgstr ""
1217
1229
1218 #: rhodecode/controllers/admin/users.py:326
1230 #: rhodecode/controllers/admin/users.py:321
1219 msgid "Force password change enabled for user"
1231 msgid "Force password change enabled for user"
1220 msgstr ""
1232 msgstr ""
1221
1233
1222 #: rhodecode/controllers/admin/users.py:330
1234 #: rhodecode/controllers/admin/users.py:325
1223 msgid "An error occurred during password reset for user"
1235 msgid "An error occurred during password reset for user"
1224 msgstr ""
1236 msgstr ""
1225
1237
1226 #: rhodecode/controllers/admin/users.py:356
1238 #: rhodecode/controllers/admin/users.py:351
1227 #, python-format
1239 #, python-format
1228 msgid "Created repository group `%s`"
1240 msgid "Created repository group `%s`"
1229 msgstr ""
1241 msgstr ""
1230
1242
1231 #: rhodecode/controllers/admin/users.py:360
1243 #: rhodecode/controllers/admin/users.py:355
1232 msgid "An error occurred during repository group creation for user"
1244 msgid "An error occurred during repository group creation for user"
1233 msgstr ""
1245 msgstr ""
1234
1246
1235 #: rhodecode/controllers/admin/users.py:379
1247 #: rhodecode/controllers/admin/users.py:374
1236 #: rhodecode/controllers/admin/users.py:400
1248 #: rhodecode/controllers/admin/users.py:395
1237 #: rhodecode/controllers/admin/users.py:430
1249 #: rhodecode/controllers/admin/users.py:425
1238 #: rhodecode/controllers/admin/users.py:461
1250 #: rhodecode/controllers/admin/users.py:456
1239 #: rhodecode/controllers/admin/users.py:478
1251 #: rhodecode/controllers/admin/users.py:473
1240 #: rhodecode/controllers/admin/users.py:501
1252 #: rhodecode/controllers/admin/users.py:496
1241 #: rhodecode/controllers/admin/users.py:575
1253 #: rhodecode/controllers/admin/users.py:570
1242 #: rhodecode/controllers/admin/users.py:588
1254 #: rhodecode/controllers/admin/users.py:583
1243 #: rhodecode/controllers/admin/users.py:646
1255 #: rhodecode/controllers/admin/users.py:641
1244 msgid "You can't edit this user"
1256 msgid "You can't edit this user"
1245 msgstr ""
1257 msgstr ""
1246
1258
1247 #: rhodecode/controllers/admin/users.py:414
1259 #: rhodecode/controllers/admin/users.py:409
1248 msgid "The user participates as reviewer in pull requests and cannot be deleted. You can set the user to \"inactive\" instead of deleting it."
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 msgstr ""
1261 msgstr ""
1250
1262
1251 #: rhodecode/controllers/admin/users.py:550
1263 #: rhodecode/controllers/admin/users.py:545
1252 msgid "User global permissions updated successfully"
1264 msgid "User global permissions updated successfully"
1253 msgstr ""
1265 msgstr ""
1254
1266
1255 #: rhodecode/controllers/admin/users.py:678
1267 #: rhodecode/controllers/admin/users.py:673
1256 #, python-format
1268 #, python-format
1257 msgid "An error occurred during ip saving:%s"
1269 msgid "An error occurred during ip saving:%s"
1258 msgstr ""
1270 msgstr ""
1259
1271
1260 #: rhodecode/controllers/admin/users.py:693
1272 #: rhodecode/controllers/admin/users.py:688
1261 msgid "An error occurred during ip saving"
1273 msgid "An error occurred during ip saving"
1262 msgstr ""
1274 msgstr ""
1263
1275
1264 #: rhodecode/controllers/admin/users.py:697
1276 #: rhodecode/controllers/admin/users.py:692
1265 #, python-format
1277 #, python-format
1266 msgid "Added ips %s to user whitelist"
1278 msgid "Added ips %s to user whitelist"
1267 msgstr ""
1279 msgstr ""
1268
1280
1269 #: rhodecode/controllers/admin/users.py:715
1281 #: rhodecode/controllers/admin/users.py:710
1270 msgid "Removed ip address from user whitelist"
1282 msgid "Removed ip address from user whitelist"
1271 msgstr ""
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 #: rhodecode/lib/action_parser.py:89
1445 #: rhodecode/lib/action_parser.py:89
1274 msgid "[deleted] repository"
1446 msgid "[deleted] repository"
1275 msgstr ""
1447 msgstr ""
@@ -1411,11 +1583,15 b' msgstr ""'
1411 msgid "You need to be signed in to view this page"
1583 msgid "You need to be signed in to view this page"
1412 msgstr ""
1584 msgstr ""
1413
1585
1414 #: rhodecode/lib/base.py:511
1586 #: rhodecode/lib/base.py:545
1415 #, python-format
1587 #, python-format
1416 msgid "The repository at %(repo_name)s cannot be located."
1588 msgid "The repository at %(repo_name)s cannot be located."
1417 msgstr ""
1589 msgstr ""
1418
1590
1591 #: rhodecode/lib/diffs.py:56
1592 msgid "Click to comment"
1593 msgstr ""
1594
1419 #: rhodecode/lib/diffs.py:71
1595 #: rhodecode/lib/diffs.py:71
1420 msgid "Binary file"
1596 msgid "Binary file"
1421 msgstr ""
1597 msgstr ""
@@ -1428,36 +1604,40 b' msgstr ""'
1428 msgid "No changes detected"
1604 msgid "No changes detected"
1429 msgstr ""
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 #, python-format
1612 #, python-format
1433 msgid " and %s more"
1613 msgid " and %s more"
1434 msgstr ""
1614 msgstr ""
1435
1615
1436 #: rhodecode/lib/helpers.py:1438
1616 #: rhodecode/lib/helpers.py:1485
1437 msgid "No Files"
1617 msgid "No Files"
1438 msgstr ""
1618 msgstr ""
1439
1619
1440 #: rhodecode/lib/helpers.py:1511
1620 #: rhodecode/lib/helpers.py:1558
1441 msgid "new file"
1621 msgid "new file"
1442 msgstr ""
1622 msgstr ""
1443
1623
1444 #: rhodecode/lib/helpers.py:1514
1624 #: rhodecode/lib/helpers.py:1561
1445 msgid "mod"
1625 msgid "mod"
1446 msgstr ""
1626 msgstr ""
1447
1627
1448 #: rhodecode/lib/helpers.py:1517
1628 #: rhodecode/lib/helpers.py:1564
1449 msgid "del"
1629 msgid "del"
1450 msgstr ""
1630 msgstr ""
1451
1631
1452 #: rhodecode/lib/helpers.py:1520
1632 #: rhodecode/lib/helpers.py:1567
1453 msgid "rename"
1633 msgid "rename"
1454 msgstr ""
1634 msgstr ""
1455
1635
1456 #: rhodecode/lib/helpers.py:1525
1636 #: rhodecode/lib/helpers.py:1572
1457 msgid "chmod"
1637 msgid "chmod"
1458 msgstr ""
1638 msgstr ""
1459
1639
1460 #: rhodecode/lib/helpers.py:1767
1640 #: rhodecode/lib/helpers.py:1819
1461 msgid ""
1641 msgid ""
1462 "Example filter terms:\n"
1642 "Example filter terms:\n"
1463 " repository:vcs\n"
1643 " repository:vcs\n"
@@ -1476,89 +1656,91 b' msgid ""'
1476 " \"username:test AND repository:test*\"\n"
1656 " \"username:test AND repository:test*\"\n"
1477 msgstr ""
1657 msgstr ""
1478
1658
1479 #: rhodecode/lib/helpers.py:1787
1659 #: rhodecode/lib/helpers.py:1839
1480 #, python-format
1660 #, python-format
1481 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"
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 msgstr ""
1662 msgstr ""
1483
1663
1484 #: rhodecode/lib/utils2.py:453
1664 #: rhodecode/lib/utils2.py:454
1485 #, python-format
1665 #, python-format
1486 msgid "%d year"
1666 msgid "%d year"
1487 msgid_plural "%d years"
1667 msgid_plural "%d years"
1488 msgstr[0] ""
1668 msgstr[0] ""
1489 msgstr[1] ""
1669 msgstr[1] ""
1490
1670
1491 #: rhodecode/lib/utils2.py:454
1671 #: rhodecode/lib/utils2.py:455
1492 #, python-format
1672 #, python-format
1493 msgid "%d month"
1673 msgid "%d month"
1494 msgid_plural "%d months"
1674 msgid_plural "%d months"
1495 msgstr[0] ""
1675 msgstr[0] ""
1496 msgstr[1] ""
1676 msgstr[1] ""
1497
1677
1498 #: rhodecode/lib/utils2.py:455
1678 #: rhodecode/lib/utils2.py:456
1499 #, python-format
1679 #, python-format
1500 msgid "%d day"
1680 msgid "%d day"
1501 msgid_plural "%d days"
1681 msgid_plural "%d days"
1502 msgstr[0] ""
1682 msgstr[0] ""
1503 msgstr[1] ""
1683 msgstr[1] ""
1504
1684
1505 #: rhodecode/lib/utils2.py:456
1685 #: rhodecode/lib/utils2.py:457
1506 #, python-format
1686 #, python-format
1507 msgid "%d hour"
1687 msgid "%d hour"
1508 msgid_plural "%d hours"
1688 msgid_plural "%d hours"
1509 msgstr[0] ""
1689 msgstr[0] ""
1510 msgstr[1] ""
1690 msgstr[1] ""
1511
1691
1512 #: rhodecode/lib/utils2.py:457
1692 #: rhodecode/lib/utils2.py:458
1513 #, python-format
1693 #, python-format
1514 msgid "%d minute"
1694 msgid "%d minute"
1515 msgid_plural "%d minutes"
1695 msgid_plural "%d minutes"
1516 msgstr[0] ""
1696 msgstr[0] ""
1517 msgstr[1] ""
1697 msgstr[1] ""
1518
1698
1519 #: rhodecode/lib/utils2.py:458
1699 #: rhodecode/lib/utils2.py:459
1520 #, python-format
1700 #, python-format
1521 msgid "%d second"
1701 msgid "%d second"
1522 msgid_plural "%d seconds"
1702 msgid_plural "%d seconds"
1523 msgstr[0] ""
1703 msgstr[0] ""
1524 msgstr[1] ""
1704 msgstr[1] ""
1525
1705
1526 #: rhodecode/lib/utils2.py:476
1706 #: rhodecode/lib/utils2.py:477
1527 #, python-format
1707 #, python-format
1528 msgid "in %s"
1708 msgid "in %s"
1529 msgstr ""
1709 msgstr ""
1530
1710
1531 #: rhodecode/lib/utils2.py:482
1711 #: rhodecode/lib/utils2.py:483
1532 #, python-format
1712 #, python-format
1533 msgid "%s ago"
1713 msgid "%s ago"
1534 msgstr ""
1714 msgstr ""
1535
1715
1536 #: rhodecode/lib/utils2.py:492
1716 #: rhodecode/lib/utils2.py:493
1537 #, python-format
1717 #, python-format
1538 msgid "%s, %s ago"
1718 msgid "%s, %s ago"
1539 msgstr ""
1719 msgstr ""
1540
1720
1541 #: rhodecode/lib/utils2.py:494
1721 #: rhodecode/lib/utils2.py:495
1542 #, python-format
1722 #, python-format
1543 msgid "in %s, %s"
1723 msgid "in %s, %s"
1544 msgstr ""
1724 msgstr ""
1545
1725
1546 #: rhodecode/lib/utils2.py:496
1726 #: rhodecode/lib/utils2.py:497
1547 #, python-format
1727 #, python-format
1548 msgid "%s and %s"
1728 msgid "%s and %s"
1549 msgstr ""
1729 msgstr ""
1550
1730
1551 #: rhodecode/lib/utils2.py:498
1731 #: rhodecode/lib/utils2.py:499
1552 #, python-format
1732 #, python-format
1553 msgid "%s and %s ago"
1733 msgid "%s and %s ago"
1554 msgstr ""
1734 msgstr ""
1555
1735
1556 #: rhodecode/lib/utils2.py:500
1736 #: rhodecode/lib/utils2.py:501
1557 #, python-format
1737 #, python-format
1558 msgid "in %s and %s"
1738 msgid "in %s and %s"
1559 msgstr ""
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 msgid "just now"
1744 msgid "just now"
1563 msgstr ""
1745 msgstr ""
1564
1746
@@ -1584,7 +1766,8 b' msgstr ""'
1584 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:818
1766 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:818
1585 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:824
1767 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:824
1586 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:946
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 msgid "Repository no access"
1771 msgid "Repository no access"
1589 msgstr ""
1772 msgstr ""
1590
1773
@@ -1610,7 +1793,8 b' msgstr ""'
1610 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:819
1793 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:819
1611 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:825
1794 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:825
1612 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:947
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 msgid "Repository read access"
1798 msgid "Repository read access"
1615 msgstr ""
1799 msgstr ""
1616
1800
@@ -1636,7 +1820,8 b' msgstr ""'
1636 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:820
1820 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:820
1637 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:826
1821 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:826
1638 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:948
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 msgid "Repository write access"
1825 msgid "Repository write access"
1641 msgstr ""
1826 msgstr ""
1642
1827
@@ -1662,7 +1847,8 b' msgstr ""'
1662 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:821
1847 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:821
1663 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:827
1848 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:827
1664 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:949
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 msgid "Repository admin access"
1852 msgid "Repository admin access"
1667 msgstr ""
1853 msgstr ""
1668
1854
@@ -1728,7 +1914,8 b' msgstr ""'
1728 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:839
1914 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:839
1729 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:845
1915 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:845
1730 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:967
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 msgid "Repository creation disabled"
1919 msgid "Repository creation disabled"
1733 msgstr ""
1920 msgstr ""
1734
1921
@@ -1754,7 +1941,8 b' msgstr ""'
1754 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:840
1941 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:840
1755 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:846
1942 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:846
1756 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:968
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 msgid "Repository creation enabled"
1946 msgid "Repository creation enabled"
1759 msgstr ""
1947 msgstr ""
1760
1948
@@ -1780,7 +1968,8 b' msgstr ""'
1780 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:844
1968 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:844
1781 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:850
1969 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:850
1782 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:972
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 msgid "Repository forking disabled"
1973 msgid "Repository forking disabled"
1785 msgstr ""
1974 msgstr ""
1786
1975
@@ -1806,7 +1995,8 b' msgstr ""'
1806 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:845
1995 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:845
1807 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:851
1996 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:851
1808 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:973
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 msgid "Repository forking enabled"
2000 msgid "Repository forking enabled"
1811 msgstr ""
2001 msgstr ""
1812
2002
@@ -1853,7 +2043,8 b' msgstr ""'
1853 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:1186
2043 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:1186
1854 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:1196
2044 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:1196
1855 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:1318
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 msgid "Not Reviewed"
2048 msgid "Not Reviewed"
1858 msgstr ""
2049 msgstr ""
1859
2050
@@ -1879,7 +2070,8 b' msgstr ""'
1879 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:1187
2070 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:1187
1880 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:1197
2071 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:1197
1881 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:1319
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 msgid "Approved"
2075 msgid "Approved"
1884 msgstr ""
2076 msgstr ""
1885
2077
@@ -1905,7 +2097,8 b' msgstr ""'
1905 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:1188
2097 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:1188
1906 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:1198
2098 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:1198
1907 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:1320
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 msgid "Rejected"
2102 msgid "Rejected"
1910 msgstr ""
2103 msgstr ""
1911
2104
@@ -1931,7 +2124,8 b' msgstr ""'
1931 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:1189
2124 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:1189
1932 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:1199
2125 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:1199
1933 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:1321
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 msgid "Under Review"
2129 msgid "Under Review"
1936 msgstr ""
2130 msgstr ""
1937
2131
@@ -1954,7 +2148,8 b' msgstr ""'
1954 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:823
2148 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:823
1955 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:829
2149 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:829
1956 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:951
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 msgid "Repository group no access"
2153 msgid "Repository group no access"
1959 msgstr ""
2154 msgstr ""
1960
2155
@@ -1977,7 +2172,8 b' msgstr ""'
1977 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:824
2172 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:824
1978 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:830
2173 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:830
1979 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:952
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 msgid "Repository group read access"
2177 msgid "Repository group read access"
1982 msgstr ""
2178 msgstr ""
1983
2179
@@ -2000,7 +2196,8 b' msgstr ""'
2000 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:825
2196 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:825
2001 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:831
2197 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:831
2002 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:953
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 msgid "Repository group write access"
2201 msgid "Repository group write access"
2005 msgstr ""
2202 msgstr ""
2006
2203
@@ -2023,7 +2220,8 b' msgstr ""'
2023 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:826
2220 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:826
2024 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:832
2221 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:832
2025 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:954
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 msgid "Repository group admin access"
2225 msgid "Repository group admin access"
2028 msgstr ""
2226 msgstr ""
2029
2227
@@ -2045,7 +2243,8 b' msgstr ""'
2045 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:828
2243 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:828
2046 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:834
2244 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:834
2047 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:956
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 msgid "User group no access"
2248 msgid "User group no access"
2050 msgstr ""
2249 msgstr ""
2051
2250
@@ -2067,7 +2266,8 b' msgstr ""'
2067 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:829
2266 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:829
2068 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:835
2267 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:835
2069 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:957
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 msgid "User group read access"
2271 msgid "User group read access"
2072 msgstr ""
2272 msgstr ""
2073
2273
@@ -2089,7 +2289,8 b' msgstr ""'
2089 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:830
2289 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:830
2090 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:836
2290 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:836
2091 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:958
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 msgid "User group write access"
2294 msgid "User group write access"
2094 msgstr ""
2295 msgstr ""
2095
2296
@@ -2111,7 +2312,8 b' msgstr ""'
2111 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:831
2312 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:831
2112 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:837
2313 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:837
2113 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:959
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 msgid "User group admin access"
2317 msgid "User group admin access"
2116 msgstr ""
2318 msgstr ""
2117
2319
@@ -2133,7 +2335,8 b' msgstr ""'
2133 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:833
2335 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:833
2134 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:839
2336 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:839
2135 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:961
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 msgid "Repository Group creation disabled"
2340 msgid "Repository Group creation disabled"
2138 msgstr ""
2341 msgstr ""
2139
2342
@@ -2155,7 +2358,8 b' msgstr ""'
2155 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:834
2358 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:834
2156 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:840
2359 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:840
2157 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:962
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 msgid "Repository Group creation enabled"
2363 msgid "Repository Group creation enabled"
2160 msgstr ""
2364 msgstr ""
2161
2365
@@ -2177,7 +2381,8 b' msgstr ""'
2177 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:836
2381 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:836
2178 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:842
2382 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:842
2179 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:964
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 msgid "User Group creation disabled"
2386 msgid "User Group creation disabled"
2182 msgstr ""
2387 msgstr ""
2183
2388
@@ -2199,7 +2404,8 b' msgstr ""'
2199 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:837
2404 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:837
2200 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:843
2405 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:843
2201 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:965
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 msgid "User Group creation enabled"
2409 msgid "User Group creation enabled"
2204 msgstr ""
2410 msgstr ""
2205
2411
@@ -2221,7 +2427,8 b' msgstr ""'
2221 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:847
2427 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:847
2222 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:853
2428 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:853
2223 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:975
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 msgid "Registration disabled"
2432 msgid "Registration disabled"
2226 msgstr ""
2433 msgstr ""
2227
2434
@@ -2243,7 +2450,8 b' msgstr ""'
2243 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:848
2450 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:848
2244 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:854
2451 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:854
2245 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:976
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 msgid "User Registration with manual account activation"
2455 msgid "User Registration with manual account activation"
2248 msgstr ""
2456 msgstr ""
2249
2457
@@ -2265,7 +2473,8 b' msgstr ""'
2265 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:849
2473 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:849
2266 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:855
2474 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:855
2267 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:977
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 msgid "User Registration with automatic account activation"
2478 msgid "User Registration with automatic account activation"
2270 msgstr ""
2479 msgstr ""
2271
2480
@@ -2287,7 +2496,8 b' msgstr ""'
2287 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:851
2496 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:851
2288 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:857
2497 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:857
2289 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:979
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 msgid "Manual activation of external account"
2501 msgid "Manual activation of external account"
2292 msgstr ""
2502 msgstr ""
2293
2503
@@ -2309,7 +2519,8 b' msgstr ""'
2309 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:852
2519 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:852
2310 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:858
2520 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:858
2311 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:980
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 msgid "Automatic activation of external account"
2524 msgid "Automatic activation of external account"
2314 msgstr ""
2525 msgstr ""
2315
2526
@@ -2325,7 +2536,8 b' msgstr ""'
2325 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:841
2536 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:841
2326 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:847
2537 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:847
2327 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:969
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 msgid "Repository creation enabled with write permission to a repository group"
2541 msgid "Repository creation enabled with write permission to a repository group"
2330 msgstr ""
2542 msgstr ""
2331
2543
@@ -2341,7 +2553,8 b' msgstr ""'
2341 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:842
2553 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:842
2342 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:848
2554 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:848
2343 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:970
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 msgid "Repository creation disabled with write permission to a repository group"
2558 msgid "Repository creation disabled with write permission to a repository group"
2346 msgstr ""
2559 msgstr ""
2347
2560
@@ -2354,7 +2567,8 b' msgstr ""'
2354 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:816
2567 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:816
2355 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:822
2568 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:822
2356 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:944
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 msgid "RhodeCode Super Administrator"
2572 msgid "RhodeCode Super Administrator"
2359 msgstr ""
2573 msgstr ""
2360
2574
@@ -2365,7 +2579,8 b' msgstr ""'
2365 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:854
2579 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:854
2366 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:860
2580 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:860
2367 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:982
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 msgid "Inherit object permissions from default user disabled"
2584 msgid "Inherit object permissions from default user disabled"
2370 msgstr ""
2585 msgstr ""
2371
2586
@@ -2376,10 +2591,35 b' msgstr ""'
2376 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:855
2591 #: rhodecode/lib/dbmigrate/schema/db_3_2_0_0.py:855
2377 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:861
2592 #: rhodecode/lib/dbmigrate/schema/db_3_3_0_0.py:861
2378 #: rhodecode/lib/dbmigrate/schema/db_3_5_0_0.py:983
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 msgid "Inherit object permissions from default user enabled"
2596 msgid "Inherit object permissions from default user enabled"
2381 msgstr ""
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 #: rhodecode/lib/index/whoosh.py:148
2623 #: rhodecode/lib/index/whoosh.py:148
2384 msgid "Invalid search query. Try quoting it."
2624 msgid "Invalid search query. Try quoting it."
2385 msgstr ""
2625 msgstr ""
@@ -2424,48 +2664,32 b' msgstr ""'
2424 msgid "Your password reset link was sent"
2664 msgid "Your password reset link was sent"
2425 msgstr ""
2665 msgstr ""
2426
2666
2427 #: rhodecode/login/views.py:333
2667 #: rhodecode/login/views.py:336
2428 msgid "Your password reset was successful, a new password has been sent to your email"
2668 msgid "Your password reset was successful, a new password has been sent to your email"
2429 msgstr ""
2669 msgstr ""
2430
2670
2431 #: rhodecode/model/db.py:909
2671 #: rhodecode/model/comment.py:263
2432 msgid "all"
2672 msgid "made a comment"
2433 msgstr ""
2673 msgstr ""
2434
2674
2435 #: rhodecode/model/db.py:910
2675 #: rhodecode/model/comment.py:264
2436 msgid "http/web interface"
2676 msgid "Refresh page"
2437 msgstr ""
2677 msgstr ""
2438
2678
2439 #: rhodecode/model/db.py:911
2679 #: rhodecode/model/forms.py:85
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
2456 msgid "Please enter a login"
2680 msgid "Please enter a login"
2457 msgstr ""
2681 msgstr ""
2458
2682
2459 #: rhodecode/model/forms.py:67
2683 #: rhodecode/model/forms.py:86
2460 #, python-format
2684 #, python-format
2461 msgid "Enter a value %(min)i characters long or more"
2685 msgid "Enter a value %(min)i characters long or more"
2462 msgstr ""
2686 msgstr ""
2463
2687
2464 #: rhodecode/model/forms.py:76
2688 #: rhodecode/model/forms.py:95
2465 msgid "Please enter a password"
2689 msgid "Please enter a password"
2466 msgstr ""
2690 msgstr ""
2467
2691
2468 #: rhodecode/model/forms.py:77
2692 #: rhodecode/model/forms.py:96
2469 #, python-format
2693 #, python-format
2470 msgid "Enter %(min)i characters or more"
2694 msgid "Enter %(min)i characters or more"
2471 msgstr ""
2695 msgstr ""
@@ -2574,43 +2798,43 b' msgid ""'
2574 " %(pr_title)s"
2798 " %(pr_title)s"
2575 msgstr ""
2799 msgstr ""
2576
2800
2577 #: rhodecode/model/pull_request.py:448
2801 #: rhodecode/model/pull_request.py:449
2578 msgid "Pull request merged and closed"
2802 msgid "Pull request merged and closed"
2579 msgstr ""
2803 msgstr ""
2580
2804
2581 #: rhodecode/model/pull_request.py:867
2805 #: rhodecode/model/pull_request.py:874
2582 msgid "Server-side pull request merging is disabled."
2806 msgid "Server-side pull request merging is disabled."
2583 msgstr ""
2807 msgstr ""
2584
2808
2585 #: rhodecode/model/pull_request.py:869
2809 #: rhodecode/model/pull_request.py:876
2586 msgid "This pull request is closed."
2810 msgid "This pull request is closed."
2587 msgstr ""
2811 msgstr ""
2588
2812
2589 #: rhodecode/model/pull_request.py:880
2813 #: rhodecode/model/pull_request.py:887
2590 msgid "Pull request merging is not supported."
2814 msgid "Pull request merging is not supported."
2591 msgstr ""
2815 msgstr ""
2592
2816
2593 #: rhodecode/model/pull_request.py:898
2817 #: rhodecode/model/pull_request.py:905
2594 msgid "Target repository large files support is disabled."
2818 msgid "Target repository large files support is disabled."
2595 msgstr ""
2819 msgstr ""
2596
2820
2597 #: rhodecode/model/pull_request.py:901
2821 #: rhodecode/model/pull_request.py:908
2598 msgid "Source repository large files support is disabled."
2822 msgid "Source repository large files support is disabled."
2599 msgstr ""
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 msgid "Bookmarks"
2826 msgid "Bookmarks"
2603 msgstr ""
2827 msgstr ""
2604
2828
2605 #: rhodecode/model/pull_request.py:1055
2829 #: rhodecode/model/pull_request.py:1063
2606 msgid "Commit IDs"
2830 msgid "Commit IDs"
2607 msgstr ""
2831 msgstr ""
2608
2832
2609 #: rhodecode/model/pull_request.py:1058
2833 #: rhodecode/model/pull_request.py:1066
2610 msgid "Closed Branches"
2834 msgid "Closed Branches"
2611 msgstr ""
2835 msgstr ""
2612
2836
2613 #: rhodecode/model/scm.py:773
2837 #: rhodecode/model/scm.py:770
2614 msgid "latest tip"
2838 msgid "latest tip"
2615 msgstr ""
2839 msgstr ""
2616
2840
@@ -2811,6 +3035,7 b' msgid "Revisions %(revs)s are already pa'
2811 msgstr ""
3035 msgstr ""
2812
3036
2813 #: rhodecode/model/validators.py:933
3037 #: rhodecode/model/validators.py:933
3038 #: rhodecode/model/validation_schema/validators.py:14
2814 msgid "Please enter a valid IPv4 or IpV6 address"
3039 msgid "Please enter a valid IPv4 or IpV6 address"
2815 msgstr ""
3040 msgstr ""
2816
3041
@@ -2824,31 +3049,389 b' msgid "Key name can only consist of lett'
2824 msgstr ""
3049 msgstr ""
2825
3050
2826 #: rhodecode/model/validators.py:976
3051 #: rhodecode/model/validators.py:976
2827 msgid "Filename cannot be inside a directory"
2828 msgstr ""
2829
2830 #: rhodecode/model/validators.py:992
2831 #, python-format
3052 #, python-format
2832 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
3053 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
2833 msgstr ""
3054 msgstr ""
2834
3055
2835 #: rhodecode/model/validators.py:995
3056 #: rhodecode/model/validators.py:979
2836 #, python-format
3057 #, python-format
2837 msgid "The plugin \"%(plugin_id)s\" is missing an includeme function."
3058 msgid "The plugin \"%(plugin_id)s\" is missing an includeme function."
2838 msgstr ""
3059 msgstr ""
2839
3060
2840 #: rhodecode/model/validators.py:998
3061 #: rhodecode/model/validators.py:982
2841 #, python-format
3062 #, python-format
2842 msgid "Can not load plugin \"%(plugin_id)s\""
3063 msgid "Can not load plugin \"%(plugin_id)s\""
2843 msgstr ""
3064 msgstr ""
2844
3065
2845 #: rhodecode/model/validators.py:1000
3066 #: rhodecode/model/validators.py:984
2846 #, python-format
3067 #, python-format
2847 msgid "No plugin available with ID \"%(plugin_id)s\""
3068 msgid "No plugin available with ID \"%(plugin_id)s\""
2848 msgstr ""
3069 msgstr ""
2849
3070
2850 #: rhodecode/model/validators.py:1067
3071 #: rhodecode/model/validation_schema/schemas/gist_schema.py:89
2851 msgid "This gistid is already in use"
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 msgstr ""
3435 msgstr ""
2853
3436
2854 #: rhodecode/templates/index.html:5
3437 #: rhodecode/templates/index.html:5
@@ -2909,7 +3492,7 b' msgstr ""'
2909 #: rhodecode/templates/base/perms_summary.html:102
3492 #: rhodecode/templates/base/perms_summary.html:102
2910 #: rhodecode/templates/bookmarks/bookmarks.html:59
3493 #: rhodecode/templates/bookmarks/bookmarks.html:59
2911 #: rhodecode/templates/branches/branches.html:58
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 #: rhodecode/templates/pullrequests/pullrequests.html:100
3496 #: rhodecode/templates/pullrequests/pullrequests.html:100
2914 #: rhodecode/templates/tags/tags.html:59
3497 #: rhodecode/templates/tags/tags.html:59
2915 msgid "Name"
3498 msgid "Name"
@@ -2918,6 +3501,7 b' msgstr ""'
2918 #: rhodecode/templates/index_base.html:100
3501 #: rhodecode/templates/index_base.html:100
2919 #: rhodecode/templates/index_base.html:125
3502 #: rhodecode/templates/index_base.html:125
2920 #: rhodecode/templates/admin/gists/index.html:114
3503 #: rhodecode/templates/admin/gists/index.html:114
3504 #: rhodecode/templates/admin/integrations/list.html:63
2921 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:77
3505 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:77
2922 #: rhodecode/templates/admin/repo_groups/repo_group_add.html:45
3506 #: rhodecode/templates/admin/repo_groups/repo_group_add.html:45
2923 #: rhodecode/templates/admin/repo_groups/repo_group_edit_settings.html:42
3507 #: rhodecode/templates/admin/repo_groups/repo_group_edit_settings.html:42
@@ -2933,8 +3517,9 b' msgstr ""'
2933 #: rhodecode/templates/base/issue_tracker_settings.html:10
3517 #: rhodecode/templates/base/issue_tracker_settings.html:10
2934 #: rhodecode/templates/changeset/changeset.html:53
3518 #: rhodecode/templates/changeset/changeset.html:53
2935 #: rhodecode/templates/compare/compare_commits.html:24
3519 #: rhodecode/templates/compare/compare_commits.html:24
3520 #: rhodecode/templates/email_templates/commit_comment.mako:82
2936 #: rhodecode/templates/email_templates/pull_request_review.mako:30
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 #: rhodecode/templates/files/file_tree_detail.html:5
3523 #: rhodecode/templates/files/file_tree_detail.html:5
2939 #: rhodecode/templates/files/file_tree_detail.html:12
3524 #: rhodecode/templates/files/file_tree_detail.html:12
2940 #: rhodecode/templates/forks/fork.html:48
3525 #: rhodecode/templates/forks/fork.html:48
@@ -2972,12 +3557,12 b' msgstr ""'
2972 #: rhodecode/templates/admin/repos/repos.html:63
3557 #: rhodecode/templates/admin/repos/repos.html:63
2973 #: rhodecode/templates/bookmarks/bookmarks.html:66
3558 #: rhodecode/templates/bookmarks/bookmarks.html:66
2974 #: rhodecode/templates/branches/branches.html:65
3559 #: rhodecode/templates/branches/branches.html:65
2975 #: rhodecode/templates/changelog/changelog.html:106
3560 #: rhodecode/templates/changelog/changelog.html:104
2976 #: rhodecode/templates/changelog/changelog_summary_data.html:6
3561 #: rhodecode/templates/changelog/changelog_summary_data.html:8
2977 #: rhodecode/templates/changeset/changeset.html:36
3562 #: rhodecode/templates/changeset/changeset.html:36
2978 #: rhodecode/templates/compare/compare_commits.html:22
3563 #: rhodecode/templates/compare/compare_commits.html:22
2979 #: rhodecode/templates/email_templates/commit_comment.mako:16
2980 #: rhodecode/templates/email_templates/commit_comment.mako:45
3564 #: rhodecode/templates/email_templates/commit_comment.mako:45
3565 #: rhodecode/templates/email_templates/commit_comment.mako:81
2981 #: rhodecode/templates/search/search_commit.html:6
3566 #: rhodecode/templates/search/search_commit.html:6
2982 #: rhodecode/templates/tags/tags.html:66
3567 #: rhodecode/templates/tags/tags.html:66
2983 msgid "Commit"
3568 msgid "Commit"
@@ -2993,7 +3578,7 b' msgid "Home"'
2993 msgstr ""
3578 msgstr ""
2994
3579
2995 #: rhodecode/templates/login.html:5 rhodecode/templates/login.html:35
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 #: rhodecode/templates/debug_style/login.html:60
3582 #: rhodecode/templates/debug_style/login.html:60
2998 msgid "Sign In"
3583 msgid "Sign In"
2999 msgstr ""
3584 msgstr ""
@@ -3002,20 +3587,6 b' msgstr ""'
3002 msgid "Go to the registration page to create a new account."
3587 msgid "Go to the registration page to create a new account."
3003 msgstr ""
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 #: rhodecode/templates/login.html:58
3590 #: rhodecode/templates/login.html:58
3020 msgid "Remember me"
3591 msgid "Remember me"
3021 msgstr ""
3592 msgstr ""
@@ -3051,7 +3622,7 b' msgid "Send password reset email"'
3051 msgstr ""
3622 msgstr ""
3052
3623
3053 #: rhodecode/templates/password_reset.html:60
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 msgstr ""
3626 msgstr ""
3056
3627
3057 #: rhodecode/templates/register.html:35
3628 #: rhodecode/templates/register.html:35
@@ -3072,7 +3643,7 b' msgstr ""'
3072 #: rhodecode/templates/admin/my_account/my_account_profile_edit.html:76
3643 #: rhodecode/templates/admin/my_account/my_account_profile_edit.html:76
3073 #: rhodecode/templates/admin/users/user_add.html:68
3644 #: rhodecode/templates/admin/users/user_add.html:68
3074 #: rhodecode/templates/admin/users/user_edit_profile.html:47
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 msgid "First Name"
3647 msgid "First Name"
3077 msgstr ""
3648 msgstr ""
3078
3649
@@ -3082,7 +3653,7 b' msgstr ""'
3082 #: rhodecode/templates/admin/my_account/my_account_profile_edit.html:85
3653 #: rhodecode/templates/admin/my_account/my_account_profile_edit.html:85
3083 #: rhodecode/templates/admin/users/user_add.html:77
3654 #: rhodecode/templates/admin/users/user_add.html:77
3084 #: rhodecode/templates/admin/users/user_edit_profile.html:56
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 msgid "Last Name"
3657 msgid "Last Name"
3087 msgstr ""
3658 msgstr ""
3088
3659
@@ -3096,7 +3667,7 b' msgstr ""'
3096
3667
3097 #: rhodecode/templates/admin/admin.html:5
3668 #: rhodecode/templates/admin/admin.html:5
3098 #: rhodecode/templates/admin/admin.html:15
3669 #: rhodecode/templates/admin/admin.html:15
3099 #: rhodecode/templates/base/base.html:78
3670 #: rhodecode/templates/base/base.html:77
3100 msgid "Admin journal"
3671 msgid "Admin journal"
3101 msgstr ""
3672 msgstr ""
3102
3673
@@ -3121,17 +3692,17 b' msgstr[1] ""'
3121 msgid "Example Queries"
3692 msgid "Example Queries"
3122 msgstr ""
3693 msgstr ""
3123
3694
3124 #: rhodecode/templates/admin/admin_log.html:6
3695 #: rhodecode/templates/admin/admin_log.html:8
3125 #: rhodecode/templates/admin/my_account/my_account_repos.html:37
3696 #: rhodecode/templates/admin/my_account/my_account_repos.html:37
3126 #: rhodecode/templates/admin/repo_groups/repo_groups.html:62
3697 #: rhodecode/templates/admin/repo_groups/repo_groups.html:62
3127 #: rhodecode/templates/admin/repos/repo_edit_fields.html:13
3698 #: rhodecode/templates/admin/repos/repo_edit_fields.html:13
3128 #: rhodecode/templates/admin/repos/repos.html:69
3699 #: rhodecode/templates/admin/repos/repos.html:69
3129 #: rhodecode/templates/admin/user_groups/user_groups.html:66
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 msgid "Action"
3702 msgid "Action"
3132 msgstr ""
3703 msgstr ""
3133
3704
3134 #: rhodecode/templates/admin/admin_log.html:7
3705 #: rhodecode/templates/admin/admin_log.html:9
3135 #: rhodecode/templates/admin/defaults/defaults.html:31
3706 #: rhodecode/templates/admin/defaults/defaults.html:31
3136 #: rhodecode/templates/admin/permissions/permissions_objects.html:13
3707 #: rhodecode/templates/admin/permissions/permissions_objects.html:13
3137 #: rhodecode/templates/search/search_commit.html:5
3708 #: rhodecode/templates/search/search_commit.html:5
@@ -3139,18 +3710,18 b' msgstr ""'
3139 msgid "Repository"
3710 msgid "Repository"
3140 msgstr ""
3711 msgstr ""
3141
3712
3142 #: rhodecode/templates/admin/admin_log.html:8
3713 #: rhodecode/templates/admin/admin_log.html:10
3143 #: rhodecode/templates/bookmarks/bookmarks.html:61
3714 #: rhodecode/templates/bookmarks/bookmarks.html:61
3144 #: rhodecode/templates/branches/branches.html:60
3715 #: rhodecode/templates/branches/branches.html:60
3145 #: rhodecode/templates/tags/tags.html:61
3716 #: rhodecode/templates/tags/tags.html:61
3146 msgid "Date"
3717 msgid "Date"
3147 msgstr ""
3718 msgstr ""
3148
3719
3149 #: rhodecode/templates/admin/admin_log.html:9
3720 #: rhodecode/templates/admin/admin_log.html:11
3150 msgid "From IP"
3721 msgid "From IP"
3151 msgstr ""
3722 msgstr ""
3152
3723
3153 #: rhodecode/templates/admin/admin_log.html:44
3724 #: rhodecode/templates/admin/admin_log.html:46
3154 msgid "No actions yet"
3725 msgid "No actions yet"
3155 msgstr ""
3726 msgstr ""
3156
3727
@@ -3162,6 +3733,9 b' msgstr ""'
3162 #: rhodecode/templates/admin/auth/auth_settings.html:12
3733 #: rhodecode/templates/admin/auth/auth_settings.html:12
3163 #: rhodecode/templates/admin/auth/plugin_settings.html:12
3734 #: rhodecode/templates/admin/auth/plugin_settings.html:12
3164 #: rhodecode/templates/admin/defaults/defaults.html:12
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 #: rhodecode/templates/admin/permissions/permissions.html:12
3739 #: rhodecode/templates/admin/permissions/permissions.html:12
3166 #: rhodecode/templates/admin/repo_groups/repo_group_add.html:12
3740 #: rhodecode/templates/admin/repo_groups/repo_group_add.html:12
3167 #: rhodecode/templates/admin/repo_groups/repo_group_edit.html:12
3741 #: rhodecode/templates/admin/repo_groups/repo_group_edit.html:12
@@ -3179,9 +3753,9 b' msgstr ""'
3179 #: rhodecode/templates/admin/users/user_add.html:11
3753 #: rhodecode/templates/admin/users/user_add.html:11
3180 #: rhodecode/templates/admin/users/user_edit.html:12
3754 #: rhodecode/templates/admin/users/user_edit.html:12
3181 #: rhodecode/templates/admin/users/users.html:13
3755 #: rhodecode/templates/admin/users/users.html:13
3182 #: rhodecode/templates/admin/users/users.html:102
3756 #: rhodecode/templates/admin/users/users.html:101
3183 #: rhodecode/templates/base/base.html:405
3757 #: rhodecode/templates/base/base.html:406
3184 #: rhodecode/templates/base/base.html:412
3758 #: rhodecode/templates/base/base.html:413
3185 msgid "Admin"
3759 msgid "Admin"
3186 msgstr ""
3760 msgstr ""
3187
3761
@@ -3206,14 +3780,6 b' msgstr ""'
3206 msgid "Available Built-in Plugins"
3780 msgid "Available Built-in Plugins"
3207 msgstr ""
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 #: rhodecode/templates/admin/auth/auth_settings.html:81
3783 #: rhodecode/templates/admin/auth/auth_settings.html:81
3218 #: rhodecode/templates/admin/auth/plugin_settings.html:87
3784 #: rhodecode/templates/admin/auth/plugin_settings.html:87
3219 #: rhodecode/templates/admin/defaults/defaults_repositories.html:63
3785 #: rhodecode/templates/admin/defaults/defaults_repositories.html:63
@@ -3254,6 +3820,7 b' msgstr ""'
3254
3820
3255 #: rhodecode/templates/admin/defaults/defaults_repositories.html:14
3821 #: rhodecode/templates/admin/defaults/defaults_repositories.html:14
3256 #: rhodecode/templates/admin/gists/index.html:110
3822 #: rhodecode/templates/admin/gists/index.html:110
3823 #: rhodecode/templates/admin/integrations/list.html:64
3257 #: rhodecode/templates/admin/repos/repo_add_base.html:62
3824 #: rhodecode/templates/admin/repos/repo_add_base.html:62
3258 #: rhodecode/templates/admin/repos/repo_edit_fields.html:12
3825 #: rhodecode/templates/admin/repos/repo_edit_fields.html:12
3259 msgid "Type"
3826 msgid "Type"
@@ -3320,18 +3887,18 b' msgstr ""'
3320 msgid "Gist access level"
3887 msgid "Gist access level"
3321 msgstr ""
3888 msgstr ""
3322
3889
3323 #: rhodecode/templates/admin/gists/edit.html:59
3890 #: rhodecode/templates/admin/gists/edit.html:62
3324 #: rhodecode/templates/admin/gists/new.html:50
3891 #: rhodecode/templates/admin/gists/new.html:50
3325 #: rhodecode/templates/files/files_add.html:74
3892 #: rhodecode/templates/files/files_add.html:74
3326 #: rhodecode/templates/files/files_edit.html:78
3893 #: rhodecode/templates/files/files_edit.html:78
3327 msgid "plain"
3894 msgid "plain"
3328 msgstr ""
3895 msgstr ""
3329
3896
3330 #: rhodecode/templates/admin/gists/edit.html:103
3897 #: rhodecode/templates/admin/gists/edit.html:107
3331 msgid "Update Gist"
3898 msgid "Update Gist"
3332 msgstr ""
3899 msgstr ""
3333
3900
3334 #: rhodecode/templates/admin/gists/edit.html:104
3901 #: rhodecode/templates/admin/gists/edit.html:108
3335 #: rhodecode/templates/base/issue_tracker_settings.html:74
3902 #: rhodecode/templates/base/issue_tracker_settings.html:74
3336 #: rhodecode/templates/changeset/changeset_file_comment.html:139
3903 #: rhodecode/templates/changeset/changeset_file_comment.html:139
3337 #: rhodecode/templates/files/files_add.html:102
3904 #: rhodecode/templates/files/files_add.html:102
@@ -3392,14 +3959,14 b' msgstr ""'
3392
3959
3393 #: rhodecode/templates/admin/gists/index.html:108
3960 #: rhodecode/templates/admin/gists/index.html:108
3394 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:24
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 #: rhodecode/templates/bookmarks/bookmarks.html:63
3963 #: rhodecode/templates/bookmarks/bookmarks.html:63
3397 #: rhodecode/templates/branches/branches.html:62
3964 #: rhodecode/templates/branches/branches.html:62
3398 #: rhodecode/templates/changelog/changelog.html:102
3965 #: rhodecode/templates/changelog/changelog.html:110
3399 #: rhodecode/templates/changelog/changelog_summary_data.html:10
3966 #: rhodecode/templates/changelog/changelog_summary_data.html:11
3400 #: rhodecode/templates/changeset/changeset.html:164
3967 #: rhodecode/templates/changeset/changeset.html:164
3401 #: rhodecode/templates/compare/compare_commits.html:21
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 #: rhodecode/templates/pullrequests/pullrequest_show.html:169
3970 #: rhodecode/templates/pullrequests/pullrequest_show.html:169
3404 #: rhodecode/templates/pullrequests/pullrequests.html:102
3971 #: rhodecode/templates/pullrequests/pullrequests.html:102
3405 #: rhodecode/templates/search/search_commit.html:16
3972 #: rhodecode/templates/search/search_commit.html:16
@@ -3482,9 +4049,10 b' msgid "Gist"'
3482 msgstr ""
4049 msgstr ""
3483
4050
3484 #: rhodecode/templates/admin/gists/show.html:49
4051 #: rhodecode/templates/admin/gists/show.html:49
4052 #: rhodecode/templates/admin/integrations/list.html:110
3485 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:56
4053 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:56
3486 #: rhodecode/templates/admin/my_account/my_account_emails.html:32
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 #: rhodecode/templates/admin/permissions/permissions_ips.html:26
4056 #: rhodecode/templates/admin/permissions/permissions_ips.html:26
3489 #: rhodecode/templates/admin/repos/repo_edit_fields.html:25
4057 #: rhodecode/templates/admin/repos/repo_edit_fields.html:25
3490 #: rhodecode/templates/admin/settings/settings_hooks.html:46
4058 #: rhodecode/templates/admin/settings/settings_hooks.html:46
@@ -3496,10 +4064,10 b' msgstr ""'
3496 #: rhodecode/templates/base/vcs_settings.html:172
4064 #: rhodecode/templates/base/vcs_settings.html:172
3497 #: rhodecode/templates/changeset/changeset_file_comment.html:49
4065 #: rhodecode/templates/changeset/changeset_file_comment.html:49
3498 #: rhodecode/templates/changeset/changeset_file_comment.html:99
4066 #: rhodecode/templates/changeset/changeset_file_comment.html:99
3499 #: rhodecode/templates/data_table/_dt_elements.html:117
4067 #: rhodecode/templates/data_table/_dt_elements.html:119
3500 #: rhodecode/templates/data_table/_dt_elements.html:174
4068 #: rhodecode/templates/data_table/_dt_elements.html:176
3501 #: rhodecode/templates/data_table/_dt_elements.html:188
4069 #: rhodecode/templates/data_table/_dt_elements.html:190
3502 #: rhodecode/templates/data_table/_dt_elements.html:200
4070 #: rhodecode/templates/data_table/_dt_elements.html:202
3503 #: rhodecode/templates/debug_style/buttons.html:132
4071 #: rhodecode/templates/debug_style/buttons.html:132
3504 #: rhodecode/templates/files/files_source.html:33
4072 #: rhodecode/templates/files/files_source.html:33
3505 #: rhodecode/templates/files/files_source.html:37
4073 #: rhodecode/templates/files/files_source.html:37
@@ -3512,14 +4080,15 b' msgid "Confirm to delete this Gist"'
3512 msgstr ""
4080 msgstr ""
3513
4081
3514 #: rhodecode/templates/admin/gists/show.html:56
4082 #: rhodecode/templates/admin/gists/show.html:56
4083 #: rhodecode/templates/admin/integrations/list.html:103
3515 #: rhodecode/templates/admin/my_account/my_account_profile.html:5
4084 #: rhodecode/templates/admin/my_account/my_account_profile.html:5
3516 #: rhodecode/templates/base/issue_tracker_settings.html:61
4085 #: rhodecode/templates/base/issue_tracker_settings.html:61
3517 #: rhodecode/templates/changeset/changeset_file_comment.html:145
4086 #: rhodecode/templates/changeset/changeset_file_comment.html:145
3518 #: rhodecode/templates/changeset/changeset_file_comment.html:292
4087 #: rhodecode/templates/changeset/changeset_file_comment.html:292
3519 #: rhodecode/templates/data_table/_dt_elements.html:112
4088 #: rhodecode/templates/data_table/_dt_elements.html:114
3520 #: rhodecode/templates/data_table/_dt_elements.html:170
4089 #: rhodecode/templates/data_table/_dt_elements.html:172
3521 #: rhodecode/templates/data_table/_dt_elements.html:183
4090 #: rhodecode/templates/data_table/_dt_elements.html:185
3522 #: rhodecode/templates/data_table/_dt_elements.html:196
4091 #: rhodecode/templates/data_table/_dt_elements.html:198
3523 #: rhodecode/templates/debug_style/buttons.html:128
4092 #: rhodecode/templates/debug_style/buttons.html:128
3524 #: rhodecode/templates/files/files_add.html:204
4093 #: rhodecode/templates/files/files_add.html:204
3525 #: rhodecode/templates/files/files_edit.html:165
4094 #: rhodecode/templates/files/files_edit.html:165
@@ -3549,8 +4118,44 b' msgstr ""'
3549 msgid "Show as raw"
4118 msgid "Show as raw"
3550 msgstr ""
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 #: rhodecode/templates/admin/my_account/my_account.html:5
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 msgid "My account"
4159 msgid "My account"
3555 msgstr ""
4160 msgstr ""
3556
4161
@@ -3586,7 +4191,7 b' msgstr ""'
3586
4191
3587 #: rhodecode/templates/admin/my_account/my_account.html:40
4192 #: rhodecode/templates/admin/my_account/my_account.html:40
3588 #: rhodecode/templates/admin/notifications/notifications.html:33
4193 #: rhodecode/templates/admin/notifications/notifications.html:33
3589 #: rhodecode/templates/base/base.html:242
4194 #: rhodecode/templates/base/base.html:243
3590 msgid "Pull Requests"
4195 msgid "Pull Requests"
3591 msgstr ""
4196 msgstr ""
3592
4197
@@ -3594,6 +4199,10 b' msgstr ""'
3594 msgid "My Permissions"
4199 msgid "My Permissions"
3595 msgstr ""
4200 msgstr ""
3596
4201
4202 #: rhodecode/templates/admin/my_account/my_account.html:42
4203 msgid "My Live Notifications"
4204 msgstr ""
4205
3597 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:3
4206 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:3
3598 msgid "Authentication Tokens"
4207 msgid "Authentication Tokens"
3599 msgstr ""
4208 msgstr ""
@@ -3603,7 +4212,7 b' msgid "Built-in tokens can be used to au'
3603 msgstr ""
4212 msgstr ""
3604
4213
3605 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:8
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 msgstr ""
4216 msgstr ""
3608
4217
3609 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:14
4218 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.html:14
@@ -3680,6 +4289,19 b' msgstr ""'
3680 msgid "New email address"
4289 msgid "New email address"
3681 msgstr ""
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 #: rhodecode/templates/admin/my_account/my_account_password.html:3
4305 #: rhodecode/templates/admin/my_account/my_account_password.html:3
3684 msgid "Change Your Account Password"
4306 msgid "Change Your Account Password"
3685 msgstr ""
4307 msgstr ""
@@ -3734,35 +4356,35 b' msgid "Pull Requests You Opened"'
3734 msgstr ""
4356 msgstr ""
3735
4357
3736 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:23
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 msgid "Target Repo"
4360 msgid "Target Repo"
3739 msgstr ""
4361 msgstr ""
3740
4362
3741 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:26
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 #: rhodecode/templates/admin/settings/settings_global.html:9
4365 #: rhodecode/templates/admin/settings/settings_global.html:9
3744 #: rhodecode/templates/email_templates/pull_request_review.mako:28
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 #: rhodecode/templates/pullrequests/pullrequest.html:38
4368 #: rhodecode/templates/pullrequests/pullrequest.html:38
3747 #: rhodecode/templates/pullrequests/pullrequests.html:104
4369 #: rhodecode/templates/pullrequests/pullrequests.html:104
3748 msgid "Title"
4370 msgid "Title"
3749 msgstr ""
4371 msgstr ""
3750
4372
3751 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:27
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 msgid "Opened On"
4375 msgid "Opened On"
3754 msgstr ""
4376 msgstr ""
3755
4377
3756 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:41
4378 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:43
3757 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:103
4379 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:107
3758 #: rhodecode/templates/changelog/changelog.html:141
4380 #: rhodecode/templates/changelog/changelog.html:153
3759 #: rhodecode/templates/compare/compare_commits.html:49
4381 #: rhodecode/templates/compare/compare_commits.html:49
3760 #: rhodecode/templates/search/search_commit.html:36
4382 #: rhodecode/templates/search/search_commit.html:36
3761 msgid "Expand commit message"
4383 msgid "Expand commit message"
3762 msgstr ""
4384 msgstr ""
3763
4385
3764 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:50
4386 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:52
3765 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:112
4387 #: rhodecode/templates/admin/my_account/my_account_pullrequests.html:116
3766 #: rhodecode/templates/changeset/changeset_file_comment.html:284
4388 #: rhodecode/templates/changeset/changeset_file_comment.html:284
3767 #: rhodecode/templates/pullrequests/pullrequest_show.html:14
4389 #: rhodecode/templates/pullrequests/pullrequest_show.html:14
3768 #: rhodecode/templates/pullrequests/pullrequest_show.html:112
4390 #: rhodecode/templates/pullrequests/pullrequest_show.html:112
@@ -3770,19 +4392,19 b' msgstr ""'
3770 msgid "Closed"
4392 msgid "Closed"
3771 msgstr ""
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 msgid "Confirm to delete this pull request"
4396 msgid "Confirm to delete this pull request"
3775 msgstr ""
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 msgid "You currently have no open pull requests."
4400 msgid "You currently have no open pull requests."
3779 msgstr ""
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 msgid "Pull Requests You Participate In"
4404 msgid "Pull Requests You Participate In"
3783 msgstr ""
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 msgid "There are currently no open pull requests requiring your participation."
4408 msgid "There are currently no open pull requests requiring your participation."
3787 msgstr ""
4409 msgstr ""
3788
4410
@@ -3822,19 +4444,15 b' msgstr ""'
3822 msgid "Show notification"
4444 msgid "Show notification"
3823 msgstr ""
4445 msgstr ""
3824
4446
3825 #: rhodecode/templates/admin/notifications/show_notification.html:12
3826 msgid "Notifications"
3827 msgstr ""
3828
3829 #: rhodecode/templates/admin/permissions/permissions.html:5
4447 #: rhodecode/templates/admin/permissions/permissions.html:5
3830 msgid "Permissions Administration"
4448 msgid "Permissions Administration"
3831 msgstr ""
4449 msgstr ""
3832
4450
3833 #: rhodecode/templates/admin/permissions/permissions.html:14
4451 #: rhodecode/templates/admin/permissions/permissions.html:14
3834 #: rhodecode/templates/admin/repo_groups/repo_group_edit.html:45
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 #: rhodecode/templates/admin/user_groups/user_group_edit.html:34
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 msgid "Permissions"
4456 msgid "Permissions"
3839 msgstr ""
4457 msgstr ""
3840
4458
@@ -3963,7 +4581,7 b' msgstr ""'
3963
4581
3964 #: rhodecode/templates/admin/repo_groups/repo_group_add.html:14
4582 #: rhodecode/templates/admin/repo_groups/repo_group_add.html:14
3965 #: rhodecode/templates/admin/users/user_edit_advanced.html:12
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 msgid "Repository groups"
4585 msgid "Repository groups"
3968 msgstr ""
4586 msgstr ""
3969
4587
@@ -3994,17 +4612,8 b' msgstr ""'
3994 msgid "Add Child Group"
4612 msgid "Add Child Group"
3995 msgstr ""
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 #: rhodecode/templates/admin/repo_groups/repo_group_edit.html:46
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 #: rhodecode/templates/admin/user_groups/user_group_edit.html:35
4617 #: rhodecode/templates/admin/user_groups/user_group_edit.html:35
4009 #: rhodecode/templates/admin/users/user_edit.html:35
4618 #: rhodecode/templates/admin/users/user_edit.html:35
4010 msgid "Advanced"
4619 msgid "Advanced"
@@ -4177,7 +4786,7 b' msgid "Import Existing Repository ?"'
4177 msgstr ""
4786 msgstr ""
4178
4787
4179 #: rhodecode/templates/admin/repos/repo_add_base.html:23
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 msgid "Clone from"
4790 msgid "Clone from"
4182 msgstr ""
4791 msgstr ""
4183
4792
@@ -4244,19 +4853,19 b' msgstr ""'
4244 msgid "%s repository settings"
4853 msgid "%s repository settings"
4245 msgstr ""
4854 msgstr ""
4246
4855
4247 #: rhodecode/templates/admin/repos/repo_edit.html:51
4856 #: rhodecode/templates/admin/repos/repo_edit.html:55
4248 msgid "Extra Fields"
4857 msgid "Extra Fields"
4249 msgstr ""
4858 msgstr ""
4250
4859
4251 #: rhodecode/templates/admin/repos/repo_edit.html:57
4252 msgid "Caches"
4253 msgstr ""
4254
4255 #: rhodecode/templates/admin/repos/repo_edit.html:61
4860 #: rhodecode/templates/admin/repos/repo_edit.html:61
4256 msgid "Remote"
4861 msgid "Caches"
4257 msgstr ""
4862 msgstr ""
4258
4863
4259 #: rhodecode/templates/admin/repos/repo_edit.html:65
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 #: rhodecode/templates/summary/components.html:135
4869 #: rhodecode/templates/summary/components.html:135
4261 msgid "Statistics"
4870 msgid "Statistics"
4262 msgstr ""
4871 msgstr ""
@@ -4358,7 +4967,7 b' msgid "Delete forks"'
4358 msgstr ""
4967 msgstr ""
4359
4968
4360 #: rhodecode/templates/admin/repos/repo_edit_advanced.html:139
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 #, python-format
4971 #, python-format
4363 msgid "Confirm to delete this repository: %s"
4972 msgid "Confirm to delete this repository: %s"
4364 msgstr ""
4973 msgstr ""
@@ -4419,7 +5028,7 b' msgstr ""'
4419 #: rhodecode/templates/admin/user_groups/user_groups.html:62
5028 #: rhodecode/templates/admin/user_groups/user_groups.html:62
4420 #: rhodecode/templates/admin/users/user_add.html:97
5029 #: rhodecode/templates/admin/users/user_add.html:97
4421 #: rhodecode/templates/admin/users/user_edit_profile.html:90
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 msgid "Active"
5032 msgid "Active"
4424 msgstr ""
5033 msgstr ""
4425
5034
@@ -4575,7 +5184,7 b' msgid "http[s] url where from repository'
4575 msgstr ""
5184 msgstr ""
4576
5185
4577 #: rhodecode/templates/admin/repos/repo_edit_settings.html:56
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 #: rhodecode/templates/forks/fork.html:58
5188 #: rhodecode/templates/forks/fork.html:58
4580 msgid "Repository group"
5189 msgid "Repository group"
4581 msgstr ""
5190 msgstr ""
@@ -4823,12 +5432,11 b' msgid "Server Announcement"'
4823 msgstr ""
5432 msgstr ""
4824
5433
4825 #: rhodecode/templates/admin/settings/settings_global.html:80
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 msgstr ""
5436 msgstr ""
4828
5437
4829 #: rhodecode/templates/admin/settings/settings_global.html:81
5438 #: rhodecode/templates/admin/settings/settings_global.html:81
4830 #: rhodecode/templates/admin/settings/settings_global.html:103
5439 msgid "Use <script/> or <css/> tags to define custom styling or scripting"
4831 msgid "Use <script> or <css> tags to define custom styling or scripting"
4832 msgstr ""
5440 msgstr ""
4833
5441
4834 #: rhodecode/templates/admin/settings/settings_global.html:88
5442 #: rhodecode/templates/admin/settings/settings_global.html:88
@@ -4839,6 +5447,10 b' msgstr ""'
4839 msgid "Custom js/css code added at the end of the <body> tag."
5447 msgid "Custom js/css code added at the end of the <body> tag."
4840 msgstr ""
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 #: rhodecode/templates/admin/settings/settings_hooks.html:3
5454 #: rhodecode/templates/admin/settings/settings_hooks.html:3
4843 msgid "Built in Mercurial hooks - read only"
5455 msgid "Built in Mercurial hooks - read only"
4844 msgstr ""
5456 msgstr ""
@@ -5209,7 +5821,7 b' msgstr ""'
5209
5821
5210 #: rhodecode/templates/admin/user_groups/user_group_add.html:13
5822 #: rhodecode/templates/admin/user_groups/user_group_add.html:13
5211 #: rhodecode/templates/admin/users/user_edit_advanced.html:13
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 msgid "User groups"
5825 msgid "User groups"
5214 msgstr ""
5826 msgstr ""
5215
5827
@@ -5300,8 +5912,8 b' msgid "Change owner of this user group."'
5300 msgstr ""
5912 msgstr ""
5301
5913
5302 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.html:59
5914 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.html:59
5303 #: rhodecode/templates/base/base.html:257
5915 #: rhodecode/templates/base/base.html:258
5304 #: rhodecode/templates/base/base.html:399
5916 #: rhodecode/templates/base/base.html:400
5305 #: rhodecode/templates/search/search.html:64
5917 #: rhodecode/templates/search/search.html:64
5306 msgid "Search"
5918 msgid "Search"
5307 msgstr ""
5919 msgstr ""
@@ -5345,7 +5957,7 b' msgstr ""'
5345
5957
5346 #: rhodecode/templates/admin/users/user_add.html:13
5958 #: rhodecode/templates/admin/users/user_add.html:13
5347 #: rhodecode/templates/admin/users/user_edit.html:14
5959 #: rhodecode/templates/admin/users/user_edit.html:14
5348 #: rhodecode/templates/base/base.html:81
5960 #: rhodecode/templates/base/base.html:80
5349 msgid "Users"
5961 msgid "Users"
5350 msgstr ""
5962 msgstr ""
5351
5963
@@ -5408,7 +6020,7 b' msgid "Source of Record"'
5408 msgstr ""
6020 msgstr ""
5409
6021
5410 #: rhodecode/templates/admin/users/user_edit_advanced.html:8
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 msgid "Last login"
6024 msgid "Last login"
5413 msgstr ""
6025 msgstr ""
5414
6026
@@ -5505,7 +6117,7 b' msgid "Detach user groups"'
5505 msgstr ""
6117 msgstr ""
5506
6118
5507 #: rhodecode/templates/admin/users/user_edit_advanced.html:135
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 #, python-format
6121 #, python-format
5510 msgid "Confirm to delete this user: %s"
6122 msgid "Confirm to delete this user: %s"
5511 msgstr ""
6123 msgstr ""
@@ -5585,21 +6197,21 b' msgstr ""'
5585 msgid "Users administration"
6197 msgid "Users administration"
5586 msgstr ""
6198 msgstr ""
5587
6199
5588 #: rhodecode/templates/admin/users/users.html:104
6200 #: rhodecode/templates/admin/users/users.html:103
5589 msgid "Authentication type"
6201 msgid "Authentication type"
5590 msgstr ""
6202 msgstr ""
5591
6203
5592 #: rhodecode/templates/base/base.html:45
6204 #: rhodecode/templates/base/base.html:44
5593 #: rhodecode/templates/errors/error_document.html:51
6205 #: rhodecode/templates/errors/error_document.html:51
5594 msgid "Support"
6206 msgid "Support"
5595 msgstr ""
6207 msgstr ""
5596
6208
5597 #: rhodecode/templates/base/base.html:52
6209 #: rhodecode/templates/base/base.html:51
5598 #, python-format
6210 #, python-format
5599 msgid "RhodeCode instance id: %s"
6211 msgid "RhodeCode instance id: %s"
5600 msgstr ""
6212 msgstr ""
5601
6213
5602 #: rhodecode/templates/base/base.html:84
6214 #: rhodecode/templates/base/base.html:83
5603 msgid "Authentication"
6215 msgid "Authentication"
5604 msgstr ""
6216 msgstr ""
5605
6217
@@ -5613,40 +6225,40 b' msgstr ""'
5613 msgid "Show More"
6225 msgid "Show More"
5614 msgstr ""
6226 msgstr ""
5615
6227
5616 #: rhodecode/templates/base/base.html:189
6228 #: rhodecode/templates/base/base.html:190
5617 msgid "Fork of"
6229 msgid "Fork of"
5618 msgstr ""
6230 msgstr ""
5619
6231
5620 #: rhodecode/templates/base/base.html:206
6232 #: rhodecode/templates/base/base.html:207
5621 #, python-format
6233 #, python-format
5622 msgid "Repository locked by %(user)s"
6234 msgid "Repository locked by %(user)s"
5623 msgstr ""
6235 msgstr ""
5624
6236
5625 #: rhodecode/templates/base/base.html:211
6237 #: rhodecode/templates/base/base.html:212
5626 msgid "Repository not locked. Pull repository to lock it."
6238 msgid "Repository not locked. Pull repository to lock it."
5627 msgstr ""
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 #: rhodecode/templates/base/base.html:230
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 #: rhodecode/templates/data_table/_dt_elements.html:17
6249 #: rhodecode/templates/data_table/_dt_elements.html:17
5638 #: rhodecode/templates/data_table/_dt_elements.html:18
6250 #: rhodecode/templates/data_table/_dt_elements.html:18
5639 msgid "Changelog"
6251 msgid "Changelog"
5640 msgstr ""
6252 msgstr ""
5641
6253
5642 #: rhodecode/templates/base/base.html:231
6254 #: rhodecode/templates/base/base.html:232
5643 #: rhodecode/templates/data_table/_dt_elements.html:22
6255 #: rhodecode/templates/data_table/_dt_elements.html:22
5644 #: rhodecode/templates/data_table/_dt_elements.html:23
6256 #: rhodecode/templates/data_table/_dt_elements.html:23
5645 #: rhodecode/templates/files/files.html:15
6257 #: rhodecode/templates/files/files.html:15
5646 msgid "Files"
6258 msgid "Files"
5647 msgstr ""
6259 msgstr ""
5648
6260
5649 #: rhodecode/templates/base/base.html:233
6261 #: rhodecode/templates/base/base.html:234
5650 #: rhodecode/templates/bookmarks/bookmarks.html:68
6262 #: rhodecode/templates/bookmarks/bookmarks.html:68
5651 #: rhodecode/templates/branches/branches.html:67
6263 #: rhodecode/templates/branches/branches.html:67
5652 #: rhodecode/templates/files/file_diff.html:11
6264 #: rhodecode/templates/files/file_diff.html:11
@@ -5655,29 +6267,29 b' msgstr ""'
5655 msgid "Compare"
6267 msgid "Compare"
5656 msgstr ""
6268 msgstr ""
5657
6269
5658 #: rhodecode/templates/base/base.html:238
6270 #: rhodecode/templates/base/base.html:239
5659 #, python-format
6271 #, python-format
5660 msgid "Show Pull Requests for %s"
6272 msgid "Show Pull Requests for %s"
5661 msgstr ""
6273 msgstr ""
5662
6274
5663 #: rhodecode/templates/base/base.html:247
6275 #: rhodecode/templates/base/base.html:248
5664 msgid "Options"
6276 msgid "Options"
5665 msgstr ""
6277 msgstr ""
5666
6278
5667 #: rhodecode/templates/base/base.html:254
6279 #: rhodecode/templates/base/base.html:255
5668 #: rhodecode/templates/forks/forks_data.html:30
6280 #: rhodecode/templates/forks/forks_data.html:30
5669 msgid "Compare fork"
6281 msgid "Compare fork"
5670 msgstr ""
6282 msgstr ""
5671
6283
5672 #: rhodecode/templates/base/base.html:261
6284 #: rhodecode/templates/base/base.html:262
5673 msgid "Unlock"
6285 msgid "Unlock"
5674 msgstr ""
6286 msgstr ""
5675
6287
5676 #: rhodecode/templates/base/base.html:263
6288 #: rhodecode/templates/base/base.html:264
5677 msgid "Lock"
6289 msgid "Lock"
5678 msgstr ""
6290 msgstr ""
5679
6291
5680 #: rhodecode/templates/base/base.html:268
6292 #: rhodecode/templates/base/base.html:269
5681 #: rhodecode/templates/data_table/_dt_elements.html:27
6293 #: rhodecode/templates/data_table/_dt_elements.html:27
5682 #: rhodecode/templates/data_table/_dt_elements.html:28
6294 #: rhodecode/templates/data_table/_dt_elements.html:28
5683 #: rhodecode/templates/forks/forks_data.html:8
6295 #: rhodecode/templates/forks/forks_data.html:8
@@ -5687,73 +6299,73 b' msgid_plural "Forks"'
5687 msgstr[0] ""
6299 msgstr[0] ""
5688 msgstr[1] ""
6300 msgstr[1] ""
5689
6301
5690 #: rhodecode/templates/base/base.html:269
6302 #: rhodecode/templates/base/base.html:270
5691 msgid "Create Pull Request"
6303 msgid "Create Pull Request"
5692 msgstr ""
6304 msgstr ""
5693
6305
5694 #: rhodecode/templates/base/base.html:291
6306 #: rhodecode/templates/base/base.html:292
5695 msgid "Sign in"
6307 msgid "Sign in"
5696 msgstr ""
6308 msgstr ""
5697
6309
5698 #: rhodecode/templates/base/base.html:299
6310 #: rhodecode/templates/base/base.html:300
5699 #: rhodecode/templates/debug_style/login.html:28
6311 #: rhodecode/templates/debug_style/login.html:28
5700 msgid "Sign in to your account"
6312 msgid "Sign in to your account"
5701 msgstr ""
6313 msgstr ""
5702
6314
5703 #: rhodecode/templates/base/base.html:315
6315 #: rhodecode/templates/base/base.html:316
5704 #: rhodecode/templates/debug_style/login.html:46
6316 #: rhodecode/templates/debug_style/login.html:46
5705 msgid "(Forgot password?)"
6317 msgid "(Forgot password?)"
5706 msgstr ""
6318 msgstr ""
5707
6319
5708 #: rhodecode/templates/base/base.html:324
6320 #: rhodecode/templates/base/base.html:325
5709 #: rhodecode/templates/debug_style/login.html:56
6321 #: rhodecode/templates/debug_style/login.html:56
5710 msgid "Don't have an account ?"
6322 msgid "Don't have an account ?"
5711 msgstr ""
6323 msgstr ""
5712
6324
5713 #: rhodecode/templates/base/base.html:345
6325 #: rhodecode/templates/base/base.html:346
5714 msgid "Sign Out"
6326 msgid "Sign Out"
5715 msgstr ""
6327 msgstr ""
5716
6328
5717 #: rhodecode/templates/base/base.html:381
5718 msgid "Show activity journal"
5719 msgstr ""
5720
5721 #: rhodecode/templates/base/base.html:382
6329 #: rhodecode/templates/base/base.html:382
6330 msgid "Show activity journal"
6331 msgstr ""
6332
6333 #: rhodecode/templates/base/base.html:383
5722 #: rhodecode/templates/journal/journal.html:4
6334 #: rhodecode/templates/journal/journal.html:4
5723 #: rhodecode/templates/journal/journal.html:14
6335 #: rhodecode/templates/journal/journal.html:14
5724 msgid "Journal"
6336 msgid "Journal"
5725 msgstr ""
6337 msgstr ""
5726
6338
5727 #: rhodecode/templates/base/base.html:387
6339 #: rhodecode/templates/base/base.html:388
5728 msgid "Show Public activity journal"
6340 msgid "Show Public activity journal"
5729 msgstr ""
6341 msgstr ""
5730
6342
5731 #: rhodecode/templates/base/base.html:388
6343 #: rhodecode/templates/base/base.html:389
5732 msgid "Public journal"
6344 msgid "Public journal"
5733 msgstr ""
6345 msgstr ""
5734
6346
5735 #: rhodecode/templates/base/base.html:393
5736 msgid "Show Gists"
5737 msgstr ""
5738
5739 #: rhodecode/templates/base/base.html:394
6347 #: rhodecode/templates/base/base.html:394
6348 msgid "Show Gists"
6349 msgstr ""
6350
6351 #: rhodecode/templates/base/base.html:395
5740 msgid "Gists"
6352 msgid "Gists"
5741 msgstr ""
6353 msgstr ""
5742
6354
5743 #: rhodecode/templates/base/base.html:398
6355 #: rhodecode/templates/base/base.html:399
5744 msgid "Search in repositories you have access to"
6356 msgid "Search in repositories you have access to"
5745 msgstr ""
6357 msgstr ""
5746
6358
5747 #: rhodecode/templates/base/base.html:404
6359 #: rhodecode/templates/base/base.html:405
5748 msgid "Admin settings"
6360 msgid "Admin settings"
5749 msgstr ""
6361 msgstr ""
5750
6362
5751 #: rhodecode/templates/base/base.html:411
6363 #: rhodecode/templates/base/base.html:412
5752 msgid "Delegated Admin settings"
6364 msgid "Delegated Admin settings"
5753 msgstr ""
6365 msgstr ""
5754
6366
5755 #: rhodecode/templates/base/base.html:421
5756 #: rhodecode/templates/base/base.html:422
6367 #: rhodecode/templates/base/base.html:422
6368 #: rhodecode/templates/base/base.html:423
5757 #: rhodecode/templates/debug_style/buttons.html:5
6369 #: rhodecode/templates/debug_style/buttons.html:5
5758 #: rhodecode/templates/debug_style/code-block.html:6
6370 #: rhodecode/templates/debug_style/code-block.html:6
5759 #: rhodecode/templates/debug_style/collapsable-content.html:5
6371 #: rhodecode/templates/debug_style/collapsable-content.html:5
@@ -5774,15 +6386,15 b' msgstr ""'
5774 msgid "Style"
6386 msgid "Style"
5775 msgstr ""
6387 msgstr ""
5776
6388
5777 #: rhodecode/templates/base/base.html:479
6389 #: rhodecode/templates/base/base.html:480
5778 msgid "Go to"
6390 msgid "Go to"
5779 msgstr ""
6391 msgstr ""
5780
6392
5781 #: rhodecode/templates/base/base.html:590
6393 #: rhodecode/templates/base/base.html:591
5782 msgid "Keyboard shortcuts"
6394 msgid "Keyboard shortcuts"
5783 msgstr ""
6395 msgstr ""
5784
6396
5785 #: rhodecode/templates/base/base.html:598
6397 #: rhodecode/templates/base/base.html:599
5786 msgid "Site-wide shortcuts"
6398 msgid "Site-wide shortcuts"
5787 msgstr ""
6399 msgstr ""
5788
6400
@@ -5957,7 +6569,7 b' msgstr ""'
5957 msgid "No permission defined"
6569 msgid "No permission defined"
5958 msgstr ""
6570 msgstr ""
5959
6571
5960 #: rhodecode/templates/base/root.html:151
6572 #: rhodecode/templates/base/root.html:120
5961 msgid "Please enable JavaScript to use RhodeCode Enterprise"
6573 msgid "Please enable JavaScript to use RhodeCode Enterprise"
5962 msgstr ""
6574 msgstr ""
5963
6575
@@ -6077,6 +6689,22 b' msgstr ""'
6077 msgid "During the update of a pull request, the position of inline comments will be updated and outdated inline comments will be hidden."
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 msgstr ""
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 #: rhodecode/templates/bookmarks/bookmarks.html:5
6708 #: rhodecode/templates/bookmarks/bookmarks.html:5
6081 #, python-format
6709 #, python-format
6082 msgid "%s Bookmarks"
6710 msgid "%s Bookmarks"
@@ -6091,8 +6719,8 b' msgid "Compare Selected Bookmarks"'
6091 msgstr ""
6719 msgstr ""
6092
6720
6093 #: rhodecode/templates/bookmarks/bookmarks_data.html:13
6721 #: rhodecode/templates/bookmarks/bookmarks_data.html:13
6094 #: rhodecode/templates/changelog/changelog.html:180
6722 #: rhodecode/templates/changelog/changelog.html:183
6095 #: rhodecode/templates/changelog/changelog_summary_data.html:53
6723 #: rhodecode/templates/changelog/changelog_summary_data.html:62
6096 #: rhodecode/templates/changeset/changeset.html:92
6724 #: rhodecode/templates/changeset/changeset.html:92
6097 #: rhodecode/templates/files/base.html:10
6725 #: rhodecode/templates/files/base.html:10
6098 #, python-format
6726 #, python-format
@@ -6113,8 +6741,8 b' msgid "Compare Selected Branches"'
6113 msgstr ""
6741 msgstr ""
6114
6742
6115 #: rhodecode/templates/branches/branches_data.html:12
6743 #: rhodecode/templates/branches/branches_data.html:12
6116 #: rhodecode/templates/changelog/changelog.html:172
6744 #: rhodecode/templates/changelog/changelog.html:175
6117 #: rhodecode/templates/changelog/changelog_summary_data.html:67
6745 #: rhodecode/templates/changelog/changelog_summary_data.html:76
6118 #: rhodecode/templates/changeset/changeset.html:105
6746 #: rhodecode/templates/changeset/changeset.html:105
6119 #: rhodecode/templates/files/base.html:23
6747 #: rhodecode/templates/files/base.html:23
6120 #, python-format
6748 #, python-format
@@ -6144,10 +6772,6 b' msgstr ""'
6144 msgid "Compare fork with Parent (%s)"
6772 msgid "Compare fork with Parent (%s)"
6145 msgstr ""
6773 msgstr ""
6146
6774
6147 #: rhodecode/templates/changelog/changelog.html:62
6148 msgid "Open new pull request"
6149 msgstr ""
6150
6151 #: rhodecode/templates/changelog/changelog.html:68
6775 #: rhodecode/templates/changelog/changelog.html:68
6152 #: rhodecode/templates/changelog/changelog.html:69
6776 #: rhodecode/templates/changelog/changelog.html:69
6153 msgid "Clear selection"
6777 msgid "Clear selection"
@@ -6157,43 +6781,49 b' msgstr ""'
6157 msgid "Clear filter"
6781 msgid "Clear filter"
6158 msgstr ""
6782 msgstr ""
6159
6783
6160 #: rhodecode/templates/changelog/changelog.html:103
6784 #: rhodecode/templates/changelog/changelog.html:107
6161 #: rhodecode/templates/changelog/changelog_summary_data.html:9
6162 msgid "Age"
6163 msgstr ""
6164
6165 #: rhodecode/templates/changelog/changelog.html:105
6166 #: rhodecode/templates/files/files_add.html:93
6785 #: rhodecode/templates/files/files_add.html:93
6167 #: rhodecode/templates/files/files_delete.html:60
6786 #: rhodecode/templates/files/files_delete.html:60
6168 #: rhodecode/templates/files/files_edit.html:96
6787 #: rhodecode/templates/files/files_edit.html:96
6169 msgid "Commit Message"
6788 msgid "Commit Message"
6170 msgstr ""
6789 msgstr ""
6171
6790
6172 #: rhodecode/templates/changelog/changelog.html:108
6791 #: rhodecode/templates/changelog/changelog.html:109
6173 #: rhodecode/templates/changelog/changelog_summary_data.html:11
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 msgid "Refs"
6798 msgid "Refs"
6175 msgstr ""
6799 msgstr ""
6176
6800
6177 #: rhodecode/templates/changelog/changelog.html:122
6801 #: rhodecode/templates/changelog/changelog.html:126
6178 #: rhodecode/templates/changelog/changelog_summary_data.html:22
6802 #: rhodecode/templates/changelog/changelog_summary_data.html:21
6179 #, python-format
6803 #, python-format
6180 msgid ""
6804 msgid ""
6181 "Commit status: %s\n"
6805 "Commit status: %s\n"
6182 "Click to open associated pull request #%s"
6806 "Click to open associated pull request #%s"
6183 msgstr ""
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 #, python-format
6811 #, python-format
6187 msgid "Commit status: %s"
6812 msgid "Commit status: %s"
6188 msgstr ""
6813 msgstr ""
6189
6814
6190 #: rhodecode/templates/changelog/changelog.html:162
6815 #: rhodecode/templates/changelog/changelog.html:136
6191 #: rhodecode/templates/changelog/changelog_summary_data.html:33
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 msgid "Commit has comments"
6822 msgid "Commit has comments"
6193 msgstr ""
6823 msgstr ""
6194
6824
6195 #: rhodecode/templates/changelog/changelog.html:188
6825 #: rhodecode/templates/changelog/changelog.html:191
6196 #: rhodecode/templates/changelog/changelog_summary_data.html:60
6826 #: rhodecode/templates/changelog/changelog_summary_data.html:69
6197 #: rhodecode/templates/changeset/changeset.html:99
6827 #: rhodecode/templates/changeset/changeset.html:99
6198 #: rhodecode/templates/files/base.html:17
6828 #: rhodecode/templates/files/base.html:17
6199 #: rhodecode/templates/tags/tags_data.html:12
6829 #: rhodecode/templates/tags/tags_data.html:12
@@ -6201,16 +6831,16 b' msgstr ""'
6201 msgid "Tag %s"
6831 msgid "Tag %s"
6202 msgstr ""
6832 msgstr ""
6203
6833
6204 #: rhodecode/templates/changelog/changelog.html:338
6834 #: rhodecode/templates/changelog/changelog.html:341
6205 msgid "Filter changelog"
6835 msgid "Filter changelog"
6206 msgstr ""
6836 msgstr ""
6207
6837
6208 #: rhodecode/templates/changelog/changelog.html:411
6838 #: rhodecode/templates/changelog/changelog.html:414
6209 msgid "There are no changes yet"
6839 msgid "There are no changes yet"
6210 msgstr ""
6840 msgstr ""
6211
6841
6212 #: rhodecode/templates/changelog/changelog_details.html:4
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 msgid "Removed"
6844 msgid "Removed"
6215 msgstr ""
6845 msgstr ""
6216
6846
@@ -6241,25 +6871,25 b' msgstr ""'
6241 msgid "Show File"
6871 msgid "Show File"
6242 msgstr ""
6872 msgstr ""
6243
6873
6244 #: rhodecode/templates/changelog/changelog_summary_data.html:8
6874 #: rhodecode/templates/changelog/changelog_summary_data.html:9
6245 #: rhodecode/templates/search/search_commit.html:8
6875 #: rhodecode/templates/search/search_commit.html:8
6246 msgid "Commit message"
6876 msgid "Commit message"
6247 msgstr ""
6877 msgstr ""
6248
6878
6249 #: rhodecode/templates/changelog/changelog_summary_data.html:91
6879 #: rhodecode/templates/changelog/changelog_summary_data.html:100
6250 msgid "Add or upload files directly via RhodeCode:"
6880 msgid "Add or upload files directly via RhodeCode:"
6251 msgstr ""
6881 msgstr ""
6252
6882
6253 #: rhodecode/templates/changelog/changelog_summary_data.html:94
6883 #: rhodecode/templates/changelog/changelog_summary_data.html:103
6254 #: rhodecode/templates/files/files_browser.html:25
6884 #: rhodecode/templates/files/files_browser.html:25
6255 msgid "Add New File"
6885 msgid "Add New File"
6256 msgstr ""
6886 msgstr ""
6257
6887
6258 #: rhodecode/templates/changelog/changelog_summary_data.html:102
6888 #: rhodecode/templates/changelog/changelog_summary_data.html:111
6259 msgid "Push new repo:"
6889 msgid "Push new repo:"
6260 msgstr ""
6890 msgstr ""
6261
6891
6262 #: rhodecode/templates/changelog/changelog_summary_data.html:113
6892 #: rhodecode/templates/changelog/changelog_summary_data.html:122
6263 msgid "Existing repository?"
6893 msgid "Existing repository?"
6264 msgstr ""
6894 msgstr ""
6265
6895
@@ -6335,7 +6965,7 b' msgstr ""'
6335
6965
6336 #: rhodecode/templates/changeset/changeset.html:145
6966 #: rhodecode/templates/changeset/changeset.html:145
6337 #: rhodecode/templates/changeset/changeset.html:147
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 #, python-format
6969 #, python-format
6340 msgid "%d Commit comment"
6970 msgid "%d Commit comment"
6341 msgid_plural "%d Commit comments"
6971 msgid_plural "%d Commit comments"
@@ -6346,22 +6976,22 b' msgstr[1] ""'
6346 #: rhodecode/templates/changeset/changeset.html:153
6976 #: rhodecode/templates/changeset/changeset.html:153
6347 #: rhodecode/templates/pullrequests/pullrequest_show.html:145
6977 #: rhodecode/templates/pullrequests/pullrequest_show.html:145
6348 #: rhodecode/templates/pullrequests/pullrequest_show.html:147
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 #, python-format
6980 #, python-format
6351 msgid "%d Inline Comment"
6981 msgid "%d Inline Comment"
6352 msgid_plural "%d Inline Comments"
6982 msgid_plural "%d Inline Comments"
6353 msgstr[0] ""
6983 msgstr[0] ""
6354 msgstr[1] ""
6984 msgstr[1] ""
6355
6985
6356 #: rhodecode/templates/changeset/changeset.html:177
6986 #: rhodecode/templates/changeset/changeset.html:175
6357 msgid "Browse files at current commit"
6987 msgid "Browse files at current commit"
6358 msgstr ""
6988 msgstr ""
6359
6989
6990 #: rhodecode/templates/changeset/changeset.html:175
6991 msgid "Browse files"
6992 msgstr ""
6993
6360 #: rhodecode/templates/changeset/changeset.html:177
6994 #: rhodecode/templates/changeset/changeset.html:177
6361 msgid "Browse files"
6362 msgstr ""
6363
6364 #: rhodecode/templates/changeset/changeset.html:179
6365 #: rhodecode/templates/changeset/changeset_range.html:59
6995 #: rhodecode/templates/changeset/changeset_range.html:59
6366 #: rhodecode/templates/compare/compare_diff.html:255
6996 #: rhodecode/templates/compare/compare_diff.html:255
6367 #: rhodecode/templates/files/file_diff.html:77
6997 #: rhodecode/templates/files/file_diff.html:77
@@ -6369,7 +6999,7 b' msgstr ""'
6369 msgid "Expand All"
6999 msgid "Expand All"
6370 msgstr ""
7000 msgstr ""
6371
7001
6372 #: rhodecode/templates/changeset/changeset.html:179
7002 #: rhodecode/templates/changeset/changeset.html:177
6373 #: rhodecode/templates/changeset/changeset_range.html:59
7003 #: rhodecode/templates/changeset/changeset_range.html:59
6374 #: rhodecode/templates/compare/compare_diff.html:255
7004 #: rhodecode/templates/compare/compare_diff.html:255
6375 #: rhodecode/templates/files/file_diff.html:77
7005 #: rhodecode/templates/files/file_diff.html:77
@@ -6377,30 +7007,32 b' msgstr ""'
6377 msgid "Collapse All"
7007 msgid "Collapse All"
6378 msgstr ""
7008 msgstr ""
6379
7009
6380 #: rhodecode/templates/changeset/changeset.html:190
7010 #: rhodecode/templates/changeset/changeset.html:188
6381 #: rhodecode/templates/compare/compare_diff.html:263
7011 #: rhodecode/templates/compare/compare_diff.html:263
6382 #: rhodecode/templates/pullrequests/pullrequest_show.html:274
7012 #: rhodecode/templates/pullrequests/pullrequest_show.html:274
6383 msgid "No files"
7013 msgid "No files"
6384 msgstr ""
7014 msgstr ""
6385
7015
6386 #: rhodecode/templates/changeset/changeset.html:227
7016 #: rhodecode/templates/changeset/changeset.html:225
6387 #: rhodecode/templates/files/file_diff.html:128
7017 #: rhodecode/templates/files/file_diff.html:128
7018 #: rhodecode/templates/pullrequests/pullrequest_show.html:315
6388 msgid "Show comments"
7019 msgid "Show comments"
6389 msgstr ""
7020 msgstr ""
6390
7021
6391 #: rhodecode/templates/changeset/changeset.html:228
7022 #: rhodecode/templates/changeset/changeset.html:226
6392 #: rhodecode/templates/files/file_diff.html:129
7023 #: rhodecode/templates/files/file_diff.html:129
7024 #: rhodecode/templates/pullrequests/pullrequest_show.html:316
6393 msgid "Hide comments"
7025 msgid "Hide comments"
6394 msgstr ""
7026 msgstr ""
6395
7027
6396 #: rhodecode/templates/changeset/changeset.html:245
7028 #: rhodecode/templates/changeset/changeset.html:243
6397 #: rhodecode/templates/changeset/diff_block.html:25
7029 #: rhodecode/templates/changeset/diff_block.html:25
6398 #: rhodecode/templates/changeset/diff_block.html:46
7030 #: rhodecode/templates/changeset/diff_block.html:46
6399 #: rhodecode/templates/files/file_diff.html:146
7031 #: rhodecode/templates/files/file_diff.html:146
6400 msgid "Diff was truncated. File content available only in full diff."
7032 msgid "Diff was truncated. File content available only in full diff."
6401 msgstr ""
7033 msgstr ""
6402
7034
6403 #: rhodecode/templates/changeset/changeset.html:245
7035 #: rhodecode/templates/changeset/changeset.html:243
6404 #: rhodecode/templates/changeset/diff_block.html:7
7036 #: rhodecode/templates/changeset/diff_block.html:7
6405 #: rhodecode/templates/changeset/diff_block.html:10
7037 #: rhodecode/templates/changeset/diff_block.html:10
6406 #: rhodecode/templates/changeset/diff_block.html:25
7038 #: rhodecode/templates/changeset/diff_block.html:25
@@ -6410,22 +7042,22 b' msgstr ""'
6410 msgid "Showing a big diff might take some time and resources, continue?"
7042 msgid "Showing a big diff might take some time and resources, continue?"
6411 msgstr ""
7043 msgstr ""
6412
7044
6413 #: rhodecode/templates/changeset/changeset.html:245
7045 #: rhodecode/templates/changeset/changeset.html:243
6414 #: rhodecode/templates/changeset/diff_block.html:7
7046 #: rhodecode/templates/changeset/diff_block.html:7
6415 #: rhodecode/templates/changeset/diff_block.html:10
7047 #: rhodecode/templates/changeset/diff_block.html:10
6416 #: rhodecode/templates/changeset/diff_block.html:25
7048 #: rhodecode/templates/changeset/diff_block.html:25
6417 #: rhodecode/templates/changeset/diff_block.html:46
7049 #: rhodecode/templates/changeset/diff_block.html:46
6418 #: rhodecode/templates/files/file_diff.html:146
7050 #: rhodecode/templates/files/file_diff.html:146
6419 #: rhodecode/templates/pullrequests/pullrequest_show.html:386
7051 #: rhodecode/templates/pullrequests/pullrequest_show.html:390
6420 #: rhodecode/templates/pullrequests/pullrequest_show.html:392
7052 #: rhodecode/templates/pullrequests/pullrequest_show.html:396
6421 msgid "Show full diff"
7053 msgid "Show full diff"
6422 msgstr ""
7054 msgstr ""
6423
7055
6424 #: rhodecode/templates/changeset/changeset.html:314
7056 #: rhodecode/templates/changeset/changeset.html:312
6425 msgid "No Child Commits"
7057 msgid "No Child Commits"
6426 msgstr ""
7058 msgstr ""
6427
7059
6428 #: rhodecode/templates/changeset/changeset.html:350
7060 #: rhodecode/templates/changeset/changeset.html:348
6429 msgid "No Parent Commits"
7061 msgid "No Parent Commits"
6430 msgstr ""
7062 msgstr ""
6431
7063
@@ -6478,6 +7110,8 b' msgstr ""'
6478 #: rhodecode/templates/changeset/changeset_file_comment.html:146
7110 #: rhodecode/templates/changeset/changeset_file_comment.html:146
6479 #: rhodecode/templates/changeset/changeset_file_comment.html:293
7111 #: rhodecode/templates/changeset/changeset_file_comment.html:293
6480 #: rhodecode/templates/compare/compare_diff.html:57
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 msgid "Comment"
7115 msgid "Comment"
6482 msgstr ""
7116 msgstr ""
6483
7117
@@ -6624,12 +7258,15 b' msgid "Compare Commits"'
6624 msgstr ""
7258 msgstr ""
6625
7259
6626 #: rhodecode/templates/compare/compare_diff.html:46
7260 #: rhodecode/templates/compare/compare_diff.html:46
7261 #: rhodecode/templates/email_templates/pull_request_review.mako:50
6627 #: rhodecode/templates/files/file_diff.html:56
7262 #: rhodecode/templates/files/file_diff.html:56
6628 #: rhodecode/templates/pullrequests/pullrequest_show.html:85
7263 #: rhodecode/templates/pullrequests/pullrequest_show.html:85
6629 msgid "Target"
7264 msgid "Target"
6630 msgstr ""
7265 msgstr ""
6631
7266
6632 #: rhodecode/templates/compare/compare_diff.html:47
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 #: rhodecode/templates/files/file_diff.html:62
7270 #: rhodecode/templates/files/file_diff.html:62
6634 #: rhodecode/templates/files/files_source.html:18
7271 #: rhodecode/templates/files/files_source.html:18
6635 msgid "Source"
7272 msgid "Source"
@@ -6679,36 +7316,36 b' msgstr ""'
6679 msgid "Subscribe to %s atom feed"
7316 msgid "Subscribe to %s atom feed"
6680 msgstr ""
7317 msgstr ""
6681
7318
6682 #: rhodecode/templates/data_table/_dt_elements.html:127
7319 #: rhodecode/templates/data_table/_dt_elements.html:129
6683 msgid "Creating"
7320 msgid "Creating"
6684 msgstr ""
7321 msgstr ""
6685
7322
6686 #: rhodecode/templates/data_table/_dt_elements.html:129
7323 #: rhodecode/templates/data_table/_dt_elements.html:131
6687 msgid "Created"
7324 msgid "Created"
6688 msgstr ""
7325 msgstr ""
6689
7326
6690 #: rhodecode/templates/data_table/_dt_elements.html:175
7327 #: rhodecode/templates/data_table/_dt_elements.html:177
6691 #, python-format
7328 #, python-format
6692 msgid "Confirm to delete this group: %s with %s repository"
7329 msgid "Confirm to delete this group: %s with %s repository"
6693 msgid_plural "Confirm to delete this group: %s with %s repositories"
7330 msgid_plural "Confirm to delete this group: %s with %s repositories"
6694 msgstr[0] ""
7331 msgstr[0] ""
6695 msgstr[1] ""
7332 msgstr[1] ""
6696
7333
6697 #: rhodecode/templates/data_table/_dt_elements.html:201
7334 #: rhodecode/templates/data_table/_dt_elements.html:203
6698 #, python-format
7335 #, python-format
6699 msgid "Confirm to delete this user group: %s"
7336 msgid "Confirm to delete this user group: %s"
6700 msgstr ""
7337 msgstr ""
6701
7338
6702 #: rhodecode/templates/data_table/_dt_elements.html:218
7339 #: rhodecode/templates/data_table/_dt_elements.html:220
6703 msgid "User group"
7340 msgid "User group"
6704 msgstr ""
7341 msgstr ""
6705
7342
6706 #: rhodecode/templates/data_table/_dt_elements.html:262
7343 #: rhodecode/templates/data_table/_dt_elements.html:264
6707 #: rhodecode/templates/forks/fork.html:81
7344 #: rhodecode/templates/forks/fork.html:81
6708 msgid "Private"
7345 msgid "Private"
6709 msgstr ""
7346 msgstr ""
6710
7347
6711 #: rhodecode/templates/data_table/_dt_elements.html:287
7348 #: rhodecode/templates/data_table/_dt_elements.html:289
6712 #, python-format
7349 #, python-format
6713 msgid "Pull request #%(pr_number)s"
7350 msgid "Pull request #%(pr_number)s"
6714 msgstr ""
7351 msgstr ""
@@ -6812,85 +7449,130 b' msgstr ""'
6812 msgid "Form vertical"
7449 msgid "Form vertical"
6813 msgstr ""
7450 msgstr ""
6814
7451
6815 #: rhodecode/templates/email_templates/base.mako:16
7452 #: rhodecode/templates/email_templates/base.mako:7
6816 #, python-format
7453 #, python-format
6817 msgid "This is a notification from RhodeCode. %(instance_url)s"
7454 msgid "This is a notification from RhodeCode. %(instance_url)s"
6818 msgstr ""
7455 msgstr ""
6819
7456
6820 #: rhodecode/templates/email_templates/commit_comment.mako:5
7457 #: rhodecode/templates/email_templates/base.mako:90
6821 #: rhodecode/templates/email_templates/pull_request_comment.mako:5
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 msgid "[mention]"
7463 msgid "[mention]"
6823 msgstr ""
7464 msgstr ""
6824
7465
6825 #: rhodecode/templates/email_templates/commit_comment.mako:5
7466 #: rhodecode/templates/email_templates/commit_comment.mako:19
6826 #, python-format
7467 #, python-format
6827 msgid "%(user)s commented on commit of %(repo_name)s"
7468 msgid "%(user)s commented on commit `%(commit_id)s` (file: `%(comment_file)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"
6835 msgstr ""
7469 msgstr ""
6836
7470
6837 #: rhodecode/templates/email_templates/commit_comment.mako:19
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 #: rhodecode/templates/email_templates/commit_comment.mako:43
7489 #: rhodecode/templates/email_templates/commit_comment.mako:43
6839 #: rhodecode/templates/email_templates/pull_request_comment.mako:20
7490 #: rhodecode/templates/email_templates/pull_request_comment.mako:43
6840 #: rhodecode/templates/email_templates/pull_request_comment.mako:54
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 #, python-format
7496 #, python-format
6842 msgid "File: %(comment_file)s on line %(comment_line)s"
7497 msgid "File: %(comment_file)s on line %(comment_line)s"
6843 msgstr ""
7498 msgstr ""
6844
7499
6845 #: rhodecode/templates/email_templates/commit_comment.mako:28
7500 #: rhodecode/templates/email_templates/commit_comment.mako:54
6846 #: rhodecode/templates/email_templates/commit_comment.mako:56
6847 msgid "Commit status was changed to"
7501 msgid "Commit status was changed to"
6848 msgstr ""
7502 msgstr ""
6849
7503
6850 #: rhodecode/templates/email_templates/commit_comment.mako:35
7504 #: rhodecode/templates/email_templates/commit_comment.mako:76
6851 #, python-format
7505 #, python-format
6852 msgid "%(user)s commented on a file in commit of %(repo_url)s."
7506 msgid "%(user)s commented on commit `%(commit_id)s` (file:`%(comment_file)s`)"
6853 msgstr ""
7507 msgstr ""
6854
7508
6855 #: rhodecode/templates/email_templates/commit_comment.mako:37
7509 #: rhodecode/templates/email_templates/commit_comment.mako:76
6856 #, python-format
7510 #: rhodecode/templates/email_templates/commit_comment.mako:78
6857 msgid "%(user)s commented on a commit of %(repo_url)s."
7511 #, python-format
6858 msgstr ""
7512 msgid "in the %(repo)s repository"
6859
7513 msgstr ""
6860 #: rhodecode/templates/email_templates/commit_comment.mako:47
7514
6861 #: rhodecode/templates/files/files_detail.html:5
7515 #: rhodecode/templates/email_templates/commit_comment.mako:85
6862 #: rhodecode/templates/files/files_detail.html:12
7516 msgid "Status"
6863 msgid "Commit Description"
7517 msgstr ""
6864 msgstr ""
7518
6865
7519 #: rhodecode/templates/email_templates/commit_comment.mako:85
6866 #: rhodecode/templates/email_templates/pull_request_comment.mako:5
7520 msgid "The commit status was changed to"
6867 #, python-format
7521 msgstr ""
6868 msgid "%(user)s commented on pull request #%(pr_id)s: \"%(pr_title)s\""
7522
6869 msgstr ""
7523 #: rhodecode/templates/email_templates/commit_comment.mako:87
6870
7524 #: rhodecode/templates/email_templates/pull_request_comment.mako:93
6871 #: rhodecode/templates/email_templates/pull_request_comment.mako:17
7525 #, python-format
6872 #: rhodecode/templates/email_templates/pull_request_comment.mako:52
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 msgid "Source repository"
7550 msgid "Source repository"
6874 msgstr ""
7551 msgstr ""
6875
7552
6876 #: rhodecode/templates/email_templates/pull_request_comment.mako:29
7553 #: rhodecode/templates/email_templates/pull_request_comment.mako:54
6877 #: rhodecode/templates/email_templates/pull_request_comment.mako:63
7554 #, python-format
6878 msgid "Pull request status was changed to"
7555 msgid "%(user)s submitted pull request #%(pr_id)s status: *%(status)s*"
6879 msgstr ""
7556 msgstr ""
6880
7557
6881 #: rhodecode/templates/email_templates/pull_request_comment.mako:31
7558 #: rhodecode/templates/email_templates/pull_request_comment.mako:56
6882 #: rhodecode/templates/email_templates/pull_request_comment.mako:65
7559 #, python-format
6883 msgid "Pull request was closed with status"
7560 msgid "%(user)s submitted pull request #%(pr_id)s status: *%(status)s and closed*"
6884 msgstr ""
7561 msgstr ""
6885
7562
6886 #: rhodecode/templates/email_templates/pull_request_comment.mako:37
7563 #: rhodecode/templates/email_templates/pull_request_comment.mako:80
6887 #, python-format
7564 #, python-format
6888 msgid "%(user)s commented on a file on pull request #%(pr_id)s: \"%(pr_title)s\"."
7565 msgid "%(user)s commented on pull request #%(pr_id)s \"%(pr_title)s\" (file:`%(comment_file)s`)"
6889 msgstr ""
7566 msgstr ""
6890
7567
6891 #: rhodecode/templates/email_templates/pull_request_comment.mako:43
7568 #: rhodecode/templates/email_templates/pull_request_comment.mako:86
6892 #, python-format
7569 #, python-format
6893 msgid "%(user)s commented on a pull request #%(pr_id)s \"%(pr_title)s\"."
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 msgstr ""
7576 msgstr ""
6895
7577
6896 #: rhodecode/templates/email_templates/pull_request_review.mako:5
7578 #: rhodecode/templates/email_templates/pull_request_review.mako:5
@@ -6899,18 +7581,15 b' msgid "%(user)s wants you to review pull'
6899 msgstr ""
7581 msgstr ""
6900
7582
6901 #: rhodecode/templates/email_templates/pull_request_review.mako:17
7583 #: rhodecode/templates/email_templates/pull_request_review.mako:17
6902 #: rhodecode/templates/email_templates/pull_request_review.mako:54
6903 #, python-format
7584 #, python-format
6904 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"
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 msgstr ""
7586 msgstr ""
6906
7587
6907 #: rhodecode/templates/email_templates/pull_request_review.mako:26
7588 #: rhodecode/templates/email_templates/pull_request_review.mako:26
6908 #: rhodecode/templates/email_templates/pull_request_review.mako:63
6909 msgid "Link"
7589 msgid "Link"
6910 msgstr ""
7590 msgstr ""
6911
7591
6912 #: rhodecode/templates/email_templates/pull_request_review.mako:35
7592 #: rhodecode/templates/email_templates/pull_request_review.mako:35
6913 #: rhodecode/templates/email_templates/pull_request_review.mako:72
6914 #, python-format
7593 #, python-format
6915 msgid "Commit (%(num)s)"
7594 msgid "Commit (%(num)s)"
6916 msgid_plural "Commits (%(num)s)"
7595 msgid_plural "Commits (%(num)s)"
@@ -6922,6 +7601,25 b' msgstr[1] ""'
6922 msgid "%(user)s wants you to review pull request #%(pr_id)s: \"%(pr_title)s\"."
7601 msgid "%(user)s wants you to review pull request #%(pr_id)s: \"%(pr_title)s\"."
6923 msgstr ""
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 #: rhodecode/templates/email_templates/test.mako:5
7623 #: rhodecode/templates/email_templates/test.mako:5
6926 msgid "hello \"world\""
7624 msgid "hello \"world\""
6927 msgstr ""
7625 msgstr ""
@@ -6930,6 +7628,21 b' msgstr ""'
6930 msgid "Translation"
7628 msgid "Translation"
6931 msgstr ""
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 #: rhodecode/templates/errors/error_document.html:39
7646 #: rhodecode/templates/errors/error_document.html:39
6934 #, python-format
7647 #, python-format
6935 msgid "You will be redirected to %s in %s seconds"
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 msgstr ""
7654 msgstr ""
6942
7655
6943 #: rhodecode/templates/feed/atom_feed_entry.mako:26
7656 #: rhodecode/templates/feed/atom_feed_entry.mako:26
6944 #: rhodecode/templates/pullrequests/pullrequest_show.html:386
7657 #: rhodecode/templates/pullrequests/pullrequest_show.html:390
6945 #: rhodecode/templates/pullrequests/pullrequest_show.html:392
7658 #: rhodecode/templates/pullrequests/pullrequest_show.html:396
6946 msgid "Commit was too big and was cut off..."
7659 msgid "Commit was too big and was cut off..."
6947 msgstr ""
7660 msgstr ""
6948
7661
@@ -6986,7 +7699,7 b' msgstr[1] ""'
6986 msgid "Show All"
7699 msgid "Show All"
6987 msgstr ""
7700 msgstr ""
6988
7701
6989 #: rhodecode/templates/files/file_authors_box.html:26
7702 #: rhodecode/templates/files/file_authors_box.html:25
6990 msgid "last author"
7703 msgid "last author"
6991 msgstr ""
7704 msgstr ""
6992
7705
@@ -7021,7 +7734,7 b' msgstr ""'
7021 msgid "%s Files"
7734 msgid "%s Files"
7022 msgstr ""
7735 msgstr ""
7023
7736
7024 #: rhodecode/templates/files/files.html:143
7737 #: rhodecode/templates/files/files.html:131
7025 msgid "Switch To Commit"
7738 msgid "Switch To Commit"
7026 msgstr ""
7739 msgstr ""
7027
7740
@@ -7117,22 +7830,18 b' msgstr ""'
7117 msgid "Loading file list..."
7830 msgid "Loading file list..."
7118 msgstr ""
7831 msgstr ""
7119
7832
7120 #: rhodecode/templates/files/files_browser.html:50
7833 #: rhodecode/templates/files/files_browser_tree.html:6
7121 msgid "Size"
7834 msgid "Size"
7122 msgstr ""
7835 msgstr ""
7123
7836
7124 #: rhodecode/templates/files/files_browser.html:51
7837 #: rhodecode/templates/files/files_browser_tree.html:7
7125 msgid "Modified"
7838 msgid "Modified"
7126 msgstr ""
7839 msgstr ""
7127
7840
7128 #: rhodecode/templates/files/files_browser.html:52
7841 #: rhodecode/templates/files/files_browser_tree.html:8
7129 msgid "Last Commit"
7842 msgid "Last Commit"
7130 msgstr ""
7843 msgstr ""
7131
7844
7132 #: rhodecode/templates/files/files_browser.html:89
7133 msgid "Loading..."
7134 msgstr ""
7135
7136 #: rhodecode/templates/files/files_delete.html:4
7845 #: rhodecode/templates/files/files_delete.html:4
7137 #, python-format
7846 #, python-format
7138 msgid "%s Files Delete"
7847 msgid "%s Files Delete"
@@ -7157,6 +7866,11 b' msgstr ""'
7157 msgid "Delete File"
7866 msgid "Delete File"
7158 msgstr ""
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 #: rhodecode/templates/files/files_detail.html:35
7874 #: rhodecode/templates/files/files_detail.html:35
7161 msgid "File last commit"
7875 msgid "File last commit"
7162 msgstr ""
7876 msgstr ""
@@ -7315,7 +8029,7 b' msgstr ""'
7315 msgid "Forked"
8029 msgid "Forked"
7316 msgstr ""
8030 msgstr ""
7317
8031
7318 #: rhodecode/templates/forks/forks_data.html:48
8032 #: rhodecode/templates/forks/forks_data.html:46
7319 msgid "There are no forks yet"
8033 msgid "There are no forks yet"
7320 msgstr ""
8034 msgstr ""
7321
8035
@@ -7331,7 +8045,7 b' msgstr ""'
7331 msgid "RSS journal feed"
8045 msgid "RSS journal feed"
7332 msgstr ""
8046 msgstr ""
7333
8047
7334 #: rhodecode/templates/journal/journal_data.html:53
8048 #: rhodecode/templates/journal/journal_data.html:51
7335 msgid "No entries yet"
8049 msgid "No entries yet"
7336 msgstr ""
8050 msgstr ""
7337
8051
@@ -7503,13 +8217,13 b' msgid_plural "Compare View: %s commits"'
7503 msgstr[0] ""
8217 msgstr[0] ""
7504 msgstr[1] ""
8218 msgstr[1] ""
7505
8219
7506 #: rhodecode/templates/pullrequests/pullrequest_show.html:330
8220 #: rhodecode/templates/pullrequests/pullrequest_show.html:334
7507 #: rhodecode/templates/pullrequests/pullrequest_show.html:365
8221 #: rhodecode/templates/pullrequests/pullrequest_show.html:369
7508 msgid "Outdated Inline Comments"
8222 msgid "Outdated Inline Comments"
7509 msgstr ""
8223 msgstr ""
7510
8224
7511 #: rhodecode/templates/pullrequests/pullrequest_show.html:386
8225 #: rhodecode/templates/pullrequests/pullrequest_show.html:390
7512 #: rhodecode/templates/pullrequests/pullrequest_show.html:392
8226 #: rhodecode/templates/pullrequests/pullrequest_show.html:396
7513 msgid "Showing a huge diff might take some time and resources"
8227 msgid "Showing a huge diff might take some time and resources"
7514 msgstr ""
8228 msgstr ""
7515
8229
@@ -7688,14 +8402,6 b' msgstr ""'
7688 msgid "Information"
8402 msgid "Information"
7689 msgstr ""
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 #: rhodecode/templates/summary/components.html:102
8405 #: rhodecode/templates/summary/components.html:102
7700 msgid "Number of Repository Forks"
8406 msgid "Number of Repository Forks"
7701 msgstr ""
8407 msgstr ""
@@ -7759,11 +8465,6 b' msgstr ""'
7759 msgid "Compare Selected Tags"
8465 msgid "Compare Selected Tags"
7760 msgstr ""
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 #: rhodecode/templates/users/user_profile.html:35
8468 #: rhodecode/templates/users/user_profile.html:35
7768 msgid "First name"
8469 msgid "First name"
7769 msgstr ""
8470 msgstr ""
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file copied from rhodecode/templates/admin/my_account/my_account_emails.html to rhodecode/templates/admin/my_account/my_account_notifications.html
NO CONTENT: file copied from rhodecode/templates/admin/my_account/my_account_emails.html to rhodecode/templates/admin/my_account/my_account_notifications.html
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/tests/functional/test_changeset_comments.py to rhodecode/tests/functional/test_commit_comments.py
NO CONTENT: file renamed from rhodecode/tests/functional/test_changeset_comments.py to rhodecode/tests/functional/test_commit_comments.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/tests/models/test_validation_schema.py to rhodecode/tests/models/schemas/test_schema_types.py
NO CONTENT: file renamed from rhodecode/tests/models/test_validation_schema.py to rhodecode/tests/models/schemas/test_schema_types.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now