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

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

@@ -0,0 +1,42 b''
1 .. _restore-deleted-repositories:
2
3 Restoring Deleted Repositories
4 ==============================
5
6 By default when repository or whole repository group is deleted an archived copy
7 of filesystem repositories are kept. You can see them as special entries in the
8 repository storage such as::
9
10 drwxrwxr-x 3 rcdev rcdev 4096 Dec 4 2017 rm__20171204_105727_400795__ce-import
11 drwxrwxr-x 6 rcdev rcdev 4096 Nov 21 2017 rm__20180221_152430_675047__svn-repo
12 drwxr-xr-x 7 rcdev rcdev 4096 Mar 28 2018 rm__20180328_143124_617576__test-git
13 drwxr-xr-x 7 rcdev rcdev 4096 Mar 28 2018 rm__20180328_144954_317729__test-git-install-hooks
14
15
16 Data from those repositories can be restored by simply removing the
17 `rm_YYYYDDMM_HHMMSS_DDDDDD__` prefix and additionally only in case of Mercurial
18 repositories remove the `.hg` store prefix.::
19
20 rm__.hg => .hg
21
22
23 For Git or SVN repositories this operation is not required.
24
25 After removing the prefix repository can be brought by opening
26 :menuselection:`Admin --> Settings --> Remap and Rescan` and running `Rescan Filesystem`
27
28 This will create a new DB entry restoring the data previously removed.
29 To restore OLD database entries this should be done by restoring from a Database backup.
30
31 RhodeCode also keeps the repository group structure, this is marked by entries that
32 in addition have GROUP in the prefix, eg::
33
34 drwxr-xr-x 2 rcdev rcdev 4096 Jan 18 16:13 rm__20181130_120650_977082_GROUP_Test1
35 drwxr-xr-x 2 rcdev rcdev 4096 Jan 18 16:13 rm__20181130_120659_922952_GROUP_Docs
36
37
38
39 .. note::
40
41 RhodeCode Tools have a special cleanup tool for the archived repositories. Please
42 see :ref:`clean-up-cmds`
@@ -0,0 +1,37 b''
1 .. _store-methods-ref:
2
3 store methods
4 =============
5
6 file_store_add (EE only)
7 ------------------------
8
9 .. py:function:: file_store_add(apiuser, filename, content)
10
11 Upload API for the file_store
12
13 Example usage from CLI::
14 rhodecode-api --instance-name=enterprise-1 upload_file "{"content": "$(cat image.jpg | base64)", "filename":"image.jpg"}"
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 filename: name of the file uploaded
21 :type filename: str
22 :param content: base64 encoded content of the uploaded file
23 :type content: str
24
25 Example output:
26
27 .. code-block:: bash
28
29 id : <id_given_in_input>
30 result: {
31 "access_path": "/_file_store/download/84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg",
32 "access_path_fqn": "http://server.domain.com/_file_store/download/84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg",
33 "store_fid": "84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg"
34 }
35 error : null
36
37
@@ -0,0 +1,88 b''
1 .. _auth-saml-bulk-enroll-users-ref:
2
3
4 Bulk enroll multiple existing users
5 -----------------------------------
6
7
8 RhodeCode Supports standard SAML 2.0 SSO for the web-application part.
9 Below is an example how to enroll list of all or some users to use SAML authentication.
10 This method simply enables SAML authentication for many users at once.
11
12
13 From the server RhodeCode Enterprise is running run ishell on the instance which we
14 want to apply the SAML migration::
15
16 rccontrol ishell enterprise-1
17
18 Follow these steps to enable SAML authentication for multiple users.
19
20
21 1) Create a user_id => attribute mapping
22
23
24 `saml2user` is a mapping of external ID from SAML provider such as OneLogin, DuoSecurity, Google.
25 This mapping consists of local rhodecode user_id mapped to set of required attributes needed to bind SAML
26 account to internal rhodecode user.
27 For example, 123 is local rhodecode user_id, and '48253211' is OneLogin ID.
28 For other providers you'd have to figure out what would be the user-id, sometimes it's the email, i.e for Google
29 The most important this id needs to be unique for each user.
30
31 .. code-block:: python
32
33 In [1]: saml2user = {
34 ...: # OneLogin, uses externalID available to read from in the UI
35 ...: 123: {'id: '48253211'},
36 ...: # for Google/DuoSecurity email is also an option for unique ID
37 ...: 124: {'id: 'email@domain.com'},
38 ...: }
39
40
41 2) Import the plugin you want to run migration for.
42
43 From available options pick only one and run the `import` statement
44
45 .. code-block:: python
46
47 # for Duo Security
48 In [2]: from rc_auth_plugins.auth_duo_security import RhodeCodeAuthPlugin
49 # for OneLogin
50 In [2]: from rc_auth_plugins.auth_onelogin import RhodeCodeAuthPlugin
51 # generic SAML plugin
52 In [2]: from rc_auth_plugins.auth_saml import RhodeCodeAuthPlugin
53
54 3) Run the migration based on saml2user mapping.
55
56 Enter in the ishell prompt
57
58 .. code-block:: python
59
60 In [3]: for user in User.get_all():
61 ...: existing_identity = ExternalIdentity().query().filter(ExternalIdentity.local_user_id == user.user_id).scalar()
62 ...: attrs = saml2user.get(user.user_id)
63 ...: provider = RhodeCodeAuthPlugin.uid
64 ...: if existing_identity:
65 ...: print('Identity for user `{}` already exists, skipping'.format(user.username))
66 ...: continue
67 ...: if attrs:
68 ...: external_id = attrs['id']
69 ...: new_external_identity = ExternalIdentity()
70 ...: new_external_identity.external_id = external_id
71 ...: new_external_identity.external_username = '{}-saml-{}'.format(user.username, user.user_id)
72 ...: new_external_identity.provider_name = provider
73 ...: new_external_identity.local_user_id = user_id
74 ...: new_external_identity.access_token = ''
75 ...: new_external_identity.token_secret = ''
76 ...: new_external_identity.alt_token = ''
77 ...: Session().add(ex_identity)
78 ...: Session().commit()
79 ...: print('Set user `{}` external identity bound to ExternalID:{}'.format(user.username, external_id))
80
81 .. note::
82
83 saml2user can be really big and hard to maintain in ishell. It's also possible
84 to load it as a JSON file prepared before and stored on disk. To do so run::
85
86 import json
87 saml2user = json.loads(open('/path/to/saml2user.json','rb').read())
88
@@ -0,0 +1,148 b''
1 |RCE| 4.16.0 |RNS|
2 ------------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2019-02-15
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13
14 - Full-text search: added support for ElasticSearch 6.X (ES6)
15 - Full-text search: Expose a quick way to search within repository groups using ES6.
16 - Full-text search: Add quick links to broaden/narrow search scope to repositories or
17 repository groups from global search.
18 - Full-text search: ES6 backend adds new highlighter, and search markers for better UX when searching.
19 - Full-text search: ES6 backend has enabled advanced `query string syntax`
20 adding more search and filtering capabilities.
21 - Full-text search: ES6 engine will now show added information where available such as line numbers file size.
22 - Files: added option to use highlight marker to show keywords inside file source. This
23 is used now for ES6 backend extended highlighting capabilities
24 - Artifacts (beta): EE edition exposes new feature called storage_api this allows storing
25 binary files outside of Version Control System, but in the scope of a repository or group.
26 This will soon become an Artifacts functionality available in EE edition.
27 - Authentication: introduced `User restriction` and `Scope restriction` for RhodeCode authentication plugins.
28 Admins can limit usage of RhodeCode plugins to super-admins user types, and usage in Web, or VCS protocol only.
29 This is mostly to help to migrate users to SAML, keeping the super-admins to manage instances via local-logins,
30 and secondly to force usage of AuthenticationTokens instead of re-using same credentials for
31 WEB and VCS authentication.
32 - API: added basic upload API for the storage_api. It's possible to store files using internal
33 API. This is a start for attachments upload in RhodeCode.
34 - API: added store_exception_api for remote exception storage. This is used by a new
35 indexer that will report any problems back into the RhodeCode instance in case of indexing problems.
36 - API: added function to fetch comments for a repository.
37 - Quick search: improve the styling of search input and results.
38 - Pull requests: allowed to select all forks and parent forks of target repository in creation UI.
39 This is a common workflow supported by GitHub etc.
40
41
42 General
43 ^^^^^^^
44
45 - Users/Repositories/Repository groups: expose IDs of those objects in advanced views.
46 Useful for API calls or usage in ishell.
47 - UI: moved repo group select next to the name as it's very relevant to each other.
48 - Pull requests: increase the stability of concurrent pull requests created.
49 - Pull requests: introduced operation state for pull requests to prevent from
50 locks during merge/update operations in concurrent busy environments.
51 - Pull requests: ensure that merge response provide more details about failed operations.
52 - UI / Files: expose downloads options onto files view similar as in summary page.
53 - Repositories: show hooks version and update link in the advanced section of repository page.
54 - Events: trigger 'review_status_change' in all cases when reviewers are changed
55 influencing review status.
56 - Files: display submodules in a sorted way, equal to how Directories are sorted.
57 - API: fetching all pull-requests now sorts the results and exposed a flag to show/hide
58 the merge result state for faster result fetching.
59 - API: merge_pull_request expose detailed merge message in the merge operation
60 next to numeric merge response code.
61 - API: added possibility to specify owner to create_pull_request API.
62 - SSH: Added ability to disable server-side SSH key generation to enforce users
63 generated SSH keys only outside of the server.
64 - Integrations: allow PUT method for WebHook integration.
65 - Dependencies: bumped git to 2.19.2 release.
66 - Dependencies: dropped pygments-markdown-lexer as it's natively supported by pygments now.
67 - Dependencies: bumped pyramid to 1.10.1
68 - Dependencies: bumped pastedeploy to 2.0.1
69 - Dependencies: bumped pastescript to 3.0.0
70 - Dependencies: bumped pathlib2 to 2.3.3
71 - Dependencies: bumped webob to 1.8.4
72 - Dependencies: bumped iso8601 to 0.1.12
73 - Dependencies: bumped more-itertools to 5.0.0
74 - Dependencies: bumped psutil to 5.4.8
75 - Dependencies: bumped pyasn1 to 0.4.5
76 - Dependencies: bumped pygments to 2.3.1
77 - Dependencies: bumped pyramid-debugtoolbar to 4.5.0
78 - Dependencies: bumped subprocess32 to 3.5.3
79 - Dependencies: bumped supervisor to 3.3.5
80 - Dependencies: bumped dogpile.cache to 0.7.1
81 - Dependencies: bumped simplejson to 3.16.0
82 - Dependencies: bumped gevent to 1.4.0
83 - Dependencies: bumped configparser to 3.5.1
84
85
86 Security
87 ^^^^^^^^
88
89 - Fork page: don't expose fork origin link if we don't have permission to access this repository.
90 Additionally don't pre-select such repository in pull request ref selector.
91 - Security: fix possible XSS in the issue tracker URL.
92 - Security: sanitize plaintext renderer with bleach, preventing XSS in rendered html.
93 - Audit logs: added audit logs for API permission calls.
94
95
96 Performance
97 ^^^^^^^^^^^
98
99 - Summary page: don't load repo size when showing expanded information about repository.
100 Size calculation needs to be triggered manually.
101 - Git: use rev-list for fetching last commit data in case of single commit history.
102 In some cases, it is much faster than previously used git log command.
103
104
105 Fixes
106 ^^^^^
107
108 - Installer: fixed 32bit package builds broken in previous releases.
109 - Git: use iterative fetch to prevent errors about too many arguments on
110 synchronizing very large repositories.
111 - Git: pass in the SSL dir that is exposed from wire for remote GIT commands.
112 - LDAP+Groups: improve logging, and fix the case when extracting group name from LDAP
113 returned nothing. We should warn about that, but not FAIL on login.
114 - Default reviewers: fixed submodule support in picking reviewers from annotation for files.
115 - Hooks: handle non-ascii characters in hooks new pull-requests open template.
116 - Diffs: fixed missing limited diff container display on over-size limit diffs.
117 - Diffs: fixed 500 error in case of some very uncommon diffs containing only Unicode characters.
118 - Repositories: handle VCS backend unavailable correctly in advanced settings for the repository.
119 - Remap & rescan: prevent empty/damaged repositories to break the remap operation.
120 - Visual: fixed show revision/commit length settings.
121 - Mercurial submodules: only show submodule in the path that it belongs too.
122 Before even submodules from root node were shown in subdirectories.
123 - UI/Files: fixed icons in file tree search.
124 - WebHook integration: quote URL variables to prevent URL errors with special chars
125 like # in the title.
126 - API: pull-requests, fixed invocation of merge as another user.
127 - VCS: limit fd leaks on subprocessio calls.
128 - VCS: expose SSL certificate path over the wire to the vcsserver, this solves some
129 remote SSL import problems reported.
130
131
132 Upgrade notes
133 ^^^^^^^^^^^^^
134
135 This release brings the new Full-text search capabilities using ElasticSearch 6.
136 If you use Elastic Search backend a backward compatibility mode is enabled and
137 ElasticSearch backend defaults to previously used ElasticSearch 2.
138
139 To use new features a full index rebuild is required, in addition ```--es-version=6``` flag
140 needs to be used with indexer and ```search.es_version = 6``` should be set in rhodecode.ini
141
142 Additionally new mapping format is available for the indexer that has additional capabilities
143 for include/exclude rules. Old format should work as well, but we encourage to
144 generate a new mapping.ini file using rhodecode-index command, and migrate your repositories
145 to the new format.
146
147 Please refer to the :ref:`indexing-ref` documentation for more details.
148
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,6 +1,6 b''
1 1 [bumpversion]
2 current_version = 4.15.2
2 current_version = 4.16.0
3 3 message = release: Bump version {current_version} to {new_version}
4 4
5 5 [bumpversion:file:rhodecode/VERSION]
6 6
@@ -1,33 +1,28 b''
1 1 [DEFAULT]
2 2 done = false
3 3
4 4 [task:bump_version]
5 5 done = true
6 6
7 7 [task:rc_tools_pinned]
8 done = true
9 8
10 9 [task:fixes_on_stable]
11 done = true
12 10
13 11 [task:pip2nix_generated]
14 done = true
15 12
16 13 [task:changelog_updated]
17 done = true
18 14
19 15 [task:generate_api_docs]
20 done = true
16
17 [task:updated_translation]
21 18
22 19 [release]
23 state = prepared
24 version = 4.15.2
25
26 [task:updated_translation]
20 state = in_progress
21 version = 4.16.0
27 22
28 23 [task:generate_js_routes]
29 24
30 25 [task:updated_trial_license]
31 26
32 27 [task:generate_oss_licenses]
33 28
@@ -1,696 +1,694 b''
1 1 This program is free software: you can redistribute it and/or modify
2 2 it under the terms of the GNU Affero General Public License, version 3
3 3 (only), as published by the Free Software Foundation.
4 4
5 5
6 6 This program incorporates work covered by the following copyright and
7 7 permission notice:
8 8
9 9 Copyright (c) 2014-2016 - packaging
10 10 file:
11 11 Copyright (c) 2008-2011 - msgpack-python
12 12 file:licenses/msgpack_license.txt
13 13 Copyright (c) 2009 - tornado
14 14 file:licenses/tornado_license.txt
15 Copyright (c) 2015 - pygments-markdown-lexer
16 file:licenses/pygments_markdown_lexer_license.txt
17 15 Copyright 2006 - diff_match_patch
18 16 file:licenses/diff_match_patch_license.txt
19 17
20 18 All licensed under the Apache License, Version 2.0 (the "License");
21 19 you may not use this file except in compliance with the License.
22 20 You may obtain a copy of the License at
23 21
24 22 http://www.apache.org/licenses/LICENSE-2.0
25 23
26 24 Unless required by applicable law or agreed to in writing, software
27 25 distributed under the License is distributed on an "AS IS" BASIS,
28 26 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
29 27 See the License for the specific language governing permissions and
30 28 imitations under the License.
31 29
32 30
33 31 Below is the full text of GNU Affero General Public License, version 3
34 32
35 33
36 34 GNU AFFERO GENERAL PUBLIC LICENSE
37 35 Version 3, 19 November 2007
38 36
39 37 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
40 38 Everyone is permitted to copy and distribute verbatim copies
41 39 of this license document, but changing it is not allowed.
42 40
43 41 Preamble
44 42
45 43 The GNU Affero General Public License is a free, copyleft license for
46 44 software and other kinds of works, specifically designed to ensure
47 45 cooperation with the community in the case of network server software.
48 46
49 47 The licenses for most software and other practical works are designed
50 48 to take away your freedom to share and change the works. By contrast,
51 49 our General Public Licenses are intended to guarantee your freedom to
52 50 share and change all versions of a program--to make sure it remains free
53 51 software for all its users.
54 52
55 53 When we speak of free software, we are referring to freedom, not
56 54 price. Our General Public Licenses are designed to make sure that you
57 55 have the freedom to distribute copies of free software (and charge for
58 56 them if you wish), that you receive source code or can get it if you
59 57 want it, that you can change the software or use pieces of it in new
60 58 free programs, and that you know you can do these things.
61 59
62 60 Developers that use our General Public Licenses protect your rights
63 61 with two steps: (1) assert copyright on the software, and (2) offer
64 62 you this License which gives you legal permission to copy, distribute
65 63 and/or modify the software.
66 64
67 65 A secondary benefit of defending all users' freedom is that
68 66 improvements made in alternate versions of the program, if they
69 67 receive widespread use, become available for other developers to
70 68 incorporate. Many developers of free software are heartened and
71 69 encouraged by the resulting cooperation. However, in the case of
72 70 software used on network servers, this result may fail to come about.
73 71 The GNU General Public License permits making a modified version and
74 72 letting the public access it on a server without ever releasing its
75 73 source code to the public.
76 74
77 75 The GNU Affero General Public License is designed specifically to
78 76 ensure that, in such cases, the modified source code becomes available
79 77 to the community. It requires the operator of a network server to
80 78 provide the source code of the modified version running there to the
81 79 users of that server. Therefore, public use of a modified version, on
82 80 a publicly accessible server, gives the public access to the source
83 81 code of the modified version.
84 82
85 83 An older license, called the Affero General Public License and
86 84 published by Affero, was designed to accomplish similar goals. This is
87 85 a different license, not a version of the Affero GPL, but Affero has
88 86 released a new version of the Affero GPL which permits relicensing under
89 87 this license.
90 88
91 89 The precise terms and conditions for copying, distribution and
92 90 modification follow.
93 91
94 92 TERMS AND CONDITIONS
95 93
96 94 0. Definitions.
97 95
98 96 "This License" refers to version 3 of the GNU Affero General Public License.
99 97
100 98 "Copyright" also means copyright-like laws that apply to other kinds of
101 99 works, such as semiconductor masks.
102 100
103 101 "The Program" refers to any copyrightable work licensed under this
104 102 License. Each licensee is addressed as "you". "Licensees" and
105 103 "recipients" may be individuals or organizations.
106 104
107 105 To "modify" a work means to copy from or adapt all or part of the work
108 106 in a fashion requiring copyright permission, other than the making of an
109 107 exact copy. The resulting work is called a "modified version" of the
110 108 earlier work or a work "based on" the earlier work.
111 109
112 110 A "covered work" means either the unmodified Program or a work based
113 111 on the Program.
114 112
115 113 To "propagate" a work means to do anything with it that, without
116 114 permission, would make you directly or secondarily liable for
117 115 infringement under applicable copyright law, except executing it on a
118 116 computer or modifying a private copy. Propagation includes copying,
119 117 distribution (with or without modification), making available to the
120 118 public, and in some countries other activities as well.
121 119
122 120 To "convey" a work means any kind of propagation that enables other
123 121 parties to make or receive copies. Mere interaction with a user through
124 122 a computer network, with no transfer of a copy, is not conveying.
125 123
126 124 An interactive user interface displays "Appropriate Legal Notices"
127 125 to the extent that it includes a convenient and prominently visible
128 126 feature that (1) displays an appropriate copyright notice, and (2)
129 127 tells the user that there is no warranty for the work (except to the
130 128 extent that warranties are provided), that licensees may convey the
131 129 work under this License, and how to view a copy of this License. If
132 130 the interface presents a list of user commands or options, such as a
133 131 menu, a prominent item in the list meets this criterion.
134 132
135 133 1. Source Code.
136 134
137 135 The "source code" for a work means the preferred form of the work
138 136 for making modifications to it. "Object code" means any non-source
139 137 form of a work.
140 138
141 139 A "Standard Interface" means an interface that either is an official
142 140 standard defined by a recognized standards body, or, in the case of
143 141 interfaces specified for a particular programming language, one that
144 142 is widely used among developers working in that language.
145 143
146 144 The "System Libraries" of an executable work include anything, other
147 145 than the work as a whole, that (a) is included in the normal form of
148 146 packaging a Major Component, but which is not part of that Major
149 147 Component, and (b) serves only to enable use of the work with that
150 148 Major Component, or to implement a Standard Interface for which an
151 149 implementation is available to the public in source code form. A
152 150 "Major Component", in this context, means a major essential component
153 151 (kernel, window system, and so on) of the specific operating system
154 152 (if any) on which the executable work runs, or a compiler used to
155 153 produce the work, or an object code interpreter used to run it.
156 154
157 155 The "Corresponding Source" for a work in object code form means all
158 156 the source code needed to generate, install, and (for an executable
159 157 work) run the object code and to modify the work, including scripts to
160 158 control those activities. However, it does not include the work's
161 159 System Libraries, or general-purpose tools or generally available free
162 160 programs which are used unmodified in performing those activities but
163 161 which are not part of the work. For example, Corresponding Source
164 162 includes interface definition files associated with source files for
165 163 the work, and the source code for shared libraries and dynamically
166 164 linked subprograms that the work is specifically designed to require,
167 165 such as by intimate data communication or control flow between those
168 166 subprograms and other parts of the work.
169 167
170 168 The Corresponding Source need not include anything that users
171 169 can regenerate automatically from other parts of the Corresponding
172 170 Source.
173 171
174 172 The Corresponding Source for a work in source code form is that
175 173 same work.
176 174
177 175 2. Basic Permissions.
178 176
179 177 All rights granted under this License are granted for the term of
180 178 copyright on the Program, and are irrevocable provided the stated
181 179 conditions are met. This License explicitly affirms your unlimited
182 180 permission to run the unmodified Program. The output from running a
183 181 covered work is covered by this License only if the output, given its
184 182 content, constitutes a covered work. This License acknowledges your
185 183 rights of fair use or other equivalent, as provided by copyright law.
186 184
187 185 You may make, run and propagate covered works that you do not
188 186 convey, without conditions so long as your license otherwise remains
189 187 in force. You may convey covered works to others for the sole purpose
190 188 of having them make modifications exclusively for you, or provide you
191 189 with facilities for running those works, provided that you comply with
192 190 the terms of this License in conveying all material for which you do
193 191 not control copyright. Those thus making or running the covered works
194 192 for you must do so exclusively on your behalf, under your direction
195 193 and control, on terms that prohibit them from making any copies of
196 194 your copyrighted material outside their relationship with you.
197 195
198 196 Conveying under any other circumstances is permitted solely under
199 197 the conditions stated below. Sublicensing is not allowed; section 10
200 198 makes it unnecessary.
201 199
202 200 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
203 201
204 202 No covered work shall be deemed part of an effective technological
205 203 measure under any applicable law fulfilling obligations under article
206 204 11 of the WIPO copyright treaty adopted on 20 December 1996, or
207 205 similar laws prohibiting or restricting circumvention of such
208 206 measures.
209 207
210 208 When you convey a covered work, you waive any legal power to forbid
211 209 circumvention of technological measures to the extent such circumvention
212 210 is effected by exercising rights under this License with respect to
213 211 the covered work, and you disclaim any intention to limit operation or
214 212 modification of the work as a means of enforcing, against the work's
215 213 users, your or third parties' legal rights to forbid circumvention of
216 214 technological measures.
217 215
218 216 4. Conveying Verbatim Copies.
219 217
220 218 You may convey verbatim copies of the Program's source code as you
221 219 receive it, in any medium, provided that you conspicuously and
222 220 appropriately publish on each copy an appropriate copyright notice;
223 221 keep intact all notices stating that this License and any
224 222 non-permissive terms added in accord with section 7 apply to the code;
225 223 keep intact all notices of the absence of any warranty; and give all
226 224 recipients a copy of this License along with the Program.
227 225
228 226 You may charge any price or no price for each copy that you convey,
229 227 and you may offer support or warranty protection for a fee.
230 228
231 229 5. Conveying Modified Source Versions.
232 230
233 231 You may convey a work based on the Program, or the modifications to
234 232 produce it from the Program, in the form of source code under the
235 233 terms of section 4, provided that you also meet all of these conditions:
236 234
237 235 a) The work must carry prominent notices stating that you modified
238 236 it, and giving a relevant date.
239 237
240 238 b) The work must carry prominent notices stating that it is
241 239 released under this License and any conditions added under section
242 240 7. This requirement modifies the requirement in section 4 to
243 241 "keep intact all notices".
244 242
245 243 c) You must license the entire work, as a whole, under this
246 244 License to anyone who comes into possession of a copy. This
247 245 License will therefore apply, along with any applicable section 7
248 246 additional terms, to the whole of the work, and all its parts,
249 247 regardless of how they are packaged. This License gives no
250 248 permission to license the work in any other way, but it does not
251 249 invalidate such permission if you have separately received it.
252 250
253 251 d) If the work has interactive user interfaces, each must display
254 252 Appropriate Legal Notices; however, if the Program has interactive
255 253 interfaces that do not display Appropriate Legal Notices, your
256 254 work need not make them do so.
257 255
258 256 A compilation of a covered work with other separate and independent
259 257 works, which are not by their nature extensions of the covered work,
260 258 and which are not combined with it such as to form a larger program,
261 259 in or on a volume of a storage or distribution medium, is called an
262 260 "aggregate" if the compilation and its resulting copyright are not
263 261 used to limit the access or legal rights of the compilation's users
264 262 beyond what the individual works permit. Inclusion of a covered work
265 263 in an aggregate does not cause this License to apply to the other
266 264 parts of the aggregate.
267 265
268 266 6. Conveying Non-Source Forms.
269 267
270 268 You may convey a covered work in object code form under the terms
271 269 of sections 4 and 5, provided that you also convey the
272 270 machine-readable Corresponding Source under the terms of this License,
273 271 in one of these ways:
274 272
275 273 a) Convey the object code in, or embodied in, a physical product
276 274 (including a physical distribution medium), accompanied by the
277 275 Corresponding Source fixed on a durable physical medium
278 276 customarily used for software interchange.
279 277
280 278 b) Convey the object code in, or embodied in, a physical product
281 279 (including a physical distribution medium), accompanied by a
282 280 written offer, valid for at least three years and valid for as
283 281 long as you offer spare parts or customer support for that product
284 282 model, to give anyone who possesses the object code either (1) a
285 283 copy of the Corresponding Source for all the software in the
286 284 product that is covered by this License, on a durable physical
287 285 medium customarily used for software interchange, for a price no
288 286 more than your reasonable cost of physically performing this
289 287 conveying of source, or (2) access to copy the
290 288 Corresponding Source from a network server at no charge.
291 289
292 290 c) Convey individual copies of the object code with a copy of the
293 291 written offer to provide the Corresponding Source. This
294 292 alternative is allowed only occasionally and noncommercially, and
295 293 only if you received the object code with such an offer, in accord
296 294 with subsection 6b.
297 295
298 296 d) Convey the object code by offering access from a designated
299 297 place (gratis or for a charge), and offer equivalent access to the
300 298 Corresponding Source in the same way through the same place at no
301 299 further charge. You need not require recipients to copy the
302 300 Corresponding Source along with the object code. If the place to
303 301 copy the object code is a network server, the Corresponding Source
304 302 may be on a different server (operated by you or a third party)
305 303 that supports equivalent copying facilities, provided you maintain
306 304 clear directions next to the object code saying where to find the
307 305 Corresponding Source. Regardless of what server hosts the
308 306 Corresponding Source, you remain obligated to ensure that it is
309 307 available for as long as needed to satisfy these requirements.
310 308
311 309 e) Convey the object code using peer-to-peer transmission, provided
312 310 you inform other peers where the object code and Corresponding
313 311 Source of the work are being offered to the general public at no
314 312 charge under subsection 6d.
315 313
316 314 A separable portion of the object code, whose source code is excluded
317 315 from the Corresponding Source as a System Library, need not be
318 316 included in conveying the object code work.
319 317
320 318 A "User Product" is either (1) a "consumer product", which means any
321 319 tangible personal property which is normally used for personal, family,
322 320 or household purposes, or (2) anything designed or sold for incorporation
323 321 into a dwelling. In determining whether a product is a consumer product,
324 322 doubtful cases shall be resolved in favor of coverage. For a particular
325 323 product received by a particular user, "normally used" refers to a
326 324 typical or common use of that class of product, regardless of the status
327 325 of the particular user or of the way in which the particular user
328 326 actually uses, or expects or is expected to use, the product. A product
329 327 is a consumer product regardless of whether the product has substantial
330 328 commercial, industrial or non-consumer uses, unless such uses represent
331 329 the only significant mode of use of the product.
332 330
333 331 "Installation Information" for a User Product means any methods,
334 332 procedures, authorization keys, or other information required to install
335 333 and execute modified versions of a covered work in that User Product from
336 334 a modified version of its Corresponding Source. The information must
337 335 suffice to ensure that the continued functioning of the modified object
338 336 code is in no case prevented or interfered with solely because
339 337 modification has been made.
340 338
341 339 If you convey an object code work under this section in, or with, or
342 340 specifically for use in, a User Product, and the conveying occurs as
343 341 part of a transaction in which the right of possession and use of the
344 342 User Product is transferred to the recipient in perpetuity or for a
345 343 fixed term (regardless of how the transaction is characterized), the
346 344 Corresponding Source conveyed under this section must be accompanied
347 345 by the Installation Information. But this requirement does not apply
348 346 if neither you nor any third party retains the ability to install
349 347 modified object code on the User Product (for example, the work has
350 348 been installed in ROM).
351 349
352 350 The requirement to provide Installation Information does not include a
353 351 requirement to continue to provide support service, warranty, or updates
354 352 for a work that has been modified or installed by the recipient, or for
355 353 the User Product in which it has been modified or installed. Access to a
356 354 network may be denied when the modification itself materially and
357 355 adversely affects the operation of the network or violates the rules and
358 356 protocols for communication across the network.
359 357
360 358 Corresponding Source conveyed, and Installation Information provided,
361 359 in accord with this section must be in a format that is publicly
362 360 documented (and with an implementation available to the public in
363 361 source code form), and must require no special password or key for
364 362 unpacking, reading or copying.
365 363
366 364 7. Additional Terms.
367 365
368 366 "Additional permissions" are terms that supplement the terms of this
369 367 License by making exceptions from one or more of its conditions.
370 368 Additional permissions that are applicable to the entire Program shall
371 369 be treated as though they were included in this License, to the extent
372 370 that they are valid under applicable law. If additional permissions
373 371 apply only to part of the Program, that part may be used separately
374 372 under those permissions, but the entire Program remains governed by
375 373 this License without regard to the additional permissions.
376 374
377 375 When you convey a copy of a covered work, you may at your option
378 376 remove any additional permissions from that copy, or from any part of
379 377 it. (Additional permissions may be written to require their own
380 378 removal in certain cases when you modify the work.) You may place
381 379 additional permissions on material, added by you to a covered work,
382 380 for which you have or can give appropriate copyright permission.
383 381
384 382 Notwithstanding any other provision of this License, for material you
385 383 add to a covered work, you may (if authorized by the copyright holders of
386 384 that material) supplement the terms of this License with terms:
387 385
388 386 a) Disclaiming warranty or limiting liability differently from the
389 387 terms of sections 15 and 16 of this License; or
390 388
391 389 b) Requiring preservation of specified reasonable legal notices or
392 390 author attributions in that material or in the Appropriate Legal
393 391 Notices displayed by works containing it; or
394 392
395 393 c) Prohibiting misrepresentation of the origin of that material, or
396 394 requiring that modified versions of such material be marked in
397 395 reasonable ways as different from the original version; or
398 396
399 397 d) Limiting the use for publicity purposes of names of licensors or
400 398 authors of the material; or
401 399
402 400 e) Declining to grant rights under trademark law for use of some
403 401 trade names, trademarks, or service marks; or
404 402
405 403 f) Requiring indemnification of licensors and authors of that
406 404 material by anyone who conveys the material (or modified versions of
407 405 it) with contractual assumptions of liability to the recipient, for
408 406 any liability that these contractual assumptions directly impose on
409 407 those licensors and authors.
410 408
411 409 All other non-permissive additional terms are considered "further
412 410 restrictions" within the meaning of section 10. If the Program as you
413 411 received it, or any part of it, contains a notice stating that it is
414 412 governed by this License along with a term that is a further
415 413 restriction, you may remove that term. If a license document contains
416 414 a further restriction but permits relicensing or conveying under this
417 415 License, you may add to a covered work material governed by the terms
418 416 of that license document, provided that the further restriction does
419 417 not survive such relicensing or conveying.
420 418
421 419 If you add terms to a covered work in accord with this section, you
422 420 must place, in the relevant source files, a statement of the
423 421 additional terms that apply to those files, or a notice indicating
424 422 where to find the applicable terms.
425 423
426 424 Additional terms, permissive or non-permissive, may be stated in the
427 425 form of a separately written license, or stated as exceptions;
428 426 the above requirements apply either way.
429 427
430 428 8. Termination.
431 429
432 430 You may not propagate or modify a covered work except as expressly
433 431 provided under this License. Any attempt otherwise to propagate or
434 432 modify it is void, and will automatically terminate your rights under
435 433 this License (including any patent licenses granted under the third
436 434 paragraph of section 11).
437 435
438 436 However, if you cease all violation of this License, then your
439 437 license from a particular copyright holder is reinstated (a)
440 438 provisionally, unless and until the copyright holder explicitly and
441 439 finally terminates your license, and (b) permanently, if the copyright
442 440 holder fails to notify you of the violation by some reasonable means
443 441 prior to 60 days after the cessation.
444 442
445 443 Moreover, your license from a particular copyright holder is
446 444 reinstated permanently if the copyright holder notifies you of the
447 445 violation by some reasonable means, this is the first time you have
448 446 received notice of violation of this License (for any work) from that
449 447 copyright holder, and you cure the violation prior to 30 days after
450 448 your receipt of the notice.
451 449
452 450 Termination of your rights under this section does not terminate the
453 451 licenses of parties who have received copies or rights from you under
454 452 this License. If your rights have been terminated and not permanently
455 453 reinstated, you do not qualify to receive new licenses for the same
456 454 material under section 10.
457 455
458 456 9. Acceptance Not Required for Having Copies.
459 457
460 458 You are not required to accept this License in order to receive or
461 459 run a copy of the Program. Ancillary propagation of a covered work
462 460 occurring solely as a consequence of using peer-to-peer transmission
463 461 to receive a copy likewise does not require acceptance. However,
464 462 nothing other than this License grants you permission to propagate or
465 463 modify any covered work. These actions infringe copyright if you do
466 464 not accept this License. Therefore, by modifying or propagating a
467 465 covered work, you indicate your acceptance of this License to do so.
468 466
469 467 10. Automatic Licensing of Downstream Recipients.
470 468
471 469 Each time you convey a covered work, the recipient automatically
472 470 receives a license from the original licensors, to run, modify and
473 471 propagate that work, subject to this License. You are not responsible
474 472 for enforcing compliance by third parties with this License.
475 473
476 474 An "entity transaction" is a transaction transferring control of an
477 475 organization, or substantially all assets of one, or subdividing an
478 476 organization, or merging organizations. If propagation of a covered
479 477 work results from an entity transaction, each party to that
480 478 transaction who receives a copy of the work also receives whatever
481 479 licenses to the work the party's predecessor in interest had or could
482 480 give under the previous paragraph, plus a right to possession of the
483 481 Corresponding Source of the work from the predecessor in interest, if
484 482 the predecessor has it or can get it with reasonable efforts.
485 483
486 484 You may not impose any further restrictions on the exercise of the
487 485 rights granted or affirmed under this License. For example, you may
488 486 not impose a license fee, royalty, or other charge for exercise of
489 487 rights granted under this License, and you may not initiate litigation
490 488 (including a cross-claim or counterclaim in a lawsuit) alleging that
491 489 any patent claim is infringed by making, using, selling, offering for
492 490 sale, or importing the Program or any portion of it.
493 491
494 492 11. Patents.
495 493
496 494 A "contributor" is a copyright holder who authorizes use under this
497 495 License of the Program or a work on which the Program is based. The
498 496 work thus licensed is called the contributor's "contributor version".
499 497
500 498 A contributor's "essential patent claims" are all patent claims
501 499 owned or controlled by the contributor, whether already acquired or
502 500 hereafter acquired, that would be infringed by some manner, permitted
503 501 by this License, of making, using, or selling its contributor version,
504 502 but do not include claims that would be infringed only as a
505 503 consequence of further modification of the contributor version. For
506 504 purposes of this definition, "control" includes the right to grant
507 505 patent sublicenses in a manner consistent with the requirements of
508 506 this License.
509 507
510 508 Each contributor grants you a non-exclusive, worldwide, royalty-free
511 509 patent license under the contributor's essential patent claims, to
512 510 make, use, sell, offer for sale, import and otherwise run, modify and
513 511 propagate the contents of its contributor version.
514 512
515 513 In the following three paragraphs, a "patent license" is any express
516 514 agreement or commitment, however denominated, not to enforce a patent
517 515 (such as an express permission to practice a patent or covenant not to
518 516 sue for patent infringement). To "grant" such a patent license to a
519 517 party means to make such an agreement or commitment not to enforce a
520 518 patent against the party.
521 519
522 520 If you convey a covered work, knowingly relying on a patent license,
523 521 and the Corresponding Source of the work is not available for anyone
524 522 to copy, free of charge and under the terms of this License, through a
525 523 publicly available network server or other readily accessible means,
526 524 then you must either (1) cause the Corresponding Source to be so
527 525 available, or (2) arrange to deprive yourself of the benefit of the
528 526 patent license for this particular work, or (3) arrange, in a manner
529 527 consistent with the requirements of this License, to extend the patent
530 528 license to downstream recipients. "Knowingly relying" means you have
531 529 actual knowledge that, but for the patent license, your conveying the
532 530 covered work in a country, or your recipient's use of the covered work
533 531 in a country, would infringe one or more identifiable patents in that
534 532 country that you have reason to believe are valid.
535 533
536 534 If, pursuant to or in connection with a single transaction or
537 535 arrangement, you convey, or propagate by procuring conveyance of, a
538 536 covered work, and grant a patent license to some of the parties
539 537 receiving the covered work authorizing them to use, propagate, modify
540 538 or convey a specific copy of the covered work, then the patent license
541 539 you grant is automatically extended to all recipients of the covered
542 540 work and works based on it.
543 541
544 542 A patent license is "discriminatory" if it does not include within
545 543 the scope of its coverage, prohibits the exercise of, or is
546 544 conditioned on the non-exercise of one or more of the rights that are
547 545 specifically granted under this License. You may not convey a covered
548 546 work if you are a party to an arrangement with a third party that is
549 547 in the business of distributing software, under which you make payment
550 548 to the third party based on the extent of your activity of conveying
551 549 the work, and under which the third party grants, to any of the
552 550 parties who would receive the covered work from you, a discriminatory
553 551 patent license (a) in connection with copies of the covered work
554 552 conveyed by you (or copies made from those copies), or (b) primarily
555 553 for and in connection with specific products or compilations that
556 554 contain the covered work, unless you entered into that arrangement,
557 555 or that patent license was granted, prior to 28 March 2007.
558 556
559 557 Nothing in this License shall be construed as excluding or limiting
560 558 any implied license or other defenses to infringement that may
561 559 otherwise be available to you under applicable patent law.
562 560
563 561 12. No Surrender of Others' Freedom.
564 562
565 563 If conditions are imposed on you (whether by court order, agreement or
566 564 otherwise) that contradict the conditions of this License, they do not
567 565 excuse you from the conditions of this License. If you cannot convey a
568 566 covered work so as to satisfy simultaneously your obligations under this
569 567 License and any other pertinent obligations, then as a consequence you may
570 568 not convey it at all. For example, if you agree to terms that obligate you
571 569 to collect a royalty for further conveying from those to whom you convey
572 570 the Program, the only way you could satisfy both those terms and this
573 571 License would be to refrain entirely from conveying the Program.
574 572
575 573 13. Remote Network Interaction; Use with the GNU General Public License.
576 574
577 575 Notwithstanding any other provision of this License, if you modify the
578 576 Program, your modified version must prominently offer all users
579 577 interacting with it remotely through a computer network (if your version
580 578 supports such interaction) an opportunity to receive the Corresponding
581 579 Source of your version by providing access to the Corresponding Source
582 580 from a network server at no charge, through some standard or customary
583 581 means of facilitating copying of software. This Corresponding Source
584 582 shall include the Corresponding Source for any work covered by version 3
585 583 of the GNU General Public License that is incorporated pursuant to the
586 584 following paragraph.
587 585
588 586 Notwithstanding any other provision of this License, you have
589 587 permission to link or combine any covered work with a work licensed
590 588 under version 3 of the GNU General Public License into a single
591 589 combined work, and to convey the resulting work. The terms of this
592 590 License will continue to apply to the part which is the covered work,
593 591 but the work with which it is combined will remain governed by version
594 592 3 of the GNU General Public License.
595 593
596 594 14. Revised Versions of this License.
597 595
598 596 The Free Software Foundation may publish revised and/or new versions of
599 597 the GNU Affero General Public License from time to time. Such new versions
600 598 will be similar in spirit to the present version, but may differ in detail to
601 599 address new problems or concerns.
602 600
603 601 Each version is given a distinguishing version number. If the
604 602 Program specifies that a certain numbered version of the GNU Affero General
605 603 Public License "or any later version" applies to it, you have the
606 604 option of following the terms and conditions either of that numbered
607 605 version or of any later version published by the Free Software
608 606 Foundation. If the Program does not specify a version number of the
609 607 GNU Affero General Public License, you may choose any version ever published
610 608 by the Free Software Foundation.
611 609
612 610 If the Program specifies that a proxy can decide which future
613 611 versions of the GNU Affero General Public License can be used, that proxy's
614 612 public statement of acceptance of a version permanently authorizes you
615 613 to choose that version for the Program.
616 614
617 615 Later license versions may give you additional or different
618 616 permissions. However, no additional obligations are imposed on any
619 617 author or copyright holder as a result of your choosing to follow a
620 618 later version.
621 619
622 620 15. Disclaimer of Warranty.
623 621
624 622 THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
625 623 APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
626 624 HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
627 625 OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
628 626 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
629 627 PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
630 628 IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
631 629 ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
632 630
633 631 16. Limitation of Liability.
634 632
635 633 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
636 634 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
637 635 THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
638 636 GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
639 637 USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
640 638 DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
641 639 PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
642 640 EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
643 641 SUCH DAMAGES.
644 642
645 643 17. Interpretation of Sections 15 and 16.
646 644
647 645 If the disclaimer of warranty and limitation of liability provided
648 646 above cannot be given local legal effect according to their terms,
649 647 reviewing courts shall apply local law that most closely approximates
650 648 an absolute waiver of all civil liability in connection with the
651 649 Program, unless a warranty or assumption of liability accompanies a
652 650 copy of the Program in return for a fee.
653 651
654 652 END OF TERMS AND CONDITIONS
655 653
656 654 How to Apply These Terms to Your New Programs
657 655
658 656 If you develop a new program, and you want it to be of the greatest
659 657 possible use to the public, the best way to achieve this is to make it
660 658 free software which everyone can redistribute and change under these terms.
661 659
662 660 To do so, attach the following notices to the program. It is safest
663 661 to attach them to the start of each source file to most effectively
664 662 state the exclusion of warranty; and each file should have at least
665 663 the "copyright" line and a pointer to where the full notice is found.
666 664
667 665 <one line to give the program's name and a brief idea of what it does.>
668 666 Copyright (C) <year> <name of author>
669 667
670 668 This program is free software: you can redistribute it and/or modify
671 669 it under the terms of the GNU Affero General Public License as published by
672 670 the Free Software Foundation, either version 3 of the License, or
673 671 (at your option) any later version.
674 672
675 673 This program is distributed in the hope that it will be useful,
676 674 but WITHOUT ANY WARRANTY; without even the implied warranty of
677 675 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
678 676 GNU Affero General Public License for more details.
679 677
680 678 You should have received a copy of the GNU Affero General Public License
681 679 along with this program. If not, see <http://www.gnu.org/licenses/>.
682 680
683 681 Also add information on how to contact you by electronic and paper mail.
684 682
685 683 If your software can interact with users remotely through a computer
686 684 network, you should also make sure that it provides a way for users to
687 685 get its source. For example, if your program is a web application, its
688 686 interface could display a "Source" link that leads users to an archive
689 687 of the code. There are many ways you could offer source, and different
690 688 solutions will be better for different programs; see section 13 for the
691 689 specific requirements.
692 690
693 691 You should also get your employer (if you work as a programmer) or school,
694 692 if any, to sign a "copyright disclaimer" for the program, if necessary.
695 693 For more information on this, and how to apply and follow the GNU AGPL, see
696 694 <http://www.gnu.org/licenses/>.
@@ -1,53 +1,55 b''
1 1
2 .PHONY: clean docs docs-clean docs-cleanup test test-clean test-only test-only-postgres test-only-mysql web-build
2 .PHONY: clean docs docs-clean docs-cleanup test test-clean test-only test-only-postgres test-only-mysql web-build generate-pkgs
3 3
4 4 NODE_PATH=./node_modules
5 5 WEBPACK=./node_binaries/webpack
6 6 GRUNT=./node_binaries/grunt
7 7
8 8
9 9 clean:
10 10 make test-clean
11 find . -type f \( -iname '*.c' -o -iname '*.pyc' -o -iname '*.so' \) -exec rm '{}' ';'
11 find . -type f \( -iname '*.c' -o -iname '*.pyc' -o -iname '*.so' -o -iname '*.orig' \) -exec rm '{}' ';'
12 12
13 13 test:
14 14 make test-clean
15 15 make test-only
16 16
17 17 test-clean:
18 18 rm -rf coverage.xml htmlcov junit.xml pylint.log result
19 19 find . -type d -name "__pycache__" -prune -exec rm -rf '{}' ';'
20 20
21 21 test-only:
22 22 PYTHONHASHSEED=random \
23 23 py.test -x -vv -r xw -p no:sugar --cov=rhodecode \
24 24 --cov-report=term-missing --cov-report=html \
25 25 rhodecode
26 26
27 27 test-only-mysql:
28 28 PYTHONHASHSEED=random \
29 29 py.test -x -vv -r xw -p no:sugar --cov=rhodecode \
30 30 --cov-report=term-missing --cov-report=html \
31 31 --ini-config-override='{"app:main": {"sqlalchemy.db1.url": "mysql://root:qweqwe@localhost/rhodecode_test"}}' \
32 32 rhodecode
33 33
34 34 test-only-postgres:
35 35 PYTHONHASHSEED=random \
36 36 py.test -x -vv -r xw -p no:sugar --cov=rhodecode \
37 37 --cov-report=term-missing --cov-report=html \
38 38 --ini-config-override='{"app:main": {"sqlalchemy.db1.url": "postgresql://postgres:qweqwe@localhost/rhodecode_test"}}' \
39 39 rhodecode
40 40
41 41
42 42 docs:
43 43 (cd docs; nix-build default.nix -o result; make clean html)
44 44
45 45 docs-clean:
46 46 (cd docs; make clean)
47 47
48 48 docs-cleanup:
49 49 (cd docs; make cleanup)
50 50
51 51 web-build:
52 52 NODE_PATH=$(NODE_PATH) $(GRUNT)
53 53
54 generate-pkgs:
55 nix-shell pkgs/shell-generate.nix --command "pip2nix generate --licenses"
@@ -1,718 +1,732 b''
1 1
2 2
3 3 ################################################################################
4 4 ## RHODECODE COMMUNITY EDITION CONFIGURATION ##
5 5 ################################################################################
6 6
7 7 [DEFAULT]
8 8 ## Debug flag sets all loggers to debug, and enables request tracking
9 9 debug = true
10 10
11 11 ################################################################################
12 12 ## EMAIL CONFIGURATION ##
13 13 ## Uncomment and replace with the email address which should receive ##
14 14 ## any error reports after an application crash ##
15 15 ## Additionally these settings will be used by the RhodeCode mailing system ##
16 16 ################################################################################
17 17
18 18 ## prefix all emails subjects with given prefix, helps filtering out emails
19 19 #email_prefix = [RhodeCode]
20 20
21 21 ## email FROM address all mails will be sent
22 22 #app_email_from = rhodecode-noreply@localhost
23 23
24 24 #smtp_server = mail.server.com
25 25 #smtp_username =
26 26 #smtp_password =
27 27 #smtp_port =
28 28 #smtp_use_tls = false
29 29 #smtp_use_ssl = true
30 30
31 31 [server:main]
32 32 ## COMMON ##
33 33 host = 127.0.0.1
34 34 port = 5000
35 35
36 36 ###########################################################
37 37 ## WAITRESS WSGI SERVER - Recommended for Development ####
38 38 ###########################################################
39 39
40 40 use = egg:waitress#main
41 41 ## number of worker threads
42 42 threads = 5
43 43 ## MAX BODY SIZE 100GB
44 44 max_request_body_size = 107374182400
45 45 ## Use poll instead of select, fixes file descriptors limits problems.
46 46 ## May not work on old windows systems.
47 47 asyncore_use_poll = true
48 48
49 49
50 50 ##########################
51 51 ## GUNICORN WSGI SERVER ##
52 52 ##########################
53 53 ## run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
54 54
55 55 #use = egg:gunicorn#main
56 ## Sets the number of process workers. More workers means more concurent connections
56 ## Sets the number of process workers. More workers means more concurrent connections
57 57 ## RhodeCode can handle at the same time. Each additional worker also it increases
58 58 ## memory usage as each has it's own set of caches.
59 59 ## Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
60 60 ## than 8-10 unless for really big deployments .e.g 700-1000 users.
61 61 ## `instance_id = *` must be set in the [app:main] section below (which is the default)
62 62 ## when using more than 1 worker.
63 63 #workers = 2
64 64 ## process name visible in process list
65 65 #proc_name = rhodecode
66 66 ## type of worker class, one of sync, gevent
67 67 ## recommended for bigger setup is using of of other than sync one
68 68 #worker_class = gevent
69 69 ## The maximum number of simultaneous clients. Valid only for Gevent
70 70 #worker_connections = 10
71 71 ## max number of requests that worker will handle before being gracefully
72 72 ## restarted, could prevent memory leaks
73 73 #max_requests = 1000
74 74 #max_requests_jitter = 30
75 75 ## amount of time a worker can spend with handling a request before it
76 76 ## gets killed and restarted. Set to 6hrs
77 77 #timeout = 21600
78 78
79 79
80 80 ## prefix middleware for RhodeCode.
81 81 ## recommended when using proxy setup.
82 82 ## allows to set RhodeCode under a prefix in server.
83 83 ## eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
84 84 ## And set your prefix like: `prefix = /custom_prefix`
85 85 ## be sure to also set beaker.session.cookie_path = /custom_prefix if you need
86 86 ## to make your cookies only work on prefix url
87 87 [filter:proxy-prefix]
88 88 use = egg:PasteDeploy#prefix
89 89 prefix = /
90 90
91 91 [app:main]
92 92 ## The %(here)s variable will be replaced with the absolute path of parent directory
93 93 ## of this file
94 94 ## In addition ENVIRONMENT variables usage is possible, e.g
95 95 ## sqlalchemy.db1.url = {ENV_RC_DB_URL}
96 96
97 97 use = egg:rhodecode-enterprise-ce
98 98
99 99 ## enable proxy prefix middleware, defined above
100 100 #filter-with = proxy-prefix
101 101
102 102 # During development the we want to have the debug toolbar enabled
103 103 pyramid.includes =
104 104 pyramid_debugtoolbar
105 105 rhodecode.lib.middleware.request_wrapper
106 106
107 107 pyramid.reload_templates = true
108 108
109 109 debugtoolbar.hosts = 0.0.0.0/0
110 110 debugtoolbar.exclude_prefixes =
111 111 /css
112 112 /fonts
113 113 /images
114 114 /js
115 115
116 116 ## RHODECODE PLUGINS ##
117 117 rhodecode.includes =
118 118 rhodecode.api
119 119
120 120
121 121 # api prefix url
122 122 rhodecode.api.url = /_admin/api
123 123
124 124
125 125 ## END RHODECODE PLUGINS ##
126 126
127 127 ## encryption key used to encrypt social plugin tokens,
128 128 ## remote_urls with credentials etc, if not set it defaults to
129 129 ## `beaker.session.secret`
130 130 #rhodecode.encrypted_values.secret =
131 131
132 132 ## decryption strict mode (enabled by default). It controls if decryption raises
133 133 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
134 134 #rhodecode.encrypted_values.strict = false
135 135
136 ## return gzipped responses from Rhodecode (static files/application)
136 ## return gzipped responses from RhodeCode (static files/application)
137 137 gzip_responses = false
138 138
139 ## autogenerate javascript routes file on startup
139 ## auto-generate javascript routes file on startup
140 140 generate_js_files = false
141 141
142 142 ## System global default language.
143 143 ## All available languages: en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
144 144 lang = en
145 145
146 146 ## Perform a full repository scan and import on each server start.
147 147 ## Settings this to true could lead to very long startup time.
148 148 startup.import_repos = false
149 149
150 150 ## Uncomment and set this path to use archive download cache.
151 151 ## Once enabled, generated archives will be cached at this location
152 152 ## and served from the cache during subsequent requests for the same archive of
153 153 ## the repository.
154 154 #archive_cache_dir = /tmp/tarballcache
155 155
156 ## URL at which the application is running. This is used for bootstraping
156 ## URL at which the application is running. This is used for Bootstrapping
157 157 ## requests in context when no web request is available. Used in ishell, or
158 158 ## SSH calls. Set this for events to receive proper url for SSH calls.
159 159 app.base_url = http://rhodecode.local
160 160
161 161 ## Unique application ID. Should be a random unique string for security.
162 162 app_instance_uuid = rc-production
163 163
164 164 ## Cut off limit for large diffs (size in bytes). If overall diff size on
165 165 ## commit, or pull request exceeds this limit this diff will be displayed
166 166 ## partially. E.g 512000 == 512Kb
167 167 cut_off_limit_diff = 512000
168 168
169 169 ## Cut off limit for large files inside diffs (size in bytes). Each individual
170 170 ## file inside diff which exceeds this limit will be displayed partially.
171 171 ## E.g 128000 == 128Kb
172 172 cut_off_limit_file = 128000
173 173
174 174 ## use cached version of vcs repositories everywhere. Recommended to be `true`
175 175 vcs_full_cache = true
176 176
177 177 ## Force https in RhodeCode, fixes https redirects, assumes it's always https.
178 178 ## Normally this is controlled by proper http flags sent from http server
179 179 force_https = false
180 180
181 181 ## use Strict-Transport-Security headers
182 182 use_htsts = false
183 183
184 184 ## git rev filter option, --all is the default filter, if you need to
185 185 ## hide all refs in changelog switch this to --branches --tags
186 186 git_rev_filter = --branches --tags
187 187
188 188 # Set to true if your repos are exposed using the dumb protocol
189 189 git_update_server_info = false
190 190
191 191 ## RSS/ATOM feed options
192 192 rss_cut_off_limit = 256000
193 193 rss_items_per_page = 10
194 194 rss_include_diff = false
195 195
196 196 ## gist URL alias, used to create nicer urls for gist. This should be an
197 197 ## url that does rewrites to _admin/gists/{gistid}.
198 198 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
199 199 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
200 200 gist_alias_url =
201 201
202 202 ## List of views (using glob pattern syntax) that AUTH TOKENS could be
203 203 ## used for access.
204 204 ## Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
205 205 ## came from the the logged in user who own this authentication token.
206 ## Additionally @TOKEN syntaxt can be used to bound the view to specific
206 ## Additionally @TOKEN syntax can be used to bound the view to specific
207 207 ## authentication token. Such view would be only accessible when used together
208 208 ## with this authentication token
209 209 ##
210 210 ## list of all views can be found under `/_admin/permissions/auth_token_access`
211 211 ## The list should be "," separated and on a single line.
212 212 ##
213 213 ## Most common views to enable:
214 214 # RepoCommitsView:repo_commit_download
215 215 # RepoCommitsView:repo_commit_patch
216 216 # RepoCommitsView:repo_commit_raw
217 217 # RepoCommitsView:repo_commit_raw@TOKEN
218 218 # RepoFilesView:repo_files_diff
219 219 # RepoFilesView:repo_archivefile
220 220 # RepoFilesView:repo_file_raw
221 221 # GistView:*
222 222 api_access_controllers_whitelist =
223 223
224 224 ## Default encoding used to convert from and to unicode
225 225 ## can be also a comma separated list of encoding in case of mixed encodings
226 226 default_encoding = UTF-8
227 227
228 228 ## instance-id prefix
229 229 ## a prefix key for this instance used for cache invalidation when running
230 ## multiple instances of rhodecode, make sure it's globally unique for
231 ## all running rhodecode instances. Leave empty if you don't use it
230 ## multiple instances of RhodeCode, make sure it's globally unique for
231 ## all running RhodeCode instances. Leave empty if you don't use it
232 232 instance_id =
233 233
234 234 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
235 235 ## of an authentication plugin also if it is disabled by it's settings.
236 236 ## This could be useful if you are unable to log in to the system due to broken
237 ## authentication settings. Then you can enable e.g. the internal rhodecode auth
237 ## authentication settings. Then you can enable e.g. the internal RhodeCode auth
238 238 ## module to log in again and fix the settings.
239 239 ##
240 240 ## Available builtin plugin IDs (hash is part of the ID):
241 241 ## egg:rhodecode-enterprise-ce#rhodecode
242 242 ## egg:rhodecode-enterprise-ce#pam
243 243 ## egg:rhodecode-enterprise-ce#ldap
244 244 ## egg:rhodecode-enterprise-ce#jasig_cas
245 245 ## egg:rhodecode-enterprise-ce#headers
246 246 ## egg:rhodecode-enterprise-ce#crowd
247 247 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
248 248
249 249 ## alternative return HTTP header for failed authentication. Default HTTP
250 250 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
251 251 ## handling that causing a series of failed authentication calls.
252 252 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
253 ## This will be served instead of default 401 on bad authnetication
253 ## This will be served instead of default 401 on bad authentication
254 254 auth_ret_code =
255 255
256 256 ## use special detection method when serving auth_ret_code, instead of serving
257 257 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
258 258 ## and then serve auth_ret_code to clients
259 259 auth_ret_code_detection = false
260 260
261 261 ## locking return code. When repository is locked return this HTTP code. 2XX
262 262 ## codes don't break the transactions while 4XX codes do
263 263 lock_ret_code = 423
264 264
265 265 ## allows to change the repository location in settings page
266 266 allow_repo_location_change = true
267 267
268 268 ## allows to setup custom hooks in settings page
269 269 allow_custom_hooks_settings = true
270 270
271 271 ## Generated license token required for EE edition license.
272 272 ## New generated token value can be found in Admin > settings > license page.
273 273 license_token =
274 274
275 275 ## supervisor connection uri, for managing supervisor and logs.
276 276 supervisor.uri =
277 277 ## supervisord group name/id we only want this RC instance to handle
278 278 supervisor.group_id = dev
279 279
280 280 ## Display extended labs settings
281 281 labs_settings_active = true
282 282
283 283 ## Custom exception store path, defaults to TMPDIR
284 284 ## This is used to store exception from RhodeCode in shared directory
285 285 #exception_tracker.store_path =
286 286
287 ## File store configuration. This is used to store and serve uploaded files
288 file_store.enabled = true
289 ## Storage backend, available options are: local
290 file_store.backend = local
291 ## path to store the uploaded binaries
292 file_store.storage_path = %(here)s/data/file_store
293
287 294
288 295 ####################################
289 296 ### CELERY CONFIG ####
290 297 ####################################
291 298 ## run: /path/to/celery worker \
292 299 ## -E --beat --app rhodecode.lib.celerylib.loader \
293 300 ## --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler \
294 301 ## --loglevel DEBUG --ini /path/to/rhodecode.ini
295 302
296 303 use_celery = false
297 304
298 305 ## connection url to the message broker (default rabbitmq)
299 306 celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
300 307
301 308 ## maximum tasks to execute before worker restart
302 309 celery.max_tasks_per_child = 100
303 310
304 311 ## tasks will never be sent to the queue, but executed locally instead.
305 312 celery.task_always_eager = false
306 313
307 314 #####################################
308 315 ### DOGPILE CACHE ####
309 316 #####################################
310 317 ## Default cache dir for caches. Putting this into a ramdisk
311 318 ## can boost performance, eg. /tmpfs/data_ramdisk, however this directory might require
312 319 ## large amount of space
313 320 cache_dir = %(here)s/data
314 321
315 322 ## `cache_perms` cache settings for permission tree, auth TTL.
316 323 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
317 324 rc_cache.cache_perms.expiration_time = 300
318 325
319 326 ## alternative `cache_perms` redis backend with distributed lock
320 327 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
321 328 #rc_cache.cache_perms.expiration_time = 300
322 329 ## redis_expiration_time needs to be greater then expiration_time
323 330 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
324 331 #rc_cache.cache_perms.arguments.socket_timeout = 30
325 332 #rc_cache.cache_perms.arguments.host = localhost
326 333 #rc_cache.cache_perms.arguments.port = 6379
327 334 #rc_cache.cache_perms.arguments.db = 0
335 ## more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
328 336 #rc_cache.cache_perms.arguments.distributed_lock = true
329 337
330 338 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
331 339 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
332 340 rc_cache.cache_repo.expiration_time = 2592000
333 341
334 342 ## alternative `cache_repo` redis backend with distributed lock
335 343 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
336 344 #rc_cache.cache_repo.expiration_time = 2592000
337 345 ## redis_expiration_time needs to be greater then expiration_time
338 346 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
339 347 #rc_cache.cache_repo.arguments.socket_timeout = 30
340 348 #rc_cache.cache_repo.arguments.host = localhost
341 349 #rc_cache.cache_repo.arguments.port = 6379
342 350 #rc_cache.cache_repo.arguments.db = 1
351 ## more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
343 352 #rc_cache.cache_repo.arguments.distributed_lock = true
344 353
345 354 ## cache settings for SQL queries, this needs to use memory type backend
346 355 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
347 356 rc_cache.sql_cache_short.expiration_time = 30
348 357
349 358 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
350 359 ## type backend as the objects kept are not pickle serializable
351 360 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
352 361 ## by default we use 96H, this is using invalidation on push anyway
353 362 rc_cache.cache_repo_longterm.expiration_time = 345600
354 363 ## max items in LRU cache, reduce this number to save memory, and expire last used
355 364 ## cached objects
356 365 rc_cache.cache_repo_longterm.max_size = 10000
357 366
358 367
359 368 ####################################
360 369 ### BEAKER SESSION ####
361 370 ####################################
362 371
363 372 ## .session.type is type of storage options for the session, current allowed
364 373 ## types are file, ext:memcached, ext:redis, ext:database, and memory (default).
365 374 beaker.session.type = file
366 375 beaker.session.data_dir = %(here)s/data/sessions
367 376
368 377 ## db based session, fast, and allows easy management over logged in users
369 378 #beaker.session.type = ext:database
370 379 #beaker.session.table_name = db_session
371 380 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
372 381 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
373 382 #beaker.session.sa.pool_recycle = 3600
374 383 #beaker.session.sa.echo = false
375 384
376 385 beaker.session.key = rhodecode
377 386 beaker.session.secret = develop-rc-uytcxaz
378 387 beaker.session.lock_dir = %(here)s/data/sessions/lock
379 388
380 389 ## Secure encrypted cookie. Requires AES and AES python libraries
381 390 ## you must disable beaker.session.secret to use this
382 391 #beaker.session.encrypt_key = key_for_encryption
383 392 #beaker.session.validate_key = validation_key
384 393
385 394 ## sets session as invalid(also logging out user) if it haven not been
386 395 ## accessed for given amount of time in seconds
387 396 beaker.session.timeout = 2592000
388 397 beaker.session.httponly = true
389 398 ## Path to use for the cookie. Set to prefix if you use prefix middleware
390 399 #beaker.session.cookie_path = /custom_prefix
391 400
392 401 ## uncomment for https secure cookie
393 402 beaker.session.secure = false
394 403
395 404 ## auto save the session to not to use .save()
396 405 beaker.session.auto = false
397 406
398 407 ## default cookie expiration time in seconds, set to `true` to set expire
399 408 ## at browser close
400 409 #beaker.session.cookie_expires = 3600
401 410
402 411 ###################################
403 412 ## SEARCH INDEXING CONFIGURATION ##
404 413 ###################################
405 414 ## Full text search indexer is available in rhodecode-tools under
406 415 ## `rhodecode-tools index` command
407 416
408 417 ## WHOOSH Backend, doesn't require additional services to run
409 418 ## it works good with few dozen repos
410 419 search.module = rhodecode.lib.index.whoosh
411 420 search.location = %(here)s/data/index
412 421
413 422 ########################################
414 423 ### CHANNELSTREAM CONFIG ####
415 424 ########################################
416 425 ## channelstream enables persistent connections and live notification
417 426 ## in the system. It's also used by the chat system
418 427
419 428 channelstream.enabled = false
420 429
421 430 ## server address for channelstream server on the backend
422 431 channelstream.server = 127.0.0.1:9800
423 432
424 433 ## location of the channelstream server from outside world
425 434 ## use ws:// for http or wss:// for https. This address needs to be handled
426 435 ## by external HTTP server such as Nginx or Apache
427 ## see nginx/apache configuration examples in our docs
436 ## see Nginx/Apache configuration examples in our docs
428 437 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
429 438 channelstream.secret = secret
430 439 channelstream.history.location = %(here)s/channelstream_history
431 440
432 441 ## Internal application path that Javascript uses to connect into.
433 442 ## If you use proxy-prefix the prefix should be added before /_channelstream
434 443 channelstream.proxy_path = /_channelstream
435 444
436 445
437 446 ###################################
438 447 ## APPENLIGHT CONFIG ##
439 448 ###################################
440 449
441 450 ## Appenlight is tailored to work with RhodeCode, see
442 451 ## http://appenlight.com for details how to obtain an account
443 452
444 ## appenlight integration enabled
453 ## Appenlight integration enabled
445 454 appenlight = false
446 455
447 456 appenlight.server_url = https://api.appenlight.com
448 457 appenlight.api_key = YOUR_API_KEY
449 458 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
450 459
451 # used for JS client
460 ## used for JS client
452 461 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
453 462
454 463 ## TWEAK AMOUNT OF INFO SENT HERE
455 464
456 465 ## enables 404 error logging (default False)
457 466 appenlight.report_404 = false
458 467
459 468 ## time in seconds after request is considered being slow (default 1)
460 469 appenlight.slow_request_time = 1
461 470
462 471 ## record slow requests in application
463 472 ## (needs to be enabled for slow datastore recording and time tracking)
464 473 appenlight.slow_requests = true
465 474
466 475 ## enable hooking to application loggers
467 476 appenlight.logging = true
468 477
469 478 ## minimum log level for log capture
470 479 appenlight.logging.level = WARNING
471 480
472 481 ## send logs only from erroneous/slow requests
473 482 ## (saves API quota for intensive logging)
474 483 appenlight.logging_on_error = false
475 484
476 ## list of additonal keywords that should be grabbed from environ object
485 ## list of additional keywords that should be grabbed from environ object
477 486 ## can be string with comma separated list of words in lowercase
478 487 ## (by default client will always send following info:
479 488 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
480 489 ## start with HTTP* this list be extended with additional keywords here
481 490 appenlight.environ_keys_whitelist =
482 491
483 492 ## list of keywords that should be blanked from request object
484 493 ## can be string with comma separated list of words in lowercase
485 494 ## (by default client will always blank keys that contain following words
486 495 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
487 496 ## this list be extended with additional keywords set here
488 497 appenlight.request_keys_blacklist =
489 498
490 499 ## list of namespaces that should be ignores when gathering log entries
491 500 ## can be string with comma separated list of namespaces
492 501 ## (by default the client ignores own entries: appenlight_client.client)
493 502 appenlight.log_namespace_blacklist =
494 503
495 504 # enable debug style page
496 505 debug_style = true
497 506
498 507 ###########################################
499 508 ### MAIN RHODECODE DATABASE CONFIG ###
500 509 ###########################################
501 510 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
502 511 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
503 512 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
504 513 # pymysql is an alternative driver for MySQL, use in case of problems with default one
505 514 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
506 515
507 516 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
508 517
509 518 # see sqlalchemy docs for other advanced settings
510 519
511 520 ## print the sql statements to output
512 521 sqlalchemy.db1.echo = false
513 522 ## recycle the connections after this amount of seconds
514 523 sqlalchemy.db1.pool_recycle = 3600
515 524 sqlalchemy.db1.convert_unicode = true
516 525
517 526 ## the number of connections to keep open inside the connection pool.
518 527 ## 0 indicates no limit
519 528 #sqlalchemy.db1.pool_size = 5
520 529
521 530 ## the number of connections to allow in connection pool "overflow", that is
522 531 ## connections that can be opened above and beyond the pool_size setting,
523 532 ## which defaults to five.
524 533 #sqlalchemy.db1.max_overflow = 10
525 534
526 535 ## Connection check ping, used to detect broken database connections
527 536 ## could be enabled to better handle cases if MySQL has gone away errors
528 537 #sqlalchemy.db1.ping_connection = true
529 538
530 539 ##################
531 540 ### VCS CONFIG ###
532 541 ##################
533 542 vcs.server.enable = true
534 543 vcs.server = localhost:9900
535 544
536 ## Web server connectivity protocol, responsible for web based VCS operatations
545 ## Web server connectivity protocol, responsible for web based VCS operations
537 546 ## Available protocols are:
538 547 ## `http` - use http-rpc backend (default)
539 548 vcs.server.protocol = http
540 549
541 550 ## Push/Pull operations protocol, available options are:
542 551 ## `http` - use http-rpc backend (default)
543 552 vcs.scm_app_implementation = http
544 553
545 554 ## Push/Pull operations hooks protocol, available options are:
546 555 ## `http` - use http-rpc backend (default)
547 556 vcs.hooks.protocol = http
548 557
549 558 ## Host on which this instance is listening for hooks. If vcsserver is in other location
550 559 ## this should be adjusted.
551 560 vcs.hooks.host = 127.0.0.1
552 561
553 562 vcs.server.log_level = debug
554 563 ## Start VCSServer with this instance as a subprocess, useful for development
555 564 vcs.start_server = false
556 565
557 566 ## List of enabled VCS backends, available options are:
558 567 ## `hg` - mercurial
559 568 ## `git` - git
560 569 ## `svn` - subversion
561 570 vcs.backends = hg, git, svn
562 571
563 572 vcs.connection_timeout = 3600
564 573 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
565 574 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
566 575 #vcs.svn.compatible_version = pre-1.8-compatible
567 576
568 577
569 578 ############################################################
570 579 ### Subversion proxy support (mod_dav_svn) ###
571 580 ### Maps RhodeCode repo groups into SVN paths for Apache ###
572 581 ############################################################
573 582 ## Enable or disable the config file generation.
574 583 svn.proxy.generate_config = false
575 584 ## Generate config file with `SVNListParentPath` set to `On`.
576 585 svn.proxy.list_parent_path = true
577 586 ## Set location and file name of generated config file.
578 587 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
579 588 ## alternative mod_dav config template. This needs to be a mako template
580 589 #svn.proxy.config_template = ~/.rccontrol/enterprise-1/custom_svn_conf.mako
581 590 ## Used as a prefix to the `Location` block in the generated config file.
582 591 ## In most cases it should be set to `/`.
583 592 svn.proxy.location_root = /
584 593 ## Command to reload the mod dav svn configuration on change.
585 ## Example: `/etc/init.d/apache2 reload`
594 ## Example: `/etc/init.d/apache2 reload` or /home/USER/apache_reload.sh
595 ## Make sure user who runs RhodeCode process is allowed to reload Apache
586 596 #svn.proxy.reload_cmd = /etc/init.d/apache2 reload
587 597 ## If the timeout expires before the reload command finishes, the command will
588 598 ## be killed. Setting it to zero means no timeout. Defaults to 10 seconds.
589 599 #svn.proxy.reload_timeout = 10
590 600
591 601 ############################################################
592 602 ### SSH Support Settings ###
593 603 ############################################################
594 604
595 605 ## Defines if a custom authorized_keys file should be created and written on
596 ## any change user ssh keys. Setting this to false also disables posibility
606 ## any change user ssh keys. Setting this to false also disables possibility
597 607 ## of adding SSH keys by users from web interface. Super admins can still
598 608 ## manage SSH Keys.
599 609 ssh.generate_authorized_keyfile = false
600 610
601 611 ## Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
602 612 # ssh.authorized_keys_ssh_opts =
603 613
604 ## Path to the authrozied_keys file where the generate entries are placed.
614 ## Path to the authorized_keys file where the generate entries are placed.
605 615 ## It is possible to have multiple key files specified in `sshd_config` e.g.
606 616 ## AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
607 617 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
608 618
609 619 ## Command to execute the SSH wrapper. The binary is available in the
610 ## rhodecode installation directory.
620 ## RhodeCode installation directory.
611 621 ## e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
612 622 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
613 623
614 624 ## Allow shell when executing the ssh-wrapper command
615 625 ssh.wrapper_cmd_allow_shell = false
616 626
617 627 ## Enables logging, and detailed output send back to the client during SSH
618 ## operations. Usefull for debugging, shouldn't be used in production.
628 ## operations. Useful for debugging, shouldn't be used in production.
619 629 ssh.enable_debug_logging = true
620 630
621 631 ## Paths to binary executable, by default they are the names, but we can
622 632 ## override them if we want to use a custom one
623 633 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
624 634 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
625 635 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
626 636
637 ## Enables SSH key generator web interface. Disabling this still allows users
638 ## to add their own keys.
639 ssh.enable_ui_key_generator = true
640
627 641
628 642 ## Dummy marker to add new entries after.
629 643 ## Add any custom entries below. Please don't remove.
630 644 custom.conf = 1
631 645
632 646
633 647 ################################
634 648 ### LOGGING CONFIGURATION ####
635 649 ################################
636 650 [loggers]
637 651 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
638 652
639 653 [handlers]
640 654 keys = console, console_sql
641 655
642 656 [formatters]
643 657 keys = generic, color_formatter, color_formatter_sql
644 658
645 659 #############
646 660 ## LOGGERS ##
647 661 #############
648 662 [logger_root]
649 663 level = NOTSET
650 664 handlers = console
651 665
652 666 [logger_sqlalchemy]
653 667 level = INFO
654 668 handlers = console_sql
655 669 qualname = sqlalchemy.engine
656 670 propagate = 0
657 671
658 672 [logger_beaker]
659 673 level = DEBUG
660 674 handlers =
661 675 qualname = beaker.container
662 676 propagate = 1
663 677
664 678 [logger_rhodecode]
665 679 level = DEBUG
666 680 handlers =
667 681 qualname = rhodecode
668 682 propagate = 1
669 683
670 684 [logger_ssh_wrapper]
671 685 level = DEBUG
672 686 handlers =
673 687 qualname = ssh_wrapper
674 688 propagate = 1
675 689
676 690 [logger_celery]
677 691 level = DEBUG
678 692 handlers =
679 693 qualname = celery
680 694
681 695
682 696 ##############
683 697 ## HANDLERS ##
684 698 ##############
685 699
686 700 [handler_console]
687 701 class = StreamHandler
688 702 args = (sys.stderr, )
689 703 level = DEBUG
690 704 formatter = color_formatter
691 705
692 706 [handler_console_sql]
693 707 # "level = DEBUG" logs SQL queries and results.
694 708 # "level = INFO" logs SQL queries.
695 709 # "level = WARN" logs neither. (Recommended for production systems.)
696 710 class = StreamHandler
697 711 args = (sys.stderr, )
698 712 level = WARN
699 713 formatter = color_formatter_sql
700 714
701 715 ################
702 716 ## FORMATTERS ##
703 717 ################
704 718
705 719 [formatter_generic]
706 720 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
707 721 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
708 722 datefmt = %Y-%m-%d %H:%M:%S
709 723
710 724 [formatter_color_formatter]
711 725 class = rhodecode.lib.logging_formatter.ColorFormatter
712 726 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
713 727 datefmt = %Y-%m-%d %H:%M:%S
714 728
715 729 [formatter_color_formatter_sql]
716 730 class = rhodecode.lib.logging_formatter.ColorFormatterSql
717 731 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
718 732 datefmt = %Y-%m-%d %H:%M:%S
@@ -1,691 +1,705 b''
1 1
2 2
3 3 ################################################################################
4 4 ## RHODECODE COMMUNITY EDITION CONFIGURATION ##
5 5 ################################################################################
6 6
7 7 [DEFAULT]
8 8 ## Debug flag sets all loggers to debug, and enables request tracking
9 9 debug = false
10 10
11 11 ################################################################################
12 12 ## EMAIL CONFIGURATION ##
13 13 ## Uncomment and replace with the email address which should receive ##
14 14 ## any error reports after an application crash ##
15 15 ## Additionally these settings will be used by the RhodeCode mailing system ##
16 16 ################################################################################
17 17
18 18 ## prefix all emails subjects with given prefix, helps filtering out emails
19 19 #email_prefix = [RhodeCode]
20 20
21 21 ## email FROM address all mails will be sent
22 22 #app_email_from = rhodecode-noreply@localhost
23 23
24 24 #smtp_server = mail.server.com
25 25 #smtp_username =
26 26 #smtp_password =
27 27 #smtp_port =
28 28 #smtp_use_tls = false
29 29 #smtp_use_ssl = true
30 30
31 31 [server:main]
32 32 ## COMMON ##
33 33 host = 127.0.0.1
34 34 port = 5000
35 35
36 36 ###########################################################
37 37 ## WAITRESS WSGI SERVER - Recommended for Development ####
38 38 ###########################################################
39 39
40 40 #use = egg:waitress#main
41 41 ## number of worker threads
42 42 #threads = 5
43 43 ## MAX BODY SIZE 100GB
44 44 #max_request_body_size = 107374182400
45 45 ## Use poll instead of select, fixes file descriptors limits problems.
46 46 ## May not work on old windows systems.
47 47 #asyncore_use_poll = true
48 48
49 49
50 50 ##########################
51 51 ## GUNICORN WSGI SERVER ##
52 52 ##########################
53 53 ## run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
54 54
55 55 use = egg:gunicorn#main
56 ## Sets the number of process workers. More workers means more concurent connections
56 ## Sets the number of process workers. More workers means more concurrent connections
57 57 ## RhodeCode can handle at the same time. Each additional worker also it increases
58 58 ## memory usage as each has it's own set of caches.
59 59 ## Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
60 60 ## than 8-10 unless for really big deployments .e.g 700-1000 users.
61 61 ## `instance_id = *` must be set in the [app:main] section below (which is the default)
62 62 ## when using more than 1 worker.
63 63 workers = 2
64 64 ## process name visible in process list
65 65 proc_name = rhodecode
66 66 ## type of worker class, one of sync, gevent
67 67 ## recommended for bigger setup is using of of other than sync one
68 68 worker_class = gevent
69 69 ## The maximum number of simultaneous clients. Valid only for Gevent
70 70 worker_connections = 10
71 71 ## max number of requests that worker will handle before being gracefully
72 72 ## restarted, could prevent memory leaks
73 73 max_requests = 1000
74 74 max_requests_jitter = 30
75 75 ## amount of time a worker can spend with handling a request before it
76 76 ## gets killed and restarted. Set to 6hrs
77 77 timeout = 21600
78 78
79 79
80 80 ## prefix middleware for RhodeCode.
81 81 ## recommended when using proxy setup.
82 82 ## allows to set RhodeCode under a prefix in server.
83 83 ## eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
84 84 ## And set your prefix like: `prefix = /custom_prefix`
85 85 ## be sure to also set beaker.session.cookie_path = /custom_prefix if you need
86 86 ## to make your cookies only work on prefix url
87 87 [filter:proxy-prefix]
88 88 use = egg:PasteDeploy#prefix
89 89 prefix = /
90 90
91 91 [app:main]
92 92 ## The %(here)s variable will be replaced with the absolute path of parent directory
93 93 ## of this file
94 94 ## In addition ENVIRONMENT variables usage is possible, e.g
95 95 ## sqlalchemy.db1.url = {ENV_RC_DB_URL}
96 96
97 97 use = egg:rhodecode-enterprise-ce
98 98
99 99 ## enable proxy prefix middleware, defined above
100 100 #filter-with = proxy-prefix
101 101
102 102 ## encryption key used to encrypt social plugin tokens,
103 103 ## remote_urls with credentials etc, if not set it defaults to
104 104 ## `beaker.session.secret`
105 105 #rhodecode.encrypted_values.secret =
106 106
107 107 ## decryption strict mode (enabled by default). It controls if decryption raises
108 108 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
109 109 #rhodecode.encrypted_values.strict = false
110 110
111 ## return gzipped responses from Rhodecode (static files/application)
111 ## return gzipped responses from RhodeCode (static files/application)
112 112 gzip_responses = false
113 113
114 ## autogenerate javascript routes file on startup
114 ## auto-generate javascript routes file on startup
115 115 generate_js_files = false
116 116
117 117 ## System global default language.
118 118 ## All available languages: en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
119 119 lang = en
120 120
121 121 ## Perform a full repository scan and import on each server start.
122 122 ## Settings this to true could lead to very long startup time.
123 123 startup.import_repos = false
124 124
125 125 ## Uncomment and set this path to use archive download cache.
126 126 ## Once enabled, generated archives will be cached at this location
127 127 ## and served from the cache during subsequent requests for the same archive of
128 128 ## the repository.
129 129 #archive_cache_dir = /tmp/tarballcache
130 130
131 ## URL at which the application is running. This is used for bootstraping
131 ## URL at which the application is running. This is used for Bootstrapping
132 132 ## requests in context when no web request is available. Used in ishell, or
133 133 ## SSH calls. Set this for events to receive proper url for SSH calls.
134 134 app.base_url = http://rhodecode.local
135 135
136 136 ## Unique application ID. Should be a random unique string for security.
137 137 app_instance_uuid = rc-production
138 138
139 139 ## Cut off limit for large diffs (size in bytes). If overall diff size on
140 140 ## commit, or pull request exceeds this limit this diff will be displayed
141 141 ## partially. E.g 512000 == 512Kb
142 142 cut_off_limit_diff = 512000
143 143
144 144 ## Cut off limit for large files inside diffs (size in bytes). Each individual
145 145 ## file inside diff which exceeds this limit will be displayed partially.
146 146 ## E.g 128000 == 128Kb
147 147 cut_off_limit_file = 128000
148 148
149 149 ## use cached version of vcs repositories everywhere. Recommended to be `true`
150 150 vcs_full_cache = true
151 151
152 152 ## Force https in RhodeCode, fixes https redirects, assumes it's always https.
153 153 ## Normally this is controlled by proper http flags sent from http server
154 154 force_https = false
155 155
156 156 ## use Strict-Transport-Security headers
157 157 use_htsts = false
158 158
159 159 ## git rev filter option, --all is the default filter, if you need to
160 160 ## hide all refs in changelog switch this to --branches --tags
161 161 git_rev_filter = --branches --tags
162 162
163 163 # Set to true if your repos are exposed using the dumb protocol
164 164 git_update_server_info = false
165 165
166 166 ## RSS/ATOM feed options
167 167 rss_cut_off_limit = 256000
168 168 rss_items_per_page = 10
169 169 rss_include_diff = false
170 170
171 171 ## gist URL alias, used to create nicer urls for gist. This should be an
172 172 ## url that does rewrites to _admin/gists/{gistid}.
173 173 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
174 174 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
175 175 gist_alias_url =
176 176
177 177 ## List of views (using glob pattern syntax) that AUTH TOKENS could be
178 178 ## used for access.
179 179 ## Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
180 180 ## came from the the logged in user who own this authentication token.
181 ## Additionally @TOKEN syntaxt can be used to bound the view to specific
181 ## Additionally @TOKEN syntax can be used to bound the view to specific
182 182 ## authentication token. Such view would be only accessible when used together
183 183 ## with this authentication token
184 184 ##
185 185 ## list of all views can be found under `/_admin/permissions/auth_token_access`
186 186 ## The list should be "," separated and on a single line.
187 187 ##
188 188 ## Most common views to enable:
189 189 # RepoCommitsView:repo_commit_download
190 190 # RepoCommitsView:repo_commit_patch
191 191 # RepoCommitsView:repo_commit_raw
192 192 # RepoCommitsView:repo_commit_raw@TOKEN
193 193 # RepoFilesView:repo_files_diff
194 194 # RepoFilesView:repo_archivefile
195 195 # RepoFilesView:repo_file_raw
196 196 # GistView:*
197 197 api_access_controllers_whitelist =
198 198
199 199 ## Default encoding used to convert from and to unicode
200 200 ## can be also a comma separated list of encoding in case of mixed encodings
201 201 default_encoding = UTF-8
202 202
203 203 ## instance-id prefix
204 204 ## a prefix key for this instance used for cache invalidation when running
205 ## multiple instances of rhodecode, make sure it's globally unique for
206 ## all running rhodecode instances. Leave empty if you don't use it
205 ## multiple instances of RhodeCode, make sure it's globally unique for
206 ## all running RhodeCode instances. Leave empty if you don't use it
207 207 instance_id =
208 208
209 209 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
210 210 ## of an authentication plugin also if it is disabled by it's settings.
211 211 ## This could be useful if you are unable to log in to the system due to broken
212 ## authentication settings. Then you can enable e.g. the internal rhodecode auth
212 ## authentication settings. Then you can enable e.g. the internal RhodeCode auth
213 213 ## module to log in again and fix the settings.
214 214 ##
215 215 ## Available builtin plugin IDs (hash is part of the ID):
216 216 ## egg:rhodecode-enterprise-ce#rhodecode
217 217 ## egg:rhodecode-enterprise-ce#pam
218 218 ## egg:rhodecode-enterprise-ce#ldap
219 219 ## egg:rhodecode-enterprise-ce#jasig_cas
220 220 ## egg:rhodecode-enterprise-ce#headers
221 221 ## egg:rhodecode-enterprise-ce#crowd
222 222 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
223 223
224 224 ## alternative return HTTP header for failed authentication. Default HTTP
225 225 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
226 226 ## handling that causing a series of failed authentication calls.
227 227 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
228 ## This will be served instead of default 401 on bad authnetication
228 ## This will be served instead of default 401 on bad authentication
229 229 auth_ret_code =
230 230
231 231 ## use special detection method when serving auth_ret_code, instead of serving
232 232 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
233 233 ## and then serve auth_ret_code to clients
234 234 auth_ret_code_detection = false
235 235
236 236 ## locking return code. When repository is locked return this HTTP code. 2XX
237 237 ## codes don't break the transactions while 4XX codes do
238 238 lock_ret_code = 423
239 239
240 240 ## allows to change the repository location in settings page
241 241 allow_repo_location_change = true
242 242
243 243 ## allows to setup custom hooks in settings page
244 244 allow_custom_hooks_settings = true
245 245
246 246 ## Generated license token required for EE edition license.
247 247 ## New generated token value can be found in Admin > settings > license page.
248 248 license_token =
249 249
250 250 ## supervisor connection uri, for managing supervisor and logs.
251 251 supervisor.uri =
252 252 ## supervisord group name/id we only want this RC instance to handle
253 253 supervisor.group_id = prod
254 254
255 255 ## Display extended labs settings
256 256 labs_settings_active = true
257 257
258 258 ## Custom exception store path, defaults to TMPDIR
259 259 ## This is used to store exception from RhodeCode in shared directory
260 260 #exception_tracker.store_path =
261 261
262 ## File store configuration. This is used to store and serve uploaded files
263 file_store.enabled = true
264 ## Storage backend, available options are: local
265 file_store.backend = local
266 ## path to store the uploaded binaries
267 file_store.storage_path = %(here)s/data/file_store
268
262 269
263 270 ####################################
264 271 ### CELERY CONFIG ####
265 272 ####################################
266 273 ## run: /path/to/celery worker \
267 274 ## -E --beat --app rhodecode.lib.celerylib.loader \
268 275 ## --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler \
269 276 ## --loglevel DEBUG --ini /path/to/rhodecode.ini
270 277
271 278 use_celery = false
272 279
273 280 ## connection url to the message broker (default rabbitmq)
274 281 celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
275 282
276 283 ## maximum tasks to execute before worker restart
277 284 celery.max_tasks_per_child = 100
278 285
279 286 ## tasks will never be sent to the queue, but executed locally instead.
280 287 celery.task_always_eager = false
281 288
282 289 #####################################
283 290 ### DOGPILE CACHE ####
284 291 #####################################
285 292 ## Default cache dir for caches. Putting this into a ramdisk
286 293 ## can boost performance, eg. /tmpfs/data_ramdisk, however this directory might require
287 294 ## large amount of space
288 295 cache_dir = %(here)s/data
289 296
290 297 ## `cache_perms` cache settings for permission tree, auth TTL.
291 298 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
292 299 rc_cache.cache_perms.expiration_time = 300
293 300
294 301 ## alternative `cache_perms` redis backend with distributed lock
295 302 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
296 303 #rc_cache.cache_perms.expiration_time = 300
297 304 ## redis_expiration_time needs to be greater then expiration_time
298 305 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
299 306 #rc_cache.cache_perms.arguments.socket_timeout = 30
300 307 #rc_cache.cache_perms.arguments.host = localhost
301 308 #rc_cache.cache_perms.arguments.port = 6379
302 309 #rc_cache.cache_perms.arguments.db = 0
310 ## more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
303 311 #rc_cache.cache_perms.arguments.distributed_lock = true
304 312
305 313 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
306 314 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
307 315 rc_cache.cache_repo.expiration_time = 2592000
308 316
309 317 ## alternative `cache_repo` redis backend with distributed lock
310 318 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
311 319 #rc_cache.cache_repo.expiration_time = 2592000
312 320 ## redis_expiration_time needs to be greater then expiration_time
313 321 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
314 322 #rc_cache.cache_repo.arguments.socket_timeout = 30
315 323 #rc_cache.cache_repo.arguments.host = localhost
316 324 #rc_cache.cache_repo.arguments.port = 6379
317 325 #rc_cache.cache_repo.arguments.db = 1
326 ## more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
318 327 #rc_cache.cache_repo.arguments.distributed_lock = true
319 328
320 329 ## cache settings for SQL queries, this needs to use memory type backend
321 330 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
322 331 rc_cache.sql_cache_short.expiration_time = 30
323 332
324 333 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
325 334 ## type backend as the objects kept are not pickle serializable
326 335 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
327 336 ## by default we use 96H, this is using invalidation on push anyway
328 337 rc_cache.cache_repo_longterm.expiration_time = 345600
329 338 ## max items in LRU cache, reduce this number to save memory, and expire last used
330 339 ## cached objects
331 340 rc_cache.cache_repo_longterm.max_size = 10000
332 341
333 342
334 343 ####################################
335 344 ### BEAKER SESSION ####
336 345 ####################################
337 346
338 347 ## .session.type is type of storage options for the session, current allowed
339 348 ## types are file, ext:memcached, ext:redis, ext:database, and memory (default).
340 349 beaker.session.type = file
341 350 beaker.session.data_dir = %(here)s/data/sessions
342 351
343 352 ## db based session, fast, and allows easy management over logged in users
344 353 #beaker.session.type = ext:database
345 354 #beaker.session.table_name = db_session
346 355 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
347 356 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
348 357 #beaker.session.sa.pool_recycle = 3600
349 358 #beaker.session.sa.echo = false
350 359
351 360 beaker.session.key = rhodecode
352 361 beaker.session.secret = production-rc-uytcxaz
353 362 beaker.session.lock_dir = %(here)s/data/sessions/lock
354 363
355 364 ## Secure encrypted cookie. Requires AES and AES python libraries
356 365 ## you must disable beaker.session.secret to use this
357 366 #beaker.session.encrypt_key = key_for_encryption
358 367 #beaker.session.validate_key = validation_key
359 368
360 369 ## sets session as invalid(also logging out user) if it haven not been
361 370 ## accessed for given amount of time in seconds
362 371 beaker.session.timeout = 2592000
363 372 beaker.session.httponly = true
364 373 ## Path to use for the cookie. Set to prefix if you use prefix middleware
365 374 #beaker.session.cookie_path = /custom_prefix
366 375
367 376 ## uncomment for https secure cookie
368 377 beaker.session.secure = false
369 378
370 379 ## auto save the session to not to use .save()
371 380 beaker.session.auto = false
372 381
373 382 ## default cookie expiration time in seconds, set to `true` to set expire
374 383 ## at browser close
375 384 #beaker.session.cookie_expires = 3600
376 385
377 386 ###################################
378 387 ## SEARCH INDEXING CONFIGURATION ##
379 388 ###################################
380 389 ## Full text search indexer is available in rhodecode-tools under
381 390 ## `rhodecode-tools index` command
382 391
383 392 ## WHOOSH Backend, doesn't require additional services to run
384 393 ## it works good with few dozen repos
385 394 search.module = rhodecode.lib.index.whoosh
386 395 search.location = %(here)s/data/index
387 396
388 397 ########################################
389 398 ### CHANNELSTREAM CONFIG ####
390 399 ########################################
391 400 ## channelstream enables persistent connections and live notification
392 401 ## in the system. It's also used by the chat system
393 402
394 403 channelstream.enabled = false
395 404
396 405 ## server address for channelstream server on the backend
397 406 channelstream.server = 127.0.0.1:9800
398 407
399 408 ## location of the channelstream server from outside world
400 409 ## use ws:// for http or wss:// for https. This address needs to be handled
401 410 ## by external HTTP server such as Nginx or Apache
402 ## see nginx/apache configuration examples in our docs
411 ## see Nginx/Apache configuration examples in our docs
403 412 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
404 413 channelstream.secret = secret
405 414 channelstream.history.location = %(here)s/channelstream_history
406 415
407 416 ## Internal application path that Javascript uses to connect into.
408 417 ## If you use proxy-prefix the prefix should be added before /_channelstream
409 418 channelstream.proxy_path = /_channelstream
410 419
411 420
412 421 ###################################
413 422 ## APPENLIGHT CONFIG ##
414 423 ###################################
415 424
416 425 ## Appenlight is tailored to work with RhodeCode, see
417 426 ## http://appenlight.com for details how to obtain an account
418 427
419 ## appenlight integration enabled
428 ## Appenlight integration enabled
420 429 appenlight = false
421 430
422 431 appenlight.server_url = https://api.appenlight.com
423 432 appenlight.api_key = YOUR_API_KEY
424 433 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
425 434
426 # used for JS client
435 ## used for JS client
427 436 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
428 437
429 438 ## TWEAK AMOUNT OF INFO SENT HERE
430 439
431 440 ## enables 404 error logging (default False)
432 441 appenlight.report_404 = false
433 442
434 443 ## time in seconds after request is considered being slow (default 1)
435 444 appenlight.slow_request_time = 1
436 445
437 446 ## record slow requests in application
438 447 ## (needs to be enabled for slow datastore recording and time tracking)
439 448 appenlight.slow_requests = true
440 449
441 450 ## enable hooking to application loggers
442 451 appenlight.logging = true
443 452
444 453 ## minimum log level for log capture
445 454 appenlight.logging.level = WARNING
446 455
447 456 ## send logs only from erroneous/slow requests
448 457 ## (saves API quota for intensive logging)
449 458 appenlight.logging_on_error = false
450 459
451 ## list of additonal keywords that should be grabbed from environ object
460 ## list of additional keywords that should be grabbed from environ object
452 461 ## can be string with comma separated list of words in lowercase
453 462 ## (by default client will always send following info:
454 463 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
455 464 ## start with HTTP* this list be extended with additional keywords here
456 465 appenlight.environ_keys_whitelist =
457 466
458 467 ## list of keywords that should be blanked from request object
459 468 ## can be string with comma separated list of words in lowercase
460 469 ## (by default client will always blank keys that contain following words
461 470 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
462 471 ## this list be extended with additional keywords set here
463 472 appenlight.request_keys_blacklist =
464 473
465 474 ## list of namespaces that should be ignores when gathering log entries
466 475 ## can be string with comma separated list of namespaces
467 476 ## (by default the client ignores own entries: appenlight_client.client)
468 477 appenlight.log_namespace_blacklist =
469 478
470 479
471 480 ###########################################
472 481 ### MAIN RHODECODE DATABASE CONFIG ###
473 482 ###########################################
474 483 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
475 484 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
476 485 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
477 486 # pymysql is an alternative driver for MySQL, use in case of problems with default one
478 487 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
479 488
480 489 sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
481 490
482 491 # see sqlalchemy docs for other advanced settings
483 492
484 493 ## print the sql statements to output
485 494 sqlalchemy.db1.echo = false
486 495 ## recycle the connections after this amount of seconds
487 496 sqlalchemy.db1.pool_recycle = 3600
488 497 sqlalchemy.db1.convert_unicode = true
489 498
490 499 ## the number of connections to keep open inside the connection pool.
491 500 ## 0 indicates no limit
492 501 #sqlalchemy.db1.pool_size = 5
493 502
494 503 ## the number of connections to allow in connection pool "overflow", that is
495 504 ## connections that can be opened above and beyond the pool_size setting,
496 505 ## which defaults to five.
497 506 #sqlalchemy.db1.max_overflow = 10
498 507
499 508 ## Connection check ping, used to detect broken database connections
500 509 ## could be enabled to better handle cases if MySQL has gone away errors
501 510 #sqlalchemy.db1.ping_connection = true
502 511
503 512 ##################
504 513 ### VCS CONFIG ###
505 514 ##################
506 515 vcs.server.enable = true
507 516 vcs.server = localhost:9900
508 517
509 ## Web server connectivity protocol, responsible for web based VCS operatations
518 ## Web server connectivity protocol, responsible for web based VCS operations
510 519 ## Available protocols are:
511 520 ## `http` - use http-rpc backend (default)
512 521 vcs.server.protocol = http
513 522
514 523 ## Push/Pull operations protocol, available options are:
515 524 ## `http` - use http-rpc backend (default)
516 525 vcs.scm_app_implementation = http
517 526
518 527 ## Push/Pull operations hooks protocol, available options are:
519 528 ## `http` - use http-rpc backend (default)
520 529 vcs.hooks.protocol = http
521 530
522 531 ## Host on which this instance is listening for hooks. If vcsserver is in other location
523 532 ## this should be adjusted.
524 533 vcs.hooks.host = 127.0.0.1
525 534
526 535 vcs.server.log_level = info
527 536 ## Start VCSServer with this instance as a subprocess, useful for development
528 537 vcs.start_server = false
529 538
530 539 ## List of enabled VCS backends, available options are:
531 540 ## `hg` - mercurial
532 541 ## `git` - git
533 542 ## `svn` - subversion
534 543 vcs.backends = hg, git, svn
535 544
536 545 vcs.connection_timeout = 3600
537 546 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
538 547 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
539 548 #vcs.svn.compatible_version = pre-1.8-compatible
540 549
541 550
542 551 ############################################################
543 552 ### Subversion proxy support (mod_dav_svn) ###
544 553 ### Maps RhodeCode repo groups into SVN paths for Apache ###
545 554 ############################################################
546 555 ## Enable or disable the config file generation.
547 556 svn.proxy.generate_config = false
548 557 ## Generate config file with `SVNListParentPath` set to `On`.
549 558 svn.proxy.list_parent_path = true
550 559 ## Set location and file name of generated config file.
551 560 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
552 561 ## alternative mod_dav config template. This needs to be a mako template
553 562 #svn.proxy.config_template = ~/.rccontrol/enterprise-1/custom_svn_conf.mako
554 563 ## Used as a prefix to the `Location` block in the generated config file.
555 564 ## In most cases it should be set to `/`.
556 565 svn.proxy.location_root = /
557 566 ## Command to reload the mod dav svn configuration on change.
558 ## Example: `/etc/init.d/apache2 reload`
567 ## Example: `/etc/init.d/apache2 reload` or /home/USER/apache_reload.sh
568 ## Make sure user who runs RhodeCode process is allowed to reload Apache
559 569 #svn.proxy.reload_cmd = /etc/init.d/apache2 reload
560 570 ## If the timeout expires before the reload command finishes, the command will
561 571 ## be killed. Setting it to zero means no timeout. Defaults to 10 seconds.
562 572 #svn.proxy.reload_timeout = 10
563 573
564 574 ############################################################
565 575 ### SSH Support Settings ###
566 576 ############################################################
567 577
568 578 ## Defines if a custom authorized_keys file should be created and written on
569 ## any change user ssh keys. Setting this to false also disables posibility
579 ## any change user ssh keys. Setting this to false also disables possibility
570 580 ## of adding SSH keys by users from web interface. Super admins can still
571 581 ## manage SSH Keys.
572 582 ssh.generate_authorized_keyfile = false
573 583
574 584 ## Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
575 585 # ssh.authorized_keys_ssh_opts =
576 586
577 ## Path to the authrozied_keys file where the generate entries are placed.
587 ## Path to the authorized_keys file where the generate entries are placed.
578 588 ## It is possible to have multiple key files specified in `sshd_config` e.g.
579 589 ## AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
580 590 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
581 591
582 592 ## Command to execute the SSH wrapper. The binary is available in the
583 ## rhodecode installation directory.
593 ## RhodeCode installation directory.
584 594 ## e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
585 595 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
586 596
587 597 ## Allow shell when executing the ssh-wrapper command
588 598 ssh.wrapper_cmd_allow_shell = false
589 599
590 600 ## Enables logging, and detailed output send back to the client during SSH
591 ## operations. Usefull for debugging, shouldn't be used in production.
601 ## operations. Useful for debugging, shouldn't be used in production.
592 602 ssh.enable_debug_logging = false
593 603
594 604 ## Paths to binary executable, by default they are the names, but we can
595 605 ## override them if we want to use a custom one
596 606 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
597 607 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
598 608 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
599 609
610 ## Enables SSH key generator web interface. Disabling this still allows users
611 ## to add their own keys.
612 ssh.enable_ui_key_generator = true
613
600 614
601 615 ## Dummy marker to add new entries after.
602 616 ## Add any custom entries below. Please don't remove.
603 617 custom.conf = 1
604 618
605 619
606 620 ################################
607 621 ### LOGGING CONFIGURATION ####
608 622 ################################
609 623 [loggers]
610 624 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
611 625
612 626 [handlers]
613 627 keys = console, console_sql
614 628
615 629 [formatters]
616 630 keys = generic, color_formatter, color_formatter_sql
617 631
618 632 #############
619 633 ## LOGGERS ##
620 634 #############
621 635 [logger_root]
622 636 level = NOTSET
623 637 handlers = console
624 638
625 639 [logger_sqlalchemy]
626 640 level = INFO
627 641 handlers = console_sql
628 642 qualname = sqlalchemy.engine
629 643 propagate = 0
630 644
631 645 [logger_beaker]
632 646 level = DEBUG
633 647 handlers =
634 648 qualname = beaker.container
635 649 propagate = 1
636 650
637 651 [logger_rhodecode]
638 652 level = DEBUG
639 653 handlers =
640 654 qualname = rhodecode
641 655 propagate = 1
642 656
643 657 [logger_ssh_wrapper]
644 658 level = DEBUG
645 659 handlers =
646 660 qualname = ssh_wrapper
647 661 propagate = 1
648 662
649 663 [logger_celery]
650 664 level = DEBUG
651 665 handlers =
652 666 qualname = celery
653 667
654 668
655 669 ##############
656 670 ## HANDLERS ##
657 671 ##############
658 672
659 673 [handler_console]
660 674 class = StreamHandler
661 675 args = (sys.stderr, )
662 676 level = INFO
663 677 formatter = generic
664 678
665 679 [handler_console_sql]
666 680 # "level = DEBUG" logs SQL queries and results.
667 681 # "level = INFO" logs SQL queries.
668 682 # "level = WARN" logs neither. (Recommended for production systems.)
669 683 class = StreamHandler
670 684 args = (sys.stderr, )
671 685 level = WARN
672 686 formatter = generic
673 687
674 688 ################
675 689 ## FORMATTERS ##
676 690 ################
677 691
678 692 [formatter_generic]
679 693 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
680 694 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
681 695 datefmt = %Y-%m-%d %H:%M:%S
682 696
683 697 [formatter_color_formatter]
684 698 class = rhodecode.lib.logging_formatter.ColorFormatter
685 699 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
686 700 datefmt = %Y-%m-%d %H:%M:%S
687 701
688 702 [formatter_color_formatter_sql]
689 703 class = rhodecode.lib.logging_formatter.ColorFormatterSql
690 704 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
691 705 datefmt = %Y-%m-%d %H:%M:%S
@@ -1,294 +1,296 b''
1 1 # Nix environment for the community edition
2 2 #
3 3 # This shall be as lean as possible, just producing the enterprise-ce
4 4 # derivation. For advanced tweaks to pimp up the development environment we use
5 5 # "shell.nix" so that it does not have to clutter this file.
6 6 #
7 7 # Configuration, set values in "~/.nixpkgs/config.nix".
8 8 # example
9 9 # {
10 10 # # Thoughts on how to configure the dev environment
11 11 # rc = {
12 12 # codeInternalUrl = "https://usr:token@code.rhodecode.com/internal";
13 13 # sources = {
14 14 # rhodecode-vcsserver = "/home/user/work/rhodecode-vcsserver";
15 15 # rhodecode-enterprise-ce = "/home/user/work/rhodecode-enterprise-ce";
16 16 # rhodecode-enterprise-ee = "/home/user/work/rhodecode-enterprise-ee";
17 17 # };
18 18 # };
19 19 # }
20 20
21 21 args@
22 { pythonPackages ? "python27Packages"
22 { system ? builtins.currentSystem
23 , pythonPackages ? "python27Packages"
23 24 , pythonExternalOverrides ? self: super: {}
24 25 , doCheck ? false
25 26 , ...
26 27 }:
27 28
28 29 let
29 pkgs_ = (import <nixpkgs> {});
30 pkgs_ = args.pkgs or (import <nixpkgs> { inherit system; });
30 31 in
31 32
32 33 let
33 34 pkgs = import <nixpkgs> {
34 35 overlays = [
35 36 (import ./pkgs/overlays.nix)
36 37 ];
37 38 inherit
38 39 (pkgs_)
39 40 system;
40 41 };
41 42
42 43 # Works with the new python-packages, still can fallback to the old
43 44 # variant.
44 45 basePythonPackagesUnfix = basePythonPackages.__unfix__ or (
45 46 self: basePythonPackages.override (a: { inherit self; }));
46 47
47 48 # Evaluates to the last segment of a file system path.
48 49 basename = path: with pkgs.lib; last (splitString "/" path);
49 50
50 51 # source code filter used as arugment to builtins.filterSource.
51 52 src-filter = path: type: with pkgs.lib;
52 53 let
53 54 ext = last (splitString "." path);
54 55 in
55 56 !builtins.elem (basename path) [
56 57 ".git" ".hg" "__pycache__" ".eggs" ".idea" ".dev"
57 58 "node_modules" "node_binaries"
58 59 "build" "data" "result" "tmp"] &&
59 60 !builtins.elem ext ["egg-info" "pyc"] &&
60 61 # TODO: johbo: This check is wrong, since "path" contains an absolute path,
61 62 # it would still be good to restore it since we want to ignore "result-*".
62 63 !hasPrefix "result" path;
63 64
64 65 sources =
65 66 let
66 67 inherit
67 68 (pkgs.lib)
68 69 all
69 70 isString
70 71 attrValues;
71 72 sourcesConfig = pkgs.config.rc.sources or {};
72 73 in
73 74 # Ensure that sources are configured as strings. Using a path
74 75 # would result in a copy into the nix store.
75 76 assert all isString (attrValues sourcesConfig);
76 77 sourcesConfig;
77 78
78 79 version = builtins.readFile "${rhodecode-enterprise-ce-src}/rhodecode/VERSION";
79 80 rhodecode-enterprise-ce-src = builtins.filterSource src-filter ./.;
80 81
81 82 nodeEnv = import ./pkgs/node-default.nix {
82 83 inherit
83 pkgs;
84 pkgs
85 system;
84 86 };
85 87 nodeDependencies = nodeEnv.shell.nodeDependencies;
86 88
87 89 rhodecode-testdata-src = sources.rhodecode-testdata or (
88 90 pkgs.fetchhg {
89 91 url = "https://code.rhodecode.com/upstream/rc_testdata";
90 92 rev = "v0.10.0";
91 93 sha256 = "0zn9swwvx4vgw4qn8q3ri26vvzgrxn15x6xnjrysi1bwmz01qjl0";
92 94 });
93 95
94 96 rhodecode-testdata = import "${rhodecode-testdata-src}/default.nix" {
95 97 inherit
96 98 doCheck
97 99 pkgs
98 100 pythonPackages;
99 101 };
100 102
101 103 pythonLocalOverrides = self: super: {
102 104 rhodecode-enterprise-ce =
103 105 let
104 106 linkNodePackages = ''
105 107 export RHODECODE_CE_PATH=${rhodecode-enterprise-ce-src}
106 108
107 109 echo "[BEGIN]: Link node packages and binaries"
108 110 # johbo: Linking individual packages allows us to run "npm install"
109 111 # inside of a shell to try things out. Re-entering the shell will
110 112 # restore a clean environment.
111 113 rm -fr node_modules
112 114 mkdir node_modules
113 115 ln -s ${nodeDependencies}/lib/node_modules/* node_modules/
114 116 export NODE_PATH=./node_modules
115 117
116 118 rm -fr node_binaries
117 119 mkdir node_binaries
118 120 ln -s ${nodeDependencies}/bin/* node_binaries/
119 121 echo "[DONE ]: Link node packages and binaries"
120 122 '';
121 123
122 124 releaseName = "RhodeCodeEnterpriseCE-${version}";
123 125 in super.rhodecode-enterprise-ce.override (attrs: {
124 126 inherit
125 127 doCheck
126 128 version;
127 129
128 130 name = "rhodecode-enterprise-ce-${version}";
129 131 releaseName = releaseName;
130 132 src = rhodecode-enterprise-ce-src;
131 133 dontStrip = true; # prevent strip, we don't need it.
132 134
133 135 # expose following attributed outside
134 136 passthru = {
135 137 inherit
136 138 rhodecode-testdata
137 139 linkNodePackages
138 140 myPythonPackagesUnfix
139 141 pythonLocalOverrides
140 142 pythonCommunityOverrides;
141 143
142 144 pythonPackages = self;
143 145 };
144 146
145 147 buildInputs =
146 148 attrs.buildInputs or [] ++ [
147 149 rhodecode-testdata
148 150 ];
149 151
150 152 #NOTE: option to inject additional propagatedBuildInputs
151 153 propagatedBuildInputs =
152 154 attrs.propagatedBuildInputs or [] ++ [
153 155
154 156 ];
155 157
156 158 LC_ALL = "en_US.UTF-8";
157 159 LOCALE_ARCHIVE =
158 160 if pkgs.stdenv.isLinux
159 161 then "${pkgs.glibcLocales}/lib/locale/locale-archive"
160 162 else "";
161 163
162 164 # Add bin directory to path so that tests can find 'rhodecode'.
163 165 preCheck = ''
164 166 export PATH="$out/bin:$PATH"
165 167 '';
166 168
167 169 # custom check phase for testing
168 170 checkPhase = ''
169 171 runHook preCheck
170 172 PYTHONHASHSEED=random py.test -vv -p no:sugar -r xw --cov-config=.coveragerc --cov=rhodecode --cov-report=term-missing rhodecode
171 173 runHook postCheck
172 174 '';
173 175
174 176 postCheck = ''
175 177 echo "Cleanup of rhodecode/tests"
176 178 rm -rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/tests
177 179 '';
178 180
179 181 preBuild = ''
180 182 echo "[BEGIN]: Building frontend assets"
181 183 ${linkNodePackages}
182 184 make web-build
183 185 rm -fr node_modules
184 186 rm -fr node_binaries
185 187 echo "[DONE ]: Building frontend assets"
186 188 '';
187 189
188 190 postInstall = ''
189 191 # check required files
190 192 STATIC_CHECK="/robots.txt /502.html
191 193 /js/scripts.js /js/rhodecode-components.js
192 194 /css/style.css /css/style-polymer.css"
193 195
194 196 for file in $STATIC_CHECK;
195 197 do
196 198 if [ ! -f rhodecode/public/$file ]; then
197 199 echo "Missing $file"
198 200 exit 1
199 201 fi
200 202 done
201 203
202 204 echo "Writing enterprise-ce meta information for rccontrol to nix-support/rccontrol"
203 205 mkdir -p $out/nix-support/rccontrol
204 206 cp -v rhodecode/VERSION $out/nix-support/rccontrol/version
205 207 echo "[DONE ]: enterprise-ce meta information for rccontrol written"
206 208
207 209 mkdir -p $out/etc
208 210 cp configs/production.ini $out/etc
209 211 echo "[DONE ]: saved enterprise-ce production.ini into $out/etc"
210 212
211 213 cp -Rf rhodecode/config/rcextensions $out/etc/rcextensions.tmpl
212 214 echo "[DONE ]: saved enterprise-ce rcextensions into $out/etc/rcextensions.tmpl"
213 215
214 216 # python based programs need to be wrapped
215 217 mkdir -p $out/bin
216 218
217 219 # required binaries from dependencies
218 220 ln -s ${self.supervisor}/bin/supervisorctl $out/bin/
219 221 ln -s ${self.supervisor}/bin/supervisord $out/bin/
220 222 ln -s ${self.pastescript}/bin/paster $out/bin/
221 223 ln -s ${self.channelstream}/bin/channelstream $out/bin/
222 224 ln -s ${self.celery}/bin/celery $out/bin/
223 225 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
224 226 ln -s ${self.pyramid}/bin/prequest $out/bin/
225 227 ln -s ${self.pyramid}/bin/pserve $out/bin/
226 228
227 229 echo "[DONE ]: created symlinks into $out/bin"
228 230 DEPS="$out/bin/supervisorctl \
229 231 $out/bin/supervisord \
230 232 $out/bin/paster \
231 233 $out/bin/channelstream \
232 234 $out/bin/celery \
233 235 $out/bin/gunicorn \
234 236 $out/bin/prequest \
235 237 $out/bin/pserve"
236 238
237 239 # wrap only dependency scripts, they require to have full PYTHONPATH set
238 240 # to be able to import all packages
239 241 for file in $DEPS;
240 242 do
241 243 wrapProgram $file \
242 244 --prefix PATH : $PATH \
243 245 --prefix PYTHONPATH : $PYTHONPATH \
244 246 --set PYTHONHASHSEED random
245 247 done
246 248
247 249 echo "[DONE ]: enterprise-ce binary wrapping"
248 250
249 251 # rhodecode-tools don't need wrapping
250 252 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
251 253
252 254 # expose sources of CE
253 255 ln -s $out $out/etc/rhodecode_enterprise_ce_source
254 256
255 257 # expose static files folder
256 258 cp -Rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/public/ $out/etc/static
257 259 chmod 755 -R $out/etc/static
258 260
259 261 '';
260 262 });
261 263
262 264 };
263 265
264 266 basePythonPackages = with builtins;
265 267 if isAttrs pythonPackages then
266 268 pythonPackages
267 269 else
268 270 getAttr pythonPackages pkgs;
269 271
270 272 pythonGeneratedPackages = import ./pkgs/python-packages.nix {
271 273 inherit
272 274 pkgs;
273 275 inherit
274 276 (pkgs)
275 277 fetchurl
276 278 fetchgit
277 279 fetchhg;
278 280 };
279 281
280 282 pythonCommunityOverrides = import ./pkgs/python-packages-overrides.nix {
281 283 inherit pkgs basePythonPackages;
282 284 };
283 285
284 286 # Apply all overrides and fix the final package set
285 287 myPythonPackagesUnfix = with pkgs.lib;
286 288 (extends pythonExternalOverrides
287 289 (extends pythonLocalOverrides
288 290 (extends pythonCommunityOverrides
289 291 (extends pythonGeneratedPackages
290 292 basePythonPackagesUnfix))));
291 293
292 294 myPythonPackages = (pkgs.lib.fix myPythonPackagesUnfix);
293 295
294 296 in myPythonPackages.rhodecode-enterprise-ce
@@ -1,151 +1,151 b''
1 1 .. _backup-ref:
2 2
3 3 Backup and Restore
4 4 ==================
5 5
6 6 *“The condition of any backup is unknown until a restore is attempted.”*
7 7 `Schrödinger's Backup`_
8 8
9 9 To snapshot an instance of |RCE|, and save its settings, you need to backup the
10 10 following parts of the system at the same time.
11 11
12 12 * The |repos| managed by the instance together with the stored Gists.
13 13 * The |RCE| database.
14 14 * Any configuration files or extensions that you've configured. In most
15 15 cases it's only the :file:`rhodecode.ini` file.
16 16 * Installer files such as those in `/opt/rhodecode` can be backed-up, however
17 17 it's not required since in case of a recovery installer simply
18 18 re-creates those.
19 19
20 20
21 21 .. important::
22 22
23 23 Ideally you should script all of these functions so that it creates a
24 24 backup snapshot of your system at a particular timestamp and then run that
25 25 script regularly.
26 26
27 27 Backup Details
28 28 --------------
29 29
30 30 To backup the relevant parts of |RCE| required to restore your system, use
31 31 the information in this section to identify what is important to you.
32 32
33 33 Repository Backup
34 34 ^^^^^^^^^^^^^^^^^
35 35
36 36 To back up your |repos|, use the API to get a list of all |repos| managed,
37 37 and then clone them to your backup location. This is the most safe backup option.
38 38 Backing up the storage directory could potentially result in a backup of
39 39 partially committed files or commits. (Backup taking place during a big push)
40 40 As an alternative you could use a rsync or simple `cp` commands if you can
41 41 ensure your instance is only in read-only mode or stopped at the moment.
42 42
43 43
44 44 Use the ``get_repos`` method to list all your managed |repos|,
45 45 and use the ``clone_uri`` information that is returned. See the :ref:`api`
46 46 for more information. Be sure to keep the structure or repositories with their
47 47 repository groups.
48 48
49 49 .. important::
50 50
51 51 This will not work for |svn| |repos|. Currently the only way to back up
52 52 your |svn| |repos| is to make a copy of them.
53 53
54 54 It is also important to note, that you can only restore the |svn| |repos|
55 55 using the same version as they were saved with.
56 56
57 57 Database Backup
58 58 ^^^^^^^^^^^^^^^
59 59
60 60 The instance database contains all the |RCE| permissions settings,
61 61 and user management information. To backup your database,
62 62 export it using the following appropriate example, and then move it to your
63 63 backup location:
64 64
65 65 .. code-block:: bash
66 66
67 67 # For MySQL DBs
68 68 $ mysqldump -u <uname> -p <pass> rhodecode_db_name > mysql-db-backup
69 69 # MySQL restore command
70 70 $ mysql -u <uname> -p <pass> rhodecode_db_name < mysql-db-backup
71 71
72 72 # For PostgreSQL DBs
73 73 $ PGPASSWORD=<pass> pg_dump --inserts -U <uname> -h localhost rhodecode_db_name > postgresql-db-backup
74 74 # PosgreSQL restore
75 75 $ PGPASSWORD=<pass> psql -U <uname> -h localhost -d rhodecode_db_name -1 -f postgresql-db-backup
76 76
77 77 # For SQLite
78 78 $ sqlite3 rhodecode.db ‘.dump’ > sqlite-db-backup
79 79 # SQLite restore
80 80 $ copy sqlite-db-backup rhodecode.db
81 81
82 82
83 83 The default |RCE| SQLite database location is
84 84 :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.db`
85 85
86 86 If running MySQL or PostgreSQL databases, you will have configured these
87 87 separately, for more information see :ref:`rhodecode-database-ref`
88 88
89 89 Configuration File Backup
90 90 ^^^^^^^^^^^^^^^^^^^^^^^^^
91 91
92 92 Depending on your setup, you could have a number of configuration files that
93 93 should be backed up. You may have some, or all of the configuration files
94 94 listed in the :ref:`config-rce-files` section. Ideally you should back these
95 95 up at the same time as the database and |repos|. It really depends on if you need
96 96 the configuration file like logs, custom modules. We always recommend backing
97 97 those up.
98 98
99 99 Gist Backup
100 100 ^^^^^^^^^^^
101 101
102 102 To backup the gists on your |RCE| instance you usually have to backup the
103 103 gist storage path. If this haven't been changed it's located inside
104 104 :file:`.rc_gist_store` and the metadata in :file:`.rc_gist_metadata`.
105 105 You can use the ``get_users`` and ``get_gists`` API methods to fetch the
106 106 gists for each user on the instance.
107 107
108 108 Extension Backups
109 109 ^^^^^^^^^^^^^^^^^
110 110
111 111 You should also backup any extensions added in the
112 112 :file:`home/{user}/.rccontrol/{instance-id}/rcextensions` directory.
113 113
114 114 Full-text Search Backup
115 115 ^^^^^^^^^^^^^^^^^^^^^^^
116 116
117 117 You may also have full text search set up, but the index can be rebuild from
118 118 re-imported |repos| if necessary. You will most likely want to backup your
119 :file:`mapping.ini` file if you've configured that. For more information, see
119 :file:`search_mapping.ini` file if you've configured that. For more information, see
120 120 the :ref:`indexing-ref` section.
121 121
122 122 Restoration Steps
123 123 -----------------
124 124
125 125 To restore an instance of |RCE| from its backed up components, to a fresh
126 126 system use the following steps.
127 127
128 128 1. Install a new instance of |RCE| using sqlite option as database.
129 129 2. Restore your database.
130 130 3. Once installed, replace you backed up the :file:`rhodecode.ini` with your
131 131 backup version. Ensure this file points to the restored
132 132 database, see the :ref:`config-database` section.
133 133 4. Restart |RCE| and remap and rescan your |repos| to verify filesystem access,
134 134 see the :ref:`remap-rescan` section.
135 135
136 136
137 137 Post Restoration Steps
138 138 ^^^^^^^^^^^^^^^^^^^^^^
139 139
140 140 Once you have restored your |RCE| instance to basic functionality, you can
141 141 then work on restoring any specific setup changes you had made.
142 142
143 * To recreate the |RCE| index, use the backed up :file:`mapping.ini` file if
143 * To recreate the |RCE| index, use the backed up :file:`search_mapping.ini` file if
144 144 you had made changes and rerun the indexer. See the
145 145 :ref:`indexing-ref` section for details.
146 146 * To reconfigure any extensions, copy the backed up extensions into the
147 147 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions` and also specify
148 148 any custom hooks if necessary. See the :ref:`extensions-hooks-ref` section for
149 149 details.
150 150
151 151 .. _Schrödinger's Backup: http://novabackup.novastor.com/blog/schrodingers-backup-good-bad-backup/
@@ -1,74 +1,74 b''
1 1 .. _config-files:
2 2
3 3 Configuration Files Overview
4 4 ============================
5 5
6 6 |RCE| and |RCC| have a number of different configuration files. The following
7 7 is a brief explanation of each, and links to their associated configuration
8 8 sections.
9 9
10 10 .. rst-class:: dl-horizontal
11 11
12 12 \- **rhodecode.ini**
13 13 Default location:
14 14 :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
15 15
16 16 This is the main |RCE| configuration file and controls much of its
17 17 default behaviour. It is also used to configure certain customer
18 18 settings. Here are some of the most common reasons to make changes to
19 19 this file.
20 20
21 21 * :ref:`config-database`
22 22 * :ref:`set-up-mail`
23 23 * :ref:`increase-gunicorn`
24 24 * :ref:`x-frame`
25 25
26 \- **mapping.ini**
26 \- **search_mapping.ini**
27 27 Default location:
28 :file:`/home/{user}/.rccontrol/{instance-id}/mapping.ini`
28 :file:`/home/{user}/.rccontrol/{instance-id}/search_mapping.ini`
29 29
30 30 This file is used to control the |RCE| indexer. It comes configured
31 31 to index your instance. To change the default configuration, see
32 32 :ref:`advanced-indexing`.
33 33
34 34 \- **vcsserver.ini**
35 35 Default location:
36 36 :file:`/home/{user}/.rccontrol/{vcsserver-id}/vcsserver.ini`
37 37
38 38 The VCS Server handles the connection between your |repos| and |RCE|.
39 39 See the :ref:`vcs-server` section for configuration options and more
40 40 detailed information.
41 41
42 42 \- **supervisord.ini**
43 43 Default location:
44 44 :file:`/home/{user}/.rccontrol/supervisor/supervisord.ini`
45 45
46 46 |RCC| uses Supervisor to monitor and manage installed instances of
47 47 |RCE| and the VCS Server. |RCC| will manage this file completely,
48 48 unless you install |RCE| in self-managed mode. For more information,
49 49 see the :ref:`Supervisor Setup<control:supervisor-setup>` section.
50 50
51 51 \- **.rccontrol.ini**
52 52 Default location: :file:`/home/{user}/.rccontrol.ini`
53 53
54 54 This file contains the instances that |RCC| starts at boot, which is all
55 55 by default, but for more information, see
56 56 the :ref:`Manually Start At Boot <control:set-start-boot>` section.
57 57
58 58 \- **.rhoderc**
59 59 Default location: :file:`/home/{user}/.rhoderc`
60 60
61 61 This file is used by the |RCE| API when accessing an instance from a
62 62 remote machine. The API checks this file for connection and
63 63 authentication details. For more details, see the :ref:`config-rhoderc`
64 64 section.
65 65
66 66 \- **MANIFEST**
67 67 Default location: :file:`/home/{user}/.rccontrol/cache/MANIFEST`
68 68
69 69 |RCC| uses this file to source the latest available builds from the
70 70 secure RhodeCode download channels. The only reason to mess with this file
71 71 is if you need to do an offline installation,
72 72 see the :ref:`Offline Installation<control:offline-installer-ref>`
73 73 instructions, otherwise |RCC| will completely manage this file.
74 74
@@ -1,276 +1,359 b''
1 1 .. _indexing-ref:
2 2
3 3 Full-text Search
4 4 ----------------
5 5
6 By default RhodeCode is configured to use `Whoosh`_ to index |repos| and
7 provide full-text search.
6 RhodeCode provides a full text search capabilities to search inside file content,
7 commit message, and file paths. Indexing is not enabled by default and to use
8 full text search building an index is a pre-requisite.
8 9
9 |RCE| also provides support for `Elasticsearch`_ as a backend for scalable
10 search. See :ref:`enable-elasticsearch` for details.
10 By default RhodeCode is configured to use `Whoosh`_ to index |repos| and
11 provide full-text search. `Whoosh`_ works well for a small amount of data and
12 shouldn't be used in case of large code-bases and lots of repositories.
13
14 |RCE| also provides support for `ElasticSearch 6`_ as a backend more for advanced
15 and scalable search. See :ref:`enable-elasticsearch` for details.
11 16
12 17 Indexing
13 18 ^^^^^^^^
14 19
15 To run the indexer you need to use an |authtoken| with admin rights to all
16 |repos|.
20 To run the indexer you need to have an |authtoken| with admin rights to all |repos|.
17 21
18 To index new content added, you have the option to set the indexer up in a
22 To index repositories stored in RhodeCode, you have the option to set the indexer up in a
19 23 number of ways, for example:
20 24
21 * Call the indexer via a cron job. We recommend running this nightly,
22 unless you need everything indexed immediately.
23 * Set the indexer to infinitely loop and reindex as soon as it has run its
24 cycle.
25 * Call the indexer via a cron job. We recommend running this once at night.
26 In case you need everything indexed immediately it's possible to index few
27 times during the day. Indexer has a special locking mechanism that won't allow
28 two instances of indexer running at once. It's safe to run it even every 1hr.
29 * Set the indexer to infinitely loop and reindex as soon as it has run its previous cycle.
25 30 * Hook the indexer up with your CI server to reindex after each push.
26 31
27 The indexer works by indexing new commits added since the last run. If you
28 wish to build a brand new index from scratch each time,
29 use the ``force`` option in the configuration file.
32 The indexer works by indexing new commits added since the last run, and comparing
33 file changes to index only new or modified files.
34 If you wish to build a brand new index from scratch each time, use the ``force``
35 option in the configuration file, or run it with --force flag.
30 36
31 37 .. important::
32 38
33 39 You need to have |RCT| installed, see :ref:`install-tools`. Since |RCE|
34 3.5.0 they are installed by default.
40 3.5.0 they are installed by default and available with community/enterprise installations.
35 41
36 42 To set up indexing, use the following steps:
37 43
38 44 1. :ref:`config-rhoderc`, if running tools remotely.
39 45 2. :ref:`run-index`
40 46 3. :ref:`set-index`
41 47 4. :ref:`advanced-indexing`
42 48
43 49 .. _config-rhoderc:
44 50
45 51 Configure the ``.rhoderc`` File
46 52 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
47 53
54 .. note::
55
56 Optionally it's possible to use indexer without the ``.rhoderc``. Simply instead of
57 executing with `--instance-name=enterprise-1` execute providing the host and token
58 directly: `--api-host=http://127.0.0.1:10000 --api-key=<auth-token-goes-here>`
59
60
48 61 |RCT| uses the :file:`/home/{user}/.rhoderc` file for connection details
49 62 to |RCE| instances. If this file is not automatically created,
50 63 you can configure it using the following example. You need to configure the
51 64 details for each instance you want to index.
52 65
53 66 .. code-block:: bash
54 67
55 68 # Check the instance details
56 69 # of the instance you want to index
57 70 $ rccontrol status
58 71
59 - NAME: enterprise-1
60 - STATUS: RUNNING
61 - TYPE: Momentum
62 - VERSION: 1.5.0
63 - URL: http://127.0.0.1:10000
72 - NAME: enterprise-1
73 - STATUS: RUNNING
74 - TYPE: Enterprise
75 - VERSION: 4.1.0
76 - URL: http://127.0.0.1:10003
64 77
65 78 To get your API Token, on the |RCE| interface go to
66 79 :menuselection:`username --> My Account --> Auth tokens`
67 80
68 81 .. code-block:: ini
69 82
70 83 # Configure .rhoderc with matching details
71 84 # This allows the indexer to connect to the instance
72 85 [instance:enterprise-1]
73 86 api_host = http://127.0.0.1:10000
74 87 api_key = <auth token goes here>
75 repo_dir = /home/<username>/repos
88
76 89
77 90 .. _run-index:
78 91
79 92 Run the Indexer
80 93 ^^^^^^^^^^^^^^^
81 94
82 Run the indexer using the following command, and specify the instance you
83 want to index:
95 Run the indexer using the following command, and specify the instance you want to index:
84 96
85 97 .. code-block:: bash
86 98
87 # From inside a virtualevv
88 (venv)$ rhodecode-index --instance-name=enterprise-1
89
90 # Using default installation
99 # Using default simples indexing of all repositories
91 100 $ /home/user/.rccontrol/enterprise-1/profile/bin/rhodecode-index \
92 101 --instance-name=enterprise-1
93 102
94 # Using a custom mapping file
103 # Using a custom mapping file with indexing rules, and using elasticsearch 6 backend
95 104 $ /home/user/.rccontrol/enterprise-1/profile/bin/rhodecode-index \
96 105 --instance-name=enterprise-1 \
97 --mapping=/home/user/.rccontrol/enterprise-1/mapping.ini
106 --mapping=/home/user/.rccontrol/enterprise-1/search_mapping.ini \
107 --es-version=6 --engine-location=http://elasticsearch-host:9200
108
109 # Using a custom mapping file and invocation without ``.rhoderc``
110 $ /home/user/.rccontrol/enterprise-1/profile/bin/rhodecode-index \
111 --api-host=http://rhodecodecode.myserver.com --api-key=xxxxx \
112 --mapping=/home/user/.rccontrol/enterprise-1/search_mapping.ini
113
114 # From inside a virtualev on your local machine or CI server.
115 (venv)$ rhodecode-index --instance-name=enterprise-1
116
98 117
99 118 .. note::
100 119
101 120 In case of often indexing the index may become fragmented. Most often a result of that
102 121 is error about `too many open files`. To fix this indexer needs to be executed with
103 122 --optimize flag. E.g `rhodecode-index --instance-name=enterprise-1 --optimize`
104 123 This should be executed regularly, once a week is recommended.
105 124
106 125
107 126 .. _set-index:
108 127
109 128 Schedule the Indexer
110 129 ^^^^^^^^^^^^^^^^^^^^
111 130
112 131 To schedule the indexer, configure the crontab file to run the indexer inside
113 132 your |RCT| virtualenv using the following steps.
114 133
115 134 1. Open the crontab file, using ``crontab -e``.
116 135 2. Add the indexer to the crontab, and schedule it to run as regularly as you
117 136 wish.
118 137 3. Save the file.
119 138
120 139 .. code-block:: bash
121 140
122 141 $ crontab -e
123 142
124 143 # The virtualenv can be called using its full path, so for example you can
125 144 # put this example into the crontab
126 145
127 146 # Run the indexer daily at 4am using the default mapping settings
128 147 * 4 * * * /home/ubuntu/.virtualenv/rhodecode-venv/bin/rhodecode-index \
129 148 --instance-name=enterprise-1
130 149
131 150 # Run the indexer every Sunday at 3am using default mapping
132 151 * 3 * * 0 /home/ubuntu/.virtualenv/rhodecode-venv/bin/rhodecode-index \
133 152 --instance-name=enterprise-1
134 153
135 154 # Run the indexer every 15 minutes
136 155 # using a specially configured mapping file
137 156 */15 * * * * ~/.rccontrol/enterprise-4/profile/bin/rhodecode-index \
138 157 --instance-name=enterprise-4 \
139 --mapping=/home/user/.rccontrol/enterprise-4/mapping.ini
158 --mapping=/home/user/.rccontrol/enterprise-4/search_mapping.ini
140 159
141 160 .. _advanced-indexing:
142 161
143 162 Advanced Indexing
144 163 ^^^^^^^^^^^^^^^^^
145 164
146 |RCT| indexes based on the :file:`mapping.ini` file. To configure your index,
147 you can specify different options in this file. The default location is:
165
166 Force Re-Indexing single repository
167 +++++++++++++++++++++++++++++++++++
168
169 Often it's required to re-index whole repository because of some repository changes,
170 or to remove some indexed secrets, or files. There's a special `--repo-name=` flag
171 for the indexer that limits execution to a single repository. For example to force-reindex
172 single repository such call can be made::
173
174 rhodecode-index --instance-name=enterprise-1 --force --repo-name=rhodecode-vcsserver
175
176
177 Removing repositories from index
178 ++++++++++++++++++++++++++++++++
148 179
149 * :file:`/home/{user}/.rccontrol/{instance-id}/mapping.ini`, using default
150 |RCT|.
180 The indexer automatically removes renamed repositories and builds index for new names.
181 In the same way if a listed repository in mapping.ini is not reported existing by the
182 server it's removed from the index.
183 In case that you wish to remove indexed repository manually such call would allow that::
184
185 rhodecode-index --instance-name=enterprise-1 --remove-only --repo-name=rhodecode-vcsserver
186
187
188 Using search_mapping.ini file for advanced index rules
189 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
190
191 By default rhodecode-index runs for all repositories, all files with parsing limits
192 defined by the CLI default arguments. You can change those limits by calling with
193 different flags such as `--max-filesize=2048kb` or `--repo-limit=10`
194
195 For more advanced execution logic it's possible to use a configuration file that
196 would define detailed rules which repositories and how should be indexed.
197
198 |RCT| provides an example index configuration file called :file:`search_mapping.ini`.
199 This file is created by default during installation and is located at:
200
201 * :file:`/home/{user}/.rccontrol/{instance-id}/search_mapping.ini`, using default |RCT|.
151 202 * :file:`~/venv/lib/python2.7/site-packages/rhodecode_tools/templates/mapping.ini`,
152 203 when using ``virtualenv``.
153 204
154 205 .. note::
155 206
156 If you need to create the :file:`mapping.ini` file, use the |RCT|
157 ``rhodecode-index --create-mapping path/to/file`` API call. For details,
158 see the :ref:`tools-cli` section.
159
160 The indexer runs in a random order to prevent a failing |repo| from stopping
161 a build. To configure different indexing scenarios, set the following options
162 inside the :file:`mapping.ini` and specify the altered file using the
163 ``--mapping`` option.
207 If you need to create the :file:`search_mapping.ini` file manually, use the |RCT|
208 ``rhodecode-index --create-mapping path/to/search_mapping.ini`` API call.
209 For details, see the :ref:`tools-cli` section.
164 210
165 * ``index_files`` : Index the specified file types.
166 * ``skip_files`` : Do not index the specified file types.
167 * ``index_files_content`` : Index the content of the specified file types.
168 * ``skip_files_content`` : Do not index the content of the specified files.
169 * ``force`` : Create a fresh index on each run.
170 * ``max_filesize`` : Files larger than the set size will not be indexed.
171 * ``commit_parse_limit`` : Set the batch size when indexing commit messages.
172 Set to a lower number to lessen memory load.
173 * ``repo_limit`` : Set the maximum number or |repos| indexed per run.
174 * ``[INCLUDE]`` : Set |repos| you want indexed. This takes precedent over
175 ``[EXCLUDE]``.
176 * ``[EXCLUDE]`` : Set |repos| you do not want indexed. Exclude can be used to
177 not index branches, forks, or log |repos|.
211 To Run the indexer with mapping file provide it using `--mapping` flag::
178 212
179 At the end of the file you can specify conditions for specific |repos| that
180 will override the default values. To configure your indexer,
181 use the following example :file:`mapping.ini` file.
213 rhodecode-index --instance-name=enterprise-1 --mapping=/my/path/search_mapping.ini
214
215
216 Here's a detailed example of using :file:`search_mapping.ini` file.
182 217
183 218 .. code-block:: ini
184 219
185 220 [__DEFAULT__]
186 # default patterns for indexing files and content of files.
187 # Binary files are skipped by default.
221 ; Create index on commits data, and files data in this order. Available options
222 ; are `commits`, `files`
223 index_types = commits,files
224
225 ; Commit fetch limit. In what amount of chunks commits should be fetched
226 ; via api and parsed. This allows server to transfer smaller chunks and be less loaded
227 commit_fetch_limit = 1000
188 228
189 # Index python and markdown files
190 index_files = *.py, *.md
229 ; Commit process limit. Limit the number of commits indexer should fetch, and
230 ; store inside the full text search index. eg. if repo has 2000 commits, and
231 ; limit is 1000, on the first run it will process commits 0-1000 and on the
232 ; second 1000-2000 commits. Help reduce memory usage, default is 50000
233 ; (set -1 for unlimited)
234 commit_process_limit = 20000
191 235
192 # Do not index these file types
193 skip_files = *.svg, *.log, *.dump, *.txt
236 ; Limit of how many repositories each run can process, default is -1 (unlimited)
237 ; in case of 1000s of repositories it's better to execute in chunks to not overload
238 ; the server.
239 repo_limit = -1
194 240
195 # Index both file types and their content
196 index_files_content = *.cpp, *.ini, *.py
241 ; Default patterns for indexing files and content of files. Binary files
242 ; are skipped by default.
243
244 ; Add to index those comma separated files; globs syntax
245 ; e.g index_files = *.py, *.c, *.h, *.js
246 index_files = *,
247
248 ; Do not add to index those comma separated files, this excludes
249 ; both search by name and content; globs syntax
250 ; e.g index_files = *.key, *.sql, *.xml, *.pem, *.crt
251 skip_files = ,
197 252
198 # Index file names, but not file content
199 skip_files_content = *.svg,
253 ; Add to index content of those comma separated files; globs syntax
254 ; e.g index_files = *.h, *.obj
255 index_files_content = *,
200 256
201 # Force rebuilding an index from scratch. Each repository will be rebuild
202 # from scratch with a global flag. Use local flag to rebuild single repos
257 ; Do not add to index content of those comma separated files; globs syntax
258 ; Binary files are not indexed by default.
259 ; e.g index_files = *.min.js, *.xml, *.dump, *.log, *.dump
260 skip_files_content = ,
261
262 ; Force rebuilding an index from scratch. Each repository will be rebuild from
263 ; scratch with a global flag. Use --repo-name=NAME --force to rebuild single repo
203 264 force = false
204 265
205 # Do not index files larger than 385KB
206 max_filesize = 385KB
266 ; maximum file size that indexer will use, files above that limit are not going
267 ; to have they content indexed.
268 ; Possible options are KB (kilobytes), MB (megabytes), eg 1MB or 1024KB
269 max_filesize = 10MB
207 270
208 # Limit commit indexing to 500 per batch
209 commit_parse_limit = 500
210
211 # Limit each index run to 25 repos
212 repo_limit = 25
213 271
214 # __INCLUDE__ is more important that __EXCLUDE__.
215
216 [__INCLUDE__]
217 # Include all repos with these names
272 [__INDEX_RULES__]
273 ; Ordered match rules for repositories. A list of all repositories will be fetched
274 ; using API and this list will be filtered using those rules.
275 ; Syntax for entry: `glob_pattern_OR_full_repo_name = 0 OR 1` where 0=exclude, 1=include
276 ; When this ordered list is traversed first match will return the include/exclude marker
277 ; For example:
278 ; upstream/binary_repo = 0
279 ; upstream/subrepo/xml_files = 0
280 ; upstream/* = 1
281 ; special-repo = 1
282 ; * = 0
283 ; This will index all repositories under upstream/*, but skip upstream/binary_repo
284 ; and upstream/sub_repo/xml_files, last * = 0 means skip all other matches
218 285
219 docs/* = 1
220 lib/* = 1
221
222 [__EXCLUDE__]
223 # Do not include the following repo in index
224 286
225 dev-docs/* = 1
226 legacy-repos/* = 1
227 *-dev/* = 1
228
229 # Each repo that needs special indexing is a separate section below.
230 # In each section set the options to override the global configuration
231 # parameters above.
232 # If special settings are not configured, the global configuration values
233 # above are inherited. If no special repositories are
234 # defined here RhodeCode will use the API to ask for all repositories
287 ; == EXPLICIT REPOSITORY INDEXING ==
288 ; If defined this will skip using __INDEX_RULES__, and will not use API to fetch
289 ; list of repositories, it will explicitly take names defined with [NAME] format and
290 ; try to build the index, to build index just for repo_name_1 and special-repo use:
291 ; [repo_name_1]
292 ; [special-repo]
235 293
236 # For this repo use different settings
237 [special-repo]
238 commit_parse_limit = 20,
239 skip_files = *.idea, *.xml,
294 ; == PER REPOSITORY CONFIGURATION ==
295 ; This allows overriding the global configuration per repository.
296 ; example to set specific file limit, and skip certain files for repository special-repo
297 ; the CLI flags doesn't override the conf settings.
298 ; [conf:special-repo]
299 ; max_filesize = 5mb
300 ; skip_files = *.xml, *.sql
301
240 302
241 # For another repo use different settings
242 [another-special-repo]
243 index_files = *,
244 max_filesize = 800MB
245 commit_parse_limit = 20000
303
304 In case of 1000s of repositories it can be tricky to write the include/exclude rules at first.
305 There's a special flag to test the mapping file rules and list repositories that would
306 be indexed. Run the indexer with `--show-matched-repos` to list only the
307 match repositories defined in .ini file rules::
308
309 rhodecode-index --instance-name=enterprise-1 --show-matched-repos --mapping=/my/path/search_mapping.ini
310
246 311
247 312 .. _enable-elasticsearch:
248 313
249 Enabling Elasticsearch
314 Enabling ElasticSearch
250 315 ^^^^^^^^^^^^^^^^^^^^^^
251 316
317 ElasticSearch is available in EE edition only. It provides much scalable and more advanced
318 search capabilities. While Whoosh is fine for upto 1-2GB of data, beyond that amount it
319 starts slowing down, and can cause other problems.
320 New ElasticSearch 6 also provides much more advanced query language.
321 It allows advanced filtering by file paths, extensions, use OR statements, ranges etc.
322 Please check query language examples in the search field for some advanced query language usage.
323
324
252 325 1. Open the :file:`rhodecode.ini` file for the instance you wish to edit. The
253 326 default location is
254 327 :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
255 328 2. Find the search configuration section:
256 329
257 330 .. code-block:: ini
258 331
259 332 ###################################
260 333 ## SEARCH INDEXING CONFIGURATION ##
261 334 ###################################
262 335
263 336 search.module = rhodecode.lib.index.whoosh
264 337 search.location = %(here)s/data/index
265 338
266 339 and change it to:
267 340
268 341 .. code-block:: ini
269 342
270 343 search.module = rc_elasticsearch
271 search.location = http://localhost:9200/
344 search.location = http://localhost:9200
345 ## specify Elastic Search version, 6 for latest or 2 for legacy
346 search.es_version = 6
347
348 where ``search.location`` points to the ElasticSearch server
349 by default running on port 9200.
272 350
273 where ``search.location`` points to the elasticsearch server.
351 Index invocation also needs change. Please provide --es-version= and
352 --engine-location= parameters to define ElasticSearch server location and it's version.
353 For example::
354
355 rhodecode-index --instace-name=enterprise-1 --es-version=6 --engine-location=http://localhost:9200
356
274 357
275 358 .. _Whoosh: https://pypi.python.org/pypi/Whoosh/
276 .. _Elasticsearch: https://www.elastic.co/ No newline at end of file
359 .. _ElasticSearch 6: https://www.elastic.co/
@@ -1,161 +1,192 b''
1 1 Nginx Configuration Example
2 2 ---------------------------
3 3
4 4 Use the following example to configure Nginx as a your web server.
5 5
6 6
7 7 .. code-block:: nginx
8 8
9 9 ## Rate limiter for certain pages to prevent brute force attacks
10 10 limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s;
11 11
12 ## cache zone
13 proxy_cache_path /etc/nginx/nginx_cache levels=1:2 use_temp_path=off keys_zone=cache_zone:10m inactive=720h max_size=10g;
14
12 15 ## Custom log format
13 16 log_format log_custom '$remote_addr - $remote_user [$time_local] '
14 17 '"$request" $status $body_bytes_sent '
15 18 '"$http_referer" "$http_user_agent" '
16 19 '$request_time $upstream_response_time $pipe';
17 20
18 21 ## Define one or more upstreams (local RhodeCode instance) to connect to
19 22 upstream rc {
20 23 # Url to running RhodeCode instance.
21 24 # This is shown as `- URL: <host>` in output from rccontrol status.
22 25 server 127.0.0.1:10002;
23 26
24 27 # add more instances for load balancing
25 28 # server 127.0.0.1:10003;
26 29 # server 127.0.0.1:10004;
27 30 }
28 31
29 32 ## HTTP to HTTPS rewrite
30 33 server {
31 34 listen 80;
32 35 server_name rhodecode.myserver.com;
33 36
34 37 if ($http_host = rhodecode.myserver.com) {
35 38 rewrite (.*) https://rhodecode.myserver.com$1 permanent;
36 39 }
37 40 }
38 41
39 42 ## Optional gist alias server, for serving nicer GIST urls.
40 43 server {
41 44 listen 443;
42 45 server_name gist.myserver.com;
43 46 access_log /var/log/nginx/gist.access.log log_custom;
44 47 error_log /var/log/nginx/gist.error.log;
45 48
46 49 ssl on;
47 50 ssl_certificate gist.rhodecode.myserver.com.crt;
48 51 ssl_certificate_key gist.rhodecode.myserver.com.key;
49 52
50 53 ssl_session_timeout 5m;
51 54
52 55 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
53 56 ssl_prefer_server_ciphers on;
54 57 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';
55 58
56 59 ## Strict http prevents from https -> http downgrade
57 60 add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
58 61
59 62 ## Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
60 63 #ssl_dhparam /etc/nginx/ssl/dhparam.pem;
61 64
62 65 rewrite ^/(.+)$ https://rhodecode.myserver.com/_admin/gists/$1;
63 66 rewrite (.*) https://rhodecode.myserver.com/_admin/gists;
64 67 }
65 68
66 69
67 70 ## MAIN SSL enabled server
68 71 server {
69 72 listen 443 ssl http2;
70 73 server_name rhodecode.myserver.com;
71 74
72 75 access_log /var/log/nginx/rhodecode.access.log log_custom;
73 76 error_log /var/log/nginx/rhodecode.error.log;
74 77
75 78 ssl_certificate rhodecode.myserver.com.crt;
76 79 ssl_certificate_key rhodecode.myserver.com.key;
77 80
78 81 # enable session resumption to improve https performance
79 82 # http://vincent.bernat.im/en/blog/2011-ssl-session-reuse-rfc5077.html
80 83 ssl_session_cache shared:SSL:50m;
81 84 ssl_session_timeout 5m;
82 85
83 86 ## Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
84 87 #ssl_dhparam /etc/nginx/ssl/dhparam.pem;
85 88
86 89 # enables server-side protection from BEAST attacks
87 90 # http://blog.ivanristic.com/2013/09/is-beast-still-a-threat.html
88 91 ssl_prefer_server_ciphers on;
89 92
90 93 # disable SSLv3(enabled by default since nginx 0.8.19) since it's less secure then TLS http://en.wikipedia.org/wiki/Secure_Sockets_Layer#SSL_3.0
91 94 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
92 95
93 96 # ciphers chosen for forward secrecy and compatibility
94 97 # http://blog.ivanristic.com/2013/08/configuring-apache-nginx-and-openssl-for-forward-secrecy.html
95 98 ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
96 99
97 100 client_body_buffer_size 128k;
98 101 # maximum number and size of buffers for large headers to read from client request
99 102 large_client_header_buffers 16 256k;
100 103
101 104 ## uncomment to serve static files by Nginx, recommended for performance
102 105 # location /_static/rhodecode {
103 106 # gzip on;
104 107 # gzip_min_length 500;
105 108 # gzip_proxied any;
106 109 # gzip_comp_level 4;
107 110 # gzip_types text/css text/javascript text/xml text/plain text/x-component application/javascript application/json application/xml application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
108 111 # gzip_vary on;
109 112 # gzip_disable "msie6";
110 113 # alias /path/to/.rccontrol/community-1/static;
111 114 # alias /path/to/.rccontrol/enterprise-1/static;
112 115 # }
113 116
114 117 ## channelstream location handler, if channelstream live chat and notifications
115 118 ## are enable this will proxy the requests to channelstream websocket server
116 119 location /_channelstream {
117 120 rewrite /_channelstream/(.*) /$1 break;
118 121 gzip off;
119 122 tcp_nodelay off;
120 123
121 124 proxy_connect_timeout 10;
122 125 proxy_send_timeout 10m;
123 126 proxy_read_timeout 10m;
124 127
125 128 proxy_set_header Host $host;
126 129 proxy_set_header X-Real-IP $remote_addr;
127 130 proxy_set_header X-Url-Scheme $scheme;
128 131 proxy_set_header X-Forwarded-Proto $scheme;
129 132 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
130 133
131 134 proxy_http_version 1.1;
132 135 proxy_set_header Upgrade $http_upgrade;
133 136 proxy_set_header Connection "upgrade";
134 137
135 138 proxy_pass http://127.0.0.1:9800;
136 139 }
137 140
138 141 ## rate limit this endpoint to prevent login page brute-force attacks
139 142 location /_admin/login {
140 143 limit_req zone=req_limit burst=10 nodelay;
141 144 try_files $uri @rhodecode_http;
142 145 }
143 146
147 ## Special Cache for file store, make sure you enable this intentionally as
148 ## it could bypass upload files permissions
149 # location /_file_store/download {
150 #
151 # proxy_cache cache_zone;
152 # # ignore Set-Cookie
153 # proxy_ignore_headers Set-Cookie;
154 # proxy_ignore_headers Cookie;
155 #
156 # proxy_cache_key $host$uri$is_args$args;
157 # proxy_cache_methods GET;
158 #
159 # proxy_cache_bypass $http_cache_control;
160 # proxy_cache_valid 200 302 720h;
161 #
162 # proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
163 #
164 # # returns cache status in headers
165 # add_header X-Proxy-Cache $upstream_cache_status;
166 # add_header Cache-Control "public";
167 #
168 # proxy_cache_lock on;
169 # proxy_cache_lock_age 5m;
170 #
171 # proxy_pass http://rc;
172 #
173 # }
174
144 175 location / {
145 176 try_files $uri @rhodecode_http;
146 177 }
147 178
148 179 location @rhodecode_http {
149 180 # example of proxy.conf can be found in our docs.
150 181 include /etc/nginx/proxy.conf;
151 182 proxy_pass http://rc;
152 183 }
153 184
154 185 ## Custom 502 error page.
155 186 ## Will be displayed while RhodeCode server is turned off
156 187 error_page 502 /502.html;
157 188 location = /502.html {
158 189 #root /path/to/.rccontrol/community-1/static;
159 190 root /path/to/.rccontrol/enterprise-1/static;
160 191 }
161 192 } No newline at end of file
@@ -1,45 +1,45 b''
1 1 .. _set-repo-perms:
2 2
3 3 Setting Repository Permissions
4 4 ------------------------------
5 5
6 6 To set the permissions on an individual |repo|, use the following steps:
7 7
8 8 1. Open :menuselection:`Admin --> Repositories` and select
9 9 :guilabel:`edit` beside the |repo| you wish to configure.
10 10 2. On the |repo| settings page you will see a number of tabs. Exploring these
11 11 you will find the following main configuration options for a |repo|.
12 12 3. Once you make changes, select :guilabel:`Save`
13 13
14 14 * :guilabel:`Repository group`: Lets you to add a |repo| to a |repo| group.
15 15 * :guilabel:`Owner`: Lets you change the |repo| owner. Useful when users are
16 16 moving roles within an organisation.
17 17 * :guilabel:`Enable automatic locking`: For more information,
18 18 see :ref:`repo-locking`
19 19 * :guilabel:`User Access`: On the permissions tab you can add users,
20 20 or user groups, and set the permissions each has for that |repo|.
21 21 * :guilabel:`Invalidate repository cache`: On the Caches tab you can delete
22 22 the |repo| cache, sometimes needed when mirroring.
23 23
24 24 .. _set-repo-group-perms:
25 25
26 26 Setting Repository Group Permissions
27 27 ------------------------------------
28 28
29 29 To set the permissions on a Repository Group, use the following steps:
30 30
31 31 1. Open :menuselection:`Admin --> Repository groups` and select
32 32 :guilabel:`edit` beside the |repo| you wish to configure.
33 33 2. On the |repo| group settings page you will see a number of tabs. Exploring
34 34 these you will find the following main configuration options:
35 35
36 36 * :guilabel:`Owner`: Lets you change the group owner. Useful when users are
37 37 moving roles within an organisation.
38 * :guilabel:`Group parent`: Lets you add the |repo| group as a sub-group
38 * :guilabel:`Repository group`: Lets you add the |repo| group as a sub-group
39 39 of a larger group, i.e. :guilabel:`QA-Repos >> QA-Repos-Berlin`
40 40 * :guilabel:`Enable automatic locking`: For more information,
41 41 see :ref:`repo-locking`
42 42 * :guilabel:`User Access`: On the permissions tab you can add users,
43 43 or user groups, and set the permissions each has for that |repo| group.
44 44 * :guilabel:`Add Child Group`: Allows you to add sub-repository-groups
45 45 that will all share the same permissions.
@@ -1,32 +1,34 b''
1 1 .. _rhodecode-admin-ref:
2 2
3 3 System Administration
4 4 =====================
5 5
6 6 The following are the most common system administration tasks.
7 7
8 8 .. only:: latex
9 9
10 10 * :ref:`vcs-server`
11 11 * :ref:`apache-ws-ref`
12 12 * :ref:`nginx-ws-ref`
13 13 * :ref:`rhodecode-tuning-ref`
14 14 * :ref:`indexing-ref`
15 15 * :ref:`rhodecode-reset-ref`
16 16
17 17 .. toctree::
18 18
19 19 config-files-overview
20 20 vcs-server
21 21 svn-http
22 22 svn-path-permissions
23 23 gunicorn-ssl-support
24 24 apache-config
25 25 nginx-config
26 26 backup-restore
27 27 tuning-rhodecode
28 28 indexing
29 29 reset-information
30 30 enable-debug
31 31 admin-tricks
32 32 cleanup-cmds
33 restore-deleted-repositories
34
@@ -1,171 +1,171 b''
1 1 .. _system-overview-ref:
2 2
3 3 System Overview
4 4 ===============
5 5
6 6 Latest Version
7 7 --------------
8 8
9 9 * |release| on Unix and Windows systems.
10 10
11 11 System Architecture
12 12 -------------------
13 13
14 14 The following diagram shows a typical production architecture.
15 15
16 16 .. image:: ../images/architecture-diagram.png
17 17 :align: center
18 18
19 19 Supported Operating Systems
20 20 ---------------------------
21 21
22 22 Linux
23 23 ^^^^^
24 24
25 25 * Ubuntu 14.04
26 26 * CentOS 6.2 and 7
27 27 * Debian 7.8
28 28 * RedHat Fedora
29 29 * Arch Linux
30 30 * SUSE Linux
31 31
32 32 Windows
33 33 ^^^^^^^
34 34
35 35 * Windows Vista Ultimate 64bit
36 36 * Windows 7 Ultimate 64bit
37 37 * Windows 8 Professional 64bit
38 38 * Windows 8.1 Enterprise 64bit
39 39 * Windows Server 2008 64bit
40 40 * Windows Server 2008-R2 64bit
41 41 * Windows Server 2012 64bit
42 42
43 43 Supported Databases
44 44 -------------------
45 45
46 46 * SQLite
47 47 * MySQL
48 48 * MariaDB
49 49 * PostgreSQL
50 50
51 51 Supported Browsers
52 52 ------------------
53 53
54 54 * Chrome
55 55 * Safari
56 56 * Firefox
57 57 * Internet Explorer 10 & 11
58 58
59 59 System Requirements
60 60 -------------------
61 61
62 62 |RCE| performs best on machines with ultra-fast hard disks. Generally disk
63 63 performance is more important than CPU performance. In a corporate production
64 64 environment handling 1000s of users and |repos| you should deploy on a 12+
65 65 core 64GB RAM server. In short, the more RAM the better.
66 66
67 67
68 68 For example:
69 69
70 70 - for team of 1 - 5 active users you can run on 1GB RAM machine with 1CPU
71 71 - above 250 active users, |RCE| needs at least 8GB of memory.
72 72 Number of CPUs is less important, but recommended to have at least 2-3 CPUs
73 73
74 74
75 75 .. _config-rce-files:
76 76
77 77 Configuration Files
78 78 -------------------
79 79
80 80 * :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
81 * :file:`/home/{user}/.rccontrol/{instance-id}/mapping.ini`
81 * :file:`/home/{user}/.rccontrol/{instance-id}/search_mapping.ini`
82 82 * :file:`/home/{user}/.rccontrol/{vcsserver-id}/vcsserver.ini`
83 83 * :file:`/home/{user}/.rccontrol/supervisor/supervisord.ini`
84 84 * :file:`/home/{user}/.rccontrol.ini`
85 85 * :file:`/home/{user}/.rhoderc`
86 86 * :file:`/home/{user}/.rccontrol/cache/MANIFEST`
87 87
88 88 For more information, see the :ref:`config-files` section.
89 89
90 90 Log Files
91 91 ---------
92 92
93 93 * :file:`/home/{user}/.rccontrol/{instance-id}/enterprise.log`
94 94 * :file:`/home/{user}/.rccontrol/{vcsserver-id}/vcsserver.log`
95 95 * :file:`/home/{user}/.rccontrol/supervisor/supervisord.log`
96 96 * :file:`/tmp/rccontrol.log`
97 97 * :file:`/tmp/rhodecode_tools.log`
98 98
99 99 Storage Files
100 100 -------------
101 101
102 102 * :file:`/home/{user}/.rccontrol/{instance-id}/data/index/{index-file.toc}`
103 103 * :file:`/home/{user}/repos/.rc_gist_store`
104 104 * :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.db`
105 105 * :file:`/opt/rhodecode/store/{unique-hash}`
106 106
107 107 Default Repositories Location
108 108 -----------------------------
109 109
110 110 * :file:`/home/{user}/repos`
111 111
112 112 Connection Methods
113 113 ------------------
114 114
115 115 * HTTPS
116 116 * SSH
117 117 * |RCE| API
118 118
119 119 Internationalization Support
120 120 ----------------------------
121 121
122 122 Currently available in the following languages, see `Transifex`_ for the
123 123 latest details. If you want a new language added, please contact us. To
124 124 configure your language settings, see the :ref:`set-lang` section.
125 125
126 126 .. hlist::
127 127
128 128 * Belorussian
129 129 * Chinese
130 130 * French
131 131 * German
132 132 * Italian
133 133 * Japanese
134 134 * Portuguese
135 135 * Polish
136 136 * Russian
137 137 * Spanish
138 138
139 139 Licencing Information
140 140 ---------------------
141 141
142 142 * See licencing information `here`_
143 143
144 144 Peer-to-peer Failover Support
145 145 -----------------------------
146 146
147 147 * Yes
148 148
149 149 Additional Binaries
150 150 -------------------
151 151
152 152 * Yes, see :ref:`rhodecode-nix-ref` for full details.
153 153
154 154 Remote Connectivity
155 155 -------------------
156 156
157 157 * Available
158 158
159 159 Executable Files
160 160 ----------------
161 161
162 162 Windows: :file:`RhodeCode-installer-{version}.exe`
163 163
164 164 Deprecated Support
165 165 ------------------
166 166
167 167 - Internet Explorer 8 support deprecated since version 3.7.0.
168 168 - Internet Explorer 9 support deprecated since version 3.8.0.
169 169
170 170 .. _here: https://rhodecode.com/licenses/
171 171 .. _Transifex: https://www.transifex.com/projects/p/RhodeCode/
@@ -1,208 +1,209 b''
1 1 .. _api:
2 2
3 3 API Documentation
4 4 =================
5 5
6 6 The |RCE| API uses a single scheme for calling all API methods. The API is
7 7 implemented with JSON protocol in both directions. To send API requests to
8 8 your instance of |RCE|, use the following URL format
9 9 ``<your_server>/_admin``
10 10
11 11 .. note::
12 12
13 13 To use the API, you should configure the :file:`~/.rhoderc` file with
14 14 access details per instance. For more information, see
15 15 :ref:`config-rhoderc`.
16 16
17 17
18 18 API ACCESS FOR WEB VIEWS
19 19 ------------------------
20 20
21 21 API access can also be turned on for each web view in |RCE| that is
22 22 decorated with a `@LoginRequired` decorator. To enable API access, change
23 23 the standard login decorator to `@LoginRequired(api_access=True)`.
24 24
25 25 From |RCE| version 1.7.0 you can configure a white list
26 26 of views that have API access enabled by default. To enable these,
27 27 edit the |RCE| configuration ``.ini`` file. The default location is:
28 28
29 29 * |RCE| Pre-2.2.7 :file:`root/rhodecode/data/production.ini`
30 30 * |RCE| 3.0 :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
31 31
32 32 To configure the white list, edit this section of the file. In this
33 33 configuration example, API access is granted to the patch/diff raw file and
34 34 archive.
35 35
36 36 .. code-block:: ini
37 37
38 38 ## List of controllers (using glob syntax) that AUTH TOKENS could be used for access.
39 39 ## Adding ?auth_token = <token> to the url authenticates this request as if it
40 40 ## came from the the logged in user who own this authentication token.
41 41 ##
42 42 ## Syntax is <ControllerClass>:<function_pattern>.
43 43 ## The list should be "," separated and on a single line.
44 44 ##
45 45 api_access_controllers_whitelist = RepoCommitsView:repo_commit_raw,RepoCommitsView:repo_commit_patch,RepoCommitsView:repo_commit_download
46 46
47 47 After this change, a |RCE| view can be accessed without login by adding a
48 48 GET parameter ``?auth_token=<auth_token>`` to a url. For example to
49 49 access the raw diff.
50 50
51 51 .. code-block:: html
52 52
53 53 http://<server>/<repo>/changeset-diff/<sha>?auth_token=<auth_token>
54 54
55 55 By default this is only enabled on RSS/ATOM feed views. Exposing raw diffs is a
56 56 good way to integrate with 3rd party services like code review, or build farms
57 57 that could download archives.
58 58
59 59 API ACCESS
60 60 ----------
61 61
62 62 All clients are required to send JSON-RPC spec JSON data.
63 63
64 64 .. code-block:: bash
65 65
66 66 {
67 67 "id:"<id>",
68 68 "auth_token":"<auth_token>",
69 69 "method":"<method_name>",
70 70 "args":{"<arg_key>":"<arg_val>"}
71 71 }
72 72
73 73 Example call for auto pulling from remote repositories using curl:
74 74
75 75 .. code-block:: bash
76 76
77 77 curl https://server.com/_admin/api -X POST -H 'content-type:text/plain' --data-binary '{"id":1,
78 78 "auth_token":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull", "args":{"repoid":"CPython"}}'
79 79
80 80 Provide those parameters:
81 81 - **id** A value of any type, which is used to match the response with the
82 82 request that it is replying to.
83 83 - **auth_token** for access and permission validation.
84 84 - **method** is name of method to call
85 85 - **args** is an ``key:value`` list of arguments to pass to method
86 86
87 87 .. note::
88 88
89 89 To get your |authtoken|, from the |RCE| interface,
90 90 go to:
91 91 :menuselection:`username --> My account --> Auth tokens`
92 92
93 93 For security reasons you should always create a dedicated |authtoken| for
94 94 API use only.
95 95
96 96
97 97 The |RCE| API will always return a JSON-RPC response:
98 98
99 99 .. code-block:: bash
100 100
101 101 {
102 102 "id": <id>, # matching id sent by request
103 103 "result": "<result>"|null, # JSON formatted result, null if any errors
104 104 "error": "null"|<error_message> # JSON formatted error (if any)
105 105 }
106 106
107 107 All responses from API will be with `HTTP/1.0 200 OK` status code.
108 108 If there is an error when calling the API, the *error* key will contain a
109 109 failure description and the *result* will be `null`.
110 110
111 111 API CLIENT
112 112 ----------
113 113
114 114 To install the |RCE| API, see :ref:`install-tools`. To configure the API per
115 115 instance, see the :ref:`rc-tools` section as you need to configure a
116 116 :file:`~/.rhoderc` file with your |authtokens|.
117 117
118 118 Once you have set up your instance API access, use the following examples to
119 119 get started.
120 120
121 121 .. code-block:: bash
122 122
123 123 # Getting the 'rhodecode' repository
124 124 # from a RhodeCode Enterprise instance
125 125 rhodecode-api --instance-name=enterprise-1 get_repo repoid:rhodecode
126 126
127 127 Calling method get_repo => http://127.0.0.1:5000
128 128 Server response
129 129 {
130 130 <json data>
131 131 }
132 132
133 133 # Creating a new mercurial repository called 'brand-new'
134 134 # with a description 'Repo-description'
135 135 rhodecode-api --instance-name=enterprise-1 create_repo repo_name:brand-new repo_type:hg description:Repo-description
136 136 {
137 137 "error": null,
138 138 "id": 1110,
139 139 "result": {
140 140 "msg": "Created new repository `brand-new`",
141 141 "success": true,
142 142 "task": null
143 143 }
144 144 }
145 145
146 146 A broken example, what not to do.
147 147
148 148 .. code-block:: bash
149 149
150 150 # A call missing the required arguments
151 151 # and not specifying the instance
152 152 rhodecode-api get_repo
153 153
154 154 Calling method get_repo => http://127.0.0.1:5000
155 155 Server response
156 156 "Missing non optional `repoid` arg in JSON DATA"
157 157
158 158 You can specify pure JSON using the ``--format`` parameter.
159 159
160 160 .. code-block:: bash
161 161
162 162 rhodecode-api --format=json get_repo repoid:rhodecode
163 163
164 164 In such case only output that this function shows is pure JSON, we can use that
165 165 and pipe output to some json formatter.
166 166
167 167 If output is in pure JSON format, you can pipe output to a JSON formatter.
168 168
169 169 .. code-block:: bash
170 170
171 171 rhodecode-api --instance-name=enterprise-1 --format=json get_repo repoid:rhodecode | python -m json.tool
172 172
173 173 API METHODS
174 174 -----------
175 175
176 176 Each method by default required following arguments.
177 177
178 178 .. code-block:: bash
179 179
180 180 id : "<id_for_response>"
181 181 auth_token : "<auth_token>"
182 182 method : "<method name>"
183 183 args : {}
184 184
185 185 Use each **param** from docs and put it in args, Optional parameters
186 186 are not required in args.
187 187
188 188 .. code-block:: bash
189 189
190 190 args: {"repoid": "rhodecode"}
191 191
192 192 .. Note: From this point on things are generated by the script in
193 193 `scripts/fabfile.py`. To change things below, update the docstrings in the
194 194 ApiController.
195 195
196 196 .. --- API DEFS MARKER ---
197 197 .. toctree::
198 198
199 methods/views
199 methods/repo-methods
200 methods/store-methods
200 201 methods/license-methods
201 202 methods/deprecated-methods
202 203 methods/gist-methods
203 204 methods/pull-request-methods
204 205 methods/repo-methods
205 206 methods/repo-group-methods
206 207 methods/server-methods
207 208 methods/user-methods
208 209 methods/user-group-methods
@@ -1,428 +1,434 b''
1 1 .. _pull-request-methods-ref:
2 2
3 3 pull_request methods
4 4 ====================
5 5
6 6 close_pull_request
7 7 ------------------
8 8
9 9 .. py:function:: close_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>, message=<Optional:''>)
10 10
11 11 Close the pull request specified by `pullrequestid`.
12 12
13 13 :param apiuser: This is filled automatically from the |authtoken|.
14 14 :type apiuser: AuthUser
15 15 :param repoid: Repository name or repository ID to which the pull
16 16 request belongs.
17 17 :type repoid: str or int
18 18 :param pullrequestid: ID of the pull request to be closed.
19 19 :type pullrequestid: int
20 20 :param userid: Close the pull request as this user.
21 21 :type userid: Optional(str or int)
22 22 :param message: Optional message to close the Pull Request with. If not
23 23 specified it will be generated automatically.
24 24 :type message: Optional(str)
25 25
26 26 Example output:
27 27
28 28 .. code-block:: bash
29 29
30 30 "id": <id_given_in_input>,
31 31 "result": {
32 32 "pull_request_id": "<int>",
33 33 "close_status": "<str:status_lbl>,
34 34 "closed": "<bool>"
35 35 },
36 36 "error": null
37 37
38 38
39 39 comment_pull_request
40 40 --------------------
41 41
42 42 .. py:function:: comment_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, message=<Optional:None>, commit_id=<Optional:None>, status=<Optional:None>, comment_type=<Optional:u'note'>, resolves_comment_id=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
43 43
44 44 Comment on the pull request specified with the `pullrequestid`,
45 45 in the |repo| specified by the `repoid`, and optionally change the
46 46 review status.
47 47
48 48 :param apiuser: This is filled automatically from the |authtoken|.
49 49 :type apiuser: AuthUser
50 50 :param repoid: Optional repository name or repository ID.
51 51 :type repoid: str or int
52 52 :param pullrequestid: The pull request ID.
53 53 :type pullrequestid: int
54 54 :param commit_id: Specify the commit_id for which to set a comment. If
55 55 given commit_id is different than latest in the PR status
56 56 change won't be performed.
57 57 :type commit_id: str
58 58 :param message: The text content of the comment.
59 59 :type message: str
60 60 :param status: (**Optional**) Set the approval status of the pull
61 61 request. One of: 'not_reviewed', 'approved', 'rejected',
62 62 'under_review'
63 63 :type status: str
64 64 :param comment_type: Comment type, one of: 'note', 'todo'
65 65 :type comment_type: Optional(str), default: 'note'
66 66 :param userid: Comment on the pull request as this user
67 67 :type userid: Optional(str or int)
68 68
69 69 Example output:
70 70
71 71 .. code-block:: bash
72 72
73 73 id : <id_given_in_input>
74 74 result : {
75 75 "pull_request_id": "<Integer>",
76 76 "comment_id": "<Integer>",
77 77 "status": {"given": <given_status>,
78 78 "was_changed": <bool status_was_actually_changed> },
79 79 },
80 80 error : null
81 81
82 82
83 83 create_pull_request
84 84 -------------------
85 85
86 .. py:function:: create_pull_request(apiuser, source_repo, target_repo, source_ref, target_ref, title=<Optional:''>, description=<Optional:''>, description_renderer=<Optional:''>, reviewers=<Optional:None>)
86 .. py:function:: create_pull_request(apiuser, source_repo, target_repo, source_ref, target_ref, owner=<Optional:<OptionalAttr:apiuser>>, title=<Optional:''>, description=<Optional:''>, description_renderer=<Optional:''>, reviewers=<Optional:None>)
87 87
88 88 Creates a new pull request.
89 89
90 90 Accepts refs in the following formats:
91 91
92 92 * branch:<branch_name>:<sha>
93 93 * branch:<branch_name>
94 94 * bookmark:<bookmark_name>:<sha> (Mercurial only)
95 95 * bookmark:<bookmark_name> (Mercurial only)
96 96
97 97 :param apiuser: This is filled automatically from the |authtoken|.
98 98 :type apiuser: AuthUser
99 99 :param source_repo: Set the source repository name.
100 100 :type source_repo: str
101 101 :param target_repo: Set the target repository name.
102 102 :type target_repo: str
103 103 :param source_ref: Set the source ref name.
104 104 :type source_ref: str
105 105 :param target_ref: Set the target ref name.
106 106 :type target_ref: str
107 :param owner: user_id or username
108 :type owner: Optional(str)
107 109 :param title: Optionally Set the pull request title, it's generated otherwise
108 110 :type title: str
109 111 :param description: Set the pull request description.
110 112 :type description: Optional(str)
111 113 :type description_renderer: Optional(str)
112 114 :param description_renderer: Set pull request renderer for the description.
113 115 It should be 'rst', 'markdown' or 'plain'. If not give default
114 116 system renderer will be used
115 117 :param reviewers: Set the new pull request reviewers list.
116 118 Reviewer defined by review rules will be added automatically to the
117 119 defined list.
118 120 :type reviewers: Optional(list)
119 121 Accepts username strings or objects of the format:
120 122
121 123 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
122 124
123 125
124 126 get_pull_request
125 127 ----------------
126 128
127 129 .. py:function:: get_pull_request(apiuser, pullrequestid, repoid=<Optional:None>)
128 130
129 131 Get a pull request based on the given ID.
130 132
131 133 :param apiuser: This is filled automatically from the |authtoken|.
132 134 :type apiuser: AuthUser
133 135 :param repoid: Optional, repository name or repository ID from where
134 136 the pull request was opened.
135 137 :type repoid: str or int
136 138 :param pullrequestid: ID of the requested pull request.
137 139 :type pullrequestid: int
138 140
139 141 Example output:
140 142
141 143 .. code-block:: bash
142 144
143 145 "id": <id_given_in_input>,
144 146 "result":
145 147 {
146 148 "pull_request_id": "<pull_request_id>",
147 149 "url": "<url>",
148 150 "title": "<title>",
149 151 "description": "<description>",
150 152 "status" : "<status>",
151 153 "created_on": "<date_time_created>",
152 154 "updated_on": "<date_time_updated>",
153 155 "commit_ids": [
154 156 ...
155 157 "<commit_id>",
156 158 "<commit_id>",
157 159 ...
158 160 ],
159 161 "review_status": "<review_status>",
160 162 "mergeable": {
161 163 "status": "<bool>",
162 164 "message": "<message>",
163 165 },
164 166 "source": {
165 167 "clone_url": "<clone_url>",
166 168 "repository": "<repository_name>",
167 169 "reference":
168 170 {
169 171 "name": "<name>",
170 172 "type": "<type>",
171 173 "commit_id": "<commit_id>",
172 174 }
173 175 },
174 176 "target": {
175 177 "clone_url": "<clone_url>",
176 178 "repository": "<repository_name>",
177 179 "reference":
178 180 {
179 181 "name": "<name>",
180 182 "type": "<type>",
181 183 "commit_id": "<commit_id>",
182 184 }
183 185 },
184 186 "merge": {
185 187 "clone_url": "<clone_url>",
186 188 "reference":
187 189 {
188 190 "name": "<name>",
189 191 "type": "<type>",
190 192 "commit_id": "<commit_id>",
191 193 }
192 194 },
193 195 "author": <user_obj>,
194 196 "reviewers": [
195 197 ...
196 198 {
197 199 "user": "<user_obj>",
198 200 "review_status": "<review_status>",
199 201 }
200 202 ...
201 203 ]
202 204 },
203 205 "error": null
204 206
205 207
206 208 get_pull_request_comments
207 209 -------------------------
208 210
209 211 .. py:function:: get_pull_request_comments(apiuser, pullrequestid, repoid=<Optional:None>)
210 212
211 213 Get all comments of pull request specified with the `pullrequestid`
212 214
213 215 :param apiuser: This is filled automatically from the |authtoken|.
214 216 :type apiuser: AuthUser
215 217 :param repoid: Optional repository name or repository ID.
216 218 :type repoid: str or int
217 219 :param pullrequestid: The pull request ID.
218 220 :type pullrequestid: int
219 221
220 222 Example output:
221 223
222 224 .. code-block:: bash
223 225
224 226 id : <id_given_in_input>
225 227 result : [
226 228 {
227 229 "comment_author": {
228 230 "active": true,
229 231 "full_name_or_username": "Tom Gore",
230 232 "username": "admin"
231 233 },
232 234 "comment_created_on": "2017-01-02T18:43:45.533",
233 235 "comment_f_path": null,
234 236 "comment_id": 25,
235 237 "comment_lineno": null,
236 238 "comment_status": {
237 239 "status": "under_review",
238 240 "status_lbl": "Under Review"
239 241 },
240 242 "comment_text": "Example text",
241 243 "comment_type": null,
242 244 "pull_request_version": null
243 245 }
244 246 ],
245 247 error : null
246 248
247 249
248 250 get_pull_requests
249 251 -----------------
250 252
251 .. py:function:: get_pull_requests(apiuser, repoid, status=<Optional:'new'>)
253 .. py:function:: get_pull_requests(apiuser, repoid, status=<Optional:'new'>, merge_state=<Optional:True>)
252 254
253 255 Get all pull requests from the repository specified in `repoid`.
254 256
255 257 :param apiuser: This is filled automatically from the |authtoken|.
256 258 :type apiuser: AuthUser
257 259 :param repoid: Optional repository name or repository ID.
258 260 :type repoid: str or int
259 261 :param status: Only return pull requests with the specified status.
260 262 Valid options are.
261 263 * ``new`` (default)
262 264 * ``open``
263 265 * ``closed``
264 266 :type status: str
267 :param merge_state: Optional calculate merge state for each repository.
268 This could result in longer time to fetch the data
269 :type merge_state: bool
265 270
266 271 Example output:
267 272
268 273 .. code-block:: bash
269 274
270 275 "id": <id_given_in_input>,
271 276 "result":
272 277 [
273 278 ...
274 279 {
275 280 "pull_request_id": "<pull_request_id>",
276 281 "url": "<url>",
277 282 "title" : "<title>",
278 283 "description": "<description>",
279 284 "status": "<status>",
280 285 "created_on": "<date_time_created>",
281 286 "updated_on": "<date_time_updated>",
282 287 "commit_ids": [
283 288 ...
284 289 "<commit_id>",
285 290 "<commit_id>",
286 291 ...
287 292 ],
288 293 "review_status": "<review_status>",
289 294 "mergeable": {
290 295 "status": "<bool>",
291 296 "message: "<message>",
292 297 },
293 298 "source": {
294 299 "clone_url": "<clone_url>",
295 300 "reference":
296 301 {
297 302 "name": "<name>",
298 303 "type": "<type>",
299 304 "commit_id": "<commit_id>",
300 305 }
301 306 },
302 307 "target": {
303 308 "clone_url": "<clone_url>",
304 309 "reference":
305 310 {
306 311 "name": "<name>",
307 312 "type": "<type>",
308 313 "commit_id": "<commit_id>",
309 314 }
310 315 },
311 316 "merge": {
312 317 "clone_url": "<clone_url>",
313 318 "reference":
314 319 {
315 320 "name": "<name>",
316 321 "type": "<type>",
317 322 "commit_id": "<commit_id>",
318 323 }
319 324 },
320 325 "author": <user_obj>,
321 326 "reviewers": [
322 327 ...
323 328 {
324 329 "user": "<user_obj>",
325 330 "review_status": "<review_status>",
326 331 }
327 332 ...
328 333 ]
329 334 }
330 335 ...
331 336 ],
332 337 "error": null
333 338
334 339
335 340 merge_pull_request
336 341 ------------------
337 342
338 343 .. py:function:: merge_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
339 344
340 345 Merge the pull request specified by `pullrequestid` into its target
341 346 repository.
342 347
343 348 :param apiuser: This is filled automatically from the |authtoken|.
344 349 :type apiuser: AuthUser
345 350 :param repoid: Optional, repository name or repository ID of the
346 351 target repository to which the |pr| is to be merged.
347 352 :type repoid: str or int
348 353 :param pullrequestid: ID of the pull request which shall be merged.
349 354 :type pullrequestid: int
350 355 :param userid: Merge the pull request as this user.
351 356 :type userid: Optional(str or int)
352 357
353 358 Example output:
354 359
355 360 .. code-block:: bash
356 361
357 362 "id": <id_given_in_input>,
358 363 "result": {
359 "executed": "<bool>",
360 "failure_reason": "<int>",
361 "merge_commit_id": "<merge_commit_id>",
362 "possible": "<bool>",
364 "executed": "<bool>",
365 "failure_reason": "<int>",
366 "merge_status_message": "<str>",
367 "merge_commit_id": "<merge_commit_id>",
368 "possible": "<bool>",
363 369 "merge_ref": {
364 370 "commit_id": "<commit_id>",
365 371 "type": "<type>",
366 372 "name": "<name>"
367 373 }
368 374 },
369 375 "error": null
370 376
371 377
372 378 update_pull_request
373 379 -------------------
374 380
375 381 .. py:function:: update_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, title=<Optional:''>, description=<Optional:''>, description_renderer=<Optional:''>, reviewers=<Optional:None>, update_commits=<Optional:None>)
376 382
377 383 Updates a pull request.
378 384
379 385 :param apiuser: This is filled automatically from the |authtoken|.
380 386 :type apiuser: AuthUser
381 387 :param repoid: Optional repository name or repository ID.
382 388 :type repoid: str or int
383 389 :param pullrequestid: The pull request ID.
384 390 :type pullrequestid: int
385 391 :param title: Set the pull request title.
386 392 :type title: str
387 393 :param description: Update pull request description.
388 394 :type description: Optional(str)
389 395 :type description_renderer: Optional(str)
390 396 :param description_renderer: Update pull request renderer for the description.
391 397 It should be 'rst', 'markdown' or 'plain'
392 398 :param reviewers: Update pull request reviewers list with new value.
393 399 :type reviewers: Optional(list)
394 400 Accepts username strings or objects of the format:
395 401
396 402 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
397 403
398 404 :param update_commits: Trigger update of commits for this pull request
399 405 :type: update_commits: Optional(bool)
400 406
401 407 Example output:
402 408
403 409 .. code-block:: bash
404 410
405 411 id : <id_given_in_input>
406 412 result : {
407 413 "msg": "Updated pull request `63`",
408 414 "pull_request": <pull_request_object>,
409 415 "updated_reviewers": {
410 416 "added": [
411 417 "username"
412 418 ],
413 419 "removed": []
414 420 },
415 421 "updated_commits": {
416 422 "added": [
417 423 "<sha1_hash>"
418 424 ],
419 425 "common": [
420 426 "<sha1_hash>",
421 427 "<sha1_hash>",
422 428 ],
423 429 "removed": []
424 430 }
425 431 }
426 432 error : null
427 433
428 434
@@ -1,1028 +1,1134 b''
1 1 .. _repo-methods-ref:
2 2
3 3 repo methods
4 4 ============
5 5
6 6 add_field_to_repo
7 7 -----------------
8 8
9 9 .. py:function:: add_field_to_repo(apiuser, repoid, key, label=<Optional:''>, description=<Optional:''>)
10 10
11 11 Adds an extra field to a repository.
12 12
13 13 This command can only be run using an |authtoken| with at least
14 14 write permissions to the |repo|.
15 15
16 16 :param apiuser: This is filled automatically from the |authtoken|.
17 17 :type apiuser: AuthUser
18 18 :param repoid: Set the repository name or repository id.
19 19 :type repoid: str or int
20 20 :param key: Create a unique field key for this repository.
21 21 :type key: str
22 22 :param label:
23 23 :type label: Optional(str)
24 24 :param description:
25 25 :type description: Optional(str)
26 26
27 27
28 28 comment_commit
29 29 --------------
30 30
31 31 .. py:function:: comment_commit(apiuser, repoid, commit_id, message, status=<Optional:None>, comment_type=<Optional:u'note'>, resolves_comment_id=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
32 32
33 33 Set a commit comment, and optionally change the status of the commit.
34 34
35 35 :param apiuser: This is filled automatically from the |authtoken|.
36 36 :type apiuser: AuthUser
37 37 :param repoid: Set the repository name or repository ID.
38 38 :type repoid: str or int
39 39 :param commit_id: Specify the commit_id for which to set a comment.
40 40 :type commit_id: str
41 41 :param message: The comment text.
42 42 :type message: str
43 43 :param status: (**Optional**) status of commit, one of: 'not_reviewed',
44 44 'approved', 'rejected', 'under_review'
45 45 :type status: str
46 46 :param comment_type: Comment type, one of: 'note', 'todo'
47 47 :type comment_type: Optional(str), default: 'note'
48 48 :param userid: Set the user name of the comment creator.
49 49 :type userid: Optional(str or int)
50 50
51 51 Example error output:
52 52
53 53 .. code-block:: bash
54 54
55 55 {
56 56 "id" : <id_given_in_input>,
57 57 "result" : {
58 58 "msg": "Commented on commit `<commit_id>` for repository `<repoid>`",
59 59 "status_change": null or <status>,
60 60 "success": true
61 61 },
62 62 "error" : null
63 63 }
64 64
65 65
66 66 create_repo
67 67 -----------
68 68
69 69 .. py:function:: create_repo(apiuser, repo_name, repo_type, owner=<Optional:<OptionalAttr:apiuser>>, description=<Optional:''>, private=<Optional:False>, clone_uri=<Optional:None>, push_uri=<Optional:None>, landing_rev=<Optional:'rev:tip'>, enable_statistics=<Optional:False>, enable_locking=<Optional:False>, enable_downloads=<Optional:False>, copy_permissions=<Optional:False>)
70 70
71 71 Creates a repository.
72 72
73 73 * If the repository name contains "/", repository will be created inside
74 74 a repository group or nested repository groups
75 75
76 76 For example "foo/bar/repo1" will create |repo| called "repo1" inside
77 77 group "foo/bar". You have to have permissions to access and write to
78 78 the last repository group ("bar" in this example)
79 79
80 80 This command can only be run using an |authtoken| with at least
81 81 permissions to create repositories, or write permissions to
82 82 parent repository groups.
83 83
84 84 :param apiuser: This is filled automatically from the |authtoken|.
85 85 :type apiuser: AuthUser
86 86 :param repo_name: Set the repository name.
87 87 :type repo_name: str
88 88 :param repo_type: Set the repository type; 'hg','git', or 'svn'.
89 89 :type repo_type: str
90 90 :param owner: user_id or username
91 91 :type owner: Optional(str)
92 92 :param description: Set the repository description.
93 93 :type description: Optional(str)
94 94 :param private: set repository as private
95 95 :type private: bool
96 96 :param clone_uri: set clone_uri
97 97 :type clone_uri: str
98 98 :param push_uri: set push_uri
99 99 :type push_uri: str
100 100 :param landing_rev: <rev_type>:<rev>
101 101 :type landing_rev: str
102 102 :param enable_locking:
103 103 :type enable_locking: bool
104 104 :param enable_downloads:
105 105 :type enable_downloads: bool
106 106 :param enable_statistics:
107 107 :type enable_statistics: bool
108 108 :param copy_permissions: Copy permission from group in which the
109 109 repository is being created.
110 110 :type copy_permissions: bool
111 111
112 112
113 113 Example output:
114 114
115 115 .. code-block:: bash
116 116
117 117 id : <id_given_in_input>
118 118 result: {
119 119 "msg": "Created new repository `<reponame>`",
120 120 "success": true,
121 121 "task": "<celery task id or None if done sync>"
122 122 }
123 123 error: null
124 124
125 125
126 126 Example error output:
127 127
128 128 .. code-block:: bash
129 129
130 130 id : <id_given_in_input>
131 131 result : null
132 132 error : {
133 133 'failed to create repository `<repo_name>`'
134 134 }
135 135
136 136
137 137 delete_repo
138 138 -----------
139 139
140 140 .. py:function:: delete_repo(apiuser, repoid, forks=<Optional:''>)
141 141
142 142 Deletes a repository.
143 143
144 144 * When the `forks` parameter is set it's possible to detach or delete
145 145 forks of deleted repository.
146 146
147 147 This command can only be run using an |authtoken| with admin
148 148 permissions on the |repo|.
149 149
150 150 :param apiuser: This is filled automatically from the |authtoken|.
151 151 :type apiuser: AuthUser
152 152 :param repoid: Set the repository name or repository ID.
153 153 :type repoid: str or int
154 154 :param forks: Set to `detach` or `delete` forks from the |repo|.
155 155 :type forks: Optional(str)
156 156
157 157 Example error output:
158 158
159 159 .. code-block:: bash
160 160
161 161 id : <id_given_in_input>
162 162 result: {
163 163 "msg": "Deleted repository `<reponame>`",
164 164 "success": true
165 165 }
166 166 error: null
167 167
168 168
169 169 fork_repo
170 170 ---------
171 171
172 172 .. py:function:: fork_repo(apiuser, repoid, fork_name, owner=<Optional:<OptionalAttr:apiuser>>, description=<Optional:''>, private=<Optional:False>, clone_uri=<Optional:None>, landing_rev=<Optional:'rev:tip'>, copy_permissions=<Optional:False>)
173 173
174 174 Creates a fork of the specified |repo|.
175 175
176 176 * If the fork_name contains "/", fork will be created inside
177 177 a repository group or nested repository groups
178 178
179 179 For example "foo/bar/fork-repo" will create fork called "fork-repo"
180 180 inside group "foo/bar". You have to have permissions to access and
181 181 write to the last repository group ("bar" in this example)
182 182
183 183 This command can only be run using an |authtoken| with minimum
184 184 read permissions of the forked repo, create fork permissions for an user.
185 185
186 186 :param apiuser: This is filled automatically from the |authtoken|.
187 187 :type apiuser: AuthUser
188 188 :param repoid: Set repository name or repository ID.
189 189 :type repoid: str or int
190 190 :param fork_name: Set the fork name, including it's repository group membership.
191 191 :type fork_name: str
192 192 :param owner: Set the fork owner.
193 193 :type owner: str
194 194 :param description: Set the fork description.
195 195 :type description: str
196 196 :param copy_permissions: Copy permissions from parent |repo|. The
197 197 default is False.
198 198 :type copy_permissions: bool
199 199 :param private: Make the fork private. The default is False.
200 200 :type private: bool
201 201 :param landing_rev: Set the landing revision. The default is tip.
202 202
203 203 Example output:
204 204
205 205 .. code-block:: bash
206 206
207 207 id : <id_for_response>
208 208 api_key : "<api_key>"
209 209 args: {
210 210 "repoid" : "<reponame or repo_id>",
211 211 "fork_name": "<forkname>",
212 212 "owner": "<username or user_id = Optional(=apiuser)>",
213 213 "description": "<description>",
214 214 "copy_permissions": "<bool>",
215 215 "private": "<bool>",
216 216 "landing_rev": "<landing_rev>"
217 217 }
218 218
219 219 Example error output:
220 220
221 221 .. code-block:: bash
222 222
223 223 id : <id_given_in_input>
224 224 result: {
225 225 "msg": "Created fork of `<reponame>` as `<forkname>`",
226 226 "success": true,
227 227 "task": "<celery task id or None if done sync>"
228 228 }
229 229 error: null
230 230
231 231
232 232 get_repo
233 233 --------
234 234
235 235 .. py:function:: get_repo(apiuser, repoid, cache=<Optional:True>)
236 236
237 237 Gets an existing repository by its name or repository_id.
238 238
239 239 The members section so the output returns users groups or users
240 240 associated with that repository.
241 241
242 242 This command can only be run using an |authtoken| with admin rights,
243 243 or users with at least read rights to the |repo|.
244 244
245 245 :param apiuser: This is filled automatically from the |authtoken|.
246 246 :type apiuser: AuthUser
247 247 :param repoid: The repository name or repository id.
248 248 :type repoid: str or int
249 249 :param cache: use the cached value for last changeset
250 250 :type: cache: Optional(bool)
251 251
252 252 Example output:
253 253
254 254 .. code-block:: bash
255 255
256 256 {
257 257 "error": null,
258 258 "id": <repo_id>,
259 259 "result": {
260 260 "clone_uri": null,
261 261 "created_on": "timestamp",
262 262 "description": "repo description",
263 263 "enable_downloads": false,
264 264 "enable_locking": false,
265 265 "enable_statistics": false,
266 266 "followers": [
267 267 {
268 268 "active": true,
269 269 "admin": false,
270 270 "api_key": "****************************************",
271 271 "api_keys": [
272 272 "****************************************"
273 273 ],
274 274 "email": "user@example.com",
275 275 "emails": [
276 276 "user@example.com"
277 277 ],
278 278 "extern_name": "rhodecode",
279 279 "extern_type": "rhodecode",
280 280 "firstname": "username",
281 281 "ip_addresses": [],
282 282 "language": null,
283 283 "last_login": "2015-09-16T17:16:35.854",
284 284 "lastname": "surname",
285 285 "user_id": <user_id>,
286 286 "username": "name"
287 287 }
288 288 ],
289 289 "fork_of": "parent-repo",
290 290 "landing_rev": [
291 291 "rev",
292 292 "tip"
293 293 ],
294 294 "last_changeset": {
295 295 "author": "User <user@example.com>",
296 296 "branch": "default",
297 297 "date": "timestamp",
298 298 "message": "last commit message",
299 299 "parents": [
300 300 {
301 301 "raw_id": "commit-id"
302 302 }
303 303 ],
304 304 "raw_id": "commit-id",
305 305 "revision": <revision number>,
306 306 "short_id": "short id"
307 307 },
308 308 "lock_reason": null,
309 309 "locked_by": null,
310 310 "locked_date": null,
311 311 "owner": "owner-name",
312 312 "permissions": [
313 313 {
314 314 "name": "super-admin-name",
315 315 "origin": "super-admin",
316 316 "permission": "repository.admin",
317 317 "type": "user"
318 318 },
319 319 {
320 320 "name": "owner-name",
321 321 "origin": "owner",
322 322 "permission": "repository.admin",
323 323 "type": "user"
324 324 },
325 325 {
326 326 "name": "user-group-name",
327 327 "origin": "permission",
328 328 "permission": "repository.write",
329 329 "type": "user_group"
330 330 }
331 331 ],
332 332 "private": true,
333 333 "repo_id": 676,
334 334 "repo_name": "user-group/repo-name",
335 335 "repo_type": "hg"
336 336 }
337 337 }
338 338
339 339
340 340 get_repo_changeset
341 341 ------------------
342 342
343 343 .. py:function:: get_repo_changeset(apiuser, repoid, revision, details=<Optional:'basic'>)
344 344
345 345 Returns information about a changeset.
346 346
347 347 Additionally parameters define the amount of details returned by
348 348 this function.
349 349
350 350 This command can only be run using an |authtoken| with admin rights,
351 351 or users with at least read rights to the |repo|.
352 352
353 353 :param apiuser: This is filled automatically from the |authtoken|.
354 354 :type apiuser: AuthUser
355 355 :param repoid: The repository name or repository id
356 356 :type repoid: str or int
357 357 :param revision: revision for which listing should be done
358 358 :type revision: str
359 359 :param details: details can be 'basic|extended|full' full gives diff
360 360 info details like the diff itself, and number of changed files etc.
361 361 :type details: Optional(str)
362 362
363 363
364 364 get_repo_changesets
365 365 -------------------
366 366
367 367 .. py:function:: get_repo_changesets(apiuser, repoid, start_rev, limit, details=<Optional:'basic'>)
368 368
369 369 Returns a set of commits limited by the number starting
370 370 from the `start_rev` option.
371 371
372 372 Additional parameters define the amount of details returned by this
373 373 function.
374 374
375 375 This command can only be run using an |authtoken| with admin rights,
376 376 or users with at least read rights to |repos|.
377 377
378 378 :param apiuser: This is filled automatically from the |authtoken|.
379 379 :type apiuser: AuthUser
380 380 :param repoid: The repository name or repository ID.
381 381 :type repoid: str or int
382 382 :param start_rev: The starting revision from where to get changesets.
383 383 :type start_rev: str
384 384 :param limit: Limit the number of commits to this amount
385 385 :type limit: str or int
386 386 :param details: Set the level of detail returned. Valid option are:
387 387 ``basic``, ``extended`` and ``full``.
388 388 :type details: Optional(str)
389 389
390 390 .. note::
391 391
392 392 Setting the parameter `details` to the value ``full`` is extensive
393 393 and returns details like the diff itself, and the number
394 394 of changed files.
395 395
396 396
397 get_repo_nodes
398 --------------
397 get_repo_comments
398 -----------------
399
400 .. py:function:: get_repo_comments(apiuser, repoid, commit_id=<Optional:None>, comment_type=<Optional:None>, userid=<Optional:None>)
401
402 Get all comments for a repository
399 403
400 .. py:function:: get_repo_nodes(apiuser, repoid, revision, root_path, ret_type=<Optional:'all'>, details=<Optional:'basic'>, max_file_bytes=<Optional:None>)
404 :param apiuser: This is filled automatically from the |authtoken|.
405 :type apiuser: AuthUser
406 :param repoid: Set the repository name or repository ID.
407 :type repoid: str or int
408 :param commit_id: Optionally filter the comments by the commit_id
409 :type commit_id: Optional(str), default: None
410 :param comment_type: Optionally filter the comments by the comment_type
411 one of: 'note', 'todo'
412 :type comment_type: Optional(str), default: None
413 :param userid: Optionally filter the comments by the author of comment
414 :type userid: Optional(str or int), Default: None
415
416 Example error output:
417
418 .. code-block:: bash
401 419
402 Returns a list of nodes and children in a flat list for a given
403 path at given revision.
420 {
421 "id" : <id_given_in_input>,
422 "result" : [
423 {
424 "comment_author": <USER_DETAILS>,
425 "comment_created_on": "2017-02-01T14:38:16.309",
426 "comment_f_path": "file.txt",
427 "comment_id": 282,
428 "comment_lineno": "n1",
429 "comment_resolved_by": null,
430 "comment_status": [],
431 "comment_text": "This file needs a header",
432 "comment_type": "todo"
433 }
434 ],
435 "error" : null
436 }
404 437
405 It's possible to specify ret_type to show only `files` or `dirs`.
438
439 get_repo_file
440 -------------
441
442 .. py:function:: get_repo_file(apiuser, repoid, commit_id, file_path, max_file_bytes=<Optional:None>, details=<Optional:'basic'>, cache=<Optional:True>)
443
444 Returns a single file from repository at given revision.
406 445
407 446 This command can only be run using an |authtoken| with admin rights,
408 447 or users with at least read rights to |repos|.
409 448
410 449 :param apiuser: This is filled automatically from the |authtoken|.
411 450 :type apiuser: AuthUser
412 451 :param repoid: The repository name or repository ID.
413 452 :type repoid: str or int
414 :param revision: The revision for which listing should be done.
415 :type revision: str
416 :param root_path: The path from which to start displaying.
417 :type root_path: str
418 :param ret_type: Set the return type. Valid options are
419 ``all`` (default), ``files`` and ``dirs``.
420 :type ret_type: Optional(str)
421 :param details: Returns extended information about nodes, such as
422 md5, binary, and or content. The valid options are ``basic`` and
423 ``full``.
453 :param commit_id: The revision for which listing should be done.
454 :type commit_id: str
455 :param file_path: The path from which to start displaying.
456 :type file_path: str
457 :param details: Returns different set of information about nodes.
458 The valid options are ``minimal`` ``basic`` and ``full``.
424 459 :type details: Optional(str)
425 460 :param max_file_bytes: Only return file content under this file size bytes
426 :type details: Optional(int)
427
461 :type max_file_bytes: Optional(int)
462 :param cache: Use internal caches for fetching files. If disabled fetching
463 files is slower but more memory efficient
464 :type cache: Optional(bool)
428 465 Example output:
429 466
430 467 .. code-block:: bash
431 468
432 469 id : <id_given_in_input>
433 result: [
434 {
435 "name" : "<name>"
436 "type" : "<type>",
437 "binary": "<true|false>" (only in extended mode)
438 "md5" : "<md5 of file content>" (only in extended mode)
439 },
440 ...
441 ]
470 result: {
471 "binary": false,
472 "extension": "py",
473 "lines": 35,
474 "content": "....",
475 "md5": "76318336366b0f17ee249e11b0c99c41",
476 "mimetype": "text/x-python",
477 "name": "python.py",
478 "size": 817,
479 "type": "file",
480 }
442 481 error: null
443 482
444 483
484 get_repo_fts_tree
485 -----------------
486
487 .. py:function:: get_repo_fts_tree(apiuser, repoid, commit_id, root_path)
488
489 Returns a list of tree nodes for path at given revision. This api is built
490 strictly for usage in full text search building, and shouldn't be consumed
491
492 This command can only be run using an |authtoken| with admin rights,
493 or users with at least read rights to |repos|.
494
495
496 get_repo_nodes
497 --------------
498
499 .. py:function:: get_repo_nodes(apiuser, repoid, revision, root_path, ret_type=<Optional:'all'>, details=<Optional:'basic'>, max_file_bytes=<Optional:None>)
500
501 Returns a list of nodes and children in a flat list for a given
502 path at given revision.
503
504 It's possible to specify ret_type to show only `files` or `dirs`.
505
506 This command can only be run using an |authtoken| with admin rights,
507 or users with at least read rights to |repos|.
508
509 :param apiuser: This is filled automatically from the |authtoken|.
510 :type apiuser: AuthUser
511 :param repoid: The repository name or repository ID.
512 :type repoid: str or int
513 :param revision: The revision for which listing should be done.
514 :type revision: str
515 :param root_path: The path from which to start displaying.
516 :type root_path: str
517 :param ret_type: Set the return type. Valid options are
518 ``all`` (default), ``files`` and ``dirs``.
519 :type ret_type: Optional(str)
520 :param details: Returns extended information about nodes, such as
521 md5, binary, and or content.
522 The valid options are ``basic`` and ``full``.
523 :type details: Optional(str)
524 :param max_file_bytes: Only return file content under this file size bytes
525 :type details: Optional(int)
526
527 Example output:
528
529 .. code-block:: bash
530
531 id : <id_given_in_input>
532 result: [
533 {
534 "binary": false,
535 "content": "File line
536 Line2
537 ",
538 "extension": "md",
539 "lines": 2,
540 "md5": "059fa5d29b19c0657e384749480f6422",
541 "mimetype": "text/x-minidsrc",
542 "name": "file.md",
543 "size": 580,
544 "type": "file"
545 },
546 ...
547 ]
548 error: null
549
550
445 551 get_repo_refs
446 552 -------------
447 553
448 554 .. py:function:: get_repo_refs(apiuser, repoid)
449 555
450 556 Returns a dictionary of current references. It returns
451 557 bookmarks, branches, closed_branches, and tags for given repository
452 558
453 559 It's possible to specify ret_type to show only `files` or `dirs`.
454 560
455 561 This command can only be run using an |authtoken| with admin rights,
456 562 or users with at least read rights to |repos|.
457 563
458 564 :param apiuser: This is filled automatically from the |authtoken|.
459 565 :type apiuser: AuthUser
460 566 :param repoid: The repository name or repository ID.
461 567 :type repoid: str or int
462 568
463 569 Example output:
464 570
465 571 .. code-block:: bash
466 572
467 573 id : <id_given_in_input>
468 574 "result": {
469 575 "bookmarks": {
470 576 "dev": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
471 577 "master": "367f590445081d8ec8c2ea0456e73ae1f1c3d6cf"
472 578 },
473 579 "branches": {
474 580 "default": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
475 581 "stable": "367f590445081d8ec8c2ea0456e73ae1f1c3d6cf"
476 582 },
477 583 "branches_closed": {},
478 584 "tags": {
479 585 "tip": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
480 586 "v4.4.0": "1232313f9e6adac5ce5399c2a891dc1e72b79022",
481 587 "v4.4.1": "cbb9f1d329ae5768379cdec55a62ebdd546c4e27",
482 588 "v4.4.2": "24ffe44a27fcd1c5b6936144e176b9f6dd2f3a17",
483 589 }
484 590 }
485 591 error: null
486 592
487 593
488 594 get_repo_settings
489 595 -----------------
490 596
491 597 .. py:function:: get_repo_settings(apiuser, repoid, key=<Optional:None>)
492 598
493 599 Returns all settings for a repository. If key is given it only returns the
494 600 setting identified by the key or null.
495 601
496 602 :param apiuser: This is filled automatically from the |authtoken|.
497 603 :type apiuser: AuthUser
498 604 :param repoid: The repository name or repository id.
499 605 :type repoid: str or int
500 606 :param key: Key of the setting to return.
501 607 :type: key: Optional(str)
502 608
503 609 Example output:
504 610
505 611 .. code-block:: bash
506 612
507 613 {
508 614 "error": null,
509 615 "id": 237,
510 616 "result": {
511 617 "extensions_largefiles": true,
512 618 "extensions_evolve": true,
513 619 "hooks_changegroup_push_logger": true,
514 620 "hooks_changegroup_repo_size": false,
515 621 "hooks_outgoing_pull_logger": true,
516 622 "phases_publish": "True",
517 623 "rhodecode_hg_use_rebase_for_merging": true,
518 624 "rhodecode_pr_merge_enabled": true,
519 625 "rhodecode_use_outdated_comments": true
520 626 }
521 627 }
522 628
523 629
524 630 get_repos
525 631 ---------
526 632
527 633 .. py:function:: get_repos(apiuser, root=<Optional:None>, traverse=<Optional:True>)
528 634
529 635 Lists all existing repositories.
530 636
531 637 This command can only be run using an |authtoken| with admin rights,
532 638 or users with at least read rights to |repos|.
533 639
534 640 :param apiuser: This is filled automatically from the |authtoken|.
535 641 :type apiuser: AuthUser
536 642 :param root: specify root repository group to fetch repositories.
537 643 filters the returned repositories to be members of given root group.
538 644 :type root: Optional(None)
539 645 :param traverse: traverse given root into subrepositories. With this flag
540 646 set to False, it will only return top-level repositories from `root`.
541 647 if root is empty it will return just top-level repositories.
542 648 :type traverse: Optional(True)
543 649
544 650
545 651 Example output:
546 652
547 653 .. code-block:: bash
548 654
549 655 id : <id_given_in_input>
550 656 result: [
551 657 {
552 658 "repo_id" : "<repo_id>",
553 659 "repo_name" : "<reponame>"
554 660 "repo_type" : "<repo_type>",
555 661 "clone_uri" : "<clone_uri>",
556 662 "private": : "<bool>",
557 663 "created_on" : "<datetimecreated>",
558 664 "description" : "<description>",
559 665 "landing_rev": "<landing_rev>",
560 666 "owner": "<repo_owner>",
561 667 "fork_of": "<name_of_fork_parent>",
562 668 "enable_downloads": "<bool>",
563 669 "enable_locking": "<bool>",
564 670 "enable_statistics": "<bool>",
565 671 },
566 672 ...
567 673 ]
568 674 error: null
569 675
570 676
571 677 grant_user_group_permission
572 678 ---------------------------
573 679
574 680 .. py:function:: grant_user_group_permission(apiuser, repoid, usergroupid, perm)
575 681
576 682 Grant permission for a user group on the specified repository,
577 683 or update existing permissions.
578 684
579 685 This command can only be run using an |authtoken| with admin
580 686 permissions on the |repo|.
581 687
582 688 :param apiuser: This is filled automatically from the |authtoken|.
583 689 :type apiuser: AuthUser
584 690 :param repoid: Set the repository name or repository ID.
585 691 :type repoid: str or int
586 692 :param usergroupid: Specify the ID of the user group.
587 693 :type usergroupid: str or int
588 694 :param perm: Set the user group permissions using the following
589 695 format: (repository.(none|read|write|admin))
590 696 :type perm: str
591 697
592 698 Example output:
593 699
594 700 .. code-block:: bash
595 701
596 702 id : <id_given_in_input>
597 703 result : {
598 704 "msg" : "Granted perm: `<perm>` for group: `<usersgroupname>` in repo: `<reponame>`",
599 705 "success": true
600 706
601 707 }
602 708 error : null
603 709
604 710 Example error output:
605 711
606 712 .. code-block:: bash
607 713
608 714 id : <id_given_in_input>
609 715 result : null
610 716 error : {
611 717 "failed to edit permission for user group: `<usergroup>` in repo `<repo>`'
612 718 }
613 719
614 720
615 721 grant_user_permission
616 722 ---------------------
617 723
618 724 .. py:function:: grant_user_permission(apiuser, repoid, userid, perm)
619 725
620 726 Grant permissions for the specified user on the given repository,
621 727 or update existing permissions if found.
622 728
623 729 This command can only be run using an |authtoken| with admin
624 730 permissions on the |repo|.
625 731
626 732 :param apiuser: This is filled automatically from the |authtoken|.
627 733 :type apiuser: AuthUser
628 734 :param repoid: Set the repository name or repository ID.
629 735 :type repoid: str or int
630 736 :param userid: Set the user name.
631 737 :type userid: str
632 738 :param perm: Set the user permissions, using the following format
633 739 ``(repository.(none|read|write|admin))``
634 740 :type perm: str
635 741
636 742 Example output:
637 743
638 744 .. code-block:: bash
639 745
640 746 id : <id_given_in_input>
641 747 result: {
642 748 "msg" : "Granted perm: `<perm>` for user: `<username>` in repo: `<reponame>`",
643 749 "success": true
644 750 }
645 751 error: null
646 752
647 753
648 754 invalidate_cache
649 755 ----------------
650 756
651 757 .. py:function:: invalidate_cache(apiuser, repoid, delete_keys=<Optional:False>)
652 758
653 759 Invalidates the cache for the specified repository.
654 760
655 761 This command can only be run using an |authtoken| with admin rights to
656 762 the specified repository.
657 763
658 764 This command takes the following options:
659 765
660 766 :param apiuser: This is filled automatically from |authtoken|.
661 767 :type apiuser: AuthUser
662 768 :param repoid: Sets the repository name or repository ID.
663 769 :type repoid: str or int
664 770 :param delete_keys: This deletes the invalidated keys instead of
665 771 just flagging them.
666 772 :type delete_keys: Optional(``True`` | ``False``)
667 773
668 774 Example output:
669 775
670 776 .. code-block:: bash
671 777
672 778 id : <id_given_in_input>
673 779 result : {
674 780 'msg': Cache for repository `<repository name>` was invalidated,
675 781 'repository': <repository name>
676 782 }
677 783 error : null
678 784
679 785 Example error output:
680 786
681 787 .. code-block:: bash
682 788
683 789 id : <id_given_in_input>
684 790 result : null
685 791 error : {
686 792 'Error occurred during cache invalidation action'
687 793 }
688 794
689 795
690 796 lock
691 797 ----
692 798
693 799 .. py:function:: lock(apiuser, repoid, locked=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
694 800
695 801 Sets the lock state of the specified |repo| by the given user.
696 802 From more information, see :ref:`repo-locking`.
697 803
698 804 * If the ``userid`` option is not set, the repository is locked to the
699 805 user who called the method.
700 806 * If the ``locked`` parameter is not set, the current lock state of the
701 807 repository is displayed.
702 808
703 809 This command can only be run using an |authtoken| with admin rights to
704 810 the specified repository.
705 811
706 812 This command takes the following options:
707 813
708 814 :param apiuser: This is filled automatically from the |authtoken|.
709 815 :type apiuser: AuthUser
710 816 :param repoid: Sets the repository name or repository ID.
711 817 :type repoid: str or int
712 818 :param locked: Sets the lock state.
713 819 :type locked: Optional(``True`` | ``False``)
714 820 :param userid: Set the repository lock to this user.
715 821 :type userid: Optional(str or int)
716 822
717 823 Example error output:
718 824
719 825 .. code-block:: bash
720 826
721 827 id : <id_given_in_input>
722 828 result : {
723 829 'repo': '<reponame>',
724 830 'locked': <bool: lock state>,
725 831 'locked_since': <int: lock timestamp>,
726 832 'locked_by': <username of person who made the lock>,
727 833 'lock_reason': <str: reason for locking>,
728 834 'lock_state_changed': <bool: True if lock state has been changed in this request>,
729 835 'msg': 'Repo `<reponame>` locked by `<username>` on <timestamp>.'
730 836 or
731 837 'msg': 'Repo `<repository name>` not locked.'
732 838 or
733 839 'msg': 'User `<user name>` set lock state for repo `<repository name>` to `<new lock state>`'
734 840 }
735 841 error : null
736 842
737 843 Example error output:
738 844
739 845 .. code-block:: bash
740 846
741 847 id : <id_given_in_input>
742 848 result : null
743 849 error : {
744 850 'Error occurred locking repository `<reponame>`'
745 851 }
746 852
747 853
748 854 maintenance
749 855 -----------
750 856
751 857 .. py:function:: maintenance(apiuser, repoid)
752 858
753 859 Triggers a maintenance on the given repository.
754 860
755 861 This command can only be run using an |authtoken| with admin
756 862 rights to the specified repository. For more information,
757 863 see :ref:`config-token-ref`.
758 864
759 865 This command takes the following options:
760 866
761 867 :param apiuser: This is filled automatically from the |authtoken|.
762 868 :type apiuser: AuthUser
763 869 :param repoid: The repository name or repository ID.
764 870 :type repoid: str or int
765 871
766 872 Example output:
767 873
768 874 .. code-block:: bash
769 875
770 876 id : <id_given_in_input>
771 877 result : {
772 878 "msg": "executed maintenance command",
773 879 "executed_actions": [
774 880 <action_message>, <action_message2>...
775 881 ],
776 882 "repository": "<repository name>"
777 883 }
778 884 error : null
779 885
780 886 Example error output:
781 887
782 888 .. code-block:: bash
783 889
784 890 id : <id_given_in_input>
785 891 result : null
786 892 error : {
787 893 "Unable to execute maintenance on `<reponame>`"
788 894 }
789 895
790 896
791 897 pull
792 898 ----
793 899
794 900 .. py:function:: pull(apiuser, repoid, remote_uri=<Optional:None>)
795 901
796 902 Triggers a pull on the given repository from a remote location. You
797 903 can use this to keep remote repositories up-to-date.
798 904
799 905 This command can only be run using an |authtoken| with admin
800 906 rights to the specified repository. For more information,
801 907 see :ref:`config-token-ref`.
802 908
803 909 This command takes the following options:
804 910
805 911 :param apiuser: This is filled automatically from the |authtoken|.
806 912 :type apiuser: AuthUser
807 913 :param repoid: The repository name or repository ID.
808 914 :type repoid: str or int
809 915 :param remote_uri: Optional remote URI to pass in for pull
810 916 :type remote_uri: str
811 917
812 918 Example output:
813 919
814 920 .. code-block:: bash
815 921
816 922 id : <id_given_in_input>
817 923 result : {
818 924 "msg": "Pulled from url `<remote_url>` on repo `<repository name>`"
819 925 "repository": "<repository name>"
820 926 }
821 927 error : null
822 928
823 929 Example error output:
824 930
825 931 .. code-block:: bash
826 932
827 933 id : <id_given_in_input>
828 934 result : null
829 935 error : {
830 936 "Unable to push changes from `<remote_url>`"
831 937 }
832 938
833 939
834 940 remove_field_from_repo
835 941 ----------------------
836 942
837 943 .. py:function:: remove_field_from_repo(apiuser, repoid, key)
838 944
839 945 Removes an extra field from a repository.
840 946
841 947 This command can only be run using an |authtoken| with at least
842 948 write permissions to the |repo|.
843 949
844 950 :param apiuser: This is filled automatically from the |authtoken|.
845 951 :type apiuser: AuthUser
846 952 :param repoid: Set the repository name or repository ID.
847 953 :type repoid: str or int
848 954 :param key: Set the unique field key for this repository.
849 955 :type key: str
850 956
851 957
852 958 revoke_user_group_permission
853 959 ----------------------------
854 960
855 961 .. py:function:: revoke_user_group_permission(apiuser, repoid, usergroupid)
856 962
857 963 Revoke the permissions of a user group on a given repository.
858 964
859 965 This command can only be run using an |authtoken| with admin
860 966 permissions on the |repo|.
861 967
862 968 :param apiuser: This is filled automatically from the |authtoken|.
863 969 :type apiuser: AuthUser
864 970 :param repoid: Set the repository name or repository ID.
865 971 :type repoid: str or int
866 972 :param usergroupid: Specify the user group ID.
867 973 :type usergroupid: str or int
868 974
869 975 Example output:
870 976
871 977 .. code-block:: bash
872 978
873 979 id : <id_given_in_input>
874 980 result: {
875 981 "msg" : "Revoked perm for group: `<usersgroupname>` in repo: `<reponame>`",
876 982 "success": true
877 983 }
878 984 error: null
879 985
880 986
881 987 revoke_user_permission
882 988 ----------------------
883 989
884 990 .. py:function:: revoke_user_permission(apiuser, repoid, userid)
885 991
886 992 Revoke permission for a user on the specified repository.
887 993
888 994 This command can only be run using an |authtoken| with admin
889 995 permissions on the |repo|.
890 996
891 997 :param apiuser: This is filled automatically from the |authtoken|.
892 998 :type apiuser: AuthUser
893 999 :param repoid: Set the repository name or repository ID.
894 1000 :type repoid: str or int
895 1001 :param userid: Set the user name of revoked user.
896 1002 :type userid: str or int
897 1003
898 1004 Example error output:
899 1005
900 1006 .. code-block:: bash
901 1007
902 1008 id : <id_given_in_input>
903 1009 result: {
904 1010 "msg" : "Revoked perm for user: `<username>` in repo: `<reponame>`",
905 1011 "success": true
906 1012 }
907 1013 error: null
908 1014
909 1015
910 1016 set_repo_settings
911 1017 -----------------
912 1018
913 1019 .. py:function:: set_repo_settings(apiuser, repoid, settings)
914 1020
915 1021 Update repository settings. Returns true on success.
916 1022
917 1023 :param apiuser: This is filled automatically from the |authtoken|.
918 1024 :type apiuser: AuthUser
919 1025 :param repoid: The repository name or repository id.
920 1026 :type repoid: str or int
921 1027 :param settings: The new settings for the repository.
922 1028 :type: settings: dict
923 1029
924 1030 Example output:
925 1031
926 1032 .. code-block:: bash
927 1033
928 1034 {
929 1035 "error": null,
930 1036 "id": 237,
931 1037 "result": true
932 1038 }
933 1039
934 1040
935 1041 strip
936 1042 -----
937 1043
938 1044 .. py:function:: strip(apiuser, repoid, revision, branch)
939 1045
940 1046 Strips the given revision from the specified repository.
941 1047
942 1048 * This will remove the revision and all of its decendants.
943 1049
944 1050 This command can only be run using an |authtoken| with admin rights to
945 1051 the specified repository.
946 1052
947 1053 This command takes the following options:
948 1054
949 1055 :param apiuser: This is filled automatically from the |authtoken|.
950 1056 :type apiuser: AuthUser
951 1057 :param repoid: The repository name or repository ID.
952 1058 :type repoid: str or int
953 1059 :param revision: The revision you wish to strip.
954 1060 :type revision: str
955 1061 :param branch: The branch from which to strip the revision.
956 1062 :type branch: str
957 1063
958 1064 Example output:
959 1065
960 1066 .. code-block:: bash
961 1067
962 1068 id : <id_given_in_input>
963 1069 result : {
964 1070 "msg": "'Stripped commit <commit_hash> from repo `<repository name>`'"
965 1071 "repository": "<repository name>"
966 1072 }
967 1073 error : null
968 1074
969 1075 Example error output:
970 1076
971 1077 .. code-block:: bash
972 1078
973 1079 id : <id_given_in_input>
974 1080 result : null
975 1081 error : {
976 1082 "Unable to strip commit <commit_hash> from repo `<repository name>`"
977 1083 }
978 1084
979 1085
980 1086 update_repo
981 1087 -----------
982 1088
983 1089 .. py:function:: update_repo(apiuser, repoid, repo_name=<Optional:None>, owner=<Optional:<OptionalAttr:apiuser>>, description=<Optional:''>, private=<Optional:False>, clone_uri=<Optional:None>, push_uri=<Optional:None>, landing_rev=<Optional:'rev:tip'>, fork_of=<Optional:None>, enable_statistics=<Optional:False>, enable_locking=<Optional:False>, enable_downloads=<Optional:False>, fields=<Optional:''>)
984 1090
985 1091 Updates a repository with the given information.
986 1092
987 1093 This command can only be run using an |authtoken| with at least
988 1094 admin permissions to the |repo|.
989 1095
990 1096 * If the repository name contains "/", repository will be updated
991 1097 accordingly with a repository group or nested repository groups
992 1098
993 1099 For example repoid=repo-test name="foo/bar/repo-test" will update |repo|
994 1100 called "repo-test" and place it inside group "foo/bar".
995 1101 You have to have permissions to access and write to the last repository
996 1102 group ("bar" in this example)
997 1103
998 1104 :param apiuser: This is filled automatically from the |authtoken|.
999 1105 :type apiuser: AuthUser
1000 1106 :param repoid: repository name or repository ID.
1001 1107 :type repoid: str or int
1002 1108 :param repo_name: Update the |repo| name, including the
1003 1109 repository group it's in.
1004 1110 :type repo_name: str
1005 1111 :param owner: Set the |repo| owner.
1006 1112 :type owner: str
1007 1113 :param fork_of: Set the |repo| as fork of another |repo|.
1008 1114 :type fork_of: str
1009 1115 :param description: Update the |repo| description.
1010 1116 :type description: str
1011 1117 :param private: Set the |repo| as private. (True | False)
1012 1118 :type private: bool
1013 1119 :param clone_uri: Update the |repo| clone URI.
1014 1120 :type clone_uri: str
1015 1121 :param landing_rev: Set the |repo| landing revision. Default is ``rev:tip``.
1016 1122 :type landing_rev: str
1017 1123 :param enable_statistics: Enable statistics on the |repo|, (True | False).
1018 1124 :type enable_statistics: bool
1019 1125 :param enable_locking: Enable |repo| locking.
1020 1126 :type enable_locking: bool
1021 1127 :param enable_downloads: Enable downloads from the |repo|, (True | False).
1022 1128 :type enable_downloads: bool
1023 1129 :param fields: Add extra fields to the |repo|. Use the following
1024 1130 example format: ``field_key=field_val,field_key2=fieldval2``.
1025 1131 Escape ', ' with \,
1026 1132 :type fields: str
1027 1133
1028 1134
@@ -1,234 +1,268 b''
1 1 .. _server-methods-ref:
2 2
3 3 server methods
4 4 ==============
5 5
6 6 cleanup_sessions
7 7 ----------------
8 8
9 9 .. py:function:: cleanup_sessions(apiuser, older_then=<Optional:60>)
10 10
11 11 Triggers a session cleanup action.
12 12
13 13 If the ``older_then`` option is set, only sessions that hasn't been
14 14 accessed in the given number of days will be removed.
15 15
16 16 This command can only be run using an |authtoken| with admin rights to
17 17 the specified repository.
18 18
19 19 This command takes the following options:
20 20
21 21 :param apiuser: This is filled automatically from the |authtoken|.
22 22 :type apiuser: AuthUser
23 23 :param older_then: Deletes session that hasn't been accessed
24 24 in given number of days.
25 25 :type older_then: Optional(int)
26 26
27 27 Example output:
28 28
29 29 .. code-block:: bash
30 30
31 31 id : <id_given_in_input>
32 32 result: {
33 33 "backend": "<type of backend>",
34 34 "sessions_removed": <number_of_removed_sessions>
35 35 }
36 36 error : null
37 37
38 38 Example error output:
39 39
40 40 .. code-block:: bash
41 41
42 42 id : <id_given_in_input>
43 43 result : null
44 44 error : {
45 45 'Error occurred during session cleanup'
46 46 }
47 47
48 48
49 49 get_ip
50 50 ------
51 51
52 52 .. py:function:: get_ip(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
53 53
54 54 Displays the IP Address as seen from the |RCE| server.
55 55
56 56 * This command displays the IP Address, as well as all the defined IP
57 57 addresses for the specified user. If the ``userid`` is not set, the
58 58 data returned is for the user calling the method.
59 59
60 60 This command can only be run using an |authtoken| with admin rights to
61 61 the specified repository.
62 62
63 63 This command takes the following options:
64 64
65 65 :param apiuser: This is filled automatically from |authtoken|.
66 66 :type apiuser: AuthUser
67 67 :param userid: Sets the userid for which associated IP Address data
68 68 is returned.
69 69 :type userid: Optional(str or int)
70 70
71 71 Example output:
72 72
73 73 .. code-block:: bash
74 74
75 75 id : <id_given_in_input>
76 76 result : {
77 77 "server_ip_addr": "<ip_from_clien>",
78 78 "user_ips": [
79 79 {
80 80 "ip_addr": "<ip_with_mask>",
81 81 "ip_range": ["<start_ip>", "<end_ip>"],
82 82 },
83 83 ...
84 84 ]
85 85 }
86 86
87 87
88 88 get_method
89 89 ----------
90 90
91 91 .. py:function:: get_method(apiuser, pattern=<Optional:'*'>)
92 92
93 93 Returns list of all available API methods. By default match pattern
94 94 os "*" but any other pattern can be specified. eg *comment* will return
95 95 all methods with comment inside them. If just single method is matched
96 96 returned data will also include method specification
97 97
98 98 This command can only be run using an |authtoken| with admin rights to
99 99 the specified repository.
100 100
101 101 This command takes the following options:
102 102
103 103 :param apiuser: This is filled automatically from the |authtoken|.
104 104 :type apiuser: AuthUser
105 105 :param pattern: pattern to match method names against
106 :type older_then: Optional("*")
106 :type pattern: Optional("*")
107 107
108 108 Example output:
109 109
110 110 .. code-block:: bash
111 111
112 112 id : <id_given_in_input>
113 113 "result": [
114 114 "changeset_comment",
115 115 "comment_pull_request",
116 116 "comment_commit"
117 117 ]
118 118 error : null
119 119
120 120 .. code-block:: bash
121 121
122 122 id : <id_given_in_input>
123 123 "result": [
124 124 "comment_commit",
125 125 {
126 126 "apiuser": "<RequiredType>",
127 127 "comment_type": "<Optional:u'note'>",
128 128 "commit_id": "<RequiredType>",
129 129 "message": "<RequiredType>",
130 130 "repoid": "<RequiredType>",
131 131 "request": "<RequiredType>",
132 132 "resolves_comment_id": "<Optional:None>",
133 133 "status": "<Optional:None>",
134 134 "userid": "<Optional:<OptionalAttr:apiuser>>"
135 135 }
136 136 ]
137 137 error : null
138 138
139 139
140 140 get_repo_store
141 141 --------------
142 142
143 143 .. py:function:: get_repo_store(apiuser)
144 144
145 145 Returns the |RCE| repository storage information.
146 146
147 147 :param apiuser: This is filled automatically from the |authtoken|.
148 148 :type apiuser: AuthUser
149 149
150 150 Example output:
151 151
152 152 .. code-block:: bash
153 153
154 154 id : <id_given_in_input>
155 155 result : {
156 156 'modules': [<module name>,...]
157 157 'py_version': <python version>,
158 158 'platform': <platform type>,
159 159 'rhodecode_version': <rhodecode version>
160 160 }
161 161 error : null
162 162
163 163
164 164 get_server_info
165 165 ---------------
166 166
167 167 .. py:function:: get_server_info(apiuser)
168 168
169 169 Returns the |RCE| server information.
170 170
171 171 This includes the running version of |RCE| and all installed
172 172 packages. This command takes the following options:
173 173
174 174 :param apiuser: This is filled automatically from the |authtoken|.
175 175 :type apiuser: AuthUser
176 176
177 177 Example output:
178 178
179 179 .. code-block:: bash
180 180
181 181 id : <id_given_in_input>
182 182 result : {
183 183 'modules': [<module name>,...]
184 184 'py_version': <python version>,
185 185 'platform': <platform type>,
186 186 'rhodecode_version': <rhodecode version>
187 187 }
188 188 error : null
189 189
190 190
191 191 rescan_repos
192 192 ------------
193 193
194 194 .. py:function:: rescan_repos(apiuser, remove_obsolete=<Optional:False>)
195 195
196 196 Triggers a rescan of the specified repositories.
197 197
198 198 * If the ``remove_obsolete`` option is set, it also deletes repositories
199 199 that are found in the database but not on the file system, so called
200 200 "clean zombies".
201 201
202 202 This command can only be run using an |authtoken| with admin rights to
203 203 the specified repository.
204 204
205 205 This command takes the following options:
206 206
207 207 :param apiuser: This is filled automatically from the |authtoken|.
208 208 :type apiuser: AuthUser
209 209 :param remove_obsolete: Deletes repositories from the database that
210 210 are not found on the filesystem.
211 211 :type remove_obsolete: Optional(``True`` | ``False``)
212 212
213 213 Example output:
214 214
215 215 .. code-block:: bash
216 216
217 217 id : <id_given_in_input>
218 218 result : {
219 219 'added': [<added repository name>,...]
220 220 'removed': [<removed repository name>,...]
221 221 }
222 222 error : null
223 223
224 224 Example error output:
225 225
226 226 .. code-block:: bash
227 227
228 228 id : <id_given_in_input>
229 229 result : null
230 230 error : {
231 231 'Error occurred during rescan repositories action'
232 232 }
233 233
234 234
235 store_exception
236 ---------------
237
238 .. py:function:: store_exception(apiuser, exc_data_json, prefix=<Optional:'rhodecode'>)
239
240 Stores sent exception inside the built-in exception tracker in |RCE| server.
241
242 This command can only be run using an |authtoken| with admin rights to
243 the specified repository.
244
245 This command takes the following options:
246
247 :param apiuser: This is filled automatically from the |authtoken|.
248 :type apiuser: AuthUser
249
250 :param exc_data_json: JSON data with exception e.g
251 {"exc_traceback": "Value `1` is not allowed", "exc_type_name": "ValueError"}
252 :type exc_data_json: JSON data
253
254 :param prefix: prefix for error type, e.g 'rhodecode', 'vcsserver', 'rhodecode-tools'
255 :type prefix: Optional("rhodecode")
256
257 Example output:
258
259 .. code-block:: bash
260
261 id : <id_given_in_input>
262 "result": {
263 "exc_id": 139718459226384,
264 "exc_url": "http://localhost:8080/_admin/settings/exceptions/139718459226384"
265 }
266 error : null
267
268
@@ -1,18 +1,19 b''
1 1 .. _config-saml-generic-ref:
2 2
3 3
4 4 SAML 2.0 Authentication
5 5 -----------------------
6 6
7 7
8 8 **This plugin is available only in EE Edition.**
9 9
10 10 RhodeCode Supports standard SAML 2.0 SSO for the web-application part.
11 11
12 12 Please check for reference two example providers:
13 13
14 14 .. toctree::
15 15
16 16 auth-saml-duosecurity
17 17 auth-saml-onelogin
18 auth-saml-bulk-enroll-users
18 19
@@ -1,140 +1,144 b''
1 1 .. _ssh-connection:
2 2
3 3 SSH Connection
4 4 --------------
5 5
6 6 If you wish to connect to your |repos| using SSH protocol, use the
7 7 following instructions.
8 8
9 9 1. Include |RCE| generated `authorized_keys` file into your sshd_config.
10 10
11 11 By default a file `authorized_keys_rhodecode` is created containing
12 12 configuration and all allowed user connection keys are stored inside.
13 13 On each change of stored keys inside |RCE| this file is updated with
14 14 proper data.
15 15
16 16 .. code-block:: bash
17 17
18 18 # Edit sshd_config file most likely at /etc/ssh/sshd_config
19 19 # add or edit the AuthorizedKeysFile, and set to use custom files
20 20
21 21 AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
22 22
23 23 This way we use a separate file for SSH access and separate one for
24 24 SSH access to |RCE| repositories.
25 25
26 26
27 27 2. Enable the SSH module on instance.
28 28
29 29 On the server where |RCE| is running executing:
30 30
31 31 .. code-block:: bash
32 32
33 33 rccontrol enable-module ssh {instance-id}
34 34
35 35 This will add the following configuration into :file:`rhodecode.ini`.
36 36 This also can be done manually:
37 37
38 38 .. code-block:: ini
39 39
40 40 ############################################################
41 41 ### SSH Support Settings ###
42 42 ############################################################
43 43
44 44 ## Defines if a custom authorized_keys file should be created and written on
45 45 ## any change user ssh keys. Setting this to false also disables posibility
46 46 ## of adding SSH keys by users from web interface. Super admins can still
47 47 ## manage SSH Keys.
48 48 ssh.generate_authorized_keyfile = true
49 49
50 50 ## Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
51 51 # ssh.authorized_keys_ssh_opts =
52 52
53 53 ## Path to the authrozied_keys file where the generate entries are placed.
54 54 ## It is possible to have multiple key files specified in `sshd_config` e.g.
55 55 ## AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
56 56 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
57 57
58 58 ## Command to execute the SSH wrapper. The binary is available in the
59 59 ## rhodecode installation directory.
60 60 ## e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
61 61 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
62 62
63 63 ## Allow shell when executing the ssh-wrapper command
64 64 ssh.wrapper_cmd_allow_shell = false
65 65
66 66 ## Enables logging, and detailed output send back to the client during SSH
67 67 ## operations. Useful for debugging, shouldn't be used in production.
68 68 ssh.enable_debug_logging = false
69 69
70 70 ## Paths to binary executable, by default they are the names, but we can
71 71 ## override them if we want to use a custom one
72 72 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
73 73 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
74 74 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
75 75
76 ## Enables SSH key generator web interface. Disabling this still allows users
77 ## to add their own keys.
78 ssh.enable_ui_key_generator = true
79
76 80
77 81 3. Set base_url for instance to enable proper event handling (Optional):
78 82
79 83 If you wish to have integrations working correctly via SSH please configure
80 84 The Application base_url.
81 85
82 86 Use the ``rccontrol status`` command to view instance details.
83 87 Hostname is required for the integration to properly set the instance URL.
84 88
85 89 When your hostname is known (e.g https://code.rhodecode.com) please set it
86 90 inside :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
87 91
88 92 add into `[app:main]` section the following configuration:
89 93
90 94 .. code-block:: ini
91 95
92 96 app.base_url = https://code.rhodecode.com
93 97
94 98
95 99 4. Add the public key to your user account for testing.
96 100 First generate a new key, or use your existing one and have your public key
97 101 at hand.
98 102
99 103 Go to
100 104 :menuselection:`My Account --> SSH Keys` and add the public key with proper description.
101 105
102 106 This will generate a new entry inside our configured `authorized_keys_rhodecode` file.
103 107
104 108 Test the connection from your local machine using the following example:
105 109
106 110 .. note::
107 111
108 112 In case of connection problems please set
109 113 `ssh.enable_debug_logging = true` inside the SSH configuration of
110 114 :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
111 115 Then add, remove your SSH key and try connecting again.
112 116 Debug logging will be printed to help find the problems on the server side.
113 117
114 118 Test connection using the ssh command from the local machine. Make sure
115 119 to use the use who is running the |RCE| server, and not your username from
116 120 the web interface.
117 121
118 122
119 123 For SVN:
120 124
121 125 .. code-block:: bash
122 126
123 127 SVN_SSH="ssh -i ~/.ssh/id_rsa_test_ssh_private.key" svn checkout svn+ssh://rhodecode@rc-server/repo_name
124 128
125 129 For GIT:
126 130
127 131 .. code-block:: bash
128 132
129 133 GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa_test_ssh_private.key' git clone ssh://rhodecode@rc-server/repo_name
130 134
131 135 For Mercurial:
132 136
133 137 .. code-block:: bash
134 138
135 139 Add to hgrc:
136 140
137 141 [ui]
138 142 ssh = ssh -C -i ~/.ssh/id_rsa_test_ssh_private.key
139 143
140 144 hg clone ssh://rhodecode@rc-server/repo_name
@@ -1,226 +1,243 b''
1 1 .. _dev-setup:
2 2
3 3 ===================
4 4 Development setup
5 5 ===================
6 6
7 7
8 8 RhodeCode Enterprise runs inside a Nix managed environment. This ensures build
9 9 environment dependencies are correctly declared and installed during setup.
10 10 It also enables atomic upgrades, rollbacks, and multiple instances of RhodeCode
11 11 Enterprise running with isolation.
12 12
13 13 To set up RhodeCode Enterprise inside the Nix environment, use the following steps:
14 14
15 15
16 16
17 17 Setup Nix Package Manager
18 18 -------------------------
19 19
20 20 To install the Nix Package Manager, please run::
21 21
22 22 $ curl https://nixos.org/nix/install | sh
23 23
24 24 or go to https://nixos.org/nix/ and follow the installation instructions.
25 25 Once this is correctly set up on your system, you should be able to use the
26 26 following commands:
27 27
28 28 * `nix-env`
29 29
30 30 * `nix-shell`
31 31
32 32
33 33 .. tip::
34 34
35 35 Update your channels frequently by running ``nix-channel --update``.
36 36
37 37 .. note::
38 38
39 39 To uninstall nix run the following:
40 40
41 41 remove the . "$HOME/.nix-profile/etc/profile.d/nix.sh" line in your ~/.profile or ~/.bash_profile
42 42 rm -rf $HOME/{.nix-channels,.nix-defexpr,.nix-profile,.config/nixpkgs}
43 43 sudo rm -rf /nix
44 44
45 45 Switch nix to the latest STABLE channel
46 46 ---------------------------------------
47 47
48 48 run::
49 49
50 50 nix-channel --add https://nixos.org/channels/nixos-18.03 nixpkgs
51 51
52 52 Followed by::
53 53
54 54 nix-channel --update
55 nix-env -i nix-2.0.4
55 56
56 57
57 58 Install required binaries
58 59 -------------------------
59 60
60 61 We need some handy tools first.
61 62
62 63 run::
63 64
64 65 nix-env -i nix-prefetch-hg
65 66 nix-env -i nix-prefetch-git
66 67
67 68
69 Speed up JS build by installing PhantomJS
70 -----------------------------------------
71
72 PhantomJS will be downloaded each time nix-shell is invoked. To speed this by
73 setting already downloaded version do this::
74
75 nix-env -i phantomjs-2.1.1
76
77 # and set nix bin path
78 export PATH=$PATH:~/.nix-profile/bin
79
80
68 81 Clone the required repositories
69 82 -------------------------------
70 83
71 84 After Nix is set up, clone the RhodeCode Enterprise Community Edition and
72 85 RhodeCode VCSServer repositories into the same directory.
73 86 RhodeCode currently is using Mercurial Version Control System, please make sure
74 87 you have it installed before continuing.
75 88
76 89 To obtain the required sources, use the following commands::
77 90
78 91 mkdir rhodecode-develop && cd rhodecode-develop
79 hg clone https://code.rhodecode.com/rhodecode-enterprise-ce
80 hg clone https://code.rhodecode.com/rhodecode-vcsserver
92 hg clone -u default https://code.rhodecode.com/rhodecode-enterprise-ce
93 hg clone -u default https://code.rhodecode.com/rhodecode-vcsserver
81 94
82 95 .. note::
83 96
84 97 If you cannot clone the repository, please contact us via support@rhodecode.com
85 98
86 99
87 100 Install some required libraries
88 101 -------------------------------
89 102
90 103 There are some required drivers and dev libraries that we need to install to
91 104 test RhodeCode under different types of databases. For example in Ubuntu we
92 105 need to install the following.
93 106
94 107 required libraries::
95 108
109 # svn related
96 110 sudo apt-get install libapr1-dev libaprutil1-dev
97 111 sudo apt-get install libsvn-dev
112 # libcurl required too
113 sudo apt-get install libcurl4-openssl-dev
114 # mysql/pg server for development, optional
98 115 sudo apt-get install mysql-server libmysqlclient-dev
99 116 sudo apt-get install postgresql postgresql-contrib libpq-dev
100 sudo apt-get install libcurl4-openssl-dev
117
101 118
102 119
103 120 Enter the Development Shell
104 121 ---------------------------
105 122
106 123 The final step is to start the development shells. To do this, run the
107 124 following command from inside the cloned repository::
108 125
109 #first, the vcsserver
126 # first, the vcsserver
110 127 cd ~/rhodecode-vcsserver
111 128 nix-shell
112 129
113 130 # then enterprise sources
114 131 cd ~/rhodecode-enterprise-ce
115 132 nix-shell
116 133
117 134 .. note::
118 135
119 136 On the first run, this will take a while to download and optionally compile
120 137 a few things. The following runs will be faster. The development shell works
121 138 fine on both MacOS and Linux platforms.
122 139
123 140
124 141 Create config.nix for development
125 142 ---------------------------------
126 143
127 144 In order to run proper tests and setup linking across projects, a config.nix
128 145 file needs to be setup::
129 146
130 147 # create config
131 148 mkdir -p ~/.nixpkgs
132 149 touch ~/.nixpkgs/config.nix
133 150
134 151 # put the below content into the ~/.nixpkgs/config.nix file
135 152 # adjusts, the path to where you cloned your repositories.
136 153
137 154 {
138 155 rc = {
139 156 sources = {
140 157 rhodecode-vcsserver = "/home/dev/rhodecode-vcsserver";
141 158 rhodecode-enterprise-ce = "/home/dev/rhodecode-enterprise-ce";
142 159 rhodecode-enterprise-ee = "/home/dev/rhodecode-enterprise-ee";
143 160 };
144 161 };
145 162 }
146 163
147 164
148 165
149 166 Creating a Development Configuration
150 167 ------------------------------------
151 168
152 169 To create a development environment for RhodeCode Enterprise,
153 170 use the following steps:
154 171
155 172 1. Create a copy of vcsserver config:
156 173 `cp ~/rhodecode-vcsserver/configs/development.ini ~/rhodecode-vcsserver/configs/dev.ini`
157 174 2. Create a copy of rhodocode config:
158 175 `cp ~/rhodecode-enterprise-ce/configs/development.ini ~/rhodecode-enterprise-ce/configs/dev.ini`
159 176 3. Adjust the configuration settings to your needs if needed.
160 177
161 178 .. note::
162 179
163 180 It is recommended to use the name `dev.ini` since it's included in .hgignore file.
164 181
165 182
166 183 Setup the Development Database
167 184 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
168 185
169 186 To create a development database, use the following example. This is a one
170 187 time operation executed from the nix-shell of rhodecode-enterprise-ce sources ::
171 188
172 189 rc-setup-app dev.ini \
173 190 --user=admin --password=secret \
174 191 --email=admin@example.com \
175 192 --repos=~/my_dev_repos
176 193
177 194
178 195 Compile CSS and JavaScript
179 196 ^^^^^^^^^^^^^^^^^^^^^^^^^^
180 197
181 198 To use the application's frontend and prepare it for production deployment,
182 199 you will need to compile the CSS and JavaScript with Grunt.
183 200 This is easily done from within the nix-shell using the following command::
184 201
185 grunt
202 make web-build
186 203
187 204 When developing new features you will need to recompile following any
188 205 changes made to the CSS or JavaScript files when developing the code::
189 206
190 207 grunt watch
191 208
192 209 This prepares the development (with comments/whitespace) versions of files.
193 210
194 211 Start the Development Servers
195 212 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
196 213
197 214 From the rhodecode-vcsserver directory, start the development server in another
198 215 nix-shell, using the following command::
199 216
200 217 pserve configs/dev.ini
201 218
202 219 In the adjacent nix-shell which you created for your development server, you may
203 220 now start CE with the following command::
204 221
205 222
206 223 pserve --reload configs/dev.ini
207 224
208 225 .. note::
209 226
210 227 `--reload` flag will automatically reload the server when source file changes.
211 228
212 229
213 230 Run the Environment Tests
214 231 ^^^^^^^^^^^^^^^^^^^^^^^^^
215 232
216 233 Please make sure that the tests are passing to verify that your environment is
217 234 set up correctly. RhodeCode uses py.test to run tests.
218 235 While your instance is running, start a new nix-shell and simply run
219 236 ``make test`` to run the basic test suite.
220 237
221 238
222 239 Need Help?
223 240 ^^^^^^^^^^
224 241
225 242 Join us on Slack via https://rhodecode.com/join or post questions in our
226 243 Community Portal at https://community.rhodecode.com
@@ -1,44 +1,44 b''
1 1 .. _integrations-rcextensions:
2 2
3 3
4 4 rcextensions integrations
5 5 =========================
6 6
7 7
8 8 Since RhodeCode 4.14 release rcextensions aren't part of rhodecode-tools, and instead
9 9 they are shipped with the new or upgraded installations.
10 10
11 11 The rcextensions template `rcextensions.tmpl` is created in the `etc/` directory
12 12 of enterprise or community installation. It's always re-created and updated on upgrades.
13 13
14 14
15 15 Activating rcextensions
16 16 +++++++++++++++++++++++
17 17
18 18 To activate rcextensions simply copy or rename the created template rcextensions
19 19 into the path where the rhodecode.ini file is located::
20 20
21 pushd ~/rccontrol/enterprise-1/
21 pushd ~/.rccontrol/enterprise-1/
22 22 or
23 pushd ~/rccontrol/community-1/
23 pushd ~/.rccontrol/community-1/
24 24
25 mv etc/rcextensions.tmpl rcextensions
25 mv profile/etc/rcextensions.tmpl rcextensions
26 26
27 27
28 28 rcextensions are loaded when |RCE| starts. So a restart is required after activation or
29 29 change of code in rcextensions.
30 30
31 31 Simply restart only the enterprise/community instance::
32 32
33 33 rccontrol restart enterprise-1
34 34 or
35 35 rccontrol restart community-1
36 36
37 37
38 38 Example usage
39 39 +++++++++++++
40 40
41 41
42 42 To see examples of usage please check the examples directory under:
43 43
44 44 https://code.rhodecode.com/rhodecode-enterprise-ce/files/stable/rhodecode/config/rcextensions/examples
@@ -1,114 +1,114 b''
1 1 |RCE| 4.14.0 |RNS|
2 2 ------------------
3 3
4 4 Release Date
5 5 ^^^^^^^^^^^^
6 6
7 7 - 2018-11-02
8 8
9 9
10 10 New Features
11 11 ^^^^^^^^^^^^
12 12
13 13 - Diffs: expose range diff inside the PR view. It's now possible to show
14 14 commit-per-commit view of changes in pull request.
15 15 - Diffs: new sticky context bar.
16 16 When browsing diffs we show file path of the current diff so users are aware all the time
17 17 what file they are reviewing.
18 18 - Diffs: added quick file selector in diffs views. Now it's possible to select a file
19 19 in large diffs from the sticky header for quicker access to certain interesting files
20 20 in diffs.
21 21 - Diffs: introducing diff menu for whitespace toggle and context changes.
22 22 It's now possible to show/hide whitespace changes and toggle the file context in
23 23 all diff places including pull requests.
24 24 - Comments: allow commenting on empty files without content.
25 25 - Repositories: added option to archive repositories instead of deleting them.
26 26 Archived repositories are useful for future auditing, but they are read-only.
27 27 - rcextensions: new rcextensions. We're introducing new `rcextensions` that will be base
28 28 for future low-level integrations. It's now possible to expose nice messages back
29 29 to the users when using `rcextensions`.
30 30 - Summary page: slightly re-organize summary page for better user experience.
31 31
32 32
33 33 General
34 34 ^^^^^^^
35 35
36 36 - Mailing: switched from custom library to pyramid_mailer with python3 compatibility.
37 37 - Frontend: Switched to Polymer 3.0.
38 38 - Frontend: fixed problems with IE11 and brought back support for that browser.
39 39 - Git: use a fetch_sync based creation of remote repositories.
40 40 This fixes problems with importing from Bitbucket.
41 41 - Comments: update comments email templates.
42 42 - Packaging: only wrap external dependency scripts. This makes execution of scripts
43 43 roughly 5x faster due to much smaller PATH tree.
44 44 - HTTP: use application wide detection of invalid bytes sent via URL/GET/POST data.
45 45 - Fonts/UI: use consistent fonts across the whole application.
46 46 Few places had non-standard custom fonts.
47 47 - Google: updated google auth plugin with latest API changes.
48 48 - Core: handle edge case requesting matched routes but with hg/svn/git or api context.
49 49 - Dependencies: bumped rhodecode-tools to 1.0.0 release using Apache2 license.
50 50 - Dependencies: atomicwrites==1.2.1
51 51 - Dependencies: attrs==18.2.0
52 52 - Dependencies: dogpile.cache==0.6.7
53 53 - Dependencies: psutil==5.4.7
54 54 - Dependencies: pathlib2==2.3.2
55 55 - Dependencies: subprocess32==3.5.2
56 56 - Dependencies: gevent==1.3.6
57 57 - Dependencies: greenlet==0.4.15
58 58 - Dependencies: pytest==3.8.2
59 59 - Dependencies: py==1.6.0
60 60 - Dependencies: pytest-cov==2.6.0
61 61 - Dependencies: pytest-timeout==1.3.2
62 62 - Dependencies: coverage==4.5.1
63 63 - Dependencies: psycopg2==2.7.5
64 64
65 65
66 66 Security
67 67 ^^^^^^^^
68 68
69 69 - RST: improve Javascript RST sandbox.
70 70 - Jupyter: sanitize markdown cells similar as we do for our own markdown cleanup.
71 71
72 72
73 73 Performance
74 74 ^^^^^^^^^^^
75 75
76 76 - SSH: improved SSH wrapper execution speed by using optimized binary script wrapping.
77 77 - Core: reduced font and JavaScript load times.
78 78
79 79
80 80 Fixes
81 81 ^^^^^
82 82
83 83 - Comments: ensure we always display unmatched comments.
84 84 - Branch Permissions: fixed changing rule order for branch permissions.
85 85 - Users: ensure get_first_superadmin actually gets the 1st created super-admin.
86 86 - Users: when deleting users ensure we also clear personal flag.
87 87 This fixes some problems with multiple personal groups.
88 88 - Diffs: disable the error border on highlight errors.
89 89 - Integrations: implement retry to HTTP[S] calls for integrations.
90 90 Web parts will do a 3x retry call in case service is not reachable or
91 91 responds with 5XX codes.
92 92 - Git: fixed pull-request updates in case branch names are the same as the file names.
93 93 - Supervisor: add patch for older kernel support.
94 94 - Compare: fixed file after/before links in compare view for cross repo compare.
95 95 - Emails: improve fonts and rendering of email HTML.
96 96 - Permissions: flush members of user groups permissions to clear caches.
97 97 - Repository: add check preventing of removal of repo with attached pull requests. Users
98 98 should use the new archive repo function instead.
99 99
100 100
101 101 Upgrade notes
102 102 ^^^^^^^^^^^^^
103 103
104 104 - In this release, we're shipping a new `rcextensions`. The changes made are
105 105 backward incompatible. An update of `rcextensions` is required
106 106 prior to using them again. Please check the new `rcextensions.tmpl` directory
107 located in `etc/rcextensions.tmpl` in your instance installation path.
107 located in `profile/etc/rcextensions.tmpl` in your instance installation path.
108 108 Old code should be 100% portable by just copy&paste to the right function.
109 109
110 110 - Mailing: We introduced a new mailing library. The older options should be compatible and
111 111 generally, old configuration doesn't need any changes in order to send emails.
112 112 We, however, encourage users to re-check mailing setup in case of some more
113 113 sophisticated email setups.
114 114 There's a possibility to send a test email from admin > settings > email section.
@@ -1,128 +1,129 b''
1 1 .. _rhodecode-release-notes-ref:
2 2
3 3 Release Notes
4 4 =============
5 5
6 6 |RCE| 4.x Versions
7 7 ------------------
8 8
9 9 .. toctree::
10 10 :maxdepth: 1
11 11
12 release-notes-4.16.0.rst
12 13 release-notes-4.15.2.rst
13 14 release-notes-4.15.1.rst
14 15 release-notes-4.15.0.rst
15 16 release-notes-4.14.1.rst
16 17 release-notes-4.14.0.rst
17 18 release-notes-4.13.3.rst
18 19 release-notes-4.13.2.rst
19 20 release-notes-4.13.1.rst
20 21 release-notes-4.13.0.rst
21 22 release-notes-4.12.4.rst
22 23 release-notes-4.12.3.rst
23 24 release-notes-4.12.2.rst
24 25 release-notes-4.12.1.rst
25 26 release-notes-4.12.0.rst
26 27 release-notes-4.11.6.rst
27 28 release-notes-4.11.5.rst
28 29 release-notes-4.11.4.rst
29 30 release-notes-4.11.3.rst
30 31 release-notes-4.11.2.rst
31 32 release-notes-4.11.1.rst
32 33 release-notes-4.11.0.rst
33 34 release-notes-4.10.6.rst
34 35 release-notes-4.10.5.rst
35 36 release-notes-4.10.4.rst
36 37 release-notes-4.10.3.rst
37 38 release-notes-4.10.2.rst
38 39 release-notes-4.10.1.rst
39 40 release-notes-4.10.0.rst
40 41 release-notes-4.9.1.rst
41 42 release-notes-4.9.0.rst
42 43 release-notes-4.8.0.rst
43 44 release-notes-4.7.2.rst
44 45 release-notes-4.7.1.rst
45 46 release-notes-4.7.0.rst
46 47 release-notes-4.6.1.rst
47 48 release-notes-4.6.0.rst
48 49 release-notes-4.5.2.rst
49 50 release-notes-4.5.1.rst
50 51 release-notes-4.5.0.rst
51 52 release-notes-4.4.2.rst
52 53 release-notes-4.4.1.rst
53 54 release-notes-4.4.0.rst
54 55 release-notes-4.3.1.rst
55 56 release-notes-4.3.0.rst
56 57 release-notes-4.2.1.rst
57 58 release-notes-4.2.0.rst
58 59 release-notes-4.1.2.rst
59 60 release-notes-4.1.1.rst
60 61 release-notes-4.1.0.rst
61 62 release-notes-4.0.1.rst
62 63 release-notes-4.0.0.rst
63 64
64 65 |RCE| 3.x Versions
65 66 ------------------
66 67
67 68 .. toctree::
68 69 :maxdepth: 1
69 70
70 71 release-notes-3.8.4.rst
71 72 release-notes-3.8.3.rst
72 73 release-notes-3.8.2.rst
73 74 release-notes-3.8.1.rst
74 75 release-notes-3.8.0.rst
75 76 release-notes-3.7.1.rst
76 77 release-notes-3.7.0.rst
77 78 release-notes-3.6.1.rst
78 79 release-notes-3.6.0.rst
79 80 release-notes-3.5.2.rst
80 81 release-notes-3.5.1.rst
81 82 release-notes-3.5.0.rst
82 83 release-notes-3.4.1.rst
83 84 release-notes-3.4.0.rst
84 85 release-notes-3.3.4.rst
85 86 release-notes-3.3.3.rst
86 87 release-notes-3.3.2.rst
87 88 release-notes-3.3.1.rst
88 89 release-notes-3.3.0.rst
89 90 release-notes-3.2.3.rst
90 91 release-notes-3.2.2.rst
91 92 release-notes-3.2.1.rst
92 93 release-notes-3.2.0.rst
93 94 release-notes-3.1.1.rst
94 95 release-notes-3.1.0.rst
95 96 release-notes-3.0.2.rst
96 97 release-notes-3.0.1.rst
97 98 release-notes-3.0.0.rst
98 99
99 100 |RCE| 2.x Versions
100 101 ------------------
101 102
102 103 .. toctree::
103 104 :maxdepth: 1
104 105
105 106 release-notes-2.2.8.rst
106 107 release-notes-2.2.7.rst
107 108 release-notes-2.2.6.rst
108 109 release-notes-2.2.5.rst
109 110 release-notes-2.2.4.rst
110 111 release-notes-2.2.3.rst
111 112 release-notes-2.2.2.rst
112 113 release-notes-2.2.1.rst
113 114 release-notes-2.2.0.rst
114 115 release-notes-2.1.0.rst
115 116 release-notes-2.0.2.rst
116 117 release-notes-2.0.1.rst
117 118 release-notes-2.0.0.rst
118 119
119 120 |RCE| 1.x Versions
120 121 ------------------
121 122
122 123 .. toctree::
123 124 :maxdepth: 1
124 125
125 126 release-notes-1.7.2.rst
126 127 release-notes-1.7.1.rst
127 128 release-notes-1.7.0.rst
128 129 release-notes-1.6.0.rst
@@ -1,578 +1,578 b''
1 1 .. _tools-cli:
2 2
3 3 |RCT| CLI
4 4 ---------
5 5
6 6 The commands available with |RCT| can be split into three categories:
7 7
8 8 - Remotely executable commands that can be run from your local machine once you
9 9 have your connection details to |RCE| configured.
10 10 - Locally executable commands the can be run on the server to carry out
11 11 general maintenance.
12 12 - Local configuration commands used to help set up your |RCT| configuration.
13 13
14 14
15 15 rhodecode-tools
16 16 ---------------
17 17
18 18 Use |RCT| to setup automation, run the indexer, and install extensions for
19 19 your |RCE| instances. Options:
20 20
21 21 .. rst-class:: dl-horizontal
22 22
23 23 \ - -apihost <api_host>
24 24 Set the API host value.
25 25
26 26 \ - -apikey <apikey_value>
27 27 Set the API key value.
28 28
29 29 \-c, - -config <config_file>
30 30 Create a configuration file. The default file is created
31 31 in ``~/.rhoderc``
32 32
33 33 \ - -save-config
34 34 Save the configuration file.
35 35
36 36 \ - -show-config
37 37 Show the current configuration values.
38 38
39 39 \ - -format {json,pretty}
40 40 Set the formatted representation.
41 41
42 42 Example usage:
43 43
44 44 .. code-block:: bash
45 45
46 46 $ rhodecode-tools --apikey=key --apihost=http://rhodecode.server \
47 47 --save-config
48 48
49 49 rhodecode-api
50 50 -------------
51 51
52 52 The RhodeCode API lets you connect to |RCE| and carry out management tasks from a
53 53 remote machine, for more information about the API, see the :ref:`api`. To
54 54 pass arguments on the command-line use the ``method:option`` syntax.
55 55
56 56 Example usage:
57 57
58 58 .. code-block:: bash
59 59
60 60 # Run the get_repos API call and sample output
61 61 $ rhodecode-api --instance-name=enterprise-1 create_repo \
62 62 repo_name:brand-new repo_type:hg description:repo-desc
63 63
64 64 {
65 65 "error": null,
66 66 "id": 1110,
67 67 "result": {
68 68 "msg": "Created new repository `brand-new`",
69 69 "success": true,
70 70 "task": null
71 71 }
72 72 }
73 73
74 74 Options:
75 75
76 76 .. rst-class:: dl-horizontal
77 77
78 78 \ - -api-cache-only
79 79 Requires a cache to be present when running this call
80 80
81 81 \ - -api-cache-rebuild
82 82 Replaces existing cached values with new ones from server
83 83
84 84 \ - -api-cache <PATH>
85 85 Use a special cache dir to read responses from instead of the server
86 86
87 87 \ - -api-cert-verify
88 88 Verify the endpoint ssl certificate
89 89
90 90 \ - -api-cert <PATH>
91 91 Path to alternate CA bundle.
92 92
93 93 \ - -apihost <api_host>
94 94 Set the API host value.
95 95
96 96 \ - -apikey <apikey_value>
97 97 Set the API key value.
98 98
99 99 \ - -instance-name <instance-id>
100 100 Set the instance name
101 101
102 102 \-I, - -install-dir <DIR>
103 103 Location of application instances
104 104
105 105 \-c, - -config <.rhoderc-file>
106 106 Location of the :file:`.rhoderc`
107 107
108 108 \-F, - -format {json,pretty}
109 109 Set the formatted representation.
110 110
111 111 \-h, - -help
112 112 Show help messages.
113 113
114 114 \-v, - -verbose
115 115 Enable verbose messaging
116 116
117 117 rhodecode-cleanup-gists
118 118 -----------------------
119 119
120 120 Use this to delete gists within |RCE|. Options:
121 121
122 122 .. rst-class:: dl-horizontal
123 123
124 124 \-c, - -config <config_file>
125 125 Set the file path to the configuration file. The default file is
126 126 :file:`/home/{user}/.rhoderc`
127 127
128 128 \ - -corrupted
129 129 Remove gists with corrupted metadata.
130 130
131 131 \ - -dont-ask
132 132 Remove gists without asking for confirmation.
133 133
134 134 \-h, - -help
135 135 Show help messages. current configuration values.
136 136
137 137 \ - -instance-name <instance-id>
138 138 Set the instance name.
139 139
140 140 \-R, - -repo-dir
141 141 Set the repository file path.
142 142
143 143 \ - -version
144 144 Display your |RCT| version.
145 145
146 146 Example usage:
147 147
148 148 .. code-block:: bash
149 149
150 150 # Clean up gists related to an instance
151 151 $ rhodecode-cleanup-gists --instance-name=enterprise-1
152 152 Scanning for gists in /home/brian/repos/.rc_gist_store...
153 153 preparing to remove [3] found gists
154 154
155 155 # Clean up corrupted gists in an instance
156 156 $ rhodecode-cleanup-gists --instance-name=enterprise-1 --corrupted
157 157 Scanning for gists in /home/brian/repos/.rc_gist_store...
158 158 preparing to remove [2] found gists
159 159 the following gists will be archived:
160 160 * EXPIRED: BAD METADATA | /home/brian/repos/.rc_gist_store/5
161 161 * EXPIRED: BAD METADATA | /home/brian/repos/.rc_gist_store/8FtC
162 162 are you sure you want to archive them? [y/N]: y
163 163 removing gist /home/brian/repos/.rc_gist_store/5
164 164 removing gist /home/brian/repos/.rc_gist_store/8FtCKdcbRKmEvRzTVsEt
165 165
166 166 rhodecode-cleanup-repos
167 167 -----------------------
168 168
169 169 Use this to manage |repos| and |repo| groups within |RCE|. Options:
170 170
171 171 .. rst-class:: dl-horizontal
172 172
173 173 \-c, - -config <config_file>
174 174 Set the file path to the configuration file. The default file is
175 175 :file:`/home/{user}/.rhoderc`.
176 176
177 177 \-h, - -help
178 178 Show help messages. current configuration values.
179 179
180 180 \ - -interactive
181 181 Enable an interactive prompt for each repository when deleting.
182 182
183 183 \ - -include-groups
184 184 Remove repository groups.
185 185
186 186 \ - -instance-name <instance-id>
187 187 Set the instance name.
188 188
189 189 \ - -list-only
190 190 Display repositories selected for deletion.
191 191
192 192 \ - -older-than <str>
193 193 Delete repositories older that a specified time.
194 194 You can use the following suffixes; d for days, h for hours,
195 195 m for minutes, s for seconds.
196 196
197 197 \-R, - -repo-dir
198 198 Set the repository file path
199 199
200 200 Example usage:
201 201
202 202 .. code-block:: bash
203 203
204 204 # Cleaning up repos using tools installed with RCE 350 and above
205 205 $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-cleanup-repos \
206 206 --instance-name=enterprise-4 --older-than=1d
207 207 Scanning for repositories in /home/brian/repos...
208 208 preparing to remove [2] found repositories older than 1 day, 0:00:00 (1d)
209 209
210 210 the following repositories will be deleted completely:
211 211 * REMOVED: 2015-08-05 00:23:18 | /home/brian/repos/rm__20150805_002318_831
212 212 * REMOVED: 2015-08-04 01:22:10 | /home/brian/repos/rm__20150804_012210_336
213 213 are you sure you want to remove them? [y/N]:
214 214
215 215 # Clean up repos older than 1 year
216 216 # If using virtualenv and pre RCE 350 tools installation
217 217 (venv)$ rhodecode-cleanup-repos --instance-name=enterprise-1 \
218 218 --older-than=365d
219 219
220 220 Scanning for repositories in /home/brian/repos...
221 221 preparing to remove [343] found repositories older than 365 days
222 222
223 223 # clean up repos older than 3 days
224 224 # If using virtualenv and pre RCE 350 tools installation
225 225 (venv)$ rhodecode-cleanup-repos --instance-name=enterprise-1 \
226 226 --older-than=3d
227 227 Scanning for repositories in /home/brian/repos...
228 228 preparing to remove [3] found repositories older than 3 days
229 229
230 230 .. _tools-config:
231 231
232 232 rhodecode-config
233 233 ----------------
234 234
235 235 Use this to create or update a |RCE| configuration file on the local machine.
236 236
237 237 .. rst-class:: dl-horizontal
238 238
239 239 \- -filename </path/to/config_file>
240 240 Set the file path to the |RCE| configuration file.
241 241
242 242 \- -show-defaults
243 243 Display the defaults set in the |RCE| configuration file.
244 244
245 245 \- -update
246 246 Update the configuration with the new settings passed on the command
247 247 line.
248 248
249 249 .. code-block:: bash
250 250
251 251 # Create a new config file
252 252 $ rhodecode-config --filename=dev.ini
253 253 Wrote new config file in /Users/user/dev.ini
254 254
255 255 # Update config value for given section:
256 256 $ rhodecode-config --update --filename=prod.ini [handler_console]level=INFO
257 257
258 258 $ rhodecode-config --filename=dev.ini --show-defaults
259 259 lang=en
260 260 cpu_number=4
261 261 uuid=<function <lambda> at 0x10d86ac08>
262 262 license_token=ff1e-aa9c-bb66-11e5
263 263 host=127.0.0.1
264 264 here=/Users/brian
265 265 error_aggregation_service=None
266 266 database_url=sqlite:///%(here)s/rhodecode.db?timeout=30
267 267 git_path=git
268 268 http_server=waitress
269 269 port=5000
270 270
271 271 .. _tools-rhodecode-extensions:
272 272
273 273 rhodecode-extensions
274 274 --------------------
275 275
276 276 The `rcextensions` since version 4.14 are now shipped together with |RCE| please check
277 277 the using :ref:`integrations-rcextensions` section.
278 278
279 279
280 280 rhodecode-gist
281 281 --------------
282 282
283 283 Use this to create, list, show, or delete gists within |RCE|. Options:
284 284
285 285 .. rst-class:: dl-horizontal
286 286
287 287 \ - -api-cache-only
288 288 Requires a cache to be present when running this call
289 289
290 290 \ - -api-cache-rebuild
291 291 Replaces existing cached values with new ones from server
292 292
293 293 \ - -api-cache PATH
294 294 Use a special cache dir to read responses from instead of the server
295 295
296 296 \ - -api-cert-verify
297 297 Verify the endpoint ssl certificate
298 298
299 299 \ - -api-cert PATH
300 300 Path to alternate CA bundle.
301 301
302 302 \ - -apihost <api_host>
303 303 Set the API host value.
304 304
305 305 \ - -apikey <apikey_value>
306 306 Set the API key value.
307 307
308 308 \-c, - -config <config_file>
309 309 Create a configuration file.
310 310 The default file is created in :file:`~/.rhoderc`
311 311
312 312 \ - -create <gistname>
313 313 create the gist
314 314
315 315 \-d, - -description <str>
316 316 Set gist description
317 317
318 318 \ - -delete <gistid>
319 319 Delete the gist
320 320
321 321 \-f, - -file
322 322 Specify the filename The file extension will enable syntax highlighting.
323 323
324 324 \-F, - -format {json,pretty}
325 325 Set the formatted representation.
326 326
327 327 \ - -help
328 328 Show help messages.
329 329
330 330 \-I, - -install-dir <DIR>
331 331 Location of application instances
332 332
333 333 \ - -instance-name <instance-id>
334 334 Set the instance name.
335 335
336 336 \ - -list
337 337 Display instance gists.
338 338
339 339 \-l, --lifetime <minutes>
340 340 Set the gist lifetime. The default value is (-1) forever
341 341
342 342 \ - -show <gistname>
343 343 Show the content of the gist
344 344
345 345 \-o, - -open
346 346 After creating Gist open it in browser
347 347
348 348 \-p, - -private
349 349 Create a private gist
350 350
351 351 \ - -version
352 352 Display your |RCT| version.
353 353
354 354 Example usage:
355 355
356 356 .. code-block:: bash
357 357
358 358 # List the gists in an instance
359 359 (venv)brian@ubuntu:~$ rhodecode-gist --instance-name=enterprise-1 list
360 360 {
361 361 "error": null,
362 362 "id": 7102,
363 363 "result": [
364 364 {
365 365 "access_id": "2",
366 366 "content": null,
367 367 "created_on": "2015-01-19T12:52:26.494",
368 368 "description": "A public gust",
369 369 "expires": -1.0,
370 370 "gist_id": 2,
371 371 "type": "public",
372 372 "url": "http://127.0.0.1:10003/_admin/gists/2"
373 373 },
374 374 {
375 375 "access_id": "7gs6BsSEC4pKUEPLz5AB",
376 376 "content": null,
377 377 "created_on": "2015-01-19T11:27:40.812",
378 378 "description": "Gist testing API",
379 379 "expires": -1.0,
380 380 "gist_id": 1,
381 381 "type": "private",
382 382 "url": "http://127.0.0.1:10003/_admin/gists/7gs6BsSEC4pKUEPLz5AB"
383 383 }
384 384 ]
385 385 }
386 386
387 387 # delete a particular gist
388 388 # You use the access_id to specify the gist to delete
389 389 (venv)brian@ubuntu:~$ rhodecode-gist delete 2 --instance-name=enterprise-1
390 390 {
391 391 "error": null,
392 392 "id": 6284,
393 393 "result": {
394 394 "gist": null,
395 395 "msg": "deleted gist ID:2"
396 396 }
397 397 }
398 398
399 399 # cat a file and pipe to new gist
400 400 # This is if you are using virtualenv
401 401 (venv)$ cat ~/.rhoderc | rhodecode-gist --instance-name=enterprise-1 \
402 402 -d '.rhoderc copy' create
403 403
404 404 {
405 405 "error": null,
406 406 "id": 5374,
407 407 "result": {
408 408 "gist": {
409 409 "access_id": "7",
410 410 "content": null,
411 411 "created_on": "2015-01-26T11:31:58.774",
412 412 "description": ".rhoderc copy",
413 413 "expires": -1.0,
414 414 "gist_id": 7,
415 415 "type": "public",
416 416 "url": "http://127.0.0.1:10003/_admin/gists/7"
417 417 },
418 418 "msg": "created new gist"
419 419 }
420 420 }
421 421
422 422 # Cat a file and pipe to gist
423 423 # in RCE 3.5.0 tools and above
424 424 $ cat ~/.rhoderc | ~/.rccontrol/{instance-id}/profile/bin/rhodecode-gist \
425 425 --instance-name=enterprise-4 -d '.rhoderc copy' create
426 426 {
427 427 "error": null,
428 428 "id": 9253,
429 429 "result": {
430 430 "gist": {
431 431 "access_id": "4",
432 432 "acl_level": "acl_public",
433 433 "content": null,
434 434 "created_on": "2015-08-20T05:54:11.250",
435 435 "description": ".rhoderc copy",
436 436 "expires": -1.0,
437 437 "gist_id": 4,
438 438 "modified_at": "2015-08-20T05:54:11.250",
439 439 "type": "public",
440 440 "url": "http://127.0.0.1:10000/_admin/gists/4"
441 441 },
442 442 "msg": "created new gist"
443 443 }
444 444 }
445 445
446 446
447 447 rhodecode-index
448 448 ---------------
449 449
450 450 More detailed information regarding setting up the indexer is available in
451 451 the :ref:`indexing-ref` section. Options:
452 452
453 453 .. rst-class:: dl-horizontal
454 454
455 455 \ - -api-cache-only
456 456 Requires a cache to be present when running this call
457 457
458 458 \ - -api-cache-rebuild
459 459 Replaces existing cached values with new ones from server
460 460
461 461 \ - -api-cache PATH
462 462 Use a special cache dir to read responses from instead of the server
463 463
464 464 \ - -api-cert-verify
465 465 Verify the endpoint ssl certificate
466 466
467 467 \ - -api-cert PATH
468 468 Path to alternate CA bundle.
469 469
470 470 \ - -apihost <api_host>
471 471 Set the API host value.
472 472
473 473 \ - -apikey <apikey_value>
474 474 Set the API key value.
475 475
476 476 \-c, --config <config_file>
477 477 Create a configuration file.
478 478 The default file is created in :file:`~/.rhoderc`
479 479
480 480 \ - -create-mapping <PATH>
481 481 Creates an example mapping configuration for indexer.
482 482
483 483 \-F, - -format {json,pretty}
484 484 Set the formatted representation.
485 485
486 486 \-h, - -help
487 487 Show help messages.
488 488
489 489 \ - -instance-name <instance-id>
490 490 Set the instance name
491 491
492 492 \-I, - -install-dir <DIR>
493 493 Location of application instances
494 494
495 495 \-m, - -mapping <file_name>
496 496 Parse the output to the .ini mapping file.
497 497
498 498 \ - -optimize
499 499 Optimize index for performance by amalgamating multiple index files
500 500 into one. Greatly increases incremental indexing speed.
501 501
502 502 \-R, - -repo-dir <DIRECTORY>
503 503 Location of repositories
504 504
505 505 \ - -source <PATH>
506 506 Use a special source JSON file to feed the indexer
507 507
508 508 \ - -version
509 509 Display your |RCT| version.
510 510
511 511 Example usage:
512 512
513 513 .. code-block:: bash
514 514
515 515 # Run the indexer
516 516 $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-index \
517 517 --instance-name=enterprise-4
518 518
519 # Run indexer based on mapping.ini file
519 # Run indexer based on search_mapping.ini file
520 520 # This is using pre-350 virtualenv
521 521 (venv)$ rhodecode-index --instance-name=enterprise-1
522 522
523 523 # Index from the command line without creating
524 524 # the .rhoderc file
525 525 $ rhodecode-index --apikey=key --apihost=http://rhodecode.server \
526 526 --instance-name=enterprise-2 --save-config
527 527
528 528 # Create the indexing mapping file
529 529 $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-index \
530 --create-mapping mapping.ini --instance-name=enterprise-4
530 --create-mapping search_mapping.ini --instance-name=enterprise-4
531 531
532 532 .. _tools-rhodecode-list-instance:
533 533
534 534 rhodecode-list-instances
535 535 ------------------------
536 536
537 537 Use this command to list the instance details configured in the
538 538 :file:`~/.rhoderc` file.
539 539
540 540 .. code-block:: bash
541 541
542 542 $ .rccontrol/enterprise-1/profile/bin/rhodecode-list-instances
543 543 [instance:production] - Config only
544 544 API-HOST: https://some.url.com
545 545 API-KEY: some.auth.token
546 546
547 547 [instance:development] - Config only
548 548 API-HOST: http://some.ip.address
549 549 API-KEY: some.auth.token
550 550
551 551
552 552 .. _tools-setup-config:
553 553
554 554 rhodecode-setup-config
555 555 ----------------------
556 556
557 557 Use this command to create the ``~.rhoderc`` file required by |RCT| to access
558 558 remote instances.
559 559
560 560 .. rst-class:: dl-horizontal
561 561
562 562 \- -instance-name <name>
563 563 Specify the instance name in the :file:`~/.rhoderc`
564 564
565 565 \api_host <hostname>
566 566 Create a configuration file. The default file is created
567 567 in ``~/.rhoderc``
568 568
569 569 \api_key <auth-token>
570 570 Create a configuration file. The default file is created
571 571 in ``~/.rhoderc``
572 572
573 573
574 574 .. code-block:: bash
575 575
576 576 (venv)$ rhodecode-setup-config --instance-name=tea api_host=URL api_key=xyz
577 577 Config not found under /Users/username/.rhoderc, creating a new one
578 578 Wrote new configuration into /Users/username/.rhoderc
@@ -1,174 +1,174 b''
1 1 {
2 2 "dirs": {
3 3 "css": {
4 4 "src": "rhodecode/public/css",
5 5 "dest": "rhodecode/public/css"
6 6 },
7 7 "js": {
8 8 "src": "rhodecode/public/js/src",
9 9 "src_rc": "rhodecode/public/js/rhodecode",
10 10 "dest": "rhodecode/public/js",
11 11 "node_modules": "node_modules"
12 12 }
13 13 },
14 14 "copy": {
15 15 "main": {
16 16 "files": [
17 17 {
18 18 "expand": true,
19 19 "cwd": "node_modules/@webcomponents",
20 20 "src": "webcomponentsjs/*.*",
21 21 "dest": "<%= dirs.js.dest %>/vendors"
22 22 },
23 23 {
24 24 "src": "<%= dirs.css.src %>/style-polymer.css",
25 25 "dest": "<%= dirs.js.dest %>/src/components/style-polymer.css"
26 26 }
27 27 ]
28 28 }
29 29 },
30 30 "concat": {
31 31 "dist": {
32 32 "src": [
33 33 "<%= dirs.js.node_modules %>/jquery/dist/jquery.min.js",
34 34 "<%= dirs.js.node_modules %>/mousetrap/mousetrap.min.js",
35 35 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
36 36 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
37 37 "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js",
38 38 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js",
39 39 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js",
40 40 "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js",
41 41 "<%= dirs.js.node_modules %>/waypoints/lib/jquery.waypoints.min.js",
42 42 "<%= dirs.js.node_modules %>/appenlight-client/appenlight-client.min.js",
43 43 "<%= dirs.js.src %>/logging.js",
44 44 "<%= dirs.js.src %>/bootstrap.js",
45 45 "<%= dirs.js.src %>/i18n_utils.js",
46 46 "<%= dirs.js.src %>/deform.js",
47 47 "<%= dirs.js.src %>/ejs.js",
48 48 "<%= dirs.js.src %>/ejs_templates/utils.js",
49 49 "<%= dirs.js.src %>/plugins/jquery.pjax.js",
50 50 "<%= dirs.js.src %>/plugins/jquery.dataTables.js",
51 51 "<%= dirs.js.src %>/plugins/flavoured_checkbox.js",
52 52 "<%= dirs.js.src %>/plugins/jquery.auto-grow-input.js",
53 53 "<%= dirs.js.src %>/plugins/jquery.autocomplete.js",
54 54 "<%= dirs.js.src %>/plugins/jquery.debounce.js",
55 "<%= dirs.js.src %>/plugins/jquery.mark.js",
55 "<%= dirs.js.node_modules %>/mark.js/dist/jquery.mark.min.js",
56 56 "<%= dirs.js.src %>/plugins/jquery.timeago.js",
57 57 "<%= dirs.js.src %>/plugins/jquery.timeago-extension.js",
58 58 "<%= dirs.js.src %>/select2/select2.js",
59 59 "<%= dirs.js.src %>/codemirror/codemirror.js",
60 60 "<%= dirs.js.src %>/codemirror/codemirror_loadmode.js",
61 61 "<%= dirs.js.src %>/codemirror/codemirror_hint.js",
62 62 "<%= dirs.js.src %>/codemirror/codemirror_overlay.js",
63 63 "<%= dirs.js.src %>/codemirror/codemirror_placeholder.js",
64 64 "<%= dirs.js.src %>/codemirror/codemirror_simplemode.js",
65 65 "<%= dirs.js.dest %>/mode/meta.js",
66 66 "<%= dirs.js.dest %>/mode/meta_ext.js",
67 67 "<%= dirs.js.src_rc %>/i18n/select2/translations.js",
68 68 "<%= dirs.js.src %>/rhodecode/utils/array.js",
69 69 "<%= dirs.js.src %>/rhodecode/utils/string.js",
70 70 "<%= dirs.js.src %>/rhodecode/utils/pyroutes.js",
71 71 "<%= dirs.js.src %>/rhodecode/utils/ajax.js",
72 72 "<%= dirs.js.src %>/rhodecode/utils/autocomplete.js",
73 73 "<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js",
74 74 "<%= dirs.js.src %>/rhodecode/utils/ie.js",
75 75 "<%= dirs.js.src %>/rhodecode/utils/os.js",
76 76 "<%= dirs.js.src %>/rhodecode/utils/topics.js",
77 77 "<%= dirs.js.src %>/rhodecode/init.js",
78 78 "<%= dirs.js.src %>/rhodecode/changelog.js",
79 79 "<%= dirs.js.src %>/rhodecode/codemirror.js",
80 80 "<%= dirs.js.src %>/rhodecode/comments.js",
81 81 "<%= dirs.js.src %>/rhodecode/constants.js",
82 82 "<%= dirs.js.src %>/rhodecode/files.js",
83 83 "<%= dirs.js.src %>/rhodecode/followers.js",
84 84 "<%= dirs.js.src %>/rhodecode/menus.js",
85 85 "<%= dirs.js.src %>/rhodecode/notifications.js",
86 86 "<%= dirs.js.src %>/rhodecode/permissions.js",
87 87 "<%= dirs.js.src %>/rhodecode/pjax.js",
88 88 "<%= dirs.js.src %>/rhodecode/pullrequests.js",
89 89 "<%= dirs.js.src %>/rhodecode/settings.js",
90 90 "<%= dirs.js.src %>/rhodecode/select2_widgets.js",
91 91 "<%= dirs.js.src %>/rhodecode/tooltips.js",
92 92 "<%= dirs.js.src %>/rhodecode/users.js",
93 93 "<%= dirs.js.src %>/rhodecode/appenlight.js",
94 94 "<%= dirs.js.src %>/rhodecode.js",
95 95 "<%= dirs.js.dest %>/rhodecode-components.js"
96 96 ],
97 97 "dest": "<%= dirs.js.dest %>/scripts.js",
98 98 "nonull": true
99 99 }
100 100 },
101 101 "less": {
102 102 "development": {
103 103 "options": {
104 104 "compress": false,
105 105 "yuicompress": false,
106 106 "optimization": 0
107 107 },
108 108 "files": {
109 109 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
110 110 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less"
111 111 }
112 112 },
113 113 "production": {
114 114 "options": {
115 115 "compress": true,
116 116 "yuicompress": true,
117 117 "optimization": 2
118 118 },
119 119 "files": {
120 120 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
121 121 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less"
122 122 }
123 123 },
124 124 "components": {
125 125 "files": [
126 126 {
127 127 "cwd": "<%= dirs.js.src %>/components/",
128 128 "dest": "<%= dirs.js.src %>/components/",
129 129 "src": [
130 130 "**/*.less"
131 131 ],
132 132 "expand": true,
133 133 "ext": ".css"
134 134 }
135 135 ]
136 136 }
137 137 },
138 138 "watch": {
139 139 "less": {
140 140 "files": [
141 141 "<%= dirs.css.src %>/**/*.less",
142 142 "<%= dirs.js.src %>/components/**/*.less"
143 143 ],
144 144 "tasks": [
145 145 "less:development",
146 146 "less:components",
147 147 "concat:polymercss",
148 148 "webpack",
149 149 "concat:dist"
150 150 ]
151 151 },
152 152 "js": {
153 153 "files": [
154 154 "!<%= dirs.js.src %>/components/root-styles.gen.html",
155 155 "<%= dirs.js.src %>/**/*.js",
156 156 "<%= dirs.js.src %>/components/**/*.html"
157 157 ],
158 158 "tasks": [
159 159 "less:components",
160 160 "concat:polymercss",
161 161 "webpack",
162 162 "concat:dist"
163 163 ]
164 164 }
165 165 },
166 166 "jshint": {
167 167 "rhodecode": {
168 168 "src": "<%= dirs.js.src %>/rhodecode/**/*.js",
169 169 "options": {
170 170 "jshintrc": ".jshintrc"
171 171 }
172 172 }
173 173 }
174 174 }
@@ -1,58 +1,59 b''
1 1 {
2 2 "name": "rhodecode-enterprise",
3 3 "version": "2.0.0",
4 4 "private": true,
5 5 "description" : "RhodeCode JS packaged",
6 6 "license": "SEE LICENSE IN LICENSE.txt",
7 7 "repository" : {
8 8 "type" : "hg",
9 9 "url" : "https://code.rhodecode.com/rhodecode-enterprise-ce"
10 10 },
11 11 "devDependencies": {
12 12 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1",
13 13 "clipboard": "^2.0.1",
14 14 "exports-loader": "^0.6.4",
15 15 "favico.js": "^0.3.10",
16 16 "grunt": "^0.4.5",
17 17 "grunt-cli": "^1.3.1",
18 18 "grunt-contrib-concat": "^0.5.1",
19 19 "grunt-contrib-copy": "^1.0.0",
20 20 "grunt-contrib-jshint": "^0.12.0",
21 21 "grunt-contrib-less": "^1.1.0",
22 22 "grunt-contrib-watch": "^0.6.1",
23 23 "grunt-webpack": "^3.1.3",
24 24 "jquery": "1.11.3",
25 "mark.js": "8.11.1",
25 26 "jshint": "^2.9.1-rc3",
26 27 "moment": "^2.18.1",
27 28 "mousetrap": "^1.6.1",
28 29 "qrious": "^4.0.2",
29 30 "sticky-sidebar": "3.3.1",
30 31 "waypoints": "4.0.1",
31 32 "webpack": "4.23.1",
32 33 "webpack-cli": "3.1.2",
33 34 "babel-core": "^6.26.3",
34 35 "babel-loader": "^7.1.2",
35 36 "babel-plugin-transform-object-rest-spread": "^6.26.0",
36 37 "babel-preset-env": "^1.6.0",
37 38 "copy-webpack-plugin": "^4.4.2",
38 39 "css-loader": "^0.28.11",
39 40 "html-loader": "^0.4.4",
40 41 "html-webpack-plugin": "^3.2.0",
41 42 "imports-loader": "^0.7.1",
42 43 "polymer-webpack-loader": "^2.0.1",
43 44 "style-loader": "^0.21.0",
44 45 "webpack-uglify-js-plugin": "^1.1.9",
45 46 "raw-loader": "1.0.0-beta.0",
46 47 "ts-loader": "^1.3.3",
47 48 "@webcomponents/webcomponentsjs": "^2.0.0",
48 49 "@polymer/polymer": "^3.0.0",
49 50 "@polymer/paper-button": "^3.0.0",
50 51 "@polymer/paper-spinner": "^3.0.0",
51 52 "@polymer/paper-tooltip": "^3.0.0",
52 53 "@polymer/paper-toast": "^3.0.0",
53 54 "@polymer/paper-toggle-button": "^3.0.0",
54 55 "@polymer/iron-ajax": "^3.0.0",
55 56 "@polymer/iron-autogrow-textarea": "^3.0.0",
56 57 "@polymer/iron-a11y-keys": "^3.0.0"
57 58 }
58 59 }
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/controllers/utils.py to rhodecode/lib/view_utils.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now