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

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

@@ -0,0 +1,28 b''
1 .. _repo-admin-set:
2 .. _permissions-info-add-group-ref:
3
4 Repository Administration
5 =========================
6
7 Repository permissions in |RCE| can be managed in a number of different ways.
8 This overview should give you an insight into how you could adopt particular
9 settings for your needs:
10
11 * Global |repo| permissions: This allows you to set the default permissions
12 for each new |repo| created within |RCE|, see :ref:`repo-default-ref`. All
13 |repos| created will inherit these permissions unless explicitly configured.
14 * Individual |repo| permissions: To set individual |repo| permissions,
15 see :ref:`set-repo-perms`.
16 * Repository Group permissions: This allows you to define the permissions for
17 a group, and all |repos| created within that group will inherit the same
18 permissions.
19
20 .. toctree::
21
22 repo_admin/repo-perm-steps
23 repo_admin/repo-extra-fields
24 repo_admin/repo-hooks
25 repo_admin/repo-issue-tracker
26 repo_admin/repo-vcs
27 repo_admin/restore-deleted-repositories
28 repo_admin/repo-admin-tasks No newline at end of file
@@ -0,0 +1,24 b''
1 .. _repo-admin-tasks:
2
3 Common Admin Tasks for Repositories
4 -----------------------------------
5
6
7 Manually Force Delete Repository
8 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
9
10 In case of attached forks or pull-requests repositories should be archived.
11 Here is how to force delete a repository and remove all dependent objects
12
13
14 .. code-block:: bash
15
16 # starts the ishell interactive prompt
17 $ rccontrol ishell enterprise-1
18
19 .. code-block:: python
20
21 In [4]: from rhodecode.model.repo import RepoModel
22 In [3]: repo = Repository.get_by_repo_name('test_repos/repo_with_prs')
23 In [5]: RepoModel().delete(repo, forks='detach', pull_requests='delete')
24 In [6]: Session().commit()
@@ -0,0 +1,24 b''
1 .. _user-admin-tasks:
2
3 Common Admin Tasks for Users
4 ----------------------------
5
6
7 Manually Set Personal Repository Group
8 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
9
10 Here is how to set a repository group as personal for a user using ishell.
11
12
13 .. code-block:: bash
14
15 # starts the ishell interactive prompt
16 $ rccontrol ishell enterprise-1
17
18 .. code-block:: python
19
20 In [1]: repo_group = RepoGroup.get_by_group_name('some_group_name')
21 In [2]: user = User.get_by_username('some_user')
22 In [3]: repo_group.user = user
23 In [4]: repo_group.personal = True
24 In [5]: Session().add(repo_group);Session().commit()
@@ -0,0 +1,35 b''
1 .. _search-methods-ref:
2
3 search methods
4 ==============
5
6 search
7 ------
8
9 .. py:function:: search(apiuser, search_query, search_type, page_limit=<Optional:10>, page=<Optional:1>, search_sort=<Optional:'newfirst'>, repo_name=<Optional:None>, repo_group_name=<Optional:None>)
10
11 Fetch Full Text Search results using API.
12
13 :param apiuser: This is filled automatically from the |authtoken|.
14 :type apiuser: AuthUser
15 :param search_query: Search query.
16 :type search_query: str
17 :param search_type: Search type. The following are valid options:
18 * commit
19 * content
20 * path
21 :type search_type: str
22 :param page_limit: Page item limit, from 1 to 500. Default 10 items.
23 :type page_limit: Optional(int)
24 :param page: Page number. Default first page.
25 :type page: Optional(int)
26 :param search_sort: Search sort order. Default newfirst. The following are valid options:
27 * newfirst
28 * oldfirst
29 :type search_sort: Optional(str)
30 :param repo_name: Filter by one repo. Default is all.
31 :type repo_name: Optional(str)
32 :param repo_group_name: Filter by one repo group. Default is all.
33 :type repo_group_name: Optional(str)
34
35
@@ -0,0 +1,85 b''
1 |RCE| 4.17.0 |RNS|
2 ------------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2019-07-04
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13 - New artifacts feature.
14 Ability to store binary artifacts for repository with ACL
15 - UI/UX refresh for most of the pages. This includes multiple fixes and improvements.
16 - Diffs: store wide-diff mode in user sessions to store user preference for diff display.
17 - Mercurial: added support for Mercurial 4.9
18 - API: Added search API methods
19 - Files: adding/editing allows previews for generated content.
20 - Files: allowed multi file upload using UI.
21 - Repository Groups: last change is now smartly calculated based on latest change
22 from all it's children repositories.
23 - Archives: it's now currently possible to download partial directories from files view.
24 - SVN: allowed executing pre-commit code with rcextensions, also added example to
25 validate SVN file size and paths on pre-commit level.
26
27
28 General
29 ^^^^^^^
30 - Exception store: add filter for display and deletion.
31 - Files: loading history doesn't display hidden and obsolete commits anymore.
32 - Repositories: bring back missing watch action in summary view.
33 - Admin: user groups is now using pure DB filtering to speed up display
34 for large number of groups.
35 - Mercurial: enabled full evolve+topic extensions when evolve is enabled.
36 - Dependencies: bumped evolve to 8.5.1
37 - Dependencies: bumped pyramid to 1.10.4
38 - Dependencies: bumped psutil to 5.5.1
39 - Dependencies: bumped pygments to 2.4.2
40 - Dependencies: bumped pyramid to 1.10.4
41 - Dependencies: bumped psycopg2 to 2.8.3
42 - Dependencies [security]: updated colander to 1.7.0
43
44
45 Security
46 ^^^^^^^^
47
48 - SSH: replaced pycrypto with cryptography to generate SSH keys as pycrypto isn't
49 considered safe anymore.
50
51
52 Performance
53 ^^^^^^^^^^^
54
55 - Config: updated header limits on gunicorn to prevent errors on large Mercurial repositories.
56 - User sessions: added option to cleanup redis based sessions in user session interface.
57 - Authentication: reduced usage of raw auth calls inside templates to speed up rendering.
58 - Sessions: don't touch session for API calls. Before each API call created new session
59 object which wasn't required.
60
61
62 Fixes
63 ^^^^^
64
65 - hHooks: fixed more unicode problems with new pull-request link generator.
66 - Mercurial: fix ssh-server support for mercurial custom options.
67 - Pull requests: updated metadata information for failed merges with multiple heads.
68 - Pull requests: calculate ancestor in the same way as creation mode.
69 Fixed problem with updates generating wrong diffs in case of merges.
70 - Pull requests: fixed a bug in removal of multiple reviewers at once.
71 - Summary: fix timeout issues loading summary page without styling.
72 - SSH: fix invocation of custom hgrc.
73 - SSH: call custom hooks via SSH backend
74 - Markup: fix styling for check-lists.
75 - Archives: allows downloading refs that have slashes and special refs. e.g f/feat1 branch names.
76 - Files: ensure we generate archives with consistent hashing (except for .tar.gz which uses temp files names in header)
77 - Files: fixed rendering of readme files under non-ascii paths.
78
79
80 Upgrade notes
81 ^^^^^^^^^^^^^
82
83 - In this release we introduced new UI across the application.
84 In case of problems with the display on your systems please send us info to support@rhodecode.com.
85
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 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,6 +1,6 b''
1 1 [bumpversion]
2 current_version = 4.16.2
2 current_version = 4.17.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.16.2
25
26 [task:updated_translation]
20 state = in_progress
21 version = 4.17.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,55 +1,64 b''
1 1
2 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 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 54 generate-pkgs:
55 55 nix-shell pkgs/shell-generate.nix --command "pip2nix generate --licenses"
56
57 generate-js-pkgs:
58 rm -rf node_modules && \
59 nix-shell pkgs/shell-generate.nix --command "node2nix --input package.json -o pkgs/node-packages.nix -e pkgs/node-env.nix -c pkgs/node-default.nix -d --flatten --nodejs-8" && \
60 sed -i -e 's/http:\/\//https:\/\//g' pkgs/node-packages.nix
61
62 generate-license-meta:
63 nix-build pkgs/license-generate.nix -o result-license && \
64 cat result-license/licenses.json | python -m json.tool > rhodecode/config/licenses.json No newline at end of file
@@ -1,732 +1,741 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 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 ## Pick algorithm for encryption. Either fernet (more secure) or aes (default)
137 ## fernet is safer, and we strongly recommend switching to it.
138 ## Due to backward compatibility aes is used as default.
139 #rhodecode.encrypted_values.algorithm = fernet
140
136 141 ## return gzipped responses from RhodeCode (static files/application)
137 142 gzip_responses = false
138 143
139 144 ## auto-generate javascript routes file on startup
140 145 generate_js_files = false
141 146
142 147 ## System global default language.
143 148 ## All available languages: en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
144 149 lang = en
145 150
146 151 ## Perform a full repository scan and import on each server start.
147 152 ## Settings this to true could lead to very long startup time.
148 153 startup.import_repos = false
149 154
150 155 ## Uncomment and set this path to use archive download cache.
151 156 ## Once enabled, generated archives will be cached at this location
152 157 ## and served from the cache during subsequent requests for the same archive of
153 158 ## the repository.
154 159 #archive_cache_dir = /tmp/tarballcache
155 160
156 161 ## URL at which the application is running. This is used for Bootstrapping
157 162 ## requests in context when no web request is available. Used in ishell, or
158 163 ## SSH calls. Set this for events to receive proper url for SSH calls.
159 164 app.base_url = http://rhodecode.local
160 165
161 166 ## Unique application ID. Should be a random unique string for security.
162 167 app_instance_uuid = rc-production
163 168
164 169 ## Cut off limit for large diffs (size in bytes). If overall diff size on
165 170 ## commit, or pull request exceeds this limit this diff will be displayed
166 171 ## partially. E.g 512000 == 512Kb
167 172 cut_off_limit_diff = 512000
168 173
169 174 ## Cut off limit for large files inside diffs (size in bytes). Each individual
170 175 ## file inside diff which exceeds this limit will be displayed partially.
171 176 ## E.g 128000 == 128Kb
172 177 cut_off_limit_file = 128000
173 178
174 179 ## use cached version of vcs repositories everywhere. Recommended to be `true`
175 180 vcs_full_cache = true
176 181
177 182 ## Force https in RhodeCode, fixes https redirects, assumes it's always https.
178 183 ## Normally this is controlled by proper http flags sent from http server
179 184 force_https = false
180 185
181 186 ## use Strict-Transport-Security headers
182 187 use_htsts = false
183 188
184 189 ## git rev filter option, --all is the default filter, if you need to
185 190 ## hide all refs in changelog switch this to --branches --tags
186 191 git_rev_filter = --branches --tags
187 192
188 193 # Set to true if your repos are exposed using the dumb protocol
189 194 git_update_server_info = false
190 195
191 196 ## RSS/ATOM feed options
192 197 rss_cut_off_limit = 256000
193 198 rss_items_per_page = 10
194 199 rss_include_diff = false
195 200
196 201 ## gist URL alias, used to create nicer urls for gist. This should be an
197 202 ## url that does rewrites to _admin/gists/{gistid}.
198 203 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
199 204 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
200 205 gist_alias_url =
201 206
202 207 ## List of views (using glob pattern syntax) that AUTH TOKENS could be
203 208 ## used for access.
204 209 ## Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
205 210 ## came from the the logged in user who own this authentication token.
206 211 ## Additionally @TOKEN syntax can be used to bound the view to specific
207 212 ## authentication token. Such view would be only accessible when used together
208 213 ## with this authentication token
209 214 ##
210 215 ## list of all views can be found under `/_admin/permissions/auth_token_access`
211 216 ## The list should be "," separated and on a single line.
212 217 ##
213 218 ## Most common views to enable:
214 219 # RepoCommitsView:repo_commit_download
215 220 # RepoCommitsView:repo_commit_patch
216 221 # RepoCommitsView:repo_commit_raw
217 222 # RepoCommitsView:repo_commit_raw@TOKEN
218 223 # RepoFilesView:repo_files_diff
219 224 # RepoFilesView:repo_archivefile
220 225 # RepoFilesView:repo_file_raw
221 226 # GistView:*
222 227 api_access_controllers_whitelist =
223 228
224 229 ## Default encoding used to convert from and to unicode
225 230 ## can be also a comma separated list of encoding in case of mixed encodings
226 231 default_encoding = UTF-8
227 232
228 233 ## instance-id prefix
229 234 ## a prefix key for this instance used for cache invalidation when running
230 235 ## multiple instances of RhodeCode, make sure it's globally unique for
231 236 ## all running RhodeCode instances. Leave empty if you don't use it
232 237 instance_id =
233 238
234 239 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
235 240 ## of an authentication plugin also if it is disabled by it's settings.
236 241 ## This could be useful if you are unable to log in to the system due to broken
237 242 ## authentication settings. Then you can enable e.g. the internal RhodeCode auth
238 243 ## module to log in again and fix the settings.
239 244 ##
240 245 ## Available builtin plugin IDs (hash is part of the ID):
241 246 ## egg:rhodecode-enterprise-ce#rhodecode
242 247 ## egg:rhodecode-enterprise-ce#pam
243 248 ## egg:rhodecode-enterprise-ce#ldap
244 249 ## egg:rhodecode-enterprise-ce#jasig_cas
245 250 ## egg:rhodecode-enterprise-ce#headers
246 251 ## egg:rhodecode-enterprise-ce#crowd
247 252 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
248 253
249 254 ## alternative return HTTP header for failed authentication. Default HTTP
250 255 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
251 256 ## handling that causing a series of failed authentication calls.
252 257 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
253 258 ## This will be served instead of default 401 on bad authentication
254 259 auth_ret_code =
255 260
256 261 ## use special detection method when serving auth_ret_code, instead of serving
257 262 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
258 263 ## and then serve auth_ret_code to clients
259 264 auth_ret_code_detection = false
260 265
261 266 ## locking return code. When repository is locked return this HTTP code. 2XX
262 267 ## codes don't break the transactions while 4XX codes do
263 268 lock_ret_code = 423
264 269
265 270 ## allows to change the repository location in settings page
266 271 allow_repo_location_change = true
267 272
268 273 ## allows to setup custom hooks in settings page
269 274 allow_custom_hooks_settings = true
270 275
271 276 ## Generated license token required for EE edition license.
272 277 ## New generated token value can be found in Admin > settings > license page.
273 278 license_token =
274 279
275 280 ## supervisor connection uri, for managing supervisor and logs.
276 281 supervisor.uri =
277 282 ## supervisord group name/id we only want this RC instance to handle
278 283 supervisor.group_id = dev
279 284
280 285 ## Display extended labs settings
281 286 labs_settings_active = true
282 287
283 288 ## Custom exception store path, defaults to TMPDIR
284 289 ## This is used to store exception from RhodeCode in shared directory
285 290 #exception_tracker.store_path =
286 291
287 292 ## File store configuration. This is used to store and serve uploaded files
288 293 file_store.enabled = true
289 294 ## Storage backend, available options are: local
290 295 file_store.backend = local
291 296 ## path to store the uploaded binaries
292 297 file_store.storage_path = %(here)s/data/file_store
293 298
294 299
295 300 ####################################
296 301 ### CELERY CONFIG ####
297 302 ####################################
298 303 ## run: /path/to/celery worker \
299 304 ## -E --beat --app rhodecode.lib.celerylib.loader \
300 305 ## --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler \
301 306 ## --loglevel DEBUG --ini /path/to/rhodecode.ini
302 307
303 308 use_celery = false
304 309
305 310 ## connection url to the message broker (default rabbitmq)
306 311 celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
307 312
308 313 ## maximum tasks to execute before worker restart
309 314 celery.max_tasks_per_child = 100
310 315
311 316 ## tasks will never be sent to the queue, but executed locally instead.
312 317 celery.task_always_eager = false
313 318
314 319 #####################################
315 320 ### DOGPILE CACHE ####
316 321 #####################################
317 322 ## Default cache dir for caches. Putting this into a ramdisk
318 323 ## can boost performance, eg. /tmpfs/data_ramdisk, however this directory might require
319 324 ## large amount of space
320 325 cache_dir = %(here)s/data
321 326
322 327 ## `cache_perms` cache settings for permission tree, auth TTL.
323 328 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
324 329 rc_cache.cache_perms.expiration_time = 300
325 330
326 331 ## alternative `cache_perms` redis backend with distributed lock
327 332 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
328 333 #rc_cache.cache_perms.expiration_time = 300
329 334 ## redis_expiration_time needs to be greater then expiration_time
330 335 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
331 336 #rc_cache.cache_perms.arguments.socket_timeout = 30
332 337 #rc_cache.cache_perms.arguments.host = localhost
333 338 #rc_cache.cache_perms.arguments.port = 6379
334 339 #rc_cache.cache_perms.arguments.db = 0
335 340 ## more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
336 341 #rc_cache.cache_perms.arguments.distributed_lock = true
337 342
338 343 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
339 344 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
340 345 rc_cache.cache_repo.expiration_time = 2592000
341 346
342 347 ## alternative `cache_repo` redis backend with distributed lock
343 348 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
344 349 #rc_cache.cache_repo.expiration_time = 2592000
345 350 ## redis_expiration_time needs to be greater then expiration_time
346 351 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
347 352 #rc_cache.cache_repo.arguments.socket_timeout = 30
348 353 #rc_cache.cache_repo.arguments.host = localhost
349 354 #rc_cache.cache_repo.arguments.port = 6379
350 355 #rc_cache.cache_repo.arguments.db = 1
351 356 ## more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
352 357 #rc_cache.cache_repo.arguments.distributed_lock = true
353 358
354 359 ## cache settings for SQL queries, this needs to use memory type backend
355 360 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
356 361 rc_cache.sql_cache_short.expiration_time = 30
357 362
358 363 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
359 364 ## type backend as the objects kept are not pickle serializable
360 365 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
361 366 ## by default we use 96H, this is using invalidation on push anyway
362 367 rc_cache.cache_repo_longterm.expiration_time = 345600
363 368 ## max items in LRU cache, reduce this number to save memory, and expire last used
364 369 ## cached objects
365 370 rc_cache.cache_repo_longterm.max_size = 10000
366 371
367 372
368 373 ####################################
369 374 ### BEAKER SESSION ####
370 375 ####################################
371 376
372 377 ## .session.type is type of storage options for the session, current allowed
373 378 ## types are file, ext:memcached, ext:redis, ext:database, and memory (default).
374 379 beaker.session.type = file
375 380 beaker.session.data_dir = %(here)s/data/sessions
376 381
382 ## redis sessions
383 #beaker.session.type = ext:redis
384 #beaker.session.url = redis://127.0.0.1:6379/2
385
377 386 ## db based session, fast, and allows easy management over logged in users
378 387 #beaker.session.type = ext:database
379 388 #beaker.session.table_name = db_session
380 389 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
381 390 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
382 391 #beaker.session.sa.pool_recycle = 3600
383 392 #beaker.session.sa.echo = false
384 393
385 394 beaker.session.key = rhodecode
386 395 beaker.session.secret = develop-rc-uytcxaz
387 396 beaker.session.lock_dir = %(here)s/data/sessions/lock
388 397
389 398 ## Secure encrypted cookie. Requires AES and AES python libraries
390 399 ## you must disable beaker.session.secret to use this
391 400 #beaker.session.encrypt_key = key_for_encryption
392 401 #beaker.session.validate_key = validation_key
393 402
394 403 ## sets session as invalid(also logging out user) if it haven not been
395 404 ## accessed for given amount of time in seconds
396 405 beaker.session.timeout = 2592000
397 406 beaker.session.httponly = true
398 407 ## Path to use for the cookie. Set to prefix if you use prefix middleware
399 408 #beaker.session.cookie_path = /custom_prefix
400 409
401 410 ## uncomment for https secure cookie
402 411 beaker.session.secure = false
403 412
404 413 ## auto save the session to not to use .save()
405 414 beaker.session.auto = false
406 415
407 416 ## default cookie expiration time in seconds, set to `true` to set expire
408 417 ## at browser close
409 418 #beaker.session.cookie_expires = 3600
410 419
411 420 ###################################
412 421 ## SEARCH INDEXING CONFIGURATION ##
413 422 ###################################
414 423 ## Full text search indexer is available in rhodecode-tools under
415 424 ## `rhodecode-tools index` command
416 425
417 426 ## WHOOSH Backend, doesn't require additional services to run
418 427 ## it works good with few dozen repos
419 428 search.module = rhodecode.lib.index.whoosh
420 429 search.location = %(here)s/data/index
421 430
422 431 ########################################
423 432 ### CHANNELSTREAM CONFIG ####
424 433 ########################################
425 434 ## channelstream enables persistent connections and live notification
426 435 ## in the system. It's also used by the chat system
427 436
428 437 channelstream.enabled = false
429 438
430 439 ## server address for channelstream server on the backend
431 440 channelstream.server = 127.0.0.1:9800
432 441
433 442 ## location of the channelstream server from outside world
434 443 ## use ws:// for http or wss:// for https. This address needs to be handled
435 444 ## by external HTTP server such as Nginx or Apache
436 445 ## see Nginx/Apache configuration examples in our docs
437 446 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
438 447 channelstream.secret = secret
439 448 channelstream.history.location = %(here)s/channelstream_history
440 449
441 450 ## Internal application path that Javascript uses to connect into.
442 451 ## If you use proxy-prefix the prefix should be added before /_channelstream
443 452 channelstream.proxy_path = /_channelstream
444 453
445 454
446 455 ###################################
447 456 ## APPENLIGHT CONFIG ##
448 457 ###################################
449 458
450 459 ## Appenlight is tailored to work with RhodeCode, see
451 460 ## http://appenlight.com for details how to obtain an account
452 461
453 462 ## Appenlight integration enabled
454 463 appenlight = false
455 464
456 465 appenlight.server_url = https://api.appenlight.com
457 466 appenlight.api_key = YOUR_API_KEY
458 467 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
459 468
460 469 ## used for JS client
461 470 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
462 471
463 472 ## TWEAK AMOUNT OF INFO SENT HERE
464 473
465 474 ## enables 404 error logging (default False)
466 475 appenlight.report_404 = false
467 476
468 477 ## time in seconds after request is considered being slow (default 1)
469 478 appenlight.slow_request_time = 1
470 479
471 480 ## record slow requests in application
472 481 ## (needs to be enabled for slow datastore recording and time tracking)
473 482 appenlight.slow_requests = true
474 483
475 484 ## enable hooking to application loggers
476 485 appenlight.logging = true
477 486
478 487 ## minimum log level for log capture
479 488 appenlight.logging.level = WARNING
480 489
481 490 ## send logs only from erroneous/slow requests
482 491 ## (saves API quota for intensive logging)
483 492 appenlight.logging_on_error = false
484 493
485 494 ## list of additional keywords that should be grabbed from environ object
486 495 ## can be string with comma separated list of words in lowercase
487 496 ## (by default client will always send following info:
488 497 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
489 498 ## start with HTTP* this list be extended with additional keywords here
490 499 appenlight.environ_keys_whitelist =
491 500
492 501 ## list of keywords that should be blanked from request object
493 502 ## can be string with comma separated list of words in lowercase
494 503 ## (by default client will always blank keys that contain following words
495 504 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
496 505 ## this list be extended with additional keywords set here
497 506 appenlight.request_keys_blacklist =
498 507
499 508 ## list of namespaces that should be ignores when gathering log entries
500 509 ## can be string with comma separated list of namespaces
501 510 ## (by default the client ignores own entries: appenlight_client.client)
502 511 appenlight.log_namespace_blacklist =
503 512
504 513 # enable debug style page
505 514 debug_style = true
506 515
507 516 ###########################################
508 517 ### MAIN RHODECODE DATABASE CONFIG ###
509 518 ###########################################
510 519 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
511 520 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
512 521 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
513 522 # pymysql is an alternative driver for MySQL, use in case of problems with default one
514 523 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
515 524
516 525 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
517 526
518 527 # see sqlalchemy docs for other advanced settings
519 528
520 529 ## print the sql statements to output
521 530 sqlalchemy.db1.echo = false
522 531 ## recycle the connections after this amount of seconds
523 532 sqlalchemy.db1.pool_recycle = 3600
524 533 sqlalchemy.db1.convert_unicode = true
525 534
526 535 ## the number of connections to keep open inside the connection pool.
527 536 ## 0 indicates no limit
528 537 #sqlalchemy.db1.pool_size = 5
529 538
530 539 ## the number of connections to allow in connection pool "overflow", that is
531 540 ## connections that can be opened above and beyond the pool_size setting,
532 541 ## which defaults to five.
533 542 #sqlalchemy.db1.max_overflow = 10
534 543
535 544 ## Connection check ping, used to detect broken database connections
536 545 ## could be enabled to better handle cases if MySQL has gone away errors
537 546 #sqlalchemy.db1.ping_connection = true
538 547
539 548 ##################
540 549 ### VCS CONFIG ###
541 550 ##################
542 551 vcs.server.enable = true
543 552 vcs.server = localhost:9900
544 553
545 554 ## Web server connectivity protocol, responsible for web based VCS operations
546 555 ## Available protocols are:
547 556 ## `http` - use http-rpc backend (default)
548 557 vcs.server.protocol = http
549 558
550 559 ## Push/Pull operations protocol, available options are:
551 560 ## `http` - use http-rpc backend (default)
552 561 vcs.scm_app_implementation = http
553 562
554 563 ## Push/Pull operations hooks protocol, available options are:
555 564 ## `http` - use http-rpc backend (default)
556 565 vcs.hooks.protocol = http
557 566
558 567 ## Host on which this instance is listening for hooks. If vcsserver is in other location
559 568 ## this should be adjusted.
560 569 vcs.hooks.host = 127.0.0.1
561 570
562 571 vcs.server.log_level = debug
563 572 ## Start VCSServer with this instance as a subprocess, useful for development
564 573 vcs.start_server = false
565 574
566 575 ## List of enabled VCS backends, available options are:
567 576 ## `hg` - mercurial
568 577 ## `git` - git
569 578 ## `svn` - subversion
570 579 vcs.backends = hg, git, svn
571 580
572 581 vcs.connection_timeout = 3600
573 582 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
574 583 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
575 584 #vcs.svn.compatible_version = pre-1.8-compatible
576 585
577 586
578 587 ############################################################
579 588 ### Subversion proxy support (mod_dav_svn) ###
580 589 ### Maps RhodeCode repo groups into SVN paths for Apache ###
581 590 ############################################################
582 591 ## Enable or disable the config file generation.
583 592 svn.proxy.generate_config = false
584 593 ## Generate config file with `SVNListParentPath` set to `On`.
585 594 svn.proxy.list_parent_path = true
586 595 ## Set location and file name of generated config file.
587 596 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
588 597 ## alternative mod_dav config template. This needs to be a mako template
589 598 #svn.proxy.config_template = ~/.rccontrol/enterprise-1/custom_svn_conf.mako
590 599 ## Used as a prefix to the `Location` block in the generated config file.
591 600 ## In most cases it should be set to `/`.
592 601 svn.proxy.location_root = /
593 602 ## Command to reload the mod dav svn configuration on change.
594 603 ## Example: `/etc/init.d/apache2 reload` or /home/USER/apache_reload.sh
595 604 ## Make sure user who runs RhodeCode process is allowed to reload Apache
596 605 #svn.proxy.reload_cmd = /etc/init.d/apache2 reload
597 606 ## If the timeout expires before the reload command finishes, the command will
598 607 ## be killed. Setting it to zero means no timeout. Defaults to 10 seconds.
599 608 #svn.proxy.reload_timeout = 10
600 609
601 610 ############################################################
602 611 ### SSH Support Settings ###
603 612 ############################################################
604 613
605 614 ## Defines if a custom authorized_keys file should be created and written on
606 615 ## any change user ssh keys. Setting this to false also disables possibility
607 616 ## of adding SSH keys by users from web interface. Super admins can still
608 617 ## manage SSH Keys.
609 618 ssh.generate_authorized_keyfile = false
610 619
611 620 ## Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
612 621 # ssh.authorized_keys_ssh_opts =
613 622
614 623 ## Path to the authorized_keys file where the generate entries are placed.
615 624 ## It is possible to have multiple key files specified in `sshd_config` e.g.
616 625 ## AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
617 626 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
618 627
619 628 ## Command to execute the SSH wrapper. The binary is available in the
620 629 ## RhodeCode installation directory.
621 630 ## e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
622 631 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
623 632
624 633 ## Allow shell when executing the ssh-wrapper command
625 634 ssh.wrapper_cmd_allow_shell = false
626 635
627 636 ## Enables logging, and detailed output send back to the client during SSH
628 637 ## operations. Useful for debugging, shouldn't be used in production.
629 638 ssh.enable_debug_logging = true
630 639
631 640 ## Paths to binary executable, by default they are the names, but we can
632 641 ## override them if we want to use a custom one
633 642 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
634 643 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
635 644 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
636 645
637 646 ## Enables SSH key generator web interface. Disabling this still allows users
638 647 ## to add their own keys.
639 648 ssh.enable_ui_key_generator = true
640 649
641 650
642 651 ## Dummy marker to add new entries after.
643 652 ## Add any custom entries below. Please don't remove.
644 653 custom.conf = 1
645 654
646 655
647 656 ################################
648 657 ### LOGGING CONFIGURATION ####
649 658 ################################
650 659 [loggers]
651 660 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
652 661
653 662 [handlers]
654 663 keys = console, console_sql
655 664
656 665 [formatters]
657 666 keys = generic, color_formatter, color_formatter_sql
658 667
659 668 #############
660 669 ## LOGGERS ##
661 670 #############
662 671 [logger_root]
663 672 level = NOTSET
664 673 handlers = console
665 674
666 675 [logger_sqlalchemy]
667 676 level = INFO
668 677 handlers = console_sql
669 678 qualname = sqlalchemy.engine
670 679 propagate = 0
671 680
672 681 [logger_beaker]
673 682 level = DEBUG
674 683 handlers =
675 684 qualname = beaker.container
676 685 propagate = 1
677 686
678 687 [logger_rhodecode]
679 688 level = DEBUG
680 689 handlers =
681 690 qualname = rhodecode
682 691 propagate = 1
683 692
684 693 [logger_ssh_wrapper]
685 694 level = DEBUG
686 695 handlers =
687 696 qualname = ssh_wrapper
688 697 propagate = 1
689 698
690 699 [logger_celery]
691 700 level = DEBUG
692 701 handlers =
693 702 qualname = celery
694 703
695 704
696 705 ##############
697 706 ## HANDLERS ##
698 707 ##############
699 708
700 709 [handler_console]
701 710 class = StreamHandler
702 711 args = (sys.stderr, )
703 712 level = DEBUG
704 713 formatter = color_formatter
705 714
706 715 [handler_console_sql]
707 716 # "level = DEBUG" logs SQL queries and results.
708 717 # "level = INFO" logs SQL queries.
709 718 # "level = WARN" logs neither. (Recommended for production systems.)
710 719 class = StreamHandler
711 720 args = (sys.stderr, )
712 721 level = WARN
713 722 formatter = color_formatter_sql
714 723
715 724 ################
716 725 ## FORMATTERS ##
717 726 ################
718 727
719 728 [formatter_generic]
720 729 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
721 730 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
722 731 datefmt = %Y-%m-%d %H:%M:%S
723 732
724 733 [formatter_color_formatter]
725 734 class = rhodecode.lib.logging_formatter.ColorFormatter
726 735 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
727 736 datefmt = %Y-%m-%d %H:%M:%S
728 737
729 738 [formatter_color_formatter_sql]
730 739 class = rhodecode.lib.logging_formatter.ColorFormatterSql
731 740 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
732 741 datefmt = %Y-%m-%d %H:%M:%S
@@ -1,152 +1,154 b''
1 1 """
2 2 gunicorn config extension and hooks. Sets additional configuration that is
3 3 available post the .ini config.
4 4
5 5 - workers = ${cpu_number}
6 6 - threads = 1
7 7 - proc_name = ${gunicorn_proc_name}
8 8 - worker_class = sync
9 9 - worker_connections = 10
10 10 - max_requests = 1000
11 11 - max_requests_jitter = 30
12 12 - timeout = 21600
13 13
14 14 """
15 15
16 16 import multiprocessing
17 17 import sys
18 18 import time
19 19 import datetime
20 20 import threading
21 21 import traceback
22 22 from gunicorn.glogging import Logger
23 23
24 24
25 25 # GLOBAL
26 26 errorlog = '-'
27 27 accesslog = '-'
28 28 loglevel = 'debug'
29 29
30 30 # SECURITY
31 31
32 32 # The maximum size of HTTP request line in bytes.
33 limit_request_line = 4094
33 # 0 for unlimited
34 limit_request_line = 0
34 35
35 36 # Limit the number of HTTP headers fields in a request.
36 limit_request_fields = 1024
37 # By default this value is 100 and can’t be larger than 32768.
38 limit_request_fields = 10240
37 39
38 40 # Limit the allowed size of an HTTP request header field.
39 41 # Value is a positive number or 0.
40 42 # Setting it to 0 will allow unlimited header field sizes.
41 43 limit_request_field_size = 0
42 44
43 45
44 46 # Timeout for graceful workers restart.
45 47 # After receiving a restart signal, workers have this much time to finish
46 48 # serving requests. Workers still alive after the timeout (starting from the
47 49 # receipt of the restart signal) are force killed.
48 50 graceful_timeout = 30
49 51
50 52
51 53 # The number of seconds to wait for requests on a Keep-Alive connection.
52 54 # Generally set in the 1-5 seconds range.
53 55 keepalive = 2
54 56
55 57
56 58 # SERVER MECHANICS
57 59 # None == system temp dir
58 60 # worker_tmp_dir is recommended to be set to some tmpfs
59 61 worker_tmp_dir = None
60 62 tmp_upload_dir = None
61 63
62 64 # Custom log format
63 65 access_log_format = (
64 66 '%(t)s [%(p)-8s] GNCRN %(h)-15s rqt:%(L)s %(s)s %(b)-6s "%(m)s:%(U)s %(q)s" usr:%(u)s "%(f)s" "%(a)s"')
65 67
66 68 # self adjust workers based on CPU count
67 69 # workers = multiprocessing.cpu_count() * 2 + 1
68 70
69 71
70 72 def post_fork(server, worker):
71 73 server.log.info("[<%-10s>] WORKER spawned", worker.pid)
72 74
73 75
74 76 def pre_fork(server, worker):
75 77 pass
76 78
77 79
78 80 def pre_exec(server):
79 81 server.log.info("Forked child, re-executing.")
80 82
81 83
82 84 def on_starting(server):
83 85 server.log.info("Server is starting.")
84 86
85 87
86 88 def when_ready(server):
87 89 server.log.info("Server is ready. Spawning workers")
88 90
89 91
90 92 def on_reload(server):
91 93 pass
92 94
93 95
94 96 def worker_int(worker):
95 97 worker.log.info("[<%-10s>] worker received INT or QUIT signal", worker.pid)
96 98
97 99 # get traceback info, on worker crash
98 100 id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
99 101 code = []
100 102 for thread_id, stack in sys._current_frames().items():
101 103 code.append(
102 104 "\n# Thread: %s(%d)" % (id2name.get(thread_id, ""), thread_id))
103 105 for fname, lineno, name, line in traceback.extract_stack(stack):
104 106 code.append('File: "%s", line %d, in %s' % (fname, lineno, name))
105 107 if line:
106 108 code.append(" %s" % (line.strip()))
107 109 worker.log.debug("\n".join(code))
108 110
109 111
110 112 def worker_abort(worker):
111 113 worker.log.info("[<%-10s>] worker received SIGABRT signal", worker.pid)
112 114
113 115
114 116 def worker_exit(server, worker):
115 117 worker.log.info("[<%-10s>] worker exit", worker.pid)
116 118
117 119
118 120 def child_exit(server, worker):
119 121 worker.log.info("[<%-10s>] worker child exit", worker.pid)
120 122
121 123
122 124 def pre_request(worker, req):
123 125 worker.start_time = time.time()
124 126 worker.log.debug(
125 127 "GNCRN PRE WORKER [cnt:%s]: %s %s", worker.nr, req.method, req.path)
126 128
127 129
128 130 def post_request(worker, req, environ, resp):
129 131 total_time = time.time() - worker.start_time
130 132 worker.log.debug(
131 133 "GNCRN POST WORKER [cnt:%s]: %s %s resp: %s, Load Time: %.3fs",
132 134 worker.nr, req.method, req.path, resp.status_code, total_time)
133 135
134 136
135 137 class RhodeCodeLogger(Logger):
136 138 """
137 139 Custom Logger that allows some customization that gunicorn doesn't allow
138 140 """
139 141
140 142 datefmt = r"%Y-%m-%d %H:%M:%S"
141 143
142 144 def __init__(self, cfg):
143 145 Logger.__init__(self, cfg)
144 146
145 147 def now(self):
146 148 """ return date in RhodeCode Log format """
147 149 now = time.time()
148 150 msecs = int((now - long(now)) * 1000)
149 151 return time.strftime(self.datefmt, time.localtime(now)) + '.{0:03d}'.format(msecs)
150 152
151 153
152 154 logger_class = RhodeCodeLogger
@@ -1,705 +1,714 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 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 ## Pick algorithm for encryption. Either fernet (more secure) or aes (default)
112 ## fernet is safer, and we strongly recommend switching to it.
113 ## Due to backward compatibility aes is used as default.
114 #rhodecode.encrypted_values.algorithm = fernet
115
111 116 ## return gzipped responses from RhodeCode (static files/application)
112 117 gzip_responses = false
113 118
114 119 ## auto-generate javascript routes file on startup
115 120 generate_js_files = false
116 121
117 122 ## System global default language.
118 123 ## All available languages: en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
119 124 lang = en
120 125
121 126 ## Perform a full repository scan and import on each server start.
122 127 ## Settings this to true could lead to very long startup time.
123 128 startup.import_repos = false
124 129
125 130 ## Uncomment and set this path to use archive download cache.
126 131 ## Once enabled, generated archives will be cached at this location
127 132 ## and served from the cache during subsequent requests for the same archive of
128 133 ## the repository.
129 134 #archive_cache_dir = /tmp/tarballcache
130 135
131 136 ## URL at which the application is running. This is used for Bootstrapping
132 137 ## requests in context when no web request is available. Used in ishell, or
133 138 ## SSH calls. Set this for events to receive proper url for SSH calls.
134 139 app.base_url = http://rhodecode.local
135 140
136 141 ## Unique application ID. Should be a random unique string for security.
137 142 app_instance_uuid = rc-production
138 143
139 144 ## Cut off limit for large diffs (size in bytes). If overall diff size on
140 145 ## commit, or pull request exceeds this limit this diff will be displayed
141 146 ## partially. E.g 512000 == 512Kb
142 147 cut_off_limit_diff = 512000
143 148
144 149 ## Cut off limit for large files inside diffs (size in bytes). Each individual
145 150 ## file inside diff which exceeds this limit will be displayed partially.
146 151 ## E.g 128000 == 128Kb
147 152 cut_off_limit_file = 128000
148 153
149 154 ## use cached version of vcs repositories everywhere. Recommended to be `true`
150 155 vcs_full_cache = true
151 156
152 157 ## Force https in RhodeCode, fixes https redirects, assumes it's always https.
153 158 ## Normally this is controlled by proper http flags sent from http server
154 159 force_https = false
155 160
156 161 ## use Strict-Transport-Security headers
157 162 use_htsts = false
158 163
159 164 ## git rev filter option, --all is the default filter, if you need to
160 165 ## hide all refs in changelog switch this to --branches --tags
161 166 git_rev_filter = --branches --tags
162 167
163 168 # Set to true if your repos are exposed using the dumb protocol
164 169 git_update_server_info = false
165 170
166 171 ## RSS/ATOM feed options
167 172 rss_cut_off_limit = 256000
168 173 rss_items_per_page = 10
169 174 rss_include_diff = false
170 175
171 176 ## gist URL alias, used to create nicer urls for gist. This should be an
172 177 ## url that does rewrites to _admin/gists/{gistid}.
173 178 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
174 179 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
175 180 gist_alias_url =
176 181
177 182 ## List of views (using glob pattern syntax) that AUTH TOKENS could be
178 183 ## used for access.
179 184 ## Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
180 185 ## came from the the logged in user who own this authentication token.
181 186 ## Additionally @TOKEN syntax can be used to bound the view to specific
182 187 ## authentication token. Such view would be only accessible when used together
183 188 ## with this authentication token
184 189 ##
185 190 ## list of all views can be found under `/_admin/permissions/auth_token_access`
186 191 ## The list should be "," separated and on a single line.
187 192 ##
188 193 ## Most common views to enable:
189 194 # RepoCommitsView:repo_commit_download
190 195 # RepoCommitsView:repo_commit_patch
191 196 # RepoCommitsView:repo_commit_raw
192 197 # RepoCommitsView:repo_commit_raw@TOKEN
193 198 # RepoFilesView:repo_files_diff
194 199 # RepoFilesView:repo_archivefile
195 200 # RepoFilesView:repo_file_raw
196 201 # GistView:*
197 202 api_access_controllers_whitelist =
198 203
199 204 ## Default encoding used to convert from and to unicode
200 205 ## can be also a comma separated list of encoding in case of mixed encodings
201 206 default_encoding = UTF-8
202 207
203 208 ## instance-id prefix
204 209 ## a prefix key for this instance used for cache invalidation when running
205 210 ## multiple instances of RhodeCode, make sure it's globally unique for
206 211 ## all running RhodeCode instances. Leave empty if you don't use it
207 212 instance_id =
208 213
209 214 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
210 215 ## of an authentication plugin also if it is disabled by it's settings.
211 216 ## This could be useful if you are unable to log in to the system due to broken
212 217 ## authentication settings. Then you can enable e.g. the internal RhodeCode auth
213 218 ## module to log in again and fix the settings.
214 219 ##
215 220 ## Available builtin plugin IDs (hash is part of the ID):
216 221 ## egg:rhodecode-enterprise-ce#rhodecode
217 222 ## egg:rhodecode-enterprise-ce#pam
218 223 ## egg:rhodecode-enterprise-ce#ldap
219 224 ## egg:rhodecode-enterprise-ce#jasig_cas
220 225 ## egg:rhodecode-enterprise-ce#headers
221 226 ## egg:rhodecode-enterprise-ce#crowd
222 227 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
223 228
224 229 ## alternative return HTTP header for failed authentication. Default HTTP
225 230 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
226 231 ## handling that causing a series of failed authentication calls.
227 232 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
228 233 ## This will be served instead of default 401 on bad authentication
229 234 auth_ret_code =
230 235
231 236 ## use special detection method when serving auth_ret_code, instead of serving
232 237 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
233 238 ## and then serve auth_ret_code to clients
234 239 auth_ret_code_detection = false
235 240
236 241 ## locking return code. When repository is locked return this HTTP code. 2XX
237 242 ## codes don't break the transactions while 4XX codes do
238 243 lock_ret_code = 423
239 244
240 245 ## allows to change the repository location in settings page
241 246 allow_repo_location_change = true
242 247
243 248 ## allows to setup custom hooks in settings page
244 249 allow_custom_hooks_settings = true
245 250
246 251 ## Generated license token required for EE edition license.
247 252 ## New generated token value can be found in Admin > settings > license page.
248 253 license_token =
249 254
250 255 ## supervisor connection uri, for managing supervisor and logs.
251 256 supervisor.uri =
252 257 ## supervisord group name/id we only want this RC instance to handle
253 258 supervisor.group_id = prod
254 259
255 260 ## Display extended labs settings
256 261 labs_settings_active = true
257 262
258 263 ## Custom exception store path, defaults to TMPDIR
259 264 ## This is used to store exception from RhodeCode in shared directory
260 265 #exception_tracker.store_path =
261 266
262 267 ## File store configuration. This is used to store and serve uploaded files
263 268 file_store.enabled = true
264 269 ## Storage backend, available options are: local
265 270 file_store.backend = local
266 271 ## path to store the uploaded binaries
267 272 file_store.storage_path = %(here)s/data/file_store
268 273
269 274
270 275 ####################################
271 276 ### CELERY CONFIG ####
272 277 ####################################
273 278 ## run: /path/to/celery worker \
274 279 ## -E --beat --app rhodecode.lib.celerylib.loader \
275 280 ## --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler \
276 281 ## --loglevel DEBUG --ini /path/to/rhodecode.ini
277 282
278 283 use_celery = false
279 284
280 285 ## connection url to the message broker (default rabbitmq)
281 286 celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
282 287
283 288 ## maximum tasks to execute before worker restart
284 289 celery.max_tasks_per_child = 100
285 290
286 291 ## tasks will never be sent to the queue, but executed locally instead.
287 292 celery.task_always_eager = false
288 293
289 294 #####################################
290 295 ### DOGPILE CACHE ####
291 296 #####################################
292 297 ## Default cache dir for caches. Putting this into a ramdisk
293 298 ## can boost performance, eg. /tmpfs/data_ramdisk, however this directory might require
294 299 ## large amount of space
295 300 cache_dir = %(here)s/data
296 301
297 302 ## `cache_perms` cache settings for permission tree, auth TTL.
298 303 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
299 304 rc_cache.cache_perms.expiration_time = 300
300 305
301 306 ## alternative `cache_perms` redis backend with distributed lock
302 307 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
303 308 #rc_cache.cache_perms.expiration_time = 300
304 309 ## redis_expiration_time needs to be greater then expiration_time
305 310 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
306 311 #rc_cache.cache_perms.arguments.socket_timeout = 30
307 312 #rc_cache.cache_perms.arguments.host = localhost
308 313 #rc_cache.cache_perms.arguments.port = 6379
309 314 #rc_cache.cache_perms.arguments.db = 0
310 315 ## more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
311 316 #rc_cache.cache_perms.arguments.distributed_lock = true
312 317
313 318 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
314 319 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
315 320 rc_cache.cache_repo.expiration_time = 2592000
316 321
317 322 ## alternative `cache_repo` redis backend with distributed lock
318 323 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
319 324 #rc_cache.cache_repo.expiration_time = 2592000
320 325 ## redis_expiration_time needs to be greater then expiration_time
321 326 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
322 327 #rc_cache.cache_repo.arguments.socket_timeout = 30
323 328 #rc_cache.cache_repo.arguments.host = localhost
324 329 #rc_cache.cache_repo.arguments.port = 6379
325 330 #rc_cache.cache_repo.arguments.db = 1
326 331 ## more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
327 332 #rc_cache.cache_repo.arguments.distributed_lock = true
328 333
329 334 ## cache settings for SQL queries, this needs to use memory type backend
330 335 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
331 336 rc_cache.sql_cache_short.expiration_time = 30
332 337
333 338 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
334 339 ## type backend as the objects kept are not pickle serializable
335 340 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
336 341 ## by default we use 96H, this is using invalidation on push anyway
337 342 rc_cache.cache_repo_longterm.expiration_time = 345600
338 343 ## max items in LRU cache, reduce this number to save memory, and expire last used
339 344 ## cached objects
340 345 rc_cache.cache_repo_longterm.max_size = 10000
341 346
342 347
343 348 ####################################
344 349 ### BEAKER SESSION ####
345 350 ####################################
346 351
347 352 ## .session.type is type of storage options for the session, current allowed
348 353 ## types are file, ext:memcached, ext:redis, ext:database, and memory (default).
349 354 beaker.session.type = file
350 355 beaker.session.data_dir = %(here)s/data/sessions
351 356
357 ## redis sessions
358 #beaker.session.type = ext:redis
359 #beaker.session.url = redis://127.0.0.1:6379/2
360
352 361 ## db based session, fast, and allows easy management over logged in users
353 362 #beaker.session.type = ext:database
354 363 #beaker.session.table_name = db_session
355 364 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
356 365 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
357 366 #beaker.session.sa.pool_recycle = 3600
358 367 #beaker.session.sa.echo = false
359 368
360 369 beaker.session.key = rhodecode
361 370 beaker.session.secret = production-rc-uytcxaz
362 371 beaker.session.lock_dir = %(here)s/data/sessions/lock
363 372
364 373 ## Secure encrypted cookie. Requires AES and AES python libraries
365 374 ## you must disable beaker.session.secret to use this
366 375 #beaker.session.encrypt_key = key_for_encryption
367 376 #beaker.session.validate_key = validation_key
368 377
369 378 ## sets session as invalid(also logging out user) if it haven not been
370 379 ## accessed for given amount of time in seconds
371 380 beaker.session.timeout = 2592000
372 381 beaker.session.httponly = true
373 382 ## Path to use for the cookie. Set to prefix if you use prefix middleware
374 383 #beaker.session.cookie_path = /custom_prefix
375 384
376 385 ## uncomment for https secure cookie
377 386 beaker.session.secure = false
378 387
379 388 ## auto save the session to not to use .save()
380 389 beaker.session.auto = false
381 390
382 391 ## default cookie expiration time in seconds, set to `true` to set expire
383 392 ## at browser close
384 393 #beaker.session.cookie_expires = 3600
385 394
386 395 ###################################
387 396 ## SEARCH INDEXING CONFIGURATION ##
388 397 ###################################
389 398 ## Full text search indexer is available in rhodecode-tools under
390 399 ## `rhodecode-tools index` command
391 400
392 401 ## WHOOSH Backend, doesn't require additional services to run
393 402 ## it works good with few dozen repos
394 403 search.module = rhodecode.lib.index.whoosh
395 404 search.location = %(here)s/data/index
396 405
397 406 ########################################
398 407 ### CHANNELSTREAM CONFIG ####
399 408 ########################################
400 409 ## channelstream enables persistent connections and live notification
401 410 ## in the system. It's also used by the chat system
402 411
403 412 channelstream.enabled = false
404 413
405 414 ## server address for channelstream server on the backend
406 415 channelstream.server = 127.0.0.1:9800
407 416
408 417 ## location of the channelstream server from outside world
409 418 ## use ws:// for http or wss:// for https. This address needs to be handled
410 419 ## by external HTTP server such as Nginx or Apache
411 420 ## see Nginx/Apache configuration examples in our docs
412 421 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
413 422 channelstream.secret = secret
414 423 channelstream.history.location = %(here)s/channelstream_history
415 424
416 425 ## Internal application path that Javascript uses to connect into.
417 426 ## If you use proxy-prefix the prefix should be added before /_channelstream
418 427 channelstream.proxy_path = /_channelstream
419 428
420 429
421 430 ###################################
422 431 ## APPENLIGHT CONFIG ##
423 432 ###################################
424 433
425 434 ## Appenlight is tailored to work with RhodeCode, see
426 435 ## http://appenlight.com for details how to obtain an account
427 436
428 437 ## Appenlight integration enabled
429 438 appenlight = false
430 439
431 440 appenlight.server_url = https://api.appenlight.com
432 441 appenlight.api_key = YOUR_API_KEY
433 442 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
434 443
435 444 ## used for JS client
436 445 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
437 446
438 447 ## TWEAK AMOUNT OF INFO SENT HERE
439 448
440 449 ## enables 404 error logging (default False)
441 450 appenlight.report_404 = false
442 451
443 452 ## time in seconds after request is considered being slow (default 1)
444 453 appenlight.slow_request_time = 1
445 454
446 455 ## record slow requests in application
447 456 ## (needs to be enabled for slow datastore recording and time tracking)
448 457 appenlight.slow_requests = true
449 458
450 459 ## enable hooking to application loggers
451 460 appenlight.logging = true
452 461
453 462 ## minimum log level for log capture
454 463 appenlight.logging.level = WARNING
455 464
456 465 ## send logs only from erroneous/slow requests
457 466 ## (saves API quota for intensive logging)
458 467 appenlight.logging_on_error = false
459 468
460 469 ## list of additional keywords that should be grabbed from environ object
461 470 ## can be string with comma separated list of words in lowercase
462 471 ## (by default client will always send following info:
463 472 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
464 473 ## start with HTTP* this list be extended with additional keywords here
465 474 appenlight.environ_keys_whitelist =
466 475
467 476 ## list of keywords that should be blanked from request object
468 477 ## can be string with comma separated list of words in lowercase
469 478 ## (by default client will always blank keys that contain following words
470 479 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
471 480 ## this list be extended with additional keywords set here
472 481 appenlight.request_keys_blacklist =
473 482
474 483 ## list of namespaces that should be ignores when gathering log entries
475 484 ## can be string with comma separated list of namespaces
476 485 ## (by default the client ignores own entries: appenlight_client.client)
477 486 appenlight.log_namespace_blacklist =
478 487
479 488
480 489 ###########################################
481 490 ### MAIN RHODECODE DATABASE CONFIG ###
482 491 ###########################################
483 492 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
484 493 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
485 494 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
486 495 # pymysql is an alternative driver for MySQL, use in case of problems with default one
487 496 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
488 497
489 498 sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
490 499
491 500 # see sqlalchemy docs for other advanced settings
492 501
493 502 ## print the sql statements to output
494 503 sqlalchemy.db1.echo = false
495 504 ## recycle the connections after this amount of seconds
496 505 sqlalchemy.db1.pool_recycle = 3600
497 506 sqlalchemy.db1.convert_unicode = true
498 507
499 508 ## the number of connections to keep open inside the connection pool.
500 509 ## 0 indicates no limit
501 510 #sqlalchemy.db1.pool_size = 5
502 511
503 512 ## the number of connections to allow in connection pool "overflow", that is
504 513 ## connections that can be opened above and beyond the pool_size setting,
505 514 ## which defaults to five.
506 515 #sqlalchemy.db1.max_overflow = 10
507 516
508 517 ## Connection check ping, used to detect broken database connections
509 518 ## could be enabled to better handle cases if MySQL has gone away errors
510 519 #sqlalchemy.db1.ping_connection = true
511 520
512 521 ##################
513 522 ### VCS CONFIG ###
514 523 ##################
515 524 vcs.server.enable = true
516 525 vcs.server = localhost:9900
517 526
518 527 ## Web server connectivity protocol, responsible for web based VCS operations
519 528 ## Available protocols are:
520 529 ## `http` - use http-rpc backend (default)
521 530 vcs.server.protocol = http
522 531
523 532 ## Push/Pull operations protocol, available options are:
524 533 ## `http` - use http-rpc backend (default)
525 534 vcs.scm_app_implementation = http
526 535
527 536 ## Push/Pull operations hooks protocol, available options are:
528 537 ## `http` - use http-rpc backend (default)
529 538 vcs.hooks.protocol = http
530 539
531 540 ## Host on which this instance is listening for hooks. If vcsserver is in other location
532 541 ## this should be adjusted.
533 542 vcs.hooks.host = 127.0.0.1
534 543
535 544 vcs.server.log_level = info
536 545 ## Start VCSServer with this instance as a subprocess, useful for development
537 546 vcs.start_server = false
538 547
539 548 ## List of enabled VCS backends, available options are:
540 549 ## `hg` - mercurial
541 550 ## `git` - git
542 551 ## `svn` - subversion
543 552 vcs.backends = hg, git, svn
544 553
545 554 vcs.connection_timeout = 3600
546 555 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
547 556 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
548 557 #vcs.svn.compatible_version = pre-1.8-compatible
549 558
550 559
551 560 ############################################################
552 561 ### Subversion proxy support (mod_dav_svn) ###
553 562 ### Maps RhodeCode repo groups into SVN paths for Apache ###
554 563 ############################################################
555 564 ## Enable or disable the config file generation.
556 565 svn.proxy.generate_config = false
557 566 ## Generate config file with `SVNListParentPath` set to `On`.
558 567 svn.proxy.list_parent_path = true
559 568 ## Set location and file name of generated config file.
560 569 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
561 570 ## alternative mod_dav config template. This needs to be a mako template
562 571 #svn.proxy.config_template = ~/.rccontrol/enterprise-1/custom_svn_conf.mako
563 572 ## Used as a prefix to the `Location` block in the generated config file.
564 573 ## In most cases it should be set to `/`.
565 574 svn.proxy.location_root = /
566 575 ## Command to reload the mod dav svn configuration on change.
567 576 ## Example: `/etc/init.d/apache2 reload` or /home/USER/apache_reload.sh
568 577 ## Make sure user who runs RhodeCode process is allowed to reload Apache
569 578 #svn.proxy.reload_cmd = /etc/init.d/apache2 reload
570 579 ## If the timeout expires before the reload command finishes, the command will
571 580 ## be killed. Setting it to zero means no timeout. Defaults to 10 seconds.
572 581 #svn.proxy.reload_timeout = 10
573 582
574 583 ############################################################
575 584 ### SSH Support Settings ###
576 585 ############################################################
577 586
578 587 ## Defines if a custom authorized_keys file should be created and written on
579 588 ## any change user ssh keys. Setting this to false also disables possibility
580 589 ## of adding SSH keys by users from web interface. Super admins can still
581 590 ## manage SSH Keys.
582 591 ssh.generate_authorized_keyfile = false
583 592
584 593 ## Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
585 594 # ssh.authorized_keys_ssh_opts =
586 595
587 596 ## Path to the authorized_keys file where the generate entries are placed.
588 597 ## It is possible to have multiple key files specified in `sshd_config` e.g.
589 598 ## AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
590 599 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
591 600
592 601 ## Command to execute the SSH wrapper. The binary is available in the
593 602 ## RhodeCode installation directory.
594 603 ## e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
595 604 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
596 605
597 606 ## Allow shell when executing the ssh-wrapper command
598 607 ssh.wrapper_cmd_allow_shell = false
599 608
600 609 ## Enables logging, and detailed output send back to the client during SSH
601 610 ## operations. Useful for debugging, shouldn't be used in production.
602 611 ssh.enable_debug_logging = false
603 612
604 613 ## Paths to binary executable, by default they are the names, but we can
605 614 ## override them if we want to use a custom one
606 615 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
607 616 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
608 617 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
609 618
610 619 ## Enables SSH key generator web interface. Disabling this still allows users
611 620 ## to add their own keys.
612 621 ssh.enable_ui_key_generator = true
613 622
614 623
615 624 ## Dummy marker to add new entries after.
616 625 ## Add any custom entries below. Please don't remove.
617 626 custom.conf = 1
618 627
619 628
620 629 ################################
621 630 ### LOGGING CONFIGURATION ####
622 631 ################################
623 632 [loggers]
624 633 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
625 634
626 635 [handlers]
627 636 keys = console, console_sql
628 637
629 638 [formatters]
630 639 keys = generic, color_formatter, color_formatter_sql
631 640
632 641 #############
633 642 ## LOGGERS ##
634 643 #############
635 644 [logger_root]
636 645 level = NOTSET
637 646 handlers = console
638 647
639 648 [logger_sqlalchemy]
640 649 level = INFO
641 650 handlers = console_sql
642 651 qualname = sqlalchemy.engine
643 652 propagate = 0
644 653
645 654 [logger_beaker]
646 655 level = DEBUG
647 656 handlers =
648 657 qualname = beaker.container
649 658 propagate = 1
650 659
651 660 [logger_rhodecode]
652 661 level = DEBUG
653 662 handlers =
654 663 qualname = rhodecode
655 664 propagate = 1
656 665
657 666 [logger_ssh_wrapper]
658 667 level = DEBUG
659 668 handlers =
660 669 qualname = ssh_wrapper
661 670 propagate = 1
662 671
663 672 [logger_celery]
664 673 level = DEBUG
665 674 handlers =
666 675 qualname = celery
667 676
668 677
669 678 ##############
670 679 ## HANDLERS ##
671 680 ##############
672 681
673 682 [handler_console]
674 683 class = StreamHandler
675 684 args = (sys.stderr, )
676 685 level = INFO
677 686 formatter = generic
678 687
679 688 [handler_console_sql]
680 689 # "level = DEBUG" logs SQL queries and results.
681 690 # "level = INFO" logs SQL queries.
682 691 # "level = WARN" logs neither. (Recommended for production systems.)
683 692 class = StreamHandler
684 693 args = (sys.stderr, )
685 694 level = WARN
686 695 formatter = generic
687 696
688 697 ################
689 698 ## FORMATTERS ##
690 699 ################
691 700
692 701 [formatter_generic]
693 702 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
694 703 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
695 704 datefmt = %Y-%m-%d %H:%M:%S
696 705
697 706 [formatter_color_formatter]
698 707 class = rhodecode.lib.logging_formatter.ColorFormatter
699 708 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
700 709 datefmt = %Y-%m-%d %H:%M:%S
701 710
702 711 [formatter_color_formatter_sql]
703 712 class = rhodecode.lib.logging_formatter.ColorFormatterSql
704 713 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
705 714 datefmt = %Y-%m-%d %H:%M:%S
@@ -1,296 +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 22 { system ? builtins.currentSystem
23 23 , pythonPackages ? "python27Packages"
24 24 , pythonExternalOverrides ? self: super: {}
25 25 , doCheck ? false
26 26 , ...
27 27 }:
28 28
29 29 let
30 30 pkgs_ = args.pkgs or (import <nixpkgs> { inherit system; });
31 31 in
32 32
33 33 let
34 34 pkgs = import <nixpkgs> {
35 35 overlays = [
36 36 (import ./pkgs/overlays.nix)
37 37 ];
38 38 inherit
39 39 (pkgs_)
40 40 system;
41 41 };
42 42
43 43 # Works with the new python-packages, still can fallback to the old
44 44 # variant.
45 45 basePythonPackagesUnfix = basePythonPackages.__unfix__ or (
46 46 self: basePythonPackages.override (a: { inherit self; }));
47 47
48 48 # Evaluates to the last segment of a file system path.
49 49 basename = path: with pkgs.lib; last (splitString "/" path);
50 50
51 51 # source code filter used as arugment to builtins.filterSource.
52 52 src-filter = path: type: with pkgs.lib;
53 53 let
54 54 ext = last (splitString "." path);
55 55 in
56 56 !builtins.elem (basename path) [
57 57 ".git" ".hg" "__pycache__" ".eggs" ".idea" ".dev"
58 58 "node_modules" "node_binaries"
59 59 "build" "data" "result" "tmp"] &&
60 60 !builtins.elem ext ["egg-info" "pyc"] &&
61 61 # TODO: johbo: This check is wrong, since "path" contains an absolute path,
62 62 # it would still be good to restore it since we want to ignore "result-*".
63 63 !hasPrefix "result" path;
64 64
65 65 sources =
66 66 let
67 67 inherit
68 68 (pkgs.lib)
69 69 all
70 70 isString
71 71 attrValues;
72 72 sourcesConfig = pkgs.config.rc.sources or {};
73 73 in
74 74 # Ensure that sources are configured as strings. Using a path
75 75 # would result in a copy into the nix store.
76 76 assert all isString (attrValues sourcesConfig);
77 77 sourcesConfig;
78 78
79 79 version = builtins.readFile "${rhodecode-enterprise-ce-src}/rhodecode/VERSION";
80 80 rhodecode-enterprise-ce-src = builtins.filterSource src-filter ./.;
81 81
82 82 nodeEnv = import ./pkgs/node-default.nix {
83 83 inherit
84 84 pkgs
85 85 system;
86 86 };
87 87 nodeDependencies = nodeEnv.shell.nodeDependencies;
88 88
89 89 rhodecode-testdata-src = sources.rhodecode-testdata or (
90 90 pkgs.fetchhg {
91 91 url = "https://code.rhodecode.com/upstream/rc_testdata";
92 92 rev = "v0.10.0";
93 93 sha256 = "0zn9swwvx4vgw4qn8q3ri26vvzgrxn15x6xnjrysi1bwmz01qjl0";
94 94 });
95 95
96 96 rhodecode-testdata = import "${rhodecode-testdata-src}/default.nix" {
97 97 inherit
98 98 doCheck
99 99 pkgs
100 100 pythonPackages;
101 101 };
102 102
103 103 pythonLocalOverrides = self: super: {
104 104 rhodecode-enterprise-ce =
105 105 let
106 106 linkNodePackages = ''
107 107 export RHODECODE_CE_PATH=${rhodecode-enterprise-ce-src}
108 108
109 109 echo "[BEGIN]: Link node packages and binaries"
110 110 # johbo: Linking individual packages allows us to run "npm install"
111 111 # inside of a shell to try things out. Re-entering the shell will
112 112 # restore a clean environment.
113 113 rm -fr node_modules
114 114 mkdir node_modules
115 115 ln -s ${nodeDependencies}/lib/node_modules/* node_modules/
116 116 export NODE_PATH=./node_modules
117 117
118 118 rm -fr node_binaries
119 119 mkdir node_binaries
120 120 ln -s ${nodeDependencies}/bin/* node_binaries/
121 121 echo "[DONE ]: Link node packages and binaries"
122 122 '';
123 123
124 124 releaseName = "RhodeCodeEnterpriseCE-${version}";
125 125 in super.rhodecode-enterprise-ce.override (attrs: {
126 126 inherit
127 127 doCheck
128 128 version;
129 129
130 130 name = "rhodecode-enterprise-ce-${version}";
131 131 releaseName = releaseName;
132 132 src = rhodecode-enterprise-ce-src;
133 133 dontStrip = true; # prevent strip, we don't need it.
134 134
135 135 # expose following attributed outside
136 136 passthru = {
137 137 inherit
138 138 rhodecode-testdata
139 139 linkNodePackages
140 140 myPythonPackagesUnfix
141 141 pythonLocalOverrides
142 142 pythonCommunityOverrides;
143 143
144 144 pythonPackages = self;
145 145 };
146 146
147 147 buildInputs =
148 148 attrs.buildInputs or [] ++ [
149 149 rhodecode-testdata
150 150 ];
151 151
152 152 #NOTE: option to inject additional propagatedBuildInputs
153 153 propagatedBuildInputs =
154 154 attrs.propagatedBuildInputs or [] ++ [
155 155
156 156 ];
157 157
158 158 LC_ALL = "en_US.UTF-8";
159 159 LOCALE_ARCHIVE =
160 160 if pkgs.stdenv.isLinux
161 161 then "${pkgs.glibcLocales}/lib/locale/locale-archive"
162 162 else "";
163 163
164 164 # Add bin directory to path so that tests can find 'rhodecode'.
165 165 preCheck = ''
166 166 export PATH="$out/bin:$PATH"
167 167 '';
168 168
169 169 # custom check phase for testing
170 170 checkPhase = ''
171 171 runHook preCheck
172 172 PYTHONHASHSEED=random py.test -vv -p no:sugar -r xw --cov-config=.coveragerc --cov=rhodecode --cov-report=term-missing rhodecode
173 173 runHook postCheck
174 174 '';
175 175
176 176 postCheck = ''
177 177 echo "Cleanup of rhodecode/tests"
178 178 rm -rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/tests
179 179 '';
180 180
181 181 preBuild = ''
182 182 echo "[BEGIN]: Building frontend assets"
183 183 ${linkNodePackages}
184 184 make web-build
185 185 rm -fr node_modules
186 186 rm -fr node_binaries
187 187 echo "[DONE ]: Building frontend assets"
188 188 '';
189 189
190 190 postInstall = ''
191 191 # check required files
192 192 STATIC_CHECK="/robots.txt /502.html
193 193 /js/scripts.js /js/rhodecode-components.js
194 /css/style.css /css/style-polymer.css"
194 /css/style.css /css/style-polymer.css /css/style-ipython.css"
195 195
196 196 for file in $STATIC_CHECK;
197 197 do
198 198 if [ ! -f rhodecode/public/$file ]; then
199 199 echo "Missing $file"
200 200 exit 1
201 201 fi
202 202 done
203 203
204 204 echo "Writing enterprise-ce meta information for rccontrol to nix-support/rccontrol"
205 205 mkdir -p $out/nix-support/rccontrol
206 206 cp -v rhodecode/VERSION $out/nix-support/rccontrol/version
207 207 echo "[DONE ]: enterprise-ce meta information for rccontrol written"
208 208
209 209 mkdir -p $out/etc
210 210 cp configs/production.ini $out/etc
211 211 echo "[DONE ]: saved enterprise-ce production.ini into $out/etc"
212 212
213 213 cp -Rf rhodecode/config/rcextensions $out/etc/rcextensions.tmpl
214 214 echo "[DONE ]: saved enterprise-ce rcextensions into $out/etc/rcextensions.tmpl"
215 215
216 216 # python based programs need to be wrapped
217 217 mkdir -p $out/bin
218 218
219 219 # required binaries from dependencies
220 220 ln -s ${self.supervisor}/bin/supervisorctl $out/bin/
221 221 ln -s ${self.supervisor}/bin/supervisord $out/bin/
222 222 ln -s ${self.pastescript}/bin/paster $out/bin/
223 223 ln -s ${self.channelstream}/bin/channelstream $out/bin/
224 224 ln -s ${self.celery}/bin/celery $out/bin/
225 225 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
226 226 ln -s ${self.pyramid}/bin/prequest $out/bin/
227 227 ln -s ${self.pyramid}/bin/pserve $out/bin/
228 228
229 229 echo "[DONE ]: created symlinks into $out/bin"
230 230 DEPS="$out/bin/supervisorctl \
231 231 $out/bin/supervisord \
232 232 $out/bin/paster \
233 233 $out/bin/channelstream \
234 234 $out/bin/celery \
235 235 $out/bin/gunicorn \
236 236 $out/bin/prequest \
237 237 $out/bin/pserve"
238 238
239 239 # wrap only dependency scripts, they require to have full PYTHONPATH set
240 240 # to be able to import all packages
241 241 for file in $DEPS;
242 242 do
243 243 wrapProgram $file \
244 244 --prefix PATH : $PATH \
245 245 --prefix PYTHONPATH : $PYTHONPATH \
246 246 --set PYTHONHASHSEED random
247 247 done
248 248
249 249 echo "[DONE ]: enterprise-ce binary wrapping"
250 250
251 251 # rhodecode-tools don't need wrapping
252 252 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
253 253
254 254 # expose sources of CE
255 255 ln -s $out $out/etc/rhodecode_enterprise_ce_source
256 256
257 257 # expose static files folder
258 258 cp -Rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/public/ $out/etc/static
259 259 chmod 755 -R $out/etc/static
260 260
261 261 '';
262 262 });
263 263
264 264 };
265 265
266 266 basePythonPackages = with builtins;
267 267 if isAttrs pythonPackages then
268 268 pythonPackages
269 269 else
270 270 getAttr pythonPackages pkgs;
271 271
272 272 pythonGeneratedPackages = import ./pkgs/python-packages.nix {
273 273 inherit
274 274 pkgs;
275 275 inherit
276 276 (pkgs)
277 277 fetchurl
278 278 fetchgit
279 279 fetchhg;
280 280 };
281 281
282 282 pythonCommunityOverrides = import ./pkgs/python-packages-overrides.nix {
283 283 inherit pkgs basePythonPackages;
284 284 };
285 285
286 286 # Apply all overrides and fix the final package set
287 287 myPythonPackagesUnfix = with pkgs.lib;
288 288 (extends pythonExternalOverrides
289 289 (extends pythonLocalOverrides
290 290 (extends pythonCommunityOverrides
291 291 (extends pythonGeneratedPackages
292 292 basePythonPackagesUnfix))));
293 293
294 294 myPythonPackages = (pkgs.lib.fix myPythonPackagesUnfix);
295 295
296 296 in myPythonPackages.rhodecode-enterprise-ce
@@ -1,77 +1,77 b''
1 1 .. _repo-xtra:
2 2
3 3 Repository Extra Fields
4 4 =======================
5 5
6 6 Extra fields attached to a |repo| allow you to configure additional fields for
7 7 each repository. This allows storing custom data per-repository.
8 8
9 9 It can be used in :ref:`integrations-webhook` or in |RCX|.
10 10 To read more about |RCX|, see the :ref:`integrations-rcextensions` section.
11 11
12 12
13 13 Enabling Extra Fields
14 14 ---------------------
15 15
16 16 To enable extra fields on |repos|, use the following steps:
17 17
18 18 1. Go to the :menuselection:`Admin --> Settings --> Visual` page.
19 19 2. Check the :guilabel:`Use repository extra fields` box.
20 20 3. Save your changes.
21 21
22 22
23 23 Configuring Extra Fields
24 24 ------------------------
25 25
26 26 To configure extra fields per repository, use the following steps:
27 27
28 28 1. Go to :menuselection:`Admin --> Repositories` and select :guilabel:`Edit`
29 29 beside the |repo| to which you wish to add extra fields.
30 30 2. On the |repo| settings page, select the :guilabel:`Extra fields` tab.
31 31
32 .. image:: ../images/extra-repo-fields.png
32 .. image:: ../../images/extra-repo-fields.png
33 33
34 34 The most important is the `New field key` variable which under the value will
35 35 be stored. It needs to be unique for each repository. The label and description
36 36 will be generated in repository settings where users can actually save some
37 37 values inside generated extra fields.
38 38
39 39
40 40 Example Usage in extensions
41 41 ---------------------------
42 42
43 43 To use the extra fields in an extension, see the example below. For more
44 44 information and examples, see the :ref:`extensions-hooks-ref` section.
45 45
46 46 .. code-block:: python
47 47
48 48 call = load_extension('http_notify.py')
49 49 if call:
50 50 url = 'http://default.url' # <url for post data>
51 51
52 52 # possibly extract the URL from extra fields
53 53 call = load_extension('extra_fields.py')
54 54 if call:
55 55 repo_extra_fields = call(**kwargs)
56 56 # now update if we have extra fields, they have precedence
57 57 # this way users can store any configuration inside the database per
58 58 # repo
59 59 for key, data in repo_extra_fields.items():
60 60 kwargs[key] = data['field_value']
61 61
62 62 # an endpoint url data will be sent to, fetched from extra fields
63 63 # if exists, or fallback to default
64 64 kwargs['URL'] = kwargs.pop('webhook_url', None) or url
65 65
66 66 # fetch pushed commits, from commit_ids list
67 67 call = load_extension('extract_commits.py')
68 68 extracted_commits = {}
69 69 if call:
70 70 extracted_commits = call(**kwargs)
71 71 # store the commits for the next call chain
72 72 kwargs['COMMITS'] = extracted_commits
73 73
74 74 # set additional keys and values to be sent via POST to given URL
75 75 kwargs['caller_type'] = 'rhodecode'
76 76 kwargs['date'] = time.time() # import time before
77 77 call(**kwargs)
1 NO CONTENT: file renamed from docs/admin/repo-hooks.rst to docs/admin/repo_admin/repo-hooks.rst
1 NO CONTENT: file renamed from docs/admin/repo-issue-tracker.rst to docs/admin/repo_admin/repo-issue-tracker.rst
1 NO CONTENT: file renamed from docs/admin/repo-perm-steps.rst to docs/admin/repo_admin/repo-perm-steps.rst
1 NO CONTENT: file renamed from docs/admin/repo-vcs.rst to docs/admin/repo_admin/repo-vcs.rst
1 NO CONTENT: file renamed from docs/admin/restore-deleted-repositories.rst to docs/admin/repo_admin/restore-deleted-repositories.rst
@@ -1,34 +1,32 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 config-files-overview
20 vcs-server
21 svn-http
22 svn-path-permissions
23 gunicorn-ssl-support
24 apache-config
25 nginx-config
26 backup-restore
27 tuning-rhodecode
28 indexing
29 reset-information
30 enable-debug
31 admin-tricks
32 cleanup-cmds
33 restore-deleted-repositories
34
19 system_admin/config-files-overview
20 system_admin/vcs-server
21 system_admin/svn-http
22 system_admin/svn-path-permissions
23 system_admin/gunicorn-ssl-support
24 system_admin/apache-config
25 system_admin/nginx-config
26 system_admin/backup-restore
27 system_admin/tuning-rhodecode
28 system_admin/indexing
29 system_admin/reset-information
30 system_admin/enable-debug
31 system_admin/admin-tricks
32 system_admin/cleanup-cmds
@@ -1,241 +1,264 b''
1 1 .. _admin-tricks:
2 2
3 3 One-time Admin Tasks
4 4 --------------------
5 5
6 6 * :ref:`web-analytics`
7 7 * :ref:`admin-tricks-license`
8 8 * :ref:`announcements`
9 9 * :ref:`md-rst`
10 10 * :ref:`repo-stats`
11 11 * :ref:`server-side-merge`
12 12 * :ref:`remap-rescan`
13 13 * :ref:`custom-hooks`
14 14 * :ref:`clear-repo-cache`
15 15 * :ref:`set-repo-pub`
16 16 * :ref:`ping`
17 17
18 18 .. _web-analytics:
19 19
20 20 Adding Web Analytics
21 21 ^^^^^^^^^^^^^^^^^^^^
22 22
23 23 If you wish to add a Google Analytics, or any other kind of tracker to your
24 24 |RCE| instance you can add the necessary codes to the header or footer
25 25 section of each instance using the following steps:
26 26
27 27 1. From the |RCE| interface, select
28 28 :menuselection:`Admin --> Settings --> Global`
29 29 2. To add a tracking code to you instance, enter it in the header or footer
30 30 section and select **Save**
31 31
32 32 Use the example templates in the drop-down menu to set up your configuration.
33 33
34 34 .. _admin-tricks-license:
35 35
36 36 Licence Key Management
37 37 ^^^^^^^^^^^^^^^^^^^^^^
38 38
39 39 To manage your license key, go to
40 40 :menuselection:`Admin --> Settings --> License`.
41 41 On this page you can see the license key details. If you need a new license,
42 42 or have questions about your current one, contact support@rhodecode.com
43 43
44 44 .. _announcements:
45 45
46 46 Server-wide Announcements
47 47 ^^^^^^^^^^^^^^^^^^^^^^^^^
48 48
49 49 If you need to make a server-wide announcement to all users,
50 50 you can add a message to be displayed using the following steps:
51 51
52 52 1. From the |RCE| interface, select
53 53 :menuselection:`Admin --> Settings --> Global`
54 54 2. To add a message that will be displayed to all users,
55 55 select :guilabel:`Server Announcement` from the drop-down menu and
56 56 change the ``var message = "TYPE YOUR MESSAGE HERE";`` example line.
57 57 3. Select :guilabel:`Save`, and you will see the message once your page
58 58 refreshes.
59 59
60 .. image:: ../images/server-wide-announcement.png
60 .. image:: ../../images/server-wide-announcement.png
61 61 :alt: Server Wide Announcement
62 62
63 63 .. _md-rst:
64 64
65 65
66 66 Suppress license warnings or errors
67 67 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
68 68
69 69 In case you're running on maximum allowed users, RhodeCode will display a
70 70 warning message on pages that you're close to the license limits.
71 71 It's often not desired to show that all the time. Here's how you can suppress
72 72 the license messages.
73 73
74 74 1. From the |RCE| interface, select
75 75 :menuselection:`Admin --> Settings --> Global`
76 76 2. Select :guilabel:`Flash message filtering` from the drop-down menu.
77 77 3. Select :guilabel:`Save`, and you will no longer see the license message
78 78 once your page refreshes.
79 79
80 80 .. _admin-tricks-suppress-license-messages:
81 81
82 82
83 83 Markdown or RST Rendering
84 84 ^^^^^^^^^^^^^^^^^^^^^^^^^
85 85
86 86 |RCE| can use `Markdown`_ or `reStructured Text`_ in commit message,
87 87 code review messages, and inline comments. To set the default to either,
88 88 select your preference from the drop-down menu on the
89 89 :menuselection:`Admin --> Settings --> Visual` page and select
90 90 :guilabel:`Save settings`.
91 91
92 92 .. _repo-stats:
93 93
94 94 Enabling Repository Statistics
95 95 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
96 96
97 97 To enable |repo| statistics, use the following steps:
98 98
99 99 1. From the |RCE| interface, open
100 100 :menuselection:`Admin --> Repositories` and select
101 101 :guilabel:`Edit` beside the |repo| for which you wish to enable statistics.
102 102 2. Check the :guilabel:`Enable statistics` box, and select :guilabel:`Save`
103 103
104 104 .. _server-side-merge:
105 105
106 106 Enabling Server-side Merging
107 107 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
108 108
109 109 To enable server-side merging, use the following steps:
110 110
111 111 1. From the |RCE| interface, open :menuselection:`Admin --> Settings --> VCS`
112 112 2. Check the :guilabel:`Server-side merge` box, and select
113 113 :guilabel:`Save Settings`
114 114
115 115 If you encounter slow performance with server-side merging enabled, check the
116 116 speed at which your server is performing actions. When server-side merging is
117 117 enabled, the following actions occurs on the server.
118 118
119 119 * A |pr| is created in the database.
120 120 * A shadow |repo| is created as a working environment for the |pr|.
121 121 * On display, |RCE| checks if the |pr| can be merged.
122 122
123 123 To check how fast the shadow |repo| creation is occurring on your server, use
124 124 the following steps:
125 125
126 126 1. Log into your server and create a directory in your |repos| folder.
127 127 2. Clone a |repo| that is showing slow performance and time the action.
128 128
129 129 .. code-block:: bash
130 130
131 131 # One option is to use the time command
132 132 $ time hg clone SOURCE_REPO TARGET
133 133
134 134 .. _remap-rescan:
135 135
136 136 Remap and Rescan Repositories
137 137 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
138 138
139 139 You may want to Remap and rescan the |repos| that |RCE| is managing to ensure
140 140 the system is always up-to-date. This is useful after importing, deleting,
141 141 or carrying out general cleaning up operations. To do this use the
142 142 following steps:
143 143
144 144 1. From the |RCE|, open
145 145 :menuselection:`Admin --> Settings --> Remap and rescan`
146 146 2. Click :guilabel:`Rescan Repositories`
147 147
148 148 Check the additional options if needed:
149 149
150 150 * :guilabel:`Destroy old data`: Useful for purging deleted repository
151 151 information from the database.
152 152 * :guilabel:`Invalidate cache for all repositories`: Use this to completely
153 153 remap all |repos|. Useful when importing or migrating |repos| to ensure all
154 154 new information is picked up.
155 155
156 156 .. _custom-hooks:
157 157
158 158 Adding Custom Hooks
159 159 ^^^^^^^^^^^^^^^^^^^
160 160
161 161 To add custom hooks to your instance, use the following steps:
162 162
163 163 1. Open :menuselection:`Admin --> Settings --> Hooks`
164 164 2. Add your custom hook details, you can use a file path to specify custom
165 165 hook scripts, for example:
166 166 ``pretxnchangegroup.example`` with value ``python:/path/to/custom_hook.py:my_func_name``
167 167 3. Select :guilabel:`Save`
168 168
169 169 Also, see the RhodeCode Extensions section of the :ref:`rc-tools` guide. RhodeCode
170 170 Extensions can be used to add additional hooks to your instance and comes
171 171 with a number of pre-built plugins if you chose to install them.
172 172
173 173 .. _clear-repo-cache:
174 174
175 175 Clearing |repo| cache
176 176 ^^^^^^^^^^^^^^^^^^^^^
177 177
178 178 If you need to clear the cache for a particular |repo|, use the following steps:
179 179
180 180 1. Open :menuselection:`Admin --> Repositories` and select :guilabel:`Edit`
181 181 beside the |repo| whose cache you wish to clear.
182 182 2. On the |repo| settings page, go to the :guilabel:`Caches` tab and select
183 183 :guilabel:`Invalidate repository cache`.
184 184
185 185 .. _set-lang:
186 186
187 187 Changing Default Language
188 188 ^^^^^^^^^^^^^^^^^^^^^^^^^
189 189
190 190 To change the default language of a |RCE| instance, change the language code
191 191 in the :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file. To
192 192 do this, use the following steps.
193 193
194 194 1. Open the :file:`rhodecode.ini` file and set the required language code.
195 195
196 196 .. code-block:: ini
197 197
198 198 ## Optional Languages
199 199 ## en(default), de, fr, it, ja, pl, pt, ru, zh
200 200 lang = de
201 201
202 202 2. Restart the |RCE| instance and check that the language has been updated.
203 203
204 204 .. code-block:: bash
205 205
206 206 $ rccontrol restart enterprise-2
207 207 Instance "enterprise-2" successfully stopped.
208 208 Instance "enterprise-2" successfully started.
209 209
210 .. image:: ../images/language.png
210 .. image:: ../../images/language.png
211 211
212 212 .. _set-repo-pub:
213 213
214 214 Setting Repositories to Publish
215 215 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
216 216
217 217 To automatically promote your local |repos| to public after pushing to |RCE|,
218 218 enable the :guilabel:`Set repositories as publishing` option on the
219 219 :menuselection:`Admin --> Settings --> VCS` page.
220 220
221 221 .. note::
222 222
223 223 This option is enabled by default on most |RCE| versions, but if upgrading
224 224 from a 1.7.x version it could be disabled on upgrade due to inheriting
225 225 older default settings.
226 226
227 227 .. _ping:
228 228
229 229 Pinging the |RCE| Server
230 230 ^^^^^^^^^^^^^^^^^^^^^^^^
231 231
232 232 You can check the IP Address of your |RCE| instance using the
233 233 following URL: ``{instance-URL}/_admin/ping``.
234 234
235 235 .. code-block:: bash
236 236
237 237 $ curl https://your.rhodecode.url/_admin/ping
238 238 pong[rce-7880] => 203.0.113.23
239 239
240 240 .. _Markdown: http://daringfireball.net/projects/markdown/
241 241 .. _reStructured Text: http://docutils.sourceforge.net/docs/index.html
242
243
244 Unarchiving a repository
245 ^^^^^^^^^^^^^^^^^^^^^^^^^
246
247 Archive operation for the repository is similar as delete. Archive keeps the data for future references
248 but makes the repository read-only. After archiving the repository it shouldn't be modified in any way.
249 This is why repository settings are disabled for an archived repository.
250
251 If there's a need for unarchiving a repository for some reasons, the interactive
252 ishell interface should be used.
253
254 .. code-block:: bash
255
256 # Open iShell from the terminal
257 $ rccontrol ishell enterprise-1/community-1
258
259 .. code-block:: python
260
261 # Set repository as un-archived
262 In [1]: repo = Repository.get_by_repo_name('SOME_REPO_NAME')
263 In [2]: repo.archived = False
264 In [3]: Session().add(repo);Session().commit()
@@ -1,14 +1,14 b''
1 1 .. _apache-ws-ref:
2 2
3 3 Apache HTTP Server Configuration
4 4 --------------------------------
5 5
6 6 To set up your Apache Web Server for optimal performance and security, use
7 7 the information in the following sections.
8 8
9 9 .. toctree::
10 10
11 apache-conf-example
12 apache-diffie-hellman
13 apache-subdirectory
14 apache-wsgi-coding
11 apache/apache-conf-example
12 apache/apache-diffie-hellman
13 apache/apache-subdirectory
14 apache/apache-wsgi-coding
@@ -1,103 +1,107 b''
1 1 .. _apache-conf-eg:
2 2
3 3 Apache Configuration Example
4 4 ----------------------------
5 5
6 6 Use the following example to configure Apache as a your web server.
7 7 Below config if for an Apache Reverse Proxy configuration.
8 8
9 9 .. note::
10 10
11 11 Apache requires the following modules to be enabled. Below is an example
12 12 how to enable them on Ubuntu Server
13 13
14 14
15 15 .. code-block:: bash
16 16
17 17 $ sudo a2enmod proxy
18 18 $ sudo a2enmod proxy_http
19 19 $ sudo a2enmod proxy_balancer
20 20 $ sudo a2enmod headers
21 21 $ sudo a2enmod ssl
22 22 $ sudo a2enmod rewrite
23 23
24 24 # requires Apache 2.4+, required to handle websockets/channelstream
25 25 $ sudo a2enmod proxy_wstunnel
26 26
27 27
28 28 .. code-block:: apache
29 29
30 30 ## HTTP to HTTPS rewrite
31 31 <VirtualHost *:80>
32 32 ServerName rhodecode.myserver.com
33 33 DocumentRoot /var/www/html
34 34 Redirect permanent / https://rhodecode.myserver.com/
35 35 </VirtualHost>
36 36
37 37 ## MAIN SSL enabled server
38 38 <VirtualHost *:443>
39 39
40 40 ServerName rhodecode.myserver.com
41 41 ServerAlias rhodecode.myserver.com
42 42
43 43 ## Skip ProxyPass the _static to backend server
44 44 #ProxyPass /_static !
45 45
46 46 ## serve static files by Apache, recommended for performance
47 47 #Alias /_static/rhodecode /home/ubuntu/.rccontrol/community-1/static
48 48
49 49 ## Allow Apache to access the static files in this directory
50 50 #<Directory /home/ubuntu/.rccontrol/community-1/static/>
51 51 # AllowOverride none
52 52 # Require all granted
53 53 #</Directory>
54 54
55 55 RequestHeader set X-Forwarded-Proto "https"
56 56
57 57 ## channelstream websocket handling
58 58 ProxyPass /_channelstream ws://localhost:9800
59 59 ProxyPassReverse /_channelstream ws://localhost:9800
60 60
61 61 <Proxy *>
62 62 Order allow,deny
63 63 Allow from all
64 64 </Proxy>
65 65
66 66 # Directive to properly generate url (clone url) for RhodeCode
67 67 ProxyPreserveHost On
68 68
69 # It allows request bodies to be sent to the backend using chunked transfer encoding.
70 SetEnv proxy-sendchunked 1
71
72 # Increase headers size for large Mercurial headers sent with many branches
73 LimitRequestLine 16380
74
69 75 # Url to running RhodeCode instance. This is shown as `- URL:` when
70 76 # running rccontrol status.
77
71 78 ProxyPass / http://127.0.0.1:10002/ timeout=7200 Keepalive=On
72 79 ProxyPassReverse / http://127.0.0.1:10002/
73 80
74 # Increase headers for large Mercurial headers
75 LimitRequestLine 16380
76
77 81 # strict http prevents from https -> http downgrade
78 82 Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
79 83
80 84 # Set x-frame options
81 85 Header always append X-Frame-Options SAMEORIGIN
82 86
83 87 # To enable https use line below
84 88 # SetEnvIf X-Url-Scheme https HTTPS=1
85 89
86 90 # SSL setup
87 91 SSLEngine On
88 92 SSLCertificateFile /etc/apache2/ssl/rhodecode.myserver.pem
89 93 SSLCertificateKeyFile /etc/apache2/ssl/rhodecode.myserver.key
90 94
91 95 SSLProtocol all -SSLv2 -SSLv3
92 96 SSLCipherSuite 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
93 97 SSLHonorCipherOrder on
94 98
95 99 # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
96 100 #SSLOpenSSLConfCmd DHParameters "/etc/apache2/dhparam.pem"
97 101
98 102 ## custom 502 error page. Will be displayed while RhodeCode server
99 103 ## is turned off
100 104 ErrorDocument 502 /path/to/.rccontrol/enterprise-1/static/502.html
101 105
102 106 </VirtualHost>
103 107
1 NO CONTENT: file renamed from docs/admin/apache-diffie-hellman.rst to docs/admin/system_admin/apache/apache-diffie-hellman.rst
1 NO CONTENT: file renamed from docs/admin/apache-subdirectory.rst to docs/admin/system_admin/apache/apache-subdirectory.rst
1 NO CONTENT: file renamed from docs/admin/apache-wsgi-coding.rst to docs/admin/system_admin/apache/apache-wsgi-coding.rst
1 NO CONTENT: file renamed from docs/admin/backup-restore.rst to docs/admin/system_admin/backup-restore.rst
1 NO CONTENT: file renamed from docs/admin/cleanup-cmds.rst to docs/admin/system_admin/cleanup-cmds.rst
1 NO CONTENT: file renamed from docs/admin/config-files-overview.rst to docs/admin/system_admin/config-files-overview.rst
1 NO CONTENT: file renamed from docs/admin/enable-debug.rst to docs/admin/system_admin/enable-debug.rst
1 NO CONTENT: file renamed from docs/admin/gunicorn-ssl-support.rst to docs/admin/system_admin/gunicorn-ssl-support.rst
1 NO CONTENT: file renamed from docs/admin/indexing.rst to docs/admin/system_admin/indexing.rst
@@ -1,14 +1,14 b''
1 1 .. _nginx-ws-ref:
2 2
3 3 Nginx HTTP Server Configuration
4 4 -------------------------------
5 5
6 6 To set up your Nginx Web Server for optimal performance and security, use
7 7 the information in the following sections.
8 8
9 9 .. toctree::
10 10
11 nginx-config-example
12 nginx-diffie-hellman
13 nginx-proxy-conf
14 nginx-url-prefix
11 nginx/nginx-config-example
12 nginx/nginx-diffie-hellman
13 nginx/nginx-proxy-conf
14 nginx/nginx-url-prefix
1 NO CONTENT: file renamed from docs/admin/nginx-config-example.rst to docs/admin/system_admin/nginx/nginx-config-example.rst
1 NO CONTENT: file renamed from docs/admin/nginx-diffie-hellman.rst to docs/admin/system_admin/nginx/nginx-diffie-hellman.rst
1 NO CONTENT: file renamed from docs/admin/nginx-proxy-conf.rst to docs/admin/system_admin/nginx/nginx-proxy-conf.rst
1 NO CONTENT: file renamed from docs/admin/nginx-url-prefix.rst to docs/admin/system_admin/nginx/nginx-url-prefix.rst
1 NO CONTENT: file renamed from docs/admin/reset-information.rst to docs/admin/system_admin/reset-information.rst
1 NO CONTENT: file renamed from docs/admin/svn-http.rst to docs/admin/system_admin/svn-http.rst
1 NO CONTENT: file renamed from docs/admin/svn-path-permissions.rst to docs/admin/system_admin/svn-path-permissions.rst
@@ -1,21 +1,21 b''
1 1 .. _rhodecode-tuning-ref:
2 2
3 3 Tuning |RCE|
4 4 ============
5 5
6 6 To customize your |RCE| |version| installation for maximum performance you
7 7 may find some of the following methods useful.
8 8
9 9 .. toctree::
10 10
11 tuning-gunicorn
12 tuning-vcs-memory-cache
13 tuning-user-sessions-performance
14 tuning-increase-db-performance
15 tuning-scale-horizontally-cluster
16 tuning-mount-cache-memory
17 tuning-change-encoding
18 tuning-change-large-file-dir
19 tuning-change-lfs-dir
20 tuning-hg-auth-loop
11 tuning/tuning-gunicorn
12 tuning/tuning-vcs-memory-cache
13 tuning/tuning-user-sessions-performance
14 tuning/tuning-increase-db-performance
15 tuning/tuning-scale-horizontally-cluster
16 tuning/tuning-mount-cache-memory
17 tuning/tuning-change-encoding
18 tuning/tuning-change-large-file-dir
19 tuning/tuning-change-lfs-dir
20 tuning/tuning-hg-auth-loop
21 21
1 NO CONTENT: file renamed from docs/admin/tuning-change-encoding.rst to docs/admin/system_admin/tuning/tuning-change-encoding.rst
1 NO CONTENT: file renamed from docs/admin/tuning-change-large-file-dir.rst to docs/admin/system_admin/tuning/tuning-change-large-file-dir.rst
1 NO CONTENT: file renamed from docs/admin/tuning-change-lfs-dir.rst to docs/admin/system_admin/tuning/tuning-change-lfs-dir.rst
@@ -1,126 +1,126 b''
1 1 .. _increase-gunicorn:
2 2
3 3 Configure Gunicorn Workers
4 4 --------------------------
5 5
6 6
7 7 |RCE| comes with `Gunicorn`_ which is a Python WSGI HTTP Server for UNIX.
8 8
9 9 To improve |RCE| performance you can increase the number of `Gunicorn`_ workers.
10 10 This allows to handle more connections concurrently, and provide better
11 11 responsiveness and performance.
12 12
13 13 By default during installation |RCC| tries to detect how many CPUs are
14 14 available in the system, and set the number workers based on that information.
15 15 However sometimes it's better to manually set the number of workers.
16 16
17 17 To do this, use the following steps:
18 18
19 19 1. Open the :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
20 20 2. In the ``[server:main]`` section, change the number of Gunicorn
21 21 ``workers`` using the following default formula :math:`(2 * Cores) + 1`.
22 22 We however not recommend using more than 8-12 workers per server. It's better
23 23 to start using the :ref:`scale-horizontal-cluster` in case that performance
24 24 with 8-12 workers is not enough.
25 25
26 26 .. code-block:: ini
27 27
28 28 use = egg:gunicorn#main
29 29 ## Sets the number of process workers. You must set `instance_id = *`
30 30 ## when this option is set to more than one worker, recommended
31 31 ## value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
32 32 ## The `instance_id = *` must be set in the [app:main] section below
33 33 workers = 4
34 34 ## process name
35 35 proc_name = rhodecode
36 36 ## type of worker class, one of sync, gevent
37 37 ## recommended for bigger setup is using of of other than sync one
38 38 worker_class = sync
39 39 ## The maximum number of simultaneous clients. Valid only for Gevent
40 40 #worker_connections = 10
41 41 ## max number of requests that worker will handle before being gracefully
42 42 ## restarted, could prevent memory leaks
43 43 max_requests = 1000
44 44 max_requests_jitter = 30
45 ## amount of time a worker can spend with handling a request before it
45 ## amount of time a worker can spend with handling a request tuning-change-lfs-dir.before it
46 46 ## gets killed and restarted. Set to 6hrs
47 47 timeout = 21600
48 48
49 49 3. In the ``[app:main]`` section, set the ``instance_id`` property to ``*``.
50 50
51 51 .. code-block:: ini
52 52
53 53 # In the [app:main] section
54 54 [app:main]
55 55 # You must set `instance_id = *`
56 56 instance_id = *
57 57
58 58 4. Change the VCSServer workers too. Open the
59 59 :file:`home/{user}/.rccontrol/{instance-id}/vcsserver.ini` file.
60 60
61 61 5. In the ``[server:main]`` section, increase the number of Gunicorn
62 62 ``workers`` using the following formula :math:`(2 * Cores) + 1`.
63 63
64 64 .. code-block:: ini
65 65
66 66 ## run with gunicorn --log-config vcsserver.ini --paste vcsserver.ini
67 67 use = egg:gunicorn#main
68 68 ## Sets the number of process workers. Recommended
69 69 ## value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
70 70 workers = 4
71 71 ## process name
72 72 proc_name = rhodecode_vcsserver
73 73 ## type of worker class, currently `sync` is the only option allowed.
74 74 worker_class = sync
75 75 ## The maximum number of simultaneous clients. Valid only for Gevent
76 76 #worker_connections = 10
77 77 ## max number of requests that worker will handle before being gracefully
78 78 ## restarted, could prevent memory leaks
79 79 max_requests = 1000
80 80 max_requests_jitter = 30
81 81 ## amount of time a worker can spend with handling a request before it
82 82 ## gets killed and restarted. Set to 6hrs
83 83 timeout = 21600
84 84
85 85 6. Save your changes.
86 86 7. Restart your |RCE| instances, using the following command:
87 87
88 88 .. code-block:: bash
89 89
90 90 $ rccontrol restart '*'
91 91
92 92
93 93 Gunicorn Gevent Backend
94 94 -----------------------
95 95
96 96 Gevent is an asynchronous worker type for Gunicorn. It allows accepting multiple
97 97 connections on a single `Gunicorn`_ worker. This means you can handle 100s
98 98 of concurrent clones, or API calls using just few workers. A setting called
99 99 `worker_connections` defines on how many connections each worker can
100 100 handle using `Gevent`.
101 101
102 102
103 103 To enable `Gevent` on |RCE| do the following:
104 104
105 105
106 106 1. Open the :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
107 107 2. In the ``[server:main]`` section, change `worker_class` for Gunicorn.
108 108
109 109
110 110 .. code-block:: ini
111 111
112 112 ## type of worker class, one of sync, gevent
113 113 ## recommended for bigger setup is using of of other than sync one
114 114 worker_class = gevent
115 115 ## The maximum number of simultaneous clients. Valid only for Gevent
116 116 worker_connections = 30
117 117
118 118
119 119 .. note::
120 120
121 121 `Gevent` is currently only supported for Enterprise/Community instances.
122 122 VCSServer doesn't yet support gevent.
123 123
124 124
125 125
126 126 .. _Gunicorn: http://gunicorn.org/
1 NO CONTENT: file renamed from docs/admin/tuning-hg-auth-loop.rst to docs/admin/system_admin/tuning/tuning-hg-auth-loop.rst
1 NO CONTENT: file renamed from docs/admin/tuning-increase-db-performance.rst to docs/admin/system_admin/tuning/tuning-increase-db-performance.rst
1 NO CONTENT: file renamed from docs/admin/tuning-mount-cache-memory.rst to docs/admin/system_admin/tuning/tuning-mount-cache-memory.rst
1 NO CONTENT: file renamed from docs/admin/tuning-scale-horizontally-cluster.rst to docs/admin/system_admin/tuning/tuning-scale-horizontally-cluster.rst
1 NO CONTENT: file renamed from docs/admin/tuning-user-sessions-performance.rst to docs/admin/system_admin/tuning/tuning-user-sessions-performance.rst
1 NO CONTENT: file renamed from docs/admin/tuning-vcs-memory-cache.rst to docs/admin/system_admin/tuning/tuning-vcs-memory-cache.rst
1 NO CONTENT: file renamed from docs/admin/vcs-server.rst to docs/admin/system_admin/vcs-server.rst
@@ -1,23 +1,24 b''
1 1 .. _user-admin-set:
2 2
3 3 User Administration
4 4 ===================
5 5
6 6 |RCE| enables you to define permissions for the following entities within the
7 7 system; **users**, **user groups**, **repositories**, **repository groups**.
8 8
9 9 Within each one of these entities you can set default settings,
10 10 and then all users or |repos| inherit those default permission settings
11 11 unless individually defined. Each of these entities can have the following
12 12 permissions applied to it; |perm|.
13 13
14 14 .. toctree::
15 15
16 public-access
17 default-user-perms
18 adding-anonymous-user
19 adding-new-user
20 setting-default-permissions
21 setting-usergroup-permissions
16 user_admin/public-access
17 user_admin/default-user-perms
18 user_admin/adding-anonymous-user
19 user_admin/adding-new-user
20 user_admin/setting-default-permissions
21 user_admin/setting-usergroup-permissions
22 user_admin/user-admin-tasks
22 23
23 .. |perm| replace:: **None**, **Read**, **Write**, or **Admin** No newline at end of file
24 .. |perm| replace:: **None**, **Read**, **Write**, or **Admin**
1 NO CONTENT: file renamed from docs/admin/adding-anonymous-user.rst to docs/admin/user_admin/adding-anonymous-user.rst
1 NO CONTENT: file renamed from docs/admin/adding-new-user.rst to docs/admin/user_admin/adding-new-user.rst
1 NO CONTENT: file renamed from docs/admin/default-user-perms.rst to docs/admin/user_admin/default-user-perms.rst
1 NO CONTENT: file renamed from docs/admin/public-access.rst to docs/admin/user_admin/public-access.rst
1 NO CONTENT: file renamed from docs/admin/setting-default-permissions.rst to docs/admin/user_admin/setting-default-permissions.rst
1 NO CONTENT: file renamed from docs/admin/setting-usergroup-permissions.rst to docs/admin/user_admin/setting-usergroup-permissions.rst
@@ -1,209 +1,210 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 199 methods/repo-methods
200 200 methods/store-methods
201 201 methods/license-methods
202 202 methods/deprecated-methods
203 203 methods/gist-methods
204 204 methods/pull-request-methods
205 205 methods/repo-methods
206 206 methods/repo-group-methods
207 methods/search-methods
207 208 methods/server-methods
208 209 methods/user-methods
209 210 methods/user-group-methods
@@ -1,1134 +1,1133 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 397 get_repo_comments
398 398 -----------------
399 399
400 400 .. py:function:: get_repo_comments(apiuser, repoid, commit_id=<Optional:None>, comment_type=<Optional:None>, userid=<Optional:None>)
401 401
402 402 Get all comments for a repository
403 403
404 404 :param apiuser: This is filled automatically from the |authtoken|.
405 405 :type apiuser: AuthUser
406 406 :param repoid: Set the repository name or repository ID.
407 407 :type repoid: str or int
408 408 :param commit_id: Optionally filter the comments by the commit_id
409 409 :type commit_id: Optional(str), default: None
410 410 :param comment_type: Optionally filter the comments by the comment_type
411 411 one of: 'note', 'todo'
412 412 :type comment_type: Optional(str), default: None
413 413 :param userid: Optionally filter the comments by the author of comment
414 414 :type userid: Optional(str or int), Default: None
415 415
416 416 Example error output:
417 417
418 418 .. code-block:: bash
419 419
420 420 {
421 421 "id" : <id_given_in_input>,
422 422 "result" : [
423 423 {
424 424 "comment_author": <USER_DETAILS>,
425 425 "comment_created_on": "2017-02-01T14:38:16.309",
426 426 "comment_f_path": "file.txt",
427 427 "comment_id": 282,
428 428 "comment_lineno": "n1",
429 429 "comment_resolved_by": null,
430 430 "comment_status": [],
431 431 "comment_text": "This file needs a header",
432 432 "comment_type": "todo"
433 433 }
434 434 ],
435 435 "error" : null
436 436 }
437 437
438 438
439 439 get_repo_file
440 440 -------------
441 441
442 442 .. py:function:: get_repo_file(apiuser, repoid, commit_id, file_path, max_file_bytes=<Optional:None>, details=<Optional:'basic'>, cache=<Optional:True>)
443 443
444 444 Returns a single file from repository at given revision.
445 445
446 446 This command can only be run using an |authtoken| with admin rights,
447 447 or users with at least read rights to |repos|.
448 448
449 449 :param apiuser: This is filled automatically from the |authtoken|.
450 450 :type apiuser: AuthUser
451 451 :param repoid: The repository name or repository ID.
452 452 :type repoid: str or int
453 453 :param commit_id: The revision for which listing should be done.
454 454 :type commit_id: str
455 455 :param file_path: The path from which to start displaying.
456 456 :type file_path: str
457 457 :param details: Returns different set of information about nodes.
458 458 The valid options are ``minimal`` ``basic`` and ``full``.
459 459 :type details: Optional(str)
460 460 :param max_file_bytes: Only return file content under this file size bytes
461 461 :type max_file_bytes: Optional(int)
462 462 :param cache: Use internal caches for fetching files. If disabled fetching
463 463 files is slower but more memory efficient
464 464 :type cache: Optional(bool)
465
465 466 Example output:
466 467
467 468 .. code-block:: bash
468 469
469 470 id : <id_given_in_input>
470 471 result: {
471 472 "binary": false,
472 473 "extension": "py",
473 474 "lines": 35,
474 475 "content": "....",
475 476 "md5": "76318336366b0f17ee249e11b0c99c41",
476 477 "mimetype": "text/x-python",
477 478 "name": "python.py",
478 479 "size": 817,
479 480 "type": "file",
480 481 }
481 482 error: null
482 483
483 484
484 485 get_repo_fts_tree
485 486 -----------------
486 487
487 488 .. py:function:: get_repo_fts_tree(apiuser, repoid, commit_id, root_path)
488 489
489 490 Returns a list of tree nodes for path at given revision. This api is built
490 491 strictly for usage in full text search building, and shouldn't be consumed
491 492
492 493 This command can only be run using an |authtoken| with admin rights,
493 494 or users with at least read rights to |repos|.
494 495
495 496
496 497 get_repo_nodes
497 498 --------------
498 499
499 500 .. py:function:: get_repo_nodes(apiuser, repoid, revision, root_path, ret_type=<Optional:'all'>, details=<Optional:'basic'>, max_file_bytes=<Optional:None>)
500 501
501 502 Returns a list of nodes and children in a flat list for a given
502 path at given revision.
503 path at given revision.
503 504
504 It's possible to specify ret_type to show only `files` or `dirs`.
505 It's possible to specify ret_type to show only `files` or `dirs`.
505 506
506 This command can only be run using an |authtoken| with admin rights,
507 or users with at least read rights to |repos|.
507 This command can only be run using an |authtoken| with admin rights,
508 or users with at least read rights to |repos|.
508 509
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:
510 :param apiuser: This is filled automatically from the |authtoken|.
511 :type apiuser: AuthUser
512 :param repoid: The repository name or repository ID.
513 :type repoid: str or int
514 :param revision: The revision for which listing should be done.
515 :type revision: str
516 :param root_path: The path from which to start displaying.
517 :type root_path: str
518 :param ret_type: Set the return type. Valid options are
519 ``all`` (default), ``files`` and ``dirs``.
520 :type ret_type: Optional(str)
521 :param details: Returns extended information about nodes, such as
522 md5, binary, and or content.
523 The valid options are ``basic`` and ``full``.
524 :type details: Optional(str)
525 :param max_file_bytes: Only return file content under this file size bytes
526 :type details: Optional(int)
528 527
529 .. code-block:: bash
528 Example output:
529
530 .. code-block:: bash
530 531
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
532 id : <id_given_in_input>
533 result: [
534 {
535 "binary": false,
536 "content": "File line",
537 "extension": "md",
538 "lines": 2,
539 "md5": "059fa5d29b19c0657e384749480f6422",
540 "mimetype": "text/x-minidsrc",
541 "name": "file.md",
542 "size": 580,
543 "type": "file"
544 },
545 ...
546 ]
547 error: null
549 548
550 549
551 550 get_repo_refs
552 551 -------------
553 552
554 553 .. py:function:: get_repo_refs(apiuser, repoid)
555 554
556 555 Returns a dictionary of current references. It returns
557 556 bookmarks, branches, closed_branches, and tags for given repository
558 557
559 558 It's possible to specify ret_type to show only `files` or `dirs`.
560 559
561 560 This command can only be run using an |authtoken| with admin rights,
562 561 or users with at least read rights to |repos|.
563 562
564 563 :param apiuser: This is filled automatically from the |authtoken|.
565 564 :type apiuser: AuthUser
566 565 :param repoid: The repository name or repository ID.
567 566 :type repoid: str or int
568 567
569 568 Example output:
570 569
571 570 .. code-block:: bash
572 571
573 572 id : <id_given_in_input>
574 573 "result": {
575 574 "bookmarks": {
576 575 "dev": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
577 576 "master": "367f590445081d8ec8c2ea0456e73ae1f1c3d6cf"
578 577 },
579 578 "branches": {
580 579 "default": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
581 580 "stable": "367f590445081d8ec8c2ea0456e73ae1f1c3d6cf"
582 581 },
583 582 "branches_closed": {},
584 583 "tags": {
585 584 "tip": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
586 585 "v4.4.0": "1232313f9e6adac5ce5399c2a891dc1e72b79022",
587 586 "v4.4.1": "cbb9f1d329ae5768379cdec55a62ebdd546c4e27",
588 587 "v4.4.2": "24ffe44a27fcd1c5b6936144e176b9f6dd2f3a17",
589 588 }
590 589 }
591 590 error: null
592 591
593 592
594 593 get_repo_settings
595 594 -----------------
596 595
597 596 .. py:function:: get_repo_settings(apiuser, repoid, key=<Optional:None>)
598 597
599 598 Returns all settings for a repository. If key is given it only returns the
600 599 setting identified by the key or null.
601 600
602 601 :param apiuser: This is filled automatically from the |authtoken|.
603 602 :type apiuser: AuthUser
604 603 :param repoid: The repository name or repository id.
605 604 :type repoid: str or int
606 605 :param key: Key of the setting to return.
607 606 :type: key: Optional(str)
608 607
609 608 Example output:
610 609
611 610 .. code-block:: bash
612 611
613 612 {
614 613 "error": null,
615 614 "id": 237,
616 615 "result": {
617 616 "extensions_largefiles": true,
618 617 "extensions_evolve": true,
619 618 "hooks_changegroup_push_logger": true,
620 619 "hooks_changegroup_repo_size": false,
621 620 "hooks_outgoing_pull_logger": true,
622 621 "phases_publish": "True",
623 622 "rhodecode_hg_use_rebase_for_merging": true,
624 623 "rhodecode_pr_merge_enabled": true,
625 624 "rhodecode_use_outdated_comments": true
626 625 }
627 626 }
628 627
629 628
630 629 get_repos
631 630 ---------
632 631
633 632 .. py:function:: get_repos(apiuser, root=<Optional:None>, traverse=<Optional:True>)
634 633
635 634 Lists all existing repositories.
636 635
637 636 This command can only be run using an |authtoken| with admin rights,
638 637 or users with at least read rights to |repos|.
639 638
640 639 :param apiuser: This is filled automatically from the |authtoken|.
641 640 :type apiuser: AuthUser
642 641 :param root: specify root repository group to fetch repositories.
643 642 filters the returned repositories to be members of given root group.
644 643 :type root: Optional(None)
645 644 :param traverse: traverse given root into subrepositories. With this flag
646 645 set to False, it will only return top-level repositories from `root`.
647 646 if root is empty it will return just top-level repositories.
648 647 :type traverse: Optional(True)
649 648
650 649
651 650 Example output:
652 651
653 652 .. code-block:: bash
654 653
655 654 id : <id_given_in_input>
656 655 result: [
657 656 {
658 657 "repo_id" : "<repo_id>",
659 658 "repo_name" : "<reponame>"
660 659 "repo_type" : "<repo_type>",
661 660 "clone_uri" : "<clone_uri>",
662 661 "private": : "<bool>",
663 662 "created_on" : "<datetimecreated>",
664 663 "description" : "<description>",
665 664 "landing_rev": "<landing_rev>",
666 665 "owner": "<repo_owner>",
667 666 "fork_of": "<name_of_fork_parent>",
668 667 "enable_downloads": "<bool>",
669 668 "enable_locking": "<bool>",
670 669 "enable_statistics": "<bool>",
671 670 },
672 671 ...
673 672 ]
674 673 error: null
675 674
676 675
677 676 grant_user_group_permission
678 677 ---------------------------
679 678
680 679 .. py:function:: grant_user_group_permission(apiuser, repoid, usergroupid, perm)
681 680
682 681 Grant permission for a user group on the specified repository,
683 682 or update existing permissions.
684 683
685 684 This command can only be run using an |authtoken| with admin
686 685 permissions on the |repo|.
687 686
688 687 :param apiuser: This is filled automatically from the |authtoken|.
689 688 :type apiuser: AuthUser
690 689 :param repoid: Set the repository name or repository ID.
691 690 :type repoid: str or int
692 691 :param usergroupid: Specify the ID of the user group.
693 692 :type usergroupid: str or int
694 693 :param perm: Set the user group permissions using the following
695 694 format: (repository.(none|read|write|admin))
696 695 :type perm: str
697 696
698 697 Example output:
699 698
700 699 .. code-block:: bash
701 700
702 701 id : <id_given_in_input>
703 702 result : {
704 703 "msg" : "Granted perm: `<perm>` for group: `<usersgroupname>` in repo: `<reponame>`",
705 704 "success": true
706 705
707 706 }
708 707 error : null
709 708
710 709 Example error output:
711 710
712 711 .. code-block:: bash
713 712
714 713 id : <id_given_in_input>
715 714 result : null
716 715 error : {
717 716 "failed to edit permission for user group: `<usergroup>` in repo `<repo>`'
718 717 }
719 718
720 719
721 720 grant_user_permission
722 721 ---------------------
723 722
724 723 .. py:function:: grant_user_permission(apiuser, repoid, userid, perm)
725 724
726 725 Grant permissions for the specified user on the given repository,
727 726 or update existing permissions if found.
728 727
729 728 This command can only be run using an |authtoken| with admin
730 729 permissions on the |repo|.
731 730
732 731 :param apiuser: This is filled automatically from the |authtoken|.
733 732 :type apiuser: AuthUser
734 733 :param repoid: Set the repository name or repository ID.
735 734 :type repoid: str or int
736 735 :param userid: Set the user name.
737 736 :type userid: str
738 737 :param perm: Set the user permissions, using the following format
739 738 ``(repository.(none|read|write|admin))``
740 739 :type perm: str
741 740
742 741 Example output:
743 742
744 743 .. code-block:: bash
745 744
746 745 id : <id_given_in_input>
747 746 result: {
748 747 "msg" : "Granted perm: `<perm>` for user: `<username>` in repo: `<reponame>`",
749 748 "success": true
750 749 }
751 750 error: null
752 751
753 752
754 753 invalidate_cache
755 754 ----------------
756 755
757 756 .. py:function:: invalidate_cache(apiuser, repoid, delete_keys=<Optional:False>)
758 757
759 758 Invalidates the cache for the specified repository.
760 759
761 760 This command can only be run using an |authtoken| with admin rights to
762 761 the specified repository.
763 762
764 763 This command takes the following options:
765 764
766 765 :param apiuser: This is filled automatically from |authtoken|.
767 766 :type apiuser: AuthUser
768 767 :param repoid: Sets the repository name or repository ID.
769 768 :type repoid: str or int
770 769 :param delete_keys: This deletes the invalidated keys instead of
771 770 just flagging them.
772 771 :type delete_keys: Optional(``True`` | ``False``)
773 772
774 773 Example output:
775 774
776 775 .. code-block:: bash
777 776
778 777 id : <id_given_in_input>
779 778 result : {
780 779 'msg': Cache for repository `<repository name>` was invalidated,
781 780 'repository': <repository name>
782 781 }
783 782 error : null
784 783
785 784 Example error output:
786 785
787 786 .. code-block:: bash
788 787
789 788 id : <id_given_in_input>
790 789 result : null
791 790 error : {
792 791 'Error occurred during cache invalidation action'
793 792 }
794 793
795 794
796 795 lock
797 796 ----
798 797
799 798 .. py:function:: lock(apiuser, repoid, locked=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
800 799
801 800 Sets the lock state of the specified |repo| by the given user.
802 801 From more information, see :ref:`repo-locking`.
803 802
804 803 * If the ``userid`` option is not set, the repository is locked to the
805 804 user who called the method.
806 805 * If the ``locked`` parameter is not set, the current lock state of the
807 806 repository is displayed.
808 807
809 808 This command can only be run using an |authtoken| with admin rights to
810 809 the specified repository.
811 810
812 811 This command takes the following options:
813 812
814 813 :param apiuser: This is filled automatically from the |authtoken|.
815 814 :type apiuser: AuthUser
816 815 :param repoid: Sets the repository name or repository ID.
817 816 :type repoid: str or int
818 817 :param locked: Sets the lock state.
819 818 :type locked: Optional(``True`` | ``False``)
820 819 :param userid: Set the repository lock to this user.
821 820 :type userid: Optional(str or int)
822 821
823 822 Example error output:
824 823
825 824 .. code-block:: bash
826 825
827 826 id : <id_given_in_input>
828 827 result : {
829 828 'repo': '<reponame>',
830 829 'locked': <bool: lock state>,
831 830 'locked_since': <int: lock timestamp>,
832 831 'locked_by': <username of person who made the lock>,
833 832 'lock_reason': <str: reason for locking>,
834 833 'lock_state_changed': <bool: True if lock state has been changed in this request>,
835 834 'msg': 'Repo `<reponame>` locked by `<username>` on <timestamp>.'
836 835 or
837 836 'msg': 'Repo `<repository name>` not locked.'
838 837 or
839 838 'msg': 'User `<user name>` set lock state for repo `<repository name>` to `<new lock state>`'
840 839 }
841 840 error : null
842 841
843 842 Example error output:
844 843
845 844 .. code-block:: bash
846 845
847 846 id : <id_given_in_input>
848 847 result : null
849 848 error : {
850 849 'Error occurred locking repository `<reponame>`'
851 850 }
852 851
853 852
854 853 maintenance
855 854 -----------
856 855
857 856 .. py:function:: maintenance(apiuser, repoid)
858 857
859 858 Triggers a maintenance on the given repository.
860 859
861 860 This command can only be run using an |authtoken| with admin
862 861 rights to the specified repository. For more information,
863 862 see :ref:`config-token-ref`.
864 863
865 864 This command takes the following options:
866 865
867 866 :param apiuser: This is filled automatically from the |authtoken|.
868 867 :type apiuser: AuthUser
869 868 :param repoid: The repository name or repository ID.
870 869 :type repoid: str or int
871 870
872 871 Example output:
873 872
874 873 .. code-block:: bash
875 874
876 875 id : <id_given_in_input>
877 876 result : {
878 877 "msg": "executed maintenance command",
879 878 "executed_actions": [
880 879 <action_message>, <action_message2>...
881 880 ],
882 881 "repository": "<repository name>"
883 882 }
884 883 error : null
885 884
886 885 Example error output:
887 886
888 887 .. code-block:: bash
889 888
890 889 id : <id_given_in_input>
891 890 result : null
892 891 error : {
893 892 "Unable to execute maintenance on `<reponame>`"
894 893 }
895 894
896 895
897 896 pull
898 897 ----
899 898
900 899 .. py:function:: pull(apiuser, repoid, remote_uri=<Optional:None>)
901 900
902 901 Triggers a pull on the given repository from a remote location. You
903 902 can use this to keep remote repositories up-to-date.
904 903
905 904 This command can only be run using an |authtoken| with admin
906 905 rights to the specified repository. For more information,
907 906 see :ref:`config-token-ref`.
908 907
909 908 This command takes the following options:
910 909
911 910 :param apiuser: This is filled automatically from the |authtoken|.
912 911 :type apiuser: AuthUser
913 912 :param repoid: The repository name or repository ID.
914 913 :type repoid: str or int
915 914 :param remote_uri: Optional remote URI to pass in for pull
916 915 :type remote_uri: str
917 916
918 917 Example output:
919 918
920 919 .. code-block:: bash
921 920
922 921 id : <id_given_in_input>
923 922 result : {
924 923 "msg": "Pulled from url `<remote_url>` on repo `<repository name>`"
925 924 "repository": "<repository name>"
926 925 }
927 926 error : null
928 927
929 928 Example error output:
930 929
931 930 .. code-block:: bash
932 931
933 932 id : <id_given_in_input>
934 933 result : null
935 934 error : {
936 935 "Unable to push changes from `<remote_url>`"
937 936 }
938 937
939 938
940 939 remove_field_from_repo
941 940 ----------------------
942 941
943 942 .. py:function:: remove_field_from_repo(apiuser, repoid, key)
944 943
945 944 Removes an extra field from a repository.
946 945
947 946 This command can only be run using an |authtoken| with at least
948 947 write permissions to the |repo|.
949 948
950 949 :param apiuser: This is filled automatically from the |authtoken|.
951 950 :type apiuser: AuthUser
952 951 :param repoid: Set the repository name or repository ID.
953 952 :type repoid: str or int
954 953 :param key: Set the unique field key for this repository.
955 954 :type key: str
956 955
957 956
958 957 revoke_user_group_permission
959 958 ----------------------------
960 959
961 960 .. py:function:: revoke_user_group_permission(apiuser, repoid, usergroupid)
962 961
963 962 Revoke the permissions of a user group on a given repository.
964 963
965 964 This command can only be run using an |authtoken| with admin
966 965 permissions on the |repo|.
967 966
968 967 :param apiuser: This is filled automatically from the |authtoken|.
969 968 :type apiuser: AuthUser
970 969 :param repoid: Set the repository name or repository ID.
971 970 :type repoid: str or int
972 971 :param usergroupid: Specify the user group ID.
973 972 :type usergroupid: str or int
974 973
975 974 Example output:
976 975
977 976 .. code-block:: bash
978 977
979 978 id : <id_given_in_input>
980 979 result: {
981 980 "msg" : "Revoked perm for group: `<usersgroupname>` in repo: `<reponame>`",
982 981 "success": true
983 982 }
984 983 error: null
985 984
986 985
987 986 revoke_user_permission
988 987 ----------------------
989 988
990 989 .. py:function:: revoke_user_permission(apiuser, repoid, userid)
991 990
992 991 Revoke permission for a user on the specified repository.
993 992
994 993 This command can only be run using an |authtoken| with admin
995 994 permissions on the |repo|.
996 995
997 996 :param apiuser: This is filled automatically from the |authtoken|.
998 997 :type apiuser: AuthUser
999 998 :param repoid: Set the repository name or repository ID.
1000 999 :type repoid: str or int
1001 1000 :param userid: Set the user name of revoked user.
1002 1001 :type userid: str or int
1003 1002
1004 1003 Example error output:
1005 1004
1006 1005 .. code-block:: bash
1007 1006
1008 1007 id : <id_given_in_input>
1009 1008 result: {
1010 1009 "msg" : "Revoked perm for user: `<username>` in repo: `<reponame>`",
1011 1010 "success": true
1012 1011 }
1013 1012 error: null
1014 1013
1015 1014
1016 1015 set_repo_settings
1017 1016 -----------------
1018 1017
1019 1018 .. py:function:: set_repo_settings(apiuser, repoid, settings)
1020 1019
1021 1020 Update repository settings. Returns true on success.
1022 1021
1023 1022 :param apiuser: This is filled automatically from the |authtoken|.
1024 1023 :type apiuser: AuthUser
1025 1024 :param repoid: The repository name or repository id.
1026 1025 :type repoid: str or int
1027 1026 :param settings: The new settings for the repository.
1028 1027 :type: settings: dict
1029 1028
1030 1029 Example output:
1031 1030
1032 1031 .. code-block:: bash
1033 1032
1034 1033 {
1035 1034 "error": null,
1036 1035 "id": 237,
1037 1036 "result": true
1038 1037 }
1039 1038
1040 1039
1041 1040 strip
1042 1041 -----
1043 1042
1044 1043 .. py:function:: strip(apiuser, repoid, revision, branch)
1045 1044
1046 1045 Strips the given revision from the specified repository.
1047 1046
1048 1047 * This will remove the revision and all of its decendants.
1049 1048
1050 1049 This command can only be run using an |authtoken| with admin rights to
1051 1050 the specified repository.
1052 1051
1053 1052 This command takes the following options:
1054 1053
1055 1054 :param apiuser: This is filled automatically from the |authtoken|.
1056 1055 :type apiuser: AuthUser
1057 1056 :param repoid: The repository name or repository ID.
1058 1057 :type repoid: str or int
1059 1058 :param revision: The revision you wish to strip.
1060 1059 :type revision: str
1061 1060 :param branch: The branch from which to strip the revision.
1062 1061 :type branch: str
1063 1062
1064 1063 Example output:
1065 1064
1066 1065 .. code-block:: bash
1067 1066
1068 1067 id : <id_given_in_input>
1069 1068 result : {
1070 1069 "msg": "'Stripped commit <commit_hash> from repo `<repository name>`'"
1071 1070 "repository": "<repository name>"
1072 1071 }
1073 1072 error : null
1074 1073
1075 1074 Example error output:
1076 1075
1077 1076 .. code-block:: bash
1078 1077
1079 1078 id : <id_given_in_input>
1080 1079 result : null
1081 1080 error : {
1082 1081 "Unable to strip commit <commit_hash> from repo `<repository name>`"
1083 1082 }
1084 1083
1085 1084
1086 1085 update_repo
1087 1086 -----------
1088 1087
1089 1088 .. 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:''>)
1090 1089
1091 1090 Updates a repository with the given information.
1092 1091
1093 1092 This command can only be run using an |authtoken| with at least
1094 1093 admin permissions to the |repo|.
1095 1094
1096 1095 * If the repository name contains "/", repository will be updated
1097 1096 accordingly with a repository group or nested repository groups
1098 1097
1099 1098 For example repoid=repo-test name="foo/bar/repo-test" will update |repo|
1100 1099 called "repo-test" and place it inside group "foo/bar".
1101 1100 You have to have permissions to access and write to the last repository
1102 1101 group ("bar" in this example)
1103 1102
1104 1103 :param apiuser: This is filled automatically from the |authtoken|.
1105 1104 :type apiuser: AuthUser
1106 1105 :param repoid: repository name or repository ID.
1107 1106 :type repoid: str or int
1108 1107 :param repo_name: Update the |repo| name, including the
1109 1108 repository group it's in.
1110 1109 :type repo_name: str
1111 1110 :param owner: Set the |repo| owner.
1112 1111 :type owner: str
1113 1112 :param fork_of: Set the |repo| as fork of another |repo|.
1114 1113 :type fork_of: str
1115 1114 :param description: Update the |repo| description.
1116 1115 :type description: str
1117 1116 :param private: Set the |repo| as private. (True | False)
1118 1117 :type private: bool
1119 1118 :param clone_uri: Update the |repo| clone URI.
1120 1119 :type clone_uri: str
1121 1120 :param landing_rev: Set the |repo| landing revision. Default is ``rev:tip``.
1122 1121 :type landing_rev: str
1123 1122 :param enable_statistics: Enable statistics on the |repo|, (True | False).
1124 1123 :type enable_statistics: bool
1125 1124 :param enable_locking: Enable |repo| locking.
1126 1125 :type enable_locking: bool
1127 1126 :param enable_downloads: Enable downloads from the |repo|, (True | False).
1128 1127 :type enable_downloads: bool
1129 1128 :param fields: Add extra fields to the |repo|. Use the following
1130 1129 example format: ``field_key=field_val,field_key2=fieldval2``.
1131 1130 Escape ', ' with \,
1132 1131 :type fields: str
1133 1132
1134 1133
@@ -1,88 +1,88 b''
1 1 .. _auth-saml-bulk-enroll-users-ref:
2 2
3 3
4 4 Bulk enroll multiple existing users
5 5 -----------------------------------
6 6
7 7
8 8 RhodeCode Supports standard SAML 2.0 SSO for the web-application part.
9 9 Below is an example how to enroll list of all or some users to use SAML authentication.
10 10 This method simply enables SAML authentication for many users at once.
11 11
12 12
13 13 From the server RhodeCode Enterprise is running run ishell on the instance which we
14 14 want to apply the SAML migration::
15 15
16 16 rccontrol ishell enterprise-1
17 17
18 18 Follow these steps to enable SAML authentication for multiple users.
19 19
20 20
21 21 1) Create a user_id => attribute mapping
22 22
23 23
24 24 `saml2user` is a mapping of external ID from SAML provider such as OneLogin, DuoSecurity, Google.
25 25 This mapping consists of local rhodecode user_id mapped to set of required attributes needed to bind SAML
26 26 account to internal rhodecode user.
27 27 For example, 123 is local rhodecode user_id, and '48253211' is OneLogin ID.
28 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 29 The most important this id needs to be unique for each user.
30 30
31 31 .. code-block:: python
32 32
33 33 In [1]: saml2user = {
34 34 ...: # OneLogin, uses externalID available to read from in the UI
35 ...: 123: {'id: '48253211'},
35 ...: 123: {'id': '48253211'},
36 36 ...: # for Google/DuoSecurity email is also an option for unique ID
37 ...: 124: {'id: 'email@domain.com'},
37 ...: 124: {'id': 'email@domain.com'},
38 38 ...: }
39 39
40 40
41 41 2) Import the plugin you want to run migration for.
42 42
43 43 From available options pick only one and run the `import` statement
44 44
45 45 .. code-block:: python
46 46
47 47 # for Duo Security
48 48 In [2]: from rc_auth_plugins.auth_duo_security import RhodeCodeAuthPlugin
49 49 # for OneLogin
50 50 In [2]: from rc_auth_plugins.auth_onelogin import RhodeCodeAuthPlugin
51 51 # generic SAML plugin
52 52 In [2]: from rc_auth_plugins.auth_saml import RhodeCodeAuthPlugin
53 53
54 54 3) Run the migration based on saml2user mapping.
55 55
56 56 Enter in the ishell prompt
57 57
58 58 .. code-block:: python
59 59
60 60 In [3]: for user in User.get_all():
61 61 ...: existing_identity = ExternalIdentity().query().filter(ExternalIdentity.local_user_id == user.user_id).scalar()
62 62 ...: attrs = saml2user.get(user.user_id)
63 63 ...: provider = RhodeCodeAuthPlugin.uid
64 64 ...: if existing_identity:
65 65 ...: print('Identity for user `{}` already exists, skipping'.format(user.username))
66 66 ...: continue
67 67 ...: if attrs:
68 68 ...: external_id = attrs['id']
69 69 ...: new_external_identity = ExternalIdentity()
70 70 ...: new_external_identity.external_id = external_id
71 71 ...: new_external_identity.external_username = '{}-saml-{}'.format(user.username, user.user_id)
72 72 ...: new_external_identity.provider_name = provider
73 ...: new_external_identity.local_user_id = user_id
73 ...: new_external_identity.local_user_id = user.user_id
74 74 ...: new_external_identity.access_token = ''
75 75 ...: new_external_identity.token_secret = ''
76 76 ...: new_external_identity.alt_token = ''
77 77 ...: Session().add(ex_identity)
78 78 ...: Session().commit()
79 79 ...: print('Set user `{}` external identity bound to ExternalID:{}'.format(user.username, external_id))
80 80
81 81 .. note::
82 82
83 83 saml2user can be really big and hard to maintain in ishell. It's also possible
84 84 to load it as a JSON file prepared before and stored on disk. To do so run::
85 85
86 86 import json
87 87 saml2user = json.loads(open('/path/to/saml2user.json','rb').read())
88 88
@@ -1,87 +1,87 b''
1 1 |RCE|
2 2 =====
3 3
4 4 |RCE| is a high-performance source code management and collaboration system.
5 5 It enables you to develop projects securely behind the firewall while
6 6 providing collaboration tools that work with |git|, |hg|,
7 7 and |svn| |repos|. The user interface allows you to create, edit,
8 8 and commit files and |repos| while managing their security permissions.
9 9
10 10 |RCE| provides the following features:
11 11
12 12 * Source code management.
13 13 * Extended permissions management.
14 14 * Integrated code collaboration tools.
15 15 * Integrated code review and notifications.
16 16 * Scalability provided by multi-node setup.
17 17 * Fully programmable automation API.
18 18 * Web-based hook management.
19 19 * Native |svn| support.
20 20 * Migration from existing databases.
21 21 * |RCE| SDK.
22 22 * Built-in analytics
23 23 * Built in integrations including: Slack, Webhooks (used for Jenkins/TeamCity and other CIs), Jira, Redmine, Hipchat
24 24 * Pluggable authentication system.
25 25 * Support for AD, |LDAP|, Crowd, CAS, PAM.
26 26 * Support for external authentication via Oauth Google, Github, Bitbucket, Twitter.
27 27 * Debug modes of operation.
28 28 * Private and public gists.
29 29 * Gists with limited lifetimes and within instance only sharing.
30 30 * Fully integrated code search function.
31 31 * Always on SSL connectivity.
32 32
33 33 .. only:: html
34 34
35 35 Table of Contents
36 36 -----------------
37 37
38 38 .. toctree::
39 39 :maxdepth: 1
40 40 :caption: Admin Documentation
41 41
42 42 install/quick-start
43 43 install/install-database
44 44 install/install-steps
45 45 admin/system-overview
46 46 nix/default-env
47 47 admin/system-admin
48 48 admin/user-admin
49 admin/setting-repo-perms
49 admin/repo-admin
50 50 admin/security-tips
51 51 auth/auth
52 52 issue-trackers/issue-trackers
53 53 admin/lab-settings
54 54
55 55 .. toctree::
56 56 :maxdepth: 1
57 57 :caption: Feature Documentation
58 58
59 59 collaboration/collaboration
60 60 collaboration/review-notifications
61 61 collaboration/pull-requests
62 62 code-review/code-review
63 63 integrations/integrations
64 64
65 65 .. toctree::
66 66 :maxdepth: 1
67 :caption: User Documentation
68
69 usage/basic-usage
70 tutorials/tutorials
71
72 .. toctree::
73 :maxdepth: 1
67 74 :caption: Developer Documentation
68 75
69 76 api/api
70 77 tools/rhodecode-tools
71 78 extensions/extensions-hooks
72 79 contributing/contributing
73 80
74 81 .. toctree::
75 82 :maxdepth: 1
76 :caption: User Documentation
77
78 usage/basic-usage
79 tutorials/tutorials
80
81 .. toctree::
82 :maxdepth: 1
83 83 :caption: About
84 84
85 85 known-issues/known-issues
86 86 release-notes/release-notes
87 87 admin/glossary
@@ -1,131 +1,132 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.17.0.rst
12 13 release-notes-4.16.2.rst
13 14 release-notes-4.16.1.rst
14 15 release-notes-4.16.0.rst
15 16 release-notes-4.15.2.rst
16 17 release-notes-4.15.1.rst
17 18 release-notes-4.15.0.rst
18 19 release-notes-4.14.1.rst
19 20 release-notes-4.14.0.rst
20 21 release-notes-4.13.3.rst
21 22 release-notes-4.13.2.rst
22 23 release-notes-4.13.1.rst
23 24 release-notes-4.13.0.rst
24 25 release-notes-4.12.4.rst
25 26 release-notes-4.12.3.rst
26 27 release-notes-4.12.2.rst
27 28 release-notes-4.12.1.rst
28 29 release-notes-4.12.0.rst
29 30 release-notes-4.11.6.rst
30 31 release-notes-4.11.5.rst
31 32 release-notes-4.11.4.rst
32 33 release-notes-4.11.3.rst
33 34 release-notes-4.11.2.rst
34 35 release-notes-4.11.1.rst
35 36 release-notes-4.11.0.rst
36 37 release-notes-4.10.6.rst
37 38 release-notes-4.10.5.rst
38 39 release-notes-4.10.4.rst
39 40 release-notes-4.10.3.rst
40 41 release-notes-4.10.2.rst
41 42 release-notes-4.10.1.rst
42 43 release-notes-4.10.0.rst
43 44 release-notes-4.9.1.rst
44 45 release-notes-4.9.0.rst
45 46 release-notes-4.8.0.rst
46 47 release-notes-4.7.2.rst
47 48 release-notes-4.7.1.rst
48 49 release-notes-4.7.0.rst
49 50 release-notes-4.6.1.rst
50 51 release-notes-4.6.0.rst
51 52 release-notes-4.5.2.rst
52 53 release-notes-4.5.1.rst
53 54 release-notes-4.5.0.rst
54 55 release-notes-4.4.2.rst
55 56 release-notes-4.4.1.rst
56 57 release-notes-4.4.0.rst
57 58 release-notes-4.3.1.rst
58 59 release-notes-4.3.0.rst
59 60 release-notes-4.2.1.rst
60 61 release-notes-4.2.0.rst
61 62 release-notes-4.1.2.rst
62 63 release-notes-4.1.1.rst
63 64 release-notes-4.1.0.rst
64 65 release-notes-4.0.1.rst
65 66 release-notes-4.0.0.rst
66 67
67 68 |RCE| 3.x Versions
68 69 ------------------
69 70
70 71 .. toctree::
71 72 :maxdepth: 1
72 73
73 74 release-notes-3.8.4.rst
74 75 release-notes-3.8.3.rst
75 76 release-notes-3.8.2.rst
76 77 release-notes-3.8.1.rst
77 78 release-notes-3.8.0.rst
78 79 release-notes-3.7.1.rst
79 80 release-notes-3.7.0.rst
80 81 release-notes-3.6.1.rst
81 82 release-notes-3.6.0.rst
82 83 release-notes-3.5.2.rst
83 84 release-notes-3.5.1.rst
84 85 release-notes-3.5.0.rst
85 86 release-notes-3.4.1.rst
86 87 release-notes-3.4.0.rst
87 88 release-notes-3.3.4.rst
88 89 release-notes-3.3.3.rst
89 90 release-notes-3.3.2.rst
90 91 release-notes-3.3.1.rst
91 92 release-notes-3.3.0.rst
92 93 release-notes-3.2.3.rst
93 94 release-notes-3.2.2.rst
94 95 release-notes-3.2.1.rst
95 96 release-notes-3.2.0.rst
96 97 release-notes-3.1.1.rst
97 98 release-notes-3.1.0.rst
98 99 release-notes-3.0.2.rst
99 100 release-notes-3.0.1.rst
100 101 release-notes-3.0.0.rst
101 102
102 103 |RCE| 2.x Versions
103 104 ------------------
104 105
105 106 .. toctree::
106 107 :maxdepth: 1
107 108
108 109 release-notes-2.2.8.rst
109 110 release-notes-2.2.7.rst
110 111 release-notes-2.2.6.rst
111 112 release-notes-2.2.5.rst
112 113 release-notes-2.2.4.rst
113 114 release-notes-2.2.3.rst
114 115 release-notes-2.2.2.rst
115 116 release-notes-2.2.1.rst
116 117 release-notes-2.2.0.rst
117 118 release-notes-2.1.0.rst
118 119 release-notes-2.0.2.rst
119 120 release-notes-2.0.1.rst
120 121 release-notes-2.0.0.rst
121 122
122 123 |RCE| 1.x Versions
123 124 ------------------
124 125
125 126 .. toctree::
126 127 :maxdepth: 1
127 128
128 129 release-notes-1.7.2.rst
129 130 release-notes-1.7.1.rst
130 131 release-notes-1.7.0.rst
131 132 release-notes-1.6.0.rst
@@ -1,174 +1,177 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 "<%= dirs.js.node_modules %>/dropzone/dist/dropzone.js",
38 39 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js",
39 40 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js",
40 41 "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js",
41 42 "<%= dirs.js.node_modules %>/waypoints/lib/jquery.waypoints.min.js",
42 43 "<%= dirs.js.node_modules %>/appenlight-client/appenlight-client.min.js",
43 44 "<%= dirs.js.src %>/logging.js",
44 45 "<%= dirs.js.src %>/bootstrap.js",
45 46 "<%= dirs.js.src %>/i18n_utils.js",
46 47 "<%= dirs.js.src %>/deform.js",
47 48 "<%= dirs.js.src %>/ejs.js",
48 49 "<%= dirs.js.src %>/ejs_templates/utils.js",
49 50 "<%= dirs.js.src %>/plugins/jquery.pjax.js",
50 51 "<%= dirs.js.src %>/plugins/jquery.dataTables.js",
51 52 "<%= dirs.js.src %>/plugins/flavoured_checkbox.js",
52 53 "<%= dirs.js.src %>/plugins/jquery.auto-grow-input.js",
53 54 "<%= dirs.js.src %>/plugins/jquery.autocomplete.js",
54 55 "<%= dirs.js.src %>/plugins/jquery.debounce.js",
55 56 "<%= dirs.js.node_modules %>/mark.js/dist/jquery.mark.min.js",
56 57 "<%= dirs.js.src %>/plugins/jquery.timeago.js",
57 58 "<%= dirs.js.src %>/plugins/jquery.timeago-extension.js",
58 59 "<%= dirs.js.src %>/select2/select2.js",
59 60 "<%= dirs.js.src %>/codemirror/codemirror.js",
60 61 "<%= dirs.js.src %>/codemirror/codemirror_loadmode.js",
61 62 "<%= dirs.js.src %>/codemirror/codemirror_hint.js",
62 63 "<%= dirs.js.src %>/codemirror/codemirror_overlay.js",
63 64 "<%= dirs.js.src %>/codemirror/codemirror_placeholder.js",
64 65 "<%= dirs.js.src %>/codemirror/codemirror_simplemode.js",
65 66 "<%= dirs.js.dest %>/mode/meta.js",
66 67 "<%= dirs.js.dest %>/mode/meta_ext.js",
67 68 "<%= dirs.js.src_rc %>/i18n/select2/translations.js",
68 69 "<%= dirs.js.src %>/rhodecode/utils/array.js",
69 70 "<%= dirs.js.src %>/rhodecode/utils/string.js",
70 71 "<%= dirs.js.src %>/rhodecode/utils/pyroutes.js",
71 72 "<%= dirs.js.src %>/rhodecode/utils/ajax.js",
72 73 "<%= dirs.js.src %>/rhodecode/utils/autocomplete.js",
73 74 "<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js",
74 75 "<%= dirs.js.src %>/rhodecode/utils/ie.js",
75 76 "<%= dirs.js.src %>/rhodecode/utils/os.js",
76 77 "<%= dirs.js.src %>/rhodecode/utils/topics.js",
77 78 "<%= dirs.js.src %>/rhodecode/init.js",
78 79 "<%= dirs.js.src %>/rhodecode/changelog.js",
79 80 "<%= dirs.js.src %>/rhodecode/codemirror.js",
80 81 "<%= dirs.js.src %>/rhodecode/comments.js",
81 82 "<%= dirs.js.src %>/rhodecode/constants.js",
82 83 "<%= dirs.js.src %>/rhodecode/files.js",
83 84 "<%= dirs.js.src %>/rhodecode/followers.js",
84 85 "<%= dirs.js.src %>/rhodecode/menus.js",
85 86 "<%= dirs.js.src %>/rhodecode/notifications.js",
86 87 "<%= dirs.js.src %>/rhodecode/permissions.js",
87 88 "<%= dirs.js.src %>/rhodecode/pjax.js",
88 89 "<%= dirs.js.src %>/rhodecode/pullrequests.js",
89 90 "<%= dirs.js.src %>/rhodecode/settings.js",
90 91 "<%= dirs.js.src %>/rhodecode/select2_widgets.js",
91 92 "<%= dirs.js.src %>/rhodecode/tooltips.js",
92 93 "<%= dirs.js.src %>/rhodecode/users.js",
93 94 "<%= dirs.js.src %>/rhodecode/appenlight.js",
94 95 "<%= dirs.js.src %>/rhodecode.js",
95 96 "<%= dirs.js.dest %>/rhodecode-components.js"
96 97 ],
97 98 "dest": "<%= dirs.js.dest %>/scripts.js",
98 99 "nonull": true
99 100 }
100 101 },
101 102 "less": {
102 103 "development": {
103 104 "options": {
104 105 "compress": false,
105 106 "yuicompress": false,
106 107 "optimization": 0
107 108 },
108 109 "files": {
109 110 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
110 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less"
111 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less",
112 "<%= dirs.css.dest %>/style-ipython.css": "<%= dirs.css.src %>/ipython.less"
111 113 }
112 114 },
113 115 "production": {
114 116 "options": {
115 117 "compress": true,
116 118 "yuicompress": true,
117 119 "optimization": 2
118 120 },
119 121 "files": {
120 122 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
121 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less"
123 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less",
124 "<%= dirs.css.dest %>/style-ipython.css": "<%= dirs.css.src %>/ipython.less"
122 125 }
123 126 },
124 127 "components": {
125 128 "files": [
126 129 {
127 130 "cwd": "<%= dirs.js.src %>/components/",
128 131 "dest": "<%= dirs.js.src %>/components/",
129 132 "src": [
130 133 "**/*.less"
131 134 ],
132 135 "expand": true,
133 136 "ext": ".css"
134 137 }
135 138 ]
136 139 }
137 140 },
138 141 "watch": {
139 142 "less": {
140 143 "files": [
141 144 "<%= dirs.css.src %>/**/*.less",
142 145 "<%= dirs.js.src %>/components/**/*.less"
143 146 ],
144 147 "tasks": [
145 148 "less:development",
146 149 "less:components",
147 150 "concat:polymercss",
148 151 "webpack",
149 152 "concat:dist"
150 153 ]
151 154 },
152 155 "js": {
153 156 "files": [
154 157 "!<%= dirs.js.src %>/components/root-styles.gen.html",
155 158 "<%= dirs.js.src %>/**/*.js",
156 159 "<%= dirs.js.src %>/components/**/*.html"
157 160 ],
158 161 "tasks": [
159 162 "less:components",
160 163 "concat:polymercss",
161 164 "webpack",
162 165 "concat:dist"
163 166 ]
164 167 }
165 168 },
166 169 "jshint": {
167 170 "rhodecode": {
168 171 "src": "<%= dirs.js.src %>/rhodecode/**/*.js",
169 172 "options": {
170 173 "jshintrc": ".jshintrc"
171 174 }
172 175 }
173 176 }
174 177 }
@@ -1,59 +1,60 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 "dropzone": "^5.5.0",
16 17 "grunt": "^0.4.5",
17 18 "grunt-cli": "^1.3.1",
18 19 "grunt-contrib-concat": "^0.5.1",
19 20 "grunt-contrib-copy": "^1.0.0",
20 21 "grunt-contrib-jshint": "^0.12.0",
21 22 "grunt-contrib-less": "^1.1.0",
22 23 "grunt-contrib-watch": "^0.6.1",
23 24 "grunt-webpack": "^3.1.3",
24 25 "jquery": "1.11.3",
25 26 "mark.js": "8.11.1",
26 27 "jshint": "^2.9.1-rc3",
27 28 "moment": "^2.18.1",
28 29 "mousetrap": "^1.6.1",
29 30 "qrious": "^4.0.2",
30 31 "sticky-sidebar": "3.3.1",
31 32 "waypoints": "4.0.1",
32 33 "webpack": "4.23.1",
33 34 "webpack-cli": "3.1.2",
34 35 "babel-core": "^6.26.3",
35 36 "babel-loader": "^7.1.2",
36 37 "babel-plugin-transform-object-rest-spread": "^6.26.0",
37 38 "babel-preset-env": "^1.6.0",
38 39 "copy-webpack-plugin": "^4.4.2",
39 40 "css-loader": "^0.28.11",
40 41 "html-loader": "^0.4.4",
41 42 "html-webpack-plugin": "^3.2.0",
42 43 "imports-loader": "^0.7.1",
43 44 "polymer-webpack-loader": "^2.0.1",
44 45 "style-loader": "^0.21.0",
45 46 "webpack-uglify-js-plugin": "^1.1.9",
46 47 "raw-loader": "1.0.0-beta.0",
47 48 "ts-loader": "^1.3.3",
48 49 "@webcomponents/webcomponentsjs": "^2.0.0",
49 50 "@polymer/polymer": "^3.0.0",
50 51 "@polymer/paper-button": "^3.0.0",
51 52 "@polymer/paper-spinner": "^3.0.0",
52 53 "@polymer/paper-tooltip": "^3.0.0",
53 54 "@polymer/paper-toast": "^3.0.0",
54 55 "@polymer/paper-toggle-button": "^3.0.0",
55 56 "@polymer/iron-ajax": "^3.0.0",
56 57 "@polymer/iron-autogrow-textarea": "^3.0.0",
57 58 "@polymer/iron-a11y-keys": "^3.0.0"
58 59 }
59 60 }
@@ -1,3 +1,3 b''
1 1 [pip2nix]
2 requirements = ., -r ./requirements.txt
2 requirements = ., -r ./requirements.txt, -r ./requirements_pinned.txt
3 3 output = ./pkgs/python-packages.nix
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: file renamed from rhodecode/public/images/rhodecode-logo-white-216x60.png to rhodecode/public/images/rhodecode-logo-white-60x60.png, binary diff hidden
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full 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/templates/changelog/changelog.mako to rhodecode/templates/commits/changelog.mako
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/templates/changelog/changelog_elements.mako to rhodecode/templates/commits/changelog_elements.mako
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/templates/changelog/changelog_file_history.mako to rhodecode/templates/commits/changelog_file_history.mako
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full 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/templates/files/files_detail.mako to rhodecode/templates/files/files_source_header.mako
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/templates/files/file_tree_detail.mako to rhodecode/templates/files/files_tree_header.mako
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full 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, binary diff hidden
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