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

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

@@ -0,0 +1,26 b''
1 .. _adjust-rhodecode-mem:
2
3 RhodeCode Memory Usage
4 ----------------------
5
6 Starting from Version 4.18.X RhodeCode has a builtin memory monitor for gunicorn workers.
7 Enabling this can limit the maximum amount of memory system can use. Each worker
8 for RhodeCode is monitored independently.
9 To enable Memory management make sure to have following settings inside `[app:main] section` of
10 :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
11
12
13
14 ; Maximum memory usage that each worker can use before it will receive a
15 ; graceful restart signal 0 = memory monitoring is disabled
16 ; Examples: 268435456 (256MB), 536870912 (512MB)
17 ; 1073741824 (1GB), 2147483648 (2GB), 4294967296 (4GB)
18 memory_max_usage = 1073741824
19
20 ; How often in seconds to check for memory usage for each gunicorn worker
21 memory_usage_check_interval = 60
22
23 ; Threshold value for which we don't recycle worker if GarbageCollection
24 ; frees up enough resources. Before each restart we try to run GC on worker
25 ; in case we get enough free memory after that, restart will not happen.
26 memory_usage_recovery_threshold = 0.8
@@ -0,0 +1,230 b''
1 |RCE| 4.18.0 |RNS|
2 ------------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2020-01-05
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13 - Artifacts: are no longer in BETA. New info page is available for uploaded artifacts
14 which exposes some useful information like sha256, various access urls etc, and also
15 allows deletion of artifacts, and updating their description.
16 - Artifacts: support new download url based on access to artifacts using new auth-token types.
17 - Artifacts: added ability to store artifacts using API, and internal cli upload.
18 This allows uploading of artifacts that can have 100s of GBs in size efficiently.
19 - Artifacts: added metadata logic to store various extra custom data for artifacts.
20 - Comments: added support for adding comment attachments using the artifacts logic.
21 Logged in users can now pick or drag and drop attachments into comment forms.
22 - Comments: enable linkification of certain patterns on comments in repo/pull request scopes.
23 This will render now active links to commits, pull-requests mentioned in comments body.
24 - Jira: new update integration plugin.
25 Plugin now fetches possible transitions from tickets and show them to users in the interface.
26 Allow sending extra attributes during a transition like `resolution` message.
27 - Navigation: Added new consistent and contextual way of creating new objects
28 likes gists, repositories, and repository groups using dedicated action (with a `+` sign)
29 available in the top navigation.
30 - Hovercards: added new tooltips and hovercards to expose certain information for objects shown in UI.
31 RhodeCode usernames, issues, pull-requests will have active hovercard logic that will
32 load extra information about them and exposing them to users.
33 - Files: all readme files found in repository file browser will be now rendered, allowing having readme per directory.
34 - Search: expose line counts in search files information.
35 - Audit-logs: expose download user audit logs as JSON file.
36 - Users: added description field for users.
37 Allows users to write a short BIO, or description of their role in the organization.
38 - Users: allow super-admins to change bound authentication type for users.
39 E.g internal rhodecode accounts can be changed to ldap easily from user settings page.
40 - Pull requests: simplified the UI for display view, hide less important information and expose the most important ones.
41 - Pull requests: add merge check that detects WIP marker in title.
42 Usually WIP in title means unfinished task that needs still some work, such marker will prevent accidental merges.
43 - Pull requests: TODO comments have now a dedicated box below reviewers to keep track
44 of important TODOs that still need attention before review process is finalized.
45 - Pull requests: participants of pull request will receive an email about update of a
46 pull requests with a small summary of changes made.
47 - Pull requests: change the naming from #NUM into !NUM.
48 !NUM format is now parsed and linkified in comments and commit messages.
49 - Pull requests: pull requests which state is changing can now be viewed with a limited view.
50 - Pull requests: re-organize merge/close buttons and merge checks according to the new UI.
51 - Pull requests: update commits button allows a force-refresh update now using dropdown option.
52 - Pull requests: added quick filter to grid view to filter/search pull requests in a repository.
53 - Pull requests: closing a pull-request without a merge requires additional confirmation now.
54 - Pull requests: merge checks will now show which files caused conflicts and are blocking the merge.
55 - Emails: updated all generated emails design and cleanup the data fields they expose.
56 a) More consistent UI for all types of emails. b) Improved formatting of plaintext emails
57 c) Added reply link to comment type emails for quicker response action.
58
59
60 General
61 ^^^^^^^
62
63 - Artifacts: don't show hidden artifacts, allow showing them via a GET ?hidden=1 flag.
64 Hidden artifacts are for example comment attachments.
65 - UI: new commits page, according to the new design, which started on 4.17.X release lines
66 - UI: use explicit named actions like "create user" instead of generic "save" which is bad UX.
67 - UI: fixed problems with generating last change in repository groups.
68 There's now a new logic that checks all objects inside group for latest update time.
69 - API: add artifact `get_info`, and `store_metadata` methods.
70 - API: allowed to specify extra recipients for pr/commit comments api methods.
71 - Vcsserver: set file based cache as default for vcsserver which can be shared
72 across multiple workers saving memory usage.
73 - Vcsserver: added redis as possible cache backend for even greater performance.
74 - Dependencies: bumped GIT version to 2.23.0
75 - Dependencies: bumped SVN version to 1.12.2
76 - Dependencies: bumped Mercurial version to 5.1.1 and hg-evolve to 9.1.0
77 - Search: added logic for sorting ElasticSearch6 backend search results.
78 - User bookmarks: make it easier to re-organize existing entries.
79 - Data grids: hide pagination for single pages in grids.
80 - Gists: UX, removed private/public gist buttons and replaced them with radio group.
81 - Gunicorn: moved all configuration of gunicorn workers to .ini files.
82 - Gunicorn: added worker memory management allowing setting maximum per-worker memory usage.
83 - Automation: moved update groups task into celery task
84 - Cache commits: add option to refresh caches manually from advanced pages.
85 - Pull requests: add indication of state change in list of pull-requests and actually show them in the list.
86 - Cache keys: register and self cleanup cache keys used for invalidation to prevent leaking lot of them into DB on worker recycle
87 - Repo groups: removed locking inheritance flag from repo-groups. We'll deprecate this soon and this only brings in confusion
88 - System snapshot: improved formatting for better readability
89 - System info: expose data about vcsserver.
90 - Packages: updated celery to 4.3.0 and switch default backend to redis instead of RabbitMQ.
91 Redis is stable enough and easier to install. Having Redis simplifies the stack as it's used in other parts of RhodeCode.
92 - Dependencies: bumped alembic to 1.2.1
93 - Dependencies: bumped amqp==2.5.2 and kombu==4.6.6
94 - Dependencies: bumped atomicwrites==1.3.0
95 - Dependencies: bumped cffi==1.12.3
96 - Dependencies: bumped configparser==4.0.2
97 - Dependencies: bumped deform==2.0.8
98 - Dependencies: bumped dogpile.cache==0.9.0
99 - Dependencies: bumped hupper==1.8.1
100 - Dependencies: bumped mako to 1.1.0
101 - Dependencies: bumped markupsafe to 1.1.1
102 - Dependencies: bumped packaging==19.2
103 - Dependencies: bumped paste==3.2.1
104 - Dependencies: bumped pastescript==3.2.0
105 - Dependencies: bumped pathlib2 to 2.3.4
106 - Dependencies: bumped pluggy==0.13.0
107 - Dependencies: bumped psutil to 5.6.3
108 - Dependencies: bumped psutil==5.6.5
109 - Dependencies: bumped psycopg2==2.8.4
110 - Dependencies: bumped pycurl to 7.43.0.3
111 - Dependencies: bumped pyotp==2.3.0
112 - Dependencies: bumped pyparsing to 2.4.2
113 - Dependencies: bumped pyramid-debugtoolbar==4.5.1
114 - Dependencies: bumped pyramid-mako to 1.1.0
115 - Dependencies: bumped redis to 3.3.8
116 - Dependencies: bumped sqlalchemy to 1.3.8
117 - Dependencies: bumped sqlalchemy==1.3.11
118 - Dependencies: bumped test libraries.
119 - Dependencies: freeze alembic==1.3.1
120 - Dependencies: freeze python-dateutil
121 - Dependencies: freeze redis==3.3.11
122 - Dependencies: freeze supervisor==4.1.0
123
124
125 Security
126 ^^^^^^^^
127
128 - Security: fixed issues with exposing wrong http status (403) indicating repository with
129 given name exists and we don't have permissions to it. This was exposed in the redirection
130 logic of the global pull-request page. In case of redirection we also exposed
131 repository name in the URL.
132
133
134 Performance
135 ^^^^^^^^^^^
136
137 - Core: many various small improvements and optimizations to make rhodecode faster then before.
138 - VCSServer: new cache implementation for remote functions.
139 Single worker shared caches that can use redis/file-cache.
140 This greatly improves performance on larger instances, and doesn't trigger cache
141 re-calculation on worker restarts.
142 - GIT: switched internal git operations from Dulwich to libgit2 in order to obtain better performance and scalability.
143 - SSH: skip loading unneeded application parts for SSH to make execution of ssh commands faster.
144 - Main page: main page will now load repositories and repositories groups using partial DB calls instead of big JSON files.
145 In case of many repositories in root this could lead to very slow page rendering.
146 - Admin pages: made all grids use same DB based partial loading logic. We'll no longer fetch
147 all objects into JSON for display purposes. This significantly improves speed of those pages in case
148 of many objects shown in them.
149 - Summary page: use non-memory cache for readme, and cleanup cache for repo stats.
150 This change won't re-cache after worker restarts and can be shared across all workers
151 - Files: only check for git_lfs/hg_largefiles if they are enabled.
152 This speeds up fetching of files if they are not LF and very big.
153 - Vcsserver: added support for streaming data from the remote methods. This allows
154 to stream very large files without taking up memory, mostly for usage in SVN when
155 downloading large binaries from vcs system.
156 - Files: added streaming remote attributes for vcsserver.
157 This change enables streaming raw content or raw downloads of large files without
158 transferring them over to enterprise for pack & repack using msgpack.
159 Msgpack has a limit of 2gb and generally pack+repack for ~2gb is very slow.
160 - Files: ensure over size limit files never do any content fetching when viewing such files.
161 - VCSServer: skip host verification to speed up pycurl calls.
162 - User-bookmarks: cache fetching of bookmarks since this is quite expensive query to
163 make with joinedload on repos/repo groups.
164 - Goto-switcher: reduce query data to only required attributes for speedups.
165 - My account: owner/watched repos are now loaded only using DB queries.
166
167
168 Fixes
169 ^^^^^
170
171 - Mercurial: move imports from top-level to prevent from loading mercurial code on hook execution for svn/git.
172 - GIT: limit sync-fetch logic to only retrieve tags/ and heads/ with default execution arguments.
173 - GIT: fixed issue with git submodules detection.
174 - SVN: fix checkout url for ssh+svn backend not having special prefix resulting in incorrect command shown.
175 - SVN: fixed problem with showing empty directories.
176 - OAuth: use a vendored version of `authomatic` library, and switch Bitbucket authentication to use oauth2.
177 - Diffs: handle paths with quotes in diffs.
178 - Diffs: fixed outdated files in pull-requests re-using the filediff raw_id for anchor generation. Fixes #5567
179 - Diffs: toggle race condition on sticky vs wide-diff-mode that caused some display problems on larger diffs.
180 - Pull requests: handle exceptions in state change and improve logging.
181 - Pull requests: fixed title/description generation for single commits which are numbers.
182 - Pull requests: changed the source of changes to be using shadow repos if it exists.
183 In case of `git push -f` and rebase we lost commits in the repo resulting in
184 problems of displaying versions of pull-requests.
185 - Pull requests: handle case when removing existing files from a repository in compare versions diff.
186 - Files: don't expose copy content helper in case of binary files.
187 - Registration: properly expose first_name/last_name into email on user registration.
188 - Markup renderers: fixed broken code highlight for rst files.
189 - Ui: make super admin be named consistently across ui.
190 - Audit logs: fixed search cases with special chars such as `-`.
191
192
193 Upgrade notes
194 ^^^^^^^^^^^^^
195
196 - New Automation task. We've changed the logic for updating latest change inside repository group.
197 New logic includes scanning for changes in all nested objects. Since this is a heavy task
198 a new dedicated scheduler task has been created to update it automatically on a scheduled base.
199 Please review in `admin > settings > automation` to enable this task.
200
201 - New safer encryption algorithm. Some setting values are encrypted before storing it inside the database.
202 To keep full backward compatibility old AES algorithm is used.
203 If you wish to enable a safer option set fernet encryption instead inside rhodecode.ini
204 `rhodecode.encrypted_values.algorithm = fernet`
205
206 - Pull requests UI changes. We've simplified the UI on pull requests page.
207 Please review the new UI to prevent surprises. All actions from old UI should be still possible with the new one.
208
209 - Redis is now a default recommended backend for Celery and replaces previous rabbitmq.
210 Redis is generally easier to manage and install, and it's also very stable for usage
211 in the scheduler/celery async tasks. Since we also recommend Redis for caches the application
212 stack can be simplified by removing rabbitmq and replacing it with single Redis instance.
213
214 - Recommendation for using Redis as the new cache backend on vcsserver.
215 Since Version 4.18.0 VCSServer has a new cache implementation for VCS data.
216 By default, for simplicity the cache type is file based. We strongly recommend using
217 Redis instead for better Performance and scalability
218 Please review vcsserver.ini settings under:
219 `rc_cache.repo_object.backend = dogpile.cache.rc.redis_msgpack`
220
221 - New memory monitoring for Gunicorn workers. Starting from 4.18 release a option was added
222 to limit the maximum amount of memory used by a worker.
223 Please review new settings in `[server:main]` section for memory management in both
224 rhodecode.ini and vcsserver.ini::
225
226 ; Maximum memory usage that each worker can use before it will receive a
227 ; graceful restart signal 0 = memory monitoring is disabled
228 ; Examples: 268435456 (256MB), 536870912 (512MB)
229 ; 1073741824 (1GB), 2147483648 (2GB), 4294967296 (4GB)
230 memory_max_usage = 0
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 100755
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 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
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 100755
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 100755
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 100755
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 100755
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 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 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 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.17.4
2 current_version = 4.18.0
3 3 message = release: Bump version {current_version} to {new_version}
4 4
5 5 [bumpversion:file:rhodecode/VERSION]
6 6
@@ -1,16 +1,17 b''
1 1 [run]
2 2
3 3 branch = True
4 4
5 5 include =
6 6 rhodecode/*
7 7
8 8 omit =
9 9 rhodecode/lib/dbmigrate/*
10 10 rhodecode/lib/paster_commands/*
11 rhodecode/lib/_vendor/*
11 12
12 13 [report]
13 14
14 15 exclude_lines =
15 16 raise NotImplementedError
16 17
@@ -1,67 +1,68 b''
1 1 syntax: glob
2 2 *.egg
3 3 *.egg-info
4 4 *.idea
5 5 *.orig
6 6 *.pyc
7 7 *.sqlite-journal
8 8 *.swp
9 9 *.tox
10 10 *.DS_Store*
11 11 rhodecode/public/js/src/components/**/*.css
12 12
13 13 syntax: regexp
14 14
15 15 #.filename
16 16 ^\.settings$
17 17 ^\.project$
18 18 ^\.pydevproject$
19 19 ^\.coverage$
20 20 ^\.cache.*$
21 21 ^\.rhodecode$
22 22
23 23 ^rcextensions
24 24 ^.dev
25 25 ^._dev
26 26 ^build/
27 27 ^coverage\.xml$
28 28 ^data$
29 29 ^\.eggs/
30 30 ^configs/data$
31 31 ^dev.ini$
32 32 ^acceptance_tests/dev.*\.ini$
33 33 ^dist/
34 34 ^fabfile.py
35 35 ^htmlcov
36 36 ^junit\.xml$
37 37 ^node_modules/
38 38 ^node_binaries/
39 39 ^pylint.log$
40 40 ^rcextensions/
41 41 ^result$
42 42 ^rhodecode/public/css/style.css$
43 43 ^rhodecode/public/css/style-polymer.css$
44 44 ^rhodecode/public/css/style-ipython.css$
45 45 ^rhodecode/public/js/rhodecode-components.html$
46 46 ^rhodecode/public/js/rhodecode-components.js$
47 47 ^rhodecode/public/js/scripts.js$
48 ^rhodecode/public/js/scripts.min.js$
48 49 ^rhodecode/public/js/src/components/root-styles.gen.html$
49 50 ^rhodecode/public/js/vendors/webcomponentsjs/
50 51 ^rhodecode\.db$
51 52 ^rhodecode\.log$
52 53 ^rhodecode_dev\.log$
53 54 ^test\.db$
54 55
55 56 # ac-tests
56 57 ^acceptance_tests/\.cache.*$
57 58 ^acceptance_tests/externals
58 59 ^acceptance_tests/ghostdriver.log$
59 60 ^acceptance_tests/local(_.+)?\.ini$
60 61
61 62 # docs
62 63 ^docs/_build$
63 64 ^docs/result$
64 65 ^docs-internal/_build$
65 66
66 67 # Cythonized things
67 68 ^rhodecode/.*\.(c|so)$
@@ -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.17.4
25
26 [task:updated_translation]
20 state = in_progress
21 version = 4.18.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,21 +1,22 b''
1 1 var gruntConfig = require('./grunt_config.json');
2 2 var webpackConfig = require('./webpack.config');
3 3 gruntConfig["webpack"] = {
4 4 options: {
5 5 stats: !process.env.NODE_ENV || process.env.NODE_ENV === 'development'
6 6 },
7 7 prod: webpackConfig,
8 8 dev: Object.assign({ watch: false }, webpackConfig)
9 9 };
10 10
11 11 module.exports = function(grunt) {
12 12 grunt.initConfig(gruntConfig);
13 13
14 14 grunt.loadNpmTasks('grunt-contrib-less');
15 15 grunt.loadNpmTasks('grunt-contrib-concat');
16 grunt.loadNpmTasks('grunt-contrib-uglify');
16 17 grunt.loadNpmTasks('grunt-contrib-watch');
17 18 grunt.loadNpmTasks('grunt-contrib-jshint');
18 19 grunt.loadNpmTasks('grunt-contrib-copy');
19 20 grunt.loadNpmTasks('grunt-webpack');
20 grunt.registerTask('default', ['less:production', 'less:components', 'copy', 'webpack', 'concat:dist']);
21 grunt.registerTask('default', ['less:production', 'less:components', 'copy', 'webpack', 'concat:dist', 'uglify:dist']);
21 22 };
@@ -1,64 +1,65 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 find . -type f \( -iname '.coverage.*' \) -exec rm '{}' ';'
20 21
21 22 test-only:
22 23 PYTHONHASHSEED=random \
23 24 py.test -x -vv -r xw -p no:sugar --cov=rhodecode \
24 25 --cov-report=term-missing --cov-report=html \
25 26 rhodecode
26 27
27 28 test-only-mysql:
28 29 PYTHONHASHSEED=random \
29 30 py.test -x -vv -r xw -p no:sugar --cov=rhodecode \
30 31 --cov-report=term-missing --cov-report=html \
31 --ini-config-override='{"app:main": {"sqlalchemy.db1.url": "mysql://root:qweqwe@localhost/rhodecode_test"}}' \
32 --ini-config-override='{"app:main": {"sqlalchemy.db1.url": "mysql://root:qweqwe@localhost/rhodecode_test?charset=utf8"}}' \
32 33 rhodecode
33 34
34 35 test-only-postgres:
35 36 PYTHONHASHSEED=random \
36 37 py.test -x -vv -r xw -p no:sugar --cov=rhodecode \
37 38 --cov-report=term-missing --cov-report=html \
38 39 --ini-config-override='{"app:main": {"sqlalchemy.db1.url": "postgresql://postgres:qweqwe@localhost/rhodecode_test"}}' \
39 40 rhodecode
40 41
41 42
42 43 docs:
43 44 (cd docs; nix-build default.nix -o result; make clean html)
44 45
45 46 docs-clean:
46 47 (cd docs; make clean)
47 48
48 49 docs-cleanup:
49 50 (cd docs; make cleanup)
50 51
51 52 web-build:
52 53 NODE_PATH=$(NODE_PATH) $(GRUNT)
53 54
54 55 generate-pkgs:
55 56 nix-shell pkgs/shell-generate.nix --command "pip2nix generate --licenses"
56 57
57 58 generate-js-pkgs:
58 59 rm -rf node_modules && \
59 60 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 61 sed -i -e 's/http:\/\//https:\/\//g' pkgs/node-packages.nix
61 62
62 63 generate-license-meta:
63 64 nix-build pkgs/license-generate.nix -o result-license && \
64 65 cat result-license/licenses.json | python -m json.tool > rhodecode/config/licenses.json No newline at end of file
@@ -1,116 +1,121 b''
1 1 =========
2 2 RhodeCode
3 3 =========
4 4
5 5 About
6 6 -----
7 7
8 ``RhodeCode`` is a fast and powerful management tool for Mercurial_ and GIT_
9 and Subversion_ with a built in push/pull server, full text search,
10 pull requests and powerful code-review system. It works on http/https, SSH and
11 has a few unique features like:
8 ``RhodeCode`` is a fast and powerful source code management tool for
9 Mercurial_, GIT_ and Subversion_. It's main features are:
10
12 11
13 - plugable architecture from Pyramid web-framework.
14 - advanced permission system with IP restrictions, inheritation, and user-groups.
12 - built in push/pull server
13 - SSH with key management support
14 - full text search.
15 - plugable authentication.
16 - pull requests and powerful code-review system.
17 - advanced permission system with IP restrictions, permission inheritation, and user-groups.
15 18 - rich set of authentication plugins including LDAP, ActiveDirectory, SAML 2.0,
16 19 Atlassian Crowd, Http-Headers, Pam, Token-Auth, OAuth.
17 20 - live code-review chat, and reviewer rules.
18 21 - full web based file editing.
19 22 - unified multi vcs support.
20 23 - snippets (gist) system.
21 - integration framework for Slack, CI systems, Webhooks.
24 - artfacts store for binaries.
25 - integration framework for Slack, CI systems, Webhooks, Jira, Redmine etc.
22 26 - integration with all 3rd party issue trackers.
23 27
24 28
25 29 RhodeCode also provides rich API, and multiple event hooks so it's easy
26 30 integrable with existing external systems.
27 31
28 32 RhodeCode is similar in some respects to gitlab_, github_ or bitbucket_,
29 33 however RhodeCode can be run as standalone hosted application on your own server.
30 34 RhodeCode can be installed on \*nix or Windows systems.
31 35
32 36 RhodeCode uses `PEP386 versioning <http://www.python.org/dev/peps/pep-0386/>`_
33 37
34 38 Installation
35 39 ------------
36 40 Please visit https://docs.rhodecode.com/RhodeCode-Control/tasks/install-cli.html
37 41 for more details
38 42
39 43
40 44 Source code
41 45 -----------
42 46
43 47 The latest sources can be obtained from official RhodeCode instance
44 https://code.rhodecode.com
48 https://code.rhodecode.com/rhodecode-enterprise-ce
49 https://code.rhodecode.com/rhodecode-vcsserver
45 50
46 51
47 52 Contributions
48 53 -------------
49 54
50 55 RhodeCode is open-source; contributions are welcome!
51 56
52 57 Please see the contribution documentation inside of the docs folder, which is
53 58 also available at
54 59 https://docs.rhodecode.com/RhodeCode-Enterprise/contributing/contributing.html
55 60
56 61 For additional information about collaboration tools, our issue tracker,
57 62 licensing, and contribution credit, visit https://rhodecode.com/open-source
58 63
59 64
60 65 RhodeCode Features
61 66 ------------------
62 67
63 68 Check out all features of RhodeCode at https://rhodecode.com/features
64 69
65 70 License
66 71 -------
67 72
68 73 ``RhodeCode`` is dual-licensed with AGPLv3 and commercial license.
69 74 Please see LICENSE.txt file for details.
70 75
71 76
72 77 Getting help
73 78 ------------
74 79
75 80 Listed bellow are various support resources that should help.
76 81
77 82 .. note::
78 83
79 84 Please try to read the documentation before posting any issues, especially
80 85 the **troubleshooting section**
81 86
82 87 - Official issue tracker `RhodeCode Issue tracker <https://issues.rhodecode.com>`_
83 88
84 89 - Official Slack Community Channel `RhodeCode Slack <https://rhodecode.com/join>`_
85 90
86 91 - Search our community portal `Community portal <https://community.rhodecode.com>`_
87 92
88 93 - You can also follow RhodeCode on twitter **@RhodeCode** where we often post
89 94 news and other interesting stuff about RhodeCode.
90 95
91 96
92 97 Online documentation
93 98 --------------------
94 99
95 100 Online documentation for the current version of RhodeCode is available at
96 101 - http://rhodecode.com/docs
97 102
98 103 You may also build the documentation for yourself - go into ``docs/`` and run::
99 104
100 105 nix-build default.nix -o result && make clean html
101 106
102 107 (You need to have sphinx_ installed to build the documentation. If you don't
103 108 have sphinx_ installed you can install it via the command:
104 109 ``pip install sphinx``)
105 110
106 111 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
107 112 .. _python: http://www.python.org/
108 113 .. _sphinx: http://sphinx.pocoo.org/
109 114 .. _mercurial: http://mercurial.selenic.com/
110 115 .. _bitbucket: http://bitbucket.org/
111 116 .. _github: http://github.com/
112 117 .. _gitlab: http://gitlab.com/
113 118 .. _subversion: http://subversion.tigris.org/
114 119 .. _git: http://git-scm.com/
115 120 .. _celery: http://celeryproject.org/
116 121 .. _vcs: http://pypi.python.org/pypi/vcs
This diff has been collapsed as it changes many lines, (918 lines changed) Show them Hide them
@@ -1,741 +1,833 b''
1
1 ## -*- coding: utf-8 -*-
2 2
3 ################################################################################
4 ## RHODECODE COMMUNITY EDITION CONFIGURATION ##
5 ################################################################################
3 ; #########################################
4 ; RHODECODE COMMUNITY EDITION CONFIGURATION
5 ; #########################################
6 6
7 7 [DEFAULT]
8 ## Debug flag sets all loggers to debug, and enables request tracking
8 ; Debug flag sets all loggers to debug, and enables request tracking
9 9 debug = true
10 10
11 ################################################################################
12 ## EMAIL CONFIGURATION ##
13 ## Uncomment and replace with the email address which should receive ##
14 ## any error reports after an application crash ##
15 ## Additionally these settings will be used by the RhodeCode mailing system ##
16 ################################################################################
11 ; ########################################################################
12 ; EMAIL CONFIGURATION
13 ; These settings will be used by the RhodeCode mailing system
14 ; ########################################################################
17 15
18 ## prefix all emails subjects with given prefix, helps filtering out emails
16 ; prefix all emails subjects with given prefix, helps filtering out emails
19 17 #email_prefix = [RhodeCode]
20 18
21 ## email FROM address all mails will be sent
19 ; email FROM address all mails will be sent
22 20 #app_email_from = rhodecode-noreply@localhost
23 21
24 22 #smtp_server = mail.server.com
25 23 #smtp_username =
26 24 #smtp_password =
27 25 #smtp_port =
28 26 #smtp_use_tls = false
29 27 #smtp_use_ssl = true
30 28
31 29 [server:main]
32 ## COMMON ##
30 ; COMMON HOST/IP CONFIG
33 31 host = 127.0.0.1
34 32 port = 5000
35 33
36 ###########################################################
37 ## WAITRESS WSGI SERVER - Recommended for Development ####
38 ###########################################################
34 ; ##################################################
35 ; WAITRESS WSGI SERVER - Recommended for Development
36 ; ##################################################
39 37
38 ; use server type
40 39 use = egg:waitress#main
41 ## number of worker threads
40
41 ; number of worker threads
42 42 threads = 5
43 ## MAX BODY SIZE 100GB
43
44 ; MAX BODY SIZE 100GB
44 45 max_request_body_size = 107374182400
45 ## Use poll instead of select, fixes file descriptors limits problems.
46 ## May not work on old windows systems.
46
47 ; Use poll instead of select, fixes file descriptors limits problems.
48 ; May not work on old windows systems.
47 49 asyncore_use_poll = true
48 50
49 51
50 ##########################
51 ## GUNICORN WSGI SERVER ##
52 ##########################
53 ## run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
52 ; ###########################
53 ; GUNICORN APPLICATION SERVER
54 ; ###########################
54 55
56 ; run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
57
58 ; Module to use, this setting shouldn't be changed
55 59 #use = egg:gunicorn#main
56 ## Sets the number of process workers. More workers means more concurrent connections
57 ## RhodeCode can handle at the same time. Each additional worker also it increases
58 ## memory usage as each has it's own set of caches.
59 ## Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
60 ## than 8-10 unless for really big deployments .e.g 700-1000 users.
61 ## `instance_id = *` must be set in the [app:main] section below (which is the default)
62 ## when using more than 1 worker.
60
61 ; Sets the number of process workers. More workers means more concurrent connections
62 ; RhodeCode can handle at the same time. Each additional worker also it increases
63 ; memory usage as each has it's own set of caches.
64 ; Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
65 ; than 8-10 unless for really big deployments .e.g 700-1000 users.
66 ; `instance_id = *` must be set in the [app:main] section below (which is the default)
67 ; when using more than 1 worker.
63 68 #workers = 2
64 ## process name visible in process list
69
70 ; Gunicorn access log level
71 #loglevel = info
72
73 ; Process name visible in process list
65 74 #proc_name = rhodecode
66 ## type of worker class, one of sync, gevent
67 ## recommended for bigger setup is using of of other than sync one
75
76 ; Type of worker class, one of `sync`, `gevent`
77 ; Recommended type is `gevent`
68 78 #worker_class = gevent
69 ## The maximum number of simultaneous clients. Valid only for Gevent
79
80 ; The maximum number of simultaneous clients. Valid only for gevent
70 81 #worker_connections = 10
71 ## max number of requests that worker will handle before being gracefully
72 ## restarted, could prevent memory leaks
82
83 ; Max number of requests that worker will handle before being gracefully restarted.
84 ; Prevents memory leaks, jitter adds variability so not all workers are restarted at once.
73 85 #max_requests = 1000
74 86 #max_requests_jitter = 30
75 ## amount of time a worker can spend with handling a request before it
76 ## gets killed and restarted. Set to 6hrs
87
88 ; Amount of time a worker can spend with handling a request before it
89 ; gets killed and restarted. By default set to 21600 (6hrs)
90 ; Examples: 1800 (30min), 3600 (1hr), 7200 (2hr), 43200 (12h)
77 91 #timeout = 21600
78 92
93 ; The maximum size of HTTP request line in bytes.
94 ; 0 for unlimited
95 #limit_request_line = 0
96
97 ; Limit the number of HTTP headers fields in a request.
98 ; By default this value is 100 and can't be larger than 32768.
99 #limit_request_fields = 32768
100
101 ; Limit the allowed size of an HTTP request header field.
102 ; Value is a positive number or 0.
103 ; Setting it to 0 will allow unlimited header field sizes.
104 #limit_request_field_size = 0
105
106 ; Timeout for graceful workers restart.
107 ; After receiving a restart signal, workers have this much time to finish
108 ; serving requests. Workers still alive after the timeout (starting from the
109 ; receipt of the restart signal) are force killed.
110 ; Examples: 1800 (30min), 3600 (1hr), 7200 (2hr), 43200 (12h)
111 #graceful_timeout = 3600
112
113 # The number of seconds to wait for requests on a Keep-Alive connection.
114 # Generally set in the 1-5 seconds range.
115 #keepalive = 2
116
117 ; Maximum memory usage that each worker can use before it will receive a
118 ; graceful restart signal 0 = memory monitoring is disabled
119 ; Examples: 268435456 (256MB), 536870912 (512MB)
120 ; 1073741824 (1GB), 2147483648 (2GB), 4294967296 (4GB)
121 #memory_max_usage = 0
122
123 ; How often in seconds to check for memory usage for each gunicorn worker
124 #memory_usage_check_interval = 60
125
126 ; Threshold value for which we don't recycle worker if GarbageCollection
127 ; frees up enough resources. Before each restart we try to run GC on worker
128 ; in case we get enough free memory after that, restart will not happen.
129 #memory_usage_recovery_threshold = 0.8
130
79 131
80 ## prefix middleware for RhodeCode.
81 ## recommended when using proxy setup.
82 ## allows to set RhodeCode under a prefix in server.
83 ## eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
84 ## And set your prefix like: `prefix = /custom_prefix`
85 ## be sure to also set beaker.session.cookie_path = /custom_prefix if you need
86 ## to make your cookies only work on prefix url
132 ; Prefix middleware for RhodeCode.
133 ; recommended when using proxy setup.
134 ; allows to set RhodeCode under a prefix in server.
135 ; eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
136 ; And set your prefix like: `prefix = /custom_prefix`
137 ; be sure to also set beaker.session.cookie_path = /custom_prefix if you need
138 ; to make your cookies only work on prefix url
87 139 [filter:proxy-prefix]
88 140 use = egg:PasteDeploy#prefix
89 141 prefix = /
90 142
91 143 [app:main]
92 ## The %(here)s variable will be replaced with the absolute path of parent directory
93 ## of this file
94 ## In addition ENVIRONMENT variables usage is possible, e.g
95 ## sqlalchemy.db1.url = {ENV_RC_DB_URL}
144 ; The %(here)s variable will be replaced with the absolute path of parent directory
145 ; of this file
146 ; In addition ENVIRONMENT variables usage is possible, e.g
147 ; sqlalchemy.db1.url = {ENV_RC_DB_URL}
96 148
97 149 use = egg:rhodecode-enterprise-ce
98 150
99 ## enable proxy prefix middleware, defined above
151 ; enable proxy prefix middleware, defined above
100 152 #filter-with = proxy-prefix
101 153
154 ; #############
155 ; DEBUG OPTIONS
156 ; #############
157
158 pyramid.reload_templates = true
159
102 160 # During development the we want to have the debug toolbar enabled
103 161 pyramid.includes =
104 162 pyramid_debugtoolbar
105 rhodecode.lib.middleware.request_wrapper
106
107 pyramid.reload_templates = true
108 163
109 164 debugtoolbar.hosts = 0.0.0.0/0
110 165 debugtoolbar.exclude_prefixes =
111 166 /css
112 167 /fonts
113 168 /images
114 169 /js
115 170
116 171 ## RHODECODE PLUGINS ##
117 172 rhodecode.includes =
118 173 rhodecode.api
119 174
120 175
121 176 # api prefix url
122 177 rhodecode.api.url = /_admin/api
123 178
124
125 ## END RHODECODE PLUGINS ##
179 ; enable debug style page
180 debug_style = true
126 181
127 ## encryption key used to encrypt social plugin tokens,
128 ## remote_urls with credentials etc, if not set it defaults to
129 ## `beaker.session.secret`
182 ; #################
183 ; END DEBUG OPTIONS
184 ; #################
185
186 ; encryption key used to encrypt social plugin tokens,
187 ; remote_urls with credentials etc, if not set it defaults to
188 ; `beaker.session.secret`
130 189 #rhodecode.encrypted_values.secret =
131 190
132 ## decryption strict mode (enabled by default). It controls if decryption raises
133 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
191 ; decryption strict mode (enabled by default). It controls if decryption raises
192 ; `SignatureVerificationError` in case of wrong key, or damaged encryption data.
134 193 #rhodecode.encrypted_values.strict = false
135 194
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.
195 ; Pick algorithm for encryption. Either fernet (more secure) or aes (default)
196 ; fernet is safer, and we strongly recommend switching to it.
197 ; Due to backward compatibility aes is used as default.
139 198 #rhodecode.encrypted_values.algorithm = fernet
140 199
141 ## return gzipped responses from RhodeCode (static files/application)
200 ; Return gzipped responses from RhodeCode (static files/application)
142 201 gzip_responses = false
143 202
144 ## auto-generate javascript routes file on startup
203 ; Auto-generate javascript routes file on startup
145 204 generate_js_files = false
146 205
147 ## System global default language.
148 ## All available languages: en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
206 ; System global default language.
207 ; All available languages: en (default), be, de, es, fr, it, ja, pl, pt, ru, zh
149 208 lang = en
150 209
151 ## Perform a full repository scan and import on each server start.
152 ## Settings this to true could lead to very long startup time.
210 ; Perform a full repository scan and import on each server start.
211 ; Settings this to true could lead to very long startup time.
153 212 startup.import_repos = false
154 213
155 ## Uncomment and set this path to use archive download cache.
156 ## Once enabled, generated archives will be cached at this location
157 ## and served from the cache during subsequent requests for the same archive of
158 ## the repository.
214 ; Uncomment and set this path to use archive download cache.
215 ; Once enabled, generated archives will be cached at this location
216 ; and served from the cache during subsequent requests for the same archive of
217 ; the repository.
159 218 #archive_cache_dir = /tmp/tarballcache
160 219
161 ## URL at which the application is running. This is used for Bootstrapping
162 ## requests in context when no web request is available. Used in ishell, or
163 ## SSH calls. Set this for events to receive proper url for SSH calls.
220 ; URL at which the application is running. This is used for Bootstrapping
221 ; requests in context when no web request is available. Used in ishell, or
222 ; SSH calls. Set this for events to receive proper url for SSH calls.
164 223 app.base_url = http://rhodecode.local
165 224
166 ## Unique application ID. Should be a random unique string for security.
225 ; Unique application ID. Should be a random unique string for security.
167 226 app_instance_uuid = rc-production
168 227
169 ## Cut off limit for large diffs (size in bytes). If overall diff size on
170 ## commit, or pull request exceeds this limit this diff will be displayed
171 ## partially. E.g 512000 == 512Kb
228 ; Cut off limit for large diffs (size in bytes). If overall diff size on
229 ; commit, or pull request exceeds this limit this diff will be displayed
230 ; partially. E.g 512000 == 512Kb
172 231 cut_off_limit_diff = 512000
173 232
174 ## Cut off limit for large files inside diffs (size in bytes). Each individual
175 ## file inside diff which exceeds this limit will be displayed partially.
176 ## E.g 128000 == 128Kb
233 ; Cut off limit for large files inside diffs (size in bytes). Each individual
234 ; file inside diff which exceeds this limit will be displayed partially.
235 ; E.g 128000 == 128Kb
177 236 cut_off_limit_file = 128000
178 237
179 ## use cached version of vcs repositories everywhere. Recommended to be `true`
238 ; Use cached version of vcs repositories everywhere. Recommended to be `true`
180 239 vcs_full_cache = true
181 240
182 ## Force https in RhodeCode, fixes https redirects, assumes it's always https.
183 ## Normally this is controlled by proper http flags sent from http server
241 ; Force https in RhodeCode, fixes https redirects, assumes it's always https.
242 ; Normally this is controlled by proper flags sent from http server such as Nginx or Apache
184 243 force_https = false
185 244
186 ## use Strict-Transport-Security headers
245 ; use Strict-Transport-Security headers
187 246 use_htsts = false
188 247
189 ## git rev filter option, --all is the default filter, if you need to
190 ## hide all refs in changelog switch this to --branches --tags
191 git_rev_filter = --branches --tags
192
193 # Set to true if your repos are exposed using the dumb protocol
248 ; Set to true if your repos are exposed using the dumb protocol
194 249 git_update_server_info = false
195 250
196 ## RSS/ATOM feed options
251 ; RSS/ATOM feed options
197 252 rss_cut_off_limit = 256000
198 253 rss_items_per_page = 10
199 254 rss_include_diff = false
200 255
201 ## gist URL alias, used to create nicer urls for gist. This should be an
202 ## url that does rewrites to _admin/gists/{gistid}.
203 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
204 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
256 ; gist URL alias, used to create nicer urls for gist. This should be an
257 ; url that does rewrites to _admin/gists/{gistid}.
258 ; example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
259 ; RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
205 260 gist_alias_url =
206 261
207 ## List of views (using glob pattern syntax) that AUTH TOKENS could be
208 ## used for access.
209 ## Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
210 ## came from the the logged in user who own this authentication token.
211 ## Additionally @TOKEN syntax can be used to bound the view to specific
212 ## authentication token. Such view would be only accessible when used together
213 ## with this authentication token
214 ##
215 ## list of all views can be found under `/_admin/permissions/auth_token_access`
216 ## The list should be "," separated and on a single line.
217 ##
218 ## Most common views to enable:
262 ; List of views (using glob pattern syntax) that AUTH TOKENS could be
263 ; used for access.
264 ; Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
265 ; came from the the logged in user who own this authentication token.
266 ; Additionally @TOKEN syntax can be used to bound the view to specific
267 ; authentication token. Such view would be only accessible when used together
268 ; with this authentication token
269 ; list of all views can be found under `/_admin/permissions/auth_token_access`
270 ; The list should be "," separated and on a single line.
271 ; Most common views to enable:
272
219 273 # RepoCommitsView:repo_commit_download
220 274 # RepoCommitsView:repo_commit_patch
221 275 # RepoCommitsView:repo_commit_raw
222 276 # RepoCommitsView:repo_commit_raw@TOKEN
223 277 # RepoFilesView:repo_files_diff
224 278 # RepoFilesView:repo_archivefile
225 279 # RepoFilesView:repo_file_raw
226 280 # GistView:*
227 281 api_access_controllers_whitelist =
228 282
229 ## Default encoding used to convert from and to unicode
230 ## can be also a comma separated list of encoding in case of mixed encodings
283 ; Default encoding used to convert from and to unicode
284 ; can be also a comma separated list of encoding in case of mixed encodings
231 285 default_encoding = UTF-8
232 286
233 ## instance-id prefix
234 ## a prefix key for this instance used for cache invalidation when running
235 ## multiple instances of RhodeCode, make sure it's globally unique for
236 ## all running RhodeCode instances. Leave empty if you don't use it
287 ; instance-id prefix
288 ; a prefix key for this instance used for cache invalidation when running
289 ; multiple instances of RhodeCode, make sure it's globally unique for
290 ; all running RhodeCode instances. Leave empty if you don't use it
237 291 instance_id =
238 292
239 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
240 ## of an authentication plugin also if it is disabled by it's settings.
241 ## This could be useful if you are unable to log in to the system due to broken
242 ## authentication settings. Then you can enable e.g. the internal RhodeCode auth
243 ## module to log in again and fix the settings.
244 ##
245 ## Available builtin plugin IDs (hash is part of the ID):
246 ## egg:rhodecode-enterprise-ce#rhodecode
247 ## egg:rhodecode-enterprise-ce#pam
248 ## egg:rhodecode-enterprise-ce#ldap
249 ## egg:rhodecode-enterprise-ce#jasig_cas
250 ## egg:rhodecode-enterprise-ce#headers
251 ## egg:rhodecode-enterprise-ce#crowd
293 ; Fallback authentication plugin. Set this to a plugin ID to force the usage
294 ; of an authentication plugin also if it is disabled by it's settings.
295 ; This could be useful if you are unable to log in to the system due to broken
296 ; authentication settings. Then you can enable e.g. the internal RhodeCode auth
297 ; module to log in again and fix the settings.
298 ; Available builtin plugin IDs (hash is part of the ID):
299 ; egg:rhodecode-enterprise-ce#rhodecode
300 ; egg:rhodecode-enterprise-ce#pam
301 ; egg:rhodecode-enterprise-ce#ldap
302 ; egg:rhodecode-enterprise-ce#jasig_cas
303 ; egg:rhodecode-enterprise-ce#headers
304 ; egg:rhodecode-enterprise-ce#crowd
305
252 306 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
253 307
254 ## alternative return HTTP header for failed authentication. Default HTTP
255 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
256 ## handling that causing a series of failed authentication calls.
257 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
258 ## This will be served instead of default 401 on bad authentication
308 ; Flag to control loading of legacy plugins in py:/path format
309 auth_plugin.import_legacy_plugins = true
310
311 ; alternative return HTTP header for failed authentication. Default HTTP
312 ; response is 401 HTTPUnauthorized. Currently HG clients have troubles with
313 ; handling that causing a series of failed authentication calls.
314 ; Set this variable to 403 to return HTTPForbidden, or any other HTTP code
315 ; This will be served instead of default 401 on bad authentication
259 316 auth_ret_code =
260 317
261 ## use special detection method when serving auth_ret_code, instead of serving
262 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
263 ## and then serve auth_ret_code to clients
318 ; use special detection method when serving auth_ret_code, instead of serving
319 ; ret_code directly, use 401 initially (Which triggers credentials prompt)
320 ; and then serve auth_ret_code to clients
264 321 auth_ret_code_detection = false
265 322
266 ## locking return code. When repository is locked return this HTTP code. 2XX
267 ## codes don't break the transactions while 4XX codes do
323 ; locking return code. When repository is locked return this HTTP code. 2XX
324 ; codes don't break the transactions while 4XX codes do
268 325 lock_ret_code = 423
269 326
270 ## allows to change the repository location in settings page
327 ; allows to change the repository location in settings page
271 328 allow_repo_location_change = true
272 329
273 ## allows to setup custom hooks in settings page
330 ; allows to setup custom hooks in settings page
274 331 allow_custom_hooks_settings = true
275 332
276 ## Generated license token required for EE edition license.
277 ## New generated token value can be found in Admin > settings > license page.
333 ; Generated license token required for EE edition license.
334 ; New generated token value can be found in Admin > settings > license page.
278 335 license_token =
279 336
280 ## supervisor connection uri, for managing supervisor and logs.
337 ; This flag hides sensitive information on the license page such as token, and license data
338 license.hide_license_info = false
339
340 ; supervisor connection uri, for managing supervisor and logs.
281 341 supervisor.uri =
282 ## supervisord group name/id we only want this RC instance to handle
342
343 ; supervisord group name/id we only want this RC instance to handle
283 344 supervisor.group_id = dev
284 345
285 ## Display extended labs settings
346 ; Display extended labs settings
286 347 labs_settings_active = true
287 348
288 ## Custom exception store path, defaults to TMPDIR
289 ## This is used to store exception from RhodeCode in shared directory
349 ; Custom exception store path, defaults to TMPDIR
350 ; This is used to store exception from RhodeCode in shared directory
290 351 #exception_tracker.store_path =
291 352
292 ## File store configuration. This is used to store and serve uploaded files
353 ; File store configuration. This is used to store and serve uploaded files
293 354 file_store.enabled = true
294 ## Storage backend, available options are: local
355
356 ; Storage backend, available options are: local
295 357 file_store.backend = local
296 ## path to store the uploaded binaries
358
359 ; path to store the uploaded binaries
297 360 file_store.storage_path = %(here)s/data/file_store
298 361
299 362
300 ####################################
301 ### CELERY CONFIG ####
302 ####################################
303 ## run: /path/to/celery worker \
304 ## -E --beat --app rhodecode.lib.celerylib.loader \
305 ## --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler \
306 ## --loglevel DEBUG --ini /path/to/rhodecode.ini
363 ; #############
364 ; CELERY CONFIG
365 ; #############
366
367 ; manually run celery: /path/to/celery worker -E --beat --app rhodecode.lib.celerylib.loader --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler --loglevel DEBUG --ini /path/to/rhodecode.ini
307 368
308 369 use_celery = false
309 370
310 ## connection url to the message broker (default rabbitmq)
311 celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
371 ; connection url to the message broker (default redis)
372 celery.broker_url = redis://localhost:6379/8
312 373
313 ## maximum tasks to execute before worker restart
374 ; rabbitmq example
375 #celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
376
377 ; maximum tasks to execute before worker restart
314 378 celery.max_tasks_per_child = 100
315 379
316 ## tasks will never be sent to the queue, but executed locally instead.
380 ; tasks will never be sent to the queue, but executed locally instead.
317 381 celery.task_always_eager = false
318 382
319 #####################################
320 ### DOGPILE CACHE ####
321 #####################################
322 ## Default cache dir for caches. Putting this into a ramdisk
323 ## can boost performance, eg. /tmpfs/data_ramdisk, however this directory might require
324 ## large amount of space
383 ; #############
384 ; DOGPILE CACHE
385 ; #############
386
387 ; Default cache dir for caches. Putting this into a ramdisk can boost performance.
388 ; eg. /tmpfs/data_ramdisk, however this directory might require large amount of space
325 389 cache_dir = %(here)s/data
326 390
327 ## `cache_perms` cache settings for permission tree, auth TTL.
391 ; *********************************************
392 ; `sql_cache_short` cache for heavy SQL queries
393 ; Only supported backend is `memory_lru`
394 ; *********************************************
395 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
396 rc_cache.sql_cache_short.expiration_time = 30
397
398
399 ; *****************************************************
400 ; `cache_repo_longterm` cache for repo object instances
401 ; Only supported backend is `memory_lru`
402 ; *****************************************************
403 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
404 ; by default we use 30 Days, cache is still invalidated on push
405 rc_cache.cache_repo_longterm.expiration_time = 2592000
406 ; max items in LRU cache, set to smaller number to save memory, and expire last used caches
407 rc_cache.cache_repo_longterm.max_size = 10000
408
409
410 ; *************************************************
411 ; `cache_perms` cache for permission tree, auth TTL
412 ; *************************************************
328 413 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
329 414 rc_cache.cache_perms.expiration_time = 300
415 ; file cache store path. Defaults to `cache_dir =` value or tempdir if both values are not set
416 #rc_cache.cache_perms.arguments.filename = /tmp/cache_perms.db
330 417
331 ## alternative `cache_perms` redis backend with distributed lock
418 ; alternative `cache_perms` redis backend with distributed lock
332 419 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
333 420 #rc_cache.cache_perms.expiration_time = 300
334 ## redis_expiration_time needs to be greater then expiration_time
421
422 ; redis_expiration_time needs to be greater then expiration_time
335 423 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
336 #rc_cache.cache_perms.arguments.socket_timeout = 30
424
337 425 #rc_cache.cache_perms.arguments.host = localhost
338 426 #rc_cache.cache_perms.arguments.port = 6379
339 427 #rc_cache.cache_perms.arguments.db = 0
340 ## more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
428 #rc_cache.cache_perms.arguments.socket_timeout = 30
429 ; more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
341 430 #rc_cache.cache_perms.arguments.distributed_lock = true
342 431
343 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
432
433 ; ***************************************************
434 ; `cache_repo` cache for file tree, Readme, RSS FEEDS
435 ; ***************************************************
344 436 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
345 437 rc_cache.cache_repo.expiration_time = 2592000
438 ; file cache store path. Defaults to `cache_dir =` value or tempdir if both values are not set
439 #rc_cache.cache_repo.arguments.filename = /tmp/cache_repo.db
346 440
347 ## alternative `cache_repo` redis backend with distributed lock
441 ; alternative `cache_repo` redis backend with distributed lock
348 442 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
349 443 #rc_cache.cache_repo.expiration_time = 2592000
350 ## redis_expiration_time needs to be greater then expiration_time
444
445 ; redis_expiration_time needs to be greater then expiration_time
351 446 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
352 #rc_cache.cache_repo.arguments.socket_timeout = 30
447
353 448 #rc_cache.cache_repo.arguments.host = localhost
354 449 #rc_cache.cache_repo.arguments.port = 6379
355 450 #rc_cache.cache_repo.arguments.db = 1
356 ## more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
451 #rc_cache.cache_repo.arguments.socket_timeout = 30
452 ; more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
357 453 #rc_cache.cache_repo.arguments.distributed_lock = true
358 454
359 ## cache settings for SQL queries, this needs to use memory type backend
360 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
361 rc_cache.sql_cache_short.expiration_time = 30
362 455
363 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
364 ## type backend as the objects kept are not pickle serializable
365 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
366 ## by default we use 96H, this is using invalidation on push anyway
367 rc_cache.cache_repo_longterm.expiration_time = 345600
368 ## max items in LRU cache, reduce this number to save memory, and expire last used
369 ## cached objects
370 rc_cache.cache_repo_longterm.max_size = 10000
456 ; ##############
457 ; BEAKER SESSION
458 ; ##############
371 459
372
373 ####################################
374 ### BEAKER SESSION ####
375 ####################################
376
377 ## .session.type is type of storage options for the session, current allowed
378 ## types are file, ext:memcached, ext:redis, ext:database, and memory (default).
460 ; beaker.session.type is type of storage options for the logged users sessions. Current allowed
461 ; types are file, ext:redis, ext:database, ext:memcached, and memory (default if not specified).
462 ; Fastest ones are Redis and ext:database
379 463 beaker.session.type = file
380 464 beaker.session.data_dir = %(here)s/data/sessions
381 465
382 ## redis sessions
466 ; Redis based sessions
383 467 #beaker.session.type = ext:redis
384 468 #beaker.session.url = redis://127.0.0.1:6379/2
385 469
386 ## db based session, fast, and allows easy management over logged in users
470 ; DB based session, fast, and allows easy management over logged in users
387 471 #beaker.session.type = ext:database
388 472 #beaker.session.table_name = db_session
389 473 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
390 474 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
391 475 #beaker.session.sa.pool_recycle = 3600
392 476 #beaker.session.sa.echo = false
393 477
394 478 beaker.session.key = rhodecode
395 479 beaker.session.secret = develop-rc-uytcxaz
396 480 beaker.session.lock_dir = %(here)s/data/sessions/lock
397 481
398 ## Secure encrypted cookie. Requires AES and AES python libraries
399 ## you must disable beaker.session.secret to use this
482 ; Secure encrypted cookie. Requires AES and AES python libraries
483 ; you must disable beaker.session.secret to use this
400 484 #beaker.session.encrypt_key = key_for_encryption
401 485 #beaker.session.validate_key = validation_key
402 486
403 ## sets session as invalid(also logging out user) if it haven not been
404 ## accessed for given amount of time in seconds
487 ; Sets session as invalid (also logging out user) if it haven not been
488 ; accessed for given amount of time in seconds
405 489 beaker.session.timeout = 2592000
406 490 beaker.session.httponly = true
407 ## Path to use for the cookie. Set to prefix if you use prefix middleware
491
492 ; Path to use for the cookie. Set to prefix if you use prefix middleware
408 493 #beaker.session.cookie_path = /custom_prefix
409 494
410 ## uncomment for https secure cookie
495 ; Set https secure cookie
411 496 beaker.session.secure = false
412 497
413 ## auto save the session to not to use .save()
414 beaker.session.auto = false
415
416 ## default cookie expiration time in seconds, set to `true` to set expire
417 ## at browser close
498 ; default cookie expiration time in seconds, set to `true` to set expire
499 ; at browser close
418 500 #beaker.session.cookie_expires = 3600
419 501
420 ###################################
421 ## SEARCH INDEXING CONFIGURATION ##
422 ###################################
423 ## Full text search indexer is available in rhodecode-tools under
424 ## `rhodecode-tools index` command
502 ; #############################
503 ; SEARCH INDEXING CONFIGURATION
504 ; #############################
425 505
426 ## WHOOSH Backend, doesn't require additional services to run
427 ## it works good with few dozen repos
506 ; Full text search indexer is available in rhodecode-tools under
507 ; `rhodecode-tools index` command
508
509 ; WHOOSH Backend, doesn't require additional services to run
510 ; it works good with few dozen repos
428 511 search.module = rhodecode.lib.index.whoosh
429 512 search.location = %(here)s/data/index
430 513
431 ########################################
432 ### CHANNELSTREAM CONFIG ####
433 ########################################
434 ## channelstream enables persistent connections and live notification
435 ## in the system. It's also used by the chat system
514 ; ####################
515 ; CHANNELSTREAM CONFIG
516 ; ####################
517
518 ; channelstream enables persistent connections and live notification
519 ; in the system. It's also used by the chat system
436 520
437 521 channelstream.enabled = false
438 522
439 ## server address for channelstream server on the backend
523 ; server address for channelstream server on the backend
440 524 channelstream.server = 127.0.0.1:9800
441 525
442 ## location of the channelstream server from outside world
443 ## use ws:// for http or wss:// for https. This address needs to be handled
444 ## by external HTTP server such as Nginx or Apache
445 ## see Nginx/Apache configuration examples in our docs
526 ; location of the channelstream server from outside world
527 ; use ws:// for http or wss:// for https. This address needs to be handled
528 ; by external HTTP server such as Nginx or Apache
529 ; see Nginx/Apache configuration examples in our docs
446 530 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
447 531 channelstream.secret = secret
448 532 channelstream.history.location = %(here)s/channelstream_history
449 533
450 ## Internal application path that Javascript uses to connect into.
451 ## If you use proxy-prefix the prefix should be added before /_channelstream
534 ; Internal application path that Javascript uses to connect into.
535 ; If you use proxy-prefix the prefix should be added before /_channelstream
452 536 channelstream.proxy_path = /_channelstream
453 537
454 538
455 ###################################
456 ## APPENLIGHT CONFIG ##
457 ###################################
539 ; ##############################
540 ; MAIN RHODECODE DATABASE CONFIG
541 ; ##############################
542
543 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
544 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
545 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
546 ; pymysql is an alternative driver for MySQL, use in case of problems with default one
547 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
548
549 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
550
551 ; see sqlalchemy docs for other advanced settings
552 ; print the sql statements to output
553 sqlalchemy.db1.echo = false
554
555 ; recycle the connections after this amount of seconds
556 sqlalchemy.db1.pool_recycle = 3600
557 sqlalchemy.db1.convert_unicode = true
558
559 ; the number of connections to keep open inside the connection pool.
560 ; 0 indicates no limit
561 #sqlalchemy.db1.pool_size = 5
562
563 ; The number of connections to allow in connection pool "overflow", that is
564 ; connections that can be opened above and beyond the pool_size setting,
565 ; which defaults to five.
566 #sqlalchemy.db1.max_overflow = 10
567
568 ; Connection check ping, used to detect broken database connections
569 ; could be enabled to better handle cases if MySQL has gone away errors
570 #sqlalchemy.db1.ping_connection = true
571
572 ; ##########
573 ; VCS CONFIG
574 ; ##########
575 vcs.server.enable = true
576 vcs.server = localhost:9900
577
578 ; Web server connectivity protocol, responsible for web based VCS operations
579 ; Available protocols are:
580 ; `http` - use http-rpc backend (default)
581 vcs.server.protocol = http
582
583 ; Push/Pull operations protocol, available options are:
584 ; `http` - use http-rpc backend (default)
585 vcs.scm_app_implementation = http
586
587 ; Push/Pull operations hooks protocol, available options are:
588 ; `http` - use http-rpc backend (default)
589 vcs.hooks.protocol = http
590
591 ; Host on which this instance is listening for hooks. If vcsserver is in other location
592 ; this should be adjusted.
593 vcs.hooks.host = 127.0.0.1
594
595 ; Start VCSServer with this instance as a subprocess, useful for development
596 vcs.start_server = false
597
598 ; List of enabled VCS backends, available options are:
599 ; `hg` - mercurial
600 ; `git` - git
601 ; `svn` - subversion
602 vcs.backends = hg, git, svn
603
604 ; Wait this number of seconds before killing connection to the vcsserver
605 vcs.connection_timeout = 3600
606
607 ; Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
608 ; Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
609 #vcs.svn.compatible_version = pre-1.8-compatible
610
458 611
459 ## Appenlight is tailored to work with RhodeCode, see
460 ## http://appenlight.com for details how to obtain an account
612 ; ####################################################
613 ; Subversion proxy support (mod_dav_svn)
614 ; Maps RhodeCode repo groups into SVN paths for Apache
615 ; ####################################################
616
617 ; Enable or disable the config file generation.
618 svn.proxy.generate_config = false
619
620 ; Generate config file with `SVNListParentPath` set to `On`.
621 svn.proxy.list_parent_path = true
622
623 ; Set location and file name of generated config file.
624 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
625
626 ; alternative mod_dav config template. This needs to be a valid mako template
627 ; Example template can be found in the source code:
628 ; rhodecode/apps/svn_support/templates/mod-dav-svn.conf.mako
629 #svn.proxy.config_template = ~/.rccontrol/enterprise-1/custom_svn_conf.mako
630
631 ; Used as a prefix to the `Location` block in the generated config file.
632 ; In most cases it should be set to `/`.
633 svn.proxy.location_root = /
634
635 ; Command to reload the mod dav svn configuration on change.
636 ; Example: `/etc/init.d/apache2 reload` or /home/USER/apache_reload.sh
637 ; Make sure user who runs RhodeCode process is allowed to reload Apache
638 #svn.proxy.reload_cmd = /etc/init.d/apache2 reload
639
640 ; If the timeout expires before the reload command finishes, the command will
641 ; be killed. Setting it to zero means no timeout. Defaults to 10 seconds.
642 #svn.proxy.reload_timeout = 10
643
644 ; ####################
645 ; SSH Support Settings
646 ; ####################
461 647
462 ## Appenlight integration enabled
648 ; Defines if a custom authorized_keys file should be created and written on
649 ; any change user ssh keys. Setting this to false also disables possibility
650 ; of adding SSH keys by users from web interface. Super admins can still
651 ; manage SSH Keys.
652 ssh.generate_authorized_keyfile = false
653
654 ; Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
655 # ssh.authorized_keys_ssh_opts =
656
657 ; Path to the authorized_keys file where the generate entries are placed.
658 ; It is possible to have multiple key files specified in `sshd_config` e.g.
659 ; AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
660 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
661
662 ; Command to execute the SSH wrapper. The binary is available in the
663 ; RhodeCode installation directory.
664 ; e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
665 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
666
667 ; Allow shell when executing the ssh-wrapper command
668 ssh.wrapper_cmd_allow_shell = false
669
670 ; Enables logging, and detailed output send back to the client during SSH
671 ; operations. Useful for debugging, shouldn't be used in production.
672 ssh.enable_debug_logging = true
673
674 ; Paths to binary executable, by default they are the names, but we can
675 ; override them if we want to use a custom one
676 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
677 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
678 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
679
680 ; Enables SSH key generator web interface. Disabling this still allows users
681 ; to add their own keys.
682 ssh.enable_ui_key_generator = true
683
684
685 ; #################
686 ; APPENLIGHT CONFIG
687 ; #################
688
689 ; Appenlight is tailored to work with RhodeCode, see
690 ; http://appenlight.rhodecode.com for details how to obtain an account
691
692 ; Appenlight integration enabled
463 693 appenlight = false
464 694
465 695 appenlight.server_url = https://api.appenlight.com
466 696 appenlight.api_key = YOUR_API_KEY
467 697 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
468 698
469 ## used for JS client
699 ; used for JS client
470 700 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
471 701
472 ## TWEAK AMOUNT OF INFO SENT HERE
702 ; TWEAK AMOUNT OF INFO SENT HERE
473 703
474 ## enables 404 error logging (default False)
704 ; enables 404 error logging (default False)
475 705 appenlight.report_404 = false
476 706
477 ## time in seconds after request is considered being slow (default 1)
707 ; time in seconds after request is considered being slow (default 1)
478 708 appenlight.slow_request_time = 1
479 709
480 ## record slow requests in application
481 ## (needs to be enabled for slow datastore recording and time tracking)
710 ; record slow requests in application
711 ; (needs to be enabled for slow datastore recording and time tracking)
482 712 appenlight.slow_requests = true
483 713
484 ## enable hooking to application loggers
714 ; enable hooking to application loggers
485 715 appenlight.logging = true
486 716
487 ## minimum log level for log capture
717 ; minimum log level for log capture
488 718 appenlight.logging.level = WARNING
489 719
490 ## send logs only from erroneous/slow requests
491 ## (saves API quota for intensive logging)
720 ; send logs only from erroneous/slow requests
721 ; (saves API quota for intensive logging)
492 722 appenlight.logging_on_error = false
493 723
494 ## list of additional keywords that should be grabbed from environ object
495 ## can be string with comma separated list of words in lowercase
496 ## (by default client will always send following info:
497 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
498 ## start with HTTP* this list be extended with additional keywords here
724 ; list of additional keywords that should be grabbed from environ object
725 ; can be string with comma separated list of words in lowercase
726 ; (by default client will always send following info:
727 ; 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
728 ; start with HTTP* this list be extended with additional keywords here
499 729 appenlight.environ_keys_whitelist =
500 730
501 ## list of keywords that should be blanked from request object
502 ## can be string with comma separated list of words in lowercase
503 ## (by default client will always blank keys that contain following words
504 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
505 ## this list be extended with additional keywords set here
731 ; list of keywords that should be blanked from request object
732 ; can be string with comma separated list of words in lowercase
733 ; (by default client will always blank keys that contain following words
734 ; 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
735 ; this list be extended with additional keywords set here
506 736 appenlight.request_keys_blacklist =
507 737
508 ## list of namespaces that should be ignores when gathering log entries
509 ## can be string with comma separated list of namespaces
510 ## (by default the client ignores own entries: appenlight_client.client)
738 ; list of namespaces that should be ignores when gathering log entries
739 ; can be string with comma separated list of namespaces
740 ; (by default the client ignores own entries: appenlight_client.client)
511 741 appenlight.log_namespace_blacklist =
512 742
513 # enable debug style page
514 debug_style = true
515
516 ###########################################
517 ### MAIN RHODECODE DATABASE CONFIG ###
518 ###########################################
519 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
520 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
521 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
522 # pymysql is an alternative driver for MySQL, use in case of problems with default one
523 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
524
525 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
526
527 # see sqlalchemy docs for other advanced settings
528
529 ## print the sql statements to output
530 sqlalchemy.db1.echo = false
531 ## recycle the connections after this amount of seconds
532 sqlalchemy.db1.pool_recycle = 3600
533 sqlalchemy.db1.convert_unicode = true
534
535 ## the number of connections to keep open inside the connection pool.
536 ## 0 indicates no limit
537 #sqlalchemy.db1.pool_size = 5
538
539 ## the number of connections to allow in connection pool "overflow", that is
540 ## connections that can be opened above and beyond the pool_size setting,
541 ## which defaults to five.
542 #sqlalchemy.db1.max_overflow = 10
543
544 ## Connection check ping, used to detect broken database connections
545 ## could be enabled to better handle cases if MySQL has gone away errors
546 #sqlalchemy.db1.ping_connection = true
547
548 ##################
549 ### VCS CONFIG ###
550 ##################
551 vcs.server.enable = true
552 vcs.server = localhost:9900
553
554 ## Web server connectivity protocol, responsible for web based VCS operations
555 ## Available protocols are:
556 ## `http` - use http-rpc backend (default)
557 vcs.server.protocol = http
558
559 ## Push/Pull operations protocol, available options are:
560 ## `http` - use http-rpc backend (default)
561 vcs.scm_app_implementation = http
562
563 ## Push/Pull operations hooks protocol, available options are:
564 ## `http` - use http-rpc backend (default)
565 vcs.hooks.protocol = http
566
567 ## Host on which this instance is listening for hooks. If vcsserver is in other location
568 ## this should be adjusted.
569 vcs.hooks.host = 127.0.0.1
570
571 vcs.server.log_level = debug
572 ## Start VCSServer with this instance as a subprocess, useful for development
573 vcs.start_server = false
574
575 ## List of enabled VCS backends, available options are:
576 ## `hg` - mercurial
577 ## `git` - git
578 ## `svn` - subversion
579 vcs.backends = hg, git, svn
580
581 vcs.connection_timeout = 3600
582 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
583 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
584 #vcs.svn.compatible_version = pre-1.8-compatible
585
586
587 ############################################################
588 ### Subversion proxy support (mod_dav_svn) ###
589 ### Maps RhodeCode repo groups into SVN paths for Apache ###
590 ############################################################
591 ## Enable or disable the config file generation.
592 svn.proxy.generate_config = false
593 ## Generate config file with `SVNListParentPath` set to `On`.
594 svn.proxy.list_parent_path = true
595 ## Set location and file name of generated config file.
596 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
597 ## alternative mod_dav config template. This needs to be a mako template
598 #svn.proxy.config_template = ~/.rccontrol/enterprise-1/custom_svn_conf.mako
599 ## Used as a prefix to the `Location` block in the generated config file.
600 ## In most cases it should be set to `/`.
601 svn.proxy.location_root = /
602 ## Command to reload the mod dav svn configuration on change.
603 ## Example: `/etc/init.d/apache2 reload` or /home/USER/apache_reload.sh
604 ## Make sure user who runs RhodeCode process is allowed to reload Apache
605 #svn.proxy.reload_cmd = /etc/init.d/apache2 reload
606 ## If the timeout expires before the reload command finishes, the command will
607 ## be killed. Setting it to zero means no timeout. Defaults to 10 seconds.
608 #svn.proxy.reload_timeout = 10
609
610 ############################################################
611 ### SSH Support Settings ###
612 ############################################################
613
614 ## Defines if a custom authorized_keys file should be created and written on
615 ## any change user ssh keys. Setting this to false also disables possibility
616 ## of adding SSH keys by users from web interface. Super admins can still
617 ## manage SSH Keys.
618 ssh.generate_authorized_keyfile = false
619
620 ## Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
621 # ssh.authorized_keys_ssh_opts =
622
623 ## Path to the authorized_keys file where the generate entries are placed.
624 ## It is possible to have multiple key files specified in `sshd_config` e.g.
625 ## AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
626 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
627
628 ## Command to execute the SSH wrapper. The binary is available in the
629 ## RhodeCode installation directory.
630 ## e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
631 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
632
633 ## Allow shell when executing the ssh-wrapper command
634 ssh.wrapper_cmd_allow_shell = false
635
636 ## Enables logging, and detailed output send back to the client during SSH
637 ## operations. Useful for debugging, shouldn't be used in production.
638 ssh.enable_debug_logging = true
639
640 ## Paths to binary executable, by default they are the names, but we can
641 ## override them if we want to use a custom one
642 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
643 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
644 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
645
646 ## Enables SSH key generator web interface. Disabling this still allows users
647 ## to add their own keys.
648 ssh.enable_ui_key_generator = true
649
650
651 ## Dummy marker to add new entries after.
652 ## Add any custom entries below. Please don't remove.
743 ; Dummy marker to add new entries after.
744 ; Add any custom entries below. Please don't remove this marker.
653 745 custom.conf = 1
654 746
655 747
656 ################################
657 ### LOGGING CONFIGURATION ####
658 ################################
748 ; #####################
749 ; LOGGING CONFIGURATION
750 ; #####################
659 751 [loggers]
660 752 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
661 753
662 754 [handlers]
663 755 keys = console, console_sql
664 756
665 757 [formatters]
666 758 keys = generic, color_formatter, color_formatter_sql
667 759
668 #############
669 ## LOGGERS ##
670 #############
760 ; #######
761 ; LOGGERS
762 ; #######
671 763 [logger_root]
672 764 level = NOTSET
673 765 handlers = console
674 766
675 767 [logger_sqlalchemy]
676 768 level = INFO
677 769 handlers = console_sql
678 770 qualname = sqlalchemy.engine
679 771 propagate = 0
680 772
681 773 [logger_beaker]
682 774 level = DEBUG
683 775 handlers =
684 776 qualname = beaker.container
685 777 propagate = 1
686 778
687 779 [logger_rhodecode]
688 780 level = DEBUG
689 781 handlers =
690 782 qualname = rhodecode
691 783 propagate = 1
692 784
693 785 [logger_ssh_wrapper]
694 786 level = DEBUG
695 787 handlers =
696 788 qualname = ssh_wrapper
697 789 propagate = 1
698 790
699 791 [logger_celery]
700 792 level = DEBUG
701 793 handlers =
702 794 qualname = celery
703 795
704 796
705 ##############
706 ## HANDLERS ##
707 ##############
797 ; ########
798 ; HANDLERS
799 ; ########
708 800
709 801 [handler_console]
710 802 class = StreamHandler
711 803 args = (sys.stderr, )
712 804 level = DEBUG
713 805 formatter = color_formatter
714 806
715 807 [handler_console_sql]
716 # "level = DEBUG" logs SQL queries and results.
717 # "level = INFO" logs SQL queries.
718 # "level = WARN" logs neither. (Recommended for production systems.)
808 ; "level = DEBUG" logs SQL queries and results.
809 ; "level = INFO" logs SQL queries.
810 ; "level = WARN" logs neither. (Recommended for production systems.)
719 811 class = StreamHandler
720 812 args = (sys.stderr, )
721 813 level = WARN
722 814 formatter = color_formatter_sql
723 815
724 ################
725 ## FORMATTERS ##
726 ################
816 ; ##########
817 ; FORMATTERS
818 ; ##########
727 819
728 820 [formatter_generic]
729 821 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
730 822 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
731 823 datefmt = %Y-%m-%d %H:%M:%S
732 824
733 825 [formatter_color_formatter]
734 826 class = rhodecode.lib.logging_formatter.ColorFormatter
735 827 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
736 828 datefmt = %Y-%m-%d %H:%M:%S
737 829
738 830 [formatter_color_formatter_sql]
739 831 class = rhodecode.lib.logging_formatter.ColorFormatterSql
740 832 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
741 833 datefmt = %Y-%m-%d %H:%M:%S
@@ -1,154 +1,265 b''
1 1 """
2 gunicorn config extension and hooks. Sets additional configuration that is
3 available post the .ini config.
4
5 - workers = ${cpu_number}
6 - threads = 1
7 - proc_name = ${gunicorn_proc_name}
8 - worker_class = sync
9 - worker_connections = 10
10 - max_requests = 1000
11 - max_requests_jitter = 30
12 - timeout = 21600
13
2 Gunicorn config extension and hooks. This config file adds some extra settings and memory management.
3 Gunicorn configuration should be managed by .ini files entries of RhodeCode or VCSServer
14 4 """
15 5
16 import multiprocessing
6 import gc
7 import os
17 8 import sys
9 import math
18 10 import time
19 import datetime
20 11 import threading
21 12 import traceback
13 import random
22 14 from gunicorn.glogging import Logger
23 15
24 16
17 def get_workers():
18 import multiprocessing
19 return multiprocessing.cpu_count() * 2 + 1
20
25 21 # GLOBAL
26 22 errorlog = '-'
27 23 accesslog = '-'
28 loglevel = 'debug'
29
30 # SECURITY
31
32 # The maximum size of HTTP request line in bytes.
33 # 0 for unlimited
34 limit_request_line = 0
35
36 # Limit the number of HTTP headers fields in a request.
37 # By default this value is 100 and can't be larger than 32768.
38 limit_request_fields = 10240
39
40 # Limit the allowed size of an HTTP request header field.
41 # Value is a positive number or 0.
42 # Setting it to 0 will allow unlimited header field sizes.
43 limit_request_field_size = 0
44
45
46 # Timeout for graceful workers restart.
47 # After receiving a restart signal, workers have this much time to finish
48 # serving requests. Workers still alive after the timeout (starting from the
49 # receipt of the restart signal) are force killed.
50 graceful_timeout = 30
51
52
53 # The number of seconds to wait for requests on a Keep-Alive connection.
54 # Generally set in the 1-5 seconds range.
55 keepalive = 2
56 24
57 25
58 26 # SERVER MECHANICS
59 27 # None == system temp dir
60 28 # worker_tmp_dir is recommended to be set to some tmpfs
61 29 worker_tmp_dir = None
62 30 tmp_upload_dir = None
63 31
64 32 # Custom log format
65 33 access_log_format = (
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"')
34 '%(t)s %(p)s INFO [GNCRN] %(h)-15s rqt:%(L)s %(s)s %(b)-6s "%(m)s:%(U)s %(q)s" usr:%(u)s "%(f)s" "%(a)s"')
67 35
68 36 # self adjust workers based on CPU count
69 # workers = multiprocessing.cpu_count() * 2 + 1
37 # workers = get_workers()
38
39
40 def _get_process_rss(pid=None):
41 try:
42 import psutil
43 if pid:
44 proc = psutil.Process(pid)
45 else:
46 proc = psutil.Process()
47 return proc.memory_info().rss
48 except Exception:
49 return None
70 50
71 51
72 def post_fork(server, worker):
73 server.log.info("[<%-10s>] WORKER spawned", worker.pid)
52 def _get_config(ini_path):
53
54 try:
55 import configparser
56 except ImportError:
57 import ConfigParser as configparser
58 try:
59 config = configparser.RawConfigParser()
60 config.read(ini_path)
61 return config
62 except Exception:
63 return None
64
65
66 def _time_with_offset(memory_usage_check_interval):
67 return time.time() - random.randint(0, memory_usage_check_interval/2.0)
74 68
75 69
76 70 def pre_fork(server, worker):
77 71 pass
78 72
79 73
74 def post_fork(server, worker):
75
76 # memory spec defaults
77 _memory_max_usage = 0
78 _memory_usage_check_interval = 60
79 _memory_usage_recovery_threshold = 0.8
80
81 ini_path = os.path.abspath(server.cfg.paste)
82 conf = _get_config(ini_path)
83
84 section = 'server:main'
85 if conf and conf.has_section(section):
86
87 if conf.has_option(section, 'memory_max_usage'):
88 _memory_max_usage = conf.getint(section, 'memory_max_usage')
89
90 if conf.has_option(section, 'memory_usage_check_interval'):
91 _memory_usage_check_interval = conf.getint(section, 'memory_usage_check_interval')
92
93 if conf.has_option(section, 'memory_usage_recovery_threshold'):
94 _memory_usage_recovery_threshold = conf.getfloat(section, 'memory_usage_recovery_threshold')
95
96 worker._memory_max_usage = _memory_max_usage
97 worker._memory_usage_check_interval = _memory_usage_check_interval
98 worker._memory_usage_recovery_threshold = _memory_usage_recovery_threshold
99
100 # register memory last check time, with some random offset so we don't recycle all
101 # at once
102 worker._last_memory_check_time = _time_with_offset(_memory_usage_check_interval)
103
104 if _memory_max_usage:
105 server.log.info("[%-10s] WORKER spawned with max memory set at %s", worker.pid,
106 _format_data_size(_memory_max_usage))
107 else:
108 server.log.info("[%-10s] WORKER spawned", worker.pid)
109
110
80 111 def pre_exec(server):
81 112 server.log.info("Forked child, re-executing.")
82 113
83 114
84 115 def on_starting(server):
85 server.log.info("Server is starting.")
116 server_lbl = '{} {}'.format(server.proc_name, server.address)
117 server.log.info("Server %s is starting.", server_lbl)
86 118
87 119
88 120 def when_ready(server):
89 server.log.info("Server is ready. Spawning workers")
121 server.log.info("Server %s is ready. Spawning workers", server)
90 122
91 123
92 124 def on_reload(server):
93 125 pass
94 126
95 127
128 def _format_data_size(size, unit="B", precision=1, binary=True):
129 """Format a number using SI units (kilo, mega, etc.).
130
131 ``size``: The number as a float or int.
132
133 ``unit``: The unit name in plural form. Examples: "bytes", "B".
134
135 ``precision``: How many digits to the right of the decimal point. Default
136 is 1. 0 suppresses the decimal point.
137
138 ``binary``: If false, use base-10 decimal prefixes (kilo = K = 1000).
139 If true, use base-2 binary prefixes (kibi = Ki = 1024).
140
141 ``full_name``: If false (default), use the prefix abbreviation ("k" or
142 "Ki"). If true, use the full prefix ("kilo" or "kibi"). If false,
143 use abbreviation ("k" or "Ki").
144
145 """
146
147 if not binary:
148 base = 1000
149 multiples = ('', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
150 else:
151 base = 1024
152 multiples = ('', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi')
153
154 sign = ""
155 if size > 0:
156 m = int(math.log(size, base))
157 elif size < 0:
158 sign = "-"
159 size = -size
160 m = int(math.log(size, base))
161 else:
162 m = 0
163 if m > 8:
164 m = 8
165
166 if m == 0:
167 precision = '%.0f'
168 else:
169 precision = '%%.%df' % precision
170
171 size = precision % (size / math.pow(base, m))
172
173 return '%s%s %s%s' % (sign, size.strip(), multiples[m], unit)
174
175
176 def _check_memory_usage(worker):
177 memory_max_usage = worker._memory_max_usage
178 if not memory_max_usage:
179 return
180
181 memory_usage_check_interval = worker._memory_usage_check_interval
182 memory_usage_recovery_threshold = memory_max_usage * worker._memory_usage_recovery_threshold
183
184 elapsed = time.time() - worker._last_memory_check_time
185 if elapsed > memory_usage_check_interval:
186 mem_usage = _get_process_rss()
187 if mem_usage and mem_usage > memory_max_usage:
188 worker.log.info(
189 "memory usage %s > %s, forcing gc",
190 _format_data_size(mem_usage), _format_data_size(memory_max_usage))
191 # Try to clean it up by forcing a full collection.
192 gc.collect()
193 mem_usage = _get_process_rss()
194 if mem_usage > memory_usage_recovery_threshold:
195 # Didn't clean up enough, we'll have to terminate.
196 worker.log.warning(
197 "memory usage %s > %s after gc, quitting",
198 _format_data_size(mem_usage), _format_data_size(memory_max_usage))
199 # This will cause worker to auto-restart itself
200 worker.alive = False
201 worker._last_memory_check_time = time.time()
202
203
96 204 def worker_int(worker):
97 worker.log.info("[<%-10s>] worker received INT or QUIT signal", worker.pid)
205 worker.log.info("[%-10s] worker received INT or QUIT signal", worker.pid)
98 206
99 207 # get traceback info, on worker crash
100 208 id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
101 209 code = []
102 210 for thread_id, stack in sys._current_frames().items():
103 211 code.append(
104 212 "\n# Thread: %s(%d)" % (id2name.get(thread_id, ""), thread_id))
105 213 for fname, lineno, name, line in traceback.extract_stack(stack):
106 214 code.append('File: "%s", line %d, in %s' % (fname, lineno, name))
107 215 if line:
108 216 code.append(" %s" % (line.strip()))
109 217 worker.log.debug("\n".join(code))
110 218
111 219
112 220 def worker_abort(worker):
113 worker.log.info("[<%-10s>] worker received SIGABRT signal", worker.pid)
221 worker.log.info("[%-10s] worker received SIGABRT signal", worker.pid)
114 222
115 223
116 224 def worker_exit(server, worker):
117 worker.log.info("[<%-10s>] worker exit", worker.pid)
225 worker.log.info("[%-10s] worker exit", worker.pid)
118 226
119 227
120 228 def child_exit(server, worker):
121 worker.log.info("[<%-10s>] worker child exit", worker.pid)
229 worker.log.info("[%-10s] worker child exit", worker.pid)
122 230
123 231
124 232 def pre_request(worker, req):
125 233 worker.start_time = time.time()
126 234 worker.log.debug(
127 235 "GNCRN PRE WORKER [cnt:%s]: %s %s", worker.nr, req.method, req.path)
128 236
129 237
130 238 def post_request(worker, req, environ, resp):
131 239 total_time = time.time() - worker.start_time
240 # Gunicorn sometimes has problems with reading the status_code
241 status_code = getattr(resp, 'status_code', '')
132 242 worker.log.debug(
133 "GNCRN POST WORKER [cnt:%s]: %s %s resp: %s, Load Time: %.3fs",
134 worker.nr, req.method, req.path, resp.status_code, total_time)
243 "GNCRN POST WORKER [cnt:%s]: %s %s resp: %s, Load Time: %.4fs",
244 worker.nr, req.method, req.path, status_code, total_time)
245 _check_memory_usage(worker)
135 246
136 247
137 248 class RhodeCodeLogger(Logger):
138 249 """
139 250 Custom Logger that allows some customization that gunicorn doesn't allow
140 251 """
141 252
142 253 datefmt = r"%Y-%m-%d %H:%M:%S"
143 254
144 255 def __init__(self, cfg):
145 256 Logger.__init__(self, cfg)
146 257
147 258 def now(self):
148 259 """ return date in RhodeCode Log format """
149 260 now = time.time()
150 261 msecs = int((now - long(now)) * 1000)
151 262 return time.strftime(self.datefmt, time.localtime(now)) + '.{0:03d}'.format(msecs)
152 263
153 264
154 265 logger_class = RhodeCodeLogger
This diff has been collapsed as it changes many lines, (912 lines changed) Show them Hide them
@@ -1,714 +1,784 b''
1
1 ## -*- coding: utf-8 -*-
2 2
3 ################################################################################
4 ## RHODECODE COMMUNITY EDITION CONFIGURATION ##
5 ################################################################################
3 ; #########################################
4 ; RHODECODE COMMUNITY EDITION CONFIGURATION
5 ; #########################################
6 6
7 7 [DEFAULT]
8 ## Debug flag sets all loggers to debug, and enables request tracking
8 ; Debug flag sets all loggers to debug, and enables request tracking
9 9 debug = false
10 10
11 ################################################################################
12 ## EMAIL CONFIGURATION ##
13 ## Uncomment and replace with the email address which should receive ##
14 ## any error reports after an application crash ##
15 ## Additionally these settings will be used by the RhodeCode mailing system ##
16 ################################################################################
11 ; ########################################################################
12 ; EMAIL CONFIGURATION
13 ; These settings will be used by the RhodeCode mailing system
14 ; ########################################################################
17 15
18 ## prefix all emails subjects with given prefix, helps filtering out emails
16 ; prefix all emails subjects with given prefix, helps filtering out emails
19 17 #email_prefix = [RhodeCode]
20 18
21 ## email FROM address all mails will be sent
19 ; email FROM address all mails will be sent
22 20 #app_email_from = rhodecode-noreply@localhost
23 21
24 22 #smtp_server = mail.server.com
25 23 #smtp_username =
26 24 #smtp_password =
27 25 #smtp_port =
28 26 #smtp_use_tls = false
29 27 #smtp_use_ssl = true
30 28
31 29 [server:main]
32 ## COMMON ##
30 ; COMMON HOST/IP CONFIG
33 31 host = 127.0.0.1
34 32 port = 5000
35 33
36 ###########################################################
37 ## WAITRESS WSGI SERVER - Recommended for Development ####
38 ###########################################################
34
35 ; ###########################
36 ; GUNICORN APPLICATION SERVER
37 ; ###########################
38
39 ; run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
40
41 ; Module to use, this setting shouldn't be changed
42 use = egg:gunicorn#main
43
44 ; Sets the number of process workers. More workers means more concurrent connections
45 ; RhodeCode can handle at the same time. Each additional worker also it increases
46 ; memory usage as each has it's own set of caches.
47 ; Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
48 ; than 8-10 unless for really big deployments .e.g 700-1000 users.
49 ; `instance_id = *` must be set in the [app:main] section below (which is the default)
50 ; when using more than 1 worker.
51 workers = 2
52
53 ; Gunicorn access log level
54 loglevel = info
55
56 ; Process name visible in process list
57 proc_name = rhodecode
58
59 ; Type of worker class, one of `sync`, `gevent`
60 ; Recommended type is `gevent`
61 worker_class = gevent
62
63 ; The maximum number of simultaneous clients per worker. Valid only for gevent
64 worker_connections = 10
65
66 ; Max number of requests that worker will handle before being gracefully restarted.
67 ; Prevents memory leaks, jitter adds variability so not all workers are restarted at once.
68 max_requests = 1000
69 max_requests_jitter = 30
39 70
40 #use = egg:waitress#main
41 ## number of worker threads
42 #threads = 5
43 ## MAX BODY SIZE 100GB
44 #max_request_body_size = 107374182400
45 ## Use poll instead of select, fixes file descriptors limits problems.
46 ## May not work on old windows systems.
47 #asyncore_use_poll = true
71 ; Amount of time a worker can spend with handling a request before it
72 ; gets killed and restarted. By default set to 21600 (6hrs)
73 ; Examples: 1800 (30min), 3600 (1hr), 7200 (2hr), 43200 (12h)
74 timeout = 21600
75
76 ; The maximum size of HTTP request line in bytes.
77 ; 0 for unlimited
78 limit_request_line = 0
79
80 ; Limit the number of HTTP headers fields in a request.
81 ; By default this value is 100 and can't be larger than 32768.
82 limit_request_fields = 32768
83
84 ; Limit the allowed size of an HTTP request header field.
85 ; Value is a positive number or 0.
86 ; Setting it to 0 will allow unlimited header field sizes.
87 limit_request_field_size = 0
88
89 ; Timeout for graceful workers restart.
90 ; After receiving a restart signal, workers have this much time to finish
91 ; serving requests. Workers still alive after the timeout (starting from the
92 ; receipt of the restart signal) are force killed.
93 ; Examples: 1800 (30min), 3600 (1hr), 7200 (2hr), 43200 (12h)
94 graceful_timeout = 3600
95
96 # The number of seconds to wait for requests on a Keep-Alive connection.
97 # Generally set in the 1-5 seconds range.
98 keepalive = 2
99
100 ; Maximum memory usage that each worker can use before it will receive a
101 ; graceful restart signal 0 = memory monitoring is disabled
102 ; Examples: 268435456 (256MB), 536870912 (512MB)
103 ; 1073741824 (1GB), 2147483648 (2GB), 4294967296 (4GB)
104 memory_max_usage = 0
105
106 ; How often in seconds to check for memory usage for each gunicorn worker
107 memory_usage_check_interval = 60
108
109 ; Threshold value for which we don't recycle worker if GarbageCollection
110 ; frees up enough resources. Before each restart we try to run GC on worker
111 ; in case we get enough free memory after that, restart will not happen.
112 memory_usage_recovery_threshold = 0.8
48 113
49 114
50 ##########################
51 ## GUNICORN WSGI SERVER ##
52 ##########################
53 ## run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
54
55 use = egg:gunicorn#main
56 ## Sets the number of process workers. More workers means more concurrent connections
57 ## RhodeCode can handle at the same time. Each additional worker also it increases
58 ## memory usage as each has it's own set of caches.
59 ## Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
60 ## than 8-10 unless for really big deployments .e.g 700-1000 users.
61 ## `instance_id = *` must be set in the [app:main] section below (which is the default)
62 ## when using more than 1 worker.
63 workers = 2
64 ## process name visible in process list
65 proc_name = rhodecode
66 ## type of worker class, one of sync, gevent
67 ## recommended for bigger setup is using of of other than sync one
68 worker_class = gevent
69 ## The maximum number of simultaneous clients. Valid only for Gevent
70 worker_connections = 10
71 ## max number of requests that worker will handle before being gracefully
72 ## restarted, could prevent memory leaks
73 max_requests = 1000
74 max_requests_jitter = 30
75 ## amount of time a worker can spend with handling a request before it
76 ## gets killed and restarted. Set to 6hrs
77 timeout = 21600
78
79
80 ## prefix middleware for RhodeCode.
81 ## recommended when using proxy setup.
82 ## allows to set RhodeCode under a prefix in server.
83 ## eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
84 ## And set your prefix like: `prefix = /custom_prefix`
85 ## be sure to also set beaker.session.cookie_path = /custom_prefix if you need
86 ## to make your cookies only work on prefix url
115 ; Prefix middleware for RhodeCode.
116 ; recommended when using proxy setup.
117 ; allows to set RhodeCode under a prefix in server.
118 ; eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
119 ; And set your prefix like: `prefix = /custom_prefix`
120 ; be sure to also set beaker.session.cookie_path = /custom_prefix if you need
121 ; to make your cookies only work on prefix url
87 122 [filter:proxy-prefix]
88 123 use = egg:PasteDeploy#prefix
89 124 prefix = /
90 125
91 126 [app:main]
92 ## The %(here)s variable will be replaced with the absolute path of parent directory
93 ## of this file
94 ## In addition ENVIRONMENT variables usage is possible, e.g
95 ## sqlalchemy.db1.url = {ENV_RC_DB_URL}
127 ; The %(here)s variable will be replaced with the absolute path of parent directory
128 ; of this file
129 ; In addition ENVIRONMENT variables usage is possible, e.g
130 ; sqlalchemy.db1.url = {ENV_RC_DB_URL}
96 131
97 132 use = egg:rhodecode-enterprise-ce
98 133
99 ## enable proxy prefix middleware, defined above
134 ; enable proxy prefix middleware, defined above
100 135 #filter-with = proxy-prefix
101 136
102 ## encryption key used to encrypt social plugin tokens,
103 ## remote_urls with credentials etc, if not set it defaults to
104 ## `beaker.session.secret`
137 ; encryption key used to encrypt social plugin tokens,
138 ; remote_urls with credentials etc, if not set it defaults to
139 ; `beaker.session.secret`
105 140 #rhodecode.encrypted_values.secret =
106 141
107 ## decryption strict mode (enabled by default). It controls if decryption raises
108 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
142 ; decryption strict mode (enabled by default). It controls if decryption raises
143 ; `SignatureVerificationError` in case of wrong key, or damaged encryption data.
109 144 #rhodecode.encrypted_values.strict = false
110 145
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.
146 ; Pick algorithm for encryption. Either fernet (more secure) or aes (default)
147 ; fernet is safer, and we strongly recommend switching to it.
148 ; Due to backward compatibility aes is used as default.
114 149 #rhodecode.encrypted_values.algorithm = fernet
115 150
116 ## return gzipped responses from RhodeCode (static files/application)
151 ; Return gzipped responses from RhodeCode (static files/application)
117 152 gzip_responses = false
118 153
119 ## auto-generate javascript routes file on startup
154 ; Auto-generate javascript routes file on startup
120 155 generate_js_files = false
121 156
122 ## System global default language.
123 ## All available languages: en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
157 ; System global default language.
158 ; All available languages: en (default), be, de, es, fr, it, ja, pl, pt, ru, zh
124 159 lang = en
125 160
126 ## Perform a full repository scan and import on each server start.
127 ## Settings this to true could lead to very long startup time.
161 ; Perform a full repository scan and import on each server start.
162 ; Settings this to true could lead to very long startup time.
128 163 startup.import_repos = false
129 164
130 ## Uncomment and set this path to use archive download cache.
131 ## Once enabled, generated archives will be cached at this location
132 ## and served from the cache during subsequent requests for the same archive of
133 ## the repository.
165 ; Uncomment and set this path to use archive download cache.
166 ; Once enabled, generated archives will be cached at this location
167 ; and served from the cache during subsequent requests for the same archive of
168 ; the repository.
134 169 #archive_cache_dir = /tmp/tarballcache
135 170
136 ## URL at which the application is running. This is used for Bootstrapping
137 ## requests in context when no web request is available. Used in ishell, or
138 ## SSH calls. Set this for events to receive proper url for SSH calls.
171 ; URL at which the application is running. This is used for Bootstrapping
172 ; requests in context when no web request is available. Used in ishell, or
173 ; SSH calls. Set this for events to receive proper url for SSH calls.
139 174 app.base_url = http://rhodecode.local
140 175
141 ## Unique application ID. Should be a random unique string for security.
176 ; Unique application ID. Should be a random unique string for security.
142 177 app_instance_uuid = rc-production
143 178
144 ## Cut off limit for large diffs (size in bytes). If overall diff size on
145 ## commit, or pull request exceeds this limit this diff will be displayed
146 ## partially. E.g 512000 == 512Kb
179 ; Cut off limit for large diffs (size in bytes). If overall diff size on
180 ; commit, or pull request exceeds this limit this diff will be displayed
181 ; partially. E.g 512000 == 512Kb
147 182 cut_off_limit_diff = 512000
148 183
149 ## Cut off limit for large files inside diffs (size in bytes). Each individual
150 ## file inside diff which exceeds this limit will be displayed partially.
151 ## E.g 128000 == 128Kb
184 ; Cut off limit for large files inside diffs (size in bytes). Each individual
185 ; file inside diff which exceeds this limit will be displayed partially.
186 ; E.g 128000 == 128Kb
152 187 cut_off_limit_file = 128000
153 188
154 ## use cached version of vcs repositories everywhere. Recommended to be `true`
189 ; Use cached version of vcs repositories everywhere. Recommended to be `true`
155 190 vcs_full_cache = true
156 191
157 ## Force https in RhodeCode, fixes https redirects, assumes it's always https.
158 ## Normally this is controlled by proper http flags sent from http server
192 ; Force https in RhodeCode, fixes https redirects, assumes it's always https.
193 ; Normally this is controlled by proper flags sent from http server such as Nginx or Apache
159 194 force_https = false
160 195
161 ## use Strict-Transport-Security headers
196 ; use Strict-Transport-Security headers
162 197 use_htsts = false
163 198
164 ## git rev filter option, --all is the default filter, if you need to
165 ## hide all refs in changelog switch this to --branches --tags
166 git_rev_filter = --branches --tags
167
168 # Set to true if your repos are exposed using the dumb protocol
199 ; Set to true if your repos are exposed using the dumb protocol
169 200 git_update_server_info = false
170 201
171 ## RSS/ATOM feed options
202 ; RSS/ATOM feed options
172 203 rss_cut_off_limit = 256000
173 204 rss_items_per_page = 10
174 205 rss_include_diff = false
175 206
176 ## gist URL alias, used to create nicer urls for gist. This should be an
177 ## url that does rewrites to _admin/gists/{gistid}.
178 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
179 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
207 ; gist URL alias, used to create nicer urls for gist. This should be an
208 ; url that does rewrites to _admin/gists/{gistid}.
209 ; example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
210 ; RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
180 211 gist_alias_url =
181 212
182 ## List of views (using glob pattern syntax) that AUTH TOKENS could be
183 ## used for access.
184 ## Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
185 ## came from the the logged in user who own this authentication token.
186 ## Additionally @TOKEN syntax can be used to bound the view to specific
187 ## authentication token. Such view would be only accessible when used together
188 ## with this authentication token
189 ##
190 ## list of all views can be found under `/_admin/permissions/auth_token_access`
191 ## The list should be "," separated and on a single line.
192 ##
193 ## Most common views to enable:
213 ; List of views (using glob pattern syntax) that AUTH TOKENS could be
214 ; used for access.
215 ; Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
216 ; came from the the logged in user who own this authentication token.
217 ; Additionally @TOKEN syntax can be used to bound the view to specific
218 ; authentication token. Such view would be only accessible when used together
219 ; with this authentication token
220 ; list of all views can be found under `/_admin/permissions/auth_token_access`
221 ; The list should be "," separated and on a single line.
222 ; Most common views to enable:
223
194 224 # RepoCommitsView:repo_commit_download
195 225 # RepoCommitsView:repo_commit_patch
196 226 # RepoCommitsView:repo_commit_raw
197 227 # RepoCommitsView:repo_commit_raw@TOKEN
198 228 # RepoFilesView:repo_files_diff
199 229 # RepoFilesView:repo_archivefile
200 230 # RepoFilesView:repo_file_raw
201 231 # GistView:*
202 232 api_access_controllers_whitelist =
203 233
204 ## Default encoding used to convert from and to unicode
205 ## can be also a comma separated list of encoding in case of mixed encodings
234 ; Default encoding used to convert from and to unicode
235 ; can be also a comma separated list of encoding in case of mixed encodings
206 236 default_encoding = UTF-8
207 237
208 ## instance-id prefix
209 ## a prefix key for this instance used for cache invalidation when running
210 ## multiple instances of RhodeCode, make sure it's globally unique for
211 ## all running RhodeCode instances. Leave empty if you don't use it
238 ; instance-id prefix
239 ; a prefix key for this instance used for cache invalidation when running
240 ; multiple instances of RhodeCode, make sure it's globally unique for
241 ; all running RhodeCode instances. Leave empty if you don't use it
212 242 instance_id =
213 243
214 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
215 ## of an authentication plugin also if it is disabled by it's settings.
216 ## This could be useful if you are unable to log in to the system due to broken
217 ## authentication settings. Then you can enable e.g. the internal RhodeCode auth
218 ## module to log in again and fix the settings.
219 ##
220 ## Available builtin plugin IDs (hash is part of the ID):
221 ## egg:rhodecode-enterprise-ce#rhodecode
222 ## egg:rhodecode-enterprise-ce#pam
223 ## egg:rhodecode-enterprise-ce#ldap
224 ## egg:rhodecode-enterprise-ce#jasig_cas
225 ## egg:rhodecode-enterprise-ce#headers
226 ## egg:rhodecode-enterprise-ce#crowd
244 ; Fallback authentication plugin. Set this to a plugin ID to force the usage
245 ; of an authentication plugin also if it is disabled by it's settings.
246 ; This could be useful if you are unable to log in to the system due to broken
247 ; authentication settings. Then you can enable e.g. the internal RhodeCode auth
248 ; module to log in again and fix the settings.
249 ; Available builtin plugin IDs (hash is part of the ID):
250 ; egg:rhodecode-enterprise-ce#rhodecode
251 ; egg:rhodecode-enterprise-ce#pam
252 ; egg:rhodecode-enterprise-ce#ldap
253 ; egg:rhodecode-enterprise-ce#jasig_cas
254 ; egg:rhodecode-enterprise-ce#headers
255 ; egg:rhodecode-enterprise-ce#crowd
256
227 257 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
228 258
229 ## alternative return HTTP header for failed authentication. Default HTTP
230 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
231 ## handling that causing a series of failed authentication calls.
232 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
233 ## This will be served instead of default 401 on bad authentication
259 ; Flag to control loading of legacy plugins in py:/path format
260 auth_plugin.import_legacy_plugins = true
261
262 ; alternative return HTTP header for failed authentication. Default HTTP
263 ; response is 401 HTTPUnauthorized. Currently HG clients have troubles with
264 ; handling that causing a series of failed authentication calls.
265 ; Set this variable to 403 to return HTTPForbidden, or any other HTTP code
266 ; This will be served instead of default 401 on bad authentication
234 267 auth_ret_code =
235 268
236 ## use special detection method when serving auth_ret_code, instead of serving
237 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
238 ## and then serve auth_ret_code to clients
269 ; use special detection method when serving auth_ret_code, instead of serving
270 ; ret_code directly, use 401 initially (Which triggers credentials prompt)
271 ; and then serve auth_ret_code to clients
239 272 auth_ret_code_detection = false
240 273
241 ## locking return code. When repository is locked return this HTTP code. 2XX
242 ## codes don't break the transactions while 4XX codes do
274 ; locking return code. When repository is locked return this HTTP code. 2XX
275 ; codes don't break the transactions while 4XX codes do
243 276 lock_ret_code = 423
244 277
245 ## allows to change the repository location in settings page
278 ; allows to change the repository location in settings page
246 279 allow_repo_location_change = true
247 280
248 ## allows to setup custom hooks in settings page
281 ; allows to setup custom hooks in settings page
249 282 allow_custom_hooks_settings = true
250 283
251 ## Generated license token required for EE edition license.
252 ## New generated token value can be found in Admin > settings > license page.
284 ; Generated license token required for EE edition license.
285 ; New generated token value can be found in Admin > settings > license page.
253 286 license_token =
254 287
255 ## supervisor connection uri, for managing supervisor and logs.
288 ; This flag hides sensitive information on the license page such as token, and license data
289 license.hide_license_info = false
290
291 ; supervisor connection uri, for managing supervisor and logs.
256 292 supervisor.uri =
257 ## supervisord group name/id we only want this RC instance to handle
293
294 ; supervisord group name/id we only want this RC instance to handle
258 295 supervisor.group_id = prod
259 296
260 ## Display extended labs settings
297 ; Display extended labs settings
261 298 labs_settings_active = true
262 299
263 ## Custom exception store path, defaults to TMPDIR
264 ## This is used to store exception from RhodeCode in shared directory
300 ; Custom exception store path, defaults to TMPDIR
301 ; This is used to store exception from RhodeCode in shared directory
265 302 #exception_tracker.store_path =
266 303
267 ## File store configuration. This is used to store and serve uploaded files
304 ; File store configuration. This is used to store and serve uploaded files
268 305 file_store.enabled = true
269 ## Storage backend, available options are: local
306
307 ; Storage backend, available options are: local
270 308 file_store.backend = local
271 ## path to store the uploaded binaries
309
310 ; path to store the uploaded binaries
272 311 file_store.storage_path = %(here)s/data/file_store
273 312
274 313
275 ####################################
276 ### CELERY CONFIG ####
277 ####################################
278 ## run: /path/to/celery worker \
279 ## -E --beat --app rhodecode.lib.celerylib.loader \
280 ## --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler \
281 ## --loglevel DEBUG --ini /path/to/rhodecode.ini
314 ; #############
315 ; CELERY CONFIG
316 ; #############
317
318 ; manually run celery: /path/to/celery worker -E --beat --app rhodecode.lib.celerylib.loader --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler --loglevel DEBUG --ini /path/to/rhodecode.ini
282 319
283 320 use_celery = false
284 321
285 ## connection url to the message broker (default rabbitmq)
286 celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
322 ; connection url to the message broker (default redis)
323 celery.broker_url = redis://localhost:6379/8
287 324
288 ## maximum tasks to execute before worker restart
325 ; rabbitmq example
326 #celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
327
328 ; maximum tasks to execute before worker restart
289 329 celery.max_tasks_per_child = 100
290 330
291 ## tasks will never be sent to the queue, but executed locally instead.
331 ; tasks will never be sent to the queue, but executed locally instead.
292 332 celery.task_always_eager = false
293 333
294 #####################################
295 ### DOGPILE CACHE ####
296 #####################################
297 ## Default cache dir for caches. Putting this into a ramdisk
298 ## can boost performance, eg. /tmpfs/data_ramdisk, however this directory might require
299 ## large amount of space
334 ; #############
335 ; DOGPILE CACHE
336 ; #############
337
338 ; Default cache dir for caches. Putting this into a ramdisk can boost performance.
339 ; eg. /tmpfs/data_ramdisk, however this directory might require large amount of space
300 340 cache_dir = %(here)s/data
301 341
302 ## `cache_perms` cache settings for permission tree, auth TTL.
342 ; *********************************************
343 ; `sql_cache_short` cache for heavy SQL queries
344 ; Only supported backend is `memory_lru`
345 ; *********************************************
346 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
347 rc_cache.sql_cache_short.expiration_time = 30
348
349
350 ; *****************************************************
351 ; `cache_repo_longterm` cache for repo object instances
352 ; Only supported backend is `memory_lru`
353 ; *****************************************************
354 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
355 ; by default we use 30 Days, cache is still invalidated on push
356 rc_cache.cache_repo_longterm.expiration_time = 2592000
357 ; max items in LRU cache, set to smaller number to save memory, and expire last used caches
358 rc_cache.cache_repo_longterm.max_size = 10000
359
360
361 ; *************************************************
362 ; `cache_perms` cache for permission tree, auth TTL
363 ; *************************************************
303 364 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
304 365 rc_cache.cache_perms.expiration_time = 300
366 ; file cache store path. Defaults to `cache_dir =` value or tempdir if both values are not set
367 #rc_cache.cache_perms.arguments.filename = /tmp/cache_perms.db
305 368
306 ## alternative `cache_perms` redis backend with distributed lock
369 ; alternative `cache_perms` redis backend with distributed lock
307 370 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
308 371 #rc_cache.cache_perms.expiration_time = 300
309 ## redis_expiration_time needs to be greater then expiration_time
372
373 ; redis_expiration_time needs to be greater then expiration_time
310 374 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
311 #rc_cache.cache_perms.arguments.socket_timeout = 30
375
312 376 #rc_cache.cache_perms.arguments.host = localhost
313 377 #rc_cache.cache_perms.arguments.port = 6379
314 378 #rc_cache.cache_perms.arguments.db = 0
315 ## more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
379 #rc_cache.cache_perms.arguments.socket_timeout = 30
380 ; more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
316 381 #rc_cache.cache_perms.arguments.distributed_lock = true
317 382
318 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
383
384 ; ***************************************************
385 ; `cache_repo` cache for file tree, Readme, RSS FEEDS
386 ; ***************************************************
319 387 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
320 388 rc_cache.cache_repo.expiration_time = 2592000
389 ; file cache store path. Defaults to `cache_dir =` value or tempdir if both values are not set
390 #rc_cache.cache_repo.arguments.filename = /tmp/cache_repo.db
321 391
322 ## alternative `cache_repo` redis backend with distributed lock
392 ; alternative `cache_repo` redis backend with distributed lock
323 393 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
324 394 #rc_cache.cache_repo.expiration_time = 2592000
325 ## redis_expiration_time needs to be greater then expiration_time
395
396 ; redis_expiration_time needs to be greater then expiration_time
326 397 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
327 #rc_cache.cache_repo.arguments.socket_timeout = 30
398
328 399 #rc_cache.cache_repo.arguments.host = localhost
329 400 #rc_cache.cache_repo.arguments.port = 6379
330 401 #rc_cache.cache_repo.arguments.db = 1
331 ## more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
402 #rc_cache.cache_repo.arguments.socket_timeout = 30
403 ; more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
332 404 #rc_cache.cache_repo.arguments.distributed_lock = true
333 405
334 ## cache settings for SQL queries, this needs to use memory type backend
335 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
336 rc_cache.sql_cache_short.expiration_time = 30
337 406
338 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
339 ## type backend as the objects kept are not pickle serializable
340 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
341 ## by default we use 96H, this is using invalidation on push anyway
342 rc_cache.cache_repo_longterm.expiration_time = 345600
343 ## max items in LRU cache, reduce this number to save memory, and expire last used
344 ## cached objects
345 rc_cache.cache_repo_longterm.max_size = 10000
407 ; ##############
408 ; BEAKER SESSION
409 ; ##############
346 410
347
348 ####################################
349 ### BEAKER SESSION ####
350 ####################################
351
352 ## .session.type is type of storage options for the session, current allowed
353 ## types are file, ext:memcached, ext:redis, ext:database, and memory (default).
411 ; beaker.session.type is type of storage options for the logged users sessions. Current allowed
412 ; types are file, ext:redis, ext:database, ext:memcached, and memory (default if not specified).
413 ; Fastest ones are Redis and ext:database
354 414 beaker.session.type = file
355 415 beaker.session.data_dir = %(here)s/data/sessions
356 416
357 ## redis sessions
417 ; Redis based sessions
358 418 #beaker.session.type = ext:redis
359 419 #beaker.session.url = redis://127.0.0.1:6379/2
360 420
361 ## db based session, fast, and allows easy management over logged in users
421 ; DB based session, fast, and allows easy management over logged in users
362 422 #beaker.session.type = ext:database
363 423 #beaker.session.table_name = db_session
364 424 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
365 425 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
366 426 #beaker.session.sa.pool_recycle = 3600
367 427 #beaker.session.sa.echo = false
368 428
369 429 beaker.session.key = rhodecode
370 430 beaker.session.secret = production-rc-uytcxaz
371 431 beaker.session.lock_dir = %(here)s/data/sessions/lock
372 432
373 ## Secure encrypted cookie. Requires AES and AES python libraries
374 ## you must disable beaker.session.secret to use this
433 ; Secure encrypted cookie. Requires AES and AES python libraries
434 ; you must disable beaker.session.secret to use this
375 435 #beaker.session.encrypt_key = key_for_encryption
376 436 #beaker.session.validate_key = validation_key
377 437
378 ## sets session as invalid(also logging out user) if it haven not been
379 ## accessed for given amount of time in seconds
438 ; Sets session as invalid (also logging out user) if it haven not been
439 ; accessed for given amount of time in seconds
380 440 beaker.session.timeout = 2592000
381 441 beaker.session.httponly = true
382 ## Path to use for the cookie. Set to prefix if you use prefix middleware
442
443 ; Path to use for the cookie. Set to prefix if you use prefix middleware
383 444 #beaker.session.cookie_path = /custom_prefix
384 445
385 ## uncomment for https secure cookie
446 ; Set https secure cookie
386 447 beaker.session.secure = false
387 448
388 ## auto save the session to not to use .save()
389 beaker.session.auto = false
390
391 ## default cookie expiration time in seconds, set to `true` to set expire
392 ## at browser close
449 ; default cookie expiration time in seconds, set to `true` to set expire
450 ; at browser close
393 451 #beaker.session.cookie_expires = 3600
394 452
395 ###################################
396 ## SEARCH INDEXING CONFIGURATION ##
397 ###################################
398 ## Full text search indexer is available in rhodecode-tools under
399 ## `rhodecode-tools index` command
453 ; #############################
454 ; SEARCH INDEXING CONFIGURATION
455 ; #############################
400 456
401 ## WHOOSH Backend, doesn't require additional services to run
402 ## it works good with few dozen repos
457 ; Full text search indexer is available in rhodecode-tools under
458 ; `rhodecode-tools index` command
459
460 ; WHOOSH Backend, doesn't require additional services to run
461 ; it works good with few dozen repos
403 462 search.module = rhodecode.lib.index.whoosh
404 463 search.location = %(here)s/data/index
405 464
406 ########################################
407 ### CHANNELSTREAM CONFIG ####
408 ########################################
409 ## channelstream enables persistent connections and live notification
410 ## in the system. It's also used by the chat system
465 ; ####################
466 ; CHANNELSTREAM CONFIG
467 ; ####################
468
469 ; channelstream enables persistent connections and live notification
470 ; in the system. It's also used by the chat system
411 471
412 472 channelstream.enabled = false
413 473
414 ## server address for channelstream server on the backend
474 ; server address for channelstream server on the backend
415 475 channelstream.server = 127.0.0.1:9800
416 476
417 ## location of the channelstream server from outside world
418 ## use ws:// for http or wss:// for https. This address needs to be handled
419 ## by external HTTP server such as Nginx or Apache
420 ## see Nginx/Apache configuration examples in our docs
477 ; location of the channelstream server from outside world
478 ; use ws:// for http or wss:// for https. This address needs to be handled
479 ; by external HTTP server such as Nginx or Apache
480 ; see Nginx/Apache configuration examples in our docs
421 481 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
422 482 channelstream.secret = secret
423 483 channelstream.history.location = %(here)s/channelstream_history
424 484
425 ## Internal application path that Javascript uses to connect into.
426 ## If you use proxy-prefix the prefix should be added before /_channelstream
485 ; Internal application path that Javascript uses to connect into.
486 ; If you use proxy-prefix the prefix should be added before /_channelstream
427 487 channelstream.proxy_path = /_channelstream
428 488
429 489
430 ###################################
431 ## APPENLIGHT CONFIG ##
432 ###################################
490 ; ##############################
491 ; MAIN RHODECODE DATABASE CONFIG
492 ; ##############################
493
494 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
495 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
496 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
497 ; pymysql is an alternative driver for MySQL, use in case of problems with default one
498 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
499
500 sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
501
502 ; see sqlalchemy docs for other advanced settings
503 ; print the sql statements to output
504 sqlalchemy.db1.echo = false
505
506 ; recycle the connections after this amount of seconds
507 sqlalchemy.db1.pool_recycle = 3600
508 sqlalchemy.db1.convert_unicode = true
509
510 ; the number of connections to keep open inside the connection pool.
511 ; 0 indicates no limit
512 #sqlalchemy.db1.pool_size = 5
513
514 ; The number of connections to allow in connection pool "overflow", that is
515 ; connections that can be opened above and beyond the pool_size setting,
516 ; which defaults to five.
517 #sqlalchemy.db1.max_overflow = 10
518
519 ; Connection check ping, used to detect broken database connections
520 ; could be enabled to better handle cases if MySQL has gone away errors
521 #sqlalchemy.db1.ping_connection = true
522
523 ; ##########
524 ; VCS CONFIG
525 ; ##########
526 vcs.server.enable = true
527 vcs.server = localhost:9900
528
529 ; Web server connectivity protocol, responsible for web based VCS operations
530 ; Available protocols are:
531 ; `http` - use http-rpc backend (default)
532 vcs.server.protocol = http
533
534 ; Push/Pull operations protocol, available options are:
535 ; `http` - use http-rpc backend (default)
536 vcs.scm_app_implementation = http
537
538 ; Push/Pull operations hooks protocol, available options are:
539 ; `http` - use http-rpc backend (default)
540 vcs.hooks.protocol = http
541
542 ; Host on which this instance is listening for hooks. If vcsserver is in other location
543 ; this should be adjusted.
544 vcs.hooks.host = 127.0.0.1
545
546 ; Start VCSServer with this instance as a subprocess, useful for development
547 vcs.start_server = false
548
549 ; List of enabled VCS backends, available options are:
550 ; `hg` - mercurial
551 ; `git` - git
552 ; `svn` - subversion
553 vcs.backends = hg, git, svn
554
555 ; Wait this number of seconds before killing connection to the vcsserver
556 vcs.connection_timeout = 3600
557
558 ; Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
559 ; Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
560 #vcs.svn.compatible_version = pre-1.8-compatible
561
433 562
434 ## Appenlight is tailored to work with RhodeCode, see
435 ## http://appenlight.com for details how to obtain an account
563 ; ####################################################
564 ; Subversion proxy support (mod_dav_svn)
565 ; Maps RhodeCode repo groups into SVN paths for Apache
566 ; ####################################################
567
568 ; Enable or disable the config file generation.
569 svn.proxy.generate_config = false
570
571 ; Generate config file with `SVNListParentPath` set to `On`.
572 svn.proxy.list_parent_path = true
573
574 ; Set location and file name of generated config file.
575 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
576
577 ; alternative mod_dav config template. This needs to be a valid mako template
578 ; Example template can be found in the source code:
579 ; rhodecode/apps/svn_support/templates/mod-dav-svn.conf.mako
580 #svn.proxy.config_template = ~/.rccontrol/enterprise-1/custom_svn_conf.mako
581
582 ; Used as a prefix to the `Location` block in the generated config file.
583 ; In most cases it should be set to `/`.
584 svn.proxy.location_root = /
585
586 ; Command to reload the mod dav svn configuration on change.
587 ; Example: `/etc/init.d/apache2 reload` or /home/USER/apache_reload.sh
588 ; Make sure user who runs RhodeCode process is allowed to reload Apache
589 #svn.proxy.reload_cmd = /etc/init.d/apache2 reload
590
591 ; If the timeout expires before the reload command finishes, the command will
592 ; be killed. Setting it to zero means no timeout. Defaults to 10 seconds.
593 #svn.proxy.reload_timeout = 10
594
595 ; ####################
596 ; SSH Support Settings
597 ; ####################
436 598
437 ## Appenlight integration enabled
599 ; Defines if a custom authorized_keys file should be created and written on
600 ; any change user ssh keys. Setting this to false also disables possibility
601 ; of adding SSH keys by users from web interface. Super admins can still
602 ; manage SSH Keys.
603 ssh.generate_authorized_keyfile = false
604
605 ; Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
606 # ssh.authorized_keys_ssh_opts =
607
608 ; Path to the authorized_keys file where the generate entries are placed.
609 ; It is possible to have multiple key files specified in `sshd_config` e.g.
610 ; AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
611 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
612
613 ; Command to execute the SSH wrapper. The binary is available in the
614 ; RhodeCode installation directory.
615 ; e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
616 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
617
618 ; Allow shell when executing the ssh-wrapper command
619 ssh.wrapper_cmd_allow_shell = false
620
621 ; Enables logging, and detailed output send back to the client during SSH
622 ; operations. Useful for debugging, shouldn't be used in production.
623 ssh.enable_debug_logging = false
624
625 ; Paths to binary executable, by default they are the names, but we can
626 ; override them if we want to use a custom one
627 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
628 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
629 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
630
631 ; Enables SSH key generator web interface. Disabling this still allows users
632 ; to add their own keys.
633 ssh.enable_ui_key_generator = true
634
635
636 ; #################
637 ; APPENLIGHT CONFIG
638 ; #################
639
640 ; Appenlight is tailored to work with RhodeCode, see
641 ; http://appenlight.rhodecode.com for details how to obtain an account
642
643 ; Appenlight integration enabled
438 644 appenlight = false
439 645
440 646 appenlight.server_url = https://api.appenlight.com
441 647 appenlight.api_key = YOUR_API_KEY
442 648 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
443 649
444 ## used for JS client
650 ; used for JS client
445 651 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
446 652
447 ## TWEAK AMOUNT OF INFO SENT HERE
653 ; TWEAK AMOUNT OF INFO SENT HERE
448 654
449 ## enables 404 error logging (default False)
655 ; enables 404 error logging (default False)
450 656 appenlight.report_404 = false
451 657
452 ## time in seconds after request is considered being slow (default 1)
658 ; time in seconds after request is considered being slow (default 1)
453 659 appenlight.slow_request_time = 1
454 660
455 ## record slow requests in application
456 ## (needs to be enabled for slow datastore recording and time tracking)
661 ; record slow requests in application
662 ; (needs to be enabled for slow datastore recording and time tracking)
457 663 appenlight.slow_requests = true
458 664
459 ## enable hooking to application loggers
665 ; enable hooking to application loggers
460 666 appenlight.logging = true
461 667
462 ## minimum log level for log capture
668 ; minimum log level for log capture
463 669 appenlight.logging.level = WARNING
464 670
465 ## send logs only from erroneous/slow requests
466 ## (saves API quota for intensive logging)
671 ; send logs only from erroneous/slow requests
672 ; (saves API quota for intensive logging)
467 673 appenlight.logging_on_error = false
468 674
469 ## list of additional keywords that should be grabbed from environ object
470 ## can be string with comma separated list of words in lowercase
471 ## (by default client will always send following info:
472 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
473 ## start with HTTP* this list be extended with additional keywords here
675 ; list of additional keywords that should be grabbed from environ object
676 ; can be string with comma separated list of words in lowercase
677 ; (by default client will always send following info:
678 ; 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
679 ; start with HTTP* this list be extended with additional keywords here
474 680 appenlight.environ_keys_whitelist =
475 681
476 ## list of keywords that should be blanked from request object
477 ## can be string with comma separated list of words in lowercase
478 ## (by default client will always blank keys that contain following words
479 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
480 ## this list be extended with additional keywords set here
682 ; list of keywords that should be blanked from request object
683 ; can be string with comma separated list of words in lowercase
684 ; (by default client will always blank keys that contain following words
685 ; 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
686 ; this list be extended with additional keywords set here
481 687 appenlight.request_keys_blacklist =
482 688
483 ## list of namespaces that should be ignores when gathering log entries
484 ## can be string with comma separated list of namespaces
485 ## (by default the client ignores own entries: appenlight_client.client)
689 ; list of namespaces that should be ignores when gathering log entries
690 ; can be string with comma separated list of namespaces
691 ; (by default the client ignores own entries: appenlight_client.client)
486 692 appenlight.log_namespace_blacklist =
487 693
488
489 ###########################################
490 ### MAIN RHODECODE DATABASE CONFIG ###
491 ###########################################
492 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
493 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
494 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
495 # pymysql is an alternative driver for MySQL, use in case of problems with default one
496 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
497
498 sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
499
500 # see sqlalchemy docs for other advanced settings
501
502 ## print the sql statements to output
503 sqlalchemy.db1.echo = false
504 ## recycle the connections after this amount of seconds
505 sqlalchemy.db1.pool_recycle = 3600
506 sqlalchemy.db1.convert_unicode = true
507
508 ## the number of connections to keep open inside the connection pool.
509 ## 0 indicates no limit
510 #sqlalchemy.db1.pool_size = 5
511
512 ## the number of connections to allow in connection pool "overflow", that is
513 ## connections that can be opened above and beyond the pool_size setting,
514 ## which defaults to five.
515 #sqlalchemy.db1.max_overflow = 10
516
517 ## Connection check ping, used to detect broken database connections
518 ## could be enabled to better handle cases if MySQL has gone away errors
519 #sqlalchemy.db1.ping_connection = true
520
521 ##################
522 ### VCS CONFIG ###
523 ##################
524 vcs.server.enable = true
525 vcs.server = localhost:9900
526
527 ## Web server connectivity protocol, responsible for web based VCS operations
528 ## Available protocols are:
529 ## `http` - use http-rpc backend (default)
530 vcs.server.protocol = http
531
532 ## Push/Pull operations protocol, available options are:
533 ## `http` - use http-rpc backend (default)
534 vcs.scm_app_implementation = http
535
536 ## Push/Pull operations hooks protocol, available options are:
537 ## `http` - use http-rpc backend (default)
538 vcs.hooks.protocol = http
539
540 ## Host on which this instance is listening for hooks. If vcsserver is in other location
541 ## this should be adjusted.
542 vcs.hooks.host = 127.0.0.1
543
544 vcs.server.log_level = info
545 ## Start VCSServer with this instance as a subprocess, useful for development
546 vcs.start_server = false
547
548 ## List of enabled VCS backends, available options are:
549 ## `hg` - mercurial
550 ## `git` - git
551 ## `svn` - subversion
552 vcs.backends = hg, git, svn
553
554 vcs.connection_timeout = 3600
555 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
556 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
557 #vcs.svn.compatible_version = pre-1.8-compatible
558
559
560 ############################################################
561 ### Subversion proxy support (mod_dav_svn) ###
562 ### Maps RhodeCode repo groups into SVN paths for Apache ###
563 ############################################################
564 ## Enable or disable the config file generation.
565 svn.proxy.generate_config = false
566 ## Generate config file with `SVNListParentPath` set to `On`.
567 svn.proxy.list_parent_path = true
568 ## Set location and file name of generated config file.
569 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
570 ## alternative mod_dav config template. This needs to be a mako template
571 #svn.proxy.config_template = ~/.rccontrol/enterprise-1/custom_svn_conf.mako
572 ## Used as a prefix to the `Location` block in the generated config file.
573 ## In most cases it should be set to `/`.
574 svn.proxy.location_root = /
575 ## Command to reload the mod dav svn configuration on change.
576 ## Example: `/etc/init.d/apache2 reload` or /home/USER/apache_reload.sh
577 ## Make sure user who runs RhodeCode process is allowed to reload Apache
578 #svn.proxy.reload_cmd = /etc/init.d/apache2 reload
579 ## If the timeout expires before the reload command finishes, the command will
580 ## be killed. Setting it to zero means no timeout. Defaults to 10 seconds.
581 #svn.proxy.reload_timeout = 10
582
583 ############################################################
584 ### SSH Support Settings ###
585 ############################################################
586
587 ## Defines if a custom authorized_keys file should be created and written on
588 ## any change user ssh keys. Setting this to false also disables possibility
589 ## of adding SSH keys by users from web interface. Super admins can still
590 ## manage SSH Keys.
591 ssh.generate_authorized_keyfile = false
592
593 ## Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
594 # ssh.authorized_keys_ssh_opts =
595
596 ## Path to the authorized_keys file where the generate entries are placed.
597 ## It is possible to have multiple key files specified in `sshd_config` e.g.
598 ## AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
599 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
600
601 ## Command to execute the SSH wrapper. The binary is available in the
602 ## RhodeCode installation directory.
603 ## e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
604 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
605
606 ## Allow shell when executing the ssh-wrapper command
607 ssh.wrapper_cmd_allow_shell = false
608
609 ## Enables logging, and detailed output send back to the client during SSH
610 ## operations. Useful for debugging, shouldn't be used in production.
611 ssh.enable_debug_logging = false
612
613 ## Paths to binary executable, by default they are the names, but we can
614 ## override them if we want to use a custom one
615 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
616 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
617 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
618
619 ## Enables SSH key generator web interface. Disabling this still allows users
620 ## to add their own keys.
621 ssh.enable_ui_key_generator = true
622
623
624 ## Dummy marker to add new entries after.
625 ## Add any custom entries below. Please don't remove.
694 ; Dummy marker to add new entries after.
695 ; Add any custom entries below. Please don't remove this marker.
626 696 custom.conf = 1
627 697
628 698
629 ################################
630 ### LOGGING CONFIGURATION ####
631 ################################
699 ; #####################
700 ; LOGGING CONFIGURATION
701 ; #####################
632 702 [loggers]
633 703 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
634 704
635 705 [handlers]
636 706 keys = console, console_sql
637 707
638 708 [formatters]
639 709 keys = generic, color_formatter, color_formatter_sql
640 710
641 #############
642 ## LOGGERS ##
643 #############
711 ; #######
712 ; LOGGERS
713 ; #######
644 714 [logger_root]
645 715 level = NOTSET
646 716 handlers = console
647 717
648 718 [logger_sqlalchemy]
649 719 level = INFO
650 720 handlers = console_sql
651 721 qualname = sqlalchemy.engine
652 722 propagate = 0
653 723
654 724 [logger_beaker]
655 725 level = DEBUG
656 726 handlers =
657 727 qualname = beaker.container
658 728 propagate = 1
659 729
660 730 [logger_rhodecode]
661 731 level = DEBUG
662 732 handlers =
663 733 qualname = rhodecode
664 734 propagate = 1
665 735
666 736 [logger_ssh_wrapper]
667 737 level = DEBUG
668 738 handlers =
669 739 qualname = ssh_wrapper
670 740 propagate = 1
671 741
672 742 [logger_celery]
673 743 level = DEBUG
674 744 handlers =
675 745 qualname = celery
676 746
677 747
678 ##############
679 ## HANDLERS ##
680 ##############
748 ; ########
749 ; HANDLERS
750 ; ########
681 751
682 752 [handler_console]
683 753 class = StreamHandler
684 754 args = (sys.stderr, )
685 755 level = INFO
686 756 formatter = generic
687 757
688 758 [handler_console_sql]
689 # "level = DEBUG" logs SQL queries and results.
690 # "level = INFO" logs SQL queries.
691 # "level = WARN" logs neither. (Recommended for production systems.)
759 ; "level = DEBUG" logs SQL queries and results.
760 ; "level = INFO" logs SQL queries.
761 ; "level = WARN" logs neither. (Recommended for production systems.)
692 762 class = StreamHandler
693 763 args = (sys.stderr, )
694 764 level = WARN
695 765 formatter = generic
696 766
697 ################
698 ## FORMATTERS ##
699 ################
767 ; ##########
768 ; FORMATTERS
769 ; ##########
700 770
701 771 [formatter_generic]
702 772 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
703 773 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
704 774 datefmt = %Y-%m-%d %H:%M:%S
705 775
706 776 [formatter_color_formatter]
707 777 class = rhodecode.lib.logging_formatter.ColorFormatter
708 778 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
709 779 datefmt = %Y-%m-%d %H:%M:%S
710 780
711 781 [formatter_color_formatter_sql]
712 782 class = rhodecode.lib.logging_formatter.ColorFormatterSql
713 783 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
714 784 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 /js/scripts.js /js/rhodecode-components.js
193 /js/scripts.min.js /js/rhodecode-components.js
194 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,24 +1,61 b''
1 1 .. _repo-admin-tasks:
2 2
3 3 Common Admin Tasks for Repositories
4 4 -----------------------------------
5 5
6 6
7 7 Manually Force Delete Repository
8 8 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
9 9
10 10 In case of attached forks or pull-requests repositories should be archived.
11 11 Here is how to force delete a repository and remove all dependent objects
12 12
13 13
14 14 .. code-block:: bash
15 :dedent: 1
15 16
16 17 # starts the ishell interactive prompt
17 18 $ rccontrol ishell enterprise-1
18 19
19 20 .. code-block:: python
21 :dedent: 1
20 22
21 23 In [4]: from rhodecode.model.repo import RepoModel
22 24 In [3]: repo = Repository.get_by_repo_name('test_repos/repo_with_prs')
23 25 In [5]: RepoModel().delete(repo, forks='detach', pull_requests='delete')
24 26 In [6]: Session().commit()
27
28
29 Below is a fully automated example to force delete repositories reading from a
30 file where each line is a repository name. This can be executed via simple CLI command
31 without entering the interactive shell.
32
33 Save the below content as a file named `repo_delete_task.py`
34
35
36 .. code-block:: python
37 :dedent: 1
38
39 from rhodecode.model.db import *
40 from rhodecode.model.repo import RepoModel
41 with open('delete_repos.txt', 'rb') as f:
42 # read all lines from file
43 repos = f.readlines()
44 for repo_name in repos:
45 repo_name = repo_name.strip() # cleanup the name just in case
46 repo = Repository.get_by_repo_name(repo_name)
47 if not repo:
48 raise Exception('Repo with name {} not found'.format(repo_name))
49 RepoModel().delete(repo, forks='detach', pull_requests='delete')
50 Session().commit()
51 print('Removed repository {}'.format(repo_name))
52
53
54 The code above will read the names of repositories from a file called `delete_repos.txt`
55 Each lines should represent a single name e.g `repo_name_1` or `repo_group/repo_name_2`
56
57 Run this line from CLI to execute the code from the `repo_delete_task.py` file and
58 exit the ishell after the execution::
59
60 echo "%run repo_delete_task.py" | rccontrol ishell Enterprise-1
61
@@ -1,192 +1,193 b''
1 1 Nginx Configuration Example
2 2 ---------------------------
3 3
4 4 Use the following example to configure Nginx as a your web server.
5 5
6 6
7 7 .. code-block:: nginx
8 8
9 9 ## Rate limiter for certain pages to prevent brute force attacks
10 10 limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s;
11 11
12 12 ## cache zone
13 13 proxy_cache_path /etc/nginx/nginx_cache levels=1:2 use_temp_path=off keys_zone=cache_zone:10m inactive=720h max_size=10g;
14 14
15 15 ## Custom log format
16 16 log_format log_custom '$remote_addr - $remote_user [$time_local] '
17 17 '"$request" $status $body_bytes_sent '
18 18 '"$http_referer" "$http_user_agent" '
19 19 '$request_time $upstream_response_time $pipe';
20 20
21 21 ## Define one or more upstreams (local RhodeCode instance) to connect to
22 22 upstream rc {
23 23 # Url to running RhodeCode instance.
24 24 # This is shown as `- URL: <host>` in output from rccontrol status.
25 25 server 127.0.0.1:10002;
26 26
27 27 # add more instances for load balancing
28 28 # server 127.0.0.1:10003;
29 29 # server 127.0.0.1:10004;
30 30 }
31 31
32 32 ## HTTP to HTTPS rewrite
33 33 server {
34 34 listen 80;
35 35 server_name rhodecode.myserver.com;
36 36
37 37 if ($http_host = rhodecode.myserver.com) {
38 38 rewrite (.*) https://rhodecode.myserver.com$1 permanent;
39 39 }
40 40 }
41 41
42 42 ## Optional gist alias server, for serving nicer GIST urls.
43 43 server {
44 44 listen 443;
45 45 server_name gist.myserver.com;
46 46 access_log /var/log/nginx/gist.access.log log_custom;
47 47 error_log /var/log/nginx/gist.error.log;
48 48
49 49 ssl on;
50 50 ssl_certificate gist.rhodecode.myserver.com.crt;
51 51 ssl_certificate_key gist.rhodecode.myserver.com.key;
52 52
53 53 ssl_session_timeout 5m;
54 54
55 55 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
56 56 ssl_prefer_server_ciphers on;
57 57 ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
58 58
59 59 ## Strict http prevents from https -> http downgrade
60 60 add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
61 61
62 62 ## Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
63 63 #ssl_dhparam /etc/nginx/ssl/dhparam.pem;
64 64
65 65 rewrite ^/(.+)$ https://rhodecode.myserver.com/_admin/gists/$1;
66 66 rewrite (.*) https://rhodecode.myserver.com/_admin/gists;
67 67 }
68 68
69 69
70 70 ## MAIN SSL enabled server
71 71 server {
72 72 listen 443 ssl http2;
73 73 server_name rhodecode.myserver.com;
74 74
75 75 access_log /var/log/nginx/rhodecode.access.log log_custom;
76 76 error_log /var/log/nginx/rhodecode.error.log;
77 77
78 78 ssl_certificate rhodecode.myserver.com.crt;
79 79 ssl_certificate_key rhodecode.myserver.com.key;
80 80
81 81 # enable session resumption to improve https performance
82 82 # http://vincent.bernat.im/en/blog/2011-ssl-session-reuse-rfc5077.html
83 83 ssl_session_cache shared:SSL:50m;
84 84 ssl_session_timeout 5m;
85 85
86 86 ## Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
87 87 #ssl_dhparam /etc/nginx/ssl/dhparam.pem;
88 88
89 89 # enables server-side protection from BEAST attacks
90 90 # http://blog.ivanristic.com/2013/09/is-beast-still-a-threat.html
91 91 ssl_prefer_server_ciphers on;
92 92
93 93 # disable SSLv3(enabled by default since nginx 0.8.19) since it's less secure then TLS http://en.wikipedia.org/wiki/Secure_Sockets_Layer#SSL_3.0
94 94 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
95 95
96 96 # ciphers chosen for forward secrecy and compatibility
97 97 # http://blog.ivanristic.com/2013/08/configuring-apache-nginx-and-openssl-for-forward-secrecy.html
98 98 ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
99 99
100 100 client_body_buffer_size 128k;
101 101 # maximum number and size of buffers for large headers to read from client request
102 102 large_client_header_buffers 16 256k;
103 103
104 104 ## uncomment to serve static files by Nginx, recommended for performance
105 105 # location /_static/rhodecode {
106 106 # gzip on;
107 107 # gzip_min_length 500;
108 108 # gzip_proxied any;
109 109 # gzip_comp_level 4;
110 110 # gzip_types text/css text/javascript text/xml text/plain text/x-component application/javascript application/json application/xml application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
111 111 # gzip_vary on;
112 112 # gzip_disable "msie6";
113 # expires 60d;
113 114 # alias /path/to/.rccontrol/community-1/static;
114 115 # alias /path/to/.rccontrol/enterprise-1/static;
115 116 # }
116 117
117 118 ## channelstream location handler, if channelstream live chat and notifications
118 119 ## are enable this will proxy the requests to channelstream websocket server
119 120 location /_channelstream {
120 121 rewrite /_channelstream/(.*) /$1 break;
121 122 gzip off;
122 123 tcp_nodelay off;
123 124
124 125 proxy_connect_timeout 10;
125 126 proxy_send_timeout 10m;
126 127 proxy_read_timeout 10m;
127 128
128 129 proxy_set_header Host $host;
129 130 proxy_set_header X-Real-IP $remote_addr;
130 131 proxy_set_header X-Url-Scheme $scheme;
131 132 proxy_set_header X-Forwarded-Proto $scheme;
132 133 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
133 134
134 135 proxy_http_version 1.1;
135 136 proxy_set_header Upgrade $http_upgrade;
136 137 proxy_set_header Connection "upgrade";
137 138
138 139 proxy_pass http://127.0.0.1:9800;
139 140 }
140 141
141 142 ## rate limit this endpoint to prevent login page brute-force attacks
142 143 location /_admin/login {
143 144 limit_req zone=req_limit burst=10 nodelay;
144 145 try_files $uri @rhodecode_http;
145 146 }
146 147
147 148 ## Special Cache for file store, make sure you enable this intentionally as
148 149 ## it could bypass upload files permissions
149 150 # location /_file_store/download {
150 151 #
151 152 # proxy_cache cache_zone;
152 153 # # ignore Set-Cookie
153 154 # proxy_ignore_headers Set-Cookie;
154 155 # proxy_ignore_headers Cookie;
155 156 #
156 157 # proxy_cache_key $host$uri$is_args$args;
157 158 # proxy_cache_methods GET;
158 159 #
159 160 # proxy_cache_bypass $http_cache_control;
160 161 # proxy_cache_valid 200 302 720h;
161 162 #
162 163 # proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
163 164 #
164 165 # # returns cache status in headers
165 166 # add_header X-Proxy-Cache $upstream_cache_status;
166 167 # add_header Cache-Control "public";
167 168 #
168 169 # proxy_cache_lock on;
169 170 # proxy_cache_lock_age 5m;
170 171 #
171 172 # proxy_pass http://rc;
172 173 #
173 174 # }
174 175
175 176 location / {
176 177 try_files $uri @rhodecode_http;
177 178 }
178 179
179 180 location @rhodecode_http {
180 181 # example of proxy.conf can be found in our docs.
181 182 include /etc/nginx/proxy.conf;
182 183 proxy_pass http://rc;
183 184 }
184 185
185 186 ## Custom 502 error page.
186 187 ## Will be displayed while RhodeCode server is turned off
187 188 error_page 502 /502.html;
188 189 location = /502.html {
189 190 #root /path/to/.rccontrol/community-1/static;
190 191 root /path/to/.rccontrol/enterprise-1/static;
191 192 }
192 193 } No newline at end of file
@@ -1,21 +1,22 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 11 tuning/tuning-gunicorn
12 tuning/tuning-vcs-memory-cache
12 tuning/tuning-vcs-server-memory-usage
13 tuning/tuning-rhodecode-memory-usage
13 14 tuning/tuning-user-sessions-performance
14 15 tuning/tuning-increase-db-performance
15 16 tuning/tuning-scale-horizontally-cluster
16 17 tuning/tuning-mount-cache-memory
17 18 tuning/tuning-change-encoding
18 19 tuning/tuning-change-large-file-dir
19 20 tuning/tuning-change-lfs-dir
20 21 tuning/tuning-hg-auth-loop
21 22
@@ -1,126 +1,118 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 use = egg:gunicorn#main
29 ## Sets the number of process workers. You must set `instance_id = *`
30 ## when this option is set to more than one worker, recommended
31 ## value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
32 ## The `instance_id = *` must be set in the [app:main] section below
33 workers = 4
34 ## process name
35 proc_name = rhodecode
36 ## type of worker class, one of sync, gevent
37 ## recommended for bigger setup is using of of other than sync one
38 worker_class = sync
39 ## The maximum number of simultaneous clients. Valid only for Gevent
40 #worker_connections = 10
41 ## max number of requests that worker will handle before being gracefully
42 ## restarted, could prevent memory leaks
43 max_requests = 1000
44 max_requests_jitter = 30
45 ## amount of time a worker can spend with handling a request tuning-change-lfs-dir.before it
46 ## gets killed and restarted. Set to 6hrs
47 timeout = 21600
28 ; Sets the number of process workers. More workers means more concurrent connections
29 ; RhodeCode can handle at the same time. Each additional worker also it increases
30 ; memory usage as each has it's own set of caches.
31 ; Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
32 ; than 8-10 unless for really big deployments .e.g 700-1000 users.
33 ; `instance_id = *` must be set in the [app:main] section below (which is the default)
34 ; when using more than 1 worker.
35 workers = 6
36
37 ; Type of worker class, one of `sync`, `gevent`
38 ; Use `gevent` for rhodecode
39 worker_class = gevent
40
41 ; The maximum number of simultaneous clients per worker. Valid only for gevent
42 worker_connections = 10
43
48 44
49 45 3. In the ``[app:main]`` section, set the ``instance_id`` property to ``*``.
50 46
51 47 .. code-block:: ini
52 48
53 49 # In the [app:main] section
54 50 [app:main]
55 51 # You must set `instance_id = *`
56 52 instance_id = *
57 53
58 54 4. Change the VCSServer workers too. Open the
59 55 :file:`home/{user}/.rccontrol/{instance-id}/vcsserver.ini` file.
60 56
61 57 5. In the ``[server:main]`` section, increase the number of Gunicorn
62 58 ``workers`` using the following formula :math:`(2 * Cores) + 1`.
63 59
64 60 .. code-block:: ini
65 61
66 ## run with gunicorn --log-config vcsserver.ini --paste vcsserver.ini
67 use = egg:gunicorn#main
68 ## Sets the number of process workers. Recommended
69 ## value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
70 workers = 4
71 ## process name
72 proc_name = rhodecode_vcsserver
73 ## type of worker class, currently `sync` is the only option allowed.
62 ; Sets the number of process workers. More workers means more concurrent connections
63 ; RhodeCode can handle at the same time. Each additional worker also it increases
64 ; memory usage as each has it's own set of caches.
65 ; Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
66 ; than 8-10 unless for really big deployments .e.g 700-1000 users.
67 ; `instance_id = *` must be set in the [app:main] section below (which is the default)
68 ; when using more than 1 worker.
69 workers = 8
70
71 ; Type of worker class, one of `sync`, `gevent`
72 ; Use `sync` for vcsserver
74 73 worker_class = sync
75 ## The maximum number of simultaneous clients. Valid only for Gevent
76 #worker_connections = 10
77 ## max number of requests that worker will handle before being gracefully
78 ## restarted, could prevent memory leaks
79 max_requests = 1000
80 max_requests_jitter = 30
81 ## amount of time a worker can spend with handling a request before it
82 ## gets killed and restarted. Set to 6hrs
83 timeout = 21600
74
84 75
85 76 6. Save your changes.
86 77 7. Restart your |RCE| instances, using the following command:
87 78
88 79 .. code-block:: bash
89 80
90 81 $ rccontrol restart '*'
91 82
92 83
93 84 Gunicorn Gevent Backend
94 85 -----------------------
95 86
96 87 Gevent is an asynchronous worker type for Gunicorn. It allows accepting multiple
97 88 connections on a single `Gunicorn`_ worker. This means you can handle 100s
98 89 of concurrent clones, or API calls using just few workers. A setting called
99 90 `worker_connections` defines on how many connections each worker can
100 91 handle using `Gevent`.
101 92
102 93
103 94 To enable `Gevent` on |RCE| do the following:
104 95
105 96
106 97 1. Open the :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
107 98 2. In the ``[server:main]`` section, change `worker_class` for Gunicorn.
108 99
109 100
110 101 .. code-block:: ini
111 102
112 ## type of worker class, one of sync, gevent
113 ## recommended for bigger setup is using of of other than sync one
103 ; Type of worker class, one of `sync`, `gevent`
104 ; Use `gevent` for rhodecode
114 105 worker_class = gevent
115 ## The maximum number of simultaneous clients. Valid only for Gevent
106
107 ; The maximum number of simultaneous clients per worker. Valid only for gevent
116 108 worker_connections = 30
117 109
118 110
119 111 .. note::
120 112
121 113 `Gevent` is currently only supported for Enterprise/Community instances.
122 VCSServer doesn't yet support gevent.
114 VCSServer doesn't support gevent.
123 115
124 116
125 117
126 118 .. _Gunicorn: http://gunicorn.org/
@@ -1,395 +1,396 b''
1 1 .. _scale-horizontal-cluster:
2 2
3 3
4 4 Scale Horizontally / RhodeCode Cluster
5 5 --------------------------------------
6 6
7 7 |RCE| is built in a way it support horizontal scaling across multiple machines.
8 8 There are three main pre-requisites for that:
9 9
10 10 - Shared storage that each machine can access. Using NFS or other shared storage system.
11 11 - Shared DB connection across machines. Using `MySQL`/`PostgreSQL` that each node can access.
12 12 - |RCE| user sessions and caches need to use a shared storage (e.g `Redis`_/`Memcached`)
13 13
14 14
15 15 Horizontal scaling means adding more machines or workers into your pool of
16 16 resources. Horizontally scaling |RCE| gives a huge performance increase,
17 17 especially under large traffic scenarios with a high number of requests.
18 18 This is very beneficial when |RCE| is serving many users simultaneously,
19 19 or if continuous integration servers are automatically pulling and pushing code.
20 20 It also adds High-Availability to your running system.
21 21
22 22
23 23 Cluster Overview
24 24 ^^^^^^^^^^^^^^^^
25 25
26 26 Below we'll present a configuration example that will use two separate nodes to serve
27 27 |RCE| in a load-balanced environment. The 3rd node will act as a shared storage/cache
28 28 and handle load-balancing. In addition 3rd node will be used as shared database instance.
29 29
30 30 This setup can be used both in Docker based configuration or with individual
31 31 physical/virtual machines. Using the 3rd node for Storage/Redis/PostgreSQL/Nginx is
32 32 optional. All those components can be installed on one of the two nodes used for |RCE|.
33 33 We'll use following naming for our nodes:
34 34
35 35 - `rc-node-1` (NFS, DB, Cache node)
36 36 - `rc-node-2` (Worker node1)
37 37 - `rc-node-3` (Worker node2)
38 38
39 39 Our shares NFS storage in the example is located on `/home/rcdev/storage` and
40 40 it's RW accessible on **each** node.
41 41
42 42 In this example we used certain recommended components, however many
43 43 of those can be replaced by other, in case your organization already uses them, for example:
44 44
45 45 - `MySQL`/`PostgreSQL`: Aren't replaceable and are the two only supported databases.
46 46 - `Nginx`_ on `rc-node-1` can be replaced by: `Hardware Load Balancer (F5)`, `Apache`_, `HA-Proxy` etc.
47 47 - `Nginx`_ on rc-node-2/3 acts as a reverse proxy and can be replaced by other HTTP server
48 48 acting as reverse proxy such as `Apache`_.
49 49 - `Redis`_ on `rc-node-1` can be replaced by: `Memcached`
50 50
51 51
52 52 Here's an overview what components should be installed/setup on each server in our example:
53 53
54 54 - **rc-node-1**:
55 55
56 56 - main storage acting as NFS host.
57 57 - `nginx` acting as a load-balancer.
58 58 - `postgresql-server` used for database and sessions.
59 59 - `redis-server` used for storing shared caches.
60 - optionally `rabbitmq-server` for `Celery` if used.
60 - optionally `rabbitmq-server` or `redis` for `Celery` if used.
61 61 - optionally if `Celery` is used Enterprise/Community instance + VCSServer.
62 62 - optionally mailserver that can be shared by other instances.
63 63 - optionally channelstream server to handle live communication for all instances.
64 64
65 65
66 66 - **rc-node-2/3**:
67 67
68 68 - `nginx` acting as a reverse proxy to handle requests to |RCE|.
69 69 - 1x RhodeCode Enterprise/Community instance.
70 70 - 1x VCSServer instance.
71 71 - optionally for testing connection: postgresql-client, redis-client (redis-tools).
72 72
73 73
74 74 Before we start here are few assumptions that should be fulfilled:
75 75
76 76 - make sure each node can access each other.
77 77 - make sure `Redis`_/`MySQL`/`PostgreSQL`/`RabbitMQ`_ are running on `rc-node-1`
78 78 - make sure both `rc-node-2`/`3` can access NFS storage with RW access
79 79 - make sure rc-node-2/3 can access `Redis`_/`PostgreSQL`, `MySQL` database on `rc-node-1`.
80 80 - make sure `Redis`_/Database/`RabbitMQ`_ are password protected and accessible only from rc-node-2/3.
81 81
82 82
83 83
84 84 Setup rc-node-2/3
85 85 ^^^^^^^^^^^^^^^^^
86 86
87 87 Initially before `rc-node-1` we'll configure both nodes 2 and 3 to operate as standalone
88 88 nodes with their own hostnames. Use a default installation settings, and use
89 89 the default local addresses (127.0.0.1) to configure VCSServer and Community/Enterprise instances.
90 90 All external connectivity will be handled by the reverse proxy (`Nginx`_ in our example).
91 91
92 92 This way we can ensure each individual host works,
93 93 accepts connections, or do some operations explicitly on chosen node.
94 94
95 95 In addition this would allow use to explicitly direct certain traffic to a node, e.g
96 96 CI server will only call directly `rc-node-3`. This should be done similar to normal
97 97 installation so check out `Nginx`_/`Apache`_ configuration example to configure each host.
98 98 Each one should already connect to shared database during installation.
99 99
100 100
101 101 1) Assuming our final url will be http://rc-node-1, Configure `instances_id`, `app.base_url`
102 102
103 103 a) On **rc-node-2** find the following settings and edit :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
104 104
105 105 .. code-block:: ini
106 106
107 107 ## required format is: *NAME-
108 108 instance_id = *rc-node-2-
109 109 app.base_url = http://rc-node-1
110 110
111 111
112 112 b) On **rc-node-3** find the following settings and edit :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
113 113
114 114 .. code-block:: ini
115 115
116 116 ## required format is: *NAME-
117 117 instance_id = *rc-node-3-
118 118 app.base_url = http://rc-node-1
119 119
120 120
121 121
122 122 2) Configure `User Session` to use a shared database. Example config that should be
123 123 changed on both **rc-node-2** and **rc-node-3** .
124 124 Edit :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
125 125
126 126 .. code-block:: ini
127 127
128 128 ####################################
129 129 ### BEAKER SESSION ####
130 130 ####################################
131 131
132 132 ## Disable the default `file` sessions
133 133 #beaker.session.type = file
134 134 #beaker.session.data_dir = %(here)s/data/sessions
135 135
136 136 ## use shared db based session, fast, and allows easy management over logged in users
137 137 beaker.session.type = ext:database
138 138 beaker.session.table_name = db_session
139 139 # use our rc-node-1 here
140 140 beaker.session.sa.url = postgresql://postgres:qweqwe@rc-node-1/rhodecode
141 141 beaker.session.sa.pool_recycle = 3600
142 142 beaker.session.sa.echo = false
143 143
144 144 In addition make sure both instances use the same `session.secret` so users have
145 145 persistent sessions across nodes. Please generate other one then in this example.
146 146
147 147 .. code-block:: ini
148 148
149 149 # use a unique generated long string
150 150 beaker.session.secret = 70e116cae2274656ba7265fd860aebbd
151 151
152 152 3) Configure stored cached/archive cache to our shared NFS `rc-node-1`
153 153
154 154 .. code-block:: ini
155 155
156 156 # note the `_` prefix that allows using a directory without
157 157 # remap and rescan checking for vcs inside it.
158 158 cache_dir = /home/rcdev/storage/_cache_dir/data
159 159 # note archive cache dir is disabled by default, however if you enable
160 160 # it also needs to be shared
161 161 #archive_cache_dir = /home/rcdev/storage/_tarball_cache_dir
162 162
163 163
164 164 4) Use shared exception store. Example config that should be
165 165 changed on both **rc-node-2** and **rc-node-3**, and also for VCSServer.
166 166 Edit :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` and
167 167 :file:`/home/{user}/.rccontrol/{vcsserver-instance-id}/vcsserver.ini`
168 168 and add/change following setting.
169 169
170 170 .. code-block:: ini
171 171
172 172 exception_tracker.store_path = /home/rcdev/storage/_exception_store_data
173 173
174 174
175 175 5) Change cache backends to use `Redis`_ based caches. Below full example config
176 176 that replaces default file-based cache to shared `Redis`_ with Distributed Lock.
177 177
178 178
179 179 .. code-block:: ini
180 180
181 181 #####################################
182 182 ### DOGPILE CACHE ####
183 183 #####################################
184 184
185 185 ## `cache_perms` cache settings for permission tree, auth TTL.
186 186 #rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
187 187 #rc_cache.cache_perms.expiration_time = 300
188 188
189 189 ## alternative `cache_perms` redis backend with distributed lock
190 190 rc_cache.cache_perms.backend = dogpile.cache.rc.redis
191 191 rc_cache.cache_perms.expiration_time = 300
192 192 ## redis_expiration_time needs to be greater then expiration_time
193 193 rc_cache.cache_perms.arguments.redis_expiration_time = 7200
194 194 rc_cache.cache_perms.arguments.socket_timeout = 30
195 195 rc_cache.cache_perms.arguments.host = rc-node-1
196 196 rc_cache.cache_perms.arguments.password = qweqwe
197 197 rc_cache.cache_perms.arguments.port = 6379
198 198 rc_cache.cache_perms.arguments.db = 0
199 199 rc_cache.cache_perms.arguments.distributed_lock = true
200 200
201 201 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
202 202 #rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
203 203 #rc_cache.cache_repo.expiration_time = 2592000
204 204
205 205 ## alternative `cache_repo` redis backend with distributed lock
206 206 rc_cache.cache_repo.backend = dogpile.cache.rc.redis
207 207 rc_cache.cache_repo.expiration_time = 2592000
208 208 ## redis_expiration_time needs to be greater then expiration_time
209 209 rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
210 210 rc_cache.cache_repo.arguments.socket_timeout = 30
211 211 rc_cache.cache_repo.arguments.host = rc-node-1
212 212 rc_cache.cache_repo.arguments.password = qweqwe
213 213 rc_cache.cache_repo.arguments.port = 6379
214 214 rc_cache.cache_repo.arguments.db = 1
215 215 rc_cache.cache_repo.arguments.distributed_lock = true
216 216
217 217 ## cache settings for SQL queries, this needs to use memory type backend
218 218 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
219 219 rc_cache.sql_cache_short.expiration_time = 30
220 220
221 221 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
222 222 ## type backend as the objects kept are not pickle serializable
223 223 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
224 224 ## by default we use 96H, this is using invalidation on push anyway
225 225 rc_cache.cache_repo_longterm.expiration_time = 345600
226 226 ## max items in LRU cache, reduce this number to save memory, and expire last used
227 227 ## cached objects
228 228 rc_cache.cache_repo_longterm.max_size = 10000
229 229
230 230
231 231 6) Configure `Nginx`_ as reverse proxy on `rc-node-2/3`:
232 232 Minimal `Nginx`_ config used:
233 233
234 234
235 235 .. code-block:: nginx
236 236
237 237 ## rate limiter for certain pages to prevent brute force attacks
238 238 limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s;
239 239
240 240 ## custom log format
241 241 log_format log_custom '$remote_addr - $remote_user [$time_local] '
242 242 '"$request" $status $body_bytes_sent '
243 243 '"$http_referer" "$http_user_agent" '
244 244 '$request_time $upstream_response_time $pipe';
245 245
246 246 server {
247 247 listen 80;
248 248 server_name rc-node-2;
249 249 #server_name rc-node-3;
250 250
251 251 access_log /var/log/nginx/rhodecode.access.log log_custom;
252 252 error_log /var/log/nginx/rhodecode.error.log;
253 253
254 254 # example of proxy.conf can be found in our docs.
255 255 include /etc/nginx/proxy.conf;
256 256
257 257 ## serve static files by Nginx, recommended for performance
258 258 location /_static/rhodecode {
259 259 gzip on;
260 260 gzip_min_length 500;
261 261 gzip_proxied any;
262 262 gzip_comp_level 4;
263 263 gzip_types text/css text/javascript text/xml text/plain text/x-component application/javascript application/json application/xml application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
264 264 gzip_vary on;
265 265 gzip_disable "msie6";
266 expires 60d;
266 267 #alias /home/rcdev/.rccontrol/community-1/static;
267 268 alias /home/rcdev/.rccontrol/enterprise-1/static;
268 269 }
269 270
270 271
271 272 location /_admin/login {
272 273 limit_req zone=req_limit burst=10 nodelay;
273 274 try_files $uri @rhode;
274 275 }
275 276
276 277 location / {
277 278 try_files $uri @rhode;
278 279 }
279 280
280 281 location @rhode {
281 282 # Url to running RhodeCode instance.
282 283 # This is shown as `- URL: <host>` in output from rccontrol status.
283 284 proxy_pass http://127.0.0.1:10020;
284 285 }
285 286
286 287 ## custom 502 error page. Will be displayed while RhodeCode server
287 288 ## is turned off
288 289 error_page 502 /502.html;
289 290 location = /502.html {
290 291 #root /home/rcdev/.rccontrol/community-1/static;
291 292 root /home/rcdev/.rccontrol/enterprise-1/static;
292 293 }
293 294 }
294 295
295 296
296 297 7) Optional: Full text search, in case you use `Whoosh` full text search we also need a
297 298 shared storage for the index. In our example our NFS is mounted at `/home/rcdev/storage`
298 299 which represents out storage so we can use the following:
299 300
300 301 .. code-block:: ini
301 302
302 303 # note the `_` prefix that allows using a directory without
303 304 # remap and rescan checking for vcs inside it.
304 305 search.location = /home/rcdev/storage/_index_data/index
305 306
306 307
307 308 .. note::
308 309
309 310 If you use ElasticSearch it's by default shared, and simply running ES node is
310 311 by default cluster compatible.
311 312
312 313
313 314 8) Optional: If you intend to use mailing all instances need to use either a shared
314 315 mailing node, or each will use individual local mail agent. Simply put node-1/2/3
315 316 needs to use same mailing configuration.
316 317
317 318
318 319
319 320 Setup rc-node-1
320 321 ^^^^^^^^^^^^^^^
321 322
322 323
323 324 Configure `Nginx`_ as Load Balancer to rc-node-2/3.
324 325 Minimal `Nginx`_ example below:
325 326
326 327 .. code-block:: nginx
327 328
328 329 ## define rc-cluster which contains a pool of our instances to connect to
329 330 upstream rc-cluster {
330 331 # rc-node-2/3 are stored in /etc/hosts with correct IP addresses
331 332 server rc-node-2:80;
332 333 server rc-node-3:80;
333 334 }
334 335
335 336 server {
336 337 listen 80;
337 338 server_name rc-node-1;
338 339
339 340 location / {
340 341 proxy_pass http://rc-cluster;
341 342 }
342 343 }
343 344
344 345
345 346 .. note::
346 347
347 348 You should configure your load balancing accordingly. We recommend writing
348 349 load balancing rules that will separate regular user traffic from
349 350 automated process traffic like continuous servers or build bots. Sticky sessions
350 351 are not required.
351 352
352 353
353 354 Show which instance handles a request
354 355 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
355 356
356 357 You can easily check if load-balancing is working as expected. Visit our main node
357 358 `rc-node-1` URL which at that point should already handle incoming requests and balance
358 359 it across node-2/3.
359 360
360 361 Add a special GET param `?showrcid=1` to show current instance handling your request.
361 362
362 363 For example: visiting url `http://rc-node-1/?showrcid=1` will show, in the bottom
363 364 of the screen` cluster instance info.
364 365 e.g: `RhodeCode instance id: rc-node-3-rc-node-3-3246`
365 366 which is generated from::
366 367
367 368 <NODE_HOSTNAME>-<INSTANCE_ID>-<WORKER_PID>
368 369
369 370
370 371 Using Celery with cluster
371 372 ^^^^^^^^^^^^^^^^^^^^^^^^^
372 373
373 374
374 375 If `Celery` is used we recommend setting also an instance of Enterprise/Community+VCSserver
375 on the node that is running `RabbitMQ`_. Those instances will be used to executed async
376 tasks on the `rc-node-1`. This is the most efficient setup. `Celery` usually
377 handles tasks such as sending emails, forking repositories, importing
376 on the node that is running `RabbitMQ`_ or `Redis`_. Those instances will be used to
377 executed async tasks on the `rc-node-1`. This is the most efficient setup.
378 `Celery` usually handles tasks such as sending emails, forking repositories, importing
378 379 repositories from external location etc. Using workers on instance that has
379 380 the direct access to disks used by NFS as well as email server gives noticeable
380 381 performance boost. Running local workers to the NFS storage results in faster
381 382 execution of forking large repositories or sending lots of emails.
382 383
383 384 Those instances need to be configured in the same way as for other nodes.
384 The instance in rc-node-1 can be added to the cluser, but we don't recommend doing it.
385 The instance in rc-node-1 can be added to the cluster, but we don't recommend doing it.
385 386 For best results let it be isolated to only executing `Celery` tasks in the cluster setup.
386 387
387 388
388 389 .. _Gunicorn: http://gunicorn.org/
389 390 .. _Whoosh: https://pypi.python.org/pypi/Whoosh/
390 391 .. _Elasticsearch: https://www.elastic.co/..
391 392 .. _RabbitMQ: http://www.rabbitmq.com/
392 393 .. _Nginx: http://nginx.io
393 394 .. _Apache: http://nginx.io
394 395 .. _Redis: http://redis.io
395 396
@@ -1,8 +1,26 b''
1 .. _adjust-vcs-mem-cache:
1 .. _adjust-vcs-server-mem:
2 2
3 VCSServer Memory Cache
3 VCSServer Memory Usage
4 4 ----------------------
5 5
6 The VCS Server mamory cache can be adjusted to work best with the resources
7 available to your |RCE| instance. If you find that memory resources are under
8 pressure, see the :ref:`vcs-server-maintain` section for details.
6 Starting from Version 4.18.X RhodeCode has a builtin memory monitor for gunicorn workers.
7 Enabling this can limit the maximum amount of memory system can use. Each worker
8 for VCS Server is monitored independently.
9 To enable Memory management make sure to have following settings inside `[app:main] section` of
10 :file:`home/{user}/.rccontrol/{instance-id}/vcsserver.ini` file.
11
12
13
14 ; Maximum memory usage that each worker can use before it will receive a
15 ; graceful restart signal 0 = memory monitoring is disabled
16 ; Examples: 268435456 (256MB), 536870912 (512MB)
17 ; 1073741824 (1GB), 2147483648 (2GB), 4294967296 (4GB)
18 memory_max_usage = 1073741824
19
20 ; How often in seconds to check for memory usage for each gunicorn worker
21 memory_usage_check_interval = 60
22
23 ; Threshold value for which we don't recycle worker if GarbageCollection
24 ; frees up enough resources. Before each restart we try to run GC on worker
25 ; in case we get enough free memory after that, restart will not happen.
26 memory_usage_recovery_threshold = 0.8
@@ -1,324 +1,379 b''
1 1 .. _vcs-server:
2 2
3 3 VCS Server Management
4 4 ---------------------
5 5
6 6 The VCS Server handles |RCE| backend functionality. You need to configure
7 7 a VCS Server to run with a |RCE| instance. If you do not, you will be missing
8 8 the connection between |RCE| and its |repos|. This will cause error messages
9 9 on the web interface. You can run your setup in the following configurations,
10 10 currently the best performance is one of following:
11 11
12 12 * One VCS Server per |RCE| instance.
13 13 * One VCS Server handling multiple instances.
14 14
15 15 .. important::
16 16
17 17 If your server locale settings are not correctly configured,
18 18 |RCE| and the VCS Server can run into issues. See this `Ask Ubuntu`_ post
19 19 which explains the problem and gives a solution.
20 20
21 21 For more information, see the following sections:
22 22
23 23 * :ref:`install-vcs`
24 24 * :ref:`config-vcs`
25 25 * :ref:`vcs-server-options`
26 26 * :ref:`vcs-server-versions`
27 27 * :ref:`vcs-server-maintain`
28 28 * :ref:`vcs-server-config-file`
29 29 * :ref:`svn-http`
30 30
31 31 .. _install-vcs:
32 32
33 33 VCS Server Installation
34 34 ^^^^^^^^^^^^^^^^^^^^^^^
35 35
36 36 To install a VCS Server, see
37 37 :ref:`Installing a VCS server <control:install-vcsserver>`.
38 38
39 39 .. _config-vcs:
40 40
41 41 Hooking |RCE| to its VCS Server
42 42 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
43 43
44 44 To configure a |RCE| instance to use a VCS server, see
45 45 :ref:`Configuring the VCS Server connection <control:manually-vcsserver-ini>`.
46 46
47 47 .. _vcs-server-options:
48 48
49 49 |RCE| VCS Server Options
50 50 ^^^^^^^^^^^^^^^^^^^^^^^^
51 51
52 52 The following list shows the available options on the |RCE| side of the
53 53 connection to the VCS Server. The settings are configured per
54 54 instance in the
55 55 :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
56 56
57 57 .. rst-class:: dl-horizontal
58 58
59 59 \vcs.backends <available-vcs-systems>
60 60 Set a comma-separated list of the |repo| options available from the
61 61 web interface. The default is ``hg, git, svn``,
62 62 which is all |repo| types available. The order of backends is also the
63 63 order backend will try to detect requests type.
64 64
65 65 \vcs.connection_timeout <seconds>
66 66 Set the length of time in seconds that the VCS Server waits for
67 67 requests to process. After the timeout expires,
68 68 the request is closed. The default is ``3600``. Set to a higher
69 69 number if you experience network latency, or timeout issues with very
70 70 large push/pull requests.
71 71
72 72 \vcs.server.enable <boolean>
73 73 Enable or disable the VCS Server. The available options are ``true`` or
74 74 ``false``. The default is ``true``.
75 75
76 76 \vcs.server <host:port>
77 77 Set the host, either hostname or IP Address, and port of the VCS server
78 78 you wish to run with your |RCE| instance.
79 79
80 80 .. code-block:: ini
81 81
82 82 ##################
83 83 ### VCS CONFIG ###
84 84 ##################
85 85 # set this line to match your VCS Server
86 86 vcs.server = 127.0.0.1:10004
87 87 # Set to False to disable the VCS Server
88 88 vcs.server.enable = True
89 89 vcs.backends = hg, git, svn
90 90 vcs.connection_timeout = 3600
91 91
92 92
93 93 .. _vcs-server-versions:
94 94
95 95 VCS Server Versions
96 96 ^^^^^^^^^^^^^^^^^^^
97 97
98 98 An updated version of the VCS Server is released with each |RCE| version. Use
99 99 the VCS Server number that matches with the |RCE| version to pair the
100 100 appropriate ones together. For |RCE| versions pre 3.3.0,
101 101 VCS Server 1.X.Y works with |RCE| 3.X.Y, for example:
102 102
103 103 * VCS Server 1.0.0 works with |RCE| 3.0.0
104 104 * VCS Server 1.2.2 works with |RCE| 3.2.2
105 105
106 106 For |RCE| versions post 3.3.0, the VCS Server and |RCE| version numbers
107 107 match, for example:
108 108
109 109 * VCS Server |release| works with |RCE| |release|
110 110
111 111 .. _vcs-server-maintain:
112 112
113 VCS Server Memory Optimization
114 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
113 VCS Server Cache Optimization
114 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
115 115
116 To optimize the VCS server to manage the cache and memory usage efficiently, you need to
117 configure the following options in the
118 :file:`/home/{user}/.rccontrol/{vcsserver-id}/vcsserver.ini` file. Once
119 configured, restart the VCS Server. By default we use an optimal settings, but in certain
120 conditions tunning expiration_time and max_size can affect memory usage and performance
116 To optimize the VCS server to manage the cache and memory usage efficiently, it's recommended to
117 configure the Redis backend for VCSServer caches.
118 Once configured, restart the VCS Server.
119
120 Make sure Redis is installed and running.
121 Open :file:`/home/{user}/.rccontrol/{vcsserver-id}/vcsserver.ini`
122 file and ensure the below settings for `repo_object` type cache are set:
121 123
122 124 .. code-block:: ini
123 125
124 ## cache region for storing repo_objects cache
125 rc_cache.repo_object.backend = dogpile.cache.rc.memory_lru
126 ; ensure the default file based cache is *commented out*
127 ##rc_cache.repo_object.backend = dogpile.cache.rc.file_namespace
128 ##rc_cache.repo_object.expiration_time = 2592000
126 129
127 ## cache auto-expires after N seconds, setting this to 0 disabled cache
128 rc_cache.repo_object.expiration_time = 300
130 ; `repo_object` cache settings for vcs methods for repositories
131 rc_cache.repo_object.backend = dogpile.cache.rc.redis_msgpack
129 132
130 ## max size of LRU, old values will be discarded if the size of cache reaches max_size
131 ## Sets the maximum number of items stored in the cache, before the cache
132 ## starts to be cleared.
133 ; cache auto-expires after N seconds
134 ; Examples: 86400 (1Day), 604800 (7Days), 1209600 (14Days), 2592000 (30days), 7776000 (90Days)
135 rc_cache.repo_object.expiration_time = 2592000
136
137 ; redis_expiration_time needs to be greater then expiration_time
138 rc_cache.repo_object.arguments.redis_expiration_time = 3592000
133 139
134 ## As a general rule of thumb, running this value at 120 resulted in a
135 ## 5GB cache. Running it at 240 resulted in a 9GB cache. Your results
136 ## will differ based on usage patterns and |repo| sizes.
137
138 ## Tweaking this value to run at a fairly constant memory load on your
139 ## server will help performance.
140
141 rc_cache.repo_object.max_size = 120
140 rc_cache.repo_object.arguments.host = localhost
141 rc_cache.repo_object.arguments.port = 6379
142 rc_cache.repo_object.arguments.db = 5
143 rc_cache.repo_object.arguments.socket_timeout = 30
144 ; more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
145 rc_cache.repo_object.arguments.distributed_lock = true
142 146
143 147
144 148 To clear the cache completely, you can restart the VCS Server.
145 149
146 150 .. important::
147 151
148 152 While the VCS Server handles a restart gracefully on the web interface,
149 153 it will drop connections during push/pull requests. So it is recommended
150 154 you only perform this when there is very little traffic on the instance.
151 155
152 156 Use the following example to restart your VCS Server,
153 157 for full details see the :ref:`RhodeCode Control CLI <control:rcc-cli>`.
154 158
155 159 .. code-block:: bash
156 160
157 161 $ rccontrol status
158 162
159 163 .. code-block:: vim
160 164
161 165 - NAME: vcsserver-1
162 166 - STATUS: RUNNING
163 167 logs:/home/ubuntu/.rccontrol/vcsserver-1/vcsserver.log
164 168 - VERSION: 4.7.2 VCSServer
165 169 - URL: http://127.0.0.1:10008
166 170 - CONFIG: /home/ubuntu/.rccontrol/vcsserver-1/vcsserver.ini
167 171
168 172 $ rccontrol restart vcsserver-1
169 173 Instance "vcsserver-1" successfully stopped.
170 174 Instance "vcsserver-1" successfully started.
171 175
172 176 .. _vcs-server-config-file:
173 177
174 178 VCS Server Configuration
175 179 ^^^^^^^^^^^^^^^^^^^^^^^^
176 180
177 181 You can configure settings for multiple VCS Servers on your
178 182 system using their individual configuration files. Use the following
179 183 properties inside the configuration file to set up your system. The default
180 184 location is :file:`home/{user}/.rccontrol/{vcsserver-id}/vcsserver.ini`.
181 185 For a more detailed explanation of the logger levers, see :ref:`debug-mode`.
182 186
183 187 .. rst-class:: dl-horizontal
184 188
185 189 \host <ip-address>
186 190 Set the host on which the VCS Server will run. VCSServer is not
187 191 protected by any authentication, so we *highly* recommend running it
188 192 under localhost ip that is `127.0.0.1`
189 193
190 194 \port <int>
191 195 Set the port number on which the VCS Server will be available.
192 196
193 \locale <locale_utf>
194 Set the locale the VCS Server expects.
195
196 \workers <int>
197 Set the number of process workers.Recommended
198 value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
199
200 \max_requests <int>
201 The maximum number of requests a worker will process before restarting.
202 Any value greater than zero will limit the number of requests a work
203 will process before automatically restarting. This is a simple method
204 to help limit the damage of memory leaks.
205
206 \max_requests_jitter <int>
207 The maximum jitter to add to the max_requests setting.
208 The jitter causes the restart per worker to be randomized by
209 randint(0, max_requests_jitter). This is intended to stagger worker
210 restarts to avoid all workers restarting at the same time.
211
212 197
213 198 .. note::
214 199
215 200 After making changes, you need to restart your VCS Server to pick them up.
216 201
217 202 .. code-block:: ini
218 203
219 ################################################################################
220 # RhodeCode VCSServer with HTTP Backend - configuration #
221 # #
222 ################################################################################
223
204 ; #################################
205 ; RHODECODE VCSSERVER CONFIGURATION
206 ; #################################
224 207
225 208 [server:main]
226 ## COMMON ##
209 ; COMMON HOST/IP CONFIG
227 210 host = 127.0.0.1
228 211 port = 10002
229 212
230 ##########################
231 ## GUNICORN WSGI SERVER ##
232 ##########################
233 ## run with gunicorn --log-config vcsserver.ini --paste vcsserver.ini
213 ; ###########################
214 ; GUNICORN APPLICATION SERVER
215 ; ###########################
216
217 ; run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
218
219 ; Module to use, this setting shouldn't be changed
234 220 use = egg:gunicorn#main
235 ## Sets the number of process workers. Recommended
236 ## value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
237 workers = 3
238 ## process name
221
222 ; Sets the number of process workers. More workers means more concurrent connections
223 ; RhodeCode can handle at the same time. Each additional worker also it increases
224 ; memory usage as each has it's own set of caches.
225 ; Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
226 ; than 8-10 unless for really big deployments .e.g 700-1000 users.
227 ; `instance_id = *` must be set in the [app:main] section below (which is the default)
228 ; when using more than 1 worker.
229 workers = 6
230
231 ; Gunicorn access log level
232 loglevel = info
233
234 ; Process name visible in process list
239 235 proc_name = rhodecode_vcsserver
240 ## type of worker class, one of sync, gevent
241 ## recommended for bigger setup is using of of other than sync one
236
237 ; Type of worker class, one of sync, gevent
238 ; currently `sync` is the only option allowed.
242 239 worker_class = sync
243 ## The maximum number of simultaneous clients. Valid only for Gevent
244 #worker_connections = 10
245 ## max number of requests that worker will handle before being gracefully
246 ## restarted, could prevent memory leaks
240
241 ; The maximum number of simultaneous clients. Valid only for gevent
242 worker_connections = 10
243
244 ; Max number of requests that worker will handle before being gracefully restarted.
245 ; Prevents memory leaks, jitter adds variability so not all workers are restarted at once.
247 246 max_requests = 1000
248 247 max_requests_jitter = 30
249 ## amount of time a worker can spend with handling a request before it
250 ## gets killed and restarted. Set to 6hrs
248
249 ; Amount of time a worker can spend with handling a request before it
250 ; gets killed and restarted. By default set to 21600 (6hrs)
251 ; Examples: 1800 (30min), 3600 (1hr), 7200 (2hr), 43200 (12h)
251 252 timeout = 21600
252 253
254 ; The maximum size of HTTP request line in bytes.
255 ; 0 for unlimited
256 limit_request_line = 0
257
258 ; Limit the number of HTTP headers fields in a request.
259 ; By default this value is 100 and can't be larger than 32768.
260 limit_request_fields = 32768
261
262 ; Limit the allowed size of an HTTP request header field.
263 ; Value is a positive number or 0.
264 ; Setting it to 0 will allow unlimited header field sizes.
265 limit_request_field_size = 0
266
267 ; Timeout for graceful workers restart.
268 ; After receiving a restart signal, workers have this much time to finish
269 ; serving requests. Workers still alive after the timeout (starting from the
270 ; receipt of the restart signal) are force killed.
271 ; Examples: 1800 (30min), 3600 (1hr), 7200 (2hr), 43200 (12h)
272 graceful_timeout = 3600
273
274 # The number of seconds to wait for requests on a Keep-Alive connection.
275 # Generally set in the 1-5 seconds range.
276 keepalive = 2
277
278 ; Maximum memory usage that each worker can use before it will receive a
279 ; graceful restart signal 0 = memory monitoring is disabled
280 ; Examples: 268435456 (256MB), 536870912 (512MB)
281 ; 1073741824 (1GB), 2147483648 (2GB), 4294967296 (4GB)
282 memory_max_usage = 1073741824
283
284 ; How often in seconds to check for memory usage for each gunicorn worker
285 memory_usage_check_interval = 60
286
287 ; Threshold value for which we don't recycle worker if GarbageCollection
288 ; frees up enough resources. Before each restart we try to run GC on worker
289 ; in case we get enough free memory after that, restart will not happen.
290 memory_usage_recovery_threshold = 0.8
291
292
253 293 [app:main]
254 294 use = egg:rhodecode-vcsserver
255 295
256 296 pyramid.default_locale_name = en
257 297 pyramid.includes =
258 298
259 ## default locale used by VCS systems
299 ; default locale used by VCS systems
260 300 locale = en_US.UTF-8
261 301
262 # cache regions, please don't change
263 beaker.cache.regions = repo_object
264 beaker.cache.repo_object.type = memorylru
265 beaker.cache.repo_object.max_items = 100
266 # cache auto-expires after N seconds
267 beaker.cache.repo_object.expire = 300
268 beaker.cache.repo_object.enabled = true
302 ; #############
303 ; DOGPILE CACHE
304 ; #############
305
306 ; Default cache dir for caches. Putting this into a ramdisk can boost performance.
307 ; eg. /tmpfs/data_ramdisk, however this directory might require large amount of space
308 cache_dir = %(here)s/data
309
310 ; **********************************************************
311 ; `repo_object` cache with redis backend
312 ; recommended for larger instance, or for better performance
313 ; **********************************************************
314
315 ; `repo_object` cache settings for vcs methods for repositories
316 rc_cache.repo_object.backend = dogpile.cache.rc.redis_msgpack
269 317
318 ; cache auto-expires after N seconds
319 ; Examples: 86400 (1Day), 604800 (7Days), 1209600 (14Days), 2592000 (30days), 7776000 (90Days)
320 rc_cache.repo_object.expiration_time = 2592000
270 321
271 ################################
272 ### LOGGING CONFIGURATION ####
273 ################################
322 ; redis_expiration_time needs to be greater then expiration_time
323 rc_cache.repo_object.arguments.redis_expiration_time = 3592000
324
325 rc_cache.repo_object.arguments.host = localhost
326 rc_cache.repo_object.arguments.port = 6379
327 rc_cache.repo_object.arguments.db = 5
328 rc_cache.repo_object.arguments.socket_timeout = 30
329 ; more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
330 rc_cache.repo_object.arguments.distributed_lock = true
331
332 ; #####################
333 ; LOGGING CONFIGURATION
334 ; #####################
274 335 [loggers]
275 keys = root, vcsserver, beaker
336 keys = root, vcsserver
276 337
277 338 [handlers]
278 339 keys = console
279 340
280 341 [formatters]
281 342 keys = generic
282 343
283 #############
284 ## LOGGERS ##
285 #############
344 ; #######
345 ; LOGGERS
346 ; #######
286 347 [logger_root]
287 348 level = NOTSET
288 349 handlers = console
289 350
290 351 [logger_vcsserver]
291 352 level = DEBUG
292 353 handlers =
293 354 qualname = vcsserver
294 355 propagate = 1
295 356
296 [logger_beaker]
297 level = DEBUG
298 handlers =
299 qualname = beaker
300 propagate = 1
301 357
302
303 ##############
304 ## HANDLERS ##
305 ##############
358 ; ########
359 ; HANDLERS
360 ; ########
306 361
307 362 [handler_console]
308 363 class = StreamHandler
309 args = (sys.stderr,)
310 level = DEBUG
364 args = (sys.stderr, )
365 level = INFO
311 366 formatter = generic
312 367
313 ################
314 ## FORMATTERS ##
315 ################
368 ; ##########
369 ; FORMATTERS
370 ; ##########
316 371
317 372 [formatter_generic]
318 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
373 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
319 374 datefmt = %Y-%m-%d %H:%M:%S
320 375
321 376
322 377 .. _Subversion Red Book: http://svnbook.red-bean.com/en/1.7/svn-book.html#svn.ref.svn
323 378
324 379 .. _Ask Ubuntu: http://askubuntu.com/questions/162391/how-do-i-fix-my-locale-issue
@@ -1,434 +1,442 b''
1 1 .. _pull-request-methods-ref:
2 2
3 3 pull_request methods
4 4 ====================
5 5
6 6 close_pull_request
7 7 ------------------
8 8
9 9 .. py:function:: close_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>, message=<Optional:''>)
10 10
11 11 Close the pull request specified by `pullrequestid`.
12 12
13 13 :param apiuser: This is filled automatically from the |authtoken|.
14 14 :type apiuser: AuthUser
15 15 :param repoid: Repository name or repository ID to which the pull
16 16 request belongs.
17 17 :type repoid: str or int
18 18 :param pullrequestid: ID of the pull request to be closed.
19 19 :type pullrequestid: int
20 20 :param userid: Close the pull request as this user.
21 21 :type userid: Optional(str or int)
22 22 :param message: Optional message to close the Pull Request with. If not
23 23 specified it will be generated automatically.
24 24 :type message: Optional(str)
25 25
26 26 Example output:
27 27
28 28 .. code-block:: bash
29 29
30 30 "id": <id_given_in_input>,
31 31 "result": {
32 32 "pull_request_id": "<int>",
33 33 "close_status": "<str:status_lbl>,
34 34 "closed": "<bool>"
35 35 },
36 36 "error": null
37 37
38 38
39 39 comment_pull_request
40 40 --------------------
41 41
42 .. py:function:: comment_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, message=<Optional:None>, commit_id=<Optional:None>, status=<Optional:None>, comment_type=<Optional:u'note'>, resolves_comment_id=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
42 .. py:function:: comment_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, message=<Optional:None>, commit_id=<Optional:None>, status=<Optional:None>, comment_type=<Optional:u'note'>, resolves_comment_id=<Optional:None>, extra_recipients=<Optional:[]>, userid=<Optional:<OptionalAttr:apiuser>>)
43 43
44 44 Comment on the pull request specified with the `pullrequestid`,
45 45 in the |repo| specified by the `repoid`, and optionally change the
46 46 review status.
47 47
48 48 :param apiuser: This is filled automatically from the |authtoken|.
49 49 :type apiuser: AuthUser
50 50 :param repoid: Optional repository name or repository ID.
51 51 :type repoid: str or int
52 52 :param pullrequestid: The pull request ID.
53 53 :type pullrequestid: int
54 54 :param commit_id: Specify the commit_id for which to set a comment. If
55 55 given commit_id is different than latest in the PR status
56 56 change won't be performed.
57 57 :type commit_id: str
58 58 :param message: The text content of the comment.
59 59 :type message: str
60 60 :param status: (**Optional**) Set the approval status of the pull
61 61 request. One of: 'not_reviewed', 'approved', 'rejected',
62 62 'under_review'
63 63 :type status: str
64 64 :param comment_type: Comment type, one of: 'note', 'todo'
65 65 :type comment_type: Optional(str), default: 'note'
66 :param resolves_comment_id: id of comment which this one will resolve
67 :type resolves_comment_id: Optional(int)
68 :param extra_recipients: list of user ids or usernames to add
69 notifications for this comment. Acts like a CC for notification
70 :type extra_recipients: Optional(list)
66 71 :param userid: Comment on the pull request as this user
67 72 :type userid: Optional(str or int)
68 73
69 74 Example output:
70 75
71 76 .. code-block:: bash
72 77
73 78 id : <id_given_in_input>
74 79 result : {
75 80 "pull_request_id": "<Integer>",
76 81 "comment_id": "<Integer>",
77 82 "status": {"given": <given_status>,
78 83 "was_changed": <bool status_was_actually_changed> },
79 84 },
80 85 error : null
81 86
82 87
83 88 create_pull_request
84 89 -------------------
85 90
86 91 .. py:function:: create_pull_request(apiuser, source_repo, target_repo, source_ref, target_ref, owner=<Optional:<OptionalAttr:apiuser>>, title=<Optional:''>, description=<Optional:''>, description_renderer=<Optional:''>, reviewers=<Optional:None>)
87 92
88 93 Creates a new pull request.
89 94
90 95 Accepts refs in the following formats:
91 96
92 97 * branch:<branch_name>:<sha>
93 98 * branch:<branch_name>
94 99 * bookmark:<bookmark_name>:<sha> (Mercurial only)
95 100 * bookmark:<bookmark_name> (Mercurial only)
96 101
97 102 :param apiuser: This is filled automatically from the |authtoken|.
98 103 :type apiuser: AuthUser
99 104 :param source_repo: Set the source repository name.
100 105 :type source_repo: str
101 106 :param target_repo: Set the target repository name.
102 107 :type target_repo: str
103 108 :param source_ref: Set the source ref name.
104 109 :type source_ref: str
105 110 :param target_ref: Set the target ref name.
106 111 :type target_ref: str
107 112 :param owner: user_id or username
108 113 :type owner: Optional(str)
109 114 :param title: Optionally Set the pull request title, it's generated otherwise
110 115 :type title: str
111 116 :param description: Set the pull request description.
112 117 :type description: Optional(str)
113 118 :type description_renderer: Optional(str)
114 119 :param description_renderer: Set pull request renderer for the description.
115 120 It should be 'rst', 'markdown' or 'plain'. If not give default
116 121 system renderer will be used
117 122 :param reviewers: Set the new pull request reviewers list.
118 123 Reviewer defined by review rules will be added automatically to the
119 124 defined list.
120 125 :type reviewers: Optional(list)
121 126 Accepts username strings or objects of the format:
122 127
123 128 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
124 129
125 130
126 131 get_pull_request
127 132 ----------------
128 133
129 .. py:function:: get_pull_request(apiuser, pullrequestid, repoid=<Optional:None>)
134 .. py:function:: get_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, merge_state=<Optional:False>)
130 135
131 136 Get a pull request based on the given ID.
132 137
133 138 :param apiuser: This is filled automatically from the |authtoken|.
134 139 :type apiuser: AuthUser
135 140 :param repoid: Optional, repository name or repository ID from where
136 141 the pull request was opened.
137 142 :type repoid: str or int
138 143 :param pullrequestid: ID of the requested pull request.
139 144 :type pullrequestid: int
145 :param merge_state: Optional calculate merge state for each repository.
146 This could result in longer time to fetch the data
147 :type merge_state: bool
140 148
141 149 Example output:
142 150
143 151 .. code-block:: bash
144 152
145 153 "id": <id_given_in_input>,
146 154 "result":
147 155 {
148 156 "pull_request_id": "<pull_request_id>",
149 157 "url": "<url>",
150 158 "title": "<title>",
151 159 "description": "<description>",
152 160 "status" : "<status>",
153 161 "created_on": "<date_time_created>",
154 162 "updated_on": "<date_time_updated>",
155 163 "commit_ids": [
156 164 ...
157 165 "<commit_id>",
158 166 "<commit_id>",
159 167 ...
160 168 ],
161 169 "review_status": "<review_status>",
162 170 "mergeable": {
163 171 "status": "<bool>",
164 172 "message": "<message>",
165 173 },
166 174 "source": {
167 175 "clone_url": "<clone_url>",
168 176 "repository": "<repository_name>",
169 177 "reference":
170 178 {
171 179 "name": "<name>",
172 180 "type": "<type>",
173 181 "commit_id": "<commit_id>",
174 182 }
175 183 },
176 184 "target": {
177 185 "clone_url": "<clone_url>",
178 186 "repository": "<repository_name>",
179 187 "reference":
180 188 {
181 189 "name": "<name>",
182 190 "type": "<type>",
183 191 "commit_id": "<commit_id>",
184 192 }
185 193 },
186 194 "merge": {
187 195 "clone_url": "<clone_url>",
188 196 "reference":
189 197 {
190 198 "name": "<name>",
191 199 "type": "<type>",
192 200 "commit_id": "<commit_id>",
193 201 }
194 202 },
195 203 "author": <user_obj>,
196 204 "reviewers": [
197 205 ...
198 206 {
199 207 "user": "<user_obj>",
200 208 "review_status": "<review_status>",
201 209 }
202 210 ...
203 211 ]
204 212 },
205 213 "error": null
206 214
207 215
208 216 get_pull_request_comments
209 217 -------------------------
210 218
211 219 .. py:function:: get_pull_request_comments(apiuser, pullrequestid, repoid=<Optional:None>)
212 220
213 221 Get all comments of pull request specified with the `pullrequestid`
214 222
215 223 :param apiuser: This is filled automatically from the |authtoken|.
216 224 :type apiuser: AuthUser
217 225 :param repoid: Optional repository name or repository ID.
218 226 :type repoid: str or int
219 227 :param pullrequestid: The pull request ID.
220 228 :type pullrequestid: int
221 229
222 230 Example output:
223 231
224 232 .. code-block:: bash
225 233
226 234 id : <id_given_in_input>
227 235 result : [
228 236 {
229 237 "comment_author": {
230 238 "active": true,
231 239 "full_name_or_username": "Tom Gore",
232 240 "username": "admin"
233 241 },
234 242 "comment_created_on": "2017-01-02T18:43:45.533",
235 243 "comment_f_path": null,
236 244 "comment_id": 25,
237 245 "comment_lineno": null,
238 246 "comment_status": {
239 247 "status": "under_review",
240 248 "status_lbl": "Under Review"
241 249 },
242 250 "comment_text": "Example text",
243 251 "comment_type": null,
244 252 "pull_request_version": null
245 253 }
246 254 ],
247 255 error : null
248 256
249 257
250 258 get_pull_requests
251 259 -----------------
252 260
253 .. py:function:: get_pull_requests(apiuser, repoid, status=<Optional:'new'>, merge_state=<Optional:True>)
261 .. py:function:: get_pull_requests(apiuser, repoid, status=<Optional:'new'>, merge_state=<Optional:False>)
254 262
255 263 Get all pull requests from the repository specified in `repoid`.
256 264
257 265 :param apiuser: This is filled automatically from the |authtoken|.
258 266 :type apiuser: AuthUser
259 267 :param repoid: Optional repository name or repository ID.
260 268 :type repoid: str or int
261 269 :param status: Only return pull requests with the specified status.
262 270 Valid options are.
263 271 * ``new`` (default)
264 272 * ``open``
265 273 * ``closed``
266 274 :type status: str
267 275 :param merge_state: Optional calculate merge state for each repository.
268 276 This could result in longer time to fetch the data
269 277 :type merge_state: bool
270 278
271 279 Example output:
272 280
273 281 .. code-block:: bash
274 282
275 283 "id": <id_given_in_input>,
276 284 "result":
277 285 [
278 286 ...
279 287 {
280 288 "pull_request_id": "<pull_request_id>",
281 289 "url": "<url>",
282 290 "title" : "<title>",
283 291 "description": "<description>",
284 292 "status": "<status>",
285 293 "created_on": "<date_time_created>",
286 294 "updated_on": "<date_time_updated>",
287 295 "commit_ids": [
288 296 ...
289 297 "<commit_id>",
290 298 "<commit_id>",
291 299 ...
292 300 ],
293 301 "review_status": "<review_status>",
294 302 "mergeable": {
295 303 "status": "<bool>",
296 304 "message: "<message>",
297 305 },
298 306 "source": {
299 307 "clone_url": "<clone_url>",
300 308 "reference":
301 309 {
302 310 "name": "<name>",
303 311 "type": "<type>",
304 312 "commit_id": "<commit_id>",
305 313 }
306 314 },
307 315 "target": {
308 316 "clone_url": "<clone_url>",
309 317 "reference":
310 318 {
311 319 "name": "<name>",
312 320 "type": "<type>",
313 321 "commit_id": "<commit_id>",
314 322 }
315 323 },
316 324 "merge": {
317 325 "clone_url": "<clone_url>",
318 326 "reference":
319 327 {
320 328 "name": "<name>",
321 329 "type": "<type>",
322 330 "commit_id": "<commit_id>",
323 331 }
324 332 },
325 333 "author": <user_obj>,
326 334 "reviewers": [
327 335 ...
328 336 {
329 337 "user": "<user_obj>",
330 338 "review_status": "<review_status>",
331 339 }
332 340 ...
333 341 ]
334 342 }
335 343 ...
336 344 ],
337 345 "error": null
338 346
339 347
340 348 merge_pull_request
341 349 ------------------
342 350
343 351 .. py:function:: merge_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
344 352
345 353 Merge the pull request specified by `pullrequestid` into its target
346 354 repository.
347 355
348 356 :param apiuser: This is filled automatically from the |authtoken|.
349 357 :type apiuser: AuthUser
350 358 :param repoid: Optional, repository name or repository ID of the
351 359 target repository to which the |pr| is to be merged.
352 360 :type repoid: str or int
353 361 :param pullrequestid: ID of the pull request which shall be merged.
354 362 :type pullrequestid: int
355 363 :param userid: Merge the pull request as this user.
356 364 :type userid: Optional(str or int)
357 365
358 366 Example output:
359 367
360 368 .. code-block:: bash
361 369
362 370 "id": <id_given_in_input>,
363 371 "result": {
364 372 "executed": "<bool>",
365 373 "failure_reason": "<int>",
366 374 "merge_status_message": "<str>",
367 375 "merge_commit_id": "<merge_commit_id>",
368 376 "possible": "<bool>",
369 377 "merge_ref": {
370 378 "commit_id": "<commit_id>",
371 379 "type": "<type>",
372 380 "name": "<name>"
373 381 }
374 382 },
375 383 "error": null
376 384
377 385
378 386 update_pull_request
379 387 -------------------
380 388
381 389 .. py:function:: update_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, title=<Optional:''>, description=<Optional:''>, description_renderer=<Optional:''>, reviewers=<Optional:None>, update_commits=<Optional:None>)
382 390
383 391 Updates a pull request.
384 392
385 393 :param apiuser: This is filled automatically from the |authtoken|.
386 394 :type apiuser: AuthUser
387 395 :param repoid: Optional repository name or repository ID.
388 396 :type repoid: str or int
389 397 :param pullrequestid: The pull request ID.
390 398 :type pullrequestid: int
391 399 :param title: Set the pull request title.
392 400 :type title: str
393 401 :param description: Update pull request description.
394 402 :type description: Optional(str)
395 403 :type description_renderer: Optional(str)
396 404 :param description_renderer: Update pull request renderer for the description.
397 405 It should be 'rst', 'markdown' or 'plain'
398 406 :param reviewers: Update pull request reviewers list with new value.
399 407 :type reviewers: Optional(list)
400 408 Accepts username strings or objects of the format:
401 409
402 410 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
403 411
404 412 :param update_commits: Trigger update of commits for this pull request
405 413 :type: update_commits: Optional(bool)
406 414
407 415 Example output:
408 416
409 417 .. code-block:: bash
410 418
411 419 id : <id_given_in_input>
412 420 result : {
413 421 "msg": "Updated pull request `63`",
414 422 "pull_request": <pull_request_object>,
415 423 "updated_reviewers": {
416 424 "added": [
417 425 "username"
418 426 ],
419 427 "removed": []
420 428 },
421 429 "updated_commits": {
422 430 "added": [
423 431 "<sha1_hash>"
424 432 ],
425 433 "common": [
426 434 "<sha1_hash>",
427 435 "<sha1_hash>",
428 436 ],
429 437 "removed": []
430 438 }
431 439 }
432 440 error : null
433 441
434 442
@@ -1,1133 +1,1138 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 .. 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>>)
31 .. py:function:: comment_commit(apiuser, repoid, commit_id, message, status=<Optional:None>, comment_type=<Optional:u'note'>, resolves_comment_id=<Optional:None>, extra_recipients=<Optional:[]>, 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 :param resolves_comment_id: id of comment which this one will resolve
49 :type resolves_comment_id: Optional(int)
50 :param extra_recipients: list of user ids or usernames to add
51 notifications for this comment. Acts like a CC for notification
52 :type extra_recipients: Optional(list)
48 53 :param userid: Set the user name of the comment creator.
49 54 :type userid: Optional(str or int)
50 55
51 56 Example error output:
52 57
53 58 .. code-block:: bash
54 59
55 60 {
56 61 "id" : <id_given_in_input>,
57 62 "result" : {
58 63 "msg": "Commented on commit `<commit_id>` for repository `<repoid>`",
59 64 "status_change": null or <status>,
60 65 "success": true
61 66 },
62 67 "error" : null
63 68 }
64 69
65 70
66 71 create_repo
67 72 -----------
68 73
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>)
74 .. 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:None>, enable_statistics=<Optional:False>, enable_locking=<Optional:False>, enable_downloads=<Optional:False>, copy_permissions=<Optional:False>)
70 75
71 76 Creates a repository.
72 77
73 78 * If the repository name contains "/", repository will be created inside
74 79 a repository group or nested repository groups
75 80
76 81 For example "foo/bar/repo1" will create |repo| called "repo1" inside
77 82 group "foo/bar". You have to have permissions to access and write to
78 83 the last repository group ("bar" in this example)
79 84
80 85 This command can only be run using an |authtoken| with at least
81 86 permissions to create repositories, or write permissions to
82 87 parent repository groups.
83 88
84 89 :param apiuser: This is filled automatically from the |authtoken|.
85 90 :type apiuser: AuthUser
86 91 :param repo_name: Set the repository name.
87 92 :type repo_name: str
88 93 :param repo_type: Set the repository type; 'hg','git', or 'svn'.
89 94 :type repo_type: str
90 95 :param owner: user_id or username
91 96 :type owner: Optional(str)
92 97 :param description: Set the repository description.
93 98 :type description: Optional(str)
94 99 :param private: set repository as private
95 100 :type private: bool
96 101 :param clone_uri: set clone_uri
97 102 :type clone_uri: str
98 103 :param push_uri: set push_uri
99 104 :type push_uri: str
100 :param landing_rev: <rev_type>:<rev>
105 :param landing_rev: <rev_type>:<rev>, e.g branch:default, book:dev, rev:abcd
101 106 :type landing_rev: str
102 107 :param enable_locking:
103 108 :type enable_locking: bool
104 109 :param enable_downloads:
105 110 :type enable_downloads: bool
106 111 :param enable_statistics:
107 112 :type enable_statistics: bool
108 113 :param copy_permissions: Copy permission from group in which the
109 114 repository is being created.
110 115 :type copy_permissions: bool
111 116
112 117
113 118 Example output:
114 119
115 120 .. code-block:: bash
116 121
117 122 id : <id_given_in_input>
118 123 result: {
119 124 "msg": "Created new repository `<reponame>`",
120 125 "success": true,
121 126 "task": "<celery task id or None if done sync>"
122 127 }
123 128 error: null
124 129
125 130
126 131 Example error output:
127 132
128 133 .. code-block:: bash
129 134
130 135 id : <id_given_in_input>
131 136 result : null
132 137 error : {
133 138 'failed to create repository `<repo_name>`'
134 139 }
135 140
136 141
137 142 delete_repo
138 143 -----------
139 144
140 145 .. py:function:: delete_repo(apiuser, repoid, forks=<Optional:''>)
141 146
142 147 Deletes a repository.
143 148
144 149 * When the `forks` parameter is set it's possible to detach or delete
145 150 forks of deleted repository.
146 151
147 152 This command can only be run using an |authtoken| with admin
148 153 permissions on the |repo|.
149 154
150 155 :param apiuser: This is filled automatically from the |authtoken|.
151 156 :type apiuser: AuthUser
152 157 :param repoid: Set the repository name or repository ID.
153 158 :type repoid: str or int
154 159 :param forks: Set to `detach` or `delete` forks from the |repo|.
155 160 :type forks: Optional(str)
156 161
157 162 Example error output:
158 163
159 164 .. code-block:: bash
160 165
161 166 id : <id_given_in_input>
162 167 result: {
163 168 "msg": "Deleted repository `<reponame>`",
164 169 "success": true
165 170 }
166 171 error: null
167 172
168 173
169 174 fork_repo
170 175 ---------
171 176
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>)
177 .. py:function:: fork_repo(apiuser, repoid, fork_name, owner=<Optional:<OptionalAttr:apiuser>>, description=<Optional:''>, private=<Optional:False>, clone_uri=<Optional:None>, landing_rev=<Optional:None>, copy_permissions=<Optional:False>)
173 178
174 179 Creates a fork of the specified |repo|.
175 180
176 181 * If the fork_name contains "/", fork will be created inside
177 182 a repository group or nested repository groups
178 183
179 184 For example "foo/bar/fork-repo" will create fork called "fork-repo"
180 185 inside group "foo/bar". You have to have permissions to access and
181 186 write to the last repository group ("bar" in this example)
182 187
183 188 This command can only be run using an |authtoken| with minimum
184 189 read permissions of the forked repo, create fork permissions for an user.
185 190
186 191 :param apiuser: This is filled automatically from the |authtoken|.
187 192 :type apiuser: AuthUser
188 193 :param repoid: Set repository name or repository ID.
189 194 :type repoid: str or int
190 195 :param fork_name: Set the fork name, including it's repository group membership.
191 196 :type fork_name: str
192 197 :param owner: Set the fork owner.
193 198 :type owner: str
194 199 :param description: Set the fork description.
195 200 :type description: str
196 201 :param copy_permissions: Copy permissions from parent |repo|. The
197 202 default is False.
198 203 :type copy_permissions: bool
199 204 :param private: Make the fork private. The default is False.
200 205 :type private: bool
201 :param landing_rev: Set the landing revision. The default is tip.
206 :param landing_rev: Set the landing revision. E.g branch:default, book:dev, rev:abcd
202 207
203 208 Example output:
204 209
205 210 .. code-block:: bash
206 211
207 212 id : <id_for_response>
208 213 api_key : "<api_key>"
209 214 args: {
210 215 "repoid" : "<reponame or repo_id>",
211 216 "fork_name": "<forkname>",
212 217 "owner": "<username or user_id = Optional(=apiuser)>",
213 218 "description": "<description>",
214 219 "copy_permissions": "<bool>",
215 220 "private": "<bool>",
216 221 "landing_rev": "<landing_rev>"
217 222 }
218 223
219 224 Example error output:
220 225
221 226 .. code-block:: bash
222 227
223 228 id : <id_given_in_input>
224 229 result: {
225 230 "msg": "Created fork of `<reponame>` as `<forkname>`",
226 231 "success": true,
227 232 "task": "<celery task id or None if done sync>"
228 233 }
229 234 error: null
230 235
231 236
232 237 get_repo
233 238 --------
234 239
235 240 .. py:function:: get_repo(apiuser, repoid, cache=<Optional:True>)
236 241
237 242 Gets an existing repository by its name or repository_id.
238 243
239 244 The members section so the output returns users groups or users
240 245 associated with that repository.
241 246
242 247 This command can only be run using an |authtoken| with admin rights,
243 248 or users with at least read rights to the |repo|.
244 249
245 250 :param apiuser: This is filled automatically from the |authtoken|.
246 251 :type apiuser: AuthUser
247 252 :param repoid: The repository name or repository id.
248 253 :type repoid: str or int
249 254 :param cache: use the cached value for last changeset
250 255 :type: cache: Optional(bool)
251 256
252 257 Example output:
253 258
254 259 .. code-block:: bash
255 260
256 261 {
257 262 "error": null,
258 263 "id": <repo_id>,
259 264 "result": {
260 265 "clone_uri": null,
261 266 "created_on": "timestamp",
262 267 "description": "repo description",
263 268 "enable_downloads": false,
264 269 "enable_locking": false,
265 270 "enable_statistics": false,
266 271 "followers": [
267 272 {
268 273 "active": true,
269 274 "admin": false,
270 275 "api_key": "****************************************",
271 276 "api_keys": [
272 277 "****************************************"
273 278 ],
274 279 "email": "user@example.com",
275 280 "emails": [
276 281 "user@example.com"
277 282 ],
278 283 "extern_name": "rhodecode",
279 284 "extern_type": "rhodecode",
280 285 "firstname": "username",
281 286 "ip_addresses": [],
282 287 "language": null,
283 288 "last_login": "2015-09-16T17:16:35.854",
284 289 "lastname": "surname",
285 290 "user_id": <user_id>,
286 291 "username": "name"
287 292 }
288 293 ],
289 294 "fork_of": "parent-repo",
290 295 "landing_rev": [
291 296 "rev",
292 297 "tip"
293 298 ],
294 299 "last_changeset": {
295 300 "author": "User <user@example.com>",
296 301 "branch": "default",
297 302 "date": "timestamp",
298 303 "message": "last commit message",
299 304 "parents": [
300 305 {
301 306 "raw_id": "commit-id"
302 307 }
303 308 ],
304 309 "raw_id": "commit-id",
305 310 "revision": <revision number>,
306 311 "short_id": "short id"
307 312 },
308 313 "lock_reason": null,
309 314 "locked_by": null,
310 315 "locked_date": null,
311 316 "owner": "owner-name",
312 317 "permissions": [
313 318 {
314 319 "name": "super-admin-name",
315 320 "origin": "super-admin",
316 321 "permission": "repository.admin",
317 322 "type": "user"
318 323 },
319 324 {
320 325 "name": "owner-name",
321 326 "origin": "owner",
322 327 "permission": "repository.admin",
323 328 "type": "user"
324 329 },
325 330 {
326 331 "name": "user-group-name",
327 332 "origin": "permission",
328 333 "permission": "repository.write",
329 334 "type": "user_group"
330 335 }
331 336 ],
332 337 "private": true,
333 338 "repo_id": 676,
334 339 "repo_name": "user-group/repo-name",
335 340 "repo_type": "hg"
336 341 }
337 342 }
338 343
339 344
340 345 get_repo_changeset
341 346 ------------------
342 347
343 348 .. py:function:: get_repo_changeset(apiuser, repoid, revision, details=<Optional:'basic'>)
344 349
345 350 Returns information about a changeset.
346 351
347 352 Additionally parameters define the amount of details returned by
348 353 this function.
349 354
350 355 This command can only be run using an |authtoken| with admin rights,
351 356 or users with at least read rights to the |repo|.
352 357
353 358 :param apiuser: This is filled automatically from the |authtoken|.
354 359 :type apiuser: AuthUser
355 360 :param repoid: The repository name or repository id
356 361 :type repoid: str or int
357 362 :param revision: revision for which listing should be done
358 363 :type revision: str
359 364 :param details: details can be 'basic|extended|full' full gives diff
360 365 info details like the diff itself, and number of changed files etc.
361 366 :type details: Optional(str)
362 367
363 368
364 369 get_repo_changesets
365 370 -------------------
366 371
367 372 .. py:function:: get_repo_changesets(apiuser, repoid, start_rev, limit, details=<Optional:'basic'>)
368 373
369 374 Returns a set of commits limited by the number starting
370 375 from the `start_rev` option.
371 376
372 377 Additional parameters define the amount of details returned by this
373 378 function.
374 379
375 380 This command can only be run using an |authtoken| with admin rights,
376 381 or users with at least read rights to |repos|.
377 382
378 383 :param apiuser: This is filled automatically from the |authtoken|.
379 384 :type apiuser: AuthUser
380 385 :param repoid: The repository name or repository ID.
381 386 :type repoid: str or int
382 387 :param start_rev: The starting revision from where to get changesets.
383 388 :type start_rev: str
384 389 :param limit: Limit the number of commits to this amount
385 390 :type limit: str or int
386 391 :param details: Set the level of detail returned. Valid option are:
387 392 ``basic``, ``extended`` and ``full``.
388 393 :type details: Optional(str)
389 394
390 395 .. note::
391 396
392 397 Setting the parameter `details` to the value ``full`` is extensive
393 398 and returns details like the diff itself, and the number
394 399 of changed files.
395 400
396 401
397 402 get_repo_comments
398 403 -----------------
399 404
400 405 .. py:function:: get_repo_comments(apiuser, repoid, commit_id=<Optional:None>, comment_type=<Optional:None>, userid=<Optional:None>)
401 406
402 407 Get all comments for a repository
403 408
404 409 :param apiuser: This is filled automatically from the |authtoken|.
405 410 :type apiuser: AuthUser
406 411 :param repoid: Set the repository name or repository ID.
407 412 :type repoid: str or int
408 413 :param commit_id: Optionally filter the comments by the commit_id
409 414 :type commit_id: Optional(str), default: None
410 415 :param comment_type: Optionally filter the comments by the comment_type
411 416 one of: 'note', 'todo'
412 417 :type comment_type: Optional(str), default: None
413 418 :param userid: Optionally filter the comments by the author of comment
414 419 :type userid: Optional(str or int), Default: None
415 420
416 421 Example error output:
417 422
418 423 .. code-block:: bash
419 424
420 425 {
421 426 "id" : <id_given_in_input>,
422 427 "result" : [
423 428 {
424 429 "comment_author": <USER_DETAILS>,
425 430 "comment_created_on": "2017-02-01T14:38:16.309",
426 431 "comment_f_path": "file.txt",
427 432 "comment_id": 282,
428 433 "comment_lineno": "n1",
429 434 "comment_resolved_by": null,
430 435 "comment_status": [],
431 436 "comment_text": "This file needs a header",
432 437 "comment_type": "todo"
433 438 }
434 439 ],
435 440 "error" : null
436 441 }
437 442
438 443
439 444 get_repo_file
440 445 -------------
441 446
442 447 .. py:function:: get_repo_file(apiuser, repoid, commit_id, file_path, max_file_bytes=<Optional:None>, details=<Optional:'basic'>, cache=<Optional:True>)
443 448
444 449 Returns a single file from repository at given revision.
445 450
446 451 This command can only be run using an |authtoken| with admin rights,
447 452 or users with at least read rights to |repos|.
448 453
449 454 :param apiuser: This is filled automatically from the |authtoken|.
450 455 :type apiuser: AuthUser
451 456 :param repoid: The repository name or repository ID.
452 457 :type repoid: str or int
453 458 :param commit_id: The revision for which listing should be done.
454 459 :type commit_id: str
455 460 :param file_path: The path from which to start displaying.
456 461 :type file_path: str
457 462 :param details: Returns different set of information about nodes.
458 463 The valid options are ``minimal`` ``basic`` and ``full``.
459 464 :type details: Optional(str)
460 465 :param max_file_bytes: Only return file content under this file size bytes
461 466 :type max_file_bytes: Optional(int)
462 467 :param cache: Use internal caches for fetching files. If disabled fetching
463 468 files is slower but more memory efficient
464 469 :type cache: Optional(bool)
465 470
466 471 Example output:
467 472
468 473 .. code-block:: bash
469 474
470 475 id : <id_given_in_input>
471 476 result: {
472 477 "binary": false,
473 478 "extension": "py",
474 479 "lines": 35,
475 480 "content": "....",
476 481 "md5": "76318336366b0f17ee249e11b0c99c41",
477 482 "mimetype": "text/x-python",
478 483 "name": "python.py",
479 484 "size": 817,
480 485 "type": "file",
481 486 }
482 487 error: null
483 488
484 489
485 490 get_repo_fts_tree
486 491 -----------------
487 492
488 493 .. py:function:: get_repo_fts_tree(apiuser, repoid, commit_id, root_path)
489 494
490 495 Returns a list of tree nodes for path at given revision. This api is built
491 496 strictly for usage in full text search building, and shouldn't be consumed
492 497
493 498 This command can only be run using an |authtoken| with admin rights,
494 499 or users with at least read rights to |repos|.
495 500
496 501
497 502 get_repo_nodes
498 503 --------------
499 504
500 505 .. py:function:: get_repo_nodes(apiuser, repoid, revision, root_path, ret_type=<Optional:'all'>, details=<Optional:'basic'>, max_file_bytes=<Optional:None>)
501 506
502 507 Returns a list of nodes and children in a flat list for a given
503 508 path at given revision.
504 509
505 510 It's possible to specify ret_type to show only `files` or `dirs`.
506 511
507 512 This command can only be run using an |authtoken| with admin rights,
508 513 or users with at least read rights to |repos|.
509 514
510 515 :param apiuser: This is filled automatically from the |authtoken|.
511 516 :type apiuser: AuthUser
512 517 :param repoid: The repository name or repository ID.
513 518 :type repoid: str or int
514 519 :param revision: The revision for which listing should be done.
515 520 :type revision: str
516 521 :param root_path: The path from which to start displaying.
517 522 :type root_path: str
518 523 :param ret_type: Set the return type. Valid options are
519 524 ``all`` (default), ``files`` and ``dirs``.
520 525 :type ret_type: Optional(str)
521 526 :param details: Returns extended information about nodes, such as
522 527 md5, binary, and or content.
523 528 The valid options are ``basic`` and ``full``.
524 529 :type details: Optional(str)
525 530 :param max_file_bytes: Only return file content under this file size bytes
526 531 :type details: Optional(int)
527 532
528 533 Example output:
529 534
530 535 .. code-block:: bash
531 536
532 537 id : <id_given_in_input>
533 538 result: [
534 539 {
535 540 "binary": false,
536 541 "content": "File line",
537 542 "extension": "md",
538 543 "lines": 2,
539 544 "md5": "059fa5d29b19c0657e384749480f6422",
540 545 "mimetype": "text/x-minidsrc",
541 546 "name": "file.md",
542 547 "size": 580,
543 548 "type": "file"
544 549 },
545 550 ...
546 551 ]
547 552 error: null
548 553
549 554
550 555 get_repo_refs
551 556 -------------
552 557
553 558 .. py:function:: get_repo_refs(apiuser, repoid)
554 559
555 560 Returns a dictionary of current references. It returns
556 561 bookmarks, branches, closed_branches, and tags for given repository
557 562
558 563 It's possible to specify ret_type to show only `files` or `dirs`.
559 564
560 565 This command can only be run using an |authtoken| with admin rights,
561 566 or users with at least read rights to |repos|.
562 567
563 568 :param apiuser: This is filled automatically from the |authtoken|.
564 569 :type apiuser: AuthUser
565 570 :param repoid: The repository name or repository ID.
566 571 :type repoid: str or int
567 572
568 573 Example output:
569 574
570 575 .. code-block:: bash
571 576
572 577 id : <id_given_in_input>
573 578 "result": {
574 579 "bookmarks": {
575 580 "dev": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
576 581 "master": "367f590445081d8ec8c2ea0456e73ae1f1c3d6cf"
577 582 },
578 583 "branches": {
579 584 "default": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
580 585 "stable": "367f590445081d8ec8c2ea0456e73ae1f1c3d6cf"
581 586 },
582 587 "branches_closed": {},
583 588 "tags": {
584 589 "tip": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
585 590 "v4.4.0": "1232313f9e6adac5ce5399c2a891dc1e72b79022",
586 591 "v4.4.1": "cbb9f1d329ae5768379cdec55a62ebdd546c4e27",
587 592 "v4.4.2": "24ffe44a27fcd1c5b6936144e176b9f6dd2f3a17",
588 593 }
589 594 }
590 595 error: null
591 596
592 597
593 598 get_repo_settings
594 599 -----------------
595 600
596 601 .. py:function:: get_repo_settings(apiuser, repoid, key=<Optional:None>)
597 602
598 603 Returns all settings for a repository. If key is given it only returns the
599 604 setting identified by the key or null.
600 605
601 606 :param apiuser: This is filled automatically from the |authtoken|.
602 607 :type apiuser: AuthUser
603 608 :param repoid: The repository name or repository id.
604 609 :type repoid: str or int
605 610 :param key: Key of the setting to return.
606 611 :type: key: Optional(str)
607 612
608 613 Example output:
609 614
610 615 .. code-block:: bash
611 616
612 617 {
613 618 "error": null,
614 619 "id": 237,
615 620 "result": {
616 621 "extensions_largefiles": true,
617 622 "extensions_evolve": true,
618 623 "hooks_changegroup_push_logger": true,
619 624 "hooks_changegroup_repo_size": false,
620 625 "hooks_outgoing_pull_logger": true,
621 626 "phases_publish": "True",
622 627 "rhodecode_hg_use_rebase_for_merging": true,
623 628 "rhodecode_pr_merge_enabled": true,
624 629 "rhodecode_use_outdated_comments": true
625 630 }
626 631 }
627 632
628 633
629 634 get_repos
630 635 ---------
631 636
632 637 .. py:function:: get_repos(apiuser, root=<Optional:None>, traverse=<Optional:True>)
633 638
634 639 Lists all existing repositories.
635 640
636 641 This command can only be run using an |authtoken| with admin rights,
637 642 or users with at least read rights to |repos|.
638 643
639 644 :param apiuser: This is filled automatically from the |authtoken|.
640 645 :type apiuser: AuthUser
641 646 :param root: specify root repository group to fetch repositories.
642 647 filters the returned repositories to be members of given root group.
643 648 :type root: Optional(None)
644 649 :param traverse: traverse given root into subrepositories. With this flag
645 650 set to False, it will only return top-level repositories from `root`.
646 651 if root is empty it will return just top-level repositories.
647 652 :type traverse: Optional(True)
648 653
649 654
650 655 Example output:
651 656
652 657 .. code-block:: bash
653 658
654 659 id : <id_given_in_input>
655 660 result: [
656 661 {
657 662 "repo_id" : "<repo_id>",
658 663 "repo_name" : "<reponame>"
659 664 "repo_type" : "<repo_type>",
660 665 "clone_uri" : "<clone_uri>",
661 666 "private": : "<bool>",
662 667 "created_on" : "<datetimecreated>",
663 668 "description" : "<description>",
664 669 "landing_rev": "<landing_rev>",
665 670 "owner": "<repo_owner>",
666 671 "fork_of": "<name_of_fork_parent>",
667 672 "enable_downloads": "<bool>",
668 673 "enable_locking": "<bool>",
669 674 "enable_statistics": "<bool>",
670 675 },
671 676 ...
672 677 ]
673 678 error: null
674 679
675 680
676 681 grant_user_group_permission
677 682 ---------------------------
678 683
679 684 .. py:function:: grant_user_group_permission(apiuser, repoid, usergroupid, perm)
680 685
681 686 Grant permission for a user group on the specified repository,
682 687 or update existing permissions.
683 688
684 689 This command can only be run using an |authtoken| with admin
685 690 permissions on the |repo|.
686 691
687 692 :param apiuser: This is filled automatically from the |authtoken|.
688 693 :type apiuser: AuthUser
689 694 :param repoid: Set the repository name or repository ID.
690 695 :type repoid: str or int
691 696 :param usergroupid: Specify the ID of the user group.
692 697 :type usergroupid: str or int
693 698 :param perm: Set the user group permissions using the following
694 699 format: (repository.(none|read|write|admin))
695 700 :type perm: str
696 701
697 702 Example output:
698 703
699 704 .. code-block:: bash
700 705
701 706 id : <id_given_in_input>
702 707 result : {
703 708 "msg" : "Granted perm: `<perm>` for group: `<usersgroupname>` in repo: `<reponame>`",
704 709 "success": true
705 710
706 711 }
707 712 error : null
708 713
709 714 Example error output:
710 715
711 716 .. code-block:: bash
712 717
713 718 id : <id_given_in_input>
714 719 result : null
715 720 error : {
716 721 "failed to edit permission for user group: `<usergroup>` in repo `<repo>`'
717 722 }
718 723
719 724
720 725 grant_user_permission
721 726 ---------------------
722 727
723 728 .. py:function:: grant_user_permission(apiuser, repoid, userid, perm)
724 729
725 730 Grant permissions for the specified user on the given repository,
726 731 or update existing permissions if found.
727 732
728 733 This command can only be run using an |authtoken| with admin
729 734 permissions on the |repo|.
730 735
731 736 :param apiuser: This is filled automatically from the |authtoken|.
732 737 :type apiuser: AuthUser
733 738 :param repoid: Set the repository name or repository ID.
734 739 :type repoid: str or int
735 740 :param userid: Set the user name.
736 741 :type userid: str
737 742 :param perm: Set the user permissions, using the following format
738 743 ``(repository.(none|read|write|admin))``
739 744 :type perm: str
740 745
741 746 Example output:
742 747
743 748 .. code-block:: bash
744 749
745 750 id : <id_given_in_input>
746 751 result: {
747 752 "msg" : "Granted perm: `<perm>` for user: `<username>` in repo: `<reponame>`",
748 753 "success": true
749 754 }
750 755 error: null
751 756
752 757
753 758 invalidate_cache
754 759 ----------------
755 760
756 761 .. py:function:: invalidate_cache(apiuser, repoid, delete_keys=<Optional:False>)
757 762
758 763 Invalidates the cache for the specified repository.
759 764
760 765 This command can only be run using an |authtoken| with admin rights to
761 766 the specified repository.
762 767
763 768 This command takes the following options:
764 769
765 770 :param apiuser: This is filled automatically from |authtoken|.
766 771 :type apiuser: AuthUser
767 772 :param repoid: Sets the repository name or repository ID.
768 773 :type repoid: str or int
769 774 :param delete_keys: This deletes the invalidated keys instead of
770 775 just flagging them.
771 776 :type delete_keys: Optional(``True`` | ``False``)
772 777
773 778 Example output:
774 779
775 780 .. code-block:: bash
776 781
777 782 id : <id_given_in_input>
778 783 result : {
779 784 'msg': Cache for repository `<repository name>` was invalidated,
780 785 'repository': <repository name>
781 786 }
782 787 error : null
783 788
784 789 Example error output:
785 790
786 791 .. code-block:: bash
787 792
788 793 id : <id_given_in_input>
789 794 result : null
790 795 error : {
791 796 'Error occurred during cache invalidation action'
792 797 }
793 798
794 799
795 800 lock
796 801 ----
797 802
798 803 .. py:function:: lock(apiuser, repoid, locked=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
799 804
800 805 Sets the lock state of the specified |repo| by the given user.
801 806 From more information, see :ref:`repo-locking`.
802 807
803 808 * If the ``userid`` option is not set, the repository is locked to the
804 809 user who called the method.
805 810 * If the ``locked`` parameter is not set, the current lock state of the
806 811 repository is displayed.
807 812
808 813 This command can only be run using an |authtoken| with admin rights to
809 814 the specified repository.
810 815
811 816 This command takes the following options:
812 817
813 818 :param apiuser: This is filled automatically from the |authtoken|.
814 819 :type apiuser: AuthUser
815 820 :param repoid: Sets the repository name or repository ID.
816 821 :type repoid: str or int
817 822 :param locked: Sets the lock state.
818 823 :type locked: Optional(``True`` | ``False``)
819 824 :param userid: Set the repository lock to this user.
820 825 :type userid: Optional(str or int)
821 826
822 827 Example error output:
823 828
824 829 .. code-block:: bash
825 830
826 831 id : <id_given_in_input>
827 832 result : {
828 833 'repo': '<reponame>',
829 834 'locked': <bool: lock state>,
830 835 'locked_since': <int: lock timestamp>,
831 836 'locked_by': <username of person who made the lock>,
832 837 'lock_reason': <str: reason for locking>,
833 838 'lock_state_changed': <bool: True if lock state has been changed in this request>,
834 839 'msg': 'Repo `<reponame>` locked by `<username>` on <timestamp>.'
835 840 or
836 841 'msg': 'Repo `<repository name>` not locked.'
837 842 or
838 843 'msg': 'User `<user name>` set lock state for repo `<repository name>` to `<new lock state>`'
839 844 }
840 845 error : null
841 846
842 847 Example error output:
843 848
844 849 .. code-block:: bash
845 850
846 851 id : <id_given_in_input>
847 852 result : null
848 853 error : {
849 854 'Error occurred locking repository `<reponame>`'
850 855 }
851 856
852 857
853 858 maintenance
854 859 -----------
855 860
856 861 .. py:function:: maintenance(apiuser, repoid)
857 862
858 863 Triggers a maintenance on the given repository.
859 864
860 865 This command can only be run using an |authtoken| with admin
861 866 rights to the specified repository. For more information,
862 867 see :ref:`config-token-ref`.
863 868
864 869 This command takes the following options:
865 870
866 871 :param apiuser: This is filled automatically from the |authtoken|.
867 872 :type apiuser: AuthUser
868 873 :param repoid: The repository name or repository ID.
869 874 :type repoid: str or int
870 875
871 876 Example output:
872 877
873 878 .. code-block:: bash
874 879
875 880 id : <id_given_in_input>
876 881 result : {
877 882 "msg": "executed maintenance command",
878 883 "executed_actions": [
879 884 <action_message>, <action_message2>...
880 885 ],
881 886 "repository": "<repository name>"
882 887 }
883 888 error : null
884 889
885 890 Example error output:
886 891
887 892 .. code-block:: bash
888 893
889 894 id : <id_given_in_input>
890 895 result : null
891 896 error : {
892 897 "Unable to execute maintenance on `<reponame>`"
893 898 }
894 899
895 900
896 901 pull
897 902 ----
898 903
899 904 .. py:function:: pull(apiuser, repoid, remote_uri=<Optional:None>)
900 905
901 906 Triggers a pull on the given repository from a remote location. You
902 907 can use this to keep remote repositories up-to-date.
903 908
904 909 This command can only be run using an |authtoken| with admin
905 910 rights to the specified repository. For more information,
906 911 see :ref:`config-token-ref`.
907 912
908 913 This command takes the following options:
909 914
910 915 :param apiuser: This is filled automatically from the |authtoken|.
911 916 :type apiuser: AuthUser
912 917 :param repoid: The repository name or repository ID.
913 918 :type repoid: str or int
914 919 :param remote_uri: Optional remote URI to pass in for pull
915 920 :type remote_uri: str
916 921
917 922 Example output:
918 923
919 924 .. code-block:: bash
920 925
921 926 id : <id_given_in_input>
922 927 result : {
923 928 "msg": "Pulled from url `<remote_url>` on repo `<repository name>`"
924 929 "repository": "<repository name>"
925 930 }
926 931 error : null
927 932
928 933 Example error output:
929 934
930 935 .. code-block:: bash
931 936
932 937 id : <id_given_in_input>
933 938 result : null
934 939 error : {
935 940 "Unable to push changes from `<remote_url>`"
936 941 }
937 942
938 943
939 944 remove_field_from_repo
940 945 ----------------------
941 946
942 947 .. py:function:: remove_field_from_repo(apiuser, repoid, key)
943 948
944 949 Removes an extra field from a repository.
945 950
946 951 This command can only be run using an |authtoken| with at least
947 952 write permissions to the |repo|.
948 953
949 954 :param apiuser: This is filled automatically from the |authtoken|.
950 955 :type apiuser: AuthUser
951 956 :param repoid: Set the repository name or repository ID.
952 957 :type repoid: str or int
953 958 :param key: Set the unique field key for this repository.
954 959 :type key: str
955 960
956 961
957 962 revoke_user_group_permission
958 963 ----------------------------
959 964
960 965 .. py:function:: revoke_user_group_permission(apiuser, repoid, usergroupid)
961 966
962 967 Revoke the permissions of a user group on a given repository.
963 968
964 969 This command can only be run using an |authtoken| with admin
965 970 permissions on the |repo|.
966 971
967 972 :param apiuser: This is filled automatically from the |authtoken|.
968 973 :type apiuser: AuthUser
969 974 :param repoid: Set the repository name or repository ID.
970 975 :type repoid: str or int
971 976 :param usergroupid: Specify the user group ID.
972 977 :type usergroupid: str or int
973 978
974 979 Example output:
975 980
976 981 .. code-block:: bash
977 982
978 983 id : <id_given_in_input>
979 984 result: {
980 985 "msg" : "Revoked perm for group: `<usersgroupname>` in repo: `<reponame>`",
981 986 "success": true
982 987 }
983 988 error: null
984 989
985 990
986 991 revoke_user_permission
987 992 ----------------------
988 993
989 994 .. py:function:: revoke_user_permission(apiuser, repoid, userid)
990 995
991 996 Revoke permission for a user on the specified repository.
992 997
993 998 This command can only be run using an |authtoken| with admin
994 999 permissions on the |repo|.
995 1000
996 1001 :param apiuser: This is filled automatically from the |authtoken|.
997 1002 :type apiuser: AuthUser
998 1003 :param repoid: Set the repository name or repository ID.
999 1004 :type repoid: str or int
1000 1005 :param userid: Set the user name of revoked user.
1001 1006 :type userid: str or int
1002 1007
1003 1008 Example error output:
1004 1009
1005 1010 .. code-block:: bash
1006 1011
1007 1012 id : <id_given_in_input>
1008 1013 result: {
1009 1014 "msg" : "Revoked perm for user: `<username>` in repo: `<reponame>`",
1010 1015 "success": true
1011 1016 }
1012 1017 error: null
1013 1018
1014 1019
1015 1020 set_repo_settings
1016 1021 -----------------
1017 1022
1018 1023 .. py:function:: set_repo_settings(apiuser, repoid, settings)
1019 1024
1020 1025 Update repository settings. Returns true on success.
1021 1026
1022 1027 :param apiuser: This is filled automatically from the |authtoken|.
1023 1028 :type apiuser: AuthUser
1024 1029 :param repoid: The repository name or repository id.
1025 1030 :type repoid: str or int
1026 1031 :param settings: The new settings for the repository.
1027 1032 :type: settings: dict
1028 1033
1029 1034 Example output:
1030 1035
1031 1036 .. code-block:: bash
1032 1037
1033 1038 {
1034 1039 "error": null,
1035 1040 "id": 237,
1036 1041 "result": true
1037 1042 }
1038 1043
1039 1044
1040 1045 strip
1041 1046 -----
1042 1047
1043 1048 .. py:function:: strip(apiuser, repoid, revision, branch)
1044 1049
1045 1050 Strips the given revision from the specified repository.
1046 1051
1047 1052 * This will remove the revision and all of its decendants.
1048 1053
1049 1054 This command can only be run using an |authtoken| with admin rights to
1050 1055 the specified repository.
1051 1056
1052 1057 This command takes the following options:
1053 1058
1054 1059 :param apiuser: This is filled automatically from the |authtoken|.
1055 1060 :type apiuser: AuthUser
1056 1061 :param repoid: The repository name or repository ID.
1057 1062 :type repoid: str or int
1058 1063 :param revision: The revision you wish to strip.
1059 1064 :type revision: str
1060 1065 :param branch: The branch from which to strip the revision.
1061 1066 :type branch: str
1062 1067
1063 1068 Example output:
1064 1069
1065 1070 .. code-block:: bash
1066 1071
1067 1072 id : <id_given_in_input>
1068 1073 result : {
1069 1074 "msg": "'Stripped commit <commit_hash> from repo `<repository name>`'"
1070 1075 "repository": "<repository name>"
1071 1076 }
1072 1077 error : null
1073 1078
1074 1079 Example error output:
1075 1080
1076 1081 .. code-block:: bash
1077 1082
1078 1083 id : <id_given_in_input>
1079 1084 result : null
1080 1085 error : {
1081 1086 "Unable to strip commit <commit_hash> from repo `<repository name>`"
1082 1087 }
1083 1088
1084 1089
1085 1090 update_repo
1086 1091 -----------
1087 1092
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:''>)
1093 .. 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:None>, fork_of=<Optional:None>, enable_statistics=<Optional:False>, enable_locking=<Optional:False>, enable_downloads=<Optional:False>, fields=<Optional:''>)
1089 1094
1090 1095 Updates a repository with the given information.
1091 1096
1092 1097 This command can only be run using an |authtoken| with at least
1093 1098 admin permissions to the |repo|.
1094 1099
1095 1100 * If the repository name contains "/", repository will be updated
1096 1101 accordingly with a repository group or nested repository groups
1097 1102
1098 1103 For example repoid=repo-test name="foo/bar/repo-test" will update |repo|
1099 1104 called "repo-test" and place it inside group "foo/bar".
1100 1105 You have to have permissions to access and write to the last repository
1101 1106 group ("bar" in this example)
1102 1107
1103 1108 :param apiuser: This is filled automatically from the |authtoken|.
1104 1109 :type apiuser: AuthUser
1105 1110 :param repoid: repository name or repository ID.
1106 1111 :type repoid: str or int
1107 1112 :param repo_name: Update the |repo| name, including the
1108 1113 repository group it's in.
1109 1114 :type repo_name: str
1110 1115 :param owner: Set the |repo| owner.
1111 1116 :type owner: str
1112 1117 :param fork_of: Set the |repo| as fork of another |repo|.
1113 1118 :type fork_of: str
1114 1119 :param description: Update the |repo| description.
1115 1120 :type description: str
1116 1121 :param private: Set the |repo| as private. (True | False)
1117 1122 :type private: bool
1118 1123 :param clone_uri: Update the |repo| clone URI.
1119 1124 :type clone_uri: str
1120 :param landing_rev: Set the |repo| landing revision. Default is ``rev:tip``.
1125 :param landing_rev: Set the |repo| landing revision. e.g branch:default, book:dev, rev:abcd
1121 1126 :type landing_rev: str
1122 1127 :param enable_statistics: Enable statistics on the |repo|, (True | False).
1123 1128 :type enable_statistics: bool
1124 1129 :param enable_locking: Enable |repo| locking.
1125 1130 :type enable_locking: bool
1126 1131 :param enable_downloads: Enable downloads from the |repo|, (True | False).
1127 1132 :type enable_downloads: bool
1128 1133 :param fields: Add extra fields to the |repo|. Use the following
1129 1134 example format: ``field_key=field_val,field_key2=fieldval2``.
1130 1135 Escape ', ' with \,
1131 1136 :type fields: str
1132 1137
1133 1138
@@ -1,35 +1,41 b''
1 1 .. _search-methods-ref:
2 2
3 3 search methods
4 4 ==============
5 5
6 6 search
7 7 ------
8 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>)
9 .. py:function:: search(apiuser, search_query, search_type, page_limit=<Optional:10>, page=<Optional:1>, search_sort=<Optional:'desc:date'>, repo_name=<Optional:None>, repo_group_name=<Optional:None>)
10 10
11 11 Fetch Full Text Search results using API.
12 12
13 13 :param apiuser: This is filled automatically from the |authtoken|.
14 14 :type apiuser: AuthUser
15 15 :param search_query: Search query.
16 16 :type search_query: str
17 17 :param search_type: Search type. The following are valid options:
18 18 * commit
19 19 * content
20 20 * path
21 21 :type search_type: str
22 22 :param page_limit: Page item limit, from 1 to 500. Default 10 items.
23 23 :type page_limit: Optional(int)
24 24 :param page: Page number. Default first page.
25 25 :type page: Optional(int)
26 :param search_sort: Search sort order. Default newfirst. The following are valid options:
27 * newfirst
28 * oldfirst
26 :param search_sort: Search sort order.Must start with asc: or desc: Default desc:date.
27 The following are valid options:
28 * asc|desc:message.raw
29 * asc|desc:date
30 * asc|desc:author.email.raw
31 * asc|desc:message.raw
32 * newfirst (old legacy equal to desc:date)
33 * oldfirst (old legacy equal to asc:date)
34
29 35 :type search_sort: Optional(str)
30 36 :param repo_name: Filter by one repo. Default is all.
31 37 :type repo_name: Optional(str)
32 38 :param repo_group_name: Filter by one repo group. Default is all.
33 39 :type repo_group_name: Optional(str)
34 40
35 41
@@ -1,37 +1,184 b''
1 1 .. _store-methods-ref:
2 2
3 3 store methods
4 4 =============
5 5
6 6 file_store_add (EE only)
7 7 ------------------------
8 8
9 .. py:function:: file_store_add(apiuser, filename, content)
9 .. py:function:: file_store_add(apiuser, filename, content, description=<Optional:''>)
10 10
11 11 Upload API for the file_store
12 12
13 13 Example usage from CLI::
14 14 rhodecode-api --instance-name=enterprise-1 upload_file "{"content": "$(cat image.jpg | base64)", "filename":"image.jpg"}"
15 15
16 16 This command takes the following options:
17 17
18 18 :param apiuser: This is filled automatically from the |authtoken|.
19 19 :type apiuser: AuthUser
20 20 :param filename: name of the file uploaded
21 21 :type filename: str
22 :param description: Optional description for added file
23 :type description: str
22 24 :param content: base64 encoded content of the uploaded file
23 25 :type content: str
24 26
25 27 Example output:
26 28
27 29 .. code-block:: bash
28 30
29 31 id : <id_given_in_input>
30 32 result: {
31 33 "access_path": "/_file_store/download/84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg",
32 34 "access_path_fqn": "http://server.domain.com/_file_store/download/84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg",
33 35 "store_fid": "84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg"
34 36 }
35 37 error : null
36 38
37 39
40 file_store_add_with_acl (EE only)
41 ---------------------------------
42
43 .. py:function:: file_store_add_with_acl(apiuser, filename, content, description=<Optional:''>, scope_user_id=<Optional:None>, scope_repo_id=<Optional:None>, scope_repo_group_id=<Optional:None>)
44
45 Upload API for the file_store
46
47 Example usage from CLI::
48 rhodecode-api --instance-name=enterprise-1 upload_file "{"content": "$(cat image.jpg | base64)", "filename":"image.jpg", "scope_repo_id":101}"
49
50 This command takes the following options:
51
52 :param apiuser: This is filled automatically from the |authtoken|.
53 :type apiuser: AuthUser
54 :param filename: name of the file uploaded
55 :type filename: str
56 :param description: Optional description for added file
57 :type description: str
58 :param content: base64 encoded content of the uploaded file
59 :type content: str
60
61 :param scope_user_id: Optionally bind this file to user.
62 This will check ACL in such way only this user can access the file.
63 :type scope_user_id: int
64 :param scope_repo_id: Optionally bind this file to repository.
65 This will check ACL in such way only user with proper access to such
66 repository can access the file.
67 :type scope_repo_id: int
68 :param scope_repo_group_id: Optionally bind this file to repository group.
69 This will check ACL in such way only user with proper access to such
70 repository group can access the file.
71 :type scope_repo_group_id: int
72
73 Example output:
74
75 .. code-block:: bash
76
77 id : <id_given_in_input>
78 result: {
79 "access_path": "/_file_store/download/84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg",
80 "access_path_fqn": "http://server.domain.com/_file_store/download/84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg",
81 "store_fid": "84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg"
82 }
83 error : null
84
85
86 file_store_get_info (EE only)
87 -----------------------------
88
89 .. py:function:: file_store_get_info(apiuser, store_fid)
90
91 Get artifact data.
92
93 Example output:
94
95 .. code-block:: bash
96
97 id : <id_given_in_input>
98 result: {
99 "artifact": {
100 "access_path_fqn": "https://rhodecode.example.com/_file_store/download/0-031c2aa0-0d56-49a7-9ba3-b570bdd342ab.jpg",
101 "created_on": "2019-10-15T16:25:35.491",
102 "description": "my upload",
103 "downloaded_times": 1,
104 "file_uid": "0-031c2aa0-0d56-49a7-9ba3-b570bdd342ab.jpg",
105 "filename": "example.jpg",
106 "filename_org": "0-031c2aa0-0d56-49a7-9ba3-b570bdd342ab.jpg",
107 "hidden": false,
108 "metadata": [
109 {
110 "artifact": "0-031c2aa0-0d56-49a7-9ba3-b570bdd342ab.jpg",
111 "key": "yellow",
112 "section": "tags",
113 "value": "bar"
114 }
115 ],
116 "sha256": "818dff0f44574dfb6814d38e6bf3c60c5943d1d13653398ecddaedf2f6a5b04d",
117 "size": 18599,
118 "uploaded_by": {
119 "email": "admin@rhodecode.com",
120 "emails": [
121 "admin@rhodecode.com"
122 ],
123 "firstname": "Admin",
124 "lastname": "LastName",
125 "user_id": 2,
126 "username": "admin"
127 }
128 }
129 }
130 error : null
131
132
133 file_store_add_metadata (EE only)
134 ---------------------------------
135
136 .. py:function:: file_store_add_metadata(apiuser, store_fid, section, key, value, value_type=<Optional:'unicode'>)
137
138 Add metadata into artifact. The metadata consist of section, key, value. eg.
139 section='tags', 'key'='tag_name', value='1'
140
141 :param apiuser: This is filled automatically from the |authtoken|.
142 :type apiuser: AuthUser
143
144 :param store_fid: file uid, e.g 0-d054cb71-91ab-44e2-9e4b-23fe14b4d74a.mp4
145 :type store_fid: str
146
147 :param section: Section name to add metadata
148 :type section: str
149
150 :param key: Key to add as metadata
151 :type key: str
152
153 :param value: Value to add as metadata
154 :type value: str
155
156 :param value_type: Optional type, default is 'unicode' other types are:
157 int, list, bool, unicode, str
158
159 :type value_type: str
160
161 Example output:
162
163 .. code-block:: bash
164
165 id : <id_given_in_input>
166 result: {
167 "metadata": [
168 {
169 "artifact": "0-d054cb71-91ab-44e2-9e4b-23fe14b4d74a.mp4",
170 "key": "secret",
171 "section": "tags",
172 "value": "1"
173 },
174 {
175 "artifact": "0-d054cb71-91ab-44e2-9e4b-23fe14b4d74a.mp4",
176 "key": "video",
177 "section": "tags",
178 "value": "1"
179 }
180 ]
181 }
182 error : null
183
184
@@ -1,418 +1,422 b''
1 1 .. _user-group-methods-ref:
2 2
3 3 user_group methods
4 4 ==================
5 5
6 6 add_user_to_user_group
7 7 ----------------------
8 8
9 9 .. py:function:: add_user_to_user_group(apiuser, usergroupid, userid)
10 10
11 11 Adds a user to a `user group`. If the user already exists in the group
12 12 this command will return false.
13 13
14 14 This command can only be run using an |authtoken| with admin rights to
15 15 the specified user group.
16 16
17 17 This command takes the following options:
18 18
19 19 :param apiuser: This is filled automatically from the |authtoken|.
20 20 :type apiuser: AuthUser
21 21 :param usergroupid: Set the name of the `user group` to which a
22 22 user will be added.
23 23 :type usergroupid: int
24 24 :param userid: Set the `user_id` of the user to add to the group.
25 25 :type userid: int
26 26
27 27 Example output:
28 28
29 29 .. code-block:: bash
30 30
31 31 id : <id_given_in_input>
32 32 result : {
33 33 "success": True|False # depends on if member is in group
34 34 "msg": "added member `<username>` to user group `<groupname>` |
35 35 User is already in that group"
36 36
37 37 }
38 38 error : null
39 39
40 40 Example error output:
41 41
42 42 .. code-block:: bash
43 43
44 44 id : <id_given_in_input>
45 45 result : null
46 46 error : {
47 47 "failed to add member to user group `<user_group_name>`"
48 48 }
49 49
50 50
51 51 create_user_group
52 52 -----------------
53 53
54 54 .. py:function:: create_user_group(apiuser, group_name, description=<Optional:''>, owner=<Optional:<OptionalAttr:apiuser>>, active=<Optional:True>, sync=<Optional:None>)
55 55
56 56 Creates a new user group.
57 57
58 58 This command can only be run using an |authtoken| with admin rights to
59 59 the specified repository.
60 60
61 61 This command takes the following options:
62 62
63 63 :param apiuser: This is filled automatically from the |authtoken|.
64 64 :type apiuser: AuthUser
65 65 :param group_name: Set the name of the new user group.
66 66 :type group_name: str
67 67 :param description: Give a description of the new user group.
68 68 :type description: str
69 69 :param owner: Set the owner of the new user group.
70 70 If not set, the owner is the |authtoken| user.
71 71 :type owner: Optional(str or int)
72 72 :param active: Set this group as active.
73 73 :type active: Optional(``True`` | ``False``)
74 74 :param sync: Set enabled or disabled the automatically sync from
75 external authentication types like ldap.
75 external authentication types like ldap. If User Group will be named like
76 one from e.g ldap and sync flag is enabled members will be synced automatically.
77 Sync type when enabled via API is set to `manual_api`
76 78 :type sync: Optional(``True`` | ``False``)
77 79
78 80 Example output:
79 81
80 82 .. code-block:: bash
81 83
82 84 id : <id_given_in_input>
83 85 result: {
84 86 "msg": "created new user group `<groupname>`",
85 87 "user_group": <user_group_object>
86 88 }
87 89 error: null
88 90
89 91 Example error output:
90 92
91 93 .. code-block:: bash
92 94
93 95 id : <id_given_in_input>
94 96 result : null
95 97 error : {
96 98 "user group `<group name>` already exist"
97 99 or
98 100 "failed to create group `<group name>`"
99 101 }
100 102
101 103
102 104 delete_user_group
103 105 -----------------
104 106
105 107 .. py:function:: delete_user_group(apiuser, usergroupid)
106 108
107 109 Deletes the specified `user group`.
108 110
109 111 This command can only be run using an |authtoken| with admin rights to
110 112 the specified repository.
111 113
112 114 This command takes the following options:
113 115
114 116 :param apiuser: filled automatically from apikey
115 117 :type apiuser: AuthUser
116 118 :param usergroupid:
117 119 :type usergroupid: int
118 120
119 121 Example output:
120 122
121 123 .. code-block:: bash
122 124
123 125 id : <id_given_in_input>
124 126 result : {
125 127 "msg": "deleted user group ID:<user_group_id> <user_group_name>"
126 128 }
127 129 error : null
128 130
129 131 Example error output:
130 132
131 133 .. code-block:: bash
132 134
133 135 id : <id_given_in_input>
134 136 result : null
135 137 error : {
136 138 "failed to delete user group ID:<user_group_id> <user_group_name>"
137 139 or
138 140 "RepoGroup assigned to <repo_groups_list>"
139 141 }
140 142
141 143
142 144 get_user_group
143 145 --------------
144 146
145 147 .. py:function:: get_user_group(apiuser, usergroupid)
146 148
147 149 Returns the data of an existing user group.
148 150
149 151 This command can only be run using an |authtoken| with admin rights to
150 152 the specified repository.
151 153
152 154 :param apiuser: This is filled automatically from the |authtoken|.
153 155 :type apiuser: AuthUser
154 156 :param usergroupid: Set the user group from which to return data.
155 157 :type usergroupid: str or int
156 158
157 159 Example error output:
158 160
159 161 .. code-block:: bash
160 162
161 163 {
162 164 "error": null,
163 165 "id": <id>,
164 166 "result": {
165 167 "active": true,
166 168 "group_description": "group description",
167 169 "group_name": "group name",
168 170 "permissions": [
169 171 {
170 172 "name": "owner-name",
171 173 "origin": "owner",
172 174 "permission": "usergroup.admin",
173 175 "type": "user"
174 176 },
175 177 {
176 178 {
177 179 "name": "user name",
178 180 "origin": "permission",
179 181 "permission": "usergroup.admin",
180 182 "type": "user"
181 183 },
182 184 {
183 185 "name": "user group name",
184 186 "origin": "permission",
185 187 "permission": "usergroup.write",
186 188 "type": "user_group"
187 189 }
188 190 ],
189 191 "permissions_summary": {
190 192 "repositories": {
191 193 "aa-root-level-repo-1": "repository.admin"
192 194 },
193 195 "repositories_groups": {}
194 196 },
195 197 "owner": "owner name",
196 198 "users": [],
197 199 "users_group_id": 2
198 200 }
199 201 }
200 202
201 203
202 204 get_user_groups
203 205 ---------------
204 206
205 207 .. py:function:: get_user_groups(apiuser)
206 208
207 209 Lists all the existing user groups within RhodeCode.
208 210
209 211 This command can only be run using an |authtoken| with admin rights to
210 212 the specified repository.
211 213
212 214 This command takes the following options:
213 215
214 216 :param apiuser: This is filled automatically from the |authtoken|.
215 217 :type apiuser: AuthUser
216 218
217 219 Example error output:
218 220
219 221 .. code-block:: bash
220 222
221 223 id : <id_given_in_input>
222 224 result : [<user_group_obj>,...]
223 225 error : null
224 226
225 227
226 228 grant_user_group_permission_to_user_group
227 229 -----------------------------------------
228 230
229 231 .. py:function:: grant_user_group_permission_to_user_group(apiuser, usergroupid, sourceusergroupid, perm)
230 232
231 233 Give one user group permissions to another user group.
232 234
233 235 :param apiuser: This is filled automatically from the |authtoken|.
234 236 :type apiuser: AuthUser
235 237 :param usergroupid: Set the user group on which to edit permissions.
236 238 :type usergroupid: str or int
237 239 :param sourceusergroupid: Set the source user group to which
238 240 access/permissions will be granted.
239 241 :type sourceusergroupid: str or int
240 242 :param perm: (usergroup.(none|read|write|admin))
241 243 :type perm: str
242 244
243 245 Example output:
244 246
245 247 .. code-block:: bash
246 248
247 249 id : <id_given_in_input>
248 250 result : {
249 251 "msg": "Granted perm: `<perm_name>` for user group: `<source_user_group_name>` in user group: `<user_group_name>`",
250 252 "success": true
251 253 }
252 254 error : null
253 255
254 256
255 257 grant_user_permission_to_user_group
256 258 -----------------------------------
257 259
258 260 .. py:function:: grant_user_permission_to_user_group(apiuser, usergroupid, userid, perm)
259 261
260 262 Set permissions for a user in a user group.
261 263
262 264 :param apiuser: This is filled automatically from the |authtoken|.
263 265 :type apiuser: AuthUser
264 266 :param usergroupid: Set the user group to edit permissions on.
265 267 :type usergroupid: str or int
266 268 :param userid: Set the user from whom you wish to set permissions.
267 269 :type userid: str
268 270 :param perm: (usergroup.(none|read|write|admin))
269 271 :type perm: str
270 272
271 273 Example output:
272 274
273 275 .. code-block:: bash
274 276
275 277 id : <id_given_in_input>
276 278 result : {
277 279 "msg": "Granted perm: `<perm_name>` for user: `<username>` in user group: `<user_group_name>`",
278 280 "success": true
279 281 }
280 282 error : null
281 283
282 284
283 285 remove_user_from_user_group
284 286 ---------------------------
285 287
286 288 .. py:function:: remove_user_from_user_group(apiuser, usergroupid, userid)
287 289
288 290 Removes a user from a user group.
289 291
290 292 * If the specified user is not in the group, this command will return
291 293 `false`.
292 294
293 295 This command can only be run using an |authtoken| with admin rights to
294 296 the specified user group.
295 297
296 298 :param apiuser: This is filled automatically from the |authtoken|.
297 299 :type apiuser: AuthUser
298 300 :param usergroupid: Sets the user group name.
299 301 :type usergroupid: str or int
300 302 :param userid: The user you wish to remove from |RCE|.
301 303 :type userid: str or int
302 304
303 305 Example output:
304 306
305 307 .. code-block:: bash
306 308
307 309 id : <id_given_in_input>
308 310 result: {
309 311 "success": True|False, # depends on if member is in group
310 312 "msg": "removed member <username> from user group <groupname> |
311 313 User wasn't in group"
312 314 }
313 315 error: null
314 316
315 317
316 318 revoke_user_group_permission_from_user_group
317 319 --------------------------------------------
318 320
319 321 .. py:function:: revoke_user_group_permission_from_user_group(apiuser, usergroupid, sourceusergroupid)
320 322
321 323 Revoke the permissions that one user group has to another.
322 324
323 325 :param apiuser: This is filled automatically from the |authtoken|.
324 326 :type apiuser: AuthUser
325 327 :param usergroupid: Set the user group on which to edit permissions.
326 328 :type usergroupid: str or int
327 329 :param sourceusergroupid: Set the user group from which permissions
328 330 are revoked.
329 331 :type sourceusergroupid: str or int
330 332
331 333 Example output:
332 334
333 335 .. code-block:: bash
334 336
335 337 id : <id_given_in_input>
336 338 result : {
337 339 "msg": "Revoked perm for user group: `<user_group_name>` in user group: `<target_user_group_name>`",
338 340 "success": true
339 341 }
340 342 error : null
341 343
342 344
343 345 revoke_user_permission_from_user_group
344 346 --------------------------------------
345 347
346 348 .. py:function:: revoke_user_permission_from_user_group(apiuser, usergroupid, userid)
347 349
348 350 Revoke a users permissions in a user group.
349 351
350 352 :param apiuser: This is filled automatically from the |authtoken|.
351 353 :type apiuser: AuthUser
352 354 :param usergroupid: Set the user group from which to revoke the user
353 355 permissions.
354 356 :type: usergroupid: str or int
355 357 :param userid: Set the userid of the user whose permissions will be
356 358 revoked.
357 359 :type userid: str
358 360
359 361 Example output:
360 362
361 363 .. code-block:: bash
362 364
363 365 id : <id_given_in_input>
364 366 result : {
365 367 "msg": "Revoked perm for user: `<username>` in user group: `<user_group_name>`",
366 368 "success": true
367 369 }
368 370 error : null
369 371
370 372
371 373 update_user_group
372 374 -----------------
373 375
374 376 .. py:function:: update_user_group(apiuser, usergroupid, group_name=<Optional:''>, description=<Optional:''>, owner=<Optional:None>, active=<Optional:True>, sync=<Optional:None>)
375 377
376 378 Updates the specified `user group` with the details provided.
377 379
378 380 This command can only be run using an |authtoken| with admin rights to
379 381 the specified repository.
380 382
381 383 :param apiuser: This is filled automatically from the |authtoken|.
382 384 :type apiuser: AuthUser
383 385 :param usergroupid: Set the id of the `user group` to update.
384 386 :type usergroupid: str or int
385 387 :param group_name: Set the new name the `user group`
386 388 :type group_name: str
387 389 :param description: Give a description for the `user group`
388 390 :type description: str
389 391 :param owner: Set the owner of the `user group`.
390 392 :type owner: Optional(str or int)
391 393 :param active: Set the group as active.
392 394 :type active: Optional(``True`` | ``False``)
393 395 :param sync: Set enabled or disabled the automatically sync from
394 external authentication types like ldap.
396 external authentication types like ldap. If User Group will be named like
397 one from e.g ldap and sync flag is enabled members will be synced automatically.
398 Sync type when enabled via API is set to `manual_api`
395 399 :type sync: Optional(``True`` | ``False``)
396 400
397 401 Example output:
398 402
399 403 .. code-block:: bash
400 404
401 405 id : <id_given_in_input>
402 406 result : {
403 407 "msg": 'updated user group ID:<user group id> <user group name>',
404 408 "user_group": <user_group_object>
405 409 }
406 410 error : null
407 411
408 412 Example error output:
409 413
410 414 .. code-block:: bash
411 415
412 416 id : <id_given_in_input>
413 417 result : null
414 418 error : {
415 419 "failed to update user group `<user group name>`"
416 420 }
417 421
418 422
@@ -1,326 +1,331 b''
1 1 .. _user-methods-ref:
2 2
3 3 user methods
4 4 ============
5 5
6 6 create_user
7 7 -----------
8 8
9 .. py:function:: create_user(apiuser, username, email, password=<Optional:''>, firstname=<Optional:''>, lastname=<Optional:''>, active=<Optional:True>, admin=<Optional:False>, extern_name=<Optional:'rhodecode'>, extern_type=<Optional:'rhodecode'>, force_password_change=<Optional:False>, create_personal_repo_group=<Optional:None>)
9 .. py:function:: create_user(apiuser, username, email, password=<Optional:''>, firstname=<Optional:''>, lastname=<Optional:''>, description=<Optional:''>, active=<Optional:True>, admin=<Optional:False>, extern_name=<Optional:'rhodecode'>, extern_type=<Optional:'rhodecode'>, force_password_change=<Optional:False>, create_personal_repo_group=<Optional:None>)
10 10
11 11 Creates a new user and returns the new user object.
12 12
13 13 This command can only be run using an |authtoken| with admin rights to
14 14 the specified repository.
15 15
16 16 This command takes the following options:
17 17
18 18 :param apiuser: This is filled automatically from the |authtoken|.
19 19 :type apiuser: AuthUser
20 20 :param username: Set the new username.
21 21 :type username: str or int
22 22 :param email: Set the user email address.
23 23 :type email: str
24 24 :param password: Set the new user password.
25 25 :type password: Optional(str)
26 26 :param firstname: Set the new user firstname.
27 27 :type firstname: Optional(str)
28 28 :param lastname: Set the new user surname.
29 29 :type lastname: Optional(str)
30 :param description: Set user description, or short bio. Metatags are allowed.
31 :type description: Optional(str)
30 32 :param active: Set the user as active.
31 33 :type active: Optional(``True`` | ``False``)
32 34 :param admin: Give the new user admin rights.
33 35 :type admin: Optional(``True`` | ``False``)
34 36 :param extern_name: Set the authentication plugin name.
35 37 Using LDAP this is filled with LDAP UID.
36 38 :type extern_name: Optional(str)
37 39 :param extern_type: Set the new user authentication plugin.
38 40 :type extern_type: Optional(str)
39 41 :param force_password_change: Force the new user to change password
40 42 on next login.
41 43 :type force_password_change: Optional(``True`` | ``False``)
42 44 :param create_personal_repo_group: Create personal repo group for this user
43 45 :type create_personal_repo_group: Optional(``True`` | ``False``)
44 46
45 47 Example output:
46 48
47 49 .. code-block:: bash
48 50
49 51 id : <id_given_in_input>
50 52 result: {
51 53 "msg" : "created new user `<username>`",
52 54 "user": <user_obj>
53 55 }
54 56 error: null
55 57
56 58 Example error output:
57 59
58 60 .. code-block:: bash
59 61
60 62 id : <id_given_in_input>
61 63 result : null
62 64 error : {
63 65 "user `<username>` already exist"
64 66 or
65 67 "email `<email>` already exist"
66 68 or
67 69 "failed to create user `<username>`"
68 70 }
69 71
70 72
71 73 delete_user
72 74 -----------
73 75
74 76 .. py:function:: delete_user(apiuser, userid)
75 77
76 78 Deletes the specified user from the |RCE| user database.
77 79
78 80 This command can only be run using an |authtoken| with admin rights to
79 81 the specified repository.
80 82
81 83 .. important::
82 84
83 85 Ensure all open pull requests and open code review
84 86 requests to this user are close.
85 87
86 88 Also ensure all repositories, or repository groups owned by this
87 89 user are reassigned before deletion.
88 90
89 91 This command takes the following options:
90 92
91 93 :param apiuser: This is filled automatically from the |authtoken|.
92 94 :type apiuser: AuthUser
93 95 :param userid: Set the user to delete.
94 96 :type userid: str or int
95 97
96 98 Example output:
97 99
98 100 .. code-block:: bash
99 101
100 102 id : <id_given_in_input>
101 103 result: {
102 104 "msg" : "deleted user ID:<userid> <username>",
103 105 "user": null
104 106 }
105 107 error: null
106 108
107 109 Example error output:
108 110
109 111 .. code-block:: bash
110 112
111 113 id : <id_given_in_input>
112 114 result : null
113 115 error : {
114 116 "failed to delete user ID:<userid> <username>"
115 117 }
116 118
117 119
118 120 get_user
119 121 --------
120 122
121 123 .. py:function:: get_user(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
122 124
123 125 Returns the information associated with a username or userid.
124 126
125 127 * If the ``userid`` is not set, this command returns the information
126 128 for the ``userid`` calling the method.
127 129
128 130 .. note::
129 131
130 132 Normal users may only run this command against their ``userid``. For
131 133 full privileges you must run this command using an |authtoken| with
132 134 admin rights.
133 135
134 136 :param apiuser: This is filled automatically from the |authtoken|.
135 137 :type apiuser: AuthUser
136 138 :param userid: Sets the userid for which data will be returned.
137 139 :type userid: Optional(str or int)
138 140
139 141 Example output:
140 142
141 143 .. code-block:: bash
142 144
143 145 {
144 146 "error": null,
145 147 "id": <id>,
146 148 "result": {
147 149 "active": true,
148 150 "admin": false,
149 151 "api_keys": [ list of keys ],
150 152 "auth_tokens": [ list of tokens with details ],
151 153 "email": "user@example.com",
152 154 "emails": [
153 155 "user@example.com"
154 156 ],
155 157 "extern_name": "rhodecode",
156 158 "extern_type": "rhodecode",
157 159 "firstname": "username",
160 "description": "user description",
158 161 "ip_addresses": [],
159 162 "language": null,
160 163 "last_login": "Timestamp",
161 164 "last_activity": "Timestamp",
162 165 "lastname": "surnae",
163 166 "permissions": <deprecated>,
164 167 "permissions_summary": {
165 168 "global": [
166 169 "hg.inherit_default_perms.true",
167 170 "usergroup.read",
168 171 "hg.repogroup.create.false",
169 172 "hg.create.none",
170 173 "hg.password_reset.enabled",
171 174 "hg.extern_activate.manual",
172 175 "hg.create.write_on_repogroup.false",
173 176 "hg.usergroup.create.false",
174 177 "group.none",
175 178 "repository.none",
176 179 "hg.register.none",
177 180 "hg.fork.repository"
178 181 ],
179 182 "repositories": { "username/example": "repository.write"},
180 183 "repositories_groups": { "user-group/repo": "group.none" },
181 184 "user_groups": { "user_group_name": "usergroup.read" }
182 185 }
183 186 "user_id": 32,
184 187 "username": "username"
185 188 }
186 189 }
187 190
188 191
189 192 get_user_audit_logs
190 193 -------------------
191 194
192 195 .. py:function:: get_user_audit_logs(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
193 196
194 197 Fetches all action logs made by the specified user.
195 198
196 199 This command takes the following options:
197 200
198 201 :param apiuser: This is filled automatically from the |authtoken|.
199 202 :type apiuser: AuthUser
200 203 :param userid: Sets the userid whose list of locked |repos| will be
201 204 displayed.
202 205 :type userid: Optional(str or int)
203 206
204 207 Example output:
205 208
206 209 .. code-block:: bash
207 210
208 211 id : <id_given_in_input>
209 212 result : {
210 213 [action, action,...]
211 214 }
212 215 error : null
213 216
214 217
215 218 get_user_locks
216 219 --------------
217 220
218 221 .. py:function:: get_user_locks(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
219 222
220 223 Displays all repositories locked by the specified user.
221 224
222 225 * If this command is run by a non-admin user, it returns
223 226 a list of |repos| locked by that user.
224 227
225 228 This command takes the following options:
226 229
227 230 :param apiuser: This is filled automatically from the |authtoken|.
228 231 :type apiuser: AuthUser
229 232 :param userid: Sets the userid whose list of locked |repos| will be
230 233 displayed.
231 234 :type userid: Optional(str or int)
232 235
233 236 Example output:
234 237
235 238 .. code-block:: bash
236 239
237 240 id : <id_given_in_input>
238 241 result : {
239 242 [repo_object, repo_object,...]
240 243 }
241 244 error : null
242 245
243 246
244 247 get_users
245 248 ---------
246 249
247 250 .. py:function:: get_users(apiuser)
248 251
249 252 Lists all users in the |RCE| user database.
250 253
251 254 This command can only be run using an |authtoken| with admin rights to
252 255 the specified repository.
253 256
254 257 This command takes the following options:
255 258
256 259 :param apiuser: This is filled automatically from the |authtoken|.
257 260 :type apiuser: AuthUser
258 261
259 262 Example output:
260 263
261 264 .. code-block:: bash
262 265
263 266 id : <id_given_in_input>
264 267 result: [<user_object>, ...]
265 268 error: null
266 269
267 270
268 271 update_user
269 272 -----------
270 273
271 .. py:function:: update_user(apiuser, userid, username=<Optional:None>, email=<Optional:None>, password=<Optional:None>, firstname=<Optional:None>, lastname=<Optional:None>, active=<Optional:None>, admin=<Optional:None>, extern_type=<Optional:None>, extern_name=<Optional:None>)
274 .. py:function:: update_user(apiuser, userid, username=<Optional:None>, email=<Optional:None>, password=<Optional:None>, firstname=<Optional:None>, lastname=<Optional:None>, description=<Optional:None>, active=<Optional:None>, admin=<Optional:None>, extern_type=<Optional:None>, extern_name=<Optional:None>)
272 275
273 276 Updates the details for the specified user, if that user exists.
274 277
275 278 This command can only be run using an |authtoken| with admin rights to
276 279 the specified repository.
277 280
278 281 This command takes the following options:
279 282
280 283 :param apiuser: This is filled automatically from |authtoken|.
281 284 :type apiuser: AuthUser
282 285 :param userid: Set the ``userid`` to update.
283 286 :type userid: str or int
284 287 :param username: Set the new username.
285 288 :type username: str or int
286 289 :param email: Set the new email.
287 290 :type email: str
288 291 :param password: Set the new password.
289 292 :type password: Optional(str)
290 293 :param firstname: Set the new first name.
291 294 :type firstname: Optional(str)
292 295 :param lastname: Set the new surname.
293 296 :type lastname: Optional(str)
297 :param description: Set user description, or short bio. Metatags are allowed.
298 :type description: Optional(str)
294 299 :param active: Set the new user as active.
295 300 :type active: Optional(``True`` | ``False``)
296 301 :param admin: Give the user admin rights.
297 302 :type admin: Optional(``True`` | ``False``)
298 303 :param extern_name: Set the authentication plugin user name.
299 304 Using LDAP this is filled with LDAP UID.
300 305 :type extern_name: Optional(str)
301 306 :param extern_type: Set the authentication plugin type.
302 307 :type extern_type: Optional(str)
303 308
304 309
305 310 Example output:
306 311
307 312 .. code-block:: bash
308 313
309 314 id : <id_given_in_input>
310 315 result: {
311 316 "msg" : "updated user ID:<userid> <username>",
312 317 "user": <user_object>,
313 318 }
314 319 error: null
315 320
316 321 Example error output:
317 322
318 323 .. code-block:: bash
319 324
320 325 id : <id_given_in_input>
321 326 result : null
322 327 error : {
323 328 "failed to update user `<username>`"
324 329 }
325 330
326 331
@@ -1,243 +1,243 b''
1 1 .. _dev-setup:
2 2
3 3 ===================
4 4 Development setup
5 5 ===================
6 6
7 7
8 8 RhodeCode Enterprise runs inside a Nix managed environment. This ensures build
9 9 environment dependencies are correctly declared and installed during setup.
10 10 It also enables atomic upgrades, rollbacks, and multiple instances of RhodeCode
11 11 Enterprise running with isolation.
12 12
13 13 To set up RhodeCode Enterprise inside the Nix environment, use the following steps:
14 14
15 15
16 16
17 17 Setup Nix Package Manager
18 18 -------------------------
19 19
20 20 To install the Nix Package Manager, please run::
21 21
22 $ curl https://nixos.org/nix/install | sh
22 $ curl https://nixos.org/releases/nix/nix-2.0.4/install | sh
23 23
24 24 or go to https://nixos.org/nix/ and follow the installation instructions.
25 25 Once this is correctly set up on your system, you should be able to use the
26 26 following commands:
27 27
28 28 * `nix-env`
29 29
30 30 * `nix-shell`
31 31
32 32
33 33 .. tip::
34 34
35 35 Update your channels frequently by running ``nix-channel --update``.
36 36
37 37 .. note::
38 38
39 39 To uninstall nix run the following:
40 40
41 41 remove the . "$HOME/.nix-profile/etc/profile.d/nix.sh" line in your ~/.profile or ~/.bash_profile
42 42 rm -rf $HOME/{.nix-channels,.nix-defexpr,.nix-profile,.config/nixpkgs}
43 43 sudo rm -rf /nix
44 44
45 45 Switch nix to the latest STABLE channel
46 46 ---------------------------------------
47 47
48 48 run::
49 49
50 50 nix-channel --add https://nixos.org/channels/nixos-18.03 nixpkgs
51 51
52 52 Followed by::
53 53
54 54 nix-channel --update
55 55 nix-env -i nix-2.0.4
56 56
57 57
58 58 Install required binaries
59 59 -------------------------
60 60
61 61 We need some handy tools first.
62 62
63 63 run::
64 64
65 65 nix-env -i nix-prefetch-hg
66 66 nix-env -i nix-prefetch-git
67 67
68 68
69 69 Speed up JS build by installing PhantomJS
70 70 -----------------------------------------
71 71
72 72 PhantomJS will be downloaded each time nix-shell is invoked. To speed this by
73 73 setting already downloaded version do this::
74 74
75 75 nix-env -i phantomjs-2.1.1
76 76
77 77 # and set nix bin path
78 78 export PATH=$PATH:~/.nix-profile/bin
79 79
80 80
81 81 Clone the required repositories
82 82 -------------------------------
83 83
84 84 After Nix is set up, clone the RhodeCode Enterprise Community Edition and
85 85 RhodeCode VCSServer repositories into the same directory.
86 86 RhodeCode currently is using Mercurial Version Control System, please make sure
87 87 you have it installed before continuing.
88 88
89 89 To obtain the required sources, use the following commands::
90 90
91 91 mkdir rhodecode-develop && cd rhodecode-develop
92 92 hg clone -u default https://code.rhodecode.com/rhodecode-enterprise-ce
93 93 hg clone -u default https://code.rhodecode.com/rhodecode-vcsserver
94 94
95 95 .. note::
96 96
97 97 If you cannot clone the repository, please contact us via support@rhodecode.com
98 98
99 99
100 100 Install some required libraries
101 101 -------------------------------
102 102
103 103 There are some required drivers and dev libraries that we need to install to
104 104 test RhodeCode under different types of databases. For example in Ubuntu we
105 105 need to install the following.
106 106
107 107 required libraries::
108 108
109 109 # svn related
110 110 sudo apt-get install libapr1-dev libaprutil1-dev
111 111 sudo apt-get install libsvn-dev
112 112 # libcurl required too
113 113 sudo apt-get install libcurl4-openssl-dev
114 114 # mysql/pg server for development, optional
115 115 sudo apt-get install mysql-server libmysqlclient-dev
116 116 sudo apt-get install postgresql postgresql-contrib libpq-dev
117 117
118 118
119 119
120 120 Enter the Development Shell
121 121 ---------------------------
122 122
123 123 The final step is to start the development shells. To do this, run the
124 124 following command from inside the cloned repository::
125 125
126 126 # first, the vcsserver
127 127 cd ~/rhodecode-vcsserver
128 128 nix-shell
129 129
130 130 # then enterprise sources
131 131 cd ~/rhodecode-enterprise-ce
132 132 nix-shell
133 133
134 134 .. note::
135 135
136 136 On the first run, this will take a while to download and optionally compile
137 137 a few things. The following runs will be faster. The development shell works
138 138 fine on both MacOS and Linux platforms.
139 139
140 140
141 141 Create config.nix for development
142 142 ---------------------------------
143 143
144 144 In order to run proper tests and setup linking across projects, a config.nix
145 145 file needs to be setup::
146 146
147 147 # create config
148 148 mkdir -p ~/.nixpkgs
149 149 touch ~/.nixpkgs/config.nix
150 150
151 151 # put the below content into the ~/.nixpkgs/config.nix file
152 152 # adjusts, the path to where you cloned your repositories.
153 153
154 154 {
155 155 rc = {
156 156 sources = {
157 157 rhodecode-vcsserver = "/home/dev/rhodecode-vcsserver";
158 158 rhodecode-enterprise-ce = "/home/dev/rhodecode-enterprise-ce";
159 159 rhodecode-enterprise-ee = "/home/dev/rhodecode-enterprise-ee";
160 160 };
161 161 };
162 162 }
163 163
164 164
165 165
166 166 Creating a Development Configuration
167 167 ------------------------------------
168 168
169 169 To create a development environment for RhodeCode Enterprise,
170 170 use the following steps:
171 171
172 172 1. Create a copy of vcsserver config:
173 173 `cp ~/rhodecode-vcsserver/configs/development.ini ~/rhodecode-vcsserver/configs/dev.ini`
174 174 2. Create a copy of rhodocode config:
175 175 `cp ~/rhodecode-enterprise-ce/configs/development.ini ~/rhodecode-enterprise-ce/configs/dev.ini`
176 176 3. Adjust the configuration settings to your needs if needed.
177 177
178 178 .. note::
179 179
180 180 It is recommended to use the name `dev.ini` since it's included in .hgignore file.
181 181
182 182
183 183 Setup the Development Database
184 184 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
185 185
186 186 To create a development database, use the following example. This is a one
187 187 time operation executed from the nix-shell of rhodecode-enterprise-ce sources ::
188 188
189 189 rc-setup-app dev.ini \
190 190 --user=admin --password=secret \
191 191 --email=admin@example.com \
192 192 --repos=~/my_dev_repos
193 193
194 194
195 195 Compile CSS and JavaScript
196 196 ^^^^^^^^^^^^^^^^^^^^^^^^^^
197 197
198 198 To use the application's frontend and prepare it for production deployment,
199 199 you will need to compile the CSS and JavaScript with Grunt.
200 200 This is easily done from within the nix-shell using the following command::
201 201
202 202 make web-build
203 203
204 204 When developing new features you will need to recompile following any
205 205 changes made to the CSS or JavaScript files when developing the code::
206 206
207 207 grunt watch
208 208
209 209 This prepares the development (with comments/whitespace) versions of files.
210 210
211 211 Start the Development Servers
212 212 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
213 213
214 214 From the rhodecode-vcsserver directory, start the development server in another
215 215 nix-shell, using the following command::
216 216
217 217 pserve configs/dev.ini
218 218
219 219 In the adjacent nix-shell which you created for your development server, you may
220 220 now start CE with the following command::
221 221
222 222
223 223 pserve --reload configs/dev.ini
224 224
225 225 .. note::
226 226
227 227 `--reload` flag will automatically reload the server when source file changes.
228 228
229 229
230 230 Run the Environment Tests
231 231 ^^^^^^^^^^^^^^^^^^^^^^^^^
232 232
233 233 Please make sure that the tests are passing to verify that your environment is
234 234 set up correctly. RhodeCode uses py.test to run tests.
235 235 While your instance is running, start a new nix-shell and simply run
236 236 ``make test`` to run the basic test suite.
237 237
238 238
239 239 Need Help?
240 240 ^^^^^^^^^^
241 241
242 242 Join us on Slack via https://rhodecode.com/join or post questions in our
243 243 Community Portal at https://community.rhodecode.com
@@ -1,87 +1,93 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 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 67 :caption: User Documentation
68 68
69 69 usage/basic-usage
70 70 tutorials/tutorials
71 71
72 72 .. toctree::
73 73 :maxdepth: 1
74 74 :caption: Developer Documentation
75 75
76 76 api/api
77 77 tools/rhodecode-tools
78 78 extensions/extensions-hooks
79 79 contributing/contributing
80 80
81 81 .. toctree::
82 :maxdepth: 2
83 :caption: RhodeCode Control Documentation
84
85 RhodeCode Installer <https://docs.rhodecode.com/RhodeCode-Control/>
86
87 .. toctree::
82 88 :maxdepth: 1
83 89 :caption: About
84 90
85 91 known-issues/known-issues
86 92 release-notes/release-notes
87 93 admin/glossary
@@ -1,75 +1,85 b''
1 1
2 2 .. _config-celery:
3 3
4 4 Configure Celery
5 5 ----------------
6 6
7 7 Celery_ is an asynchronous task queue. It's a part of RhodeCode scheduler
8 8 functionality. Celery_ makes certain heavy tasks perform more efficiently.
9 9 Most important it allows sending notification emails, create repository forks,
10 10 and import repositories in async way. It is also used for bi-directional
11 11 repository sync in scheduler.
12 12
13 13 If you decide to use Celery you also need a working message queue.
14 The recommended and fully supported message broker is rabbitmq_.
14 There are two fully supported message brokers is rabbitmq_ and redis_ (recommended).
15
16 Since release 4.18.X we recommend using redis_ as a backend since it's generally
17 easier to work with, and results in simpler stack as redis is generally recommended
18 for caching purposes.
15 19
16 20
17 21 In order to install and configure Celery, follow these steps:
18 22
19 1. Install RabbitMQ, see the documentation on the Celery website for
20 `rabbitmq installation`_, or `rabbitmq website installation`_
23 1. Install RabbitMQ or Redis for a message queue, see the documentation on the Celery website for
24 `redis installation`_ or `rabbitmq installation`_
21 25
22 26
23 1a. As en example configuration after installation, you can run::
27 1a. If you choose RabbitMQ example configuration after installation would look like that::
24 28
25 29 sudo rabbitmqctl add_user rcuser secret_password
26 30 sudo rabbitmqctl add_vhost rhodevhost
27 31 sudo rabbitmqctl set_user_tags rcuser rhodecode
28 32 sudo rabbitmqctl set_permissions -p rhodevhost rcuser ".*" ".*" ".*"
29 33
30 34
31 35 2. Enable celery, and install `celery worker` process script using the `enable-module`::
32 36
33 37 rccontrol enable-module celery {instance-id}
34 38
35 39 .. note::
36 40
37 41 In case when using multiple instances in one or multiple servers it's highly
38 42 recommended that celery is running only once, for all servers connected to
39 43 the same database. Having multiple celery instances running without special
40 44 reconfiguration could cause scheduler issues.
41 45
42 46
43 47 3. Configure Celery in the
44 48 :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
45 49 Set the broker_url as minimal settings required to enable operation.
46 50 If used our example data from pt 1a, here is how the broker url should look like::
47 51
52 # for Redis
53 celery.broker_url = redis://localhost:6379/8
54
55 # for RabbitMQ
48 56 celery.broker_url = amqp://rcuser:secret_password@localhost:5672/rhodevhost
49 57
50 58 Full configuration example is below:
51 59
52 60 .. code-block:: ini
53 61
54 62 # Set this section of the ini file to match your Celery installation
55 63 ####################################
56 64 ### CELERY CONFIG ####
57 65 ####################################
58 66
59 67 use_celery = true
60 celery.broker_url = amqp://rcuser:secret@localhost:5672/rhodevhost
68 celery.broker_url = redis://localhost:6379/8
61 69
62 70 # maximum tasks to execute before worker restart
63 71 celery.max_tasks_per_child = 100
64 72
65 73 ## tasks will never be sent to the queue, but executed locally instead.
66 74 celery.task_always_eager = false
67 75
68 76
69 77 .. _python: http://www.python.org/
70 78 .. _mercurial: http://mercurial.selenic.com/
71 79 .. _celery: http://celeryproject.org/
80 .. _redis: http://redis.io
81 .. _redis installation: https://redis.io/topics/quickstart
72 82 .. _rabbitmq: http://www.rabbitmq.com/
73 83 .. _rabbitmq installation: http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html
74 84 .. _rabbitmq website installation: http://www.rabbitmq.com/download.html
75 85 .. _Celery installation: http://docs.celeryproject.org/en/latest/getting-started/introduction.html#bundles
@@ -1,38 +1,37 b''
1 1 .. _config-database:
2 2
3 3 Make Database Changes
4 4 ---------------------
5 5
6 6 .. important::
7 7
8 8 If you do change the |repo| database that |RCEE| uses, then you will need to
9 9 upgrade the database, and also remap and rescan the |repos|. More detailed
10 10 information is available in the
11 11 :ref:`Alternative upgrade documentation <control:install-port>`.
12 12
13 13 If you need to change database connection details for a |RCEE| instance,
14 14 use the following steps:
15 15
16 16 1. Open the :file:`rhodecode.ini` file for the instance you wish to edit. The
17 17 default location is
18 18 :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
19 19 2. When you open the file, find the database configuration section,
20 20 and use the below example to change the
21 21 connection details:
22 22
23 23 .. code-block:: ini
24 24
25 25 #########################################################
26 26 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
27 27 #########################################################
28 28
29 29 # Default SQLite config
30 30 sqlalchemy.db1.url = sqlite:////home/brian/.rccontrol/enterprise-1/rhodecode.db
31 31
32 32 # Use this example for a PostgreSQL
33 33 sqlalchemy.db1.url = postgresql://postgres:qwe@localhost/rhodecode
34 34
35 35 # see sqlalchemy docs for other advanced settings
36 36 sqlalchemy.db1.echo = false
37 37 sqlalchemy.db1.pool_recycle = 3600
38 sqlalchemy.db1.convert_unicode = true
@@ -1,81 +1,76 b''
1 1 .. _rhodecode-issue-trackers-ref:
2 2
3 3 Issue Tracker Integration
4 4 =========================
5 5
6 6 You can set an issue tracker connection in two ways with |RCE|.
7 7
8 8 * At the instance level, you can set a default issue tracker.
9 9 * At the |repo| level, you can configure an integration with a different issue
10 10 tracker.
11 11
12 12 To integrate |RCE| with an issue tracker, you need to define a regular
13 13 expression that will fetch the issue ID stored in commit messages, and replace
14 14 it with a URL. This enables |RCE| to generate a link matching each issue to the
15 15 target |repo|.
16 16
17 17 Default Issue Tracker Configuration
18 18 -----------------------------------
19 19
20 20 To integrate your issue tracker, use the following steps:
21 21
22 22 1. Open :menuselection:`Admin --> Settings --> Issue Tracker`.
23 23 2. In the new entry field, enter the following information:
24 24
25 25 * :guilabel:`Description`: A name for this set of rules.
26 26 * :guilabel:`Pattern`: The regular expression that will match issues
27 27 tagged in commit messages, or more see :ref:`issue-tr-eg-ref`.
28 28 * :guilabel:`URL`: The URL to your issue tracker.
29 29 * :guilabel:`Prefix`: The prefix with which you want to mark issues.
30 30
31 31 3. Select **Add** so save the rule to your issue tracker configuration.
32 32
33 33 Repository Issue Tracker Configuration
34 34 --------------------------------------
35 35
36 36 You can configure specific |repos| to use a different issue tracker than the
37 37 default one. See the instructions in :ref:`repo-it`
38 38
39 39 .. _issue-tr-eg-ref:
40 40
41
41 42 Jira Integration
42 43 ----------------
43 44
44 * Regex = ``(?:^#|\s#)(\w+-\d+)``
45 * URL = ``https://myissueserver.com/browse/${id}``
46 * Issue Prefix = ``#``
45 Please check examples in the view for configuration the issue trackers.
46
47 47
48 48 Confluence (Wiki)
49 49 -----------------
50 50
51 * Regex = ``(?:conf-)([A-Z0-9]+)``
52 * URL = ``https://example.atlassian.net/display/wiki/${id}/${repo_name}``
53 * issue prefix = ``CONF-``
51 Please check examples in the view for configuration the issue trackers.
52
54 53
55 54 Redmine Integration
56 55 -------------------
57 56
58 * Regex = ``(issue-+\d+)``
59 * URL = ``https://myissueserver.com/redmine/issue/${id}``
60 * Issue Prefix = ``issue-``
57 Please check examples in the view for configuration the issue trackers.
58
61 59
62 Redmine (wiki)
63 --------------
60 Redmine wiki Integration
61 ------------------------
64 62
65 * Regex = ``(?:wiki-)([a-zA-Z0-9]+)``
66 * URL = ``https://example.com/redmine/projects/wiki/${repo_name}``
67 * Issue prefix = ``Issue-``
63 Please check examples in the view for configuration the issue trackers.
64
68 65
69 66 Pivotal Tracker
70 67 ---------------
71 68
72 * Regex = ``(?:pivot-)(?<project_id>\d+)-(?<story>\d+)``
73 * URL = ``https://www.pivotaltracker.com/s/projects/${project_id}/stories/${story}``
74 * Issue prefix = ``Piv-``
69 Please check examples in the view for configuration the issue trackers.
70
75 71
76 72 Trello
77 73 ------
78 74
79 * Regex = ``(?:trello-)(?<card_id>[a-zA-Z0-9]+)``
80 * URL = ``https://trello.com/example.com/${card_id}``
81 * Issue prefix = ``Trello-``
75 Please check examples in the view for configuration the issue trackers.
76
@@ -1,85 +1,85 b''
1 1 |RCE| 4.17.0 |RNS|
2 2 ------------------
3 3
4 4 Release Date
5 5 ^^^^^^^^^^^^
6 6
7 7 - 2019-07-04
8 8
9 9
10 10 New Features
11 11 ^^^^^^^^^^^^
12 12
13 13 - New artifacts feature.
14 14 Ability to store binary artifacts for repository with ACL
15 15 - UI/UX refresh for most of the pages. This includes multiple fixes and improvements.
16 16 - Diffs: store wide-diff mode in user sessions to store user preference for diff display.
17 17 - Mercurial: added support for Mercurial 4.9
18 18 - API: Added search API methods
19 19 - Files: adding/editing allows previews for generated content.
20 20 - Files: allowed multi file upload using UI.
21 21 - Repository Groups: last change is now smartly calculated based on latest change
22 22 from all it's children repositories.
23 23 - Archives: it's now currently possible to download partial directories from files view.
24 24 - SVN: allowed executing pre-commit code with rcextensions, also added example to
25 25 validate SVN file size and paths on pre-commit level.
26 26
27 27
28 28 General
29 29 ^^^^^^^
30 30 - Exception store: add filter for display and deletion.
31 31 - Files: loading history doesn't display hidden and obsolete commits anymore.
32 32 - Repositories: bring back missing watch action in summary view.
33 33 - Admin: user groups is now using pure DB filtering to speed up display
34 34 for large number of groups.
35 35 - Mercurial: enabled full evolve+topic extensions when evolve is enabled.
36 36 - Dependencies: bumped evolve to 8.5.1
37 37 - Dependencies: bumped pyramid to 1.10.4
38 38 - Dependencies: bumped psutil to 5.5.1
39 39 - Dependencies: bumped pygments to 2.4.2
40 40 - Dependencies: bumped pyramid to 1.10.4
41 41 - Dependencies: bumped psycopg2 to 2.8.3
42 42 - Dependencies [security]: updated colander to 1.7.0
43 43
44 44
45 45 Security
46 46 ^^^^^^^^
47 47
48 48 - SSH: replaced pycrypto with cryptography to generate SSH keys as pycrypto isn't
49 49 considered safe anymore.
50 50
51 51
52 52 Performance
53 53 ^^^^^^^^^^^
54 54
55 55 - Config: updated header limits on gunicorn to prevent errors on large Mercurial repositories.
56 56 - User sessions: added option to cleanup redis based sessions in user session interface.
57 57 - Authentication: reduced usage of raw auth calls inside templates to speed up rendering.
58 58 - Sessions: don't touch session for API calls. Before each API call created new session
59 59 object which wasn't required.
60 60
61 61
62 62 Fixes
63 63 ^^^^^
64 64
65 - hHooks: fixed more unicode problems with new pull-request link generator.
65 - Hooks: fixed more unicode problems with new pull-request link generator.
66 66 - Mercurial: fix ssh-server support for mercurial custom options.
67 67 - Pull requests: updated metadata information for failed merges with multiple heads.
68 68 - Pull requests: calculate ancestor in the same way as creation mode.
69 69 Fixed problem with updates generating wrong diffs in case of merges.
70 70 - Pull requests: fixed a bug in removal of multiple reviewers at once.
71 71 - Summary: fix timeout issues loading summary page without styling.
72 72 - SSH: fix invocation of custom hgrc.
73 73 - SSH: call custom hooks via SSH backend
74 74 - Markup: fix styling for check-lists.
75 75 - Archives: allows downloading refs that have slashes and special refs. e.g f/feat1 branch names.
76 76 - Files: ensure we generate archives with consistent hashing (except for .tar.gz which uses temp files names in header)
77 77 - Files: fixed rendering of readme files under non-ascii paths.
78 78
79 79
80 80 Upgrade notes
81 81 ^^^^^^^^^^^^^
82 82
83 83 - In this release we introduced new UI across the application.
84 84 In case of problems with the display on your systems please send us info to support@rhodecode.com.
85 85
@@ -1,136 +1,137 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.18.0.rst
12 13 release-notes-4.17.4.rst
13 14 release-notes-4.17.3.rst
14 15 release-notes-4.17.2.rst
15 16 release-notes-4.17.1.rst
16 17 release-notes-4.17.0.rst
17 18 release-notes-4.16.2.rst
18 19 release-notes-4.16.1.rst
19 20 release-notes-4.16.0.rst
20 21 release-notes-4.15.2.rst
21 22 release-notes-4.15.1.rst
22 23 release-notes-4.15.0.rst
23 24 release-notes-4.14.1.rst
24 25 release-notes-4.14.0.rst
25 26 release-notes-4.13.3.rst
26 27 release-notes-4.13.2.rst
27 28 release-notes-4.13.1.rst
28 29 release-notes-4.13.0.rst
29 30 release-notes-4.12.4.rst
30 31 release-notes-4.12.3.rst
31 32 release-notes-4.12.2.rst
32 33 release-notes-4.12.1.rst
33 34 release-notes-4.12.0.rst
34 35 release-notes-4.11.6.rst
35 36 release-notes-4.11.5.rst
36 37 release-notes-4.11.4.rst
37 38 release-notes-4.11.3.rst
38 39 release-notes-4.11.2.rst
39 40 release-notes-4.11.1.rst
40 41 release-notes-4.11.0.rst
41 42 release-notes-4.10.6.rst
42 43 release-notes-4.10.5.rst
43 44 release-notes-4.10.4.rst
44 45 release-notes-4.10.3.rst
45 46 release-notes-4.10.2.rst
46 47 release-notes-4.10.1.rst
47 48 release-notes-4.10.0.rst
48 49 release-notes-4.9.1.rst
49 50 release-notes-4.9.0.rst
50 51 release-notes-4.8.0.rst
51 52 release-notes-4.7.2.rst
52 53 release-notes-4.7.1.rst
53 54 release-notes-4.7.0.rst
54 55 release-notes-4.6.1.rst
55 56 release-notes-4.6.0.rst
56 57 release-notes-4.5.2.rst
57 58 release-notes-4.5.1.rst
58 59 release-notes-4.5.0.rst
59 60 release-notes-4.4.2.rst
60 61 release-notes-4.4.1.rst
61 62 release-notes-4.4.0.rst
62 63 release-notes-4.3.1.rst
63 64 release-notes-4.3.0.rst
64 65 release-notes-4.2.1.rst
65 66 release-notes-4.2.0.rst
66 67 release-notes-4.1.2.rst
67 68 release-notes-4.1.1.rst
68 69 release-notes-4.1.0.rst
69 70 release-notes-4.0.1.rst
70 71 release-notes-4.0.0.rst
71 72
72 73 |RCE| 3.x Versions
73 74 ------------------
74 75
75 76 .. toctree::
76 77 :maxdepth: 1
77 78
78 79 release-notes-3.8.4.rst
79 80 release-notes-3.8.3.rst
80 81 release-notes-3.8.2.rst
81 82 release-notes-3.8.1.rst
82 83 release-notes-3.8.0.rst
83 84 release-notes-3.7.1.rst
84 85 release-notes-3.7.0.rst
85 86 release-notes-3.6.1.rst
86 87 release-notes-3.6.0.rst
87 88 release-notes-3.5.2.rst
88 89 release-notes-3.5.1.rst
89 90 release-notes-3.5.0.rst
90 91 release-notes-3.4.1.rst
91 92 release-notes-3.4.0.rst
92 93 release-notes-3.3.4.rst
93 94 release-notes-3.3.3.rst
94 95 release-notes-3.3.2.rst
95 96 release-notes-3.3.1.rst
96 97 release-notes-3.3.0.rst
97 98 release-notes-3.2.3.rst
98 99 release-notes-3.2.2.rst
99 100 release-notes-3.2.1.rst
100 101 release-notes-3.2.0.rst
101 102 release-notes-3.1.1.rst
102 103 release-notes-3.1.0.rst
103 104 release-notes-3.0.2.rst
104 105 release-notes-3.0.1.rst
105 106 release-notes-3.0.0.rst
106 107
107 108 |RCE| 2.x Versions
108 109 ------------------
109 110
110 111 .. toctree::
111 112 :maxdepth: 1
112 113
113 114 release-notes-2.2.8.rst
114 115 release-notes-2.2.7.rst
115 116 release-notes-2.2.6.rst
116 117 release-notes-2.2.5.rst
117 118 release-notes-2.2.4.rst
118 119 release-notes-2.2.3.rst
119 120 release-notes-2.2.2.rst
120 121 release-notes-2.2.1.rst
121 122 release-notes-2.2.0.rst
122 123 release-notes-2.1.0.rst
123 124 release-notes-2.0.2.rst
124 125 release-notes-2.0.1.rst
125 126 release-notes-2.0.0.rst
126 127
127 128 |RCE| 1.x Versions
128 129 ------------------
129 130
130 131 .. toctree::
131 132 :maxdepth: 1
132 133
133 134 release-notes-1.7.2.rst
134 135 release-notes-1.7.1.rst
135 136 release-notes-1.7.0.rst
136 137 release-notes-1.6.0.rst
@@ -1,85 +1,88 b''
1 1 .. _install-tools:
2 2
3 3 |RCT| Installation
4 4 ------------------
5 5
6 6 As of |RCE| 3.4.1 |RCT| is installed automatically on the server with |RCE|. You
7 7 do not need to install |RCT| on the server, but you will need to install them
8 8 on machines that need remote access. The tools are linked to the instance
9 9 folder, for example :file:`~/.rccontrol/{instance-id}/profile/bin`
10 10
11 11 You can list the available tools using the following example, and the valid
12 12 tools options are those which correspond with those in the :ref:`rc-tools`
13 13 section.
14 14
15 15 .. code-block:: bash
16 16
17 17 $ ls ~/.rccontrol/enterprise-4/profile/bin/
18 18
19 19 gen_js_i18n rhodecode-cleanup-gists rhodecode-tools svnrdump
20 20 gen_js_routes rhodecode-cleanup-repos supervisorctl svnserve
21 21 git rhodecode-config supervisord svnsync
22 22 gunicorn rhodecode-extensions svn svnversion
23 23 hg rhodecode-gist svnadmin vcsserver
24 24 paster rhodecode-index svndumpfilter
25 25 rc-server rhodecode-list-instances svnlook
26 26 rhodecode-api rhodecode-setup-config svnmucc
27 27
28 28 You can then use the tools as described in the :ref:`rc-tools` section using the
29 29 following example:
30 30
31 31 .. code-block:: bash
32 32
33 33 # Running the indexer
34 34 $ ~/.rccontrol/enterprise-1/profile/bin/rhodecode-index \
35 35 --instance-name=enterprise-1
36 36
37 37 # Cleaning up gists
38 38 $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-cleanup-gists \
39 39 --instance-name=enterprise-4
40 40
41 41 Scanning for gists in /home/brian/repos/.rc_gist_store...
42 42 preparing to remove [1] found gists
43 43
44 44 Installing |RCT|
45 45 ^^^^^^^^^^^^^^^^
46 46
47 47 |RCT| enable you to automate many of the most common |RCE| functions through
48 48 the API. Installing them on a local machine lets you carry out maintenance on
49 49 the server remotely. Once installed you can use them to index your |repos|
50 50 to setup full-text search, strip commits, or install RhodeCode Extensions for
51 51 additional functionality.
52 52
53 53 For more detailed instructions about using |RCT| for indexing and full-text
54 54 search, see :ref:`indexing-ref`
55 55
56 56 To install |RCT|, use the following steps:
57 57
58 58 1. Set up a ``virtualenv`` on your local machine, see virtualenv_ instructions
59 59 here.
60 2. Install |RCT| using pip. Full url with token is available at https://rhodecode.com/u/#rhodecode-tools
61 ``pip install -I https://dls.rhodecode.com/dls/<token>/rhodecode-tools/latest``
60 2. Install |RCT| using pip. All downloadable versions of |RCT| are available at:
61 `https://code.rhodecode.com/rhodecode-tools-ce/artifacts`
62 62
63 Example installation::
64
65 pip install -I https://code.rhodecode.com/rhodecode-tools-ce/artifacts/download/0-10ac93f4-bb7d-4b97-baea-68110743dd5a.tar.gz
63 66
64 67 Once |RCT| is installed using these steps there are a few extra
65 68 configuration changes you can make. These are explained in more detail in the
66 69 :ref:`indexing-ref` section, and the :ref:`rc-tools` section.
67 70
68 71 .. code-block:: bash
69 72
70 73 # Create a virtualenv
71 74 brian@ubuntu:~$ virtualenv venv
72 75 New python executable in venv/bin/python
73 76 Installing setuptools, pip...done.
74 77
75 78 # Activate the virtualenv
76 79 brian@ubuntu:~$ . venv/bin/activate
77 80
78 81 # Install RhodeCode Tools inside the virtualenv, full url with token is available at https://rhodecode.com/u/#rhodecode-tools
79 82 $ pip install -I https://dls.rhodecode.com/dls/<token>/rhodecode-tools/latest
80 83
81 84 # Check the installation
82 85 $ rhodecode-tools --help
83 86
84 87 .. _virtualenv: https://virtualenv.pypa.io/en/latest/index.html
85 88
@@ -1,59 +1,59 b''
1 1 .. _keyboard-shortcuts:
2 2
3 3 Keyboard Shortcuts
4 4 ==================
5 5
6 6 |RCE| has a number of user interface shortcut keys.
7 7
8 8 System Wide Shortcuts
9 9 ---------------------
10 10
11 11 .. rst-class:: dl-horizontal
12 12
13 13 \--:kbd:`/`
14 14 Open the |repo| search box.
15 15
16 16 \--:kbd:`?`
17 17 Open the |RCE| keyboard shortcuts page.
18 18
19 19 \--:kbd:`gh`
20 20 Go to the home page.
21 21
22 22 \--:kbd:`gg`
23 23 Go to my private gists page.
24 24
25 25 \--:kbd:`gG`
26 26 Go to my public gists page.
27 27
28 28 \--:kbd:`nr`
29 29 Go to the create new repository page.
30 30
31 31 \--:kbd:`ng`
32 32 Go to the new gist page.
33 33
34 34 Repository Shortcuts
35 35 --------------------
36 36
37 37 .. rst-class:: dl-horizontal
38 38
39 39
40 40 \--:kbd:`gs`
41 41 Go to the |repo| summary page.
42 42
43 43 \--:kbd:`gc`
44 44 Go to the changelog page.
45 45
46 46 \--:kbd:`gf`
47 47 Go to the files page.
48 48
49 49 \--:kbd:`gF`
50 50 Go to the files page with file search activated.
51 51
52 52 \--:kbd:`gp`
53 53 Go to the pull requests page.
54 54
55 55 \--:kbd:`go`
56 56 Go to the repository settings page.
57 57
58 58 \--:kbd:`gO`
59 Go to the repository permissions settings.
59 Go to the repository access permissions settings.
@@ -1,177 +1,183 b''
1 1 {
2 2 "dirs": {
3 3 "css": {
4 4 "src": "rhodecode/public/css",
5 5 "dest": "rhodecode/public/css"
6 6 },
7 7 "js": {
8 8 "src": "rhodecode/public/js/src",
9 9 "src_rc": "rhodecode/public/js/rhodecode",
10 10 "dest": "rhodecode/public/js",
11 11 "node_modules": "node_modules"
12 12 }
13 13 },
14 14 "copy": {
15 15 "main": {
16 16 "files": [
17 17 {
18 18 "expand": true,
19 19 "cwd": "node_modules/@webcomponents",
20 20 "src": "webcomponentsjs/*.*",
21 21 "dest": "<%= dirs.js.dest %>/vendors"
22 22 },
23 23 {
24 24 "src": "<%= dirs.css.src %>/style-polymer.css",
25 25 "dest": "<%= dirs.js.dest %>/src/components/style-polymer.css"
26 26 }
27 27 ]
28 28 }
29 29 },
30 30 "concat": {
31 31 "dist": {
32 32 "src": [
33 33 "<%= dirs.js.node_modules %>/jquery/dist/jquery.min.js",
34 34 "<%= dirs.js.node_modules %>/mousetrap/mousetrap.min.js",
35 35 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
36 36 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
37 37 "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js",
38 38 "<%= dirs.js.node_modules %>/dropzone/dist/dropzone.js",
39 39 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js",
40 40 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js",
41 41 "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js",
42 42 "<%= dirs.js.node_modules %>/waypoints/lib/jquery.waypoints.min.js",
43 43 "<%= dirs.js.node_modules %>/appenlight-client/appenlight-client.min.js",
44 44 "<%= dirs.js.src %>/logging.js",
45 45 "<%= dirs.js.src %>/bootstrap.js",
46 46 "<%= dirs.js.src %>/i18n_utils.js",
47 47 "<%= dirs.js.src %>/deform.js",
48 48 "<%= dirs.js.src %>/ejs.js",
49 49 "<%= dirs.js.src %>/ejs_templates/utils.js",
50 50 "<%= dirs.js.src %>/plugins/jquery.pjax.js",
51 51 "<%= dirs.js.src %>/plugins/jquery.dataTables.js",
52 52 "<%= dirs.js.src %>/plugins/flavoured_checkbox.js",
53 53 "<%= dirs.js.src %>/plugins/jquery.auto-grow-input.js",
54 54 "<%= dirs.js.src %>/plugins/jquery.autocomplete.js",
55 55 "<%= dirs.js.src %>/plugins/jquery.debounce.js",
56 56 "<%= dirs.js.node_modules %>/mark.js/dist/jquery.mark.min.js",
57 57 "<%= dirs.js.src %>/plugins/jquery.timeago.js",
58 58 "<%= dirs.js.src %>/plugins/jquery.timeago-extension.js",
59 59 "<%= dirs.js.src %>/select2/select2.js",
60 60 "<%= dirs.js.src %>/codemirror/codemirror.js",
61 61 "<%= dirs.js.src %>/codemirror/codemirror_loadmode.js",
62 62 "<%= dirs.js.src %>/codemirror/codemirror_hint.js",
63 63 "<%= dirs.js.src %>/codemirror/codemirror_overlay.js",
64 64 "<%= dirs.js.src %>/codemirror/codemirror_placeholder.js",
65 65 "<%= dirs.js.src %>/codemirror/codemirror_simplemode.js",
66 66 "<%= dirs.js.dest %>/mode/meta.js",
67 67 "<%= dirs.js.dest %>/mode/meta_ext.js",
68 68 "<%= dirs.js.src_rc %>/i18n/select2/translations.js",
69 69 "<%= dirs.js.src %>/rhodecode/utils/array.js",
70 70 "<%= dirs.js.src %>/rhodecode/utils/string.js",
71 71 "<%= dirs.js.src %>/rhodecode/utils/pyroutes.js",
72 72 "<%= dirs.js.src %>/rhodecode/utils/ajax.js",
73 73 "<%= dirs.js.src %>/rhodecode/utils/autocomplete.js",
74 74 "<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js",
75 75 "<%= dirs.js.src %>/rhodecode/utils/ie.js",
76 76 "<%= dirs.js.src %>/rhodecode/utils/os.js",
77 77 "<%= dirs.js.src %>/rhodecode/utils/topics.js",
78 78 "<%= dirs.js.src %>/rhodecode/init.js",
79 79 "<%= dirs.js.src %>/rhodecode/changelog.js",
80 80 "<%= dirs.js.src %>/rhodecode/codemirror.js",
81 81 "<%= dirs.js.src %>/rhodecode/comments.js",
82 82 "<%= dirs.js.src %>/rhodecode/constants.js",
83 83 "<%= dirs.js.src %>/rhodecode/files.js",
84 84 "<%= dirs.js.src %>/rhodecode/followers.js",
85 85 "<%= dirs.js.src %>/rhodecode/menus.js",
86 86 "<%= dirs.js.src %>/rhodecode/notifications.js",
87 87 "<%= dirs.js.src %>/rhodecode/permissions.js",
88 88 "<%= dirs.js.src %>/rhodecode/pjax.js",
89 89 "<%= dirs.js.src %>/rhodecode/pullrequests.js",
90 90 "<%= dirs.js.src %>/rhodecode/settings.js",
91 91 "<%= dirs.js.src %>/rhodecode/select2_widgets.js",
92 92 "<%= dirs.js.src %>/rhodecode/tooltips.js",
93 93 "<%= dirs.js.src %>/rhodecode/users.js",
94 94 "<%= dirs.js.src %>/rhodecode/appenlight.js",
95 95 "<%= dirs.js.src %>/rhodecode.js",
96 96 "<%= dirs.js.dest %>/rhodecode-components.js"
97 97 ],
98 98 "dest": "<%= dirs.js.dest %>/scripts.js",
99 99 "nonull": true
100 100 }
101 101 },
102 "uglify": {
103 "dist": {
104 "src": "<%= dirs.js.dest %>/scripts.js",
105 "dest": "<%= dirs.js.dest %>/scripts.min.js"
106 }
107 },
102 108 "less": {
103 109 "development": {
104 110 "options": {
105 111 "compress": false,
106 112 "yuicompress": false,
107 113 "optimization": 0
108 114 },
109 115 "files": {
110 116 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
111 117 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less",
112 118 "<%= dirs.css.dest %>/style-ipython.css": "<%= dirs.css.src %>/ipython.less"
113 119 }
114 120 },
115 121 "production": {
116 122 "options": {
117 123 "compress": true,
118 124 "yuicompress": true,
119 125 "optimization": 2
120 126 },
121 127 "files": {
122 128 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
123 129 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less",
124 130 "<%= dirs.css.dest %>/style-ipython.css": "<%= dirs.css.src %>/ipython.less"
125 131 }
126 132 },
127 133 "components": {
128 134 "files": [
129 135 {
130 136 "cwd": "<%= dirs.js.src %>/components/",
131 137 "dest": "<%= dirs.js.src %>/components/",
132 138 "src": [
133 139 "**/*.less"
134 140 ],
135 141 "expand": true,
136 142 "ext": ".css"
137 143 }
138 144 ]
139 145 }
140 146 },
141 147 "watch": {
142 148 "less": {
143 149 "files": [
144 150 "<%= dirs.css.src %>/**/*.less",
145 151 "<%= dirs.js.src %>/components/**/*.less"
146 152 ],
147 153 "tasks": [
148 154 "less:development",
149 155 "less:components",
150 156 "concat:polymercss",
151 157 "webpack",
152 158 "concat:dist"
153 159 ]
154 160 },
155 161 "js": {
156 162 "files": [
157 163 "!<%= dirs.js.src %>/components/root-styles.gen.html",
158 164 "<%= dirs.js.src %>/**/*.js",
159 165 "<%= dirs.js.src %>/components/**/*.html"
160 166 ],
161 167 "tasks": [
162 168 "less:components",
163 169 "concat:polymercss",
164 170 "webpack",
165 171 "concat:dist"
166 172 ]
167 173 }
168 174 },
169 175 "jshint": {
170 176 "rhodecode": {
171 177 "src": "<%= dirs.js.src %>/rhodecode/**/*.js",
172 178 "options": {
173 179 "jshintrc": ".jshintrc"
174 180 }
175 181 }
176 182 }
177 183 }
@@ -1,60 +1,61 b''
1 1 {
2 2 "name": "rhodecode-enterprise",
3 3 "version": "2.0.0",
4 4 "private": true,
5 5 "description" : "RhodeCode JS packaged",
6 6 "license": "SEE LICENSE IN LICENSE.txt",
7 7 "repository" : {
8 8 "type" : "hg",
9 9 "url" : "https://code.rhodecode.com/rhodecode-enterprise-ce"
10 10 },
11 11 "devDependencies": {
12 12 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1",
13 13 "clipboard": "^2.0.1",
14 14 "exports-loader": "^0.6.4",
15 15 "favico.js": "^0.3.10",
16 16 "dropzone": "^5.5.0",
17 17 "grunt": "^0.4.5",
18 18 "grunt-cli": "^1.3.1",
19 19 "grunt-contrib-concat": "^0.5.1",
20 20 "grunt-contrib-copy": "^1.0.0",
21 21 "grunt-contrib-jshint": "^0.12.0",
22 22 "grunt-contrib-less": "^1.1.0",
23 23 "grunt-contrib-watch": "^0.6.1",
24 24 "grunt-webpack": "^3.1.3",
25 "grunt-contrib-uglify": "^4.0.1",
25 26 "jquery": "1.11.3",
26 27 "mark.js": "8.11.1",
27 28 "jshint": "^2.9.1-rc3",
28 29 "moment": "^2.18.1",
29 30 "mousetrap": "^1.6.1",
30 31 "qrious": "^4.0.2",
31 32 "sticky-sidebar": "3.3.1",
32 33 "waypoints": "4.0.1",
33 34 "webpack": "4.23.1",
34 35 "webpack-cli": "3.1.2",
35 36 "babel-core": "^6.26.3",
36 37 "babel-loader": "^7.1.2",
37 38 "babel-plugin-transform-object-rest-spread": "^6.26.0",
38 39 "babel-preset-env": "^1.6.0",
39 40 "copy-webpack-plugin": "^4.4.2",
40 41 "css-loader": "^0.28.11",
41 42 "html-loader": "^0.4.4",
42 43 "html-webpack-plugin": "^3.2.0",
43 44 "imports-loader": "^0.7.1",
44 45 "polymer-webpack-loader": "^2.0.1",
45 46 "style-loader": "^0.21.0",
46 47 "webpack-uglify-js-plugin": "^1.1.9",
47 48 "raw-loader": "1.0.0-beta.0",
48 49 "ts-loader": "^1.3.3",
49 50 "@webcomponents/webcomponentsjs": "^2.0.0",
50 51 "@polymer/polymer": "^3.0.0",
51 52 "@polymer/paper-button": "^3.0.0",
52 53 "@polymer/paper-spinner": "^3.0.0",
53 54 "@polymer/paper-tooltip": "^3.0.0",
54 55 "@polymer/paper-toast": "^3.0.0",
55 56 "@polymer/paper-toggle-button": "^3.0.0",
56 57 "@polymer/iron-ajax": "^3.0.0",
57 58 "@polymer/iron-autogrow-textarea": "^3.0.0",
58 59 "@polymer/iron-a11y-keys": "^3.0.0"
59 60 }
60 61 }
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full 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/apps/file_store/local_store.py to rhodecode/apps/file_store/backends/local_store.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file, 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: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full 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/admin/gists/edit.mako to rhodecode/templates/admin/gists/gist_edit.mako
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/templates/admin/gists/index.mako to rhodecode/templates/admin/gists/gist_index.mako
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/templates/admin/gists/new.mako to rhodecode/templates/admin/gists/gist_new.mako
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/templates/admin/gists/show.mako to rhodecode/templates/admin/gists/gist_show.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: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full 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
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now